GNSS-SDR  0.0.17
An Open Source GNSS Software Defined Receiver
rtcm.h
Go to the documentation of this file.
1 /*!
2  * \file rtcm.h
3  * \brief Interface for the RTCM 3.2 Standard
4  * \author Carles Fernandez-Prades, 2015. cfernandez(at)cttc.es
5  *
6  * -----------------------------------------------------------------------------
7  *
8  * GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
9  * This file is part of GNSS-SDR.
10  *
11  * Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors)
12  * SPDX-License-Identifier: GPL-3.0-or-later
13  *
14  * -----------------------------------------------------------------------------
15  */
16 
17 
18 #ifndef GNSS_SDR_RTCM_H
19 #define GNSS_SDR_RTCM_H
20 
21 
22 #include "concurrent_queue.h"
23 #include "galileo_ephemeris.h"
24 #include "glonass_gnav_ephemeris.h"
25 #include "glonass_gnav_utc_model.h"
26 #include "gnss_synchro.h"
27 #include "gps_cnav_ephemeris.h"
28 #include "gps_ephemeris.h"
29 #include <boost/asio.hpp>
30 #include <boost/date_time/posix_time/posix_time.hpp>
31 #include <glog/logging.h>
32 #include <algorithm> // for min
33 #include <array>
34 #include <bitset>
35 #include <cstddef> // for size_t
36 #include <cstdint>
37 #include <cstring> // for memcpy
38 #include <deque>
39 #include <list>
40 #include <map>
41 #include <memory>
42 #include <set>
43 #include <string>
44 #include <thread>
45 #include <utility>
46 #include <vector>
47 
48 /** \addtogroup PVT
49  * \{ */
50 /** \addtogroup PVT_libs
51  * \{ */
52 
53 
54 #if USE_BOOST_ASIO_IO_CONTEXT
55 using b_io_context = boost::asio::io_context;
56 #else
57 using b_io_context = boost::asio::io_service;
58 #endif
59 
60 
61 /*!
62  * \brief This class implements the generation and reading of some Message Types
63  * defined in the RTCM 3.2 Standard, plus some utilities to handle messages.
64  *
65  * Generation of the following Message Types:
66  * 1001, 1002, 1003, 1004, 1005, 1006, 1008, 1019, 1020, 1029, 1045
67  *
68  * Decoding of the following Message Types:
69  * 1019, 1045
70  *
71  * Generation of the following Multiple Signal Messages:
72  * MSM1 (message types 1071, 1091)
73  * MSM2 (message types 1072, 1092)
74  * MSM3 (message types 1073, 1093)
75  * MSM4 (message types 1074, 1094)
76  * MSM5 (message types 1075, 1095)
77  * MSM6 (message types 1076, 1096)
78  * MSM7 (message types 1077, 1097)
79  *
80  * RTCM 3 message format (size in bits):
81  * +----------+--------+-----------+--------------------+----------+
82  * | preamble | 000000 | length | data message | parity |
83  * +----------+--------+-----------+--------------------+----------+
84  * |<-- 8 --->|<- 6 -->|<-- 10 --->|<--- length x 8 --->|<-- 24 -->|
85  * +----------+--------+-----------+--------------------+----------+
86  *
87  *
88  * (C) Carles Fernandez-Prades, 2015. cfernandez(at)cttc.es
89  */
90 class Rtcm
91 {
92 public:
93  explicit Rtcm(uint16_t port = 2101); //!< Default constructor that sets TCP port of the RTCM message server and RTCM Station ID. 2101 is the standard RTCM port according to the Internet Assigned Numbers Authority (IANA). See https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xml
94  ~Rtcm();
95 
96  /*!
97  * \brief Prints message type 1001 (L1-Only GPS RTK Observables)
98  */
99  std::string print_MT1001(const Gps_Ephemeris& gps_eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables, uint16_t station_id);
100 
101  /*!
102  * \brief Prints message type 1002 (Extended L1-Only GPS RTK Observables)
103  */
104  std::string print_MT1002(const Gps_Ephemeris& gps_eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables, uint16_t station_id);
105 
106  /*!
107  * \brief Prints message type 1003 (L1 & L2 GPS RTK Observables)
108  */
109  std::string print_MT1003(const Gps_Ephemeris& ephL1, const Gps_CNAV_Ephemeris& ephL2, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables, uint16_t station_id);
110 
111  /*!
112  * \brief Prints message type 1004 (Extended L1 & L2 GPS RTK Observables)
113  */
114  std::string print_MT1004(const Gps_Ephemeris& ephL1, const Gps_CNAV_Ephemeris& ephL2, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables, uint16_t station_id);
115 
116  /*!
117  * \brief Prints message type 1005 (Stationary Antenna Reference Point)
118  */
119  std::string print_MT1005(uint32_t ref_id, double ecef_x, double ecef_y, double ecef_z, bool gps, bool glonass, bool galileo, bool non_physical, bool single_oscillator, uint32_t quarter_cycle_indicator);
120 
121  /*!
122  * \brief Verifies and reads messages of type 1005 (Stationary Antenna Reference Point). Returns 1 if anything goes wrong, 0 otherwise.
123  */
124  int32_t read_MT1005(const std::string& message, uint32_t& ref_id, double& ecef_x, double& ecef_y, double& ecef_z, bool& gps, bool& glonass, bool& galileo);
125 
126  /*!
127  * \brief Prints message type 1006 (Stationary Antenna Reference Point, with Height Information)
128  */
129  std::string print_MT1006(uint32_t ref_id, double ecef_x, double ecef_y, double ecef_z, bool gps, bool glonass, bool galileo, bool non_physical, bool single_oscillator, uint32_t quarter_cycle_indicator, double height);
130 
131  std::string print_MT1005_test(); //!< For testing purposes
132 
133  /*!
134  * \brief Prints message type 1008 (Antenna Descriptor & Serial Number)
135  */
136  std::string print_MT1008(uint32_t ref_id, const std::string& antenna_descriptor, uint32_t antenna_setup_id, const std::string& antenna_serial_number);
137 
138  /*!
139  * \brief Prints L1-Only GLONASS RTK Observables
140  * \details This GLONASS message type is not generally used or supported; type 1012 is to be preferred.
141  * \note Code added as part of GSoC 2017 program
142  * \param glonass_gnav_eph GLONASS GNAV Broadcast Ephemeris
143  * \param obs_time Time of observation at the moment of printing
144  * \param observables Set of observables as defined by the platform
145  * \return string with message contents
146  */
147  std::string print_MT1009(const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables, uint16_t station_id);
148 
149  /*!
150  * \brief Prints Extended L1-Only GLONASS RTK Observables
151  * \details This GLONASS message type is used when only L1 data is present and bandwidth is very tight, often 1012 is used in such cases.
152  * \note Code added as part of GSoC 2017 program
153  * \param glonass_gnav_eph GLONASS GNAV Broadcast Ephemeris
154  * \param obs_time Time of observation at the moment of printing
155  * \param observables Set of observables as defined by the platform
156  * \return string with message contents
157  */
158  std::string print_MT1010(const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables, uint16_t station_id);
159 
160  /*!
161  * \brief Prints L1&L2 GLONASS RTK Observables
162  * \details This GLONASS message type is not generally used or supported; type 1012 is to be preferred
163  * \note Code added as part of GSoC 2017 program
164  * \param glonass_gnav_eph GLONASS GNAV Broadcast Ephemeris
165  * \param obs_time Time of observation at the moment of printing
166  * \param observables Set of observables as defined by the platform
167  * \return string with message contents
168  */
169  std::string print_MT1011(const Glonass_Gnav_Ephemeris& glonass_gnav_ephL1, const Glonass_Gnav_Ephemeris& glonass_gnav_ephL2, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables, uint16_t station_id);
170 
171  /*!
172  * \brief Prints Extended L1&L2 GLONASS RTK Observables
173  * \details This GLONASS message type is the most common observational message type, with L1/L2/SNR content. This is one of the most common messages found.
174  * \note Code added as part of GSoC 2017 program
175  * \param glonass_gnav_eph GLONASS GNAV Broadcast Ephemeris
176  * \param obs_time Time of observation at the moment of printing
177  * \param observables Set of observables as defined by the platform
178  * \return string with message contents
179  */
180  std::string print_MT1012(const Glonass_Gnav_Ephemeris& glonass_gnav_ephL1, const Glonass_Gnav_Ephemeris& glonass_gnav_ephL2, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables, uint16_t station_id);
181 
182  /*!
183  * \brief Prints message type 1019 (GPS Ephemeris), should be broadcast in the event that
184  * the IODC does not match the IODE, and every 2 minutes.
185  */
186  std::string print_MT1019(const Gps_Ephemeris& gps_eph);
187 
188  /*!
189  * \brief Verifies and reads messages of type 1019 (GPS Ephemeris). Returns 1 if anything goes wrong, 0 otherwise.
190  */
191  int32_t read_MT1019(const std::string& message, Gps_Ephemeris& gps_eph) const;
192 
193  /*!
194  * \brief Prints message type 1020 (GLONASS Ephemeris).
195  * \note Code added as part of GSoC 2017 program
196  * \param glonass_gnav_eph GLONASS GNAV Broadcast Ephemeris
197  * \param glonass_gnav_utc_model GLONASS GNAV Clock Information
198  * \return Returns message type as a string type
199  */
200  std::string print_MT1020(const Glonass_Gnav_Ephemeris& glonass_gnav_eph, const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model);
201 
202  /*!
203  * \brief Verifies and reads messages of type 1020 (GLONASS Ephemeris).
204  * \note Code added as part of GSoC 2017 program
205  * \param message Message to read as a string type
206  * \param glonass_gnav_eph GLONASS GNAV Broadcast Ephemeris
207  * \param glonass_gnav_utc_model GLONASS GNAV Clock Information
208  * \return Returns 1 if anything goes wrong, 0 otherwise.
209  */
210  int32_t read_MT1020(const std::string& message, Glonass_Gnav_Ephemeris& glonass_gnav_eph, Glonass_Gnav_Utc_Model& glonass_gnav_utc_model) const;
211 
212  /*!
213  * \brief Prints message type 1029 (Unicode Text String)
214  */
215  std::string print_MT1029(uint32_t ref_id, const Gps_Ephemeris& gps_eph, double obs_time, const std::string& message);
216 
217  /*!
218  * \brief Prints message type 1045 (Galileo Ephemeris), should be broadcast every 2 minutes
219  */
220  std::string print_MT1045(const Galileo_Ephemeris& gal_eph);
221 
222  /*!
223  * \brief Verifies and reads messages of type 1045 (Galileo Ephemeris). Returns 1 if anything goes wrong, 0 otherwise.
224  */
225  int32_t read_MT1045(const std::string& message, Galileo_Ephemeris& gal_eph) const;
226 
227  /*!
228  * \brief Prints messages of type MSM1 (Compact GNSS observables)
229  */
230  std::string print_MSM_1(const Gps_Ephemeris& gps_eph,
231  const Gps_CNAV_Ephemeris& gps_cnav_eph,
232  const Galileo_Ephemeris& gal_eph,
233  const Glonass_Gnav_Ephemeris& glo_gnav_eph,
234  double obs_time,
235  const std::map<int32_t, Gnss_Synchro>& observables,
236  uint32_t ref_id,
237  uint32_t clock_steering_indicator,
238  uint32_t external_clock_indicator,
239  int32_t smooth_int,
240  bool divergence_free,
241  bool more_messages);
242 
243  /*!
244  * \brief Prints messages of type MSM2 (Compact GNSS phaseranges)
245  */
246  std::string print_MSM_2(const Gps_Ephemeris& gps_eph,
247  const Gps_CNAV_Ephemeris& gps_cnav_eph,
248  const Galileo_Ephemeris& gal_eph,
249  const Glonass_Gnav_Ephemeris& glo_gnav_eph,
250  double obs_time,
251  const std::map<int32_t, Gnss_Synchro>& observables,
252  uint32_t ref_id,
253  uint32_t clock_steering_indicator,
254  uint32_t external_clock_indicator,
255  int32_t smooth_int,
256  bool divergence_free,
257  bool more_messages);
258 
259  /*!
260  * \brief Prints messages of type MSM3 (Compact GNSS pseudoranges and phaseranges)
261  */
262  std::string print_MSM_3(const Gps_Ephemeris& gps_eph,
263  const Gps_CNAV_Ephemeris& gps_cnav_eph,
264  const Galileo_Ephemeris& gal_eph,
265  const Glonass_Gnav_Ephemeris& glo_gnav_eph,
266  double obs_time,
267  const std::map<int32_t, Gnss_Synchro>& observables,
268  uint32_t ref_id,
269  uint32_t clock_steering_indicator,
270  uint32_t external_clock_indicator,
271  int32_t smooth_int,
272  bool divergence_free,
273  bool more_messages);
274 
275  /*!
276  * \brief Prints messages of type MSM4 (Full GNSS pseudoranges and phaseranges plus CNR)
277  */
278  std::string print_MSM_4(const Gps_Ephemeris& gps_eph,
279  const Gps_CNAV_Ephemeris& gps_cnav_eph,
280  const Galileo_Ephemeris& gal_eph,
281  const Glonass_Gnav_Ephemeris& glo_gnav_eph,
282  double obs_time,
283  const std::map<int32_t, Gnss_Synchro>& observables,
284  uint32_t ref_id,
285  uint32_t clock_steering_indicator,
286  uint32_t external_clock_indicator,
287  int32_t smooth_int,
288  bool divergence_free,
289  bool more_messages);
290 
291  /*!
292  * \brief Prints messages of type MSM5 (Full GNSS pseudoranges, phaseranges, phaserange rate and CNR)
293  */
294  std::string print_MSM_5(const Gps_Ephemeris& gps_eph,
295  const Gps_CNAV_Ephemeris& gps_cnav_eph,
296  const Galileo_Ephemeris& gal_eph,
297  const Glonass_Gnav_Ephemeris& glo_gnav_eph,
298  double obs_time,
299  const std::map<int32_t, Gnss_Synchro>& observables,
300  uint32_t ref_id,
301  uint32_t clock_steering_indicator,
302  uint32_t external_clock_indicator,
303  int32_t smooth_int,
304  bool divergence_free,
305  bool more_messages);
306 
307  /*!
308  * \brief Prints messages of type MSM6 (Full GNSS pseudoranges and phaseranges plus CNR, high resolution)
309  */
310  std::string print_MSM_6(const Gps_Ephemeris& gps_eph,
311  const Gps_CNAV_Ephemeris& gps_cnav_eph,
312  const Galileo_Ephemeris& gal_eph,
313  const Glonass_Gnav_Ephemeris& glo_gnav_eph,
314  double obs_time,
315  const std::map<int32_t, Gnss_Synchro>& observables,
316  uint32_t ref_id,
317  uint32_t clock_steering_indicator,
318  uint32_t external_clock_indicator,
319  int32_t smooth_int,
320  bool divergence_free,
321  bool more_messages);
322 
323  /*!
324  * \brief Prints messages of type MSM7 (Full GNSS pseudoranges, phaseranges, phaserange rate and CNR, high resolution)
325  */
326  std::string print_MSM_7(const Gps_Ephemeris& gps_eph,
327  const Gps_CNAV_Ephemeris& gps_cnav_eph,
328  const Galileo_Ephemeris& gal_eph,
329  const Glonass_Gnav_Ephemeris& glo_gnav_eph,
330  double obs_time,
331  const std::map<int32_t, Gnss_Synchro>& observables,
332  uint32_t ref_id,
333  uint32_t clock_steering_indicator,
334  uint32_t external_clock_indicator,
335  int32_t smooth_int,
336  bool divergence_free,
337  bool more_messages);
338 
339  uint32_t lock_time(const Gps_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro); //!< Returns the time period in which GPS L1 signals have been continually tracked.
340  uint32_t lock_time(const Gps_CNAV_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro); //!< Returns the time period in which GPS L2 signals have been continually tracked.
341  uint32_t lock_time(const Galileo_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro); //!< Returns the time period in which Galileo signals have been continually tracked.
342 
343  /*!
344  * \brief Locks time period in which GLONASS signals have been continually tracked.
345  * \note Code added as part of GSoC 2017 program
346  * \param eph GLONASS GNAV Broadcast Ephemeris
347  * \param obs_time Time of observation at the moment of printing
348  * \param observables Set of observables as defined by the platform
349  * \return Returns the time period in which GLONASS signals have been continually tracked.
350  */
351  uint32_t lock_time(const Glonass_Gnav_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro);
352 
353  std::string bin_to_hex(const std::string& s) const; //!< Returns a string of hexadecimal symbols from a string of binary symbols
354  std::string hex_to_bin(const std::string& s) const; //!< Returns a string of binary symbols from a string of hexadecimal symbols
355 
356  std::string bin_to_binary_data(const std::string& s) const; //!< Returns a string of binary data from a string of binary symbols
357  std::string binary_data_to_bin(const std::string& s) const; //!< Returns a string of binary symbols from a string of binary data
358 
359  uint32_t bin_to_uint(const std::string& s) const; //!< Returns an uint32_t from a string of binary symbols
360  int32_t bin_to_int(const std::string& s) const;
361  double bin_to_double(const std::string& s) const; //!< Returns double from a string of binary symbols
362  int32_t bin_to_sint(const std::string& s) const;
363  uint64_t hex_to_uint(const std::string& s) const; //!< Returns an uint64_t from a string of hexadecimal symbols
364  int64_t hex_to_int(const std::string& s) const; //!< Returns a int64_t from a string of hexadecimal symbols
365 
366  bool check_CRC(const std::string& message) const; //!< Checks that the CRC of a RTCM package is correct
367 
368  void run_server(); //!< Starts running the server
369  void stop_server(); //!< Stops the server
370 
371  void send_message(const std::string& msg); //!< Sends a message through the server to all connected clients
372  bool is_server_running() const; //!< Returns true if the server is running, false otherwise
373 
374 private:
375  //
376  // Generation of messages content
377  //
378  std::bitset<64> get_MT1001_4_header(uint32_t msg_number,
379  double obs_time,
380  const std::map<int32_t, Gnss_Synchro>& observables,
381  uint32_t ref_id,
382  uint32_t smooth_int,
383  bool sync_flag,
384  bool divergence_free);
385 
386  std::bitset<58> get_MT1001_sat_content(const Gps_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro);
387  std::bitset<74> get_MT1002_sat_content(const Gps_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro);
388  std::bitset<101> get_MT1003_sat_content(const Gps_Ephemeris& ephL1, const Gps_CNAV_Ephemeris& ephL2, double obs_time, const Gnss_Synchro& gnss_synchroL1, const Gnss_Synchro& gnss_synchroL2);
389  std::bitset<125> get_MT1004_sat_content(const Gps_Ephemeris& ephL1, const Gps_CNAV_Ephemeris& ephL2, double obs_time, const Gnss_Synchro& gnss_synchroL1, const Gnss_Synchro& gnss_synchroL2);
390 
391  std::bitset<152> get_MT1005_test();
392 
393  /*!
394  * \brief Generates contents of message header for types 1009, 1010, 1011 and 1012. GLONASS RTK Message
395  * \note Code added as part of GSoC 2017 program
396  * \param msg_number Message type number, acceptable options include 1009 to 1012
397  * \param obs_time Time of observation at the moment of printing
398  * \param observables Set of observables as defined by the platform
399  * \param ref_id
400  * \param smooth_int
401  * \param divergence_free
402  * \return Returns the message header content as set of bits
403  */
404  std::bitset<61> get_MT1009_12_header(uint32_t msg_number,
405  double obs_time,
406  const std::map<int32_t, Gnss_Synchro>& observables,
407  uint32_t ref_id,
408  uint32_t smooth_int,
409  bool sync_flag,
410  bool divergence_free);
411 
412  /*!
413  * \brief Get the contents of the satellite specific portion of a type 1009 Message (GLONASS Basic RTK, L1 Only)
414  * \details Contents generated for each satellite. See table 3.5-11
415  * \note Code added as part of GSoC 2017 program
416  * \param ephGNAV Ephemeris for GLONASS GNAV in L1 satellites
417  * \param obs_time Time of observation at the moment of printing
418  * \param gnss_synchro Information generated by channels while processing the satellite
419  * \return Returns the message content as set of bits
420  */
421  std::bitset<64> get_MT1009_sat_content(const Glonass_Gnav_Ephemeris& ephGNAV, double obs_time, const Gnss_Synchro& gnss_synchro);
422  /*!
423  * \brief Get the contents of the satellite specific portion of a type 1010 Message (GLONASS Extended RTK, L1 Only)
424  * \details Contents generated for each satellite. See table 3.5-12
425  * \note Code added as part of GSoC 2017 program
426  * \param ephGNAV Ephemeris for GLONASS GNAV in L1 satellites
427  * \param obs_time Time of observation at the moment of printing
428  * \param gnss_synchro Information generated by channels while processing the satellite
429  * \return Returns the message content as set of bits
430  */
431  std::bitset<79> get_MT1010_sat_content(const Glonass_Gnav_Ephemeris& ephGNAV, double obs_time, const Gnss_Synchro& gnss_synchro);
432  /*!
433  * \brief Get the contents of the satellite specific portion of a type 1011 Message (GLONASS Basic RTK, L1 & L2)
434  * \details Contents generated for each satellite. See table 3.5-13
435  * \note Code added as part of GSoC 2017 program
436  * \param ephGNAVL1 Ephemeris for GLONASS GNAV in L1 satellites
437  * \param ephGNAVL2 Ephemeris for GLONASS GNAV in L2 satellites
438  * \param obs_time Time of observation at the moment of printing
439  * \param gnss_synchroL1 Information generated by channels while processing the GLONASS GNAV L1 satellite
440  * \param gnss_synchroL2 Information generated by channels while processing the GLONASS GNAV L2 satellite
441  * \return Returns the message content as set of bits
442  */
443  std::bitset<107> get_MT1011_sat_content(const Glonass_Gnav_Ephemeris& ephL1, const Glonass_Gnav_Ephemeris& ephL2, double obs_time, const Gnss_Synchro& gnss_synchroL1, const Gnss_Synchro& gnss_synchroL2);
444  /*!
445  * \brief Get the contents of the satellite specific portion of a type 1012 Message (GLONASS Extended RTK, L1 & L2)
446  * \details Contents generated for each satellite. See table 3.5-14
447  * \note Code added as part of GSoC 2017 program
448  * \param ephGNAVL1 Ephemeris for GLONASS GNAV in L1 satellites
449  * \param ephGNAVL2 Ephemeris for GLONASS GNAV in L2 satellites
450  * \param obs_time Time of observation at the moment of printing
451  * \param gnss_synchroL1 Information generated by channels while processing the GLONASS GNAV L1 satellite
452  * \param gnss_synchroL2 Information generated by channels while processing the GLONASS GNAV L2 satellite
453  * \return Returns the message content as set of bits
454  */
455  std::bitset<130> get_MT1012_sat_content(const Glonass_Gnav_Ephemeris& ephL1, const Glonass_Gnav_Ephemeris& ephL2, double obs_time, const Gnss_Synchro& gnss_synchroL1, const Gnss_Synchro& gnss_synchroL2);
456 
457  std::string get_MSM_header(uint32_t msg_number,
458  double obs_time,
459  const std::map<int32_t, Gnss_Synchro>& observables,
460  uint32_t ref_id,
461  uint32_t clock_steering_indicator,
462  uint32_t external_clock_indicator,
463  int32_t smooth_int,
464  bool divergence_free,
465  bool more_messages);
466 
467  std::string get_MSM_1_content_sat_data(const std::map<int32_t, Gnss_Synchro>& observables);
468  std::string get_MSM_4_content_sat_data(const std::map<int32_t, Gnss_Synchro>& observables);
469  std::string get_MSM_5_content_sat_data(const std::map<int32_t, Gnss_Synchro>& observables);
470 
471  std::string get_MSM_1_content_signal_data(const std::map<int32_t, Gnss_Synchro>& observables);
472  std::string get_MSM_2_content_signal_data(const Gps_Ephemeris& ephNAV, const Gps_CNAV_Ephemeris& ephCNAV, const Galileo_Ephemeris& ephFNAV, const Glonass_Gnav_Ephemeris& ephGNAV, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables);
473  std::string get_MSM_3_content_signal_data(const Gps_Ephemeris& ephNAV, const Gps_CNAV_Ephemeris& ephCNAV, const Galileo_Ephemeris& ephFNAV, const Glonass_Gnav_Ephemeris& ephGNAV, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables);
474  std::string get_MSM_4_content_signal_data(const Gps_Ephemeris& ephNAV, const Gps_CNAV_Ephemeris& ephCNAV, const Galileo_Ephemeris& ephFNAV, const Glonass_Gnav_Ephemeris& ephGNAV, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables);
475  std::string get_MSM_5_content_signal_data(const Gps_Ephemeris& ephNAV, const Gps_CNAV_Ephemeris& ephCNAV, const Galileo_Ephemeris& ephFNAV, const Glonass_Gnav_Ephemeris& ephGNAV, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables);
476  std::string get_MSM_6_content_signal_data(const Gps_Ephemeris& ephNAV, const Gps_CNAV_Ephemeris& ephCNAV, const Galileo_Ephemeris& ephFNAV, const Glonass_Gnav_Ephemeris& ephGNAV, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables);
477  std::string get_MSM_7_content_signal_data(const Gps_Ephemeris& ephNAV, const Gps_CNAV_Ephemeris& ephCNAV, const Galileo_Ephemeris& ephFNAV, const Glonass_Gnav_Ephemeris& ephGNAV, double obs_time, const std::map<int32_t, Gnss_Synchro>& observables);
478 
479  //
480  // Utilities
481  //
482  static std::map<std::string, int> galileo_signal_map;
483  static std::map<std::string, int> gps_signal_map;
484  std::vector<std::pair<int32_t, Gnss_Synchro>> sort_by_signal(const std::vector<std::pair<int32_t, Gnss_Synchro>>& synchro_map) const;
485  std::vector<std::pair<int32_t, Gnss_Synchro>> sort_by_PRN_mask(const std::vector<std::pair<int32_t, Gnss_Synchro>>& synchro_map) const;
486  boost::posix_time::ptime compute_GPS_time(const Gps_Ephemeris& eph, double obs_time) const;
487  boost::posix_time::ptime compute_GPS_time(const Gps_CNAV_Ephemeris& eph, double obs_time) const;
488  boost::posix_time::ptime compute_Galileo_time(const Galileo_Ephemeris& eph, double obs_time) const;
489  boost::posix_time::ptime compute_GLONASS_time(const Glonass_Gnav_Ephemeris& eph, double obs_time) const;
490  boost::posix_time::ptime gps_L1_last_lock_time[64];
491  boost::posix_time::ptime gps_L2_last_lock_time[64];
492  boost::posix_time::ptime gal_E1_last_lock_time[64];
493  boost::posix_time::ptime gal_E5_last_lock_time[64];
494  boost::posix_time::ptime glo_L1_last_lock_time[64];
495  boost::posix_time::ptime glo_L2_last_lock_time[64];
496  uint32_t lock_time_indicator(uint32_t lock_time_period_s);
497  uint32_t msm_lock_time_indicator(uint32_t lock_time_period_s);
498  uint32_t msm_extended_lock_time_indicator(uint32_t lock_time_period_s);
499 
500  //
501  // Classes for TCP communication
502  //
503  uint16_t RTCM_port;
504  // uint16_t RTCM_Station_ID;
505  class Rtcm_Message
506  {
507  public:
508  static const std::size_t header_length = 6;
509  static const std::size_t max_body_length = 1029;
510 
511  Rtcm_Message()
512  : body_length_(0)
513  {
514  }
515 
516  const char* data() const
517  {
518  return data_.data();
519  }
520 
521  char* data()
522  {
523  return data_.data();
524  }
525 
526  inline std::size_t length() const
527  {
528  return header_length + body_length_;
529  }
530 
531  const char* body() const
532  {
533  return data_.data() + header_length;
534  }
535 
536  char* body()
537  {
538  return data_.data() + header_length;
539  }
540 
541  std::size_t body_length() const
542  {
543  return body_length_;
544  }
545 
546  void body_length(std::size_t new_length)
547  {
548  body_length_ = new_length;
549  if (body_length_ > max_body_length)
550  {
551  body_length_ = max_body_length;
552  }
553  }
554 
555  inline bool decode_header()
556  {
557  char header[header_length + 1] = "";
558  std::strncat(header, data_.data(), header_length);
559  if (header[0] != 'G' || header[1] != 'S')
560  {
561  return false;
562  }
563 
564  char header2_[header_length - 1] = "";
565  std::strncat(header2_, data_.data() + 2, header_length - 2);
566  body_length_ = std::atoi(header2_);
567  if (body_length_ == 0)
568  {
569  return false;
570  }
571 
572  if (body_length_ > max_body_length)
573  {
574  body_length_ = 0;
575  return false;
576  }
577  return true;
578  }
579 
580  inline void encode_header()
581  {
582  char header[header_length + 1] = "";
583  std::snprintf(header, header_length + 1, "GS%4d", std::max(std::min(static_cast<int>(body_length_), static_cast<int>(max_body_length)), 0));
584  std::memcpy(data_.data(), header, header_length);
585  }
586 
587  private:
588  std::array<char, header_length + max_body_length> data_{};
589  std::size_t body_length_;
590  };
591 
592 
593  class RtcmListener
594  {
595  public:
596  virtual ~RtcmListener() = default;
597  virtual void deliver(const Rtcm_Message& msg) = 0;
598  };
599 
600 
601  class Rtcm_Listener_Room
602  {
603  public:
604  inline void join(const std::shared_ptr<RtcmListener>& participant)
605  {
606  participants_.insert(participant);
607  for (auto msg : recent_msgs_)
608  {
609  participant->deliver(msg);
610  }
611  }
612 
613  inline void leave(const std::shared_ptr<RtcmListener>& participant)
614  {
615  participants_.erase(participant);
616  }
617 
618  inline void deliver(const Rtcm_Message& msg)
619  {
620  recent_msgs_.push_back(msg);
621  while (recent_msgs_.size() > max_recent_msgs)
622  {
623  recent_msgs_.pop_front();
624  }
625 
626  for (const auto& participant : participants_)
627  {
628  participant->deliver(msg);
629  }
630  }
631 
632  private:
633  std::set<std::shared_ptr<RtcmListener>> participants_;
634  enum
635  {
636  max_recent_msgs = 1
637  };
638  std::deque<Rtcm_Message> recent_msgs_;
639  };
640 
641 
642  class Rtcm_Session
643  : public RtcmListener,
644  public std::enable_shared_from_this<Rtcm_Session>
645  {
646  public:
647  Rtcm_Session(boost::asio::ip::tcp::socket socket, Rtcm_Listener_Room& room) : socket_(std::move(socket)), room_(room) {}
648  inline void start()
649  {
650  room_.join(shared_from_this());
651  do_read_message_header();
652  }
653 
654  inline void deliver(const Rtcm_Message& msg)
655  {
656  bool write_in_progress = !write_msgs_.empty();
657  write_msgs_.push_back(msg);
658  if (!write_in_progress)
659  {
660  do_write();
661  }
662  }
663 
664  private:
665  inline void do_read_message_header()
666  {
667  auto self(shared_from_this());
668  boost::asio::async_read(socket_,
669  boost::asio::buffer(read_msg_.data(), Rtcm_Message::header_length),
670  [this, self](boost::system::error_code ec, std::size_t /*length*/) {
671  if (!ec and read_msg_.decode_header())
672  {
673  do_read_message_body();
674  }
675  else if (!ec and !read_msg_.decode_header())
676  {
677  client_says += read_msg_.data();
678  bool first = true;
679  while (client_says.length() >= 80)
680  {
681  if (first == true)
682  {
683  LOG(INFO) << "Client says:";
684  first = false;
685  }
686  LOG(INFO) << client_says;
687  client_says = client_says.substr(80, client_says.length() - 80);
688  }
689  do_read_message_header();
690  }
691  else
692  {
693  std::cout << "Closing connection with RTCM client\n";
694  room_.leave(shared_from_this());
695  }
696  });
697  }
698 
699  inline void do_read_message_body()
700  {
701  auto self(shared_from_this());
702  boost::asio::async_read(socket_,
703  boost::asio::buffer(read_msg_.body(), read_msg_.body_length()),
704  [this, self](boost::system::error_code ec, std::size_t /*length*/) {
705  if (!ec)
706  {
707  room_.deliver(read_msg_);
708  // std::cout << "Delivered message (session): ";
709  // std::cout.write(read_msg_.body(), read_msg_.body_length());
710  // std::cout << '\n';
711  do_read_message_header();
712  }
713  else
714  {
715  std::cout << "Closing connection with RTCM client\n";
716  room_.leave(shared_from_this());
717  }
718  });
719  }
720 
721  inline void do_write()
722  {
723  auto self(shared_from_this());
724  boost::asio::async_write(socket_,
725  boost::asio::buffer(write_msgs_.front().body(), write_msgs_.front().body_length()),
726  [this, self](boost::system::error_code ec, std::size_t /*length*/) {
727  if (!ec)
728  {
729  write_msgs_.pop_front();
730  if (!write_msgs_.empty())
731  {
732  do_write();
733  }
734  }
735  else
736  {
737  std::cout << "Closing connection with RTCM client\n";
738  room_.leave(shared_from_this());
739  }
740  });
741  }
742 
743  boost::asio::ip::tcp::socket socket_;
744  Rtcm_Listener_Room& room_;
745  Rtcm_Message read_msg_;
746  std::deque<Rtcm_Message> write_msgs_;
747  std::string client_says;
748  };
749 
750 
751  class Tcp_Internal_Client
752  : public std::enable_shared_from_this<Tcp_Internal_Client>
753  {
754  public:
755  Tcp_Internal_Client(b_io_context& io_context,
756  boost::asio::ip::tcp::resolver::iterator endpoint_iterator)
757  : io_context_(io_context), socket_(io_context)
758  {
759  do_connect(std::move(endpoint_iterator));
760  }
761 
762  inline void close()
763  {
764  io_context_.post([this]() { socket_.close(); });
765  }
766 
767  inline void write(const Rtcm_Message& msg)
768  {
769  io_context_.post(
770  [this, msg]() {
771  bool write_in_progress = !write_msgs_.empty();
772  write_msgs_.push_back(msg);
773  if (!write_in_progress)
774  {
775  do_write();
776  }
777  });
778  }
779 
780  private:
781  inline void do_connect(boost::asio::ip::tcp::resolver::iterator endpoint_iterator)
782  {
783  boost::asio::async_connect(socket_, std::move(endpoint_iterator),
784  [this](boost::system::error_code ec, boost::asio::ip::tcp::resolver::iterator) {
785  if (!ec)
786  {
787  do_read_message();
788  }
789  else
790  {
791  std::cout << "Server is down.\n";
792  }
793  });
794  }
795 
796  inline void do_read_message()
797  {
798  boost::asio::async_read(socket_,
799  boost::asio::buffer(read_msg_.data(), 1029),
800  [this](boost::system::error_code ec, std::size_t /*length*/) {
801  if (!ec)
802  {
803  do_read_message();
804  }
805  else
806  {
807  std::cout << "Error in client\n";
808  socket_.close();
809  }
810  });
811  }
812 
813  inline void do_write()
814  {
815  boost::asio::async_write(socket_,
816  boost::asio::buffer(write_msgs_.front().data(), write_msgs_.front().length()),
817  [this](boost::system::error_code ec, std::size_t /*length*/) {
818  if (!ec)
819  {
820  write_msgs_.pop_front();
821  if (!write_msgs_.empty())
822  {
823  do_write();
824  }
825  }
826  else
827  {
828  socket_.close();
829  }
830  });
831  }
832 
833  b_io_context& io_context_;
834  boost::asio::ip::tcp::socket socket_;
835  Rtcm_Message read_msg_;
836  std::deque<Rtcm_Message> write_msgs_;
837  };
838 
839 
840  class Queue_Reader
841  {
842  public:
843  Queue_Reader(b_io_context& io_context, std::shared_ptr<Concurrent_Queue<std::string>>& queue, int32_t port) : queue_(queue)
844  {
845  boost::asio::ip::tcp::resolver resolver(io_context);
846  std::string host("localhost");
847  std::string port_str = std::to_string(port);
848  auto queue_endpoint_iterator = resolver.resolve({host.c_str(), port_str.c_str()});
849  c = std::make_shared<Tcp_Internal_Client>(io_context, queue_endpoint_iterator);
850  }
851 
852  inline void do_read_queue()
853  {
854  for (;;)
855  {
856  std::string message;
857  Rtcm_Message msg;
858  queue_->wait_and_pop(message); // message += '\n';
859  if (message == "Goodbye")
860  {
861  break;
862  }
863 
864  const char* char_msg = message.c_str();
865  msg.body_length(message.length());
866  std::memcpy(msg.body(), char_msg, msg.body_length());
867  msg.encode_header();
868  c->write(msg);
869  }
870  }
871 
872  private:
873  std::shared_ptr<Tcp_Internal_Client> c;
874  std::shared_ptr<Concurrent_Queue<std::string>>& queue_;
875  };
876 
877 
878  class Tcp_Server
879  {
880  public:
881  Tcp_Server(b_io_context& io_context, const boost::asio::ip::tcp::endpoint& endpoint)
882  : acceptor_(io_context), socket_(io_context)
883  {
884  acceptor_.open(endpoint.protocol());
885  acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
886  acceptor_.bind(endpoint);
887  acceptor_.listen();
888  do_accept();
889  }
890 
891  inline void close_server()
892  {
893  socket_.close();
894  acceptor_.close();
895  }
896 
897  private:
898  inline void do_accept()
899  {
900  acceptor_.async_accept(socket_, [this](boost::system::error_code ec) {
901  if (!ec)
902  {
903  if (first_client)
904  {
905  std::cout << "The TCP/IP server of RTCM messages is up and running. Accepting connections ...\n";
906  first_client = false;
907  }
908  else
909  {
910  std::cout << "Starting RTCM TCP/IP server session...\n";
911  boost::system::error_code ec2;
912  boost::asio::ip::tcp::endpoint endpoint = socket_.remote_endpoint(ec2);
913  if (ec2)
914  {
915  // Error creating remote_endpoint
916  std::cout << "Error getting remote IP address, closing session.\n";
917  LOG(INFO) << "Error getting remote IP address";
918  start_session = false;
919  }
920  else
921  {
922  std::string remote_addr = endpoint.address().to_string();
923  std::cout << "Serving client from " << remote_addr << '\n';
924  LOG(INFO) << "Serving client from " << remote_addr;
925  }
926  }
927  if (start_session)
928  {
929  std::make_shared<Rtcm_Session>(std::move(socket_), room_)->start();
930  }
931  }
932  else
933  {
934  std::cout << "Error when invoking a RTCM session. " << ec << '\n';
935  }
936  start_session = true;
937  do_accept();
938  });
939  }
940 
941  boost::asio::ip::tcp::acceptor acceptor_;
942  boost::asio::ip::tcp::socket socket_;
943  Rtcm_Listener_Room room_;
944  bool first_client = true;
945  bool start_session = true;
946  };
947 
948  b_io_context io_context;
949  std::shared_ptr<Concurrent_Queue<std::string>> rtcm_message_queue;
950  std::thread t;
951  std::thread tq;
952  std::list<Rtcm::Tcp_Server> servers;
953  bool server_is_running;
954  void stop_service();
955 
956  //
957  // Transport Layer
958  //
959  std::bitset<8> preamble;
960  std::bitset<6> reserved_field;
961  std::string add_CRC(const std::string& m) const;
962  std::string build_message(const std::string& data) const; // adds 0s to complete a byte and adds the CRC
963 
964  //
965  // Data Fields
966  //
967  std::bitset<12> DF002;
968  int32_t set_DF002(uint32_t message_number);
969 
970  std::bitset<12> DF003;
971  int32_t set_DF003(uint32_t ref_station_ID);
972 
973  std::bitset<30> DF004;
974  int32_t set_DF004(double obs_time);
975 
976  std::bitset<1> DF005;
977  int32_t set_DF005(bool sync_flag);
978 
979  std::bitset<5> DF006;
980  int32_t set_DF006(const std::map<int32_t, Gnss_Synchro>& observables);
981 
982  std::bitset<1> DF007;
983  int32_t set_DF007(bool divergence_free_smoothing_indicator); // 0 - Divergence-free smoothing not used 1 - Divergence-free smoothing used
984 
985  std::bitset<3> DF008;
986  int32_t set_DF008(int16_t smoothing_interval);
987 
988  std::bitset<6> DF009;
989  int32_t set_DF009(const Gnss_Synchro& gnss_synchro);
990  int32_t set_DF009(const Gps_Ephemeris& gps_eph);
991 
992  std::bitset<1> DF010;
993  int32_t set_DF010(bool code_indicator);
994 
995  std::bitset<24> DF011;
996  int32_t set_DF011(const Gnss_Synchro& gnss_synchro);
997 
998  std::bitset<20> DF012;
999  int32_t set_DF012(const Gnss_Synchro& gnss_synchro);
1000 
1001  std::bitset<7> DF013;
1002  int32_t set_DF013(const Gps_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro);
1003 
1004  std::bitset<8> DF014;
1005  int32_t set_DF014(const Gnss_Synchro& gnss_synchro);
1006 
1007  std::bitset<8> DF015;
1008  int32_t set_DF015(const Gnss_Synchro& gnss_synchro);
1009 
1010  std::bitset<14> DF017;
1011  int32_t set_DF017(const Gnss_Synchro& gnss_synchroL1, const Gnss_Synchro& gnss_synchroL2);
1012 
1013  std::bitset<20> DF018;
1014  int32_t set_DF018(const Gnss_Synchro& gnss_synchroL1, const Gnss_Synchro& gnss_synchroL2);
1015 
1016  std::bitset<7> DF019;
1017  int32_t set_DF019(const Gps_CNAV_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro);
1018 
1019  std::bitset<8> DF020;
1020  int32_t set_DF020(const Gnss_Synchro& gnss_synchro);
1021 
1022  std::bitset<6> DF021;
1023  int32_t set_DF021();
1024 
1025  std::bitset<1> DF022;
1026  int32_t set_DF022(bool gps_indicator);
1027 
1028  std::bitset<1> DF023;
1029  int32_t set_DF023(bool glonass_indicator);
1030 
1031  std::bitset<1> DF024;
1032  int32_t set_DF024(bool galileo_indicator);
1033 
1034  std::bitset<38> DF025;
1035  int32_t set_DF025(double antenna_ECEF_X_m);
1036 
1037  std::bitset<38> DF026;
1038  int32_t set_DF026(double antenna_ECEF_Y_m);
1039 
1040  std::bitset<38> DF027;
1041  int32_t set_DF027(double antenna_ECEF_Z_m);
1042 
1043  std::bitset<16> DF028;
1044  int32_t set_DF028(double height);
1045 
1046  std::bitset<8> DF029;
1047 
1048  std::bitset<8> DF031;
1049  int32_t set_DF031(uint32_t antenna_setup_id);
1050 
1051  std::bitset<8> DF032;
1052 
1053  /*!
1054  * \brief Sets the Data Field value
1055  * \note Code added as part of GSoC 2017 program
1056  * \param obs_time Time of observation at the moment of printing
1057  * \return returns 0 upon success
1058  */
1059  int32_t set_DF034(double obs_time);
1060  std::bitset<27> DF034; //!< GLONASS Epoch Time (tk)
1061 
1062  std::bitset<5> DF035; //!< No. of GLONASS Satellite Signals Processed
1063  int32_t set_DF035(const std::map<int32_t, Gnss_Synchro>& observables);
1064 
1065  std::bitset<1> DF036; //!< GLONASS Divergence-free Smoothing Indicator
1066  int32_t set_DF036(bool divergence_free_smoothing_indicator);
1067 
1068  std::bitset<3> DF037; //!< GLONASS Smoothing Interval
1069  int32_t set_DF037(int16_t smoothing_interval);
1070 
1071  std::bitset<6> DF038; //!< GLONASS Satellite ID (Satellite Slot Number)
1072  int32_t set_DF038(const Gnss_Synchro& gnss_synchro);
1073  int32_t set_DF038(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1074 
1075  std::bitset<1> DF039; //!< GLONASS L1 Code Indicator
1076  int32_t set_DF039(bool code_indicator);
1077 
1078  std::bitset<5> DF040; //!< GLONASS Satellite Frequency Number
1079  int32_t set_DF040(int32_t frequency_channel_number);
1080  int32_t set_DF040(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1081 
1082  std::bitset<25> DF041; //!< GLONASS L1 Pseudorange
1083  int32_t set_DF041(const Gnss_Synchro& gnss_synchro);
1084 
1085  std::bitset<20> DF042; //!< GLONASS L1 PhaseRange - L1 Pseudorange
1086  int32_t set_DF042(const Gnss_Synchro& gnss_synchro);
1087 
1088  std::bitset<7> DF043; //!< GLONASS L1 Lock Time Indicator
1089  int32_t set_DF043(const Glonass_Gnav_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro);
1090 
1091  std::bitset<7> DF044; //!< GLONASS Integer L1 Pseudorange Modulus Ambiguity
1092  int32_t set_DF044(const Gnss_Synchro& gnss_synchro);
1093 
1094  std::bitset<8> DF045; //!< GLONASS L1 CNR
1095  int32_t set_DF045(const Gnss_Synchro& gnss_synchro);
1096 
1097  std::bitset<2> DF046; //!< GLONASS L2 code indicator
1098  int32_t set_DF046(uint16_t code_indicator);
1099 
1100  std::bitset<14> DF047; //!< GLONASS L2 - L1 Pseudorange Difference
1101  int32_t set_DF047(const Gnss_Synchro& gnss_synchroL1, const Gnss_Synchro& gnss_synchroL2);
1102 
1103  std::bitset<20> DF048; //!< GLONASS L2 PhaseRange - L1 Pseudorange
1104  int32_t set_DF048(const Gnss_Synchro& gnss_synchroL1, const Gnss_Synchro& gnss_synchroL2);
1105 
1106  std::bitset<7> DF049; //!< GLONASS L2 Lock Time Indicator
1107  int32_t set_DF049(const Glonass_Gnav_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro);
1108 
1109  std::bitset<8> DF050; //!< GLONASS L2 CNR
1110  int32_t set_DF050(const Gnss_Synchro& gnss_synchro);
1111 
1112  std::bitset<16> DF051;
1113  int32_t set_DF051(const Gps_Ephemeris& gps_eph, double obs_time);
1114 
1115  std::bitset<17> DF052;
1116  int32_t set_DF052(const Gps_Ephemeris& gps_eph, double obs_time);
1117 
1118  // Contents of GPS Satellite Ephemeris Data, Message Type 1019
1119  std::bitset<8> DF071;
1120  int32_t set_DF071(const Gps_Ephemeris& gps_eph);
1121 
1122  std::bitset<10> DF076;
1123  int32_t set_DF076(const Gps_Ephemeris& gps_eph);
1124 
1125  std::bitset<4> DF077;
1126  int32_t set_DF077(const Gps_Ephemeris& gps_eph);
1127 
1128  std::bitset<2> DF078;
1129  int32_t set_DF078(const Gps_Ephemeris& gps_eph);
1130 
1131  std::bitset<14> DF079;
1132  int32_t set_DF079(const Gps_Ephemeris& gps_eph);
1133 
1134  std::bitset<8> DF080;
1135  int32_t set_DF080(const Gps_Ephemeris& gps_eph);
1136 
1137  std::bitset<16> DF081;
1138  int32_t set_DF081(const Gps_Ephemeris& gps_eph);
1139 
1140  std::bitset<8> DF082;
1141  int32_t set_DF082(const Gps_Ephemeris& gps_eph);
1142 
1143  std::bitset<16> DF083;
1144  int32_t set_DF083(const Gps_Ephemeris& gps_eph);
1145 
1146  std::bitset<22> DF084;
1147  int32_t set_DF084(const Gps_Ephemeris& gps_eph);
1148 
1149  std::bitset<10> DF085;
1150  int32_t set_DF085(const Gps_Ephemeris& gps_eph);
1151 
1152  std::bitset<16> DF086;
1153  int32_t set_DF086(const Gps_Ephemeris& gps_eph);
1154 
1155  std::bitset<16> DF087;
1156  int32_t set_DF087(const Gps_Ephemeris& gps_eph);
1157 
1158  std::bitset<32> DF088;
1159  int32_t set_DF088(const Gps_Ephemeris& gps_eph);
1160 
1161  std::bitset<16> DF089;
1162  int32_t set_DF089(const Gps_Ephemeris& gps_eph);
1163 
1164  std::bitset<32> DF090;
1165  int32_t set_DF090(const Gps_Ephemeris& gps_eph);
1166 
1167  std::bitset<16> DF091;
1168  int32_t set_DF091(const Gps_Ephemeris& gps_eph);
1169 
1170  std::bitset<32> DF092;
1171  int32_t set_DF092(const Gps_Ephemeris& gps_eph);
1172 
1173  std::bitset<16> DF093;
1174  int32_t set_DF093(const Gps_Ephemeris& gps_eph);
1175 
1176  std::bitset<16> DF094;
1177  int32_t set_DF094(const Gps_Ephemeris& gps_eph);
1178 
1179  std::bitset<32> DF095;
1180  int32_t set_DF095(const Gps_Ephemeris& gps_eph);
1181 
1182  std::bitset<16> DF096;
1183  int32_t set_DF096(const Gps_Ephemeris& gps_eph);
1184 
1185  std::bitset<32> DF097;
1186  int32_t set_DF097(const Gps_Ephemeris& gps_eph);
1187 
1188  std::bitset<16> DF098;
1189  int32_t set_DF098(const Gps_Ephemeris& gps_eph);
1190 
1191  std::bitset<32> DF099;
1192  int32_t set_DF099(const Gps_Ephemeris& gps_eph);
1193 
1194  std::bitset<24> DF100;
1195  int32_t set_DF100(const Gps_Ephemeris& gps_eph);
1196 
1197  std::bitset<8> DF101;
1198  int32_t set_DF101(const Gps_Ephemeris& gps_eph);
1199 
1200  std::bitset<6> DF102;
1201  int32_t set_DF102(const Gps_Ephemeris& gps_eph);
1202 
1203  std::bitset<1> DF103;
1204  int32_t set_DF103(const Gps_Ephemeris& gps_eph);
1205 
1206  std::bitset<1> DF104; //!< GLONASS Almanac Health
1207  int32_t set_DF104(uint32_t glonass_gnav_alm_health);
1208 
1209  std::bitset<1> DF105; //!< GLONASS Almanac Health Availability Indicator
1210  int32_t set_DF105(uint32_t glonass_gnav_alm_health_ind);
1211 
1212  std::bitset<2> DF106; //!< GLONASS P1 Word
1213  int32_t set_DF106(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1214 
1215  std::bitset<12> DF107; //!< GLONASS Epoch (tk)
1216  int32_t set_DF107(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1217 
1218  std::bitset<1> DF108; //!< GLONASS MSB of Bn Word
1219  int32_t set_DF108(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1220 
1221  std::bitset<1> DF109; //!< GLONASS P2 Word
1222  int32_t set_DF109(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1223 
1224  std::bitset<7> DF110; //!< GLONASS Ephmeris Epoch (tb)
1225  int32_t set_DF110(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1226 
1227  std::bitset<24> DF111; //!< GLONASS Xn first derivative
1228  int32_t set_DF111(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1229 
1230  std::bitset<27> DF112; //!< GLONASS Xn
1231  int32_t set_DF112(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1232 
1233  std::bitset<5> DF113; //!< GLONASS Xn second derivative
1234  int32_t set_DF113(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1235 
1236  std::bitset<24> DF114; //!< GLONASS Yn first derivative
1237  int32_t set_DF114(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1238 
1239  std::bitset<27> DF115; //!< GLONASS Yn
1240  int32_t set_DF115(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1241 
1242  std::bitset<5> DF116; //!< GLONASS Yn second derivative
1243  int32_t set_DF116(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1244 
1245  std::bitset<24> DF117; //!< GLONASS Zn first derivative
1246  int32_t set_DF117(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1247 
1248  std::bitset<27> DF118; //!< GLONASS Zn
1249  int32_t set_DF118(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1250 
1251  std::bitset<5> DF119; //!< GLONASS Zn second derivative
1252  int32_t set_DF119(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1253 
1254  std::bitset<1> DF120; //!< GLONASS P3
1255  int32_t set_DF120(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1256 
1257  std::bitset<11> DF121; //!< GLONASS GAMMA_N
1258  int32_t set_DF121(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1259 
1260  std::bitset<2> DF122; //!< GLONASS P
1261  int32_t set_DF122(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1262 
1263  std::bitset<1> DF123; //!< GLONASS ln (third string)
1264  int32_t set_DF123(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1265 
1266  std::bitset<22> DF124; //!< GLONASS TAU_N
1267  int32_t set_DF124(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1268 
1269  std::bitset<5> DF125; //!< GLONASS DELTA_TAU_N
1270  int32_t set_DF125(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1271 
1272  std::bitset<5> DF126; //!< GLONASS Eccentricity
1273  int32_t set_DF126(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1274 
1275  std::bitset<1> DF127; //!< GLONASS P4
1276  int32_t set_DF127(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1277 
1278  std::bitset<4> DF128; //!< GLONASS F_T
1279  int32_t set_DF128(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1280 
1281  std::bitset<11> DF129; //!< GLONASS N_T
1282  int32_t set_DF129(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1283 
1284  std::bitset<2> DF130; //!< GLONASS M
1285  int32_t set_DF130(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1286 
1287  std::bitset<1> DF131; //!< GLONASS Availability of additional data
1288  int32_t set_DF131(uint32_t fifth_str_additional_data_ind);
1289 
1290  std::bitset<11> DF132; //!< GLONASS N_A
1291  int32_t set_DF132(const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model);
1292 
1293  std::bitset<32> DF133; //!< GLONASS TAU_C
1294  int32_t set_DF133(const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model);
1295 
1296  std::bitset<5> DF134; //!< GLONASS N_4
1297  int32_t set_DF134(const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model);
1298 
1299  std::bitset<22> DF135; //!< GLONASS TAU_GPS
1300  int32_t set_DF135(const Glonass_Gnav_Utc_Model& glonass_gnav_utc_model);
1301 
1302  std::bitset<1> DF136; //!< GLONASS L_N (FIFTH STRING)
1303  int32_t set_DF136(const Glonass_Gnav_Ephemeris& glonass_gnav_eph);
1304 
1305  std::bitset<1> DF137;
1306  int32_t set_DF137(const Gps_Ephemeris& gps_eph);
1307 
1308 
1309  std::bitset<1> DF141;
1310  int32_t set_DF141(const Gps_Ephemeris& gps_eph);
1311 
1312  std::bitset<1> DF142;
1313  int32_t set_DF142(const Gps_Ephemeris& gps_eph);
1314 
1315  std::bitset<30> DF248;
1316  int32_t set_DF248(double obs_time);
1317 
1318  // Contents of Galileo F/NAV Satellite Ephemeris Data, Message Type 1045
1319  std::bitset<6> DF252;
1320  int32_t set_DF252(const Galileo_Ephemeris& gal_eph);
1321 
1322  std::bitset<12> DF289;
1323  int32_t set_DF289(const Galileo_Ephemeris& gal_eph);
1324 
1325  std::bitset<10> DF290;
1326  int32_t set_DF290(const Galileo_Ephemeris& gal_eph);
1327 
1328  std::bitset<8> DF291;
1329  int32_t set_DF291(const Galileo_Ephemeris& gal_eph);
1330 
1331  std::bitset<14> DF292;
1332  int32_t set_DF292(const Galileo_Ephemeris& gal_eph);
1333 
1334  std::bitset<14> DF293;
1335  int32_t set_DF293(const Galileo_Ephemeris& gal_eph);
1336 
1337  std::bitset<6> DF294;
1338  int32_t set_DF294(const Galileo_Ephemeris& gal_eph);
1339 
1340  std::bitset<21> DF295;
1341  int32_t set_DF295(const Galileo_Ephemeris& gal_eph);
1342 
1343  std::bitset<31> DF296;
1344  int32_t set_DF296(const Galileo_Ephemeris& gal_eph);
1345 
1346  std::bitset<16> DF297;
1347  int32_t set_DF297(const Galileo_Ephemeris& gal_eph);
1348 
1349  std::bitset<16> DF298;
1350  int32_t set_DF298(const Galileo_Ephemeris& gal_eph);
1351 
1352  std::bitset<32> DF299;
1353  int32_t set_DF299(const Galileo_Ephemeris& gal_eph);
1354 
1355  std::bitset<16> DF300;
1356  int32_t set_DF300(const Galileo_Ephemeris& gal_eph);
1357 
1358  std::bitset<32> DF301;
1359  int32_t set_DF301(const Galileo_Ephemeris& gal_eph);
1360 
1361  std::bitset<16> DF302;
1362  int32_t set_DF302(const Galileo_Ephemeris& gal_eph);
1363 
1364  std::bitset<32> DF303;
1365  int32_t set_DF303(const Galileo_Ephemeris& gal_eph);
1366 
1367  std::bitset<14> DF304;
1368  int32_t set_DF304(const Galileo_Ephemeris& gal_eph);
1369 
1370  std::bitset<16> DF305;
1371  int32_t set_DF305(const Galileo_Ephemeris& gal_eph);
1372 
1373  std::bitset<32> DF306;
1374  int32_t set_DF306(const Galileo_Ephemeris& gal_eph);
1375 
1376  std::bitset<16> DF307;
1377  int32_t set_DF307(const Galileo_Ephemeris& gal_eph);
1378 
1379  std::bitset<32> DF308;
1380  int32_t set_DF308(const Galileo_Ephemeris& gal_eph);
1381 
1382  std::bitset<16> DF309;
1383  int32_t set_DF309(const Galileo_Ephemeris& gal_eph);
1384 
1385  std::bitset<32> DF310;
1386  int32_t set_DF310(const Galileo_Ephemeris& gal_eph);
1387 
1388  std::bitset<24> DF311;
1389  int32_t set_DF311(const Galileo_Ephemeris& gal_eph);
1390 
1391  std::bitset<10> DF312;
1392  int32_t set_DF312(const Galileo_Ephemeris& gal_eph);
1393 
1394  std::bitset<10> DF313;
1395  int32_t set_DF313(const Galileo_Ephemeris& gal_eph);
1396 
1397  std::bitset<2> DF314;
1398  int32_t set_DF314(const Galileo_Ephemeris& gal_eph);
1399 
1400  std::bitset<1> DF315;
1401  int32_t set_DF315(const Galileo_Ephemeris& gal_eph);
1402 
1403  std::bitset<2> DF364;
1404 
1405  // Content of message header for MSM1, MSM2, MSM3, MSM4, MSM5, MSM6 and MSM7
1406  std::bitset<1> DF393;
1407  int32_t set_DF393(bool more_messages); // 1 indicates that more MSMs follow for given physical time and reference station ID
1408 
1409  std::bitset<64> DF394;
1410  int32_t set_DF394(const std::map<int32_t, Gnss_Synchro>& gnss_synchro);
1411 
1412  std::bitset<32> DF395;
1413  int32_t set_DF395(const std::map<int32_t, Gnss_Synchro>& gnss_synchro);
1414 
1415  std::string set_DF396(const std::map<int32_t, Gnss_Synchro>& observables);
1416 
1417  std::bitset<8> DF397;
1418  int32_t set_DF397(const Gnss_Synchro& gnss_synchro);
1419 
1420  std::bitset<10> DF398;
1421  int32_t set_DF398(const Gnss_Synchro& gnss_synchro);
1422 
1423  std::bitset<14> DF399;
1424  int32_t set_DF399(const Gnss_Synchro& gnss_synchro);
1425 
1426  std::bitset<15> DF400;
1427  int32_t set_DF400(const Gnss_Synchro& gnss_synchro);
1428 
1429  std::bitset<22> DF401;
1430  int32_t set_DF401(const Gnss_Synchro& gnss_synchro);
1431 
1432  std::bitset<4> DF402;
1433  int32_t set_DF402(const Gps_Ephemeris& ephNAV, const Gps_CNAV_Ephemeris& ephCNAV, const Galileo_Ephemeris& ephFNAV, const Glonass_Gnav_Ephemeris& ephGNAV, double obs_time, const Gnss_Synchro& gnss_synchro);
1434 
1435  std::bitset<6> DF403;
1436  int32_t set_DF403(const Gnss_Synchro& gnss_synchro);
1437 
1438  std::bitset<15> DF404;
1439  int32_t set_DF404(const Gnss_Synchro& gnss_synchro);
1440 
1441  std::bitset<20> DF405;
1442  int32_t set_DF405(const Gnss_Synchro& gnss_synchro);
1443 
1444  std::bitset<24> DF406;
1445  int32_t set_DF406(const Gnss_Synchro& gnss_synchro);
1446 
1447  std::bitset<10> DF407;
1448  int32_t set_DF407(const Gps_Ephemeris& ephNAV, const Gps_CNAV_Ephemeris& ephCNAV, const Galileo_Ephemeris& ephFNAV, const Glonass_Gnav_Ephemeris& ephGNAV, double obs_time, const Gnss_Synchro& gnss_synchro);
1449 
1450  std::bitset<10> DF408;
1451  int32_t set_DF408(const Gnss_Synchro& gnss_synchro);
1452 
1453  std::bitset<3> DF409;
1454  int32_t set_DF409(uint32_t iods);
1455 
1456  std::bitset<2> DF411;
1457  int32_t set_DF411(uint32_t clock_steering_indicator);
1458 
1459  std::bitset<2> DF412;
1460  int32_t set_DF412(uint32_t external_clock_indicator);
1461 
1462  std::bitset<1> DF417;
1463  int32_t set_DF417(bool using_divergence_free_smoothing);
1464 
1465  std::bitset<3> DF418;
1466  int32_t set_DF418(int32_t carrier_smoothing_interval_s);
1467 
1468  std::bitset<1> DF420;
1469  int32_t set_DF420(const Gnss_Synchro& gnss_synchro);
1470 };
1471 
1472 
1473 /** \} */
1474 /** \} */
1475 #endif // GNSS_SDR_RTCM_H
uint32_t bin_to_uint(const std::string &s) const
Returns an uint32_t from a string of binary symbols.
This is a storage class for the GPS CNAV ephemeris data as described in IS-GPS-200M.
Interface of a thread-safe std::queue.
std::string print_MT1005(uint32_t ref_id, double ecef_x, double ecef_y, double ecef_z, bool gps, bool glonass, bool galileo, bool non_physical, bool single_oscillator, uint32_t quarter_cycle_indicator)
Prints message type 1005 (Stationary Antenna Reference Point)
std::string print_MT1001(const Gps_Ephemeris &gps_eph, double obs_time, const std::map< int32_t, Gnss_Synchro > &observables, uint16_t station_id)
Prints message type 1001 (L1-Only GPS RTK Observables)
Interface of a GLONASS EPHEMERIS storage.
Interface of a GLONASS GNAV UTC MODEL storage.
This class is a storage and orbital model functions for the GPS SV ephemeris data as described in IS-...
Definition: gps_ephemeris.h:40
std::string print_MT1045(const Galileo_Ephemeris &gal_eph)
Prints message type 1045 (Galileo Ephemeris), should be broadcast every 2 minutes.
std::string print_MT1004(const Gps_Ephemeris &ephL1, const Gps_CNAV_Ephemeris &ephL2, double obs_time, const std::map< int32_t, Gnss_Synchro > &observables, uint16_t station_id)
Prints message type 1004 (Extended L1 & L2 GPS RTK Observables)
uint64_t hex_to_uint(const std::string &s) const
Returns an uint64_t from a string of hexadecimal symbols.
std::string bin_to_binary_data(const std::string &s) const
Returns a string of binary data from a string of binary symbols.
std::string print_MSM_5(const Gps_Ephemeris &gps_eph, const Gps_CNAV_Ephemeris &gps_cnav_eph, const Galileo_Ephemeris &gal_eph, const Glonass_Gnav_Ephemeris &glo_gnav_eph, double obs_time, const std::map< int32_t, Gnss_Synchro > &observables, uint32_t ref_id, uint32_t clock_steering_indicator, uint32_t external_clock_indicator, int32_t smooth_int, bool divergence_free, bool more_messages)
Prints messages of type MSM5 (Full GNSS pseudoranges, phaseranges, phaserange rate and CNR) ...
std::string print_MSM_6(const Gps_Ephemeris &gps_eph, const Gps_CNAV_Ephemeris &gps_cnav_eph, const Galileo_Ephemeris &gal_eph, const Glonass_Gnav_Ephemeris &glo_gnav_eph, double obs_time, const std::map< int32_t, Gnss_Synchro > &observables, uint32_t ref_id, uint32_t clock_steering_indicator, uint32_t external_clock_indicator, int32_t smooth_int, bool divergence_free, bool more_messages)
Prints messages of type MSM6 (Full GNSS pseudoranges and phaseranges plus CNR, high resolution) ...
std::string print_MT1019(const Gps_Ephemeris &gps_eph)
Prints message type 1019 (GPS Ephemeris), should be broadcast in the event that the IODC does not mat...
bool check_CRC(const std::string &message) const
Checks that the CRC of a RTCM package is correct.
std::string print_MSM_1(const Gps_Ephemeris &gps_eph, const Gps_CNAV_Ephemeris &gps_cnav_eph, const Galileo_Ephemeris &gal_eph, const Glonass_Gnav_Ephemeris &glo_gnav_eph, double obs_time, const std::map< int32_t, Gnss_Synchro > &observables, uint32_t ref_id, uint32_t clock_steering_indicator, uint32_t external_clock_indicator, int32_t smooth_int, bool divergence_free, bool more_messages)
Prints messages of type MSM1 (Compact GNSS observables)
std::string print_MT1029(uint32_t ref_id, const Gps_Ephemeris &gps_eph, double obs_time, const std::string &message)
Prints message type 1029 (Unicode Text String)
std::string print_MT1005_test()
For testing purposes.
std::string print_MT1010(const Glonass_Gnav_Ephemeris &glonass_gnav_eph, double obs_time, const std::map< int32_t, Gnss_Synchro > &observables, uint16_t station_id)
Prints Extended L1-Only GLONASS RTK Observables.
int32_t read_MT1019(const std::string &message, Gps_Ephemeris &gps_eph) const
Verifies and reads messages of type 1019 (GPS Ephemeris). Returns 1 if anything goes wrong...
std::string print_MT1002(const Gps_Ephemeris &gps_eph, double obs_time, const std::map< int32_t, Gnss_Synchro > &observables, uint16_t station_id)
Prints message type 1002 (Extended L1-Only GPS RTK Observables)
This class is a storage and orbital model functions for the GLONASS SV ephemeris data as described in...
This is the class that contains the information that is shared by the processing blocks.
Definition: gnss_synchro.h:38
std::string print_MSM_4(const Gps_Ephemeris &gps_eph, const Gps_CNAV_Ephemeris &gps_cnav_eph, const Galileo_Ephemeris &gal_eph, const Glonass_Gnav_Ephemeris &glo_gnav_eph, double obs_time, const std::map< int32_t, Gnss_Synchro > &observables, uint32_t ref_id, uint32_t clock_steering_indicator, uint32_t external_clock_indicator, int32_t smooth_int, bool divergence_free, bool more_messages)
Prints messages of type MSM4 (Full GNSS pseudoranges and phaseranges plus CNR)
This class implements the generation and reading of some Message Types defined in the RTCM 3...
Definition: rtcm.h:90
std::string print_MT1008(uint32_t ref_id, const std::string &antenna_descriptor, uint32_t antenna_setup_id, const std::string &antenna_serial_number)
Prints message type 1008 (Antenna Descriptor & Serial Number)
std::string print_MT1003(const Gps_Ephemeris &ephL1, const Gps_CNAV_Ephemeris &ephL2, double obs_time, const std::map< int32_t, Gnss_Synchro > &observables, uint16_t station_id)
Prints message type 1003 (L1 & L2 GPS RTK Observables)
std::string print_MSM_2(const Gps_Ephemeris &gps_eph, const Gps_CNAV_Ephemeris &gps_cnav_eph, const Galileo_Ephemeris &gal_eph, const Glonass_Gnav_Ephemeris &glo_gnav_eph, double obs_time, const std::map< int32_t, Gnss_Synchro > &observables, uint32_t ref_id, uint32_t clock_steering_indicator, uint32_t external_clock_indicator, int32_t smooth_int, bool divergence_free, bool more_messages)
Prints messages of type MSM2 (Compact GNSS phaseranges)
std::string print_MT1009(const Glonass_Gnav_Ephemeris &glonass_gnav_eph, double obs_time, const std::map< int32_t, Gnss_Synchro > &observables, uint16_t station_id)
Prints L1-Only GLONASS RTK Observables.
Rtcm(uint16_t port=2101)
Default constructor that sets TCP port of the RTCM message server and RTCM Station ID...
std::string binary_data_to_bin(const std::string &s) const
Returns a string of binary symbols from a string of binary data.
std::string print_MSM_7(const Gps_Ephemeris &gps_eph, const Gps_CNAV_Ephemeris &gps_cnav_eph, const Galileo_Ephemeris &gal_eph, const Glonass_Gnav_Ephemeris &glo_gnav_eph, double obs_time, const std::map< int32_t, Gnss_Synchro > &observables, uint32_t ref_id, uint32_t clock_steering_indicator, uint32_t external_clock_indicator, int32_t smooth_int, bool divergence_free, bool more_messages)
Prints messages of type MSM7 (Full GNSS pseudoranges, phaseranges, phaserange rate and CNR...
std::string hex_to_bin(const std::string &s) const
Returns a string of binary symbols from a string of hexadecimal symbols.
std::string bin_to_hex(const std::string &s) const
Returns a string of hexadecimal symbols from a string of binary symbols.
int32_t read_MT1045(const std::string &message, Galileo_Ephemeris &gal_eph) const
Verifies and reads messages of type 1045 (Galileo Ephemeris). Returns 1 if anything goes wrong...
void send_message(const std::string &msg)
Sends a message through the server to all connected clients.
uint32_t lock_time(const Gps_Ephemeris &eph, double obs_time, const Gnss_Synchro &gnss_synchro)
Returns the time period in which GPS L1 signals have been continually tracked.
Interface of a GPS EPHEMERIS storage.
This class is a storage and orbital model functions for the Galileo SV ephemeris data as described in...
std::string print_MT1020(const Glonass_Gnav_Ephemeris &glonass_gnav_eph, const Glonass_Gnav_Utc_Model &glonass_gnav_utc_model)
Prints message type 1020 (GLONASS Ephemeris).
This class is a storage for the GLONASS GNAV UTC MODEL data as described in GLONASS ICD (Edition 5...
std::string print_MSM_3(const Gps_Ephemeris &gps_eph, const Gps_CNAV_Ephemeris &gps_cnav_eph, const Galileo_Ephemeris &gal_eph, const Glonass_Gnav_Ephemeris &glo_gnav_eph, double obs_time, const std::map< int32_t, Gnss_Synchro > &observables, uint32_t ref_id, uint32_t clock_steering_indicator, uint32_t external_clock_indicator, int32_t smooth_int, bool divergence_free, bool more_messages)
Prints messages of type MSM3 (Compact GNSS pseudoranges and phaseranges)
std::string print_MT1006(uint32_t ref_id, double ecef_x, double ecef_y, double ecef_z, bool gps, bool glonass, bool galileo, bool non_physical, bool single_oscillator, uint32_t quarter_cycle_indicator, double height)
Prints message type 1006 (Stationary Antenna Reference Point, with Height Information) ...
void stop_server()
Stops the server.
This class implements a thread-safe std::queue.
double bin_to_double(const std::string &s) const
Returns double from a string of binary symbols.
bool is_server_running() const
Returns true if the server is running, false otherwise.
Interface of a GPS CNAV EPHEMERIS storage.
std::string print_MT1011(const Glonass_Gnav_Ephemeris &glonass_gnav_ephL1, const Glonass_Gnav_Ephemeris &glonass_gnav_ephL2, double obs_time, const std::map< int32_t, Gnss_Synchro > &observables, uint16_t station_id)
Prints L1&L2 GLONASS RTK Observables.
int32_t read_MT1005(const std::string &message, uint32_t &ref_id, double &ecef_x, double &ecef_y, double &ecef_z, bool &gps, bool &glonass, bool &galileo)
Verifies and reads messages of type 1005 (Stationary Antenna Reference Point). Returns 1 if anything ...
Interface of a Galileo EPHEMERIS storage.
void run_server()
Starts running the server.
int64_t hex_to_int(const std::string &s) const
Returns a int64_t from a string of hexadecimal symbols.
std::string print_MT1012(const Glonass_Gnav_Ephemeris &glonass_gnav_ephL1, const Glonass_Gnav_Ephemeris &glonass_gnav_ephL2, double obs_time, const std::map< int32_t, Gnss_Synchro > &observables, uint16_t station_id)
Prints Extended L1&L2 GLONASS RTK Observables.
int32_t read_MT1020(const std::string &message, Glonass_Gnav_Ephemeris &glonass_gnav_eph, Glonass_Gnav_Utc_Model &glonass_gnav_utc_model) const
Verifies and reads messages of type 1020 (GLONASS Ephemeris).
Interface of the Gnss_Synchro class.