diff --git a/docs/protobuf/monitor_pvt.proto b/docs/protobuf/monitor_pvt.proto
new file mode 100644
index 000000000..abbd9c5ff
--- /dev/null
+++ b/docs/protobuf/monitor_pvt.proto
@@ -0,0 +1,40 @@
+syntax = "proto3";
+
+package gnss_sdr;
+
+message MonitorPvt {
+
+uint32 tow_at_current_symbol_ms = 1;
+uint32 week = 2;
+double rx_time = 3;
+double user_clk_offset = 4;
+
+double pos_x = 5;
+double pos_y = 6;
+double pos_z = 7;
+double vel_x = 8;
+double vel_y = 9;
+double vel_z = 10;
+
+double cov_xx = 11;
+double cov_yy = 12;
+double cov_zz = 13;
+double cov_xy = 14;
+double cov_yz = 15;
+double cov_zx = 16;
+
+double latitude = 17;
+double longitude = 18;
+double height = 19;
+
+uint32 valid_sats = 20;
+uint32 solution_status = 21;
+uint32 solution_type = 22;
+float ar_ratio_factor = 23;
+float ar_ratio_threshold = 24;
+
+double gdop = 25;
+double pdop = 26;
+double hdop = 27;
+double vdop = 28;
+}
diff --git a/src/algorithms/PVT/libs/CMakeLists.txt b/src/algorithms/PVT/libs/CMakeLists.txt
index 879dd9cba..2cdae5daf 100644
--- a/src/algorithms/PVT/libs/CMakeLists.txt
+++ b/src/algorithms/PVT/libs/CMakeLists.txt
@@ -16,6 +16,7 @@
# along with GNSS-SDR. If not, see .
#
+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}")
diff --git a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc
index 2982ec401..708e4c7db 100644
--- a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc
+++ b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc
@@ -70,15 +70,25 @@ Monitor_Pvt_Udp_Sink::Monitor_Pvt_Udp_Sink(std::vector addresses, c
monitor_pvt.pdop = 0.0;
monitor_pvt.hdop = 0.0;
monitor_pvt.vdop = 0.0;
+
+ serdes = Serdes_Monitor_Pvt();
}
-bool Monitor_Pvt_Udp_Sink::write_monitor_pvt(const Monitor_Pvt& monitor_pvt)
+bool Monitor_Pvt_Udp_Sink::write_monitor_pvt(const Monitor_Pvt& monitor_pvt, bool protobuf)
{
- 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 (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)
{
diff --git a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h
index bf132bad4..f0db6c604 100644
--- a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h
+++ b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h
@@ -33,13 +33,14 @@
#define GNSS_SDR_MONITOR_PVT_UDP_SINK_H_
#include "monitor_pvt.h"
+#include "serdes_monitor_pvt.h"
#include
class Monitor_Pvt_Udp_Sink
{
public:
Monitor_Pvt_Udp_Sink(std::vector addresses, const uint16_t &port);
- bool write_monitor_pvt(const Monitor_Pvt &monitor_pvt);
+ bool write_monitor_pvt(const Monitor_Pvt &monitor_pvt, bool protobuf = false);
private:
boost::asio::io_service io_service;
@@ -47,6 +48,7 @@ private:
boost::system::error_code error;
std::vector endpoints;
Monitor_Pvt monitor_pvt;
+ Serdes_Monitor_Pvt serdes;
};
diff --git a/src/algorithms/PVT/libs/serdes_monitor_pvt.h b/src/algorithms/PVT/libs/serdes_monitor_pvt.h
new file mode 100644
index 000000000..e2a6e8cd5
--- /dev/null
+++ b/src/algorithms/PVT/libs/serdes_monitor_pvt.h
@@ -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 .
+ *
+ * -------------------------------------------------------------------------
+ */
+
+#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(mon.valid_sats());
+ monitor.solution_status = static_cast(mon.solution_status());
+ monitor.solution_type = static_cast(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_
diff --git a/src/core/protobuf/serdes_gnss_synchro.h b/src/core/protobuf/serdes_gnss_synchro.h
index 582877a8d..dceb0024c 100644
--- a/src/core/protobuf/serdes_gnss_synchro.h
+++ b/src/core/protobuf/serdes_gnss_synchro.h
@@ -50,6 +50,7 @@ public:
// 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()
{
@@ -58,10 +59,10 @@ public:
inline std::string createProtobuffer(const std::vector& vgs) //!< Serialization into a string
{
- gnss_sdr::Observables observables;
+ observables.Clear();
std::string data;
- for (int i = 0; i < vgs.size(); ++i)
+ for (uint32_t i = 0; i < vgs.size(); ++i)
{
gnss_sdr::GnssSynchro* obs = observables.add_observable();
Gnss_Synchro gs = vgs[i];
@@ -115,7 +116,7 @@ public:
std::vector vgs;
vgs.reserve(obs.observable_size());
- for (int i = 0; i < obs.observable_size(); ++i)
+ for (uint32_t i = 0; i < obs.observable_size(); ++i)
{
const gnss_sdr::GnssSynchro& gs_read = obs.observable(i);
Gnss_Synchro gs = Gnss_Synchro();
@@ -153,6 +154,8 @@ public:
}
return vgs;
}
+private:
+ gnss_sdr::Observables observables;
};
#endif // GNSS_SDR_SERDES_GNSS_SYNCHRO_H_