mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-31 07:13:03 +00:00 
			
		
		
		
	Merge branch 'next' of https://github.com/gnss-sdr/gnss-sdr into fpga
This commit is contained in:
		| @@ -227,8 +227,14 @@ endif(NOT LINUX_DISTRIBUTION) | |||||||
| if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") | if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") | ||||||
|      set(OperatingSystem "Mac OS X") |      set(OperatingSystem "Mac OS X") | ||||||
|      set(OS_IS_MACOSX TRUE) |      set(OS_IS_MACOSX TRUE) | ||||||
|      exec_program(uname ARGS -v  OUTPUT_VARIABLE DARWIN_VERSION) |      execute_process(COMMAND uname -v OUTPUT_VARIABLE DARWIN_VERSION) | ||||||
|      string(REGEX MATCH "[0-9]+" DARWIN_VERSION ${DARWIN_VERSION}) |      string(REGEX MATCH "[0-9]+" DARWIN_VERSION ${DARWIN_VERSION}) | ||||||
|  |      if(${DARWIN_VERSION} MATCHES "18") | ||||||
|  |          set(MACOS_MOJAVE TRUE) | ||||||
|  |          set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++14") | ||||||
|  |          set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++") | ||||||
|  |          message(STATUS "Configuring GNSS-SDR v${VERSION} to be built on macOS Mojave 10.14") | ||||||
|  |      endif(${DARWIN_VERSION} MATCHES "18") | ||||||
|      if(${DARWIN_VERSION} MATCHES "17") |      if(${DARWIN_VERSION} MATCHES "17") | ||||||
|          set(MACOS_HIGH_SIERRA TRUE) |          set(MACOS_HIGH_SIERRA TRUE) | ||||||
|          set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++14") |          set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++14") | ||||||
| @@ -345,7 +351,7 @@ set(GNSSSDR_ARMADILLO_LOCAL_VERSION "9.200.x") | |||||||
| set(GNSSSDR_GTEST_LOCAL_VERSION "1.8.1") | set(GNSSSDR_GTEST_LOCAL_VERSION "1.8.1") | ||||||
| set(GNSSSDR_GNSS_SIM_LOCAL_VERSION "master") | set(GNSSSDR_GNSS_SIM_LOCAL_VERSION "master") | ||||||
| set(GNSSSDR_GPSTK_LOCAL_VERSION "2.10.6") | set(GNSSSDR_GPSTK_LOCAL_VERSION "2.10.6") | ||||||
| set(GNSSSDR_MATIO_LOCAL_VERSION "1.5.12") | set(GNSSSDR_MATIO_LOCAL_VERSION "1.5.13") | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								README.md
									
									
									
									
									
								
							| @@ -64,10 +64,10 @@ $ sudo apt-get install build-essential cmake git libboost-dev libboost-date-time | |||||||
|        libboost-system-dev libboost-filesystem-dev libboost-thread-dev libboost-chrono-dev \ |        libboost-system-dev libboost-filesystem-dev libboost-thread-dev libboost-chrono-dev \ | ||||||
|        libboost-serialization-dev liblog4cpp5-dev libuhd-dev gnuradio-dev gr-osmosdr \ |        libboost-serialization-dev liblog4cpp5-dev libuhd-dev gnuradio-dev gr-osmosdr \ | ||||||
|        libblas-dev liblapack-dev libarmadillo-dev libgflags-dev libgoogle-glog-dev \ |        libblas-dev liblapack-dev libarmadillo-dev libgflags-dev libgoogle-glog-dev \ | ||||||
|        libgnutls-openssl-dev libpcap-dev python-mako python-six libmatio-dev googletest |        libgnutls-openssl-dev libpcap-dev python-mako python-six libmatio-dev libgtest-dev | ||||||
| ~~~~~~ | ~~~~~~ | ||||||
|  |  | ||||||
| Please note that `googletest` was named `libgtest-dev` in distributions older than Debian 9 "stretch" and Ubuntu 17.04 "zesty". | Please note that the required files from `libgtest-dev` were moved to `googletest` in Debian 9 "stretch" and Ubuntu 18.04 "bionic", and moved back again to `libgtest-dev` in Debian 10 "buster" and Ubuntu 18.10 "cosmic". | ||||||
|  |  | ||||||
| **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. The same applies to `libmatio-dev`: Ubuntu 14.04 came with 1.5.2 and the minimum required version is 1.5.3. Please do not install the `libmatio-dev` package and install `libtool`, `automake` and `libhdf5-dev` instead. A recent version of the library will be downloaded and built automatically if CMake does not find it installed. | **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. The same applies to `libmatio-dev`: Ubuntu 14.04 came with 1.5.2 and the minimum required version is 1.5.3. Please do not install the `libmatio-dev` package and install `libtool`, `automake` and `libhdf5-dev` instead. A recent version of the library will be downloaded and built automatically if CMake does not find it installed. | ||||||
|  |  | ||||||
| @@ -516,10 +516,7 @@ More details can be found in our tutorial about [GNSS-SDR configuration options | |||||||
| <a name="macosx">macOS and Mac OS X</a> | <a name="macosx">macOS and Mac OS X</a> | ||||||
| --------- | --------- | ||||||
|  |  | ||||||
|  | GNSS-SDR can be built on MacOS or Mac OS X, starting from 10.9 (Mavericks) and including 10.14 (Mojave). If you still have not installed [Xcode](https://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: | ||||||
| ### macOS 10.13 (High Sierra) and 10.12 (Sierra), Mac OS X 10.11 (El Capitan), 10.10 (Yosemite) and 10.9 (Mavericks). |  | ||||||
|  |  | ||||||
| If you still have not installed [Xcode](https://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 | $ xcode-select --install | ||||||
| @@ -558,7 +555,7 @@ You also might need to activate a Python installation. The list of installed ver | |||||||
| $ port select list python | $ port select list python | ||||||
| ~~~~~~ | ~~~~~~ | ||||||
|  |  | ||||||
| and you can activate a certain version (2.7 works well) by typing: | and you can activate a certain version by typing: | ||||||
|  |  | ||||||
| ~~~~~~ | ~~~~~~ | ||||||
| $ sudo port select --set python python27 | $ sudo port select --set python python27 | ||||||
|   | |||||||
| @@ -24,10 +24,10 @@ string(REGEX REPLACE "\n" ";" files "${files}") | |||||||
| foreach(file ${files}) | foreach(file ${files}) | ||||||
|   message(STATUS "Uninstalling $ENV{DESTDIR}${file}") |   message(STATUS "Uninstalling $ENV{DESTDIR}${file}") | ||||||
|   if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") |   if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") | ||||||
|     exec_program( |     execute_process( | ||||||
|       "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" |       COMMAND @CMAKE_COMMAND@ -E remove \"$ENV{DESTDIR}${file}\" | ||||||
|       OUTPUT_VARIABLE rm_out |       OUTPUT_VARIABLE rm_out | ||||||
|       RETURN_VALUE rm_retval |       RESULT_VARIABLE rm_retval | ||||||
|       ) |       ) | ||||||
|     if(NOT "${rm_retval}" STREQUAL 0) |     if(NOT "${rm_retval}" STREQUAL 0) | ||||||
|       message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}") |       message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}") | ||||||
|   | |||||||
| @@ -39,7 +39,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=217 | GNSS-SDR.SUPL_MCC=217 | ||||||
| GNSS-SDR.SUPL_MNS=7 | GNSS-SDR.SUPL_MNC=7 | ||||||
| GNSS-SDR.SUPL_LAC=861 | GNSS-SDR.SUPL_LAC=861 | ||||||
| GNSS-SDR.SUPL_CI=40184 | GNSS-SDR.SUPL_CI=40184 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -23,7 +23,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -24,7 +24,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -23,7 +23,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -25,7 +25,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -25,7 +25,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -24,7 +24,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -24,7 +24,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5_1C | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -24,7 +24,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -23,7 +23,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -23,7 +23,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ GNSS-SDR.internal_fs_sps=32000000 | |||||||
| ;GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ;GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| ;GNSS-SDR.SUPL_gps_acquisition_port=7275 | ;GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| ;GNSS-SDR.SUPL_MCC=244 | ;GNSS-SDR.SUPL_MCC=244 | ||||||
| ;GNSS-SDR.SUPL_MNS=5 | ;GNSS-SDR.SUPL_MNC=5 | ||||||
| ;GNSS-SDR.SUPL_LAC=0x59e2 | ;GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| ;GNSS-SDR.SUPL_CI=0x31b0 | ;GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ GNSS-SDR.internal_fs_sps=50000000 | |||||||
| ;GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ;GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| ;GNSS-SDR.SUPL_gps_acquisition_port=7275 | ;GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| ;GNSS-SDR.SUPL_MCC=244 | ;GNSS-SDR.SUPL_MCC=244 | ||||||
| ;GNSS-SDR.SUPL_MNS=5 | ;GNSS-SDR.SUPL_MNC=5 | ||||||
| ;GNSS-SDR.SUPL_LAC=0x59e2 | ;GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| ;GNSS-SDR.SUPL_CI=0x31b0 | ;GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ GNSS-SDR.SUPL_1C_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_1C_acquisition_server=supl.google.com | GNSS-SDR.SUPL_1C_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_1C_acquisition_port=7275 | GNSS-SDR.SUPL_1C_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ GNSS-SDR.SUPL_gps_ephemeris_port=7275 | |||||||
| GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com | ||||||
| GNSS-SDR.SUPL_gps_acquisition_port=7275 | GNSS-SDR.SUPL_gps_acquisition_port=7275 | ||||||
| GNSS-SDR.SUPL_MCC=244 | GNSS-SDR.SUPL_MCC=244 | ||||||
| GNSS-SDR.SUPL_MNS=5 | GNSS-SDR.SUPL_MNC=5 | ||||||
| GNSS-SDR.SUPL_LAC=0x59e2 | GNSS-SDR.SUPL_LAC=0x59e2 | ||||||
| GNSS-SDR.SUPL_CI=0x31b0 | GNSS-SDR.SUPL_CI=0x31b0 | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										34
									
								
								docs/xml-schemas/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								docs/xml-schemas/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | # XML Schemas for Assisted GNSS-SDR | ||||||
|  |  | ||||||
|  | GNSS-SDR can read assistance data from [Extensible Markup Language (XML)](https://www.w3.org/XML/) files for faster [Time-To-First-Fix](https://gnss-sdr.org/design-forces/availability/#time-to-first-fix-ttff), and can store navigation data decoded from GNSS signals in the same format. This folder provides XML Schemas which describe those XML files structure. | ||||||
|  |  | ||||||
|  | [XSD (XML Schema Definition)](https://www.w3.org/XML/Schema) is a World Wide Web Consortium (W3C) recommendation that specifies how to formally describe the elements in an XML document. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GPS L1 C/A | ||||||
|  | ---------- | ||||||
|  |  | ||||||
|  |  - [ephemeris_map.xsd](./ephemeris_map.xsd) - GPS NAV message ephemeris parameters. | ||||||
|  |  - [iono_model.xsd](./iono_model.xsd) - GPS NAV message ionospheric model parameters. | ||||||
|  |  - [utc_model.xsd](./utc_model.xsd) - GPS NAV message UTC model parameters. | ||||||
|  |  - [gps_almanac_map.xsd](./gps_almanac_map.xsd) - GPS NAV message almanac. | ||||||
|  |   | ||||||
|  |   | ||||||
|  | GPS L2C and L5 | ||||||
|  | -------------- | ||||||
|  |   | ||||||
|  |  - [cnav_ephemeris_map.xsd](./cnav_ephemeris_map.xsd) - GPS CNAV message ephemeris parameters. | ||||||
|  |   | ||||||
|  |   | ||||||
|  | Galileo | ||||||
|  | ------- | ||||||
|  |  | ||||||
|  |  - [gal_ephemeris_map.xsd](./gal_ephemeris_map.xsd) - Galileo ephemeris parameters. | ||||||
|  |  - [gal_iono_model.xsd](./gal_iono_model.xsd) - Galileo ionospheric model parameters. | ||||||
|  |  - [gal_utc_model.xsd](./gal_utc_model.xsd) - Galileo UTC model parameters. | ||||||
|  |  - [gal_almanac_map.xsd](./gal_almanac_map.xsd) - Galileo almanac. | ||||||
|  |  | ||||||
|  | ------- | ||||||
|  |  | ||||||
|  | Please check https://gnss-sdr.org/docs/sp-blocks/global-parameters/ for more information about the usage of XML files in GNSS-SDR. | ||||||
|  |   | ||||||
							
								
								
									
										72
									
								
								docs/xml-schemas/cnav_ephemeris_map.xsd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								docs/xml-schemas/cnav_ephemeris_map.xsd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | |||||||
|  | <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> | ||||||
|  |   <xs:element name="boost_serialization"> | ||||||
|  |     <xs:complexType> | ||||||
|  |       <xs:sequence> | ||||||
|  |         <xs:element name="GNSS-SDR_cnav_ephemeris_map"> | ||||||
|  |           <xs:complexType> | ||||||
|  |             <xs:sequence> | ||||||
|  |               <xs:element type="xs:byte" name="count"/> | ||||||
|  |               <xs:element type="xs:byte" name="item_version"/> | ||||||
|  |               <xs:element name="item" maxOccurs="unbounded" minOccurs="0"> | ||||||
|  |                 <xs:complexType> | ||||||
|  |                   <xs:sequence> | ||||||
|  |                     <xs:element type="xs:byte" name="first"/> | ||||||
|  |                     <xs:element name="second"> | ||||||
|  |                       <xs:complexType> | ||||||
|  |                         <xs:sequence> | ||||||
|  |                           <xs:element type="xs:byte" name="i_satellite_PRN"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_TOW"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Crs"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_M_0"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Cuc"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_e_eccentricity"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Cus"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Toe1"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Toe2"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Toc"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Cic"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_OMEGA0"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Cis"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_i_0"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Crc"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_OMEGA"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_IDOT"/> | ||||||
|  |                           <xs:element type="xs:short" name="i_GPS_week"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_TGD"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_ISCL1"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_ISCL2"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_ISCL5I"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_ISCL5Q"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_DELTA_A"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_A_DOT"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_DELTA_OMEGA_DOT"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_A_f0"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_A_f1"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_A_f2"/> | ||||||
|  |                           <xs:element type="xs:byte" name="b_integrity_status_flag"/> | ||||||
|  |                           <xs:element type="xs:byte" name="b_alert_flag"/> | ||||||
|  |                           <xs:element type="xs:byte" name="b_antispoofing_flag"/> | ||||||
|  |                         </xs:sequence> | ||||||
|  |                         <xs:attribute type="xs:byte" name="class_id" use="optional"/> | ||||||
|  |                         <xs:attribute type="xs:byte" name="tracking_level" use="optional"/> | ||||||
|  |                         <xs:attribute type="xs:byte" name="version" use="optional"/> | ||||||
|  |                       </xs:complexType> | ||||||
|  |                     </xs:element> | ||||||
|  |                   </xs:sequence> | ||||||
|  |                   <xs:attribute type="xs:byte" name="class_id" use="optional"/> | ||||||
|  |                   <xs:attribute type="xs:byte" name="tracking_level" use="optional"/> | ||||||
|  |                   <xs:attribute type="xs:byte" name="version" use="optional"/> | ||||||
|  |                 </xs:complexType> | ||||||
|  |               </xs:element> | ||||||
|  |             </xs:sequence> | ||||||
|  |             <xs:attribute type="xs:byte" name="class_id"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="tracking_level"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |           </xs:complexType> | ||||||
|  |         </xs:element> | ||||||
|  |       </xs:sequence> | ||||||
|  |       <xs:attribute type="xs:string" name="signature"/> | ||||||
|  |       <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |     </xs:complexType> | ||||||
|  |   </xs:element> | ||||||
|  | </xs:schema> | ||||||
							
								
								
									
										78
									
								
								docs/xml-schemas/ephemeris_map.xsd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								docs/xml-schemas/ephemeris_map.xsd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | |||||||
|  | <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> | ||||||
|  |   <xs:element name="boost_serialization"> | ||||||
|  |     <xs:complexType> | ||||||
|  |       <xs:sequence> | ||||||
|  |         <xs:element name="GNSS-SDR_ephemeris_map"> | ||||||
|  |           <xs:complexType> | ||||||
|  |             <xs:sequence> | ||||||
|  |               <xs:element type="xs:byte" name="count"/> | ||||||
|  |               <xs:element type="xs:byte" name="item_version"/> | ||||||
|  |               <xs:element name="item" maxOccurs="unbounded" minOccurs="0"> | ||||||
|  |                 <xs:complexType> | ||||||
|  |                   <xs:sequence> | ||||||
|  |                     <xs:element type="xs:byte" name="first"/> | ||||||
|  |                     <xs:element name="second"> | ||||||
|  |                       <xs:complexType> | ||||||
|  |                         <xs:sequence> | ||||||
|  |                           <xs:element type="xs:byte" name="i_satellite_PRN"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_TOW"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_IODE_SF2"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_IODE_SF3"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Crs"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Delta_n"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_M_0"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Cuc"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_e_eccentricity"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Cus"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_sqrt_A"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Toe"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Toc"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Cic"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_OMEGA0"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Cis"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_i_0"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Crc"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_OMEGA"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_OMEGA_DOT"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_IDOT"/> | ||||||
|  |                           <xs:element type="xs:byte" name="i_code_on_L2"/> | ||||||
|  |                           <xs:element type="xs:short" name="i_GPS_week"/> | ||||||
|  |                           <xs:element type="xs:byte" name="b_L2_P_data_flag"/> | ||||||
|  |                           <xs:element type="xs:byte" name="i_SV_accuracy"/> | ||||||
|  |                           <xs:element type="xs:byte" name="i_SV_health"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_TGD"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_IODC"/> | ||||||
|  |                           <xs:element type="xs:short" name="i_AODO"/> | ||||||
|  |                           <xs:element type="xs:byte" name="b_fit_interval_flag"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_spare1"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_spare2"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_A_f0"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_A_f1"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_A_f2"/> | ||||||
|  |                           <xs:element type="xs:byte" name="b_integrity_status_flag"/> | ||||||
|  |                           <xs:element type="xs:byte" name="b_alert_flag"/> | ||||||
|  |                           <xs:element type="xs:byte" name="b_antispoofing_flag"/> | ||||||
|  |                         </xs:sequence> | ||||||
|  |                         <xs:attribute type="xs:byte" name="class_id" use="optional"/> | ||||||
|  |                         <xs:attribute type="xs:byte" name="tracking_level" use="optional"/> | ||||||
|  |                         <xs:attribute type="xs:byte" name="version" use="optional"/> | ||||||
|  |                       </xs:complexType> | ||||||
|  |                     </xs:element> | ||||||
|  |                   </xs:sequence> | ||||||
|  |                   <xs:attribute type="xs:byte" name="class_id" use="optional"/> | ||||||
|  |                   <xs:attribute type="xs:byte" name="tracking_level" use="optional"/> | ||||||
|  |                   <xs:attribute type="xs:byte" name="version" use="optional"/> | ||||||
|  |                 </xs:complexType> | ||||||
|  |               </xs:element> | ||||||
|  |             </xs:sequence> | ||||||
|  |             <xs:attribute type="xs:byte" name="class_id"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="tracking_level"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |           </xs:complexType> | ||||||
|  |         </xs:element> | ||||||
|  |       </xs:sequence> | ||||||
|  |       <xs:attribute type="xs:string" name="signature"/> | ||||||
|  |       <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |     </xs:complexType> | ||||||
|  |   </xs:element> | ||||||
|  | </xs:schema> | ||||||
							
								
								
									
										56
									
								
								docs/xml-schemas/gal_almanac_map.xsd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								docs/xml-schemas/gal_almanac_map.xsd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | |||||||
|  | <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> | ||||||
|  |   <xs:element name="boost_serialization"> | ||||||
|  |     <xs:complexType> | ||||||
|  |       <xs:sequence> | ||||||
|  |         <xs:element name="GNSS-SDR_gal_almanac_map"> | ||||||
|  |           <xs:complexType> | ||||||
|  |             <xs:sequence> | ||||||
|  |               <xs:element type="xs:byte" name="count"/> | ||||||
|  |               <xs:element type="xs:byte" name="item_version"/> | ||||||
|  |               <xs:element name="item" maxOccurs="unbounded" minOccurs="0"> | ||||||
|  |                 <xs:complexType> | ||||||
|  |                   <xs:sequence> | ||||||
|  |                     <xs:element type="xs:byte" name="first"/> | ||||||
|  |                     <xs:element name="second"> | ||||||
|  |                       <xs:complexType mixed="true"> | ||||||
|  |                         <xs:sequence> | ||||||
|  |                           <xs:element type="xs:byte" name="i_satellite_PRN"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Toa"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_WNa"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_IODa"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Delta_i"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_M_0"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_e_eccentricity"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Delta_sqrt_A"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_OMEGA0"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_OMEGA"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_OMEGA_DOT"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_A_f0"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_A_f1"/> | ||||||
|  |                           <xs:element type="xs:float" name="E5b_HS"/> | ||||||
|  |                           <xs:element type="xs:float" name="E1B_HS"/> | ||||||
|  |                           <xs:element type="xs:float" name="E5a_HS"/> | ||||||
|  |                         </xs:sequence> | ||||||
|  |                         <xs:attribute type="xs:byte" name="class_id" use="optional"/> | ||||||
|  |                         <xs:attribute type="xs:byte" name="tracking_level" use="optional"/> | ||||||
|  |                         <xs:attribute type="xs:byte" name="version" use="optional"/> | ||||||
|  |                       </xs:complexType> | ||||||
|  |                     </xs:element> | ||||||
|  |                   </xs:sequence> | ||||||
|  |                   <xs:attribute type="xs:byte" name="class_id" use="optional"/> | ||||||
|  |                   <xs:attribute type="xs:byte" name="tracking_level" use="optional"/> | ||||||
|  |                   <xs:attribute type="xs:byte" name="version" use="optional"/> | ||||||
|  |                 </xs:complexType> | ||||||
|  |               </xs:element> | ||||||
|  |             </xs:sequence> | ||||||
|  |             <xs:attribute type="xs:byte" name="class_id"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="tracking_level"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |           </xs:complexType> | ||||||
|  |         </xs:element> | ||||||
|  |       </xs:sequence> | ||||||
|  |       <xs:attribute type="xs:string" name="signature"/> | ||||||
|  |       <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |     </xs:complexType> | ||||||
|  |   </xs:element> | ||||||
|  | </xs:schema> | ||||||
							
								
								
									
										60
									
								
								docs/xml-schemas/gal_ephemeris_map.xsd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								docs/xml-schemas/gal_ephemeris_map.xsd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | |||||||
|  | <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> | ||||||
|  |   <xs:element name="boost_serialization"> | ||||||
|  |     <xs:complexType> | ||||||
|  |       <xs:sequence> | ||||||
|  |         <xs:element name="GNSS-SDR_gal_ephemeris_map"> | ||||||
|  |           <xs:complexType> | ||||||
|  |             <xs:sequence> | ||||||
|  |               <xs:element type="xs:byte" name="count"/> | ||||||
|  |               <xs:element type="xs:byte" name="item_version"/> | ||||||
|  |               <xs:element name="item" maxOccurs="unbounded" minOccurs="0"> | ||||||
|  |                 <xs:complexType> | ||||||
|  |                   <xs:sequence> | ||||||
|  |                     <xs:element type="xs:byte" name="first"/> | ||||||
|  |                     <xs:element name="second"> | ||||||
|  |                       <xs:complexType> | ||||||
|  |                         <xs:sequence> | ||||||
|  |                           <xs:element type="xs:byte" name="i_satellite_PRN"/> | ||||||
|  |                           <xs:element type="xs:float" name="M0_1"/> | ||||||
|  |                           <xs:element type="xs:float" name="e_1"/> | ||||||
|  |                           <xs:element type="xs:float" name="A_1"/> | ||||||
|  |                           <xs:element type="xs:float" name="OMEGA_0_2"/> | ||||||
|  |                           <xs:element type="xs:float" name="i_0_2"/> | ||||||
|  |                           <xs:element type="xs:float" name="omega_2"/> | ||||||
|  |                           <xs:element type="xs:float" name="OMEGA_dot_3"/> | ||||||
|  |                           <xs:element type="xs:float" name="iDot_2"/> | ||||||
|  |                           <xs:element type="xs:float" name="C_uc_3"/> | ||||||
|  |                           <xs:element type="xs:float" name="C_us_3"/> | ||||||
|  |                           <xs:element type="xs:float" name="C_rc_3"/> | ||||||
|  |                           <xs:element type="xs:float" name="C_rs_3"/> | ||||||
|  |                           <xs:element type="xs:float" name="C_ic_4"/> | ||||||
|  |                           <xs:element type="xs:float" name="C_is_4"/> | ||||||
|  |                           <xs:element type="xs:float" name="t0e_1"/> | ||||||
|  |                           <xs:element type="xs:float" name="t0c_4"/> | ||||||
|  |                           <xs:element type="xs:float" name="af0_4"/> | ||||||
|  |                           <xs:element type="xs:float" name="af1_4"/> | ||||||
|  |                           <xs:element type="xs:float" name="af2_4"/> | ||||||
|  |                         </xs:sequence> | ||||||
|  |                         <xs:attribute type="xs:byte" name="class_id" use="optional"/> | ||||||
|  |                         <xs:attribute type="xs:byte" name="tracking_level" use="optional"/> | ||||||
|  |                         <xs:attribute type="xs:byte" name="version" use="optional"/> | ||||||
|  |                       </xs:complexType> | ||||||
|  |                     </xs:element> | ||||||
|  |                   </xs:sequence> | ||||||
|  |                   <xs:attribute type="xs:byte" name="class_id" use="optional"/> | ||||||
|  |                   <xs:attribute type="xs:byte" name="tracking_level" use="optional"/> | ||||||
|  |                   <xs:attribute type="xs:byte" name="version" use="optional"/> | ||||||
|  |                 </xs:complexType> | ||||||
|  |               </xs:element> | ||||||
|  |             </xs:sequence> | ||||||
|  |             <xs:attribute type="xs:byte" name="class_id"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="tracking_level"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |           </xs:complexType> | ||||||
|  |         </xs:element> | ||||||
|  |       </xs:sequence> | ||||||
|  |       <xs:attribute type="xs:string" name="signature"/> | ||||||
|  |       <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |     </xs:complexType> | ||||||
|  |   </xs:element> | ||||||
|  | </xs:schema> | ||||||
							
								
								
									
										29
									
								
								docs/xml-schemas/gal_iono_model.xsd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								docs/xml-schemas/gal_iono_model.xsd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> | ||||||
|  |   <xs:element name="boost_serialization"> | ||||||
|  |     <xs:complexType> | ||||||
|  |       <xs:sequence> | ||||||
|  |         <xs:element name="GNSS-SDR_gal_iono_model"> | ||||||
|  |           <xs:complexType> | ||||||
|  |             <xs:sequence> | ||||||
|  |               <xs:element type="xs:float" name="ai0_5"/> | ||||||
|  |               <xs:element type="xs:float" name="ai1_5"/> | ||||||
|  |               <xs:element type="xs:float" name="ai2_5"/> | ||||||
|  |               <xs:element type="xs:byte" name="Region1_flag_5"/> | ||||||
|  |               <xs:element type="xs:byte" name="Region2_flag_5"/> | ||||||
|  |               <xs:element type="xs:byte" name="Region3_flag_5"/> | ||||||
|  |               <xs:element type="xs:byte" name="Region4_flag_5"/> | ||||||
|  |               <xs:element type="xs:byte" name="Region5_flag_5"/> | ||||||
|  |               <xs:element type="xs:float" name="TOW_5"/> | ||||||
|  |               <xs:element type="xs:float" name="WN_5"/> | ||||||
|  |             </xs:sequence> | ||||||
|  |             <xs:attribute type="xs:byte" name="class_id"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="tracking_level"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |           </xs:complexType> | ||||||
|  |         </xs:element> | ||||||
|  |       </xs:sequence> | ||||||
|  |       <xs:attribute type="xs:string" name="signature"/> | ||||||
|  |       <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |     </xs:complexType> | ||||||
|  |   </xs:element> | ||||||
|  | </xs:schema> | ||||||
							
								
								
									
										28
									
								
								docs/xml-schemas/gal_utc_model.xsd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								docs/xml-schemas/gal_utc_model.xsd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> | ||||||
|  |   <xs:element name="boost_serialization"> | ||||||
|  |     <xs:complexType> | ||||||
|  |       <xs:sequence> | ||||||
|  |         <xs:element name="GNSS-SDR_gal_utc_model"> | ||||||
|  |           <xs:complexType> | ||||||
|  |             <xs:sequence> | ||||||
|  |               <xs:element type="xs:float" name="A0_6"/> | ||||||
|  |               <xs:element type="xs:float" name="A1_6"/> | ||||||
|  |               <xs:element type="xs:float" name="Delta_tLS_6"/> | ||||||
|  |               <xs:element type="xs:float" name="t0t_6"/> | ||||||
|  |               <xs:element type="xs:float" name="WNot_6"/> | ||||||
|  |               <xs:element type="xs:float" name="WN_LSF_6"/> | ||||||
|  |               <xs:element type="xs:float" name="DN_6"/> | ||||||
|  |               <xs:element type="xs:float" name="Delta_tLSF_6"/> | ||||||
|  |               <xs:element type="xs:byte" name="flag_utc_model"/> | ||||||
|  |             </xs:sequence> | ||||||
|  |             <xs:attribute type="xs:byte" name="class_id"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="tracking_level"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |           </xs:complexType> | ||||||
|  |         </xs:element> | ||||||
|  |       </xs:sequence> | ||||||
|  |       <xs:attribute type="xs:string" name="signature"/> | ||||||
|  |       <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |     </xs:complexType> | ||||||
|  |   </xs:element> | ||||||
|  | </xs:schema> | ||||||
							
								
								
									
										54
									
								
								docs/xml-schemas/gps_almanac_map.xsd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								docs/xml-schemas/gps_almanac_map.xsd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | |||||||
|  | <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> | ||||||
|  |   <xs:element name="boost_serialization"> | ||||||
|  |     <xs:complexType> | ||||||
|  |       <xs:sequence> | ||||||
|  |         <xs:element name="GNSS-SDR_gps_almanac_map"> | ||||||
|  |           <xs:complexType> | ||||||
|  |             <xs:sequence> | ||||||
|  |               <xs:element type="xs:byte" name="count"/> | ||||||
|  |               <xs:element type="xs:byte" name="item_version"/> | ||||||
|  |               <xs:element name="item" maxOccurs="unbounded" minOccurs="0"> | ||||||
|  |                 <xs:complexType> | ||||||
|  |                   <xs:sequence> | ||||||
|  |                     <xs:element type="xs:byte" name="first"/> | ||||||
|  |                     <xs:element name="second"> | ||||||
|  |                       <xs:complexType> | ||||||
|  |                         <xs:sequence> | ||||||
|  |                           <xs:element type="xs:byte" name="i_satellite_PRN"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Delta_i"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_Toa"/> | ||||||
|  |                           <xs:element type="xs:byte" name="i_WNa"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_M_0"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_e_eccentricity"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_sqrt_A"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_OMEGA0"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_OMEGA"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_OMEGA_DOT"/> | ||||||
|  |                           <xs:element type="xs:byte" name="i_SV_health"/> | ||||||
|  |                           <xs:element type="xs:byte" name="i_AS_status"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_A_f0"/> | ||||||
|  |                           <xs:element type="xs:float" name="d_A_f1"/> | ||||||
|  |                         </xs:sequence> | ||||||
|  |                         <xs:attribute type="xs:byte" name="class_id" use="optional"/> | ||||||
|  |                         <xs:attribute type="xs:byte" name="tracking_level" use="optional"/> | ||||||
|  |                         <xs:attribute type="xs:byte" name="version" use="optional"/> | ||||||
|  |                       </xs:complexType> | ||||||
|  |                     </xs:element> | ||||||
|  |                   </xs:sequence> | ||||||
|  |                   <xs:attribute type="xs:byte" name="class_id" use="optional"/> | ||||||
|  |                   <xs:attribute type="xs:byte" name="tracking_level" use="optional"/> | ||||||
|  |                   <xs:attribute type="xs:byte" name="version" use="optional"/> | ||||||
|  |                 </xs:complexType> | ||||||
|  |               </xs:element> | ||||||
|  |             </xs:sequence> | ||||||
|  |             <xs:attribute type="xs:byte" name="class_id"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="tracking_level"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |           </xs:complexType> | ||||||
|  |         </xs:element> | ||||||
|  |       </xs:sequence> | ||||||
|  |       <xs:attribute type="xs:string" name="signature"/> | ||||||
|  |       <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |     </xs:complexType> | ||||||
|  |   </xs:element> | ||||||
|  | </xs:schema> | ||||||
							
								
								
									
										27
									
								
								docs/xml-schemas/iono_model.xsd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								docs/xml-schemas/iono_model.xsd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> | ||||||
|  |   <xs:element name="boost_serialization"> | ||||||
|  |     <xs:complexType> | ||||||
|  |       <xs:sequence> | ||||||
|  |         <xs:element name="GNSS-SDR_iono_model"> | ||||||
|  |           <xs:complexType> | ||||||
|  |             <xs:sequence> | ||||||
|  |               <xs:element type="xs:float" name="d_alpha0"/> | ||||||
|  |               <xs:element type="xs:float" name="d_alpha1"/> | ||||||
|  |               <xs:element type="xs:float" name="d_alpha2"/> | ||||||
|  |               <xs:element type="xs:float" name="d_alpha3"/> | ||||||
|  |               <xs:element type="xs:float" name="d_beta0"/> | ||||||
|  |               <xs:element type="xs:float" name="d_beta1"/> | ||||||
|  |               <xs:element type="xs:float" name="d_beta2"/> | ||||||
|  |               <xs:element type="xs:float" name="d_beta3"/> | ||||||
|  |             </xs:sequence> | ||||||
|  |             <xs:attribute type="xs:byte" name="class_id"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="tracking_level"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |           </xs:complexType> | ||||||
|  |         </xs:element> | ||||||
|  |       </xs:sequence> | ||||||
|  |       <xs:attribute type="xs:string" name="signature"/> | ||||||
|  |       <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |     </xs:complexType> | ||||||
|  |   </xs:element> | ||||||
|  | </xs:schema> | ||||||
							
								
								
									
										28
									
								
								docs/xml-schemas/utc_model.xsd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								docs/xml-schemas/utc_model.xsd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> | ||||||
|  |   <xs:element name="boost_serialization"> | ||||||
|  |     <xs:complexType> | ||||||
|  |       <xs:sequence> | ||||||
|  |         <xs:element name="GNSS-SDR_utc_model"> | ||||||
|  |           <xs:complexType> | ||||||
|  |             <xs:sequence> | ||||||
|  |               <xs:element type="xs:byte" name="valid"/> | ||||||
|  |               <xs:element type="xs:float" name="d_A1"/> | ||||||
|  |               <xs:element type="xs:float" name="d_A0"/> | ||||||
|  |               <xs:element type="xs:float" name="d_t_OT"/> | ||||||
|  |               <xs:element type="xs:short" name="i_WN_T"/> | ||||||
|  |               <xs:element type="xs:float" name="d_DeltaT_LS"/> | ||||||
|  |               <xs:element type="xs:short" name="i_WN_LSF"/> | ||||||
|  |               <xs:element type="xs:byte" name="i_DN"/> | ||||||
|  |               <xs:element type="xs:float" name="d_DeltaT_LSF"/> | ||||||
|  |             </xs:sequence> | ||||||
|  |             <xs:attribute type="xs:byte" name="class_id"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="tracking_level"/> | ||||||
|  |             <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |           </xs:complexType> | ||||||
|  |         </xs:element> | ||||||
|  |       </xs:sequence> | ||||||
|  |       <xs:attribute type="xs:string" name="signature"/> | ||||||
|  |       <xs:attribute type="xs:byte" name="version"/> | ||||||
|  |     </xs:complexType> | ||||||
|  |   </xs:element> | ||||||
|  | </xs:schema> | ||||||
| @@ -30,6 +30,7 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
| #include "rtklib_pvt.h" | #include "rtklib_pvt.h" | ||||||
|  | #include "pvt_conf.h" | ||||||
| #include "configuration_interface.h" | #include "configuration_interface.h" | ||||||
| #include "gnss_sdr_flags.h" | #include "gnss_sdr_flags.h" | ||||||
| #include <boost/archive/xml_oarchive.hpp> | #include <boost/archive/xml_oarchive.hpp> | ||||||
| @@ -54,97 +55,87 @@ RtklibPvt::RtklibPvt(ConfigurationInterface* configuration, | |||||||
|                                 in_streams_(in_streams), |                                 in_streams_(in_streams), | ||||||
|                                 out_streams_(out_streams) |                                 out_streams_(out_streams) | ||||||
| { | { | ||||||
|  |     Pvt_Conf pvt_output_parameters = Pvt_Conf(); | ||||||
|     // dump parameters |     // dump parameters | ||||||
|     std::string default_dump_filename = "./pvt.dat"; |     std::string default_dump_filename = "./pvt.dat"; | ||||||
|     std::string default_nmea_dump_filename = "./nmea_pvt.nmea"; |     std::string default_nmea_dump_filename = "./nmea_pvt.nmea"; | ||||||
|     std::string default_nmea_dump_devname = "/dev/tty1"; |     std::string default_nmea_dump_devname = "/dev/tty1"; | ||||||
|     std::string default_rtcm_dump_devname = "/dev/pts/1"; |     std::string default_rtcm_dump_devname = "/dev/pts/1"; | ||||||
|     DLOG(INFO) << "role " << role; |     DLOG(INFO) << "role " << role; | ||||||
|     dump_ = configuration->property(role + ".dump", false); |     pvt_output_parameters.dump = configuration->property(role + ".dump", false); | ||||||
|     dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); |     pvt_output_parameters.dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); | ||||||
|  |     pvt_output_parameters.dump_mat = configuration->property(role + ".dump_mat", true); | ||||||
|  |  | ||||||
|     // output rate |     // output rate | ||||||
|     int output_rate_ms = configuration->property(role + ".output_rate_ms", 500); |     pvt_output_parameters.output_rate_ms = configuration->property(role + ".output_rate_ms", 500); | ||||||
|  |  | ||||||
|     // display rate |     // display rate | ||||||
|     int display_rate_ms = configuration->property(role + ".display_rate_ms", 500); |     pvt_output_parameters.display_rate_ms = configuration->property(role + ".display_rate_ms", 500); | ||||||
|  |  | ||||||
|     // NMEA Printer settings |     // NMEA Printer settings | ||||||
|     bool flag_nmea_tty_port = configuration->property(role + ".flag_nmea_tty_port", false); |     pvt_output_parameters.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); |     pvt_output_parameters.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); |     std::string nmea_dump_devname = configuration->property(role + ".nmea_dump_devname", default_nmea_dump_devname); | ||||||
|  |  | ||||||
|     // RINEX version |     // RINEX version | ||||||
|     int rinex_version = configuration->property(role + ".rinex_version", 3); |     pvt_output_parameters.rinex_version = configuration->property(role + ".rinex_version", 3); | ||||||
|     if (FLAGS_RINEX_version.compare("3.01") == 0) |     if (FLAGS_RINEX_version.compare("3.01") == 0) | ||||||
|         { |         { | ||||||
|             rinex_version = 3; |             pvt_output_parameters.rinex_version = 3; | ||||||
|         } |         } | ||||||
|     else if (FLAGS_RINEX_version.compare("3.02") == 0) |     else if (FLAGS_RINEX_version.compare("3.02") == 0) | ||||||
|         { |         { | ||||||
|             rinex_version = 3; |             pvt_output_parameters.rinex_version = 3; | ||||||
|         } |         } | ||||||
|     else if (FLAGS_RINEX_version.compare("3") == 0) |     else if (FLAGS_RINEX_version.compare("3") == 0) | ||||||
|         { |         { | ||||||
|             rinex_version = 3; |             pvt_output_parameters.rinex_version = 3; | ||||||
|         } |         } | ||||||
|     else if (FLAGS_RINEX_version.compare("2.11") == 0) |     else if (FLAGS_RINEX_version.compare("2.11") == 0) | ||||||
|         { |         { | ||||||
|             rinex_version = 2; |             pvt_output_parameters.rinex_version = 2; | ||||||
|         } |         } | ||||||
|     else if (FLAGS_RINEX_version.compare("2.10") == 0) |     else if (FLAGS_RINEX_version.compare("2.10") == 0) | ||||||
|         { |         { | ||||||
|             rinex_version = 2; |             pvt_output_parameters.rinex_version = 2; | ||||||
|         } |         } | ||||||
|     else if (FLAGS_RINEX_version.compare("2") == 0) |     else if (FLAGS_RINEX_version.compare("2") == 0) | ||||||
|         { |         { | ||||||
|             rinex_version = 2; |             pvt_output_parameters.rinex_version = 2; | ||||||
|         } |         } | ||||||
|     int rinexobs_rate_ms = bc::lcm(configuration->property(role + ".rinexobs_rate_ms", 1000), output_rate_ms); |     pvt_output_parameters.rinexobs_rate_ms = bc::lcm(configuration->property(role + ".rinexobs_rate_ms", 1000), pvt_output_parameters.output_rate_ms); | ||||||
|     int rinexnav_rate_ms = bc::lcm(configuration->property(role + ".rinexnav_rate_ms", 6000), output_rate_ms); |     pvt_output_parameters.rinexnav_rate_ms = bc::lcm(configuration->property(role + ".rinexnav_rate_ms", 6000), pvt_output_parameters.output_rate_ms); | ||||||
|  |  | ||||||
|     // RTCM Printer settings |     // RTCM Printer settings | ||||||
|     bool flag_rtcm_tty_port = configuration->property(role + ".flag_rtcm_tty_port", false); |     pvt_output_parameters.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); |     pvt_output_parameters.rtcm_dump_devname = configuration->property(role + ".rtcm_dump_devname", default_rtcm_dump_devname); | ||||||
|     bool flag_rtcm_server = configuration->property(role + ".flag_rtcm_server", false); |     pvt_output_parameters.flag_rtcm_server = configuration->property(role + ".flag_rtcm_server", false); | ||||||
|     unsigned short rtcm_tcp_port = configuration->property(role + ".rtcm_tcp_port", 2101); |     pvt_output_parameters.rtcm_tcp_port = configuration->property(role + ".rtcm_tcp_port", 2101); | ||||||
|     unsigned short rtcm_station_id = configuration->property(role + ".rtcm_station_id", 1234); |     pvt_output_parameters.rtcm_station_id = configuration->property(role + ".rtcm_station_id", 1234); | ||||||
|     // RTCM message rates: least common multiple with output_rate_ms |     // RTCM message rates: least common multiple with output_rate_ms | ||||||
|     int rtcm_MT1019_rate_ms = bc::lcm(configuration->property(role + ".rtcm_MT1019_rate_ms", 5000), output_rate_ms); |     int rtcm_MT1019_rate_ms = bc::lcm(configuration->property(role + ".rtcm_MT1019_rate_ms", 5000), pvt_output_parameters.output_rate_ms); | ||||||
|     int rtcm_MT1020_rate_ms = bc::lcm(configuration->property(role + ".rtcm_MT1020_rate_ms", 5000), output_rate_ms); |     int rtcm_MT1020_rate_ms = bc::lcm(configuration->property(role + ".rtcm_MT1020_rate_ms", 5000), pvt_output_parameters.output_rate_ms); | ||||||
|     int rtcm_MT1045_rate_ms = bc::lcm(configuration->property(role + ".rtcm_MT1045_rate_ms", 5000), output_rate_ms); |     int rtcm_MT1045_rate_ms = bc::lcm(configuration->property(role + ".rtcm_MT1045_rate_ms", 5000), pvt_output_parameters.output_rate_ms); | ||||||
|     int rtcm_MSM_rate_ms = bc::lcm(configuration->property(role + ".rtcm_MSM_rate_ms", 1000), output_rate_ms); |     int rtcm_MSM_rate_ms = bc::lcm(configuration->property(role + ".rtcm_MSM_rate_ms", 1000), pvt_output_parameters.output_rate_ms); | ||||||
|     int rtcm_MT1077_rate_ms = bc::lcm(configuration->property(role + ".rtcm_MT1077_rate_ms", rtcm_MSM_rate_ms), output_rate_ms); |     int rtcm_MT1077_rate_ms = bc::lcm(configuration->property(role + ".rtcm_MT1077_rate_ms", rtcm_MSM_rate_ms), pvt_output_parameters.output_rate_ms); | ||||||
|     int rtcm_MT1087_rate_ms = bc::lcm(configuration->property(role + ".rtcm_MT1087_rate_ms", rtcm_MSM_rate_ms), output_rate_ms); |     int rtcm_MT1087_rate_ms = bc::lcm(configuration->property(role + ".rtcm_MT1087_rate_ms", rtcm_MSM_rate_ms), pvt_output_parameters.output_rate_ms); | ||||||
|     int rtcm_MT1097_rate_ms = bc::lcm(configuration->property(role + ".rtcm_MT1097_rate_ms", rtcm_MSM_rate_ms), output_rate_ms); |     int rtcm_MT1097_rate_ms = bc::lcm(configuration->property(role + ".rtcm_MT1097_rate_ms", rtcm_MSM_rate_ms), pvt_output_parameters.output_rate_ms); | ||||||
|     std::map<int, int> rtcm_msg_rate_ms; |     //std::map<int, int> rtcm_msg_rate_ms; | ||||||
|     rtcm_msg_rate_ms[1019] = rtcm_MT1019_rate_ms; |     pvt_output_parameters.rtcm_msg_rate_ms[1019] = rtcm_MT1019_rate_ms; | ||||||
|     rtcm_msg_rate_ms[1020] = rtcm_MT1020_rate_ms; |     pvt_output_parameters.rtcm_msg_rate_ms[1020] = rtcm_MT1020_rate_ms; | ||||||
|     rtcm_msg_rate_ms[1045] = rtcm_MT1045_rate_ms; |     pvt_output_parameters.rtcm_msg_rate_ms[1045] = rtcm_MT1045_rate_ms; | ||||||
|     for (int k = 1071; k < 1078; k++)  // All GPS MSM |     for (int k = 1071; k < 1078; k++)  // All GPS MSM | ||||||
|         { |         { | ||||||
|             rtcm_msg_rate_ms[k] = rtcm_MT1077_rate_ms; |             pvt_output_parameters.rtcm_msg_rate_ms[k] = rtcm_MT1077_rate_ms; | ||||||
|         } |         } | ||||||
|     for (int k = 1081; k < 1088; k++)  // All GLONASS MSM |     for (int k = 1081; k < 1088; k++)  // All GLONASS MSM | ||||||
|         { |         { | ||||||
|             rtcm_msg_rate_ms[k] = rtcm_MT1087_rate_ms; |             pvt_output_parameters.rtcm_msg_rate_ms[k] = rtcm_MT1087_rate_ms; | ||||||
|         } |         } | ||||||
|     for (int k = 1091; k < 1098; k++)  // All Galileo MSM |     for (int k = 1091; k < 1098; k++)  // All Galileo MSM | ||||||
|         { |         { | ||||||
|             rtcm_msg_rate_ms[k] = rtcm_MT1097_rate_ms; |             pvt_output_parameters.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 |     // Infer the type of receiver | ||||||
|     /* |     /* | ||||||
| @@ -188,47 +179,46 @@ RtklibPvt::RtklibPvt(ConfigurationInterface* configuration, | |||||||
|     int glo_1G_count = configuration->property("Channels_1G.count", 0); |     int glo_1G_count = configuration->property("Channels_1G.count", 0); | ||||||
|     int glo_2G_count = configuration->property("Channels_2G.count", 0); |     int glo_2G_count = configuration->property("Channels_2G.count", 0); | ||||||
|  |  | ||||||
|     unsigned int type_of_receiver = 0; |     if ((gps_1C_count != 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 1;  // L1 | ||||||
|  |     if ((gps_1C_count == 0) && (gps_2S_count != 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 2; | ||||||
|  |     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count != 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 3;  // L5 | ||||||
|  |     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 4;  // E1 | ||||||
|  |     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 5;  // E5a | ||||||
|  |     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count != 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 6; | ||||||
|  |  | ||||||
|     // *******************WARNING!!!!!!!*********** |     if ((gps_1C_count != 0) && (gps_2S_count != 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 7; | ||||||
|     // GPS L5 only configurable for single frequency, single system at the moment!!!!!! |     if ((gps_1C_count != 0) && (gps_2S_count == 0) && (gps_L5_count != 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 8;  // L1+L5 | ||||||
|     if ((gps_1C_count != 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) type_of_receiver = 1; |     if ((gps_1C_count != 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 9;  // L1+E1 | ||||||
|     if ((gps_1C_count == 0) && (gps_2S_count != 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) type_of_receiver = 2; |     if ((gps_1C_count != 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 10; | ||||||
|     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count != 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) type_of_receiver = 3; |     if ((gps_1C_count != 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count != 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 11; | ||||||
|     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) type_of_receiver = 4; |     if ((gps_1C_count == 0) && (gps_2S_count != 0) && (gps_L5_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 12; | ||||||
|     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) type_of_receiver = 5; |     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count != 0) && (gal_1B_count == 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 13;  // L5+E5a | ||||||
|     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count != 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) type_of_receiver = 6; |     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count != 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 14; | ||||||
|  |     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count != 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 15; | ||||||
|  |     //if( (gps_1C_count == 0) && (gps_2S_count == 0)  && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) pvt_output_parameters.type_of_receiver = 16; | ||||||
|  |     if ((gps_1C_count == 0) && (gps_2S_count != 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 17; | ||||||
|  |     if ((gps_1C_count == 0) && (gps_2S_count != 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count != 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 18; | ||||||
|  |     //if( (gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) pvt_output_parameters.type_of_receiver = 19; | ||||||
|  |     //if( (gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) pvt_output_parameters.type_of_receiver = 20; | ||||||
|  |     if ((gps_1C_count != 0) && (gps_2S_count != 0) && (gps_L5_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 21; | ||||||
|  |     //if( (gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count = 0)) pvt_output_parameters.type_of_receiver = 22; | ||||||
|  |     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count != 0)) pvt_output_parameters.type_of_receiver = 23; | ||||||
|  |     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count != 0)) pvt_output_parameters.type_of_receiver = 24; | ||||||
|  |     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count != 0) && (glo_2G_count != 0)) pvt_output_parameters.type_of_receiver = 25; | ||||||
|  |     if ((gps_1C_count != 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count != 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 26; | ||||||
|  |     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count != 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 27; | ||||||
|  |     if ((gps_1C_count == 0) && (gps_2S_count != 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count != 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 28; | ||||||
|  |     if ((gps_1C_count != 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count != 0)) pvt_output_parameters.type_of_receiver = 29; | ||||||
|  |     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count != 0)) pvt_output_parameters.type_of_receiver = 30; | ||||||
|  |     if ((gps_1C_count == 0) && (gps_2S_count != 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count != 0)) pvt_output_parameters.type_of_receiver = 31; | ||||||
|  |  | ||||||
|     if ((gps_1C_count != 0) && (gps_2S_count != 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) type_of_receiver = 7; |     if ((gps_1C_count != 0) && (gps_2S_count == 0) && (gps_L5_count != 0) && (gal_1B_count != 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) pvt_output_parameters.type_of_receiver = 32;  // L1+E1+L5+E5a | ||||||
|     //if( (gps_1C_count != 0) && (gps_2S_count == 0)  && (gps_L5_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) && (gps_L5_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) type_of_receiver = 9; |     // RTKLIB PVT solver options | ||||||
|     if ((gps_1C_count != 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) type_of_receiver = 10; |  | ||||||
|     if ((gps_1C_count != 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count != 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) type_of_receiver = 11; |  | ||||||
|     if ((gps_1C_count == 0) && (gps_2S_count != 0) && (gps_L5_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_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) && (gps_L5_count == 0) && (gal_1B_count != 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) type_of_receiver = 14; |  | ||||||
|     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count != 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) type_of_receiver = 15; |  | ||||||
|     //if( (gps_1C_count == 0) && (gps_2S_count == 0)  && (gps_L5_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) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) type_of_receiver = 17; |  | ||||||
|     if ((gps_1C_count == 0) && (gps_2S_count != 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count != 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) type_of_receiver = 18; |  | ||||||
|     //if( (gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_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) && (gps_L5_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) && (gps_L5_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count == 0)) type_of_receiver = 21; |  | ||||||
|     //if( (gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count = 0)) type_of_receiver = 22; |  | ||||||
|     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count != 0)) type_of_receiver = 23; |  | ||||||
|     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count != 0)) type_of_receiver = 24; |  | ||||||
|     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count != 0) && (glo_2G_count != 0)) type_of_receiver = 25; |  | ||||||
|     if ((gps_1C_count != 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count != 0) && (glo_2G_count == 0)) type_of_receiver = 26; |  | ||||||
|     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count != 0) && (glo_2G_count == 0)) type_of_receiver = 27; |  | ||||||
|     if ((gps_1C_count == 0) && (gps_2S_count != 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count != 0) && (glo_2G_count == 0)) type_of_receiver = 28; |  | ||||||
|     if ((gps_1C_count != 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count != 0)) type_of_receiver = 29; |  | ||||||
|     if ((gps_1C_count == 0) && (gps_2S_count == 0) && (gps_L5_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count != 0)) type_of_receiver = 30; |  | ||||||
|     if ((gps_1C_count == 0) && (gps_2S_count != 0) && (gps_L5_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0) && (glo_1G_count == 0) && (glo_2G_count != 0)) type_of_receiver = 31; |  | ||||||
|     //RTKLIB PVT solver options |  | ||||||
|     // Settings 1 |     // Settings 1 | ||||||
|     int positioning_mode = -1; |     int positioning_mode = -1; | ||||||
|     std::string default_pos_mode("Single"); |     std::string default_pos_mode("Single"); | ||||||
|     std::string positioning_mode_str = configuration->property(role + ".positioning_mode", default_pos_mode); /* (PMODE_XXX) see src/algorithms/libs/rtklib/rtklib.h */ |     std::string positioning_mode_str = configuration->property(role + ".positioning_mode", default_pos_mode);  //  (PMODE_XXX) see src/algorithms/libs/rtklib/rtklib.h | ||||||
|     if (positioning_mode_str.compare("Single") == 0) positioning_mode = PMODE_SINGLE; |     if (positioning_mode_str.compare("Single") == 0) positioning_mode = PMODE_SINGLE; | ||||||
|     if (positioning_mode_str.compare("Static") == 0) positioning_mode = PMODE_STATIC; |     if (positioning_mode_str.compare("Static") == 0) positioning_mode = PMODE_STATIC; | ||||||
|     if (positioning_mode_str.compare("Kinematic") == 0) positioning_mode = PMODE_KINEMA; |     if (positioning_mode_str.compare("Kinematic") == 0) positioning_mode = PMODE_KINEMA; | ||||||
| @@ -489,8 +479,29 @@ RtklibPvt::RtklibPvt(ConfigurationInterface* configuration, | |||||||
|  |  | ||||||
|     rtkinit(&rtk, &rtklib_configuration_options); |     rtkinit(&rtk, &rtklib_configuration_options); | ||||||
|  |  | ||||||
|  |     // Outputs | ||||||
|  |     bool default_output_enabled = configuration->property(role + ".output_enabled", true); | ||||||
|  |     pvt_output_parameters.output_enabled = default_output_enabled; | ||||||
|  |     pvt_output_parameters.rinex_output_enabled = configuration->property(role + ".rinex_output_enabled", default_output_enabled); | ||||||
|  |     pvt_output_parameters.gpx_output_enabled = configuration->property(role + ".gpx_output_enabled", default_output_enabled); | ||||||
|  |     pvt_output_parameters.geojson_output_enabled = configuration->property(role + ".geojson_output_enabled", default_output_enabled); | ||||||
|  |     pvt_output_parameters.kml_output_enabled = configuration->property(role + ".kml_output_enabled", default_output_enabled); | ||||||
|  |     pvt_output_parameters.xml_output_enabled = configuration->property(role + ".xml_output_enabled", default_output_enabled); | ||||||
|  |     pvt_output_parameters.nmea_output_file_enabled = configuration->property(role + ".nmea_output_file_enabled", default_output_enabled); | ||||||
|  |     pvt_output_parameters.rtcm_output_file_enabled = configuration->property(role + ".rtcm_output_file_enabled", default_output_enabled); | ||||||
|  |  | ||||||
|  |     std::string default_output_path = configuration->property(role + ".output_path", std::string(".")); | ||||||
|  |     pvt_output_parameters.output_path = default_output_path; | ||||||
|  |     pvt_output_parameters.rinex_output_path = configuration->property(role + ".rinex_output_path", default_output_path); | ||||||
|  |     pvt_output_parameters.gpx_output_path = configuration->property(role + ".gpx_output_path", default_output_path); | ||||||
|  |     pvt_output_parameters.geojson_output_path = configuration->property(role + ".geojson_output_path", default_output_path); | ||||||
|  |     pvt_output_parameters.kml_output_path = configuration->property(role + ".kml_output_path", default_output_path); | ||||||
|  |     pvt_output_parameters.xml_output_path = configuration->property(role + ".xml_output_path", default_output_path); | ||||||
|  |     pvt_output_parameters.nmea_output_file_path = configuration->property(role + ".nmea_output_file_path", default_output_path); | ||||||
|  |     pvt_output_parameters.rtcm_output_file_path = configuration->property(role + ".rtcm_output_file_path", default_output_path); | ||||||
|  |  | ||||||
|     // make PVT object |     // make PVT object | ||||||
|     pvt_ = rtklib_make_pvt_cc(in_streams_, dump_, dump_filename_, output_rate_ms, display_rate_ms, flag_nmea_tty_port, nmea_dump_filename, nmea_dump_devname, rinex_version, rinexobs_rate_ms, rinexnav_rate_ms, flag_rtcm_server, flag_rtcm_tty_port, rtcm_tcp_port, rtcm_station_id, rtcm_msg_rate_ms, rtcm_dump_devname, type_of_receiver, rtk); |     pvt_ = rtklib_make_pvt_cc(in_streams_, pvt_output_parameters, rtk); | ||||||
|     DLOG(INFO) << "pvt(" << pvt_->unique_id() << ")"; |     DLOG(INFO) << "pvt(" << pvt_->unique_id() << ")"; | ||||||
|     if (out_streams_ > 0) |     if (out_streams_ > 0) | ||||||
|         { |         { | ||||||
| @@ -499,40 +510,9 @@ RtklibPvt::RtklibPvt(ConfigurationInterface* configuration, | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| bool RtklibPvt::save_assistance_to_XML() |  | ||||||
| { |  | ||||||
|     LOG(INFO) << "SUPL: Try to save GPS ephemeris to XML file " << eph_xml_filename_; |  | ||||||
|     std::map<int, Gps_Ephemeris> eph_map = pvt_->get_GPS_L1_ephemeris_map(); |  | ||||||
|  |  | ||||||
|     if (eph_map.empty() == false) |  | ||||||
|         { |  | ||||||
|             std::ofstream ofs; |  | ||||||
|             try |  | ||||||
|                 { |  | ||||||
|                     ofs.open(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); |  | ||||||
|                     LOG(INFO) << "Saved GPS L1 Ephemeris map data"; |  | ||||||
|                 } |  | ||||||
|             catch (const std::exception& e) |  | ||||||
|                 { |  | ||||||
|                     LOG(WARNING) << e.what(); |  | ||||||
|                     return false; |  | ||||||
|                 } |  | ||||||
|         } |  | ||||||
|     else |  | ||||||
|         { |  | ||||||
|             LOG(WARNING) << "Failed to save Ephemeris, map is empty"; |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|     return true;  // return variable (true == succeeded) |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| RtklibPvt::~RtklibPvt() | RtklibPvt::~RtklibPvt() | ||||||
| { | { | ||||||
|     rtkfree(&rtk); |     rtkfree(&rtk); | ||||||
|     save_assistance_to_XML(); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -40,7 +40,7 @@ | |||||||
| class ConfigurationInterface; | class ConfigurationInterface; | ||||||
|  |  | ||||||
| /*! | /*! | ||||||
|  * \brief This class implements a PvtInterface for Galileo E1 |  * \brief This class implements a PvtInterface for the RTKLIB PVT block | ||||||
|  */ |  */ | ||||||
| class RtklibPvt : public PvtInterface | class RtklibPvt : public PvtInterface | ||||||
| { | { | ||||||
| @@ -87,8 +87,6 @@ private: | |||||||
|     std::string role_; |     std::string role_; | ||||||
|     unsigned int in_streams_; |     unsigned int in_streams_; | ||||||
|     unsigned int out_streams_; |     unsigned int out_streams_; | ||||||
|     std::string eph_xml_filename_; |  | ||||||
|     bool save_assistance_to_XML(); |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -36,6 +36,7 @@ include_directories( | |||||||
|      ${CMAKE_SOURCE_DIR}/src/core/receiver |      ${CMAKE_SOURCE_DIR}/src/core/receiver | ||||||
|      ${CMAKE_SOURCE_DIR}/src/algorithms/PVT/libs |      ${CMAKE_SOURCE_DIR}/src/algorithms/PVT/libs | ||||||
|      ${CMAKE_SOURCE_DIR}/src/algorithms/libs/rtklib |      ${CMAKE_SOURCE_DIR}/src/algorithms/libs/rtklib | ||||||
|  |      ${CMAKE_SOURCE_DIR}/src/algorithms/libs | ||||||
|      ${ARMADILLO_INCLUDE_DIRS} |      ${ARMADILLO_INCLUDE_DIRS} | ||||||
|      ${Boost_INCLUDE_DIRS} |      ${Boost_INCLUDE_DIRS} | ||||||
|      ${GLOG_INCLUDE_DIRS} |      ${GLOG_INCLUDE_DIRS} | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -38,6 +38,7 @@ | |||||||
| #include "geojson_printer.h" | #include "geojson_printer.h" | ||||||
| #include "rinex_printer.h" | #include "rinex_printer.h" | ||||||
| #include "rtcm_printer.h" | #include "rtcm_printer.h" | ||||||
|  | #include "pvt_conf.h" | ||||||
| #include "rtklib_solver.h" | #include "rtklib_solver.h" | ||||||
| #include <gnuradio/sync_block.h> | #include <gnuradio/sync_block.h> | ||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
| @@ -55,23 +56,7 @@ class rtklib_pvt_cc; | |||||||
| typedef boost::shared_ptr<rtklib_pvt_cc> rtklib_pvt_cc_sptr; | typedef boost::shared_ptr<rtklib_pvt_cc> rtklib_pvt_cc_sptr; | ||||||
|  |  | ||||||
| rtklib_pvt_cc_sptr rtklib_make_pvt_cc(uint32_t n_channels, | rtklib_pvt_cc_sptr rtklib_make_pvt_cc(uint32_t n_channels, | ||||||
|     bool dump, |     const Pvt_Conf& conf_, | ||||||
|     std::string dump_filename, |  | ||||||
|     int32_t output_rate_ms, |  | ||||||
|     int32_t display_rate_ms, |  | ||||||
|     bool flag_nmea_tty_port, |  | ||||||
|     std::string nmea_dump_filename, |  | ||||||
|     std::string nmea_dump_devname, |  | ||||||
|     int32_t rinex_version, |  | ||||||
|     int32_t rinexobs_rate_ms, |  | ||||||
|     int32_t rinexnav_rate_ms, |  | ||||||
|     bool flag_rtcm_server, |  | ||||||
|     bool flag_rtcm_tty_port, |  | ||||||
|     uint16_t rtcm_tcp_port, |  | ||||||
|     uint16_t rtcm_station_id, |  | ||||||
|     std::map<int, int> rtcm_msg_rate_ms, |  | ||||||
|     std::string rtcm_dump_devname, |  | ||||||
|     const uint32_t type_of_receiver, |  | ||||||
|     rtk_t& rtk); |     rtk_t& rtk); | ||||||
|  |  | ||||||
| /*! | /*! | ||||||
| @@ -81,28 +66,14 @@ class rtklib_pvt_cc : public gr::sync_block | |||||||
| { | { | ||||||
| private: | private: | ||||||
|     friend rtklib_pvt_cc_sptr rtklib_make_pvt_cc(uint32_t nchannels, |     friend rtklib_pvt_cc_sptr rtklib_make_pvt_cc(uint32_t nchannels, | ||||||
|         bool dump, |         const Pvt_Conf& conf_, | ||||||
|         std::string dump_filename, |  | ||||||
|         int32_t output_rate_ms, |  | ||||||
|         int32_t display_rate_ms, |  | ||||||
|         bool flag_nmea_tty_port, |  | ||||||
|         std::string nmea_dump_filename, |  | ||||||
|         std::string nmea_dump_devname, |  | ||||||
|         int32_t rinex_version, |  | ||||||
|         int32_t rinexobs_rate_ms, |  | ||||||
|         int32_t rinexnav_rate_ms, |  | ||||||
|         bool flag_rtcm_server, |  | ||||||
|         bool flag_rtcm_tty_port, |  | ||||||
|         uint16_t rtcm_tcp_port, |  | ||||||
|         uint16_t rtcm_station_id, |  | ||||||
|         std::map<int, int> rtcm_msg_rate_ms, |  | ||||||
|         std::string rtcm_dump_devname, |  | ||||||
|         const uint32_t type_of_receiver, |  | ||||||
|         rtk_t& rtk); |         rtk_t& rtk); | ||||||
|  |  | ||||||
|     void msg_handler_telemetry(pmt::pmt_t msg); |     void msg_handler_telemetry(pmt::pmt_t msg); | ||||||
|  |  | ||||||
|     bool d_dump; |     bool d_dump; | ||||||
|  |     bool d_dump_mat; | ||||||
|  |     bool b_rinex_output_enabled; | ||||||
|     bool b_rinex_header_written; |     bool b_rinex_header_written; | ||||||
|     bool b_rinex_header_updated; |     bool b_rinex_header_updated; | ||||||
|     double d_rinex_version; |     double d_rinex_version; | ||||||
| @@ -110,6 +81,7 @@ private: | |||||||
|     int32_t d_rinexnav_rate_ms; |     int32_t d_rinexnav_rate_ms; | ||||||
|  |  | ||||||
|     bool b_rtcm_writing_started; |     bool b_rtcm_writing_started; | ||||||
|  |     bool b_rtcm_enabled; | ||||||
|     int32_t d_rtcm_MT1045_rate_ms;  //!< Galileo Broadcast Ephemeris |     int32_t d_rtcm_MT1045_rate_ms;  //!< Galileo Broadcast Ephemeris | ||||||
|     int32_t d_rtcm_MT1019_rate_ms;  //!< GPS Broadcast Ephemeris (orbits) |     int32_t d_rtcm_MT1019_rate_ms;  //!< GPS Broadcast Ephemeris (orbits) | ||||||
|     int32_t d_rtcm_MT1020_rate_ms;  //!< GLONASS Broadcast Ephemeris (orbits) |     int32_t d_rtcm_MT1020_rate_ms;  //!< GLONASS Broadcast Ephemeris (orbits) | ||||||
| @@ -134,6 +106,10 @@ private: | |||||||
|     std::shared_ptr<Rtcm_Printer> d_rtcm_printer; |     std::shared_ptr<Rtcm_Printer> d_rtcm_printer; | ||||||
|     double d_rx_time; |     double d_rx_time; | ||||||
|  |  | ||||||
|  |     bool d_geojson_output_enabled; | ||||||
|  |     bool d_gpx_output_enabled; | ||||||
|  |     bool d_kml_output_enabled; | ||||||
|  |  | ||||||
|     std::shared_ptr<rtklib_solver> d_ls_pvt; |     std::shared_ptr<rtklib_solver> d_ls_pvt; | ||||||
|  |  | ||||||
|     std::map<int, Gnss_Synchro> gnss_observables_map; |     std::map<int, Gnss_Synchro> gnss_observables_map; | ||||||
| @@ -156,24 +132,13 @@ private: | |||||||
|  |  | ||||||
|     bool load_gnss_synchro_map_xml(const std::string file_name);  //debug helper function |     bool load_gnss_synchro_map_xml(const std::string file_name);  //debug helper function | ||||||
|  |  | ||||||
|  |     bool d_xml_storage; | ||||||
|  |     std::string xml_base_path; | ||||||
|  |  | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     rtklib_pvt_cc(uint32_t nchannels, |     rtklib_pvt_cc(uint32_t nchannels, | ||||||
|         bool dump, std::string dump_filename, |         const Pvt_Conf& conf_, | ||||||
|         int32_t output_rate_ms, |  | ||||||
|         int32_t display_rate_ms, |  | ||||||
|         bool flag_nmea_tty_port, |  | ||||||
|         std::string nmea_dump_filename, |  | ||||||
|         std::string nmea_dump_devname, |  | ||||||
|         int32_t rinex_version, |  | ||||||
|         int32_t rinexobs_rate_ms, |  | ||||||
|         int32_t rinexnav_rate_ms, |  | ||||||
|         bool flag_rtcm_server, |  | ||||||
|         bool flag_rtcm_tty_port, |  | ||||||
|         uint16_t rtcm_tcp_port, |  | ||||||
|         uint16_t rtcm_station_id, |  | ||||||
|         std::map<int, int> rtcm_msg_rate_ms, |  | ||||||
|         std::string rtcm_dump_devname, |  | ||||||
|         const uint32_t type_of_receiver, |  | ||||||
|         rtk_t& rtk); |         rtk_t& rtk); | ||||||
|  |  | ||||||
|     /*! |     /*! | ||||||
|   | |||||||
| @@ -29,6 +29,7 @@ set(PVT_LIB_SOURCES | |||||||
|      rtcm_printer.cc |      rtcm_printer.cc | ||||||
|      geojson_printer.cc |      geojson_printer.cc | ||||||
|      rtklib_solver.cc |      rtklib_solver.cc | ||||||
|  |      pvt_conf.cc | ||||||
| ) | ) | ||||||
|  |  | ||||||
| set(PVT_LIB_HEADERS  | set(PVT_LIB_HEADERS  | ||||||
| @@ -42,6 +43,7 @@ set(PVT_LIB_HEADERS | |||||||
|      rtcm_printer.h |      rtcm_printer.h | ||||||
|      geojson_printer.h |      geojson_printer.h | ||||||
|      rtklib_solver.h |      rtklib_solver.h | ||||||
|  |      pvt_conf.h | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -57,6 +59,7 @@ include_directories( | |||||||
|      ${ARMADILLO_INCLUDE_DIRS} |      ${ARMADILLO_INCLUDE_DIRS} | ||||||
|      ${GFlags_INCLUDE_DIRS} |      ${GFlags_INCLUDE_DIRS} | ||||||
|      ${GLOG_INCLUDE_DIRS} |      ${GLOG_INCLUDE_DIRS} | ||||||
|  |      ${MATIO_INCLUDE_DIRS} | ||||||
| ) | ) | ||||||
|  |  | ||||||
| list(SORT PVT_LIB_HEADERS) | list(SORT PVT_LIB_HEADERS) | ||||||
| @@ -64,7 +67,12 @@ list(SORT PVT_LIB_SOURCES) | |||||||
|  |  | ||||||
| add_library(pvt_lib ${PVT_LIB_SOURCES} ${PVT_LIB_HEADERS}) | add_library(pvt_lib ${PVT_LIB_SOURCES} ${PVT_LIB_HEADERS}) | ||||||
| source_group(Headers FILES ${PVT_LIB_HEADERS}) | source_group(Headers FILES ${PVT_LIB_HEADERS}) | ||||||
| add_dependencies(pvt_lib rtklib_lib armadillo-${armadillo_RELEASE} glog-${glog_RELEASE}) |  | ||||||
|  | if(MATIO_FOUND) | ||||||
|  |     add_dependencies(pvt_lib glog-${glog_RELEASE} armadillo-${armadillo_RELEASE}) | ||||||
|  | else(MATIO_FOUND) | ||||||
|  |     add_dependencies(pvt_lib glog-${glog_RELEASE} armadillo-${armadillo_RELEASE} matio-${GNSSSDR_MATIO_LOCAL_VERSION}) | ||||||
|  | endif(MATIO_FOUND) | ||||||
|  |  | ||||||
| target_link_libraries( | target_link_libraries( | ||||||
|     pvt_lib  |     pvt_lib  | ||||||
| @@ -75,4 +83,5 @@ target_link_libraries( | |||||||
|     ${ARMADILLO_LIBRARIES} |     ${ARMADILLO_LIBRARIES} | ||||||
|     ${BLAS} |     ${BLAS} | ||||||
|     ${LAPACK} |     ${LAPACK} | ||||||
|  |     ${MATIO_LIBRARIES} | ||||||
| ) | ) | ||||||
|   | |||||||
| @@ -32,14 +32,48 @@ | |||||||
|  |  | ||||||
| #include "geojson_printer.h" | #include "geojson_printer.h" | ||||||
| #include <boost/date_time/posix_time/posix_time.hpp> | #include <boost/date_time/posix_time/posix_time.hpp> | ||||||
|  | #include <boost/filesystem/operations.hpp>   // for create_directories, exists | ||||||
|  | #include <boost/filesystem/path.hpp>         // for path, operator<< | ||||||
|  | #include <boost/filesystem/path_traits.hpp>  // for filesystem | ||||||
| #include <glog/logging.h> | #include <glog/logging.h> | ||||||
| #include <iomanip> | #include <iomanip> | ||||||
| #include <sstream> | #include <sstream> | ||||||
|  |  | ||||||
|  |  | ||||||
| GeoJSON_Printer::GeoJSON_Printer() | GeoJSON_Printer::GeoJSON_Printer(const std::string& base_path) | ||||||
| { | { | ||||||
|     first_pos = true; |     first_pos = true; | ||||||
|  |     geojson_base_path = base_path; | ||||||
|  |     boost::filesystem::path full_path(boost::filesystem::current_path()); | ||||||
|  |     const boost::filesystem::path p(geojson_base_path); | ||||||
|  |     if (!boost::filesystem::exists(p)) | ||||||
|  |         { | ||||||
|  |             std::string new_folder; | ||||||
|  |             for (auto& folder : boost::filesystem::path(geojson_base_path)) | ||||||
|  |                 { | ||||||
|  |                     new_folder += folder.string(); | ||||||
|  |                     boost::system::error_code ec; | ||||||
|  |                     if (!boost::filesystem::exists(new_folder)) | ||||||
|  |                         { | ||||||
|  |                             if (!boost::filesystem::create_directory(new_folder, ec)) | ||||||
|  |                                 { | ||||||
|  |                                     std::cout << "Could not create the " << new_folder << " folder." << std::endl; | ||||||
|  |                                     geojson_base_path = full_path.string(); | ||||||
|  |                                 } | ||||||
|  |                         } | ||||||
|  |                     new_folder += boost::filesystem::path::preferred_separator; | ||||||
|  |                 } | ||||||
|  |         } | ||||||
|  |     else | ||||||
|  |         { | ||||||
|  |             geojson_base_path = p.string(); | ||||||
|  |         } | ||||||
|  |     if (geojson_base_path.compare(".") != 0) | ||||||
|  |         { | ||||||
|  |             std::cout << "GeoJSON files will be stored at " << geojson_base_path << std::endl; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     geojson_base_path = geojson_base_path + boost::filesystem::path::preferred_separator; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -96,6 +130,7 @@ bool GeoJSON_Printer::set_headers(std::string filename, bool time_tag_name) | |||||||
|         { |         { | ||||||
|             filename_ = filename + ".geojson"; |             filename_ = filename + ".geojson"; | ||||||
|         } |         } | ||||||
|  |     filename_ = geojson_base_path + filename_; | ||||||
|  |  | ||||||
|     geojson_file.open(filename_.c_str()); |     geojson_file.open(filename_.c_str()); | ||||||
|  |  | ||||||
| @@ -124,6 +159,7 @@ bool GeoJSON_Printer::set_headers(std::string filename, bool time_tag_name) | |||||||
|         } |         } | ||||||
|     else |     else | ||||||
|         { |         { | ||||||
|  |             std::cout << "File " << filename_ << " cannot be saved. Wrong permissions?" << std::endl; | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -50,9 +50,10 @@ private: | |||||||
|     std::ofstream geojson_file; |     std::ofstream geojson_file; | ||||||
|     bool first_pos; |     bool first_pos; | ||||||
|     std::string filename_; |     std::string filename_; | ||||||
|  |     std::string geojson_base_path; | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     GeoJSON_Printer(); |     GeoJSON_Printer(const std::string& base_path = "."); | ||||||
|     ~GeoJSON_Printer(); |     ~GeoJSON_Printer(); | ||||||
|     bool set_headers(std::string filename, bool time_tag_name = true); |     bool set_headers(std::string filename, bool time_tag_name = true); | ||||||
|     bool print_position(const std::shared_ptr<Pvt_Solution>& position, bool print_average_values); |     bool print_position(const std::shared_ptr<Pvt_Solution>& position, bool print_average_values); | ||||||
|   | |||||||
| @@ -32,11 +32,53 @@ | |||||||
|  |  | ||||||
| #include "gpx_printer.h" | #include "gpx_printer.h" | ||||||
| #include <boost/date_time/posix_time/posix_time.hpp> | #include <boost/date_time/posix_time/posix_time.hpp> | ||||||
|  | #include <boost/filesystem/operations.hpp>   // for create_directories, exists | ||||||
|  | #include <boost/filesystem/path.hpp>         // for path, operator<< | ||||||
|  | #include <boost/filesystem/path_traits.hpp>  // for filesystem | ||||||
| #include <glog/logging.h> | #include <glog/logging.h> | ||||||
| #include <sstream> | #include <sstream> | ||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Gpx_Printer::Gpx_Printer(const std::string& base_path) | ||||||
|  | { | ||||||
|  |     positions_printed = false; | ||||||
|  |     indent = "  "; | ||||||
|  |     gpx_base_path = base_path; | ||||||
|  |     boost::filesystem::path full_path(boost::filesystem::current_path()); | ||||||
|  |     const boost::filesystem::path p(gpx_base_path); | ||||||
|  |     if (!boost::filesystem::exists(p)) | ||||||
|  |         { | ||||||
|  |             std::string new_folder; | ||||||
|  |             for (auto& folder : boost::filesystem::path(gpx_base_path)) | ||||||
|  |                 { | ||||||
|  |                     new_folder += folder.string(); | ||||||
|  |                     boost::system::error_code ec; | ||||||
|  |                     if (!boost::filesystem::exists(new_folder)) | ||||||
|  |                         { | ||||||
|  |                             if (!boost::filesystem::create_directory(new_folder, ec)) | ||||||
|  |                                 { | ||||||
|  |                                     std::cout << "Could not create the " << new_folder << " folder." << std::endl; | ||||||
|  |                                     gpx_base_path = full_path.string(); | ||||||
|  |                                 } | ||||||
|  |                         } | ||||||
|  |                     new_folder += boost::filesystem::path::preferred_separator; | ||||||
|  |                 } | ||||||
|  |         } | ||||||
|  |     else | ||||||
|  |         { | ||||||
|  |             gpx_base_path = p.string(); | ||||||
|  |         } | ||||||
|  |     if (gpx_base_path.compare(".") != 0) | ||||||
|  |         { | ||||||
|  |             std::cout << "GPX files will be stored at " << gpx_base_path << std::endl; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     gpx_base_path = gpx_base_path + boost::filesystem::path::preferred_separator; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| bool Gpx_Printer::set_headers(std::string filename, bool time_tag_name) | bool Gpx_Printer::set_headers(std::string filename, bool time_tag_name) | ||||||
| { | { | ||||||
|     boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time(); |     boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time(); | ||||||
| @@ -84,6 +126,8 @@ bool Gpx_Printer::set_headers(std::string filename, bool time_tag_name) | |||||||
|         { |         { | ||||||
|             gpx_filename = filename + ".gpx"; |             gpx_filename = filename + ".gpx"; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |     gpx_filename = gpx_base_path + gpx_filename; | ||||||
|     gpx_file.open(gpx_filename.c_str()); |     gpx_file.open(gpx_filename.c_str()); | ||||||
|  |  | ||||||
|     if (gpx_file.is_open()) |     if (gpx_file.is_open()) | ||||||
| @@ -105,6 +149,7 @@ bool Gpx_Printer::set_headers(std::string filename, bool time_tag_name) | |||||||
|         } |         } | ||||||
|     else |     else | ||||||
|         { |         { | ||||||
|  |             std::cout << "File " << gpx_filename << " cannot be saved. Wrong permissions?" << std::endl; | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
| } | } | ||||||
| @@ -171,13 +216,6 @@ bool Gpx_Printer::close_file() | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| Gpx_Printer::Gpx_Printer() |  | ||||||
| { |  | ||||||
|     positions_printed = false; |  | ||||||
|     indent = "  "; |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| Gpx_Printer::~Gpx_Printer() | Gpx_Printer::~Gpx_Printer() | ||||||
| { | { | ||||||
|     close_file(); |     close_file(); | ||||||
|   | |||||||
| @@ -52,9 +52,10 @@ private: | |||||||
|     bool positions_printed; |     bool positions_printed; | ||||||
|     std::string gpx_filename; |     std::string gpx_filename; | ||||||
|     std::string indent; |     std::string indent; | ||||||
|  |     std::string gpx_base_path; | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     Gpx_Printer(); |     Gpx_Printer(const std::string& base_path = "."); | ||||||
|     ~Gpx_Printer(); |     ~Gpx_Printer(); | ||||||
|     bool set_headers(std::string filename, bool time_tag_name = true); |     bool set_headers(std::string filename, bool time_tag_name = true); | ||||||
|     bool print_position(const std::shared_ptr<rtklib_solver>& position, bool print_average_values); |     bool print_position(const std::shared_ptr<rtklib_solver>& position, bool print_average_values); | ||||||
|   | |||||||
| @@ -36,6 +36,7 @@ | |||||||
| #include "galileo_navigation_message.h" | #include "galileo_navigation_message.h" | ||||||
| #include "gps_navigation_message.h" | #include "gps_navigation_message.h" | ||||||
| #include "gps_cnav_navigation_message.h" | #include "gps_cnav_navigation_message.h" | ||||||
|  | #include "galileo_almanac.h" | ||||||
| #include "gnss_synchro.h" | #include "gnss_synchro.h" | ||||||
| #include "rtklib_rtkcmn.h" | #include "rtklib_rtkcmn.h" | ||||||
| #include <fstream> | #include <fstream> | ||||||
|   | |||||||
| @@ -31,11 +31,52 @@ | |||||||
|  |  | ||||||
| #include "kml_printer.h" | #include "kml_printer.h" | ||||||
| #include <boost/date_time/posix_time/posix_time.hpp> | #include <boost/date_time/posix_time/posix_time.hpp> | ||||||
|  | #include <boost/filesystem/operations.hpp>   // for create_directories, exists | ||||||
|  | #include <boost/filesystem/path.hpp>         // for path, operator<< | ||||||
|  | #include <boost/filesystem/path_traits.hpp>  // for filesystem | ||||||
| #include <glog/logging.h> | #include <glog/logging.h> | ||||||
| #include <sstream> | #include <sstream> | ||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Kml_Printer::Kml_Printer(const std::string& base_path) | ||||||
|  | { | ||||||
|  |     positions_printed = false; | ||||||
|  |     kml_base_path = base_path; | ||||||
|  |     boost::filesystem::path full_path(boost::filesystem::current_path()); | ||||||
|  |     const boost::filesystem::path p(kml_base_path); | ||||||
|  |     if (!boost::filesystem::exists(p)) | ||||||
|  |         { | ||||||
|  |             std::string new_folder; | ||||||
|  |             for (auto& folder : boost::filesystem::path(kml_base_path)) | ||||||
|  |                 { | ||||||
|  |                     new_folder += folder.string(); | ||||||
|  |                     boost::system::error_code ec; | ||||||
|  |                     if (!boost::filesystem::exists(new_folder)) | ||||||
|  |                         { | ||||||
|  |                             if (!boost::filesystem::create_directory(new_folder, ec)) | ||||||
|  |                                 { | ||||||
|  |                                     std::cout << "Could not create the " << new_folder << " folder." << std::endl; | ||||||
|  |                                     kml_base_path = full_path.string(); | ||||||
|  |                                 } | ||||||
|  |                         } | ||||||
|  |                     new_folder += boost::filesystem::path::preferred_separator; | ||||||
|  |                 } | ||||||
|  |         } | ||||||
|  |     else | ||||||
|  |         { | ||||||
|  |             kml_base_path = p.string(); | ||||||
|  |         } | ||||||
|  |     if (kml_base_path.compare(".") != 0) | ||||||
|  |         { | ||||||
|  |             std::cout << "KML files will be stored at " << kml_base_path << std::endl; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     kml_base_path = kml_base_path + boost::filesystem::path::preferred_separator; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| bool Kml_Printer::set_headers(std::string filename, bool time_tag_name) | bool Kml_Printer::set_headers(std::string filename, bool time_tag_name) | ||||||
| { | { | ||||||
|     boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time(); |     boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time(); | ||||||
| @@ -83,6 +124,7 @@ bool Kml_Printer::set_headers(std::string filename, bool time_tag_name) | |||||||
|         { |         { | ||||||
|             kml_filename = filename + ".kml"; |             kml_filename = filename + ".kml"; | ||||||
|         } |         } | ||||||
|  |     kml_filename = kml_base_path + kml_filename; | ||||||
|     kml_file.open(kml_filename.c_str()); |     kml_file.open(kml_filename.c_str()); | ||||||
|  |  | ||||||
|     if (kml_file.is_open()) |     if (kml_file.is_open()) | ||||||
| @@ -119,6 +161,7 @@ bool Kml_Printer::set_headers(std::string filename, bool time_tag_name) | |||||||
|         } |         } | ||||||
|     else |     else | ||||||
|         { |         { | ||||||
|  |             std::cout << "File " << kml_filename << " cannot be saved. Wrong permissions?" << std::endl; | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
| } | } | ||||||
| @@ -178,12 +221,6 @@ bool Kml_Printer::close_file() | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| Kml_Printer::Kml_Printer() |  | ||||||
| { |  | ||||||
|     positions_printed = false; |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| Kml_Printer::~Kml_Printer() | Kml_Printer::~Kml_Printer() | ||||||
| { | { | ||||||
|     close_file(); |     close_file(); | ||||||
|   | |||||||
| @@ -50,9 +50,10 @@ private: | |||||||
|     std::ofstream kml_file; |     std::ofstream kml_file; | ||||||
|     bool positions_printed; |     bool positions_printed; | ||||||
|     std::string kml_filename; |     std::string kml_filename; | ||||||
|  |     std::string kml_base_path; | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     Kml_Printer(); |     Kml_Printer(const std::string& base_path = std::string(".")); | ||||||
|     ~Kml_Printer(); |     ~Kml_Printer(); | ||||||
|     bool set_headers(std::string filename, bool time_tag_name = true); |     bool set_headers(std::string filename, bool time_tag_name = true); | ||||||
|     bool print_position(const std::shared_ptr<Pvt_Solution>& position, bool print_average_values); |     bool print_position(const std::shared_ptr<Pvt_Solution>& position, bool print_average_values); | ||||||
|   | |||||||
| @@ -35,6 +35,9 @@ | |||||||
|  |  | ||||||
| #include "nmea_printer.h" | #include "nmea_printer.h" | ||||||
| #include <boost/date_time/posix_time/posix_time.hpp> | #include <boost/date_time/posix_time/posix_time.hpp> | ||||||
|  | #include <boost/filesystem/operations.hpp>   // for create_directories, exists | ||||||
|  | #include <boost/filesystem/path.hpp>         // for path, operator<< | ||||||
|  | #include <boost/filesystem/path_traits.hpp>  // for filesystem | ||||||
| #include <glog/logging.h> | #include <glog/logging.h> | ||||||
| #include <cstdint> | #include <cstdint> | ||||||
| #include <fcntl.h> | #include <fcntl.h> | ||||||
| @@ -44,13 +47,55 @@ | |||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  |  | ||||||
| Nmea_Printer::Nmea_Printer(std::string filename, bool flag_nmea_tty_port, std::string nmea_dump_devname) | Nmea_Printer::Nmea_Printer(std::string filename, bool flag_nmea_output_file, bool flag_nmea_tty_port, std::string nmea_dump_devname, const std::string& base_path) | ||||||
| { | { | ||||||
|     nmea_filename = filename; |     nmea_base_path = base_path; | ||||||
|     nmea_file_descriptor.open(nmea_filename.c_str(), std::ios::out); |     d_flag_nmea_output_file = flag_nmea_output_file; | ||||||
|     if (nmea_file_descriptor.is_open()) |     if (d_flag_nmea_output_file == true) | ||||||
|         { |         { | ||||||
|             DLOG(INFO) << "NMEA printer writing on " << nmea_filename.c_str(); |             boost::filesystem::path full_path(boost::filesystem::current_path()); | ||||||
|  |             const boost::filesystem::path p(nmea_base_path); | ||||||
|  |             if (!boost::filesystem::exists(p)) | ||||||
|  |                 { | ||||||
|  |                     std::string new_folder; | ||||||
|  |                     for (auto& folder : boost::filesystem::path(nmea_base_path)) | ||||||
|  |                         { | ||||||
|  |                             new_folder += folder.string(); | ||||||
|  |                             boost::system::error_code ec; | ||||||
|  |                             if (!boost::filesystem::exists(new_folder)) | ||||||
|  |                                 { | ||||||
|  |                                     if (!boost::filesystem::create_directory(new_folder, ec)) | ||||||
|  |                                         { | ||||||
|  |                                             std::cout << "Could not create the " << new_folder << " folder." << std::endl; | ||||||
|  |                                             nmea_base_path = full_path.string(); | ||||||
|  |                                         } | ||||||
|  |                                 } | ||||||
|  |                             new_folder += boost::filesystem::path::preferred_separator; | ||||||
|  |                         } | ||||||
|  |                 } | ||||||
|  |             else | ||||||
|  |                 { | ||||||
|  |                     nmea_base_path = p.string(); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |             if ((nmea_base_path.compare(".") != 0) and (d_flag_nmea_output_file == true)) | ||||||
|  |                 { | ||||||
|  |                     std::cout << "NMEA files will be stored at " << nmea_base_path << std::endl; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |             nmea_base_path = nmea_base_path + boost::filesystem::path::preferred_separator; | ||||||
|  |  | ||||||
|  |             nmea_filename = nmea_base_path + 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(); | ||||||
|  |                 } | ||||||
|  |             else | ||||||
|  |                 { | ||||||
|  |                     std::cout << "File " << nmea_filename << " cannot be saved. Wrong permissions?" << std::endl; | ||||||
|  |                 } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     nmea_devname = nmea_dump_devname; |     nmea_devname = nmea_dump_devname; | ||||||
| @@ -94,13 +139,13 @@ int Nmea_Printer::init_serial(std::string serial_device) | |||||||
|     int64_t PARITY; |     int64_t PARITY; | ||||||
|  |  | ||||||
|     fd = open(serial_device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); |     fd = open(serial_device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); | ||||||
|     if (fd == -1) return fd;  //failed to open TTY port |     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 |     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 |     tcgetattr(fd, &options);                                                    // read serial port options | ||||||
|  |  | ||||||
|     BAUD = B9600; |     BAUD = B9600; | ||||||
|     //BAUD  =  B38400; |     // BAUD  =  B38400; | ||||||
|     DATABITS = CS8; |     DATABITS = CS8; | ||||||
|     STOPBITS = 0; |     STOPBITS = 0; | ||||||
|     PARITYON = 0; |     PARITYON = 0; | ||||||
| @@ -108,7 +153,7 @@ int Nmea_Printer::init_serial(std::string serial_device) | |||||||
|  |  | ||||||
|     options.c_cflag = BAUD | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD; |     options.c_cflag = BAUD | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD; | ||||||
|     // enable receiver, set 8 bit data, ignore control lines |     // enable receiver, set 8 bit data, ignore control lines | ||||||
|     //options.c_cflag |= (CLOCAL | CREAD | CS8); |     // options.c_cflag |= (CLOCAL | CREAD | CS8); | ||||||
|     options.c_iflag = IGNPAR; |     options.c_iflag = IGNPAR; | ||||||
|  |  | ||||||
|     // set the new port options |     // set the new port options | ||||||
| @@ -139,34 +184,36 @@ bool Nmea_Printer::Print_Nmea_Line(const std::shared_ptr<rtklib_solver>& pvt_dat | |||||||
|  |  | ||||||
|     // generate the NMEA sentences |     // generate the NMEA sentences | ||||||
|  |  | ||||||
|     //GPRMC |     // GPRMC | ||||||
|     GPRMC = get_GPRMC(); |     GPRMC = get_GPRMC(); | ||||||
|     //GPGGA (Global Positioning System Fixed Data) |     // GPGGA (Global Positioning System Fixed Data) | ||||||
|     GPGGA = get_GPGGA(); |     GPGGA = get_GPGGA(); | ||||||
|     //GPGSA |     // GPGSA | ||||||
|     GPGSA = get_GPGSA(); |     GPGSA = get_GPGSA(); | ||||||
|     //GPGSV |     // GPGSV | ||||||
|     GPGSV = get_GPGSV(); |     GPGSV = get_GPGSV(); | ||||||
|  |  | ||||||
|     // write to log file |     // write to log file | ||||||
|     try |     if (d_flag_nmea_output_file) | ||||||
|         { |         { | ||||||
|             //GPRMC |             try | ||||||
|             nmea_file_descriptor << GPRMC; |                 { | ||||||
|             //GPGGA (Global Positioning System Fixed Data) |                     // GPRMC | ||||||
|             nmea_file_descriptor << GPGGA; |                     nmea_file_descriptor << GPRMC; | ||||||
|             //GPGSA |                     // GPGGA (Global Positioning System Fixed Data) | ||||||
|             nmea_file_descriptor << GPGSA; |                     nmea_file_descriptor << GPGGA; | ||||||
|             //GPGSV |                     // GPGSA | ||||||
|             nmea_file_descriptor << GPGSV; |                     nmea_file_descriptor << GPGSA; | ||||||
|         } |                     // GPGSV | ||||||
|     catch (const std::exception& ex) |                     nmea_file_descriptor << GPGSV; | ||||||
|         { |                 } | ||||||
|             DLOG(INFO) << "NMEA printer can not write on output file" << nmea_filename.c_str(); |             catch (const std::exception& ex) | ||||||
|             ; |                 { | ||||||
|  |                     DLOG(INFO) << "NMEA printer can not write on output file" << nmea_filename.c_str(); | ||||||
|  |                 } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     //write to serial device |     // write to serial device | ||||||
|     if (nmea_dev_descriptor != -1) |     if (nmea_dev_descriptor != -1) | ||||||
|         { |         { | ||||||
|             if (write(nmea_dev_descriptor, GPRMC.c_str(), GPRMC.length()) == -1) |             if (write(nmea_dev_descriptor, GPRMC.c_str(), GPRMC.length()) == -1) | ||||||
| @@ -284,7 +331,7 @@ std::string Nmea_Printer::longitude_to_hm(double longitude) | |||||||
|  |  | ||||||
| std::string Nmea_Printer::get_UTC_NMEA_time(boost::posix_time::ptime d_position_UTC_time) | std::string Nmea_Printer::get_UTC_NMEA_time(boost::posix_time::ptime d_position_UTC_time) | ||||||
| { | { | ||||||
|     //UTC Time: hhmmss.sss |     // UTC Time: hhmmss.sss | ||||||
|     std::stringstream sentence_str; |     std::stringstream sentence_str; | ||||||
|  |  | ||||||
|     boost::posix_time::time_duration td = d_position_UTC_time.time_of_day(); |     boost::posix_time::time_duration td = d_position_UTC_time.time_of_day(); | ||||||
| @@ -335,20 +382,19 @@ std::string Nmea_Printer::get_GPRMC() | |||||||
|     double speed_over_ground_knots = 0; |     double speed_over_ground_knots = 0; | ||||||
|     double course_over_ground_deg = 0; |     double course_over_ground_deg = 0; | ||||||
|  |  | ||||||
|     //boost::posix_time::ptime d_position_UTC_time=boost::posix_time::microsec_clock::universal_time(); |     // boost::posix_time::ptime d_position_UTC_time=boost::posix_time::microsec_clock::universal_time(); | ||||||
|  |  | ||||||
|     std::stringstream sentence_str; |     std::stringstream sentence_str; | ||||||
|  |  | ||||||
|     //GPRMC (RMC-Recommended,Minimum Specific GNSS Data) |     // GPRMC (RMC-Recommended,Minimum Specific GNSS Data) | ||||||
|     std::string sentence_header; |     std::string sentence_header; | ||||||
|     sentence_header = "$GPRMC,"; |     sentence_header = "$GPRMC,"; | ||||||
|     sentence_str << sentence_header; |     sentence_str << sentence_header; | ||||||
|  |  | ||||||
|     //UTC Time: hhmmss.sss |     // UTC Time: hhmmss.sss | ||||||
|     sentence_str << get_UTC_NMEA_time(d_PVT_data->get_position_UTC_time()); |     sentence_str << get_UTC_NMEA_time(d_PVT_data->get_position_UTC_time()); | ||||||
|  |  | ||||||
|     //Status: A: data valid, V: data NOT valid |     // Status: A: data valid, V: data NOT valid | ||||||
|  |  | ||||||
|     if (valid_fix == true) |     if (valid_fix == true) | ||||||
|         { |         { | ||||||
|             sentence_str << ",A"; |             sentence_str << ",A"; | ||||||
| @@ -373,13 +419,13 @@ std::string Nmea_Printer::get_GPRMC() | |||||||
|             sentence_str << "," << longitude_to_hm(d_PVT_data->get_longitude()); |             sentence_str << "," << longitude_to_hm(d_PVT_data->get_longitude()); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     //Speed over ground (knots) |     // Speed over ground (knots) | ||||||
|     sentence_str << ","; |     sentence_str << ","; | ||||||
|     sentence_str.setf(std::ios::fixed, std::ios::floatfield); |     sentence_str.setf(std::ios::fixed, std::ios::floatfield); | ||||||
|     sentence_str.precision(2); |     sentence_str.precision(2); | ||||||
|     sentence_str << speed_over_ground_knots; |     sentence_str << speed_over_ground_knots; | ||||||
|  |  | ||||||
|     //course over ground (degrees) |     // course over ground (degrees) | ||||||
|     sentence_str << ","; |     sentence_str << ","; | ||||||
|     sentence_str.setf(std::ios::fixed, std::ios::floatfield); |     sentence_str.setf(std::ios::fixed, std::ios::floatfield); | ||||||
|     sentence_str.precision(2); |     sentence_str.precision(2); | ||||||
| @@ -403,11 +449,11 @@ std::string Nmea_Printer::get_GPRMC() | |||||||
|     year_strs << std::dec << year; |     year_strs << std::dec << year; | ||||||
|     sentence_str << std::dec << year_strs.str().substr(2); |     sentence_str << std::dec << year_strs.str().substr(2); | ||||||
|  |  | ||||||
|     //Magnetic Variation (degrees) |     // Magnetic Variation (degrees) | ||||||
|     // ToDo: Implement magnetic compass |     // ToDo: Implement magnetic compass | ||||||
|     sentence_str << ","; |     sentence_str << ","; | ||||||
|  |  | ||||||
|     //Magnetic Variation (E or W) |     // Magnetic Variation (E or W) | ||||||
|     // ToDo: Implement magnetic compass |     // ToDo: Implement magnetic compass | ||||||
|     sentence_str << ","; |     sentence_str << ","; | ||||||
|  |  | ||||||
| @@ -429,7 +475,7 @@ std::string Nmea_Printer::get_GPRMC() | |||||||
|  |  | ||||||
| std::string Nmea_Printer::get_GPGSA() | std::string Nmea_Printer::get_GPGSA() | ||||||
| { | { | ||||||
|     //$GPGSA,A,3,07,02,26,27,09,04,15, , , , , ,1.8,1.0,1.5*33 |     // $GPGSA,A,3,07,02,26,27,09,04,15, , , , , ,1.8,1.0,1.5*33 | ||||||
|     // GSA-GNSS DOP and Active Satellites |     // GSA-GNSS DOP and Active Satellites | ||||||
|     bool valid_fix = d_PVT_data->is_valid_position(); |     bool valid_fix = d_PVT_data->is_valid_position(); | ||||||
|     int n_sats_used = d_PVT_data->get_num_valid_observations(); |     int n_sats_used = d_PVT_data->get_num_valid_observations(); | ||||||
| @@ -480,14 +526,14 @@ std::string Nmea_Printer::get_GPGSA() | |||||||
|     sentence_str.precision(1); |     sentence_str.precision(1); | ||||||
|     sentence_str.fill('0'); |     sentence_str.fill('0'); | ||||||
|     sentence_str << pdop; |     sentence_str << pdop; | ||||||
|     //HDOP |     // HDOP | ||||||
|     sentence_str << ","; |     sentence_str << ","; | ||||||
|     sentence_str.setf(std::ios::fixed, std::ios::floatfield); |     sentence_str.setf(std::ios::fixed, std::ios::floatfield); | ||||||
|     sentence_str.width(2); |     sentence_str.width(2); | ||||||
|     sentence_str.precision(1); |     sentence_str.precision(1); | ||||||
|     sentence_str.fill('0'); |     sentence_str.fill('0'); | ||||||
|     sentence_str << hdop; |     sentence_str << hdop; | ||||||
|     //VDOP |     // VDOP | ||||||
|     sentence_str << ","; |     sentence_str << ","; | ||||||
|     sentence_str.setf(std::ios::fixed, std::ios::floatfield); |     sentence_str.setf(std::ios::fixed, std::ios::floatfield); | ||||||
|     sentence_str.width(2); |     sentence_str.width(2); | ||||||
| @@ -548,7 +594,7 @@ std::string Nmea_Printer::get_GPGSV() | |||||||
|             frame_str.fill('0'); |             frame_str.fill('0'); | ||||||
|             frame_str << std::dec << n_sats_used; |             frame_str << std::dec << n_sats_used; | ||||||
|  |  | ||||||
|             //satellites info |             // satellites info | ||||||
|             for (int j = 0; j < 4; j++) |             for (int j = 0; j < 4; j++) | ||||||
|                 { |                 { | ||||||
|                     // write satellite info |                     // write satellite info | ||||||
| @@ -595,13 +641,13 @@ std::string Nmea_Printer::get_GPGSV() | |||||||
|             sentence_str << frame_str.str(); |             sentence_str << frame_str.str(); | ||||||
|         } |         } | ||||||
|     return sentence_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 |     // $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() | std::string Nmea_Printer::get_GPGGA() | ||||||
| { | { | ||||||
|     //boost::posix_time::ptime d_position_UTC_time=boost::posix_time::microsec_clock::universal_time(); |     // boost::posix_time::ptime d_position_UTC_time=boost::posix_time::microsec_clock::universal_time(); | ||||||
|     bool valid_fix = d_PVT_data->is_valid_position(); |     bool valid_fix = d_PVT_data->is_valid_position(); | ||||||
|     int n_channels = d_PVT_data->get_num_valid_observations();  //d_nchannels |     int n_channels = d_PVT_data->get_num_valid_observations();  //d_nchannels | ||||||
|     double hdop = d_PVT_data->get_hdop(); |     double hdop = d_PVT_data->get_hdop(); | ||||||
| @@ -618,12 +664,12 @@ std::string Nmea_Printer::get_GPGGA() | |||||||
|  |  | ||||||
|     std::stringstream sentence_str; |     std::stringstream sentence_str; | ||||||
|  |  | ||||||
|     //GPGGA (Global Positioning System Fixed Data) |     // GPGGA (Global Positioning System Fixed Data) | ||||||
|     std::string sentence_header; |     std::string sentence_header; | ||||||
|     sentence_header = "$GPGGA,"; |     sentence_header = "$GPGGA,"; | ||||||
|     sentence_str << sentence_header; |     sentence_str << sentence_header; | ||||||
|  |  | ||||||
|     //UTC Time: hhmmss.sss |     // UTC Time: hhmmss.sss | ||||||
|     sentence_str << get_UTC_NMEA_time(d_PVT_data->get_position_UTC_time()); |     sentence_str << get_UTC_NMEA_time(d_PVT_data->get_position_UTC_time()); | ||||||
|  |  | ||||||
|     if (d_PVT_data->is_averaging() == true) |     if (d_PVT_data->is_averaging() == true) | ||||||
| @@ -708,5 +754,5 @@ std::string Nmea_Printer::get_GPGGA() | |||||||
|     // end NMEA sentence |     // end NMEA sentence | ||||||
|     sentence_str << "\r\n"; |     sentence_str << "\r\n"; | ||||||
|     return sentence_str.str(); |     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 |     // $GPGGA,104427.591,5920.7009,N,01803.2938,E,1,05,3.3,78.2,M,23.2,M,0.0,0000*4A | ||||||
| } | } | ||||||
|   | |||||||
| @@ -53,7 +53,7 @@ public: | |||||||
|     /*! |     /*! | ||||||
|      * \brief Default constructor. |      * \brief Default constructor. | ||||||
|      */ |      */ | ||||||
|     Nmea_Printer(std::string filename, bool flag_nmea_tty_port, std::string nmea_dump_filename); |     Nmea_Printer(std::string filename, bool flag_nmea_output_file, bool flag_nmea_tty_port, std::string nmea_dump_filename, const std::string& base_path = "."); | ||||||
|  |  | ||||||
|     /*! |     /*! | ||||||
|      * \brief Print NMEA PVT and satellite info to the initialized device |      * \brief Print NMEA PVT and satellite info to the initialized device | ||||||
| @@ -66,7 +66,8 @@ public: | |||||||
|     ~Nmea_Printer(); |     ~Nmea_Printer(); | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     std::string nmea_filename;           // String with the NMEA log filename |     std::string nmea_filename;  // String with the NMEA log filename | ||||||
|  |     std::string nmea_base_path; | ||||||
|     std::ofstream nmea_file_descriptor;  // Output file stream for NMEA log file |     std::ofstream nmea_file_descriptor;  // Output file stream for NMEA log file | ||||||
|     std::string nmea_devname; |     std::string nmea_devname; | ||||||
|     int nmea_dev_descriptor;  // NMEA serial device descriptor (i.e. COM port) |     int nmea_dev_descriptor;  // NMEA serial device descriptor (i.e. COM port) | ||||||
| @@ -82,6 +83,7 @@ private: | |||||||
|     std::string latitude_to_hm(double lat); |     std::string latitude_to_hm(double lat); | ||||||
|     char checkSum(std::string sentence); |     char checkSum(std::string sentence); | ||||||
|     bool print_avg_pos; |     bool print_avg_pos; | ||||||
|  |     bool d_flag_nmea_output_file; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
							
								
								
									
										70
									
								
								src/algorithms/PVT/libs/pvt_conf.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								src/algorithms/PVT/libs/pvt_conf.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | |||||||
|  | /*! | ||||||
|  |  * \file pvt_conf.cc | ||||||
|  |  * \brief Class that contains all the configuration parameters for a PVT block | ||||||
|  |  * \author Carles Fernandez, 2018. cfernandez(at)cttc.es | ||||||
|  |  * | ||||||
|  |  * ------------------------------------------------------------------------- | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2010-2018  (see AUTHORS file for a list of contributors) | ||||||
|  |  * | ||||||
|  |  * GNSS-SDR is a software defined Global Navigation | ||||||
|  |  *          Satellite Systems receiver | ||||||
|  |  * | ||||||
|  |  * This file is part of GNSS-SDR. | ||||||
|  |  * | ||||||
|  |  * GNSS-SDR is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * GNSS-SDR is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with GNSS-SDR. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  * | ||||||
|  |  * ------------------------------------------------------------------------- | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "pvt_conf.h" | ||||||
|  |  | ||||||
|  | Pvt_Conf::Pvt_Conf() | ||||||
|  | { | ||||||
|  |     type_of_receiver = 0U; | ||||||
|  |     output_rate_ms = 0; | ||||||
|  |     display_rate_ms = 0; | ||||||
|  |  | ||||||
|  |     rinex_version = 0; | ||||||
|  |     rinexobs_rate_ms = 0; | ||||||
|  |     rinexnav_rate_ms = 0; | ||||||
|  |  | ||||||
|  |     dump = false; | ||||||
|  |     dump_mat = true; | ||||||
|  |  | ||||||
|  |     flag_nmea_tty_port = false; | ||||||
|  |  | ||||||
|  |     flag_rtcm_server = false; | ||||||
|  |     flag_rtcm_tty_port = false; | ||||||
|  |     rtcm_tcp_port = 0U; | ||||||
|  |     rtcm_station_id = 0U; | ||||||
|  |  | ||||||
|  |     output_enabled = true; | ||||||
|  |     rinex_output_enabled = true; | ||||||
|  |     gpx_output_enabled = true; | ||||||
|  |     geojson_output_enabled = true; | ||||||
|  |     nmea_output_file_enabled = true; | ||||||
|  |     kml_output_enabled = true; | ||||||
|  |     xml_output_enabled = true; | ||||||
|  |     rtcm_output_file_enabled = true; | ||||||
|  |  | ||||||
|  |     output_path = std::string("."); | ||||||
|  |     rinex_output_path = std::string("."); | ||||||
|  |     gpx_output_path = std::string("."); | ||||||
|  |     geojson_output_path = std::string("."); | ||||||
|  |     nmea_output_file_path = std::string("."); | ||||||
|  |     kml_output_path = std::string("."); | ||||||
|  |     xml_output_path = std::string("."); | ||||||
|  |     rtcm_output_file_path = std::string("."); | ||||||
|  | } | ||||||
							
								
								
									
										86
									
								
								src/algorithms/PVT/libs/pvt_conf.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								src/algorithms/PVT/libs/pvt_conf.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | |||||||
|  | /*! | ||||||
|  |  * \file pvt_conf.h | ||||||
|  |  * \brief Class that contains all the configuration parameters for the PVT block | ||||||
|  |  * \author Carles Fernandez, 2018. cfernandez(at)cttc.es | ||||||
|  |  * | ||||||
|  |  * ------------------------------------------------------------------------- | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2010-2018  (see AUTHORS file for a list of contributors) | ||||||
|  |  * | ||||||
|  |  * GNSS-SDR is a software defined Global Navigation | ||||||
|  |  *          Satellite Systems receiver | ||||||
|  |  * | ||||||
|  |  * This file is part of GNSS-SDR. | ||||||
|  |  * | ||||||
|  |  * GNSS-SDR is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * GNSS-SDR is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with GNSS-SDR. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  * | ||||||
|  |  * ------------------------------------------------------------------------- | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef GNSS_SDR_PVT_CONF_H_ | ||||||
|  | #define GNSS_SDR_PVT_CONF_H_ | ||||||
|  |  | ||||||
|  | #include <cstddef> | ||||||
|  | #include <cstdint> | ||||||
|  | #include <string> | ||||||
|  | #include <map> | ||||||
|  |  | ||||||
|  | class Pvt_Conf | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     uint32_t type_of_receiver; | ||||||
|  |     int32_t output_rate_ms; | ||||||
|  |     int32_t display_rate_ms; | ||||||
|  |  | ||||||
|  |     int32_t rinex_version; | ||||||
|  |     int32_t rinexobs_rate_ms; | ||||||
|  |     int32_t rinexnav_rate_ms; | ||||||
|  |     std::map<int, int> rtcm_msg_rate_ms; | ||||||
|  |  | ||||||
|  |     bool dump; | ||||||
|  |     bool dump_mat; | ||||||
|  |     std::string dump_filename; | ||||||
|  |  | ||||||
|  |     bool flag_nmea_tty_port; | ||||||
|  |     std::string nmea_dump_filename; | ||||||
|  |     std::string nmea_dump_devname; | ||||||
|  |  | ||||||
|  |     bool flag_rtcm_server; | ||||||
|  |     bool flag_rtcm_tty_port; | ||||||
|  |     uint16_t rtcm_tcp_port; | ||||||
|  |     uint16_t rtcm_station_id; | ||||||
|  |     std::string rtcm_dump_devname; | ||||||
|  |  | ||||||
|  |     bool output_enabled; | ||||||
|  |     bool rinex_output_enabled; | ||||||
|  |     bool gpx_output_enabled; | ||||||
|  |     bool geojson_output_enabled; | ||||||
|  |     bool nmea_output_file_enabled; | ||||||
|  |     bool kml_output_enabled; | ||||||
|  |     bool xml_output_enabled; | ||||||
|  |     bool rtcm_output_file_enabled; | ||||||
|  |  | ||||||
|  |     std::string output_path; | ||||||
|  |     std::string rinex_output_path; | ||||||
|  |     std::string gpx_output_path; | ||||||
|  |     std::string geojson_output_path; | ||||||
|  |     std::string nmea_output_file_path; | ||||||
|  |     std::string kml_output_path; | ||||||
|  |     std::string xml_output_path; | ||||||
|  |     std::string rtcm_output_file_path; | ||||||
|  |  | ||||||
|  |     Pvt_Conf(); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #endif | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -77,12 +77,12 @@ class Rinex_Printer | |||||||
| { | { | ||||||
| public: | public: | ||||||
|     /*! |     /*! | ||||||
|      * \brief Default constructor. Creates GPS Navigation and Observables RINEX files and their headers |      * \brief Default constructor. Creates GNSS Navigation and Observables RINEX files and their headers | ||||||
|      */ |      */ | ||||||
|     Rinex_Printer(int version = 0); |     Rinex_Printer(int version = 0, const std::string& base_path = "."); | ||||||
|  |  | ||||||
|     /*! |     /*! | ||||||
|      * \brief Default destructor. Closes GPS Navigation and Observables RINEX files |      * \brief Default destructor. Closes GNSS Navigation and Observables RINEX files | ||||||
|      */ |      */ | ||||||
|     ~Rinex_Printer(); |     ~Rinex_Printer(); | ||||||
|  |  | ||||||
| @@ -106,12 +106,17 @@ public: | |||||||
|     /*! |     /*! | ||||||
|      *  \brief Generates the Galileo Navigation Data header |      *  \brief Generates the Galileo Navigation Data header | ||||||
|      */ |      */ | ||||||
|     void rinex_nav_header(std::fstream& out, const Galileo_Iono& iono, const Galileo_Utc_Model& utc_model, const Galileo_Almanac& galileo_almanac); |     void rinex_nav_header(std::fstream& out, const Galileo_Iono& iono, const Galileo_Utc_Model& utc_model); | ||||||
|  |  | ||||||
|     /*! |     /*! | ||||||
|      *  \brief Generates the Mixed (GPS/Galileo) Navigation Data header |      *  \brief Generates the Mixed (GPS/Galileo) Navigation Data header | ||||||
|      */ |      */ | ||||||
|     void 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); |     void 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); | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      *  \brief Generates the Mixed (GPS CNAV/Galileo) Navigation Data header | ||||||
|  |      */ | ||||||
|  |     void rinex_nav_header(std::fstream& out, const Gps_CNAV_Iono& iono, const Gps_CNAV_Utc_Model& utc_model, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& galileo_utc_model); | ||||||
|  |  | ||||||
|     /*! |     /*! | ||||||
|      *  \brief Generates the GLONASS L1, L2 C/A Navigation Data header |      *  \brief Generates the GLONASS L1, L2 C/A Navigation Data header | ||||||
| @@ -121,7 +126,7 @@ public: | |||||||
|     /*! |     /*! | ||||||
|      *  \brief Generates the Mixed (Galileo/GLONASS) Navigation Data header |      *  \brief Generates the Mixed (Galileo/GLONASS) Navigation Data header | ||||||
|      */ |      */ | ||||||
|     void rinex_nav_header(std::fstream& out, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& galileo_utc_model, const Galileo_Almanac& galileo_almanac, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac); |     void rinex_nav_header(std::fstream& out, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& galileo_utc_model, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac); | ||||||
|  |  | ||||||
|     /*! |     /*! | ||||||
|      *  \brief Generates the Mixed (GPS L1 C/A/GLONASS L1, L2) Navigation Data header |      *  \brief Generates the Mixed (GPS L1 C/A/GLONASS L1, L2) Navigation Data header | ||||||
| @@ -129,8 +134,8 @@ public: | |||||||
|     void rinex_nav_header(std::fstream& out, const Gps_Iono& gps_iono, const Gps_Utc_Model& gps_utc_model, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac); |     void rinex_nav_header(std::fstream& out, const Gps_Iono& gps_iono, const Gps_Utc_Model& gps_utc_model, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac); | ||||||
|  |  | ||||||
|     /*! |     /*! | ||||||
|     *  \brief Generates the Mixed (GPS L2C C/A/GLONASS L1, L2) Navigation Data header |      *  \brief Generates the Mixed (GPS L2C C/A/GLONASS L1, L2) Navigation Data header | ||||||
|     */ |      */ | ||||||
|     void rinex_nav_header(std::fstream& out, const Gps_CNAV_Iono& gps_iono, const Gps_CNAV_Utc_Model& gps_utc_model, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac); |     void rinex_nav_header(std::fstream& out, const Gps_CNAV_Iono& gps_iono, const Gps_CNAV_Utc_Model& gps_utc_model, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac); | ||||||
|  |  | ||||||
|     /*! |     /*! | ||||||
| @@ -141,12 +146,12 @@ public: | |||||||
|     /*! |     /*! | ||||||
|      *  \brief Generates the GPS L2 Observation data header |      *  \brief Generates the GPS L2 Observation data header | ||||||
|      */ |      */ | ||||||
|     void rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris& eph, const double d_TOW_first_observation); |     void rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris& eph, const double d_TOW_first_observation, const std::string gps_bands = "2S"); | ||||||
|  |  | ||||||
|     /*! |     /*! | ||||||
|      *  \brief Generates the dual frequency GPS L1 & L2 Observation data header |      *  \brief Generates the dual frequency GPS L1 & L2/L5 Observation data header | ||||||
|      */ |      */ | ||||||
|     void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph, const Gps_CNAV_Ephemeris& eph_cnav, const double d_TOW_first_observation); |     void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph, const Gps_CNAV_Ephemeris& eph_cnav, const double d_TOW_first_observation, const std::string gps_bands = "1C 2S"); | ||||||
|  |  | ||||||
|     /*! |     /*! | ||||||
|      *  \brief Generates the Galileo Observation data header. Example: bands("1B"), bands("1B 5X"), bands("5X"), ... Default: "1B". |      *  \brief Generates the Galileo Observation data header. Example: bands("1B"), bands("1B 5X"), bands("5X"), ... Default: "1B". | ||||||
| @@ -158,6 +163,16 @@ public: | |||||||
|      */ |      */ | ||||||
|     void 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 = "1B"); |     void 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 = "1B"); | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      *  \brief Generates the Mixed (GPS/Galileo) Observation data header. Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". | ||||||
|  |      */ | ||||||
|  |     void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps_eph, const Gps_CNAV_Ephemeris& eph_cnav, const Galileo_Ephemeris& galileo_eph, const double d_TOW_first_observation, const std::string gps_bands = "1C 2S", const std::string galileo_bands = "1B"); | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      *  \brief Generates the Mixed (GPS/Galileo) Observation data header. Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". | ||||||
|  |      */ | ||||||
|  |     void rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris& eph_cnav, const Galileo_Ephemeris& galileo_eph, const double d_TOW_first_observation, const std::string gps_bands = "2S", const std::string galileo_bands = "1B"); | ||||||
|  |  | ||||||
|     /*! |     /*! | ||||||
|      *  \brief Generates the GLONASS GNAV Observation data header. Example: bands("1C"), bands("1C 2C"), bands("2C"), ... Default: "1C". |      *  \brief Generates the GLONASS GNAV Observation data header. Example: bands("1C"), bands("1C 2C"), bands("2C"), ... Default: "1C". | ||||||
|      */ |      */ | ||||||
| @@ -239,6 +254,11 @@ public: | |||||||
|      */ |      */ | ||||||
|     void log_rinex_nav(std::fstream& out, const std::map<int32_t, Gps_Ephemeris>& gps_eph_map, const std::map<int32_t, Galileo_Ephemeris>& galileo_eph_map); |     void log_rinex_nav(std::fstream& out, const std::map<int32_t, Gps_Ephemeris>& gps_eph_map, const std::map<int32_t, Galileo_Ephemeris>& galileo_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<int32_t, Gps_CNAV_Ephemeris>& gps_cnav_eph_map, const std::map<int32_t, Galileo_Ephemeris>& galileo_eph_map); | ||||||
|  |  | ||||||
|     /*! |     /*! | ||||||
|      *  \brief Writes data from the GLONASS GNAV navigation message into the RINEX file |      *  \brief Writes data from the GLONASS GNAV navigation message into the RINEX file | ||||||
|      */ |      */ | ||||||
| @@ -284,6 +304,16 @@ public: | |||||||
|      */ |      */ | ||||||
|     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<int32_t, Gnss_Synchro>& observables); |     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<int32_t, Gnss_Synchro>& observables); | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      *  \brief Writes Mixed GPS / Galileo observables into the RINEX file | ||||||
|  |      */ | ||||||
|  |     void log_rinex_obs(std::fstream& out, const Gps_CNAV_Ephemeris& eph, const Galileo_Ephemeris& galileo_eph, double gps_obs_time, const std::map<int32_t, Gnss_Synchro>& observables); | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      *  \brief Writes Mixed GPS / Galileo observables into the RINEX file | ||||||
|  |      */ | ||||||
|  |     void log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_eph, const Gps_CNAV_Ephemeris& gps_cnav_eph, const Galileo_Ephemeris& galileo_eph, double gps_obs_time, const std::map<int32_t, Gnss_Synchro>& observables); | ||||||
|  |  | ||||||
|     /*! |     /*! | ||||||
|      *  \brief Writes GLONASS GNAV observables into the RINEX file. Example: glonass_bands("1C"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". |      *  \brief Writes GLONASS GNAV observables into the RINEX file. Example: glonass_bands("1C"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". | ||||||
|      */ |      */ | ||||||
| @@ -318,9 +348,11 @@ public: | |||||||
|  |  | ||||||
|     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_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 Gps_Iono& gps_iono, const Gps_Utc_Model& gps_utc_model, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& galileo_utc_model); | ||||||
|  |  | ||||||
|     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_nav_header(std::fstream& out, const Gps_CNAV_Utc_Model& utc_model, const Gps_CNAV_Iono& iono, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& galileo_utc_model); | ||||||
|  |  | ||||||
|  |     void update_nav_header(std::fstream& out, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& utc_model); | ||||||
|  |  | ||||||
|     void update_nav_header(std::fstream& out, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac); |     void update_nav_header(std::fstream& out, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac); | ||||||
|  |  | ||||||
| @@ -328,7 +360,7 @@ public: | |||||||
|  |  | ||||||
|     void update_nav_header(std::fstream& out, const Gps_CNAV_Iono& gps_cnav_iono, const Gps_CNAV_Utc_Model& gps_cnav_utc, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac); |     void update_nav_header(std::fstream& out, const Gps_CNAV_Iono& gps_cnav_iono, const Gps_CNAV_Utc_Model& gps_cnav_utc, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac); | ||||||
|  |  | ||||||
|     void update_nav_header(std::fstream& out, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& galileo_utc_model, const Galileo_Almanac& galileo_almanac, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac); |     void update_nav_header(std::fstream& out, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& galileo_utc_model, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model, const Glonass_Gnav_Almanac& glonass_gnav_almanac); | ||||||
|  |  | ||||||
|     void update_obs_header(std::fstream& out, const Gps_Utc_Model& utc_model); |     void update_obs_header(std::fstream& out, const Gps_Utc_Model& utc_model); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -33,6 +33,9 @@ | |||||||
|  |  | ||||||
| #include "rtcm_printer.h" | #include "rtcm_printer.h" | ||||||
| #include <boost/date_time/posix_time/posix_time.hpp> | #include <boost/date_time/posix_time/posix_time.hpp> | ||||||
|  | #include <boost/filesystem/operations.hpp>   // for create_directories, exists | ||||||
|  | #include <boost/filesystem/path.hpp>         // for path, operator<< | ||||||
|  | #include <boost/filesystem/path_traits.hpp>  // for filesystem | ||||||
| #include <glog/logging.h> | #include <glog/logging.h> | ||||||
| #include <iomanip> | #include <iomanip> | ||||||
| #include <fcntl.h>    // for O_RDWR | #include <fcntl.h>    // for O_RDWR | ||||||
| @@ -42,10 +45,45 @@ | |||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  |  | ||||||
| Rtcm_Printer::Rtcm_Printer(std::string filename, bool flag_rtcm_server, bool flag_rtcm_tty_port, uint16_t rtcm_tcp_port, uint16_t rtcm_station_id, std::string rtcm_dump_devname, bool time_tag_name) | Rtcm_Printer::Rtcm_Printer(std::string filename, bool flag_rtcm_file_dump, bool flag_rtcm_server, bool flag_rtcm_tty_port, uint16_t rtcm_tcp_port, uint16_t rtcm_station_id, std::string rtcm_dump_devname, bool time_tag_name, const std::string& base_path) | ||||||
| { | { | ||||||
|     boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time(); |     boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time(); | ||||||
|     tm timeinfo = boost::posix_time::to_tm(pt); |     tm timeinfo = boost::posix_time::to_tm(pt); | ||||||
|  |     d_rtcm_file_dump = flag_rtcm_file_dump; | ||||||
|  |     rtcm_base_path = base_path; | ||||||
|  |     if (d_rtcm_file_dump) | ||||||
|  |         { | ||||||
|  |             boost::filesystem::path full_path(boost::filesystem::current_path()); | ||||||
|  |             const boost::filesystem::path p(rtcm_base_path); | ||||||
|  |             if (!boost::filesystem::exists(p)) | ||||||
|  |                 { | ||||||
|  |                     std::string new_folder; | ||||||
|  |                     for (auto& folder : boost::filesystem::path(rtcm_base_path)) | ||||||
|  |                         { | ||||||
|  |                             new_folder += folder.string(); | ||||||
|  |                             boost::system::error_code ec; | ||||||
|  |                             if (!boost::filesystem::exists(new_folder)) | ||||||
|  |                                 { | ||||||
|  |                                     if (!boost::filesystem::create_directory(new_folder, ec)) | ||||||
|  |                                         { | ||||||
|  |                                             std::cout << "Could not create the " << new_folder << " folder." << std::endl; | ||||||
|  |                                             rtcm_base_path = full_path.string(); | ||||||
|  |                                         } | ||||||
|  |                                 } | ||||||
|  |                             new_folder += boost::filesystem::path::preferred_separator; | ||||||
|  |                         } | ||||||
|  |                 } | ||||||
|  |             else | ||||||
|  |                 { | ||||||
|  |                     rtcm_base_path = p.string(); | ||||||
|  |                 } | ||||||
|  |             if (rtcm_base_path.compare(".") != 0) | ||||||
|  |                 { | ||||||
|  |                     std::cout << "RTCM binary file will be stored at " << rtcm_base_path << std::endl; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |             rtcm_base_path = rtcm_base_path + boost::filesystem::path::preferred_separator; | ||||||
|  |         } | ||||||
|  |  | ||||||
|     if (time_tag_name) |     if (time_tag_name) | ||||||
|         { |         { | ||||||
| @@ -89,11 +127,18 @@ Rtcm_Printer::Rtcm_Printer(std::string filename, bool flag_rtcm_server, bool fla | |||||||
|         { |         { | ||||||
|             rtcm_filename = filename + ".rtcm"; |             rtcm_filename = filename + ".rtcm"; | ||||||
|         } |         } | ||||||
|  |     rtcm_filename = rtcm_base_path + rtcm_filename; | ||||||
|     rtcm_file_descriptor.open(rtcm_filename.c_str(), std::ios::out); |     if (d_rtcm_file_dump) | ||||||
|     if (rtcm_file_descriptor.is_open()) |  | ||||||
|         { |         { | ||||||
|             DLOG(INFO) << "RTCM printer writing on " << rtcm_filename.c_str(); |             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(); | ||||||
|  |                 } | ||||||
|  |             else | ||||||
|  |                 { | ||||||
|  |                     std::cout << "File " << rtcm_filename << "cannot be saved. Wrong permissions?" << std::endl; | ||||||
|  |                 } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     rtcm_devname = rtcm_dump_devname; |     rtcm_devname = rtcm_dump_devname; | ||||||
| @@ -341,14 +386,17 @@ void Rtcm_Printer::close_serial() | |||||||
| bool Rtcm_Printer::Print_Message(const std::string& message) | bool Rtcm_Printer::Print_Message(const std::string& message) | ||||||
| { | { | ||||||
|     //write to file |     //write to file | ||||||
|     try |     if (d_rtcm_file_dump) | ||||||
|         { |         { | ||||||
|             rtcm_file_descriptor << message << std::endl; |             try | ||||||
|         } |                 { | ||||||
|     catch (const std::exception& ex) |                     rtcm_file_descriptor << message << std::endl; | ||||||
|         { |                 } | ||||||
|             DLOG(INFO) << "RTCM printer cannot write on the output file " << rtcm_filename.c_str(); |             catch (const std::exception& ex) | ||||||
|             return false; |                 { | ||||||
|  |                     DLOG(INFO) << "RTCM printer cannot write on the output file " << rtcm_filename.c_str(); | ||||||
|  |                     return false; | ||||||
|  |                 } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     //write to serial device |     //write to serial device | ||||||
|   | |||||||
| @@ -48,7 +48,7 @@ public: | |||||||
|     /*! |     /*! | ||||||
|      * \brief Default constructor. |      * \brief Default constructor. | ||||||
|      */ |      */ | ||||||
|     Rtcm_Printer(std::string filename, bool flag_rtcm_server, bool flag_rtcm_tty_port, uint16_t rtcm_tcp_port, uint16_t rtcm_station_id, std::string rtcm_dump_filename, bool time_tag_name = true); |     Rtcm_Printer(std::string filename, bool flag_rtcm_file_dump, bool flag_rtcm_server, bool flag_rtcm_tty_port, uint16_t rtcm_tcp_port, uint16_t rtcm_station_id, std::string rtcm_dump_filename, bool time_tag_name = true, const std::string& base_path = "."); | ||||||
|  |  | ||||||
|     /*! |     /*! | ||||||
|      * \brief Default destructor. |      * \brief Default destructor. | ||||||
| @@ -142,7 +142,8 @@ public: | |||||||
|     uint32_t lock_time(const Glonass_Gnav_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro); |     uint32_t lock_time(const Glonass_Gnav_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro); | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     std::string rtcm_filename;           // String with the RTCM log filename |     std::string rtcm_filename;  // String with the RTCM log filename | ||||||
|  |     std::string rtcm_base_path; | ||||||
|     std::ofstream rtcm_file_descriptor;  // Output file stream for RTCM log file |     std::ofstream rtcm_file_descriptor;  // Output file stream for RTCM log file | ||||||
|     std::string rtcm_devname; |     std::string rtcm_devname; | ||||||
|     uint16_t port; |     uint16_t port; | ||||||
| @@ -152,6 +153,7 @@ private: | |||||||
|     void close_serial(); |     void close_serial(); | ||||||
|     std::shared_ptr<Rtcm> rtcm; |     std::shared_ptr<Rtcm> rtcm; | ||||||
|     bool Print_Message(const std::string& message); |     bool Print_Message(const std::string& message); | ||||||
|  |     bool d_rtcm_file_dump; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -56,17 +56,19 @@ | |||||||
| #include "GPS_L1_CA.h" | #include "GPS_L1_CA.h" | ||||||
| #include "Galileo_E1.h" | #include "Galileo_E1.h" | ||||||
| #include "GLONASS_L1_L2_CA.h" | #include "GLONASS_L1_L2_CA.h" | ||||||
|  | #include <matio.h> | ||||||
| #include <glog/logging.h> | #include <glog/logging.h> | ||||||
|  |  | ||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
| rtklib_solver::rtklib_solver(int nchannels, std::string dump_filename, bool flag_dump_to_file, rtk_t& rtk) | rtklib_solver::rtklib_solver(int nchannels, std::string dump_filename, bool flag_dump_to_file, bool flag_dump_to_mat, rtk_t &rtk) | ||||||
| { | { | ||||||
|     // init empty ephemeris for all the available GNSS channels |     // init empty ephemeris for all the available GNSS channels | ||||||
|     d_nchannels = nchannels; |     d_nchannels = nchannels; | ||||||
|     d_dump_filename = dump_filename; |     d_dump_filename = dump_filename; | ||||||
|     d_flag_dump_enabled = flag_dump_to_file; |     d_flag_dump_enabled = flag_dump_to_file; | ||||||
|  |     d_flag_dump_mat_enabled = flag_dump_to_mat; | ||||||
|     count_valid_position = 0; |     count_valid_position = 0; | ||||||
|     this->set_averaging_flag(false); |     this->set_averaging_flag(false); | ||||||
|     rtk_ = rtk; |     rtk_ = rtk; | ||||||
| @@ -84,7 +86,7 @@ rtklib_solver::rtklib_solver(int nchannels, std::string dump_filename, bool flag | |||||||
|                             d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); |                             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(); |                             LOG(INFO) << "PVT lib dump enabled Log file: " << d_dump_filename.c_str(); | ||||||
|                         } |                         } | ||||||
|                     catch (const std::ifstream::failure& e) |                     catch (const std::ifstream::failure &e) | ||||||
|                         { |                         { | ||||||
|                             LOG(WARNING) << "Exception opening RTKLIB dump file " << e.what(); |                             LOG(WARNING) << "Exception opening RTKLIB dump file " << e.what(); | ||||||
|                         } |                         } | ||||||
| @@ -92,6 +94,301 @@ rtklib_solver::rtklib_solver(int nchannels, std::string dump_filename, bool flag | |||||||
|         } |         } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | bool rtklib_solver::save_matfile() | ||||||
|  | { | ||||||
|  |     // READ DUMP FILE | ||||||
|  |     std::string dump_filename = d_dump_filename; | ||||||
|  |     std::ifstream::pos_type size; | ||||||
|  |     int32_t number_of_double_vars = 21; | ||||||
|  |     int32_t number_of_uint32_vars = 2; | ||||||
|  |     int32_t number_of_uint8_vars = 3; | ||||||
|  |     int32_t number_of_float_vars = 2; | ||||||
|  |     int32_t epoch_size_bytes = sizeof(double) * number_of_double_vars + | ||||||
|  |                                sizeof(uint32_t) * number_of_uint32_vars + | ||||||
|  |                                sizeof(uint8_t) * number_of_uint8_vars + | ||||||
|  |                                sizeof(float) * number_of_float_vars; | ||||||
|  |     std::ifstream dump_file; | ||||||
|  |     std::cout << "Generating .mat file for " << dump_filename << std::endl; | ||||||
|  |     dump_file.exceptions(std::ifstream::failbit | std::ifstream::badbit); | ||||||
|  |     try | ||||||
|  |         { | ||||||
|  |             dump_file.open(dump_filename.c_str(), std::ios::binary | std::ios::ate); | ||||||
|  |         } | ||||||
|  |     catch (const std::ifstream::failure &e) | ||||||
|  |         { | ||||||
|  |             std::cerr << "Problem opening dump file:" << e.what() << std::endl; | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |     // count number of epochs and rewind | ||||||
|  |     int64_t num_epoch = 0LL; | ||||||
|  |     if (dump_file.is_open()) | ||||||
|  |         { | ||||||
|  |             size = dump_file.tellg(); | ||||||
|  |             num_epoch = static_cast<int64_t>(size) / static_cast<int64_t>(epoch_size_bytes); | ||||||
|  |             dump_file.seekg(0, std::ios::beg); | ||||||
|  |         } | ||||||
|  |     else | ||||||
|  |         { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     uint32_t *TOW_at_current_symbol_ms = new uint32_t[num_epoch]; | ||||||
|  |     uint32_t *week = new uint32_t[num_epoch]; | ||||||
|  |     double *RX_time = new double[num_epoch]; | ||||||
|  |     double *user_clk_offset = new double[num_epoch]; | ||||||
|  |     double *pos_x = new double[num_epoch]; | ||||||
|  |     double *pos_y = new double[num_epoch]; | ||||||
|  |     double *pos_z = new double[num_epoch]; | ||||||
|  |     double *vel_x = new double[num_epoch]; | ||||||
|  |     double *vel_y = new double[num_epoch]; | ||||||
|  |     double *vel_z = new double[num_epoch]; | ||||||
|  |     double *cov_xx = new double[num_epoch]; | ||||||
|  |     double *cov_yy = new double[num_epoch]; | ||||||
|  |     double *cov_zz = new double[num_epoch]; | ||||||
|  |     double *cov_xy = new double[num_epoch]; | ||||||
|  |     double *cov_yz = new double[num_epoch]; | ||||||
|  |     double *cov_zx = new double[num_epoch]; | ||||||
|  |     double *latitude = new double[num_epoch]; | ||||||
|  |     double *longitude = new double[num_epoch]; | ||||||
|  |     double *height = new double[num_epoch]; | ||||||
|  |     uint8_t *valid_sats = new uint8_t[num_epoch]; | ||||||
|  |     uint8_t *solution_status = new uint8_t[num_epoch]; | ||||||
|  |     uint8_t *solution_type = new uint8_t[num_epoch]; | ||||||
|  |     float *AR_ratio_factor = new float[num_epoch]; | ||||||
|  |     float *AR_ratio_threshold = new float[num_epoch]; | ||||||
|  |     double *gdop = new double[num_epoch]; | ||||||
|  |     double *pdop = new double[num_epoch]; | ||||||
|  |     double *hdop = new double[num_epoch]; | ||||||
|  |     double *vdop = new double[num_epoch]; | ||||||
|  |  | ||||||
|  |     try | ||||||
|  |         { | ||||||
|  |             if (dump_file.is_open()) | ||||||
|  |                 { | ||||||
|  |                     for (int64_t i = 0; i < num_epoch; i++) | ||||||
|  |                         { | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&TOW_at_current_symbol_ms[i]), sizeof(uint32_t)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&week[i]), sizeof(uint32_t)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&RX_time[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&user_clk_offset[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&pos_x[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&pos_y[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&pos_z[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&vel_x[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&vel_y[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&vel_z[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&cov_xx[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&cov_yy[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&cov_zz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&cov_xy[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&cov_yz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&cov_zx[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&latitude[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&longitude[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&height[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&valid_sats[i]), sizeof(uint8_t)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&solution_status[i]), sizeof(uint8_t)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&solution_type[i]), sizeof(uint8_t)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&AR_ratio_factor[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&AR_ratio_threshold[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&gdop[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&pdop[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&hdop[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&vdop[i]), sizeof(double)); | ||||||
|  |                         } | ||||||
|  |                 } | ||||||
|  |             dump_file.close(); | ||||||
|  |         } | ||||||
|  |     catch (const std::ifstream::failure &e) | ||||||
|  |         { | ||||||
|  |             std::cerr << "Problem reading dump file:" << e.what() << std::endl; | ||||||
|  |             delete[] TOW_at_current_symbol_ms; | ||||||
|  |             delete[] week; | ||||||
|  |             delete[] RX_time; | ||||||
|  |             delete[] user_clk_offset; | ||||||
|  |             delete[] pos_x; | ||||||
|  |             delete[] pos_y; | ||||||
|  |             delete[] pos_z; | ||||||
|  |             delete[] vel_x; | ||||||
|  |             delete[] vel_y; | ||||||
|  |             delete[] vel_z; | ||||||
|  |             delete[] cov_xx; | ||||||
|  |             delete[] cov_yy; | ||||||
|  |             delete[] cov_zz; | ||||||
|  |             delete[] cov_xy; | ||||||
|  |             delete[] cov_yz; | ||||||
|  |             delete[] cov_zx; | ||||||
|  |             delete[] latitude; | ||||||
|  |             delete[] longitude; | ||||||
|  |             delete[] height; | ||||||
|  |             delete[] valid_sats; | ||||||
|  |             delete[] solution_status; | ||||||
|  |             delete[] solution_type; | ||||||
|  |             delete[] AR_ratio_factor; | ||||||
|  |             delete[] AR_ratio_threshold; | ||||||
|  |             delete[] gdop; | ||||||
|  |             delete[] pdop; | ||||||
|  |             delete[] hdop; | ||||||
|  |             delete[] vdop; | ||||||
|  |  | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     // WRITE MAT FILE | ||||||
|  |     mat_t *matfp; | ||||||
|  |     matvar_t *matvar; | ||||||
|  |     std::string filename = dump_filename; | ||||||
|  |     filename.erase(filename.length() - 4, 4); | ||||||
|  |     filename.append(".mat"); | ||||||
|  |     matfp = Mat_CreateVer(filename.c_str(), NULL, MAT_FT_MAT73); | ||||||
|  |     if (reinterpret_cast<int64_t *>(matfp) != NULL) | ||||||
|  |         { | ||||||
|  |             size_t dims[2] = {1, static_cast<size_t>(num_epoch)}; | ||||||
|  |             matvar = Mat_VarCreate("TOW_at_current_symbol_ms", MAT_C_UINT32, MAT_T_UINT32, 2, dims, TOW_at_current_symbol_ms, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("week", MAT_C_UINT32, MAT_T_UINT32, 2, dims, week, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("RX_time", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, RX_time, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("user_clk_offset", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, user_clk_offset, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("pos_x", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, pos_x, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("pos_y", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, pos_y, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("pos_z", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, pos_z, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("vel_x", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, vel_x, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("vel_y", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, vel_y, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("vel_z", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, vel_z, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("cov_xx", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_xx, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("cov_yy", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_yy, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("cov_zz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_zz, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("cov_xy", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_xy, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("cov_yz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_yz, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("cov_zx", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, cov_zx, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("latitude", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, latitude, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("longitude", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, longitude, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("height", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, height, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("valid_sats", MAT_C_UINT8, MAT_T_UINT8, 2, dims, valid_sats, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("solution_status", MAT_C_UINT8, MAT_T_UINT8, 2, dims, solution_status, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("solution_type", MAT_C_UINT8, MAT_T_UINT8, 2, dims, solution_type, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("AR_ratio_factor", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, AR_ratio_factor, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("AR_ratio_threshold", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, AR_ratio_threshold, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("gdop", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, gdop, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("pdop", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, pdop, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("hdop", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, hdop, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |  | ||||||
|  |             matvar = Mat_VarCreate("vdop", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, vdop, 0); | ||||||
|  |             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);  // or MAT_COMPRESSION_NONE | ||||||
|  |             Mat_VarFree(matvar); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     Mat_Close(matfp); | ||||||
|  |     delete[] TOW_at_current_symbol_ms; | ||||||
|  |     delete[] week; | ||||||
|  |     delete[] RX_time; | ||||||
|  |     delete[] user_clk_offset; | ||||||
|  |     delete[] pos_x; | ||||||
|  |     delete[] pos_y; | ||||||
|  |     delete[] pos_z; | ||||||
|  |     delete[] vel_x; | ||||||
|  |     delete[] vel_y; | ||||||
|  |     delete[] vel_z; | ||||||
|  |     delete[] cov_xx; | ||||||
|  |     delete[] cov_yy; | ||||||
|  |     delete[] cov_zz; | ||||||
|  |     delete[] cov_xy; | ||||||
|  |     delete[] cov_yz; | ||||||
|  |     delete[] cov_zx; | ||||||
|  |     delete[] latitude; | ||||||
|  |     delete[] longitude; | ||||||
|  |     delete[] height; | ||||||
|  |     delete[] valid_sats; | ||||||
|  |     delete[] solution_status; | ||||||
|  |     delete[] solution_type; | ||||||
|  |     delete[] AR_ratio_factor; | ||||||
|  |     delete[] AR_ratio_threshold; | ||||||
|  |     delete[] gdop; | ||||||
|  |     delete[] pdop; | ||||||
|  |     delete[] hdop; | ||||||
|  |     delete[] vdop; | ||||||
|  |  | ||||||
|  |     return true; | ||||||
|  | } | ||||||
|  |  | ||||||
| rtklib_solver::~rtklib_solver() | rtklib_solver::~rtklib_solver() | ||||||
| { | { | ||||||
| @@ -101,11 +398,15 @@ rtklib_solver::~rtklib_solver() | |||||||
|                 { |                 { | ||||||
|                     d_dump_file.close(); |                     d_dump_file.close(); | ||||||
|                 } |                 } | ||||||
|             catch (const std::exception& ex) |             catch (const std::exception &ex) | ||||||
|                 { |                 { | ||||||
|                     LOG(WARNING) << "Exception in destructor closing the RTKLIB dump file " << ex.what(); |                     LOG(WARNING) << "Exception in destructor closing the RTKLIB dump file " << ex.what(); | ||||||
|                 } |                 } | ||||||
|         } |         } | ||||||
|  |     if (d_flag_dump_mat_enabled) | ||||||
|  |         { | ||||||
|  |             save_matfile(); | ||||||
|  |         } | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -133,7 +434,7 @@ double rtklib_solver::get_vdop() const | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_map, bool flag_averaging) | bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_map, bool flag_averaging) | ||||||
| { | { | ||||||
|     std::map<int, Gnss_Synchro>::const_iterator gnss_observables_iter; |     std::map<int, Gnss_Synchro>::const_iterator gnss_observables_iter; | ||||||
|     std::map<int, Galileo_Ephemeris>::const_iterator galileo_ephemeris_iter; |     std::map<int, Galileo_Ephemeris>::const_iterator galileo_ephemeris_iter; | ||||||
| @@ -493,7 +794,7 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_ | |||||||
|                     unsigned int used_sats = 0; |                     unsigned int used_sats = 0; | ||||||
|                     for (unsigned int i = 0; i < MAXSAT; i++) |                     for (unsigned int i = 0; i < MAXSAT; i++) | ||||||
|                         { |                         { | ||||||
|                             if (rtk_.ssat[i].vsat[0] == 1) used_sats++; |                             if (rtk_.ssat[i].vs == 1) used_sats++; | ||||||
|                         } |                         } | ||||||
|  |  | ||||||
|                     std::vector<double> azel; |                     std::vector<double> azel; | ||||||
| @@ -501,7 +802,7 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_ | |||||||
|                     unsigned int index_aux = 0; |                     unsigned int index_aux = 0; | ||||||
|                     for (unsigned int i = 0; i < MAXSAT; i++) |                     for (unsigned int i = 0; i < MAXSAT; i++) | ||||||
|                         { |                         { | ||||||
|                             if (rtk_.ssat[i].vsat[0] == 1) |                             if (rtk_.ssat[i].vs == 1) | ||||||
|                                 { |                                 { | ||||||
|                                     azel[2 * index_aux] = rtk_.ssat[i].azel[0]; |                                     azel[2 * index_aux] = rtk_.ssat[i].azel[0]; | ||||||
|                                     azel[2 * index_aux + 1] = rtk_.ssat[i].azel[1]; |                                     azel[2 * index_aux + 1] = rtk_.ssat[i].azel[1]; | ||||||
| @@ -559,73 +860,73 @@ bool rtklib_solver::get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_ | |||||||
|                                     uint32_t tmp_uint32; |                                     uint32_t tmp_uint32; | ||||||
|                                     // TOW |                                     // TOW | ||||||
|                                     tmp_uint32 = gnss_observables_map.begin()->second.TOW_at_current_symbol_ms; |                                     tmp_uint32 = gnss_observables_map.begin()->second.TOW_at_current_symbol_ms; | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_uint32), sizeof(uint32_t)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_uint32), sizeof(uint32_t)); | ||||||
|                                     // WEEK |                                     // WEEK | ||||||
|                                     tmp_uint32 = adjgpsweek(nav_data.eph[0].week); |                                     tmp_uint32 = adjgpsweek(nav_data.eph[0].week); | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_uint32), sizeof(uint32_t)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_uint32), sizeof(uint32_t)); | ||||||
|                                     // PVT GPS time |                                     // PVT GPS time | ||||||
|                                     tmp_double = gnss_observables_map.begin()->second.RX_time; |                                     tmp_double = gnss_observables_map.begin()->second.RX_time; | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_double), sizeof(double)); | ||||||
|                                     // User clock offset [s] |                                     // User clock offset [s] | ||||||
|                                     tmp_double = rx_position_and_time(3); |                                     tmp_double = rx_position_and_time(3); | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_double), sizeof(double)); | ||||||
|  |  | ||||||
|                                     // ECEF POS X,Y,X [m] + ECEF VEL X,Y,X [m/s] (6 x double) |                                     // ECEF POS X,Y,X [m] + ECEF VEL X,Y,X [m/s] (6 x double) | ||||||
|                                     tmp_double = pvt_sol.rr[0]; |                                     tmp_double = pvt_sol.rr[0]; | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_double), sizeof(double)); | ||||||
|                                     tmp_double = pvt_sol.rr[1]; |                                     tmp_double = pvt_sol.rr[1]; | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_double), sizeof(double)); | ||||||
|                                     tmp_double = pvt_sol.rr[2]; |                                     tmp_double = pvt_sol.rr[2]; | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_double), sizeof(double)); | ||||||
|                                     tmp_double = pvt_sol.rr[3]; |                                     tmp_double = pvt_sol.rr[3]; | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_double), sizeof(double)); | ||||||
|                                     tmp_double = pvt_sol.rr[4]; |                                     tmp_double = pvt_sol.rr[4]; | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_double), sizeof(double)); | ||||||
|                                     tmp_double = pvt_sol.rr[5]; |                                     tmp_double = pvt_sol.rr[5]; | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_double), sizeof(double)); | ||||||
|  |  | ||||||
|                                     // position variance/covariance (m^2) {c_xx,c_yy,c_zz,c_xy,c_yz,c_zx} (6 x double) |                                     // position variance/covariance (m^2) {c_xx,c_yy,c_zz,c_xy,c_yz,c_zx} (6 x double) | ||||||
|                                     tmp_double = pvt_sol.qr[0]; |                                     tmp_double = pvt_sol.qr[0]; | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_double), sizeof(double)); | ||||||
|                                     tmp_double = pvt_sol.qr[1]; |                                     tmp_double = pvt_sol.qr[1]; | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_double), sizeof(double)); | ||||||
|                                     tmp_double = pvt_sol.qr[2]; |                                     tmp_double = pvt_sol.qr[2]; | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_double), sizeof(double)); | ||||||
|                                     tmp_double = pvt_sol.qr[3]; |                                     tmp_double = pvt_sol.qr[3]; | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_double), sizeof(double)); | ||||||
|                                     tmp_double = pvt_sol.qr[4]; |                                     tmp_double = pvt_sol.qr[4]; | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_double), sizeof(double)); | ||||||
|                                     tmp_double = pvt_sol.qr[5]; |                                     tmp_double = pvt_sol.qr[5]; | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_double), sizeof(double)); | ||||||
|  |  | ||||||
|                                     // GEO user position Latitude [deg] |                                     // GEO user position Latitude [deg] | ||||||
|                                     tmp_double = get_latitude(); |                                     tmp_double = get_latitude(); | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_double), sizeof(double)); | ||||||
|                                     // GEO user position Longitude [deg] |                                     // GEO user position Longitude [deg] | ||||||
|                                     tmp_double = get_longitude(); |                                     tmp_double = get_longitude(); | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_double), sizeof(double)); | ||||||
|                                     // GEO user position Height [m] |                                     // GEO user position Height [m] | ||||||
|                                     tmp_double = get_height(); |                                     tmp_double = get_height(); | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&tmp_double), sizeof(double)); | ||||||
|  |  | ||||||
|                                     // NUMBER OF VALID SATS |                                     // NUMBER OF VALID SATS | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&pvt_sol.ns), sizeof(uint8_t)); |                                     d_dump_file.write(reinterpret_cast<char *>(&pvt_sol.ns), sizeof(uint8_t)); | ||||||
|                                     // RTKLIB solution status |                                     // RTKLIB solution status | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&pvt_sol.stat), sizeof(uint8_t)); |                                     d_dump_file.write(reinterpret_cast<char *>(&pvt_sol.stat), sizeof(uint8_t)); | ||||||
|                                     // RTKLIB solution type (0:xyz-ecef,1:enu-baseline) |                                     // RTKLIB solution type (0:xyz-ecef,1:enu-baseline) | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&pvt_sol.type), sizeof(uint8_t)); |                                     d_dump_file.write(reinterpret_cast<char *>(&pvt_sol.type), sizeof(uint8_t)); | ||||||
|                                     // AR ratio factor for validation |                                     // AR ratio factor for validation | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&pvt_sol.ratio), sizeof(float)); |                                     d_dump_file.write(reinterpret_cast<char *>(&pvt_sol.ratio), sizeof(float)); | ||||||
|                                     // AR ratio threshold for validation |                                     // AR ratio threshold for validation | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&pvt_sol.thres), sizeof(float)); |                                     d_dump_file.write(reinterpret_cast<char *>(&pvt_sol.thres), sizeof(float)); | ||||||
|  |  | ||||||
|                                     // GDOP / PDOP/ HDOP/ VDOP |                                     // GDOP / PDOP/ HDOP/ VDOP | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&dop_[0]), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&dop_[0]), sizeof(double)); | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&dop_[1]), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&dop_[1]), sizeof(double)); | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&dop_[2]), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&dop_[2]), sizeof(double)); | ||||||
|                                     d_dump_file.write(reinterpret_cast<char*>(&dop_[3]), sizeof(double)); |                                     d_dump_file.write(reinterpret_cast<char *>(&dop_[3]), sizeof(double)); | ||||||
|                                 } |                                 } | ||||||
|                             catch (const std::ifstream::failure& e) |                             catch (const std::ifstream::failure &e) | ||||||
|                                 { |                                 { | ||||||
|                                     LOG(WARNING) << "Exception writing RTKLIB dump file " << e.what(); |                                     LOG(WARNING) << "Exception writing RTKLIB dump file " << e.what(); | ||||||
|                                 } |                                 } | ||||||
|   | |||||||
| @@ -60,6 +60,7 @@ | |||||||
| #include "gps_navigation_message.h" | #include "gps_navigation_message.h" | ||||||
| #include "gps_cnav_navigation_message.h" | #include "gps_cnav_navigation_message.h" | ||||||
| #include "glonass_gnav_navigation_message.h" | #include "glonass_gnav_navigation_message.h" | ||||||
|  | #include "galileo_almanac.h" | ||||||
| #include "gnss_synchro.h" | #include "gnss_synchro.h" | ||||||
| #include "pvt_solution.h" | #include "pvt_solution.h" | ||||||
| #include <fstream> | #include <fstream> | ||||||
| @@ -76,14 +77,16 @@ private: | |||||||
|     rtk_t rtk_; |     rtk_t rtk_; | ||||||
|     std::string d_dump_filename; |     std::string d_dump_filename; | ||||||
|     std::ofstream d_dump_file; |     std::ofstream d_dump_file; | ||||||
|  |     bool save_matfile(); | ||||||
|  |  | ||||||
|     bool d_flag_dump_enabled; |     bool d_flag_dump_enabled; | ||||||
|  |     bool d_flag_dump_mat_enabled; | ||||||
|     int d_nchannels;  // Number of available channels for positioning |     int d_nchannels;  // Number of available channels for positioning | ||||||
|     double dop_[4]; |     double dop_[4]; | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     sol_t pvt_sol; |     sol_t pvt_sol; | ||||||
|     rtklib_solver(int nchannels, std::string dump_filename, bool flag_dump_to_file, rtk_t& rtk); |     rtklib_solver(int nchannels, std::string dump_filename, bool flag_dump_to_file, bool flag_dump_to_mat, rtk_t& rtk); | ||||||
|     ~rtklib_solver(); |     ~rtklib_solver(); | ||||||
|  |  | ||||||
|     bool get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_map, bool flag_averaging); |     bool get_PVT(const std::map<int, Gnss_Synchro>& gnss_observables_map, bool flag_averaging); | ||||||
| @@ -99,10 +102,11 @@ public: | |||||||
|  |  | ||||||
|     Galileo_Utc_Model galileo_utc_model; |     Galileo_Utc_Model galileo_utc_model; | ||||||
|     Galileo_Iono galileo_iono; |     Galileo_Iono galileo_iono; | ||||||
|     Galileo_Almanac galileo_almanac; |     std::map<int, Galileo_Almanac> galileo_almanac_map; | ||||||
|  |  | ||||||
|     Gps_Utc_Model gps_utc_model; |     Gps_Utc_Model gps_utc_model; | ||||||
|     Gps_Iono gps_iono; |     Gps_Iono gps_iono; | ||||||
|  |     std::map<int, Gps_Almanac> gps_almanac_map; | ||||||
|  |  | ||||||
|     Gps_CNAV_Iono gps_cnav_iono; |     Gps_CNAV_Iono gps_cnav_iono; | ||||||
|     Gps_CNAV_Utc_Model gps_cnav_utc_model; |     Gps_CNAV_Utc_Model gps_cnav_utc_model; | ||||||
|   | |||||||
| @@ -40,6 +40,9 @@ | |||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GalileoE1Pcps8msAmbiguousAcquisition::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
| GalileoE1Pcps8msAmbiguousAcquisition::GalileoE1Pcps8msAmbiguousAcquisition( | GalileoE1Pcps8msAmbiguousAcquisition::GalileoE1Pcps8msAmbiguousAcquisition( | ||||||
|     ConfigurationInterface* configuration, std::string role, |     ConfigurationInterface* configuration, std::string role, | ||||||
|     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) |     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
|   | |||||||
| @@ -122,6 +122,12 @@ public: | |||||||
|      * \brief Restart acquisition algorithm |      * \brief Restart acquisition algorithm | ||||||
|      */ |      */ | ||||||
|     void reset() override; |     void reset() override; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running acquisition | ||||||
|  |      */ | ||||||
|  |     void stop_acquisition() override; | ||||||
|  |  | ||||||
|     void set_state(int state __attribute__((unused))) override{}; |     void set_state(int state __attribute__((unused))) override{}; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|   | |||||||
| @@ -42,6 +42,10 @@ | |||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GalileoE1PcpsAmbiguousAcquisition::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| GalileoE1PcpsAmbiguousAcquisition::GalileoE1PcpsAmbiguousAcquisition( | GalileoE1PcpsAmbiguousAcquisition::GalileoE1PcpsAmbiguousAcquisition( | ||||||
|     ConfigurationInterface* configuration, std::string role, |     ConfigurationInterface* configuration, std::string role, | ||||||
|     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) |     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
| @@ -49,7 +53,7 @@ GalileoE1PcpsAmbiguousAcquisition::GalileoE1PcpsAmbiguousAcquisition( | |||||||
|     Acq_Conf acq_parameters; |     Acq_Conf acq_parameters; | ||||||
|     configuration_ = configuration; |     configuration_ = configuration; | ||||||
|     std::string default_item_type = "gr_complex"; |     std::string default_item_type = "gr_complex"; | ||||||
|     std::string default_dump_filename = "./data/acquisition.dat"; |     std::string default_dump_filename = "./acquisition.mat"; | ||||||
|  |  | ||||||
|     DLOG(INFO) << "role " << role; |     DLOG(INFO) << "role " << role; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -131,6 +131,11 @@ public: | |||||||
|      */ |      */ | ||||||
|     void set_state(int state) override; |     void set_state(int state) override; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running acquisition | ||||||
|  |      */ | ||||||
|  |     void stop_acquisition() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     ConfigurationInterface* configuration_; |     ConfigurationInterface* configuration_; | ||||||
|     pcps_acquisition_sptr acquisition_; |     pcps_acquisition_sptr acquisition_; | ||||||
|   | |||||||
| @@ -39,9 +39,12 @@ | |||||||
| #include <glog/logging.h> | #include <glog/logging.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GalileoE1PcpsAmbiguousAcquisitionFpga::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga( | GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga( | ||||||
|     ConfigurationInterface* configuration, std::string role, |     ConfigurationInterface* configuration, std::string role, | ||||||
|     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) |     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
| @@ -49,12 +52,14 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga( | |||||||
|     //printf("top acq constructor start\n"); |     //printf("top acq constructor start\n"); | ||||||
|     pcpsconf_fpga_t acq_parameters; |     pcpsconf_fpga_t acq_parameters; | ||||||
|     configuration_ = configuration; |     configuration_ = configuration; | ||||||
|  |  | ||||||
|     std::string default_item_type = "cshort"; |     std::string default_item_type = "cshort"; | ||||||
|     std::string default_dump_filename = "./data/acquisition.dat"; |     std::string default_dump_filename = "./data/acquisition.dat"; | ||||||
|  |  | ||||||
|  |  | ||||||
|     DLOG(INFO) << "role " << role; |     DLOG(INFO) << "role " << role; | ||||||
|  |  | ||||||
| //    item_type_ = configuration_->property(role + ".item_type", default_item_type); |     //    item_type_ = configuration_->property(role + ".item_type", default_item_type); | ||||||
|  |  | ||||||
|     long fs_in_deprecated = configuration_->property("GNSS-SDR.internal_fs_hz", 4000000); |     long fs_in_deprecated = configuration_->property("GNSS-SDR.internal_fs_hz", 4000000); | ||||||
|     long fs_in = configuration_->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); |     long fs_in = configuration_->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); | ||||||
| @@ -73,10 +78,10 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga( | |||||||
|     //if_ = configuration_->property(role + ".if", 0); |     //if_ = configuration_->property(role + ".if", 0); | ||||||
|     //acq_parameters.freq = if_; |     //acq_parameters.freq = if_; | ||||||
|  |  | ||||||
|   //  dump_ = configuration_->property(role + ".dump", false); |     //  dump_ = configuration_->property(role + ".dump", false); | ||||||
|   //  acq_parameters.dump = dump_; |     //  acq_parameters.dump = dump_; | ||||||
|   //  blocking_ = configuration_->property(role + ".blocking", true); |     //  blocking_ = configuration_->property(role + ".blocking", true); | ||||||
| //    acq_parameters.blocking = blocking_; |     //    acq_parameters.blocking = blocking_; | ||||||
|     doppler_max_ = configuration_->property(role + ".doppler_max", 5000); |     doppler_max_ = configuration_->property(role + ".doppler_max", 5000); | ||||||
|     if (FLAGS_doppler_max != 0) doppler_max_ = FLAGS_doppler_max; |     if (FLAGS_doppler_max != 0) doppler_max_ = FLAGS_doppler_max; | ||||||
|     acq_parameters.doppler_max = doppler_max_; |     acq_parameters.doppler_max = doppler_max_; | ||||||
| @@ -85,16 +90,16 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga( | |||||||
|     unsigned int sampled_ms = configuration_->property(role + ".coherent_integration_time_ms", 4); |     unsigned int sampled_ms = configuration_->property(role + ".coherent_integration_time_ms", 4); | ||||||
|     acq_parameters.sampled_ms = sampled_ms; |     acq_parameters.sampled_ms = sampled_ms; | ||||||
|  |  | ||||||
|  //   bit_transition_flag_ = configuration_->property(role + ".bit_transition_flag", false); |     //   bit_transition_flag_ = configuration_->property(role + ".bit_transition_flag", false); | ||||||
|  //   acq_parameters.bit_transition_flag = bit_transition_flag_; |     //   acq_parameters.bit_transition_flag = bit_transition_flag_; | ||||||
|  //   use_CFAR_algorithm_flag_ = configuration_->property(role + ".use_CFAR_algorithm", true);  //will be false in future versions |     //   use_CFAR_algorithm_flag_ = configuration_->property(role + ".use_CFAR_algorithm", true);  //will be false in future versions | ||||||
|  //   acq_parameters.use_CFAR_algorithm_flag = use_CFAR_algorithm_flag_; |     //   acq_parameters.use_CFAR_algorithm_flag = use_CFAR_algorithm_flag_; | ||||||
|     acquire_pilot_ = configuration_->property(role + ".acquire_pilot", false);  //will be true in future versions |     acquire_pilot_ = configuration_->property(role + ".acquire_pilot", false);  //will be true in future versions | ||||||
|  |  | ||||||
|  //   max_dwells_ = configuration_->property(role + ".max_dwells", 1); |     //   max_dwells_ = configuration_->property(role + ".max_dwells", 1); | ||||||
|  //   acq_parameters.max_dwells = max_dwells_; |     //   acq_parameters.max_dwells = max_dwells_; | ||||||
|  //   dump_filename_ = configuration_->property(role + ".dump_filename", default_dump_filename); |     //   dump_filename_ = configuration_->property(role + ".dump_filename", default_dump_filename); | ||||||
|  //   acq_parameters.dump_filename = dump_filename_; |     //   acq_parameters.dump_filename = dump_filename_; | ||||||
|     //--- Find number of samples per spreading code (4 ms)  ----------------- |     //--- Find number of samples per spreading code (4 ms)  ----------------- | ||||||
|     unsigned int code_length = static_cast<unsigned int>(std::round(static_cast<double>(fs_in) / (Galileo_E1_CODE_CHIP_RATE_HZ / Galileo_E1_B_CODE_LENGTH_CHIPS))); |     unsigned int code_length = static_cast<unsigned int>(std::round(static_cast<double>(fs_in) / (Galileo_E1_CODE_CHIP_RATE_HZ / Galileo_E1_B_CODE_LENGTH_CHIPS))); | ||||||
|     //acq_parameters.samples_per_code = code_length_; |     //acq_parameters.samples_per_code = code_length_; | ||||||
| @@ -102,10 +107,10 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga( | |||||||
|     //acq_parameters.samples_per_ms = samples_per_ms; |     //acq_parameters.samples_per_ms = samples_per_ms; | ||||||
|     //unsigned int vector_length = sampled_ms * samples_per_ms; |     //unsigned int vector_length = sampled_ms * samples_per_ms; | ||||||
|  |  | ||||||
| //    if (bit_transition_flag_) |     //    if (bit_transition_flag_) | ||||||
| //        { |     //        { | ||||||
| //            vector_length_ *= 2; |     //            vector_length_ *= 2; | ||||||
| //        } |     //        } | ||||||
|  |  | ||||||
|     //printf("fs_in = %d\n", fs_in); |     //printf("fs_in = %d\n", fs_in); | ||||||
|     //printf("Galileo_E1_B_CODE_LENGTH_CHIPS = %f\n", Galileo_E1_B_CODE_LENGTH_CHIPS); |     //printf("Galileo_E1_B_CODE_LENGTH_CHIPS = %f\n", Galileo_E1_B_CODE_LENGTH_CHIPS); | ||||||
| @@ -122,23 +127,24 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga( | |||||||
|     std::string default_device_name = "/dev/uio0"; |     std::string default_device_name = "/dev/uio0"; | ||||||
|     std::string device_name = configuration_->property(role + ".devicename", default_device_name); |     std::string device_name = configuration_->property(role + ".devicename", default_device_name); | ||||||
|     acq_parameters.device_name = device_name; |     acq_parameters.device_name = device_name; | ||||||
|     acq_parameters.samples_per_ms = nsamples_total/sampled_ms; |     acq_parameters.samples_per_ms = nsamples_total / sampled_ms; | ||||||
|     acq_parameters.samples_per_code = nsamples_total; |     acq_parameters.samples_per_code = nsamples_total; | ||||||
|     acq_parameters.excludelimit = static_cast<unsigned int>(std::round(static_cast<double>(fs_in) / Galileo_E1_CODE_CHIP_RATE_HZ)); |     acq_parameters.excludelimit = static_cast<unsigned int>(std::round(static_cast<double>(fs_in) / Galileo_E1_CODE_CHIP_RATE_HZ)); | ||||||
|  |  | ||||||
|     // compute all the GALILEO E1 PRN Codes (this is done only once upon the class constructor in order to avoid re-computing the PRN codes every time |     // compute all the GALILEO E1 PRN Codes (this is done only once upon the class constructor in order to avoid re-computing the PRN codes every time | ||||||
|     // a channel is assigned) |     // a channel is assigned) | ||||||
|     gr::fft::fft_complex* fft_if = new gr::fft::fft_complex(nsamples_total, true);  // Direct FFT |     gr::fft::fft_complex* fft_if = new gr::fft::fft_complex(nsamples_total, true);  // Direct FFT | ||||||
|     std::complex<float>* code = new std::complex<float>[nsamples_total];  // buffer for the local code |     std::complex<float>* code = new std::complex<float>[nsamples_total];            // buffer for the local code | ||||||
|     gr_complex* fft_codes_padded = static_cast<gr_complex*>(volk_gnsssdr_malloc(nsamples_total * sizeof(gr_complex), volk_gnsssdr_get_alignment())); |     gr_complex* fft_codes_padded = static_cast<gr_complex*>(volk_gnsssdr_malloc(nsamples_total * sizeof(gr_complex), volk_gnsssdr_get_alignment())); | ||||||
|     d_all_fft_codes_ = new lv_16sc_t[nsamples_total * Galileo_E1_NUMBER_OF_CODES];  // memory containing all the possible fft codes for PRN 0 to 32 |     d_all_fft_codes_ = new lv_16sc_t[nsamples_total * Galileo_E1_NUMBER_OF_CODES];  // memory containing all the possible fft codes for PRN 0 to 32 | ||||||
|     float max;                                                        // temporary maxima search |     float max;                                                                      // temporary maxima search | ||||||
|  |  | ||||||
|     //int tmp_re, tmp_im; |     //int tmp_re, tmp_im; | ||||||
|  |  | ||||||
|     for (unsigned int PRN = 1; PRN <= Galileo_E1_NUMBER_OF_CODES; PRN++) |     for (unsigned int PRN = 1; PRN <= Galileo_E1_NUMBER_OF_CODES; PRN++) | ||||||
|         { |         { | ||||||
|  |  | ||||||
|  |  | ||||||
|         //code_ = new gr_complex[vector_length_]; |         //code_ = new gr_complex[vector_length_]; | ||||||
|  |  | ||||||
|         bool cboc = false; // cboc is set to 0 when using the FPGA |         bool cboc = false; // cboc is set to 0 when using the FPGA | ||||||
| @@ -272,23 +278,24 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga( | |||||||
| //        fclose(fid2); | //        fclose(fid2); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |  | ||||||
| //    for (unsigned int PRN = 1; PRN <= Galileo_E1_NUMBER_OF_CODES; PRN++) |     //    for (unsigned int PRN = 1; PRN <= Galileo_E1_NUMBER_OF_CODES; PRN++) | ||||||
| //        { |     //        { | ||||||
| //                    // debug |     //                    // debug | ||||||
| //                    char filename2[25]; |     //                    char filename2[25]; | ||||||
| //                    FILE *fid2; |     //                    FILE *fid2; | ||||||
| //                    sprintf(filename2,"fft_gal_prn%d_norm_last.txt", PRN); |     //                    sprintf(filename2,"fft_gal_prn%d_norm_last.txt", PRN); | ||||||
| //                    fid2 = fopen(filename2, "w"); |     //                    fid2 = fopen(filename2, "w"); | ||||||
| //                    for (unsigned int kk=0;kk< nsamples_total; kk++) |     //                    for (unsigned int kk=0;kk< nsamples_total; kk++) | ||||||
| //                        { |     //                        { | ||||||
| //                            fprintf(fid2, "%d\n", d_all_fft_codes_[kk + nsamples_total * (PRN - 1)].real()); |     //                            fprintf(fid2, "%d\n", d_all_fft_codes_[kk + nsamples_total * (PRN - 1)].real()); | ||||||
| //                            fprintf(fid2, "%d\n", d_all_fft_codes_[kk + nsamples_total * (PRN - 1)].imag()); |     //                            fprintf(fid2, "%d\n", d_all_fft_codes_[kk + nsamples_total * (PRN - 1)].imag()); | ||||||
| //                        } |     //                        } | ||||||
| //                    fclose(fid2); |     //                    fclose(fid2); | ||||||
| //        } |     //        } | ||||||
|  |  | ||||||
|     //acq_parameters |     //acq_parameters | ||||||
|  |  | ||||||
| @@ -304,14 +311,14 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga( | |||||||
|     acquisition_fpga_ = pcps_make_acquisition_fpga(acq_parameters); |     acquisition_fpga_ = pcps_make_acquisition_fpga(acq_parameters); | ||||||
|     DLOG(INFO) << "acquisition(" << acquisition_fpga_->unique_id() << ")"; |     DLOG(INFO) << "acquisition(" << acquisition_fpga_->unique_id() << ")"; | ||||||
|  |  | ||||||
| //    stream_to_vector_ = gr::blocks::stream_to_vector::make(item_size_, vector_length_); |     //    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) << "stream_to_vector(" << stream_to_vector_->unique_id() << ")"; | ||||||
|  |  | ||||||
| //    if (item_type_.compare("cbyte") == 0) |     //    if (item_type_.compare("cbyte") == 0) | ||||||
| //        { |     //        { | ||||||
| //            cbyte_to_float_x2_ = make_complex_byte_to_float_x2(); |     //            cbyte_to_float_x2_ = make_complex_byte_to_float_x2(); | ||||||
| //            float_to_complex_ = gr::blocks::float_to_complex::make(); |     //            float_to_complex_ = gr::blocks::float_to_complex::make(); | ||||||
| //        } |     //        } | ||||||
|  |  | ||||||
|     channel_ = 0; |     channel_ = 0; | ||||||
|     //threshold_ = 0.0; |     //threshold_ = 0.0; | ||||||
| @@ -345,22 +352,22 @@ void GalileoE1PcpsAmbiguousAcquisitionFpga::set_threshold(float threshold) | |||||||
|     // the .pfa parameter and the threshold calculation is only used for the CFAR algorithm. |     // the .pfa parameter and the threshold calculation is only used for the CFAR algorithm. | ||||||
|     // We don't use the CFAR algorithm in the FPGA. Therefore the threshold is set as such. |     // We don't use the CFAR algorithm in the FPGA. Therefore the threshold is set as such. | ||||||
|  |  | ||||||
| //    float pfa = configuration_->property(role_ + boost::lexical_cast<std::string>(channel_) + ".pfa", 0.0); |     //    float pfa = configuration_->property(role_ + boost::lexical_cast<std::string>(channel_) + ".pfa", 0.0); | ||||||
| // |     // | ||||||
| //    if (pfa == 0.0) pfa = configuration_->property(role_ + ".pfa", 0.0); |     //    if (pfa == 0.0) pfa = configuration_->property(role_ + ".pfa", 0.0); | ||||||
| // |     // | ||||||
| //    if (pfa == 0.0) |     //    if (pfa == 0.0) | ||||||
| //        { |     //        { | ||||||
| //            threshold_ = threshold; |     //            threshold_ = threshold; | ||||||
| //        } |     //        } | ||||||
| //    else |     //    else | ||||||
| //        { |     //        { | ||||||
| //            threshold_ = calculate_threshold(pfa); |     //            threshold_ = calculate_threshold(pfa); | ||||||
| //        } |     //        } | ||||||
|  |  | ||||||
|     DLOG(INFO) << "Channel " << channel_ << " Threshold = " << threshold; |     DLOG(INFO) << "Channel " << channel_ << " Threshold = " << threshold; | ||||||
|     acquisition_fpga_->set_threshold(threshold); |     acquisition_fpga_->set_threshold(threshold); | ||||||
| //    acquisition_fpga_->set_threshold(threshold_); |     //    acquisition_fpga_->set_threshold(threshold_); | ||||||
|     //printf("top acq set threshold end\n"); |     //printf("top acq set threshold end\n"); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -397,7 +404,7 @@ void GalileoE1PcpsAmbiguousAcquisitionFpga::set_gnss_synchro(Gnss_Synchro* gnss_ | |||||||
|  |  | ||||||
| signed int GalileoE1PcpsAmbiguousAcquisitionFpga::mag() | signed int GalileoE1PcpsAmbiguousAcquisitionFpga::mag() | ||||||
| { | { | ||||||
|    // printf("top acq mag start\n"); |     // printf("top acq mag start\n"); | ||||||
|     return acquisition_fpga_->mag(); |     return acquisition_fpga_->mag(); | ||||||
|     //printf("top acq mag end\n"); |     //printf("top acq mag end\n"); | ||||||
| } | } | ||||||
| @@ -405,60 +412,60 @@ signed int GalileoE1PcpsAmbiguousAcquisitionFpga::mag() | |||||||
|  |  | ||||||
| void GalileoE1PcpsAmbiguousAcquisitionFpga::init() | void GalileoE1PcpsAmbiguousAcquisitionFpga::init() | ||||||
| { | { | ||||||
|    // printf("top acq init start\n"); |     // printf("top acq init start\n"); | ||||||
|     acquisition_fpga_->init(); |     acquisition_fpga_->init(); | ||||||
|    // printf("top acq init end\n"); |     // printf("top acq init end\n"); | ||||||
|     //set_local_code(); |     //set_local_code(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void GalileoE1PcpsAmbiguousAcquisitionFpga::set_local_code() | void GalileoE1PcpsAmbiguousAcquisitionFpga::set_local_code() | ||||||
| { | { | ||||||
|    // printf("top acq set local code start\n"); |     // printf("top acq set local code start\n"); | ||||||
| //    bool cboc = configuration_->property( |     //    bool cboc = configuration_->property( | ||||||
| //        "Acquisition" + boost::lexical_cast<std::string>(channel_) + ".cboc", false); |     //        "Acquisition" + boost::lexical_cast<std::string>(channel_) + ".cboc", false); | ||||||
| // |     // | ||||||
| //    std::complex<float>* code = new std::complex<float>[code_length_]; |     //    std::complex<float>* code = new std::complex<float>[code_length_]; | ||||||
| // |     // | ||||||
| //    if (acquire_pilot_ == true) |     //    if (acquire_pilot_ == true) | ||||||
| //        { |     //        { | ||||||
| //            //set local signal generator to Galileo E1 pilot component (1C) |     //            //set local signal generator to Galileo E1 pilot component (1C) | ||||||
| //            char pilot_signal[3] = "1C"; |     //            char pilot_signal[3] = "1C"; | ||||||
| //            galileo_e1_code_gen_complex_sampled(code, pilot_signal, |     //            galileo_e1_code_gen_complex_sampled(code, pilot_signal, | ||||||
| //                cboc, gnss_synchro_->PRN, fs_in_, 0, false); |     //                cboc, gnss_synchro_->PRN, fs_in_, 0, false); | ||||||
| //        } |     //        } | ||||||
| //    else |     //    else | ||||||
| //        { |     //        { | ||||||
| //            galileo_e1_code_gen_complex_sampled(code, gnss_synchro_->Signal, |     //            galileo_e1_code_gen_complex_sampled(code, gnss_synchro_->Signal, | ||||||
| //                cboc, gnss_synchro_->PRN, fs_in_, 0, false); |     //                cboc, gnss_synchro_->PRN, fs_in_, 0, false); | ||||||
| //        } |     //        } | ||||||
| // |     // | ||||||
| // |     // | ||||||
| //    for (unsigned int i = 0; i < sampled_ms_ / 4; i++) |     //    for (unsigned int i = 0; i < sampled_ms_ / 4; i++) | ||||||
| //        { |     //        { | ||||||
| //            memcpy(&(code_[i * code_length_]), code, sizeof(gr_complex) * code_length_); |     //            memcpy(&(code_[i * code_length_]), code, sizeof(gr_complex) * code_length_); | ||||||
| //        } |     //        } | ||||||
|  |  | ||||||
|     //acquisition_fpga_->set_local_code(code_); |     //acquisition_fpga_->set_local_code(code_); | ||||||
|     acquisition_fpga_->set_local_code(); |     acquisition_fpga_->set_local_code(); | ||||||
| //    delete[] code; |     //    delete[] code; | ||||||
|   //  printf("top acq set local code end\n"); |     //  printf("top acq set local code end\n"); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void GalileoE1PcpsAmbiguousAcquisitionFpga::reset() | void GalileoE1PcpsAmbiguousAcquisitionFpga::reset() | ||||||
| { | { | ||||||
|  //   printf("top acq reset start\n"); |     //   printf("top acq reset start\n"); | ||||||
|     acquisition_fpga_->set_active(true); |     acquisition_fpga_->set_active(true); | ||||||
|   //  printf("top acq reset end\n"); |     //  printf("top acq reset end\n"); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void GalileoE1PcpsAmbiguousAcquisitionFpga::set_state(int state) | void GalileoE1PcpsAmbiguousAcquisitionFpga::set_state(int state) | ||||||
| { | { | ||||||
|   //  printf("top acq set state start\n"); |     //  printf("top acq set state start\n"); | ||||||
|     acquisition_fpga_->set_state(state); |     acquisition_fpga_->set_state(state); | ||||||
|   //  printf("top acq set state end\n"); |     //  printf("top acq set state end\n"); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -509,26 +516,26 @@ void GalileoE1PcpsAmbiguousAcquisitionFpga::read_fpga_total_scale_factor(uint32_ | |||||||
|  |  | ||||||
| void GalileoE1PcpsAmbiguousAcquisitionFpga::connect(gr::top_block_sptr top_block) | void GalileoE1PcpsAmbiguousAcquisitionFpga::connect(gr::top_block_sptr top_block) | ||||||
| { | { | ||||||
|   //  printf("top acq connect\n"); |     //  printf("top acq connect\n"); | ||||||
| //    if (item_type_.compare("gr_complex") == 0) |     //    if (item_type_.compare("gr_complex") == 0) | ||||||
| //        { |     //        { | ||||||
| //            top_block->connect(stream_to_vector_, 0, acquisition_fpga_, 0); |     //            top_block->connect(stream_to_vector_, 0, acquisition_fpga_, 0); | ||||||
| //        } |     //        } | ||||||
| //    else if (item_type_.compare("cshort") == 0) |     //    else if (item_type_.compare("cshort") == 0) | ||||||
| //        { |     //        { | ||||||
| //            top_block->connect(stream_to_vector_, 0, acquisition_fpga_, 0); |     //            top_block->connect(stream_to_vector_, 0, acquisition_fpga_, 0); | ||||||
| //        } |     //        } | ||||||
| //    else if (item_type_.compare("cbyte") == 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_, 0, float_to_complex_, 0); | ||||||
| //            top_block->connect(cbyte_to_float_x2_, 1, float_to_complex_, 1); |     //            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(float_to_complex_, 0, stream_to_vector_, 0); | ||||||
| //            top_block->connect(stream_to_vector_, 0, acquisition_fpga_, 0); |     //            top_block->connect(stream_to_vector_, 0, acquisition_fpga_, 0); | ||||||
| //        } |     //        } | ||||||
| //    else |     //    else | ||||||
| //        { |     //        { | ||||||
| //            LOG(WARNING) << item_type_ << " unknown acquisition item type"; |     //            LOG(WARNING) << item_type_ << " unknown acquisition item type"; | ||||||
| //        } |     //        } | ||||||
|  |  | ||||||
|     // nothing to connect |     // nothing to connect | ||||||
| } | } | ||||||
| @@ -536,61 +543,60 @@ void GalileoE1PcpsAmbiguousAcquisitionFpga::connect(gr::top_block_sptr top_block | |||||||
|  |  | ||||||
| void GalileoE1PcpsAmbiguousAcquisitionFpga::disconnect(gr::top_block_sptr top_block) | void GalileoE1PcpsAmbiguousAcquisitionFpga::disconnect(gr::top_block_sptr top_block) | ||||||
| { | { | ||||||
| //    if (item_type_.compare("gr_complex") == 0) |     //    if (item_type_.compare("gr_complex") == 0) | ||||||
| //        { |     //        { | ||||||
| //            top_block->disconnect(stream_to_vector_, 0, acquisition_fpga_, 0); |     //            top_block->disconnect(stream_to_vector_, 0, acquisition_fpga_, 0); | ||||||
| //        } |     //        } | ||||||
| //    else if (item_type_.compare("cshort") == 0) |     //    else if (item_type_.compare("cshort") == 0) | ||||||
| //        { |     //        { | ||||||
| //            top_block->disconnect(stream_to_vector_, 0, acquisition_fpga_, 0); |     //            top_block->disconnect(stream_to_vector_, 0, acquisition_fpga_, 0); | ||||||
| //        } |     //        } | ||||||
| //    else if (item_type_.compare("cbyte") == 0) |     //    else if (item_type_.compare("cbyte") == 0) | ||||||
| //        { |     //        { | ||||||
| //            // Since a byte-based acq implementation is not available, |     //            // Since a byte-based acq implementation is not available, | ||||||
| //            // we just convert cshorts to gr_complex |     //            // 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_, 0, float_to_complex_, 0); | ||||||
| //            top_block->disconnect(cbyte_to_float_x2_, 1, float_to_complex_, 1); |     //            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(float_to_complex_, 0, stream_to_vector_, 0); | ||||||
| //            top_block->disconnect(stream_to_vector_, 0, acquisition_fpga_, 0); |     //            top_block->disconnect(stream_to_vector_, 0, acquisition_fpga_, 0); | ||||||
| //        } |     //        } | ||||||
| //    else |     //    else | ||||||
| //        { |     //        { | ||||||
| //            LOG(WARNING) << item_type_ << " unknown acquisition item type"; |     //            LOG(WARNING) << item_type_ << " unknown acquisition item type"; | ||||||
| //        } |     //        } | ||||||
|  |  | ||||||
|     // nothing to disconnect |     // nothing to disconnect | ||||||
|  //   printf("top acq disconnect\n"); |     //   printf("top acq disconnect\n"); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| gr::basic_block_sptr GalileoE1PcpsAmbiguousAcquisitionFpga::get_left_block() | gr::basic_block_sptr GalileoE1PcpsAmbiguousAcquisitionFpga::get_left_block() | ||||||
| { | { | ||||||
|  //   printf("top acq get left block start\n"); |     //   printf("top acq get left block start\n"); | ||||||
| //    if (item_type_.compare("gr_complex") == 0) |     //    if (item_type_.compare("gr_complex") == 0) | ||||||
| //        { |     //        { | ||||||
| //            return stream_to_vector_; |     //            return stream_to_vector_; | ||||||
| //        } |     //        } | ||||||
| //    else if (item_type_.compare("cshort") == 0) |     //    else if (item_type_.compare("cshort") == 0) | ||||||
| //        { |     //        { | ||||||
| //            return stream_to_vector_; |     //            return stream_to_vector_; | ||||||
| //        } |     //        } | ||||||
| //    else if (item_type_.compare("cbyte") == 0) |     //    else if (item_type_.compare("cbyte") == 0) | ||||||
| //        { |     //        { | ||||||
| //            return cbyte_to_float_x2_; |     //            return cbyte_to_float_x2_; | ||||||
| //        } |     //        } | ||||||
| //    else |     //    else | ||||||
| //        { |     //        { | ||||||
| //            LOG(WARNING) << item_type_ << " unknown acquisition item type"; |     //            LOG(WARNING) << item_type_ << " unknown acquisition item type"; | ||||||
|             return nullptr; |     return nullptr; | ||||||
| //        } |     //        } | ||||||
|    //         printf("top acq get left block end\n"); |     //         printf("top acq get left block end\n"); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| gr::basic_block_sptr GalileoE1PcpsAmbiguousAcquisitionFpga::get_right_block() | gr::basic_block_sptr GalileoE1PcpsAmbiguousAcquisitionFpga::get_right_block() | ||||||
| { | { | ||||||
|  //   printf("top acq get right block start\n"); |     //   printf("top acq get right block start\n"); | ||||||
|     return acquisition_fpga_; |     return acquisition_fpga_; | ||||||
|  //   printf("top acq get right block end\n"); |     //   printf("top acq get right block end\n"); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -156,6 +156,11 @@ public: | |||||||
|       */ |       */ | ||||||
|      void read_fpga_total_scale_factor(uint32_t *total_scale_factor, uint32_t *fw_scale_factor); |      void read_fpga_total_scale_factor(uint32_t *total_scale_factor, uint32_t *fw_scale_factor); | ||||||
|  |  | ||||||
|  |      /*! | ||||||
|  |       * \brief Stop running acquisition | ||||||
|  |       */ | ||||||
|  |      void stop_acquisition() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     ConfigurationInterface* configuration_; |     ConfigurationInterface* configuration_; | ||||||
|     //pcps_acquisition_sptr acquisition_; |     //pcps_acquisition_sptr acquisition_; | ||||||
|   | |||||||
| @@ -40,6 +40,10 @@ | |||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GalileoE1PcpsCccwsrAmbiguousAcquisition::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| GalileoE1PcpsCccwsrAmbiguousAcquisition::GalileoE1PcpsCccwsrAmbiguousAcquisition( | GalileoE1PcpsCccwsrAmbiguousAcquisition::GalileoE1PcpsCccwsrAmbiguousAcquisition( | ||||||
|     ConfigurationInterface* configuration, std::string role, |     ConfigurationInterface* configuration, std::string role, | ||||||
|     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) |     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
|   | |||||||
| @@ -125,6 +125,11 @@ public: | |||||||
|      */ |      */ | ||||||
|     void set_state(int state) override; |     void set_state(int state) override; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running acquisition | ||||||
|  |      */ | ||||||
|  |     void stop_acquisition() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     ConfigurationInterface* configuration_; |     ConfigurationInterface* configuration_; | ||||||
|     pcps_cccwsr_acquisition_cc_sptr acquisition_cc_; |     pcps_cccwsr_acquisition_cc_sptr acquisition_cc_; | ||||||
|   | |||||||
| @@ -40,6 +40,10 @@ | |||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GalileoE1PcpsQuickSyncAmbiguousAcquisition::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| GalileoE1PcpsQuickSyncAmbiguousAcquisition::GalileoE1PcpsQuickSyncAmbiguousAcquisition( | GalileoE1PcpsQuickSyncAmbiguousAcquisition::GalileoE1PcpsQuickSyncAmbiguousAcquisition( | ||||||
|     ConfigurationInterface* configuration, std::string role, |     ConfigurationInterface* configuration, std::string role, | ||||||
|     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) |     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
|   | |||||||
| @@ -129,6 +129,11 @@ public: | |||||||
|      */ |      */ | ||||||
|     void set_state(int state) override; |     void set_state(int state) override; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running acquisition | ||||||
|  |      */ | ||||||
|  |     void stop_acquisition() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     ConfigurationInterface* configuration_; |     ConfigurationInterface* configuration_; | ||||||
|     pcps_quicksync_acquisition_cc_sptr acquisition_cc_; |     pcps_quicksync_acquisition_cc_sptr acquisition_cc_; | ||||||
|   | |||||||
| @@ -40,6 +40,10 @@ | |||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GalileoE1PcpsTongAmbiguousAcquisition::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| GalileoE1PcpsTongAmbiguousAcquisition::GalileoE1PcpsTongAmbiguousAcquisition( | GalileoE1PcpsTongAmbiguousAcquisition::GalileoE1PcpsTongAmbiguousAcquisition( | ||||||
|     ConfigurationInterface* configuration, std::string role, |     ConfigurationInterface* configuration, std::string role, | ||||||
|     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) |     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
|   | |||||||
| @@ -128,6 +128,11 @@ public: | |||||||
|      */ |      */ | ||||||
|     void set_state(int state) override; |     void set_state(int state) override; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running acquisition | ||||||
|  |      */ | ||||||
|  |     void stop_acquisition() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     ConfigurationInterface* configuration_; |     ConfigurationInterface* configuration_; | ||||||
|     pcps_tong_acquisition_cc_sptr acquisition_cc_; |     pcps_tong_acquisition_cc_sptr acquisition_cc_; | ||||||
|   | |||||||
| @@ -46,6 +46,10 @@ | |||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GalileoE5aNoncoherentIQAcquisitionCaf::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| GalileoE5aNoncoherentIQAcquisitionCaf::GalileoE5aNoncoherentIQAcquisitionCaf( | GalileoE5aNoncoherentIQAcquisitionCaf::GalileoE5aNoncoherentIQAcquisitionCaf( | ||||||
|     ConfigurationInterface* configuration, std::string role, |     ConfigurationInterface* configuration, std::string role, | ||||||
|     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) |     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
|   | |||||||
| @@ -131,6 +131,11 @@ public: | |||||||
|      */ |      */ | ||||||
|     void set_state(int state) override; |     void set_state(int state) override; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running acquisition | ||||||
|  |      */ | ||||||
|  |     void stop_acquisition() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     ConfigurationInterface* configuration_; |     ConfigurationInterface* configuration_; | ||||||
|     galileo_e5a_noncoherentIQ_acquisition_caf_cc_sptr acquisition_cc_; |     galileo_e5a_noncoherentIQ_acquisition_caf_cc_sptr acquisition_cc_; | ||||||
|   | |||||||
| @@ -42,13 +42,17 @@ | |||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GalileoE5aPcpsAcquisition::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| GalileoE5aPcpsAcquisition::GalileoE5aPcpsAcquisition(ConfigurationInterface* configuration, | GalileoE5aPcpsAcquisition::GalileoE5aPcpsAcquisition(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 role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
| { | { | ||||||
|     Acq_Conf acq_parameters = Acq_Conf(); |     Acq_Conf acq_parameters = Acq_Conf(); | ||||||
|     configuration_ = configuration; |     configuration_ = configuration; | ||||||
|     std::string default_item_type = "gr_complex"; |     std::string default_item_type = "gr_complex"; | ||||||
|     std::string default_dump_filename = "../data/acquisition.dat"; |     std::string default_dump_filename = "./acquisition.mat"; | ||||||
|  |  | ||||||
|     DLOG(INFO) << "Role " << role; |     DLOG(INFO) << "Role " << role; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -122,6 +122,11 @@ public: | |||||||
|      */ |      */ | ||||||
|     void set_state(int state) override; |     void set_state(int state) override; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running acquisition | ||||||
|  |      */ | ||||||
|  |     void stop_acquisition() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     float calculate_threshold(float pfa); |     float calculate_threshold(float pfa); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -39,15 +39,16 @@ | |||||||
| #include <volk_gnsssdr/volk_gnsssdr_complex.h> | #include <volk_gnsssdr/volk_gnsssdr_complex.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GalileoE5aPcpsAcquisitionFpga::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(ConfigurationInterface* configuration, | GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(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 role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
| { | { | ||||||
| 	//printf("creating the E5A acquisition"); |     //printf("creating the E5A acquisition"); | ||||||
|     pcpsconf_fpga_t acq_parameters; |     pcpsconf_fpga_t acq_parameters; | ||||||
|     configuration_ = configuration; |     configuration_ = configuration; | ||||||
|     std::string default_item_type = "cshort"; |     std::string default_item_type = "cshort"; | ||||||
| @@ -109,7 +110,7 @@ GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(ConfigurationInterf | |||||||
|     std::string default_device_name = "/dev/uio0"; |     std::string default_device_name = "/dev/uio0"; | ||||||
|     std::string device_name = configuration_->property(role + ".devicename", default_device_name); |     std::string device_name = configuration_->property(role + ".devicename", default_device_name); | ||||||
|     acq_parameters.device_name = device_name; |     acq_parameters.device_name = device_name; | ||||||
|     acq_parameters.samples_per_ms = nsamples_total/sampled_ms; |     acq_parameters.samples_per_ms = nsamples_total / sampled_ms; | ||||||
|     acq_parameters.samples_per_code = nsamples_total; |     acq_parameters.samples_per_code = nsamples_total; | ||||||
|  |  | ||||||
|     //vector_length_ = code_length_ * sampled_ms_; |     //vector_length_ = code_length_ * sampled_ms_; | ||||||
| @@ -117,10 +118,10 @@ GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(ConfigurationInterf | |||||||
|     // compute all the GALILEO E5 PRN Codes (this is done only once upon the class constructor in order to avoid re-computing the PRN codes every time |     // compute all the GALILEO E5 PRN Codes (this is done only once upon the class constructor in order to avoid re-computing the PRN codes every time | ||||||
|     // a channel is assigned) |     // a channel is assigned) | ||||||
|     gr::fft::fft_complex* fft_if = new gr::fft::fft_complex(nsamples_total, true);  // Direct FFT |     gr::fft::fft_complex* fft_if = new gr::fft::fft_complex(nsamples_total, true);  // Direct FFT | ||||||
|     std::complex<float>* code = new std::complex<float>[nsamples_total];  // buffer for the local code |     std::complex<float>* code = new std::complex<float>[nsamples_total];            // buffer for the local code | ||||||
|     gr_complex* fft_codes_padded = static_cast<gr_complex*>(volk_gnsssdr_malloc(nsamples_total * sizeof(gr_complex), volk_gnsssdr_get_alignment())); |     gr_complex* fft_codes_padded = static_cast<gr_complex*>(volk_gnsssdr_malloc(nsamples_total * sizeof(gr_complex), volk_gnsssdr_get_alignment())); | ||||||
|     d_all_fft_codes_ = new lv_16sc_t[nsamples_total * Galileo_E5a_NUMBER_OF_CODES];  // memory containing all the possible fft codes for PRN 0 to 32 |     d_all_fft_codes_ = new lv_16sc_t[nsamples_total * Galileo_E5a_NUMBER_OF_CODES];  // memory containing all the possible fft codes for PRN 0 to 32 | ||||||
|     float max;                                                        // temporary maxima search |     float max;                                                                       // temporary maxima search | ||||||
|  |  | ||||||
|     //printf("creating the E5A acquisition CONT"); |     //printf("creating the E5A acquisition CONT"); | ||||||
|     //printf("nsamples_total = %d\n", nsamples_total); |     //printf("nsamples_total = %d\n", nsamples_total); | ||||||
| @@ -155,16 +156,16 @@ GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(ConfigurationInterf | |||||||
|             // fill in zero padding |             // fill in zero padding | ||||||
|             for (int s = 2*code_length; s < nsamples_total; s++) |             for (int s = 2*code_length; s < nsamples_total; s++) | ||||||
|                 { |                 { | ||||||
|                     code[s] = std::complex<float>(static_cast<float>(0,0)); |                     code[s] = std::complex<float>(static_cast<float>(0, 0)); | ||||||
|                     //code[s] = 0; |                     //code[s] = 0; | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|             memcpy(fft_if->get_inbuf(), code, sizeof(gr_complex) * nsamples_total);   // copy to FFT buffer |             memcpy(fft_if->get_inbuf(), code, sizeof(gr_complex) * nsamples_total);            // copy to FFT buffer | ||||||
|             fft_if->execute();                                                                 // Run the FFT of local code |             fft_if->execute();                                                                 // Run the FFT of local code | ||||||
|             volk_32fc_conjugate_32fc(fft_codes_padded, fft_if->get_outbuf(), nsamples_total);  // conjugate values |             volk_32fc_conjugate_32fc(fft_codes_padded, fft_if->get_outbuf(), nsamples_total);  // conjugate values | ||||||
|  |  | ||||||
|             max = 0;                                                                           // initialize maximum value |             max = 0;                                           // initialize maximum value | ||||||
|             for (unsigned int i = 0; i < nsamples_total; i++)                                  // search for maxima |             for (unsigned int i = 0; i < nsamples_total; i++)  // search for maxima | ||||||
|                 { |                 { | ||||||
|                     if (std::abs(fft_codes_padded[i].real()) > max) |                     if (std::abs(fft_codes_padded[i].real()) > max) | ||||||
|                         { |                         { | ||||||
| @@ -180,7 +181,6 @@ GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(ConfigurationInterf | |||||||
|                     d_all_fft_codes_[i + nsamples_total * (PRN - 1)] = lv_16sc_t(static_cast<int>(floor(fft_codes_padded[i].real() * (pow(2, 5) - 1) / max)), |                     d_all_fft_codes_[i + nsamples_total * (PRN - 1)] = lv_16sc_t(static_cast<int>(floor(fft_codes_padded[i].real() * (pow(2, 5) - 1) / max)), | ||||||
|                         static_cast<int>(floor(fft_codes_padded[i].imag() * (pow(2, 5) - 1) / max))); |                         static_cast<int>(floor(fft_codes_padded[i].imag() * (pow(2, 5) - 1) / max))); | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -193,19 +193,19 @@ GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(ConfigurationInterf | |||||||
|  |  | ||||||
|     //code_ = new gr_complex[vector_length_]; |     //code_ = new gr_complex[vector_length_]; | ||||||
|  |  | ||||||
| //    if (item_type_.compare("gr_complex") == 0) |     //    if (item_type_.compare("gr_complex") == 0) | ||||||
| //        { |     //        { | ||||||
| //            item_size_ = sizeof(gr_complex); |     //            item_size_ = sizeof(gr_complex); | ||||||
| //        } |     //        } | ||||||
| //    else if (item_type_.compare("cshort") == 0) |     //    else if (item_type_.compare("cshort") == 0) | ||||||
| //        { |     //        { | ||||||
| //            item_size_ = sizeof(lv_16sc_t); |     //            item_size_ = sizeof(lv_16sc_t); | ||||||
| //        } |     //        } | ||||||
| //    else |     //    else | ||||||
| //        { |     //        { | ||||||
| //            item_size_ = sizeof(gr_complex); |     //            item_size_ = sizeof(gr_complex); | ||||||
| //            LOG(WARNING) << item_type_ << " unknown acquisition item type"; |     //            LOG(WARNING) << item_type_ << " unknown acquisition item type"; | ||||||
| //        } |     //        } | ||||||
|     //acq_parameters.it_size = item_size_; |     //acq_parameters.it_size = item_size_; | ||||||
|     //acq_parameters.samples_per_code = code_length_; |     //acq_parameters.samples_per_code = code_length_; | ||||||
|     //acq_parameters.samples_per_ms = code_length_; |     //acq_parameters.samples_per_ms = code_length_; | ||||||
| @@ -248,22 +248,22 @@ void GalileoE5aPcpsAcquisitionFpga::set_channel(unsigned int channel) | |||||||
|  |  | ||||||
| void GalileoE5aPcpsAcquisitionFpga::set_threshold(float threshold) | void GalileoE5aPcpsAcquisitionFpga::set_threshold(float threshold) | ||||||
| { | { | ||||||
| //    float pfa = configuration_->property(role_ + boost::lexical_cast<std::string>(channel_) + ".pfa", 0.0); |     //    float pfa = configuration_->property(role_ + boost::lexical_cast<std::string>(channel_) + ".pfa", 0.0); | ||||||
| // |     // | ||||||
| //    if (pfa == 0.0) |     //    if (pfa == 0.0) | ||||||
| //        { |     //        { | ||||||
| //            pfa = configuration_->property(role_ + ".pfa", 0.0); |     //            pfa = configuration_->property(role_ + ".pfa", 0.0); | ||||||
| //        } |     //        } | ||||||
| // |     // | ||||||
| //    if (pfa == 0.0) |     //    if (pfa == 0.0) | ||||||
| //        { |     //        { | ||||||
| //            threshold_ = threshold; |     //            threshold_ = threshold; | ||||||
| //        } |     //        } | ||||||
| // |     // | ||||||
| //    else |     //    else | ||||||
| //        { |     //        { | ||||||
| //            threshold_ = calculate_threshold(pfa); |     //            threshold_ = calculate_threshold(pfa); | ||||||
| //        } |     //        } | ||||||
|  |  | ||||||
|     DLOG(INFO) << "Channel " << channel_ << " Threshold = " << threshold; |     DLOG(INFO) << "Channel " << channel_ << " Threshold = " << threshold; | ||||||
|  |  | ||||||
| @@ -312,32 +312,32 @@ void GalileoE5aPcpsAcquisitionFpga::init() | |||||||
|  |  | ||||||
| void GalileoE5aPcpsAcquisitionFpga::set_local_code() | void GalileoE5aPcpsAcquisitionFpga::set_local_code() | ||||||
| { | { | ||||||
| //    gr_complex* code = new gr_complex[code_length_]; |     //    gr_complex* code = new gr_complex[code_length_]; | ||||||
| //    char signal_[3]; |     //    char signal_[3]; | ||||||
| // |     // | ||||||
| //    if (acq_iq_) |     //    if (acq_iq_) | ||||||
| //        { |     //        { | ||||||
| //            strcpy(signal_, "5X"); |     //            strcpy(signal_, "5X"); | ||||||
| //        } |     //        } | ||||||
| //    else if (acq_pilot_) |     //    else if (acq_pilot_) | ||||||
| //        { |     //        { | ||||||
| //            strcpy(signal_, "5Q"); |     //            strcpy(signal_, "5Q"); | ||||||
| //        } |     //        } | ||||||
| //    else |     //    else | ||||||
| //        { |     //        { | ||||||
| //            strcpy(signal_, "5I"); |     //            strcpy(signal_, "5I"); | ||||||
| //        } |     //        } | ||||||
| // |     // | ||||||
| //    galileo_e5_a_code_gen_complex_sampled(code, signal_, gnss_synchro_->PRN, fs_in_, 0); |     //    galileo_e5_a_code_gen_complex_sampled(code, signal_, gnss_synchro_->PRN, fs_in_, 0); | ||||||
| // |     // | ||||||
| //    for (unsigned int i = 0; i < sampled_ms_; i++) |     //    for (unsigned int i = 0; i < sampled_ms_; i++) | ||||||
| //        { |     //        { | ||||||
| //            memcpy(code_ + (i * code_length_), code, sizeof(gr_complex) * code_length_); |     //            memcpy(code_ + (i * code_length_), code, sizeof(gr_complex) * code_length_); | ||||||
| //        } |     //        } | ||||||
|  |  | ||||||
|     //acquisition_->set_local_code(code_); |     //acquisition_->set_local_code(code_); | ||||||
|     acquisition_fpga_->set_local_code(); |     acquisition_fpga_->set_local_code(); | ||||||
| //    delete[] code; |     //    delete[] code; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -400,35 +400,35 @@ void GalileoE5aPcpsAcquisitionFpga::read_fpga_total_scale_factor(uint32_t *total | |||||||
|  |  | ||||||
| void GalileoE5aPcpsAcquisitionFpga::connect(gr::top_block_sptr top_block) | void GalileoE5aPcpsAcquisitionFpga::connect(gr::top_block_sptr top_block) | ||||||
| { | { | ||||||
| //    if (item_type_.compare("gr_complex") == 0) |     //    if (item_type_.compare("gr_complex") == 0) | ||||||
| //        { |     //        { | ||||||
| //            top_block->connect(stream_to_vector_, 0, acquisition_, 0); |     //            top_block->connect(stream_to_vector_, 0, acquisition_, 0); | ||||||
| //        } |     //        } | ||||||
| //    else if (item_type_.compare("cshort") == 0) |     //    else if (item_type_.compare("cshort") == 0) | ||||||
| //        { |     //        { | ||||||
| //            top_block->connect(stream_to_vector_, 0, acquisition_, 0); |     //            top_block->connect(stream_to_vector_, 0, acquisition_, 0); | ||||||
| //        } |     //        } | ||||||
| //    else |     //    else | ||||||
| //        { |     //        { | ||||||
| //            LOG(WARNING) << item_type_ << " unknown acquisition item type"; |     //            LOG(WARNING) << item_type_ << " unknown acquisition item type"; | ||||||
| //        } |     //        } | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void GalileoE5aPcpsAcquisitionFpga::disconnect(gr::top_block_sptr top_block) | void GalileoE5aPcpsAcquisitionFpga::disconnect(gr::top_block_sptr top_block) | ||||||
| { | { | ||||||
| //    if (item_type_.compare("gr_complex") == 0) |     //    if (item_type_.compare("gr_complex") == 0) | ||||||
| //        { |     //        { | ||||||
| //            top_block->disconnect(stream_to_vector_, 0, acquisition_, 0); |     //            top_block->disconnect(stream_to_vector_, 0, acquisition_, 0); | ||||||
| //        } |     //        } | ||||||
| //    else if (item_type_.compare("cshort") == 0) |     //    else if (item_type_.compare("cshort") == 0) | ||||||
| //        { |     //        { | ||||||
| //            top_block->disconnect(stream_to_vector_, 0, acquisition_, 0); |     //            top_block->disconnect(stream_to_vector_, 0, acquisition_, 0); | ||||||
| //        } |     //        } | ||||||
| //    else |     //    else | ||||||
| //        { |     //        { | ||||||
| //            LOG(WARNING) << item_type_ << " unknown acquisition item type"; |     //            LOG(WARNING) << item_type_ << " unknown acquisition item type"; | ||||||
| //        } |     //        } | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -144,6 +144,11 @@ public: | |||||||
|      */ |      */ | ||||||
|     void read_fpga_total_scale_factor(uint32_t *total_scale_factor, uint32_t *fw_scale_factor); |     void read_fpga_total_scale_factor(uint32_t *total_scale_factor, uint32_t *fw_scale_factor); | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running acquisition | ||||||
|  |      */ | ||||||
|  |     void stop_acquisition() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     //float calculate_threshold(float pfa); |     //float calculate_threshold(float pfa); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -43,6 +43,10 @@ | |||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GlonassL1CaPcpsAcquisition::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| GlonassL1CaPcpsAcquisition::GlonassL1CaPcpsAcquisition( | GlonassL1CaPcpsAcquisition::GlonassL1CaPcpsAcquisition( | ||||||
|     ConfigurationInterface* configuration, std::string role, |     ConfigurationInterface* configuration, std::string role, | ||||||
|     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) |     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
|   | |||||||
| @@ -131,6 +131,11 @@ public: | |||||||
|      */ |      */ | ||||||
|     void set_state(int state) override; |     void set_state(int state) override; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running acquisition | ||||||
|  |      */ | ||||||
|  |     void stop_acquisition() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     ConfigurationInterface* configuration_; |     ConfigurationInterface* configuration_; | ||||||
|     pcps_acquisition_sptr acquisition_; |     pcps_acquisition_sptr acquisition_; | ||||||
|   | |||||||
| @@ -42,6 +42,10 @@ | |||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GlonassL2CaPcpsAcquisition::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| GlonassL2CaPcpsAcquisition::GlonassL2CaPcpsAcquisition( | GlonassL2CaPcpsAcquisition::GlonassL2CaPcpsAcquisition( | ||||||
|     ConfigurationInterface* configuration, std::string role, |     ConfigurationInterface* configuration, std::string role, | ||||||
|     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) |     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
|   | |||||||
| @@ -130,6 +130,11 @@ public: | |||||||
|      */ |      */ | ||||||
|     void set_state(int state) override; |     void set_state(int state) override; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running acquisition | ||||||
|  |      */ | ||||||
|  |     void stop_acquisition() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     ConfigurationInterface* configuration_; |     ConfigurationInterface* configuration_; | ||||||
|     pcps_acquisition_sptr acquisition_; |     pcps_acquisition_sptr acquisition_; | ||||||
|   | |||||||
| @@ -45,6 +45,10 @@ | |||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GpsL1CaPcpsAcquisition::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| GpsL1CaPcpsAcquisition::GpsL1CaPcpsAcquisition( | GpsL1CaPcpsAcquisition::GpsL1CaPcpsAcquisition( | ||||||
|     ConfigurationInterface* configuration, std::string role, |     ConfigurationInterface* configuration, std::string role, | ||||||
|     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) |     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
| @@ -52,7 +56,7 @@ GpsL1CaPcpsAcquisition::GpsL1CaPcpsAcquisition( | |||||||
|     Acq_Conf acq_parameters = Acq_Conf(); |     Acq_Conf acq_parameters = Acq_Conf(); | ||||||
|     configuration_ = configuration; |     configuration_ = configuration; | ||||||
|     std::string default_item_type = "gr_complex"; |     std::string default_item_type = "gr_complex"; | ||||||
|     std::string default_dump_filename = "./data/acquisition.dat"; |     std::string default_dump_filename = "./acquisition.mat"; | ||||||
|  |  | ||||||
|     DLOG(INFO) << "role " << role; |     DLOG(INFO) << "role " << role; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -135,6 +135,11 @@ public: | |||||||
|      */ |      */ | ||||||
|     void set_state(int state) override; |     void set_state(int state) override; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running acquisition | ||||||
|  |      */ | ||||||
|  |     void stop_acquisition() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     ConfigurationInterface* configuration_; |     ConfigurationInterface* configuration_; | ||||||
|     pcps_acquisition_sptr acquisition_; |     pcps_acquisition_sptr acquisition_; | ||||||
|   | |||||||
| @@ -42,12 +42,16 @@ | |||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GpsL1CaPcpsAcquisitionFineDoppler::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| GpsL1CaPcpsAcquisitionFineDoppler::GpsL1CaPcpsAcquisitionFineDoppler( | GpsL1CaPcpsAcquisitionFineDoppler::GpsL1CaPcpsAcquisitionFineDoppler( | ||||||
|     ConfigurationInterface* configuration, std::string role, |     ConfigurationInterface* configuration, std::string role, | ||||||
|     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) |     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_item_type = "gr_complex"; | ||||||
|     std::string default_dump_filename = "./data/acquisition.dat"; |     std::string default_dump_filename = "./acquisition.mat"; | ||||||
|  |  | ||||||
|     DLOG(INFO) << "role " << role; |     DLOG(INFO) << "role " << role; | ||||||
|     Acq_Conf acq_parameters = Acq_Conf(); |     Acq_Conf acq_parameters = Acq_Conf(); | ||||||
|   | |||||||
| @@ -126,6 +126,11 @@ public: | |||||||
|      */ |      */ | ||||||
|     void set_state(int state) override; |     void set_state(int state) override; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running acquisition | ||||||
|  |      */ | ||||||
|  |     void stop_acquisition() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     pcps_acquisition_fine_doppler_cc_sptr acquisition_cc_; |     pcps_acquisition_fine_doppler_cc_sptr acquisition_cc_; | ||||||
|     size_t item_size_; |     size_t item_size_; | ||||||
|   | |||||||
| @@ -48,6 +48,10 @@ | |||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GpsL1CaPcpsAcquisitionFpga::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| GpsL1CaPcpsAcquisitionFpga::GpsL1CaPcpsAcquisitionFpga( | GpsL1CaPcpsAcquisitionFpga::GpsL1CaPcpsAcquisitionFpga( | ||||||
|     ConfigurationInterface* configuration, std::string role, |     ConfigurationInterface* configuration, std::string role, | ||||||
|     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) |     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
|   | |||||||
| @@ -154,6 +154,11 @@ public: | |||||||
|      */ |      */ | ||||||
|     void read_fpga_total_scale_factor(uint32_t *total_scale_factor, uint32_t *fw_scale_factor); |     void read_fpga_total_scale_factor(uint32_t *total_scale_factor, uint32_t *fw_scale_factor); | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running acquisition | ||||||
|  |      */ | ||||||
|  |     void stop_acquisition() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     ConfigurationInterface* configuration_; |     ConfigurationInterface* configuration_; | ||||||
|     pcps_acquisition_fpga_sptr acquisition_fpga_; |     pcps_acquisition_fpga_sptr acquisition_fpga_; | ||||||
|   | |||||||
| @@ -42,6 +42,10 @@ | |||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GpsL1CaPcpsAssistedAcquisition::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| GpsL1CaPcpsAssistedAcquisition::GpsL1CaPcpsAssistedAcquisition( | GpsL1CaPcpsAssistedAcquisition::GpsL1CaPcpsAssistedAcquisition( | ||||||
|     ConfigurationInterface* configuration, std::string role, |     ConfigurationInterface* configuration, std::string role, | ||||||
|     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) |     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
|   | |||||||
| @@ -122,6 +122,11 @@ public: | |||||||
|     void reset() override; |     void reset() override; | ||||||
|     void set_state(int state __attribute__((unused))) override{}; |     void set_state(int state __attribute__((unused))) override{}; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running acquisition | ||||||
|  |      */ | ||||||
|  |     void stop_acquisition() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     pcps_assisted_acquisition_cc_sptr acquisition_cc_; |     pcps_assisted_acquisition_cc_sptr acquisition_cc_; | ||||||
|     size_t item_size_; |     size_t item_size_; | ||||||
|   | |||||||
| @@ -40,6 +40,10 @@ | |||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GpsL1CaPcpsOpenClAcquisition::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| GpsL1CaPcpsOpenClAcquisition::GpsL1CaPcpsOpenClAcquisition( | GpsL1CaPcpsOpenClAcquisition::GpsL1CaPcpsOpenClAcquisition( | ||||||
|     ConfigurationInterface* configuration, std::string role, |     ConfigurationInterface* configuration, std::string role, | ||||||
|     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) |     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
|   | |||||||
| @@ -124,6 +124,11 @@ public: | |||||||
|     void reset() override; |     void reset() override; | ||||||
|     void set_state(int state __attribute__((unused))) override{}; |     void set_state(int state __attribute__((unused))) override{}; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running acquisition | ||||||
|  |      */ | ||||||
|  |     void stop_acquisition() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     ConfigurationInterface* configuration_; |     ConfigurationInterface* configuration_; | ||||||
|     pcps_opencl_acquisition_cc_sptr acquisition_cc_; |     pcps_opencl_acquisition_cc_sptr acquisition_cc_; | ||||||
|   | |||||||
| @@ -41,6 +41,10 @@ | |||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GpsL1CaPcpsQuickSyncAcquisition::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| GpsL1CaPcpsQuickSyncAcquisition::GpsL1CaPcpsQuickSyncAcquisition( | GpsL1CaPcpsQuickSyncAcquisition::GpsL1CaPcpsQuickSyncAcquisition( | ||||||
|     ConfigurationInterface* configuration, std::string role, |     ConfigurationInterface* configuration, std::string role, | ||||||
|     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) |     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
|   | |||||||
| @@ -130,6 +130,11 @@ public: | |||||||
|      */ |      */ | ||||||
|     void set_state(int state) override; |     void set_state(int state) override; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running acquisition | ||||||
|  |      */ | ||||||
|  |     void stop_acquisition() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     ConfigurationInterface* configuration_; |     ConfigurationInterface* configuration_; | ||||||
|     pcps_quicksync_acquisition_cc_sptr acquisition_cc_; |     pcps_quicksync_acquisition_cc_sptr acquisition_cc_; | ||||||
|   | |||||||
| @@ -40,6 +40,10 @@ | |||||||
|  |  | ||||||
| using google::LogMessage; | using google::LogMessage; | ||||||
|  |  | ||||||
|  | void GpsL1CaPcpsTongAcquisition::stop_acquisition() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| GpsL1CaPcpsTongAcquisition::GpsL1CaPcpsTongAcquisition( | GpsL1CaPcpsTongAcquisition::GpsL1CaPcpsTongAcquisition( | ||||||
|     ConfigurationInterface* configuration, std::string role, |     ConfigurationInterface* configuration, std::string role, | ||||||
|     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) |     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
|   | |||||||
| @@ -129,6 +129,11 @@ public: | |||||||
|      */ |      */ | ||||||
|     void set_state(int state) override; |     void set_state(int state) override; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running acquisition | ||||||
|  |      */ | ||||||
|  |     void stop_acquisition() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     ConfigurationInterface* configuration_; |     ConfigurationInterface* configuration_; | ||||||
|     pcps_tong_acquisition_cc_sptr acquisition_cc_; |     pcps_tong_acquisition_cc_sptr acquisition_cc_; | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	 Marc Majoral
					Marc Majoral