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