diff --git a/docs/doxygen/other/reference_docs.dox b/docs/doxygen/other/reference_docs.dox
index 78acda714..3759c876a 100644
--- a/docs/doxygen/other/reference_docs.dox
+++ b/docs/doxygen/other/reference_docs.dox
@@ -40,7 +40,7 @@ Check the Galileo website of the European Space Agency.
There is a website with Galileo constellation status information from the International GNSS Service.
-\li Galileo E5, E6, and E1: European GNSS (Galileo) Open Service. Signal In Space Interface Control Document. Ref: OS SIS ICD, Issue 1.1, European Commission, Sept. 2010.
+\li Galileo E5, E6, and E1: European GNSS (Galileo) Open Service. Signal In Space Interface Control Document. Ref: OS SIS ICD, Issue 1.2, European Commission, Nov. 2015.
\li European GNSS (Galileo) Open Service Signal-In-Space Operational Status Definition, European Commission, Sept. 2015.
diff --git a/src/core/system_parameters/rtcm.cc b/src/core/system_parameters/rtcm.cc
index f9adf58d8..0aaf8a1ab 100644
--- a/src/core/system_parameters/rtcm.cc
+++ b/src/core/system_parameters/rtcm.cc
@@ -30,9 +30,11 @@
#include "rtcm.h"
#include // for std::reverse
+#include // std::chrono::seconds
#include // for std::fmod
#include // for strtol
#include // for std::stringstream
+#include
#include // for to_upper_copy
#include
#include
@@ -41,7 +43,12 @@
using google::LogMessage;
DEFINE_int32(RTCM_Ref_Station_ID, 1234, "Reference Station ID in RTCM messages");
+DEFINE_int32(RTCM_Port, 2101 , "TCP port of the RTCM message server");
+// 2101 is the standard RTCM port according to the Internet Assigned Numbers Authority (IANA)
+// https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xml
+DEFINE_string(Remote_RTCM_Server, "localhost", "Remote RTCM server address");
+DEFINE_int32(Remote_RTCM_Port, 2101 , "Remote TCP port of the RTCM message server");
Rtcm::Rtcm()
@@ -49,9 +56,100 @@ Rtcm::Rtcm()
Rtcm::reset_data_fields();
preamble = std::bitset<8>("11010011");
reserved_field = std::bitset<6>("000000");
+ rtcm_message_queue = std::make_shared< concurrent_queue >();
+ // for each server, do:
+ boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), FLAGS_RTCM_Port);
+ servers.emplace_back(io_service, endpoint);
+ server_is_running = false;
}
+Rtcm::~Rtcm()
+{}
+
+
+
+// *****************************************************************************************************
+//
+// TCP Server / Client helper classes
+//
+// *****************************************************************************************************
+void Rtcm::run_server()
+{
+ std::cout << "Starting a TCP Server on port " << FLAGS_RTCM_Port << std::endl;
+ try
+ {
+ std::thread tq([&]{ std::make_shared(io_service, rtcm_message_queue, FLAGS_RTCM_Port)->do_read_queue(); });
+ tq.detach();
+
+ std::thread t([&]{ io_service.run(); });
+ server_is_running = true;
+ t.detach();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+}
+
+
+void Rtcm::stop_service()
+{
+ io_service.stop();
+}
+
+
+void Rtcm::stop_server()
+{
+ std::cout << "Stopping TCP Server on port " << FLAGS_RTCM_Port << std::endl;
+ rtcm_message_queue->push("Goodbye"); // this terminates tq
+ Rtcm::stop_service();
+ servers.front().close_server();
+ std::this_thread::sleep_for(std::chrono::seconds(1));
+ server_is_running = false;
+}
+
+
+void Rtcm::run_client()
+{
+ std::cout << "Starting a TCP Client on port " << FLAGS_Remote_RTCM_Port << std::endl;
+ std::string remote_host = FLAGS_Remote_RTCM_Server;
+ std::string remote_port = std::to_string(FLAGS_Remote_RTCM_Port);
+ boost::asio::ip::tcp::resolver resolver(io_service);
+ auto endpoint_iterator = resolver.resolve({ remote_host.c_str(), remote_port.c_str() });
+
+ clients.emplace_back(io_service, endpoint_iterator);
+ try
+ {
+ std::thread t([&](){ io_service.run(); });
+ t.detach();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+}
+
+
+void Rtcm::stop_client()
+{
+ std::cout << "Stopping TCP Client on port " << FLAGS_Remote_RTCM_Port << std::endl;
+ clients.front().close();
+ std::this_thread::sleep_for(std::chrono::seconds(1));
+ Rtcm::stop_service();
+}
+
+
+void Rtcm::send_message(const std::string & msg)
+{
+ rtcm_message_queue->push(msg);
+}
+
+
+bool Rtcm::is_server_running()
+{
+ return server_is_running;
+}
// *****************************************************************************************************
diff --git a/src/core/system_parameters/rtcm.h b/src/core/system_parameters/rtcm.h
index 98eeb0122..203a9c287 100644
--- a/src/core/system_parameters/rtcm.h
+++ b/src/core/system_parameters/rtcm.h
@@ -34,12 +34,18 @@
#include
+#include
#include