mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-29 22:42:59 +00:00 
			
		
		
		
	Merge branch 'protobuf' into next
This commit is contained in:
		
							
								
								
									
										127
									
								
								CMakeLists.txt
									
									
									
									
									
								
							
							
						
						
									
										127
									
								
								CMakeLists.txt
									
									
									
									
									
								
							| @@ -402,6 +402,7 @@ set(GNSSSDR_PYTHON3_MIN_VERSION "3.4") | ||||
| set(GNSSSDR_MAKO_MIN_VERSION "0.4.2") | ||||
| set(GNSSSDR_ARMADILLO_MIN_VERSION "5.300.0") | ||||
| set(GNSSSDR_MATIO_MIN_VERSION "1.5.3") | ||||
| set(GNSSSDR_PROTOBUF_MIN_VERSION "3.0.0") | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -416,6 +417,7 @@ set(GNSSSDR_GNSS_SIM_LOCAL_VERSION "master") | ||||
| set(GNSSSDR_GPSTK_LOCAL_VERSION "2.10.6") | ||||
| set(GNSSSDR_MATIO_LOCAL_VERSION "1.5.14") | ||||
| set(GNSSSDR_PUGIXML_LOCAL_VERSION "1.9") | ||||
| set(GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION "3.7.1") | ||||
|  | ||||
| if(CMAKE_VERSION VERSION_LESS "3.0.2") # Fix for CentOS 7 | ||||
|     set(GNSSSDR_GFLAGS_LOCAL_VERSION "2.2.1") | ||||
| @@ -1784,6 +1786,131 @@ endif() | ||||
|  | ||||
|  | ||||
|  | ||||
| ################################################################################ | ||||
| # Protocol Buffers https://github.com/protocolbuffers/protobuf | ||||
| ################################################################################ | ||||
| set(Protobuf_VERSION "0.0.0") | ||||
| find_package(Protobuf) | ||||
| set_package_properties(Protobuf PROPERTIES | ||||
|     URL "https://developers.google.com/protocol-buffers/" | ||||
|     DESCRIPTION "A language-neutral, platform-neutral extensible mechanism for serializing structured data" | ||||
|     PURPOSE "Used to serialize output data in a way that can be read by other applications." | ||||
|     TYPE REQUIRED | ||||
| ) | ||||
| if(Protobuf_FOUND AND CMAKE_VERSION VERSION_LESS 3.9) | ||||
|     add_library(protobuf::libprotobuf SHARED IMPORTED) | ||||
|     set_target_properties(protobuf::libprotobuf PROPERTIES | ||||
|         IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" | ||||
|         IMPORTED_LOCATION "${Protobuf_LIBRARY}" | ||||
|         INTERFACE_INCLUDE_DIRECTORIES "${Protobuf_INCLUDE_DIR}" | ||||
|         INTERFACE_LINK_LIBRARIES "${Protobuf_LIBRARY}" | ||||
|     ) | ||||
|     add_executable(protobuf::protoc IMPORTED) | ||||
|     set_target_properties(protobuf::protoc PROPERTIES | ||||
|         IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" | ||||
|         IMPORTED_LOCATION "${Protobuf_PROTOC_EXECUTABLE}" | ||||
|         INTERFACE_LINK_LIBRARIES "${Protobuf_PROTOC_LIBRARY}" | ||||
|     ) | ||||
| endif() | ||||
| if(Protobuf_FOUND AND CMAKE_CROSSCOMPILING) | ||||
|     find_program(PROTOC_EXECUTABLE protoc | ||||
|         HINTS | ||||
|         /usr/local/bin/ | ||||
|         /usr/bin/ | ||||
|         NO_SYSTEM_ENVIRONMENT_PATH | ||||
|     ) | ||||
|     if(PROTOC_EXECUTABLE) | ||||
|         set_target_properties(protobuf::protoc PROPERTIES | ||||
|             IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" | ||||
|             IMPORTED_LOCATION ${PROTOC_EXECUTABLE} | ||||
|         ) | ||||
|     else() | ||||
|         message(FATAL ERROR "Please install the Protocol Buffers compiter v{${Protobuf_VERSION}} in the host machine") | ||||
|     endif() | ||||
| endif() | ||||
| if((NOT Protobuf_FOUND) OR (NOT Protobuf_PROTOC_EXECUTABLE) OR (${Protobuf_VERSION} VERSION_LESS ${GNSSSDR_PROTOBUF_MIN_VERSION})) | ||||
|     unset(Protobuf_PROTOC_EXECUTABLE) | ||||
|     if(CMAKE_CROSSCOMPILING) | ||||
|         if(NOT Protobuf_FOUND) | ||||
|             ExternalProject_Add(protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} | ||||
|                 PREFIX ${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} | ||||
|                 GIT_REPOSITORY https://github.com/protocolbuffers/protobuf | ||||
|                 GIT_TAG v${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} | ||||
|                 SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/protobuf/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} | ||||
|                 BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} | ||||
|                 UPDATE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/protobuf/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/autogen.sh | ||||
|                 CONFIGURE_COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/protobuf/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/configure --prefix=${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} --host=$ENV{OECORE_TARGET_ARCH} --with-protoc=${PROTOC_EXECUTABLE}" | ||||
|                 BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} | ||||
|                 INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install | ||||
|                 BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/lib/${CMAKE_FIND_LIBRARY_PREFIXES}protobuf${CMAKE_STATIC_LIBRARY_SUFFIX} | ||||
|                 ${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/bin/protoc | ||||
|             ) | ||||
|         endif() | ||||
|     else() | ||||
|         if(CMAKE_VERSION VERSION_LESS 3.2) | ||||
|             ExternalProject_Add(protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} | ||||
|                 PREFIX ${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} | ||||
|                 GIT_REPOSITORY https://github.com/protocolbuffers/protobuf | ||||
|                 GIT_TAG v${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} | ||||
|                 SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/protobuf/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} | ||||
|                 BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} | ||||
|                 UPDATE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/protobuf/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/autogen.sh | ||||
|                 CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/protobuf/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/configure --prefix=${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} | ||||
|                 BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} | ||||
|                 INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install | ||||
|             ) | ||||
|         else() | ||||
|             ExternalProject_Add(protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} | ||||
|                 PREFIX ${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} | ||||
|                 GIT_REPOSITORY https://github.com/protocolbuffers/protobuf | ||||
|                 GIT_TAG v${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} | ||||
|                 SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/protobuf/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} | ||||
|                 BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} | ||||
|                 UPDATE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/protobuf/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/autogen.sh | ||||
|                 CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/protobuf/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/configure --prefix=${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} | ||||
|                 BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} | ||||
|                 INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install | ||||
|                 BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/lib/${CMAKE_FIND_LIBRARY_PREFIXES}protobuf${CMAKE_STATIC_LIBRARY_SUFFIX} | ||||
|                 ${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/bin/protoc | ||||
|             ) | ||||
|         endif() | ||||
|  | ||||
|         if(NOT TARGET protobuf::protoc) | ||||
|             add_executable(protobuf::protoc IMPORTED) | ||||
|             add_dependencies(protobuf::protoc protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}) | ||||
|         endif() | ||||
|         unset(Protobuf_PROTOC_EXECUTABLE) | ||||
|         set(PROTOBUF_PROTOC_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/bin/protoc") | ||||
|         set_target_properties(protobuf::protoc PROPERTIES | ||||
|             IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" | ||||
|             IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/bin/protoc" | ||||
|             INTERFACE_LINK_LIBRARIES "${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/lib/${CMAKE_FIND_LIBRARY_PREFIXES}protoc${CMAKE_STATIC_LIBRARY_SUFFIX}" | ||||
|         ) | ||||
|     endif() | ||||
|     file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/include) | ||||
|     if(NOT TARGET protobuf::libprotobuf) | ||||
|         add_library(protobuf::libprotobuf STATIC IMPORTED) | ||||
|         add_dependencies(protobuf::libprotobuf protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}) | ||||
|     endif() | ||||
|     set_target_properties(protobuf::libprotobuf PROPERTIES | ||||
|         IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" | ||||
|         IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/lib/${CMAKE_FIND_LIBRARY_PREFIXES}protobuf${CMAKE_STATIC_LIBRARY_SUFFIX}" | ||||
|         INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/include" | ||||
|         INTERFACE_LINK_LIBRARIES "${CMAKE_CURRENT_BINARY_DIR}/protobuf-${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION}/lib/${CMAKE_FIND_LIBRARY_PREFIXES}protobuf${CMAKE_STATIC_LIBRARY_SUFFIX}" | ||||
|     ) | ||||
|  | ||||
|     if(${Protobuf_VERSION} VERSION_LESS ${GNSSSDR_PROTOBUF_MIN_VERSION}) | ||||
|         set_package_properties(Protobuf PROPERTIES | ||||
|             PURPOSE "Protocol Buffers found (v${Protobuf_VERSION}) is too old (> v${GNSSSDR_PROTOBUF_MIN_VERSION} needed)." | ||||
|         ) | ||||
|     endif() | ||||
|     set_package_properties(Protobuf PROPERTIES | ||||
|         PURPOSE "Protocol Buffers v${GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION} will be downloaded and built when doing '${CMAKE_MAKE_PROGRAM_PRETTY_NAME}'." | ||||
|     ) | ||||
| endif() | ||||
|  | ||||
|  | ||||
|  | ||||
| ################################################################################ | ||||
| # Doxygen - http://www.doxygen.nl (OPTIONAL, used if found) | ||||
| ################################################################################ | ||||
|   | ||||
							
								
								
									
										34
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								README.md
									
									
									
									
									
								
							| @@ -68,7 +68,7 @@ $ sudo apt-get install build-essential cmake git libboost-dev libboost-date-time | ||||
|        libboost-serialization-dev liblog4cpp5-dev libuhd-dev gnuradio-dev gr-osmosdr \ | ||||
|        libblas-dev liblapack-dev libarmadillo-dev libgflags-dev libgoogle-glog-dev \ | ||||
|        libgnutls-openssl-dev libpcap-dev python-mako python-six libmatio-dev libpugixml-dev \ | ||||
|        libgtest-dev | ||||
|        libgtest-dev libprotobuf-dev protobuf-compiler | ||||
| ~~~~~~ | ||||
|  | ||||
| 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". | ||||
| @@ -86,7 +86,7 @@ If you are using Arch Linux: | ||||
| ~~~~~~ | ||||
| $ pacman -S gcc make cmake git boost boost-libs log4cpp libvolk gnuradio \ | ||||
|        gnuradio-osmosdr blas lapack gflags google-glog openssl pugixml \ | ||||
|        python-mako python-six libmatio libpcap gtest | ||||
|        python-mako python-six libmatio libpcap gtest protobuf | ||||
| ~~~~~~ | ||||
|  | ||||
| Once you have installed these packages, you can jump directly to [download the source code and build GNSS-SDR](#download-and-build-linux). | ||||
| @@ -119,7 +119,8 @@ $ sudo yum install make automake gcc gcc-c++ kernel-devel cmake git boost-devel | ||||
|        boost-date-time boost-system boost-filesystem boost-thread boost-chrono \ | ||||
|        boost-serialization log4cpp-devel gnuradio-devel gr-osmosdr-devel \ | ||||
|        blas-devel lapack-devel matio-devel armadillo-devel gflags-devel \ | ||||
|        glog-devel openssl-devel libpcap-devel python-mako python-six pugixml-devel | ||||
|        glog-devel openssl-devel libpcap-devel python-mako python-six \ | ||||
|        pugixml-devel protobuf-devel | ||||
| ~~~~~~ | ||||
|  | ||||
| Once you have installed these packages, you can jump directly to [download the source code and build GNSS-SDR](#download-and-build-linux). | ||||
| @@ -135,7 +136,7 @@ zypper install cmake git gcc-c++ boost-devel libboost_atomic-devel \ | ||||
|        libboost_thread-devel libboost_chrono-devel libboost_serialization-devel \ | ||||
|        log4cpp-devel gtest gnuradio-devel pugixml-devel libpcap-devel \ | ||||
|        armadillo-devel libtool automake hdf5-devel libopenssl-devel python-Mako \ | ||||
|        python-six | ||||
|        python-six protobuf-devel | ||||
| ~~~~~~ | ||||
|  | ||||
| Once you have installed these packages, you can jump directly to [download the source code and build GNSS-SDR](#download-and-build-linux). | ||||
| @@ -283,6 +284,29 @@ In case the GnuTLS library with openssl extensions package is not available in y | ||||
|  | ||||
|  | ||||
|  | ||||
| #### Install [Protocol Buffers](https://developers.google.com/protocol-buffers/ "Protocol Buffers' Homepage"), a portable mechanism for serialization of structured data: | ||||
|  | ||||
| GNSS-SDR requires Protocol Buffers v3.0.0 or later. If the packages that come with your distribution are older than that (_e.g._, Ubuntu 16.04 Xenial and Debian 8 Jessie came with older versions), then you will need to install it manually. First, install the dependencies: | ||||
|  | ||||
| ~~~~~~ | ||||
| $ sudo apt-get install autoconf automake libtool curl make g++ unzip | ||||
| ~~~~~~ | ||||
|  | ||||
| and then: | ||||
|  | ||||
| ~~~~~~ | ||||
| $ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.7.1/protobuf-cpp-3.7.1.tar.gz | ||||
| $ tar xvfz protobuf-cpp-3.7.1.tar.gz | ||||
| $ cd protobuf-3.7.1 | ||||
| $ ./autogen.sh | ||||
| $ ./configure | ||||
| $ make | ||||
| $ sudo make install | ||||
| $ sudo ldconfig | ||||
| ~~~~~~ | ||||
|  | ||||
|  | ||||
|  | ||||
| ### <a name="download-and-build-linux">Clone GNSS-SDR's Git repository</a>: | ||||
|  | ||||
| ~~~~~~ | ||||
| @@ -570,6 +594,7 @@ $ sudo port install gnutls | ||||
| $ sudo port install google-glog +gflags | ||||
| $ sudo port install matio | ||||
| $ sudo port install pugixml | ||||
| $ sudo port install protobuf3-cpp | ||||
| $ sudo port install py27-mako | ||||
| $ sudo port install py27-six | ||||
| $ sudo port install doxygen +docs | ||||
| @@ -617,6 +642,7 @@ $ brew install libmatio | ||||
| $ brew install log4cpp | ||||
| $ brew install openssl | ||||
| $ brew install pugixml | ||||
| $ brew install protobuf | ||||
| $ pip install mako | ||||
| $ pip install six | ||||
| ~~~~~~ | ||||
|   | ||||
| @@ -26,6 +26,7 @@ | ||||
| - Fix bug in GLONASS dual frequency receiver. | ||||
| - Added a custom UDP/IP output for PVT data streaming. | ||||
| - Improved Monitor block with UDP/IP output for internal receiver's data streaming. | ||||
| - Custom output formats described with .proto files, making easier to other applications reading them in a forward and backward-compatible fashion upon future format changes. | ||||
|  | ||||
|  | ||||
| ### Improvements in Maintainability: | ||||
| @@ -51,6 +52,7 @@ | ||||
|  | ||||
| - The receiver now admits FPGA off-loading, allowing for real time operation at high sampling rates and higher number of signals and channels. | ||||
| - Fixed program termination (avoiding hangs and segfaults in some platforms/configurations). | ||||
| - The Labsat_Signal_Source now terminates the receiver's execution when the end of file(s) is reached. It now accepts LabSat 2 filenames and series of LabSat 3 files. | ||||
| - CMake now generates a summary of enabled/disabled features. This info is also stored in a file called features.log in the building directory. | ||||
| - New parameter PVT.show_local_time_zone displays time in the local time zone. Subject to the proper system configuration of the machine running the software receiver. | ||||
| - Improved information provided to the user in case of failure. | ||||
|   | ||||
							
								
								
									
										19
									
								
								docs/protobuf/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								docs/protobuf/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| # Custom structured data format definitions | ||||
|  | ||||
| Files in this folder describe structured data formats that are generated by | ||||
| GNSS-SDR. They use [Protocol Buffers](https://developers.google.com/protocol-buffers/)' | ||||
| [proto3](https://developers.google.com/protocol-buffers/docs/proto3) syntax. | ||||
|  | ||||
| From those files, the protocol buffer compiler creates classes that implement | ||||
| automatic encoding and parsing of the protocol buffer data with an efficient | ||||
| binary format. The generated classes provide getters and setters for the fields | ||||
| that make up a protocol buffer and take care of the details of reading and | ||||
| writing it as a unit. Importantly, the protocol buffer format supports the idea | ||||
| of extending the format over time in such a way that the code can still read | ||||
| data encoded with the old format. | ||||
|  | ||||
| Just grab these files if you are developing a client application for GNSS-SDR. | ||||
| You are free to use C++, Java, Python, C#, Dart, Go or Ruby, among other | ||||
| languages. A tutorial to create a simple application using Protocol Buffers and | ||||
| a `.proto` file in C++ is available at | ||||
| https://gnss-sdr.org/docs/tutorials/monitoring-software-receiver-internal-status/ | ||||
							
								
								
									
										42
									
								
								docs/protobuf/gnss_synchro.proto
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								docs/protobuf/gnss_synchro.proto
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| syntax = "proto3"; | ||||
|  | ||||
| package gnss_sdr; | ||||
|  | ||||
| /* GnssSynchro represents the processing measurements at a given time taken by a given processing channel */ | ||||
| message GnssSynchro { | ||||
|    string system = 1;  // GNSS constellation: "G" for GPS, "R" for Glonass, "S" for SBAS, "E" for Galileo and "C" for Beidou. | ||||
|    string signal = 2;  // GNSS signal: "1C" for GPS L1 C/A, "1B" for Galileo E1b/c, "1G" for Glonass L1 C/A, "2S" for GPS L2 L2C(M), "2G" for Glonass L2 C/A, "L5" for GPS L5 and "5X" for Galileo E5a | ||||
|  | ||||
|    uint32 prn = 3;  // PRN number | ||||
|    int32 channel_id = 4;  // Channel number | ||||
|  | ||||
|    double acq_delay_samples = 5;  // Coarse code delay estimation, in samples | ||||
|    double acq_doppler_hz = 6;  // Coarse Doppler estimation in each channel, in Hz | ||||
|    uint64 acq_samplestamp_samples = 7;  // Number of samples at signal SampleStamp | ||||
|    uint32 acq_doppler_step = 8;  // Step of the frequency bin in the search grid, in Hz | ||||
|    bool flag_valid_acquisition = 9;  // Acquisition status | ||||
|  | ||||
|    int64 fs = 10;  // Sampling frequency, in samples per second | ||||
|    double prompt_i = 11;  // In-phase (real) component of the prompt correlator output | ||||
|    double prompt_q = 12;  // Quadrature (imaginary) component of the prompt correlator output | ||||
|    double cn0_db_hz = 13;  // Carrier-to-Noise density ratio, in dB-Hz | ||||
|    double carrier_doppler_hz = 14;  // Doppler estimation, in [Hz]. | ||||
|    double carrier_phase_rads = 15;  // Carrier phase estimation, in rad | ||||
|    double code_phase_samples = 16;  // Code phase in samples | ||||
|    uint64 tracking_sample_counter = 17;  // Sample counter indicating the number of processed samples | ||||
|    bool flag_valid_symbol_output = 18;  // Indicates the validity of signal tracking | ||||
|    int32 correlation_length_ms = 19;  // Time duration of coherent correlation integration, in ms | ||||
|  | ||||
|    bool flag_valid_word = 20;  // Indicates the validity of the decoded navigation message word | ||||
|    uint32 tow_at_current_symbol_ms = 21;  // Time of week of the current symbol, in ms | ||||
|  | ||||
|    double pseudorange_m = 22;  // Pseudorange computation, in m | ||||
|    double rx_time = 23;  // Receiving time after the start of the week, in s | ||||
|    bool flag_valid_pseudorange = 24;  // Pseudorange computation status | ||||
|    double interp_tow_ms = 25;  // Interpolated time of week, in ms | ||||
| } | ||||
|  | ||||
| /* Observables represents a collection of GnssSynchro annotations */ | ||||
| message Observables { | ||||
|   repeated GnssSynchro observable = 1; | ||||
| } | ||||
							
								
								
									
										41
									
								
								docs/protobuf/monitor_pvt.proto
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								docs/protobuf/monitor_pvt.proto
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| syntax = "proto3"; | ||||
|  | ||||
| package gnss_sdr; | ||||
|  | ||||
| /* MonitorPvt represents a search query, with pagination options to | ||||
|  * indicate which results to include in the response. */ | ||||
| message MonitorPvt { | ||||
| uint32 tow_at_current_symbol_ms = 1;  // Time of week of the current symbol, in ms | ||||
| uint32 week = 2;  // PVT GPS week | ||||
| double rx_time = 3;  // PVT GPS time | ||||
| double user_clk_offset = 4;  // User clock offset, in s | ||||
|  | ||||
| double pos_x = 5;  // Position X component in ECEF, expressed in m | ||||
| double pos_y = 6;  // Position Y component in ECEF, expressed in m | ||||
| double pos_z = 7;  // Position Z component in ECEF, expressed in m | ||||
| double vel_x = 8;  // Velocity X component in ECEF, in m/s | ||||
| double vel_y = 9;  // Velocity Y component in ECEF, in m/s | ||||
| double vel_z = 10;  // Velocity Z component in ECEF, in m/s | ||||
|  | ||||
| double cov_xx = 11;  // Position variance in the Y component, in m2 | ||||
| double cov_yy = 12;  // Position variance in the Y component, in m2 | ||||
| double cov_zz = 13;  // Position variance in the Z component, in m2 | ||||
| double cov_xy = 14;  // Position XY covariance, in m2 | ||||
| double cov_yz = 15;  // Position YZ covariance, in m2 | ||||
| double cov_zx = 16;  // Position ZX covariance, in m2 | ||||
|  | ||||
| double latitude = 17;  // Latitude, in deg. Positive: North | ||||
| double longitude = 18;  // Longitude, in deg. Positive: East | ||||
| double height = 19;  // Height, in m | ||||
|  | ||||
| uint32 valid_sats = 20;  // Number of valid satellites | ||||
| uint32 solution_status = 21;  // RTKLIB solution status | ||||
| uint32 solution_type = 22;  // RTKLIB solution type (0: xyz-ecef, 1: enu-baseline) | ||||
| float ar_ratio_factor = 23;  // Ambiguity resolution ratio factor for validation | ||||
| float ar_ratio_threshold = 24;  // Ambiguity resolution ratio threshold for validation | ||||
|  | ||||
| double gdop = 25;  // Geometric Dilution of Precision | ||||
| double pdop = 26;  // Position (3D) Dilution of Precision | ||||
| double hdop = 27;  // Horizontal Dilution of Precision | ||||
| double vdop = 28;  // Vertical Dilution of Precision | ||||
| } | ||||
| @@ -741,6 +741,11 @@ Rtklib_Pvt::Rtklib_Pvt(ConfigurationInterface* configuration, | ||||
|     pvt_output_parameters.monitor_enabled = configuration->property(role + ".enable_monitor", false); | ||||
|     pvt_output_parameters.udp_addresses = configuration->property(role + ".monitor_client_addresses", std::string("127.0.0.1")); | ||||
|     pvt_output_parameters.udp_port = configuration->property(role + ".monitor_udp_port", 1234); | ||||
|     pvt_output_parameters.protobuf_enabled = configuration->property(role + ".enable_protobuf", true); | ||||
|     if (configuration->property("Monitor.enable_protobuf", false) == true) | ||||
|         { | ||||
|             pvt_output_parameters.protobuf_enabled = true; | ||||
|         } | ||||
|  | ||||
|     // Show time in local zone | ||||
|     pvt_output_parameters.show_local_time_zone = configuration->property(role + ".show_local_time_zone", false); | ||||
|   | ||||
| @@ -347,7 +347,7 @@ rtklib_pvt_gs::rtklib_pvt_gs(uint32_t nchannels, | ||||
|             std::sort(udp_addr_vec.begin(), udp_addr_vec.end()); | ||||
|             udp_addr_vec.erase(std::unique(udp_addr_vec.begin(), udp_addr_vec.end()), udp_addr_vec.end()); | ||||
|  | ||||
|             udp_sink_ptr = std::unique_ptr<Monitor_Pvt_Udp_Sink>(new Monitor_Pvt_Udp_Sink(udp_addr_vec, conf_.udp_port)); | ||||
|             udp_sink_ptr = std::unique_ptr<Monitor_Pvt_Udp_Sink>(new Monitor_Pvt_Udp_Sink(udp_addr_vec, conf_.udp_port, conf_.protobuf_enabled)); | ||||
|         } | ||||
|     else | ||||
|         { | ||||
|   | ||||
| @@ -16,6 +16,7 @@ | ||||
| # along with GNSS-SDR. If not, see <https://www.gnu.org/licenses/>. | ||||
| # | ||||
|  | ||||
| protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${CMAKE_SOURCE_DIR}/docs/protobuf/monitor_pvt.proto) | ||||
|  | ||||
| set(PVT_LIB_SOURCES | ||||
|     pvt_solution.cc | ||||
| @@ -31,6 +32,7 @@ set(PVT_LIB_SOURCES | ||||
|     rtklib_solver.cc | ||||
|     pvt_conf.cc | ||||
|     monitor_pvt_udp_sink.cc | ||||
|     ${PROTO_SRCS} | ||||
| ) | ||||
|  | ||||
| set(PVT_LIB_HEADERS | ||||
| @@ -48,6 +50,8 @@ set(PVT_LIB_HEADERS | ||||
|     pvt_conf.h | ||||
|     monitor_pvt_udp_sink.h | ||||
|     monitor_pvt.h | ||||
|     serdes_monitor_pvt.h | ||||
|     ${PROTO_HDRS} | ||||
| ) | ||||
|  | ||||
| list(SORT PVT_LIB_HEADERS) | ||||
| @@ -61,6 +65,7 @@ target_link_libraries(pvt_libs | ||||
|     PUBLIC | ||||
|         Armadillo::armadillo | ||||
|         Boost::date_time | ||||
|         protobuf::libprotobuf | ||||
|         algorithms_libs_rtklib | ||||
|         core_system_parameters | ||||
|     PRIVATE | ||||
| @@ -72,9 +77,12 @@ target_link_libraries(pvt_libs | ||||
|         Matio::matio | ||||
| ) | ||||
|  | ||||
| get_filename_component(PROTO_INCLUDE_HEADERS ${PROTO_HDRS} DIRECTORY) | ||||
|  | ||||
| target_include_directories(pvt_libs | ||||
|     PUBLIC | ||||
|         ${CMAKE_SOURCE_DIR}/src/core/receiver | ||||
|         ${PROTO_INCLUDE_HEADERS} | ||||
| ) | ||||
|  | ||||
| target_compile_definitions(pvt_libs PRIVATE -DGNSS_SDR_VERSION="${VERSION}") | ||||
|   | ||||
| @@ -35,7 +35,7 @@ | ||||
| #include <sstream> | ||||
|  | ||||
|  | ||||
| Monitor_Pvt_Udp_Sink::Monitor_Pvt_Udp_Sink(std::vector<std::string> addresses, const uint16_t& port) : socket{io_service} | ||||
| Monitor_Pvt_Udp_Sink::Monitor_Pvt_Udp_Sink(std::vector<std::string> addresses, const uint16_t& port, bool protobuf_enabled) : socket{io_service} | ||||
| { | ||||
|     for (const auto& address : addresses) | ||||
|         { | ||||
| @@ -70,15 +70,29 @@ Monitor_Pvt_Udp_Sink::Monitor_Pvt_Udp_Sink(std::vector<std::string> addresses, c | ||||
|     monitor_pvt.pdop = 0.0; | ||||
|     monitor_pvt.hdop = 0.0; | ||||
|     monitor_pvt.vdop = 0.0; | ||||
|  | ||||
|     use_protobuf = protobuf_enabled; | ||||
|     if (use_protobuf) | ||||
|         { | ||||
|             serdes = Serdes_Monitor_Pvt(); | ||||
|         } | ||||
| } | ||||
|  | ||||
|  | ||||
| bool Monitor_Pvt_Udp_Sink::write_monitor_pvt(const Monitor_Pvt& monitor_pvt) | ||||
| { | ||||
|     std::ostringstream archive_stream; | ||||
|     boost::archive::binary_oarchive oa{archive_stream}; | ||||
|     oa << monitor_pvt; | ||||
|     std::string outbound_data = archive_stream.str(); | ||||
|     std::string outbound_data; | ||||
|     if (use_protobuf == false) | ||||
|         { | ||||
|             std::ostringstream archive_stream; | ||||
|             boost::archive::binary_oarchive oa{archive_stream}; | ||||
|             oa << monitor_pvt; | ||||
|             outbound_data = archive_stream.str(); | ||||
|         } | ||||
|     else | ||||
|         { | ||||
|             outbound_data = serdes.createProtobuffer(monitor_pvt); | ||||
|         } | ||||
|  | ||||
|     for (const auto& endpoint : endpoints) | ||||
|         { | ||||
|   | ||||
| @@ -33,12 +33,13 @@ | ||||
| #define GNSS_SDR_MONITOR_PVT_UDP_SINK_H_ | ||||
|  | ||||
| #include "monitor_pvt.h" | ||||
| #include "serdes_monitor_pvt.h" | ||||
| #include <boost/asio.hpp> | ||||
|  | ||||
| class Monitor_Pvt_Udp_Sink | ||||
| { | ||||
| public: | ||||
|     Monitor_Pvt_Udp_Sink(std::vector<std::string> addresses, const uint16_t &port); | ||||
|     Monitor_Pvt_Udp_Sink(std::vector<std::string> addresses, const uint16_t &port, bool protobuf_enabled); | ||||
|     bool write_monitor_pvt(const Monitor_Pvt &monitor_pvt); | ||||
|  | ||||
| private: | ||||
| @@ -47,6 +48,8 @@ private: | ||||
|     boost::system::error_code error; | ||||
|     std::vector<boost::asio::ip::udp::endpoint> endpoints; | ||||
|     Monitor_Pvt monitor_pvt; | ||||
|     Serdes_Monitor_Pvt serdes; | ||||
|     bool use_protobuf; | ||||
| }; | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -69,6 +69,7 @@ Pvt_Conf::Pvt_Conf() | ||||
|     rtcm_output_file_path = std::string("."); | ||||
|  | ||||
|     monitor_enabled = false; | ||||
|     protobuf_enabled = true; | ||||
|     udp_port = 0; | ||||
|  | ||||
|     show_local_time_zone = false; | ||||
|   | ||||
| @@ -80,6 +80,7 @@ public: | ||||
|     std::string rtcm_output_file_path; | ||||
|  | ||||
|     bool monitor_enabled; | ||||
|     bool protobuf_enabled; | ||||
|     std::string udp_addresses; | ||||
|     int udp_port; | ||||
|  | ||||
|   | ||||
							
								
								
									
										138
									
								
								src/algorithms/PVT/libs/serdes_monitor_pvt.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								src/algorithms/PVT/libs/serdes_monitor_pvt.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,138 @@ | ||||
| /*! | ||||
|  * \file serdes_monitor_pvt.h | ||||
|  * \brief Serialization / Deserialization of Monitor_Pvt objects using | ||||
|  * Protocol Buffers | ||||
|  * \author Carles Fernandez-Prades, 2019. cfernandez(at)cttc.es | ||||
|  * | ||||
|  * ------------------------------------------------------------------------- | ||||
|  * | ||||
|  * Copyright (C) 2010-2019  (see AUTHORS file for a list of contributors) | ||||
|  * | ||||
|  * GNSS-SDR is a software defined Global Navigation | ||||
|  *          Satellite Systems receiver | ||||
|  * | ||||
|  * This file is part of GNSS-SDR. | ||||
|  * | ||||
|  * GNSS-SDR is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * GNSS-SDR is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General 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_SERDES_MONITOR_PVT_H_ | ||||
| #define GNSS_SDR_SERDES_MONITOR_PVT_H_ | ||||
|  | ||||
| #include "monitor_pvt.h" | ||||
| #include "monitor_pvt.pb.h"  // file created by Protocol Buffers at compile time | ||||
|  | ||||
|  | ||||
| /*! | ||||
|  * \brief This class implements serialization and deserialization of | ||||
|  * Monitor_Pvt objects using Protocol Buffers. | ||||
|  */ | ||||
| class Serdes_Monitor_Pvt | ||||
| { | ||||
| public: | ||||
|     Serdes_Monitor_Pvt() | ||||
|     { | ||||
|         // Verify that the version of the library that we linked against is | ||||
|         // compatible with the version of the headers we compiled against. | ||||
|         GOOGLE_PROTOBUF_VERIFY_VERSION; | ||||
|         monitor_.New(); | ||||
|     } | ||||
|     ~Serdes_Monitor_Pvt() | ||||
|     { | ||||
|         // google::protobuf::ShutdownProtobufLibrary(); | ||||
|     } | ||||
|  | ||||
|     inline std::string createProtobuffer(const Monitor_Pvt& monitor)  //!< Serialization into a string | ||||
|     { | ||||
|         monitor_.Clear(); | ||||
|  | ||||
|         std::string data; | ||||
|  | ||||
|         monitor_.set_tow_at_current_symbol_ms(monitor.TOW_at_current_symbol_ms); | ||||
|         monitor_.set_week(monitor.week); | ||||
|         monitor_.set_rx_time(monitor.RX_time); | ||||
|         monitor_.set_user_clk_offset(monitor.user_clk_offset); | ||||
|         monitor_.set_pos_x(monitor.pos_x); | ||||
|         monitor_.set_pos_y(monitor.pos_y); | ||||
|         monitor_.set_pos_z(monitor.pos_z); | ||||
|         monitor_.set_vel_x(monitor.vel_x); | ||||
|         monitor_.set_vel_y(monitor.vel_y); | ||||
|         monitor_.set_vel_z(monitor.vel_z); | ||||
|         monitor_.set_cov_xx(monitor.cov_xx); | ||||
|         monitor_.set_cov_yy(monitor.cov_yy); | ||||
|         monitor_.set_cov_zz(monitor.cov_zz); | ||||
|         monitor_.set_cov_xy(monitor.cov_xy); | ||||
|         monitor_.set_cov_yz(monitor.cov_yz); | ||||
|         monitor_.set_cov_yz(monitor.cov_yz); | ||||
|         monitor_.set_latitude(monitor.latitude); | ||||
|         monitor_.set_longitude(monitor.longitude); | ||||
|         monitor_.set_height(monitor.height); | ||||
|         monitor_.set_valid_sats(monitor.valid_sats); | ||||
|         monitor_.set_solution_status(monitor.solution_status); | ||||
|         monitor_.set_solution_type(monitor.solution_type); | ||||
|         monitor_.set_ar_ratio_factor(monitor.AR_ratio_factor); | ||||
|         monitor_.set_ar_ratio_threshold(monitor.AR_ratio_threshold); | ||||
|         monitor_.set_gdop(monitor.gdop); | ||||
|         monitor_.set_pdop(monitor.pdop); | ||||
|         monitor_.set_hdop(monitor.hdop); | ||||
|         monitor_.set_vdop(monitor.vdop); | ||||
|  | ||||
|         monitor_.SerializeToString(&data); | ||||
|         return data; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     inline Monitor_Pvt readProtobuffer(const gnss_sdr::MonitorPvt& mon)  //!< Deserialization | ||||
|     { | ||||
|         Monitor_Pvt monitor; | ||||
|  | ||||
|         monitor.TOW_at_current_symbol_ms = mon.tow_at_current_symbol_ms(); | ||||
|         monitor.week = mon.week(); | ||||
|         monitor.RX_time = mon.rx_time(); | ||||
|         monitor.user_clk_offset = mon.user_clk_offset(); | ||||
|         monitor.pos_x = mon.pos_x(); | ||||
|         monitor.pos_y = mon.pos_y(); | ||||
|         monitor.pos_z = mon.pos_z(); | ||||
|         monitor.vel_x = mon.vel_x(); | ||||
|         monitor.vel_y = mon.vel_y(); | ||||
|         monitor.vel_z = mon.vel_z(); | ||||
|         monitor.cov_xx = mon.cov_xx(); | ||||
|         monitor.cov_yy = mon.cov_yy(); | ||||
|         monitor.cov_zz = mon.cov_zz(); | ||||
|         monitor.cov_xy = mon.cov_xy(); | ||||
|         monitor.cov_yz = mon.cov_yz(); | ||||
|         monitor.cov_zx = mon.cov_zx(); | ||||
|         monitor.latitude = mon.latitude(); | ||||
|         monitor.longitude = mon.longitude(); | ||||
|         monitor.height = mon.height(); | ||||
|         monitor.valid_sats = static_cast<uint8_t>(mon.valid_sats()); | ||||
|         monitor.solution_status = static_cast<uint8_t>(mon.solution_status()); | ||||
|         monitor.solution_type = static_cast<uint8_t>(mon.solution_type()); | ||||
|         monitor.AR_ratio_factor = mon.ar_ratio_factor(); | ||||
|         monitor.AR_ratio_threshold = mon.ar_ratio_threshold(); | ||||
|         monitor.gdop = mon.gdop(); | ||||
|         monitor.pdop = mon.pdop(); | ||||
|         monitor.hdop = mon.hdop(); | ||||
|         monitor.vdop = mon.vdop(); | ||||
|  | ||||
|         return monitor; | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     gnss_sdr::MonitorPvt monitor_; | ||||
| }; | ||||
|  | ||||
| #endif  // GNSS_SDR_SERDES_MONITOR_PVT_H_ | ||||
| @@ -16,15 +16,19 @@ | ||||
| # along with GNSS-SDR. If not, see <https://www.gnu.org/licenses/>. | ||||
| # | ||||
|  | ||||
| protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${CMAKE_SOURCE_DIR}/docs/protobuf/gnss_synchro.proto) | ||||
|  | ||||
| set(CORE_MONITOR_LIBS_SOURCES | ||||
|     gnss_synchro_monitor.cc | ||||
|     gnss_synchro_udp_sink.cc | ||||
|     ${PROTO_SRCS} | ||||
| ) | ||||
|  | ||||
| set(CORE_MONITOR_LIBS_HEADERS | ||||
|     gnss_synchro_monitor.h | ||||
|     gnss_synchro_udp_sink.h | ||||
|     serdes_gnss_synchro.h | ||||
|     ${PROTO_HDRS} | ||||
| ) | ||||
|  | ||||
| list(SORT CORE_MONITOR_LIBS_HEADERS) | ||||
| @@ -42,11 +46,19 @@ target_link_libraries(core_monitor | ||||
|         Boost::serialization | ||||
|         Boost::system | ||||
|         Gnuradio::runtime | ||||
|         protobuf::libprotobuf | ||||
|         core_system_parameters | ||||
|     PRIVATE | ||||
|         Gnuradio::pmt | ||||
| ) | ||||
|  | ||||
| get_filename_component(PROTO_INCLUDE_HEADERS ${PROTO_HDRS} DIRECTORY) | ||||
|  | ||||
| target_include_directories(core_monitor | ||||
|     PUBLIC | ||||
|         ${PROTO_INCLUDE_HEADERS} | ||||
| ) | ||||
|  | ||||
| if(OS_IS_MACOSX) | ||||
|     if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")  # not AppleClang | ||||
|         target_compile_definitions(core_monitor | ||||
| @@ -65,7 +77,10 @@ if(ENABLE_CLANG_TIDY) | ||||
|     endif() | ||||
| endif() | ||||
|  | ||||
|  | ||||
|  | ||||
| set_property(TARGET core_monitor | ||||
|     APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES | ||||
|         $<BUILD_INTERFACE:${PROTO_INCLUDE_HEADERS}> | ||||
|         $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> | ||||
| ) | ||||
|   | ||||
| @@ -41,26 +41,29 @@ | ||||
| gnss_synchro_monitor_sptr gnss_synchro_make_monitor(unsigned int n_channels, | ||||
|     int decimation_factor, | ||||
|     int udp_port, | ||||
|     const std::vector<std::string>& udp_addresses) | ||||
|     const std::vector<std::string>& udp_addresses, | ||||
|     bool enable_protobuf) | ||||
| { | ||||
|     return gnss_synchro_monitor_sptr(new gnss_synchro_monitor(n_channels, | ||||
|         decimation_factor, | ||||
|         udp_port, | ||||
|         udp_addresses)); | ||||
|         udp_addresses, | ||||
|         enable_protobuf)); | ||||
| } | ||||
|  | ||||
|  | ||||
| gnss_synchro_monitor::gnss_synchro_monitor(unsigned int n_channels, | ||||
|     int decimation_factor, | ||||
|     int udp_port, | ||||
|     const std::vector<std::string>& udp_addresses) : gr::sync_block("gnss_synchro_monitor", | ||||
|                                                          gr::io_signature::make(n_channels, n_channels, sizeof(Gnss_Synchro)), | ||||
|                                                          gr::io_signature::make(0, 0, 0)) | ||||
|     const std::vector<std::string>& udp_addresses, | ||||
|     bool enable_protobuf) : gr::sync_block("gnss_synchro_monitor", | ||||
|                                 gr::io_signature::make(n_channels, n_channels, sizeof(Gnss_Synchro)), | ||||
|                                 gr::io_signature::make(0, 0, 0)) | ||||
| { | ||||
|     d_decimation_factor = decimation_factor; | ||||
|     d_nchannels = n_channels; | ||||
|  | ||||
|     udp_sink_ptr = std::unique_ptr<Gnss_Synchro_Udp_Sink>(new Gnss_Synchro_Udp_Sink(udp_addresses, udp_port)); | ||||
|     udp_sink_ptr = std::unique_ptr<Gnss_Synchro_Udp_Sink>(new Gnss_Synchro_Udp_Sink(udp_addresses, udp_port, enable_protobuf)); | ||||
|  | ||||
|     count = 0; | ||||
| } | ||||
|   | ||||
| @@ -50,7 +50,8 @@ using gnss_synchro_monitor_sptr = boost::shared_ptr<gnss_synchro_monitor>; | ||||
| gnss_synchro_monitor_sptr gnss_synchro_make_monitor(unsigned int n_channels, | ||||
|     int decimation_factor, | ||||
|     int udp_port, | ||||
|     const std::vector<std::string>& udp_addresses); | ||||
|     const std::vector<std::string>& udp_addresses, | ||||
|     bool enable_protobuf); | ||||
|  | ||||
| /*! | ||||
|  * \brief This class implements a monitoring block which allows sending | ||||
| @@ -63,12 +64,14 @@ private: | ||||
|     friend gnss_synchro_monitor_sptr gnss_synchro_make_monitor(unsigned int n_channels, | ||||
|         int decimation_factor, | ||||
|         int udp_port, | ||||
|         const std::vector<std::string>& udp_addresses); | ||||
|         const std::vector<std::string>& udp_addresses, | ||||
|         bool enable_protobuf); | ||||
|  | ||||
|     gnss_synchro_monitor(unsigned int n_channels, | ||||
|         int decimation_factor, | ||||
|         int udp_port, | ||||
|         const std::vector<std::string>& udp_addresses); | ||||
|         const std::vector<std::string>& udp_addresses, | ||||
|         bool enable_protobuf); | ||||
|  | ||||
|     unsigned int d_nchannels; | ||||
|     int d_decimation_factor; | ||||
|   | ||||
| @@ -35,8 +35,13 @@ | ||||
| #include <iostream> | ||||
| #include <sstream> | ||||
|  | ||||
| Gnss_Synchro_Udp_Sink::Gnss_Synchro_Udp_Sink(std::vector<std::string> addresses, const uint16_t& port) : socket{io_service} | ||||
| Gnss_Synchro_Udp_Sink::Gnss_Synchro_Udp_Sink(std::vector<std::string> addresses, const uint16_t& port, bool enable_protobuf) : socket{io_service} | ||||
| { | ||||
|     use_protobuf = enable_protobuf; | ||||
|     if (enable_protobuf) | ||||
|         { | ||||
|             serdes = Serdes_Gnss_Synchro(); | ||||
|         } | ||||
|     for (const auto& address : addresses) | ||||
|         { | ||||
|             boost::asio::ip::udp::endpoint endpoint(boost::asio::ip::address::from_string(address, error), port); | ||||
| @@ -47,11 +52,18 @@ Gnss_Synchro_Udp_Sink::Gnss_Synchro_Udp_Sink(std::vector<std::string> addresses, | ||||
|  | ||||
| bool Gnss_Synchro_Udp_Sink::write_gnss_synchro(const std::vector<Gnss_Synchro>& stocks) | ||||
| { | ||||
|     std::ostringstream archive_stream; | ||||
|     boost::archive::binary_oarchive oa{archive_stream}; | ||||
|     oa << stocks; | ||||
|     std::string outbound_data = archive_stream.str(); | ||||
|  | ||||
|     std::string outbound_data; | ||||
|     if (use_protobuf == false) | ||||
|         { | ||||
|             std::ostringstream archive_stream; | ||||
|             boost::archive::binary_oarchive oa{archive_stream}; | ||||
|             oa << stocks; | ||||
|             outbound_data = archive_stream.str(); | ||||
|         } | ||||
|     else | ||||
|         { | ||||
|             outbound_data = serdes.createProtobuffer(stocks); | ||||
|         } | ||||
|     for (const auto& endpoint : endpoints) | ||||
|         { | ||||
|             socket.open(endpoint.protocol(), error); | ||||
|   | ||||
| @@ -33,6 +33,7 @@ | ||||
| #define GNSS_SDR_GNSS_SYNCHRO_UDP_SINK_H_ | ||||
|  | ||||
| #include "gnss_synchro.h" | ||||
| #include "serdes_gnss_synchro.h" | ||||
| #include <boost/asio.hpp> | ||||
| #include <boost/system/error_code.hpp> | ||||
| #include <cstdint> | ||||
| @@ -47,7 +48,7 @@ | ||||
| class Gnss_Synchro_Udp_Sink | ||||
| { | ||||
| public: | ||||
|     Gnss_Synchro_Udp_Sink(std::vector<std::string> addresses, const uint16_t& port); | ||||
|     Gnss_Synchro_Udp_Sink(std::vector<std::string> addresses, const uint16_t& port, bool enable_protobuf); | ||||
|     bool write_gnss_synchro(const std::vector<Gnss_Synchro>& stocks); | ||||
|  | ||||
| private: | ||||
| @@ -56,6 +57,8 @@ private: | ||||
|     boost::system::error_code error; | ||||
|     std::vector<boost::asio::ip::udp::endpoint> endpoints; | ||||
|     std::vector<Gnss_Synchro> stocks; | ||||
|     Serdes_Gnss_Synchro serdes; | ||||
|     bool use_protobuf; | ||||
| }; | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										160
									
								
								src/core/monitor/serdes_gnss_synchro.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								src/core/monitor/serdes_gnss_synchro.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,160 @@ | ||||
| /*! | ||||
|  * \file serdes_gnss_synchro.h | ||||
|  * \brief Serialization / Deserialization of Gnss_Synchro objects using | ||||
|  * Protocol Buffers | ||||
|  * \author Carles Fernandez-Prades, 2019. cfernandez(at)cttc.es | ||||
|  * | ||||
|  * ------------------------------------------------------------------------- | ||||
|  * | ||||
|  * Copyright (C) 2010-2019  (see AUTHORS file for a list of contributors) | ||||
|  * | ||||
|  * GNSS-SDR is a software defined Global Navigation | ||||
|  *          Satellite Systems receiver | ||||
|  * | ||||
|  * This file is part of GNSS-SDR. | ||||
|  * | ||||
|  * GNSS-SDR is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * GNSS-SDR is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General 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_SERDES_GNSS_SYNCHRO_H_ | ||||
| #define GNSS_SDR_SERDES_GNSS_SYNCHRO_H_ | ||||
|  | ||||
| #include "gnss_synchro.h" | ||||
| #include "gnss_synchro.pb.h"  // file created by Protocol Buffers at compile time | ||||
| #include <cstring>            // for memcpy | ||||
| #include <vector> | ||||
|  | ||||
|  | ||||
| /*! | ||||
|  * \brief This class implements serialization and deserialization of | ||||
|  * Gnss_Synchro objects using Protocol Buffers. | ||||
|  */ | ||||
| class Serdes_Gnss_Synchro | ||||
| { | ||||
| public: | ||||
|     Serdes_Gnss_Synchro() | ||||
|     { | ||||
|         // Verify that the version of the library that we linked against is | ||||
|         // compatible with the version of the headers we compiled against. | ||||
|         GOOGLE_PROTOBUF_VERIFY_VERSION; | ||||
|         observables.New(); | ||||
|     } | ||||
|     ~Serdes_Gnss_Synchro() | ||||
|     { | ||||
|         google::protobuf::ShutdownProtobufLibrary(); | ||||
|     } | ||||
|  | ||||
|     inline std::string createProtobuffer(const std::vector<Gnss_Synchro>& vgs)  //!< Serialization into a string | ||||
|     { | ||||
|         observables.Clear(); | ||||
|  | ||||
|         std::string data; | ||||
|         for (auto gs : vgs) | ||||
|             { | ||||
|                 gnss_sdr::GnssSynchro* obs = observables.add_observable(); | ||||
|                 char c[2]; | ||||
|                 c[0] = gs.System; | ||||
|                 c[1] = '\0'; | ||||
|                 const std::string sys(c); | ||||
|  | ||||
|                 char cc[3]; | ||||
|                 cc[0] = gs.Signal[0]; | ||||
|                 cc[1] = gs.Signal[1]; | ||||
|                 cc[2] = '\0'; | ||||
|                 const std::string sig(cc); | ||||
|  | ||||
|                 obs->set_system(sys); | ||||
|                 obs->set_signal(sig); | ||||
|                 obs->set_prn(gs.PRN); | ||||
|                 obs->set_channel_id(gs.Channel_ID); | ||||
|  | ||||
|                 obs->set_acq_delay_samples(gs.Acq_delay_samples); | ||||
|                 obs->set_acq_doppler_hz(gs.Acq_doppler_hz); | ||||
|                 obs->set_acq_samplestamp_samples(gs.Acq_samplestamp_samples); | ||||
|                 obs->set_acq_doppler_step(gs.Acq_doppler_step); | ||||
|                 obs->set_flag_valid_acquisition(gs.Flag_valid_acquisition); | ||||
|  | ||||
|                 obs->set_fs(gs.fs); | ||||
|                 obs->set_prompt_i(gs.Prompt_I); | ||||
|                 obs->set_prompt_q(gs.Prompt_Q); | ||||
|                 obs->set_cn0_db_hz(gs.CN0_dB_hz); | ||||
|                 obs->set_carrier_doppler_hz(gs.Carrier_Doppler_hz); | ||||
|                 obs->set_code_phase_samples(gs.Code_phase_samples); | ||||
|                 obs->set_tracking_sample_counter(gs.Tracking_sample_counter); | ||||
|                 obs->set_flag_valid_symbol_output(gs.Flag_valid_symbol_output); | ||||
|                 obs->set_correlation_length_ms(gs.correlation_length_ms); | ||||
|  | ||||
|                 obs->set_fs(gs.Flag_valid_word); | ||||
|                 obs->set_fs(gs.TOW_at_current_symbol_ms); | ||||
|  | ||||
|                 obs->set_pseudorange_m(gs.Pseudorange_m); | ||||
|                 obs->set_rx_time(gs.RX_time); | ||||
|                 obs->set_flag_valid_pseudorange(gs.Flag_valid_pseudorange); | ||||
|                 obs->set_interp_tow_ms(gs.interp_TOW_ms); | ||||
|             } | ||||
|         observables.SerializeToString(&data); | ||||
|         return data; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     inline std::vector<Gnss_Synchro> readProtobuffer(const gnss_sdr::Observables& obs)  //!< Deserialization | ||||
|     { | ||||
|         std::vector<Gnss_Synchro> vgs; | ||||
|         vgs.reserve(obs.observable_size()); | ||||
|  | ||||
|         for (int i = 0; i < obs.observable_size(); ++i) | ||||
|             { | ||||
|                 const gnss_sdr::GnssSynchro& gs_read = obs.observable(i); | ||||
|                 Gnss_Synchro gs = Gnss_Synchro(); | ||||
|                 const std::string& sys = gs_read.system(); | ||||
|                 gs.System = *sys.c_str(); | ||||
|                 const std::string& sig = gs_read.signal(); | ||||
|                 std::memcpy(static_cast<void*>(gs.Signal), sig.c_str(), 3); | ||||
|                 gs.PRN = gs_read.prn(); | ||||
|                 gs.Channel_ID = gs_read.channel_id(); | ||||
|  | ||||
|                 gs.Acq_delay_samples = gs_read.acq_delay_samples(); | ||||
|                 gs.Acq_doppler_hz = gs_read.acq_doppler_hz(); | ||||
|                 gs.Acq_samplestamp_samples = gs_read.acq_samplestamp_samples(); | ||||
|                 gs.Acq_doppler_step = gs_read.acq_doppler_step(); | ||||
|                 gs.Flag_valid_acquisition = gs_read.flag_valid_acquisition(); | ||||
|  | ||||
|                 gs.fs = gs_read.fs(); | ||||
|                 gs.Prompt_I = gs_read.prompt_i(); | ||||
|                 gs.Prompt_Q = gs_read.prompt_q(); | ||||
|                 gs.CN0_dB_hz = gs_read.cn0_db_hz(); | ||||
|                 gs.Carrier_Doppler_hz = gs_read.carrier_doppler_hz(); | ||||
|                 gs.Tracking_sample_counter = gs_read.tracking_sample_counter(); | ||||
|                 gs.Flag_valid_symbol_output = gs_read.flag_valid_symbol_output(); | ||||
|                 gs.correlation_length_ms = gs_read.correlation_length_ms(); | ||||
|  | ||||
|                 gs.Flag_valid_word = gs_read.flag_valid_word(); | ||||
|                 gs.TOW_at_current_symbol_ms = gs_read.tow_at_current_symbol_ms(); | ||||
|  | ||||
|                 gs.Pseudorange_m = gs_read.pseudorange_m(); | ||||
|                 gs.RX_time = gs_read.rx_time(); | ||||
|                 gs.Flag_valid_pseudorange = gs_read.flag_valid_pseudorange(); | ||||
|                 gs.interp_TOW_ms = gs_read.interp_tow_ms(); | ||||
|  | ||||
|                 vgs.push_back(gs); | ||||
|             } | ||||
|         return vgs; | ||||
|     } | ||||
| private: | ||||
|     gnss_sdr::Observables observables; | ||||
| }; | ||||
|  | ||||
| #endif  // GNSS_SDR_SERDES_GNSS_SYNCHRO_H_ | ||||
| @@ -215,7 +215,7 @@ void GNSSFlowgraph::connect() | ||||
|         } | ||||
|  | ||||
|     DLOG(INFO) << "blocks connected internally"; | ||||
| // Signal Source (i) >  Signal conditioner (i) > | ||||
|     // Signal Source (i) >  Signal conditioner (i) > | ||||
| #ifndef ENABLE_FPGA | ||||
|     int RF_Channels = 0; | ||||
|     int signal_conditioner_ID = 0; | ||||
| @@ -444,20 +444,20 @@ void GNSSFlowgraph::connect() | ||||
|                                                     // create a FIR low pass filter | ||||
|                                                     std::vector<float> taps; | ||||
|  | ||||
|                                                     //                                                    float beta = 7.0; | ||||
|                                                     //                                                    float halfband = 0.5; | ||||
|                                                     //                                                    float fractional_bw = 0.4; | ||||
|                                                     //                                                    float rate = 1.0 / static_cast<float>(decimation); | ||||
|                                                     // float beta = 7.0; | ||||
|                                                     // float halfband = 0.5; | ||||
|                                                     // float fractional_bw = 0.4; | ||||
|                                                     // float rate = 1.0 / static_cast<float>(decimation); | ||||
|                                                     // | ||||
|                                                     //                                                    float trans_width = rate * (halfband - fractional_bw); | ||||
|                                                     //                                                    float mid_transition_band = rate * halfband - trans_width / 2.0; | ||||
|                                                     // float trans_width = rate * (halfband - fractional_bw); | ||||
|                                                     // float mid_transition_band = rate * halfband - trans_width / 2.0; | ||||
|                                                     // | ||||
|                                                     //                                                    taps = gr::filter::firdes::low_pass(1.0, | ||||
|                                                     //                                                        1.0, | ||||
|                                                     //                                                        mid_transition_band, | ||||
|                                                     //                                                        trans_width, | ||||
|                                                     //                                                        gr::filter::firdes::win_type::WIN_KAISER, | ||||
|                                                     //                                                        beta); | ||||
|                                                     // taps = gr::filter::firdes::low_pass(1.0, | ||||
|                                                     //    1.0, | ||||
|                                                     //    mid_transition_band, | ||||
|                                                     //    trans_width, | ||||
|                                                     //    gr::filter::firdes::win_type::WIN_KAISER, | ||||
|                                                     //    beta); | ||||
|  | ||||
|                                                     taps = gr::filter::firdes::low_pass(1.0, | ||||
|                                                         fs, | ||||
| @@ -526,7 +526,6 @@ void GNSSFlowgraph::connect() | ||||
|                 } | ||||
| #endif | ||||
|  | ||||
|  | ||||
|             // Signal Source > Signal conditioner >> Channels >> Observables | ||||
|             try | ||||
|                 { | ||||
| @@ -556,6 +555,7 @@ void GNSSFlowgraph::connect() | ||||
|                         } | ||||
|                 } | ||||
|         } | ||||
|  | ||||
|     // Put channels fixed to a given satellite at the beginning of the vector, then the rest | ||||
|     std::vector<unsigned int> vector_of_channels; | ||||
|     for (unsigned int i = 0; i < channels_count_; i++) | ||||
| @@ -1169,7 +1169,6 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) | ||||
|                                 } | ||||
|                             acq_channels_count_++; | ||||
|                             DLOG(INFO) << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); | ||||
|  | ||||
| #ifndef ENABLE_FPGA | ||||
|                             channels_[ch_index]->start_acquisition(); | ||||
| #else | ||||
| @@ -1704,7 +1703,11 @@ void GNSSFlowgraph::init() | ||||
| 	 * Instantiate the receiver monitor block, if required | ||||
| 	 */ | ||||
|     enable_monitor_ = configuration_->property("Monitor.enable_monitor", false); | ||||
|  | ||||
|     bool enable_protobuf = configuration_->property("Monitor.enable_protobuf", true); | ||||
|     if (configuration_->property("PVT.enable_protobuf", false) == true) | ||||
|         { | ||||
|             enable_protobuf = true; | ||||
|         } | ||||
|     std::string address_string = configuration_->property("Monitor.client_addresses", std::string("127.0.0.1")); | ||||
|     std::vector<std::string> udp_addr_vec = split_string(address_string, '_'); | ||||
|     std::sort(udp_addr_vec.begin(), udp_addr_vec.end()); | ||||
| @@ -1715,7 +1718,7 @@ void GNSSFlowgraph::init() | ||||
|             GnssSynchroMonitor_ = gnss_synchro_make_monitor(channels_count_, | ||||
|                 configuration_->property("Monitor.decimation_factor", 1), | ||||
|                 configuration_->property("Monitor.udp_port", 1234), | ||||
|                 udp_addr_vec); | ||||
|                 udp_addr_vec, enable_protobuf); | ||||
|         } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -66,6 +66,7 @@ DECLARE_string(log_dir); | ||||
| #include "unit-tests/control-plane/gnss_block_factory_test.cc" | ||||
| #include "unit-tests/control-plane/gnss_flowgraph_test.cc" | ||||
| #include "unit-tests/control-plane/in_memory_configuration_test.cc" | ||||
| #include "unit-tests/control-plane/protobuf_test.cc" | ||||
| #include "unit-tests/control-plane/string_converter_test.cc" | ||||
| #include "unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_8ms_ambiguous_acquisition_gsoc2013_test.cc" | ||||
| #include "unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc2013_test.cc" | ||||
| @@ -119,6 +120,7 @@ DECLARE_string(log_dir); | ||||
| #include "unit-tests/signal-processing-blocks/pvt/rinex_printer_test.cc" | ||||
| #include "unit-tests/signal-processing-blocks/pvt/rtcm_printer_test.cc" | ||||
| #include "unit-tests/signal-processing-blocks/pvt/rtcm_test.cc" | ||||
| #include "unit-tests/signal-processing-blocks/pvt/serdes_monitor_pvt_test.cc" | ||||
| #include "unit-tests/signal-processing-blocks/telemetry_decoder/galileo_fnav_inav_decoder_test.cc" | ||||
| #include "unit-tests/system-parameters/glonass_gnav_ephemeris_test.cc" | ||||
| #include "unit-tests/system-parameters/glonass_gnav_nav_message_test.cc" | ||||
|   | ||||
							
								
								
									
										107
									
								
								src/tests/unit-tests/control-plane/protobuf_test.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								src/tests/unit-tests/control-plane/protobuf_test.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | ||||
| /*! | ||||
|  * \file protobuf_test.cc | ||||
|  * \brief This file implements tests for Serdes_Gnss_Synchro | ||||
|  * \author Carles Fernandez-Prades, 2019. cfernandez(at)cttc.es | ||||
|  * | ||||
|  * ------------------------------------------------------------------------- | ||||
|  * | ||||
|  * Copyright (C) 2010-2019  (see AUTHORS file for a list of contributors) | ||||
|  * | ||||
|  * GNSS-SDR is a software defined Global Navigation | ||||
|  *          Satellite Systems receiver | ||||
|  * | ||||
|  * This file is part of GNSS-SDR. | ||||
|  * | ||||
|  * GNSS-SDR is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * GNSS-SDR is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General 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 "serdes_gnss_synchro.h" | ||||
|  | ||||
| TEST(Protobuf, Works) | ||||
| { | ||||
|     uint32_t prn_true = 17; | ||||
|     uint32_t prn_true2 = 23; | ||||
|     std::string sys = "G"; | ||||
|     std::string sig = "1C"; | ||||
|  | ||||
|     Gnss_Synchro gs = Gnss_Synchro(); | ||||
|     gs.System = *sys.c_str(); | ||||
|     std::memcpy(static_cast<void*>(gs.Signal), sig.c_str(), 3); | ||||
|     gs.PRN = prn_true; | ||||
|  | ||||
|     gs.Channel_ID = 3; | ||||
|  | ||||
|     gs.Acq_delay_samples = 431; | ||||
|     gs.Acq_doppler_hz = 1234; | ||||
|     gs.Acq_samplestamp_samples = 10000; | ||||
|     gs.Acq_doppler_step = 125; | ||||
|     gs.Flag_valid_acquisition = true; | ||||
|  | ||||
|     gs.fs = 10000000; | ||||
|     gs.Prompt_I = 10000.0; | ||||
|     gs.Prompt_Q = 0.01; | ||||
|     gs.CN0_dB_hz = 39; | ||||
|     gs.Carrier_Doppler_hz = 321; | ||||
|     gs.Tracking_sample_counter = 11000; | ||||
|     gs.Flag_valid_symbol_output = false; | ||||
|     gs.correlation_length_ms = 1; | ||||
|  | ||||
|     gs.Flag_valid_word = false; | ||||
|     gs.TOW_at_current_symbol_ms = 12345; | ||||
|  | ||||
|     gs.Pseudorange_m = 22000002.1; | ||||
|     gs.RX_time = 4321; | ||||
|     gs.Flag_valid_pseudorange = false; | ||||
|     gs.interp_TOW_ms = 20; | ||||
|  | ||||
|     gs.Pseudorange_m = 22000002.1; | ||||
|     gs.Carrier_phase_rads = 45.4; | ||||
|     gs.Carrier_Doppler_hz = 321; | ||||
|     gs.CN0_dB_hz = 39; | ||||
|  | ||||
|     Serdes_Gnss_Synchro serdes = Serdes_Gnss_Synchro(); | ||||
|  | ||||
|     // Create a vector of Gnss_Synchro objects | ||||
|     std::vector<Gnss_Synchro> vgs; | ||||
|     vgs.push_back(gs); | ||||
|     gs.PRN = prn_true2; | ||||
|     vgs.push_back(gs); | ||||
|  | ||||
|     // Serialize data | ||||
|     std::string serialized_data = serdes.createProtobuffer(vgs); | ||||
|  | ||||
|     // Recover data from serialization | ||||
|     gnss_sdr::Observables obs; | ||||
|     obs.ParseFromString(serialized_data); | ||||
|  | ||||
|     // Check that recovered data is ok | ||||
|  | ||||
|     // We can access like this: | ||||
|     std::vector<Gnss_Synchro> vgs_read = serdes.readProtobuffer(obs); | ||||
|     Gnss_Synchro gs_read = vgs_read[0]; | ||||
|     uint32_t prn_read = gs_read.PRN; | ||||
|     uint32_t prn_read2 = vgs_read[1].PRN; | ||||
|  | ||||
|     // or without the need of gnss_synchro: | ||||
|     int obs_size = obs.observable_size(); | ||||
|     uint32_t prn_read3 = obs.observable(0).prn(); | ||||
|  | ||||
|     EXPECT_EQ(prn_true, prn_read); | ||||
|     EXPECT_EQ(prn_true2, prn_read2); | ||||
|     EXPECT_EQ(prn_true, prn_read3); | ||||
|     EXPECT_EQ(2, obs_size); | ||||
| } | ||||
| @@ -0,0 +1,47 @@ | ||||
| /*! | ||||
|  * \file serdes_monitor_pvt_test.cc | ||||
|  * \brief Implements Unit Test for the serdes_monitor_pvt class. | ||||
|  * \author Carles Fernandez_prades, 2019. cfernandez(at)cttc.es | ||||
|  * | ||||
|  * ------------------------------------------------------------------------- | ||||
|  * | ||||
|  * Copyright (C) 2010-2019  (see AUTHORS file for a list of contributors) | ||||
|  * | ||||
|  * GNSS-SDR is a software defined Global Navigation | ||||
|  *          Satellite Systems receiver | ||||
|  * | ||||
|  * This file is part of GNSS-SDR. | ||||
|  * | ||||
|  * GNSS-SDR is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * GNSS-SDR is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General 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 "serdes_monitor_pvt.h" | ||||
|  | ||||
| TEST(Serdes_Monitor_Pvt_Test, Simpletest) | ||||
| { | ||||
|     Monitor_Pvt monitor = Monitor_Pvt(); | ||||
|     double true_latitude = 23.4; | ||||
|     monitor.latitude = true_latitude; | ||||
|  | ||||
|     Serdes_Monitor_Pvt serdes = Serdes_Monitor_Pvt(); | ||||
|     std::string serialized_data = serdes.createProtobuffer(monitor); | ||||
|  | ||||
|     gnss_sdr::MonitorPvt mon; | ||||
|     mon.ParseFromString(serialized_data); | ||||
|  | ||||
|     double read_latitude = mon.latitude(); | ||||
|     EXPECT_NEAR(true_latitude, read_latitude, 0.000001); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Carles Fernandez
					Carles Fernandez