GNSS-SDR  0.0.19
An Open Source GNSS Software Defined Receiver
an_packet_printer.h
Go to the documentation of this file.
1 /*!
2  * \file an_packet_printer.h
3  * \brief Interface of a class that prints PVT solutions in a serial device
4  * following a custom version of the Advanced Navigation Packet Protocol
5  * \author Carles Fernandez-Prades, 2021. cfernandez(at)cttc.es
6  * \author Miguel Angel Gomez Lopez, 2021. gomezlma(at)inta.es
7  *
8  *
9  * -----------------------------------------------------------------------------
10  *
11  * GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
12  * This file is part of GNSS-SDR.
13  *
14  * Copyright (C) 2010-2021 (see AUTHORS file for a list of contributors)
15  * SPDX-License-Identifier: GPL-3.0-or-later
16  *
17  * -----------------------------------------------------------------------------
18  */
19 
20 
21 #ifndef GNSS_SDR_AN_PACKET_PRINTER_H
22 #define GNSS_SDR_AN_PACKET_PRINTER_H
23 
24 #include "gnss_synchro.h"
25 #include <array>
26 #include <chrono>
27 #include <cstddef>
28 #include <cstdint>
29 #include <map>
30 #include <string>
31 
32 /** \addtogroup PVT
33  * \{ */
34 /** \addtogroup PVT_libs
35  * \{ */
36 
37 class Rtklib_Solver;
38 
40 {
41  uint8_t nsvfix; // number of sats used in PVT fix
42  uint8_t gps_satellites; // number of tracked GPS satellites
43  uint8_t galileo_satellites; // number of tracked Galileo satellites
44  uint32_t microseconds; // from start of receiver operation
45  double latitude; // in [rad]
46  double longitude; // in [rad]
47  double height; // in [m]
48  float velocity[3]; // North, East, Down, in [m/s]
49 
50  struct
51  {
52  uint8_t prn; // PRN ID. Galileo sats expressed as PRN + 100
53  uint8_t snr; // in [dB-Hz]
54  int16_t doppler; // in [Hz], saturates at +32767 / -32768 Hz
55  } sats[6];
56 
57  uint32_t reserved;
58  uint16_t status;
59 };
60 
61 
63 {
64  uint8_t header[4];
65  uint8_t data[73]; // SDR_GNSS_PACKET_LENGTH
66 };
67 
68 
69 /*!
70  * \brief class that prints PVT solutions in a serial device following a custom
71  * version of the Advanced Navigation Packet Protocol.
72  */
74 {
75 public:
76  /*!
77  * \brief Default constructor.
78  */
79  explicit An_Packet_Printer(const std::string& an_dump_devname);
80 
81  /*!
82  * \brief Default destructor.
83  */
85 
86  /*!
87  * \brief Print AN packet to the initialized device.
88  */
89  bool print_packet(const Rtklib_Solver* const pvt_data, const std::map<int, Gnss_Synchro>& gnss_observables_map);
90 
91  /*!
92  * \brief Close serial port. Also done in the destructor, this is only
93  * for testing.
94  */
95  void close_serial() const;
96 
97 private:
98  const std::array<uint16_t, 256> d_crc16_table = {
99  {0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273,
100  0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528,
101  0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886,
102  0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf,
103  0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5,
104  0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2,
105  0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8,
106  0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691,
107  0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f,
108  0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64,
109  0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0}};
110 
111  const size_t SDR_GNSS_PACKET_LENGTH = 73;
112  const uint8_t SDR_GNSS_PACKET_ID = 201;
113 
114  int init_serial(const std::string& serial_device);
115  void update_sdr_gnss_packet(sdr_gnss_packet_t* _packet, const Rtklib_Solver* const pvt, const std::map<int, Gnss_Synchro>& gnss_observables_map) const;
116  void encode_gnss_cttc_packet(sdr_gnss_packet_t* sdr_gnss_packet, an_packet_t* _packet) const;
117  uint16_t calculate_crc16(const void* data, uint16_t length) const;
118  uint8_t calculate_header_lrc(const uint8_t* data) const;
119  void an_packet_encode(an_packet_t* an_packet) const;
120  void encode_sdr_gnss_packet(sdr_gnss_packet_t* sdr_gnss_packet, an_packet_t* _packet) const;
121  void LSB_bytes_to_array(void* _in, int offset, uint8_t* _out, uint8_t var_size) const;
122 
123  std::chrono::time_point<std::chrono::system_clock> d_start;
124  std::string d_an_devname;
125  int d_an_dev_descriptor; // serial device descriptor (i.e. COM port)
126 };
127 
128 /** \} */
129 /** \} */
130 #endif // GNSS_SDR_AN_PACKET_PRINTER_H
class that prints PVT solutions in a serial device following a custom version of the Advanced Navigat...
This class implements a PVT solution based on RTKLIB.
Definition: rtklib_solver.h:81
void close_serial() const
Close serial port. Also done in the destructor, this is only for testing.
~An_Packet_Printer()
Default destructor.
An_Packet_Printer(const std::string &an_dump_devname)
Default constructor.
bool print_packet(const Rtklib_Solver *const pvt_data, const std::map< int, Gnss_Synchro > &gnss_observables_map)
Print AN packet to the initialized device.
Interface of the Gnss_Synchro class.