GNSS-SDR  0.0.14
An Open Source GNSS Software Defined Receiver
Galileo_INAV.h
Go to the documentation of this file.
1 /*!
2  * \file Galileo_INAV.h
3  * \brief Galileo INAV mesage constants
4  * \author Carles Fernandez, 2020. cfernandez(at)cttc.es
5  *
6  *
7  * -----------------------------------------------------------------------------
8  *
9  * GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
10  * This file is part of GNSS-SDR.
11  *
12  * Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors)
13  * SPDX-License-Identifier: GPL-3.0-or-later
14  *
15  * -----------------------------------------------------------------------------
16  */
17 
18 #ifndef GNSS_SDR_GALILEO_INAV_H
19 #define GNSS_SDR_GALILEO_INAV_H
20 
21 #include "MATH_CONSTANTS.h"
22 #include <cstdint>
23 #include <utility>
24 #include <vector>
25 
26 /** \addtogroup Core
27  * \{ */
28 /** \addtogroup System_Parameters
29  * \{ */
30 
31 
32 // Galileo INAV message structure
33 constexpr double GALILEO_INAV_PAGE_PART_WITH_PREABLE_SECONDS = 2.04; //!< Page Duration + (Galileo I/NAV Preamble bits)*(Galileo E5b-I tiered Code Period(seconds))
34 constexpr uint32_t GALILEO_INAV_PAGE_SYMBOLS = 500; //!< The complete Galileo INAV page length
35 constexpr int32_t GALILEO_INAV_PREAMBLE_LENGTH_BITS = 10;
36 constexpr int32_t GALILEO_INAV_PREAMBLE_PERIOD_SYMBOLS = 250;
37 constexpr int32_t GALILEO_INAV_PAGE_PART_SYMBOLS = 250; //!< Each Galileo INAV pages are composed of two parts (even and odd) each of 250 symbols, including preamble. See Galileo ICD 4.3.2
38 constexpr int32_t GALILEO_INAV_PAGE_PART_SECONDS = 1; // a page part last 1 sec
39 constexpr int32_t GALILEO_INAV_PAGE_PART_MS = 1000; // a page part last 1 sec
40 constexpr int32_t GALILEO_INAV_PAGE_SECONDS = 2; // a full page last 2 sec
41 constexpr int32_t GALILEO_INAV_INTERLEAVER_ROWS = 8;
42 constexpr int32_t GALILEO_INAV_INTERLEAVER_COLS = 30;
43 constexpr int32_t GALILEO_TELEMETRY_RATE_BITS_SECOND = 250; // bps
44 constexpr int32_t GALILEO_PAGE_TYPE_BITS = 6;
45 constexpr int32_t GALILEO_DATA_JK_BITS = 128;
46 constexpr int32_t GALILEO_DATA_FRAME_BITS = 196;
47 constexpr int32_t GALILEO_DATA_FRAME_BYTES = 25;
48 constexpr char GALILEO_INAV_PREAMBLE[11] = "0101100000";
49 
50 const std::vector<std::pair<int32_t, int32_t>> TYPE({{1, 6}});
51 const std::vector<std::pair<int32_t, int32_t>> PAGE_TYPE_BIT({{1, 6}});
52 
53 /* Page 1 - Word type 1: Ephemeris (1/4) */
54 const std::vector<std::pair<int32_t, int32_t>> IOD_NAV_1_BIT({{7, 10}});
55 const std::vector<std::pair<int32_t, int32_t>> T0_E_1_BIT({{17, 14}});
56 constexpr int32_t T0E_1_LSB = 60;
57 const std::vector<std::pair<int32_t, int32_t>> M0_1_BIT({{31, 32}});
58 constexpr double M0_1_LSB = PI_TWO_N31;
59 const std::vector<std::pair<int32_t, int32_t>> E_1_BIT({{63, 32}});
60 constexpr double E_1_LSB = TWO_N33;
61 const std::vector<std::pair<int32_t, int32_t>> A_1_BIT({{95, 32}});
62 constexpr double A_1_LSB_GAL = TWO_N19;
63 // last two bits are reserved
64 
65 
66 /* Page 2 - Word type 2: Ephemeris (2/4) */
67 const std::vector<std::pair<int32_t, int32_t>> IOD_NAV_2_BIT({{7, 10}});
68 const std::vector<std::pair<int32_t, int32_t>> OMEGA_0_2_BIT({{17, 32}});
69 constexpr double OMEGA_0_2_LSB = PI_TWO_N31;
70 const std::vector<std::pair<int32_t, int32_t>> I_0_2_BIT({{49, 32}});
71 constexpr double I_0_2_LSB = PI_TWO_N31;
72 const std::vector<std::pair<int32_t, int32_t>> OMEGA_2_BIT({{81, 32}});
73 constexpr double OMEGA_2_LSB = PI_TWO_N31;
74 const std::vector<std::pair<int32_t, int32_t>> I_DOT_2_BIT({{113, 14}});
75 constexpr double I_DOT_2_LSB = PI_TWO_N43;
76 // last two bits are reserved
77 
78 /* Word type 3: Ephemeris (3/4) and SISA */
79 const std::vector<std::pair<int32_t, int32_t>> IOD_NAV_3_BIT({{7, 10}});
80 const std::vector<std::pair<int32_t, int32_t>> OMEGA_DOT_3_BIT({{17, 24}});
81 constexpr double OMEGA_DOT_3_LSB = PI_TWO_N43;
82 const std::vector<std::pair<int32_t, int32_t>> DELTA_N_3_BIT({{41, 16}});
83 constexpr double DELTA_N_3_LSB = PI_TWO_N43;
84 const std::vector<std::pair<int32_t, int32_t>> C_UC_3_BIT({{57, 16}});
85 constexpr double C_UC_3_LSB = TWO_N29;
86 const std::vector<std::pair<int32_t, int32_t>> C_US_3_BIT({{73, 16}});
87 constexpr double C_US_3_LSB = TWO_N29;
88 const std::vector<std::pair<int32_t, int32_t>> C_RC_3_BIT({{89, 16}});
89 constexpr double C_RC_3_LSB = TWO_N5;
90 const std::vector<std::pair<int32_t, int32_t>> C_RS_3_BIT({{105, 16}});
91 constexpr double C_RS_3_LSB = TWO_N5;
92 const std::vector<std::pair<int32_t, int32_t>> SISA_3_BIT({{121, 8}});
93 
94 
95 /* Word type 4: Ephemeris (4/4) and Clock correction parameters */
96 const std::vector<std::pair<int32_t, int32_t>> IOD_NAV_4_BIT({{7, 10}});
97 const std::vector<std::pair<int32_t, int32_t>> SV_ID_PRN_4_BIT({{17, 6}});
98 const std::vector<std::pair<int32_t, int32_t>> C_IC_4_BIT({{23, 16}});
99 constexpr double C_IC_4_LSB = TWO_N29;
100 const std::vector<std::pair<int32_t, int32_t>> C_IS_4_BIT({{39, 16}});
101 constexpr double C_IS_4_LSB = TWO_N29;
102 const std::vector<std::pair<int32_t, int32_t>> T0C_4_BIT({{55, 14}}); //
103 constexpr int32_t T0C_4_LSB = 60;
104 const std::vector<std::pair<int32_t, int32_t>> AF0_4_BIT({{69, 31}}); //
105 constexpr double AF0_4_LSB = TWO_N34;
106 const std::vector<std::pair<int32_t, int32_t>> AF1_4_BIT({{100, 21}}); //
107 constexpr double AF1_4_LSB = TWO_N46;
108 const std::vector<std::pair<int32_t, int32_t>> AF2_4_BIT({{121, 6}});
109 constexpr double AF2_4_LSB = TWO_N59;
110 const std::vector<std::pair<int32_t, int32_t>> SPARE_4_BIT({{127, 2}});
111 // last two bits are reserved
112 
113 /* Word type 5: Ionospheric correction, BGD, signal health and data validity status and GST */
114 /* Ionospheric correction */
115 /* Az */
116 const std::vector<std::pair<int32_t, int32_t>> AI0_5_BIT({{7, 11}}); //
117 constexpr double AI0_5_LSB = TWO_N2;
118 const std::vector<std::pair<int32_t, int32_t>> AI1_5_BIT({{18, 11}}); //
119 constexpr double AI1_5_LSB = TWO_N8;
120 const std::vector<std::pair<int32_t, int32_t>> AI2_5_BIT({{29, 14}}); //
121 constexpr double AI2_5_LSB = TWO_N15;
122 /* Ionospheric disturbance flag */
123 const std::vector<std::pair<int32_t, int32_t>> REGION1_5_BIT({{43, 1}}); //
124 const std::vector<std::pair<int32_t, int32_t>> REGION2_5_BIT({{44, 1}}); //
125 const std::vector<std::pair<int32_t, int32_t>> REGION3_5_BIT({{45, 1}}); //
126 const std::vector<std::pair<int32_t, int32_t>> REGION4_5_BIT({{46, 1}}); //
127 const std::vector<std::pair<int32_t, int32_t>> REGION5_5_BIT({{47, 1}}); //
128 const std::vector<std::pair<int32_t, int32_t>> BGD_E1_E5A_5_BIT({{48, 10}}); //
129 constexpr double BGD_E1_E5A_5_LSB = TWO_N32;
130 const std::vector<std::pair<int32_t, int32_t>> BGD_E1_E5B_5_BIT({{58, 10}}); //
131 constexpr double BGD_E1_E5B_5_LSB = TWO_N32;
132 const std::vector<std::pair<int32_t, int32_t>> E5B_HS_5_BIT({{68, 2}}); //
133 const std::vector<std::pair<int32_t, int32_t>> E1_B_HS_5_BIT({{70, 2}}); //
134 const std::vector<std::pair<int32_t, int32_t>> E5B_DVS_5_BIT({{72, 1}}); //
135 const std::vector<std::pair<int32_t, int32_t>> E1_B_DVS_5_BIT({{73, 1}}); //
136 /* GST */
137 const std::vector<std::pair<int32_t, int32_t>> WN_5_BIT({{74, 12}});
138 const std::vector<std::pair<int32_t, int32_t>> TOW_5_BIT({{86, 20}});
139 const std::vector<std::pair<int32_t, int32_t>> SPARE_5_BIT({{106, 23}});
140 
141 
142 /* Page 6 */
143 const std::vector<std::pair<int32_t, int32_t>> A0_6_BIT({{7, 32}});
144 constexpr double A0_6_LSB = TWO_N30;
145 const std::vector<std::pair<int32_t, int32_t>> A1_6_BIT({{39, 24}});
146 constexpr double A1_6_LSB = TWO_N50;
147 const std::vector<std::pair<int32_t, int32_t>> DELTA_T_LS_6_BIT({{63, 8}});
148 const std::vector<std::pair<int32_t, int32_t>> T0T_6_BIT({{71, 8}});
149 constexpr int32_t T0T_6_LSB = 3600;
150 const std::vector<std::pair<int32_t, int32_t>> W_NOT_6_BIT({{79, 8}});
151 const std::vector<std::pair<int32_t, int32_t>> WN_LSF_6_BIT({{87, 8}});
152 const std::vector<std::pair<int32_t, int32_t>> DN_6_BIT({{95, 3}});
153 const std::vector<std::pair<int32_t, int32_t>> DELTA_T_LSF_6_BIT({{98, 8}});
154 const std::vector<std::pair<int32_t, int32_t>> TOW_6_BIT({{106, 20}});
155 
156 
157 /* Page 7 */
158 const std::vector<std::pair<int32_t, int32_t>> IOD_A_7_BIT({{7, 4}});
159 const std::vector<std::pair<int32_t, int32_t>> WN_A_7_BIT({{11, 2}});
160 const std::vector<std::pair<int32_t, int32_t>> T0A_7_BIT({{13, 10}});
161 constexpr int32_t T0A_7_LSB = 600;
162 const std::vector<std::pair<int32_t, int32_t>> SVI_D1_7_BIT({{23, 6}});
163 const std::vector<std::pair<int32_t, int32_t>> DELTA_A_7_BIT({{29, 13}});
164 constexpr double DELTA_A_7_LSB = TWO_N9;
165 const std::vector<std::pair<int32_t, int32_t>> E_7_BIT({{42, 11}});
166 constexpr double E_7_LSB = TWO_N16;
167 const std::vector<std::pair<int32_t, int32_t>> OMEGA_7_BIT({{53, 16}});
168 constexpr double OMEGA_7_LSB = TWO_N15;
169 const std::vector<std::pair<int32_t, int32_t>> DELTA_I_7_BIT({{69, 11}});
170 constexpr double DELTA_I_7_LSB = TWO_N14;
171 const std::vector<std::pair<int32_t, int32_t>> OMEGA0_7_BIT({{80, 16}});
172 constexpr double OMEGA0_7_LSB = TWO_N15;
173 const std::vector<std::pair<int32_t, int32_t>> OMEGA_DOT_7_BIT({{96, 11}});
174 constexpr double OMEGA_DOT_7_LSB = TWO_N33;
175 const std::vector<std::pair<int32_t, int32_t>> M0_7_BIT({{107, 16}});
176 constexpr double M0_7_LSB = TWO_N15;
177 
178 
179 /* Page 8 */
180 const std::vector<std::pair<int32_t, int32_t>> IOD_A_8_BIT({{7, 4}});
181 const std::vector<std::pair<int32_t, int32_t>> AF0_8_BIT({{11, 16}});
182 constexpr double AF0_8_LSB = TWO_N19;
183 const std::vector<std::pair<int32_t, int32_t>> AF1_8_BIT({{27, 13}});
184 constexpr double AF1_8_LSB = TWO_N38;
185 const std::vector<std::pair<int32_t, int32_t>> E5B_HS_8_BIT({{40, 2}});
186 const std::vector<std::pair<int32_t, int32_t>> E1_B_HS_8_BIT({{42, 2}});
187 const std::vector<std::pair<int32_t, int32_t>> SVI_D2_8_BIT({{44, 6}});
188 const std::vector<std::pair<int32_t, int32_t>> DELTA_A_8_BIT({{50, 13}});
189 constexpr double DELTA_A_8_LSB = TWO_N9;
190 const std::vector<std::pair<int32_t, int32_t>> E_8_BIT({{63, 11}});
191 constexpr double E_8_LSB = TWO_N16;
192 const std::vector<std::pair<int32_t, int32_t>> OMEGA_8_BIT({{74, 16}});
193 constexpr double OMEGA_8_LSB = TWO_N15;
194 const std::vector<std::pair<int32_t, int32_t>> DELTA_I_8_BIT({{90, 11}});
195 constexpr double DELTA_I_8_LSB = TWO_N14;
196 const std::vector<std::pair<int32_t, int32_t>> OMEGA0_8_BIT({{101, 16}});
197 constexpr double OMEGA0_8_LSB = TWO_N15;
198 const std::vector<std::pair<int32_t, int32_t>> OMEGA_DOT_8_BIT({{117, 11}});
199 constexpr double OMEGA_DOT_8_LSB = TWO_N33;
200 
201 
202 /* Page 9 */
203 const std::vector<std::pair<int32_t, int32_t>> IOD_A_9_BIT({{7, 4}});
204 const std::vector<std::pair<int32_t, int32_t>> WN_A_9_BIT({{11, 2}});
205 const std::vector<std::pair<int32_t, int32_t>> T0A_9_BIT({{13, 10}});
206 constexpr int32_t T0A_9_LSB = 600;
207 const std::vector<std::pair<int32_t, int32_t>> M0_9_BIT({{23, 16}});
208 constexpr double M0_9_LSB = TWO_N15;
209 const std::vector<std::pair<int32_t, int32_t>> AF0_9_BIT({{39, 16}});
210 constexpr double AF0_9_LSB = TWO_N19;
211 const std::vector<std::pair<int32_t, int32_t>> AF1_9_BIT({{55, 13}});
212 constexpr double AF1_9_LSB = TWO_N38;
213 const std::vector<std::pair<int32_t, int32_t>> E5B_HS_9_BIT({{68, 2}});
214 const std::vector<std::pair<int32_t, int32_t>> E1_B_HS_9_BIT({{70, 2}});
215 const std::vector<std::pair<int32_t, int32_t>> SVI_D3_9_BIT({{72, 6}});
216 const std::vector<std::pair<int32_t, int32_t>> DELTA_A_9_BIT({{78, 13}});
217 constexpr double DELTA_A_9_LSB = TWO_N9;
218 const std::vector<std::pair<int32_t, int32_t>> E_9_BIT({{91, 11}});
219 constexpr double E_9_LSB = TWO_N16;
220 const std::vector<std::pair<int32_t, int32_t>> OMEGA_9_BIT({{102, 16}});
221 constexpr double OMEGA_9_LSB = TWO_N15;
222 const std::vector<std::pair<int32_t, int32_t>> DELTA_I_9_BIT({{118, 11}});
223 constexpr double DELTA_I_9_LSB = TWO_N14;
224 
225 
226 /* Page 10 */
227 const std::vector<std::pair<int32_t, int32_t>> IOD_A_10_BIT({{7, 4}});
228 const std::vector<std::pair<int32_t, int32_t>> OMEGA0_10_BIT({{11, 16}});
229 constexpr double OMEGA0_10_LSB = TWO_N15;
230 const std::vector<std::pair<int32_t, int32_t>> OMEGA_DOT_10_BIT({{27, 11}});
231 constexpr double OMEGA_DOT_10_LSB = TWO_N33;
232 const std::vector<std::pair<int32_t, int32_t>> M0_10_BIT({{38, 16}});
233 constexpr double M0_10_LSB = TWO_N15;
234 const std::vector<std::pair<int32_t, int32_t>> AF0_10_BIT({{54, 16}});
235 constexpr double AF0_10_LSB = TWO_N19;
236 const std::vector<std::pair<int32_t, int32_t>> AF1_10_BIT({{70, 13}});
237 constexpr double AF1_10_LSB = TWO_N38;
238 const std::vector<std::pair<int32_t, int32_t>> E5B_HS_10_BIT({{83, 2}});
239 const std::vector<std::pair<int32_t, int32_t>> E1_B_HS_10_BIT({{85, 2}});
240 const std::vector<std::pair<int32_t, int32_t>> A_0_G_10_BIT({{87, 16}});
241 constexpr double A_0G_10_LSB = TWO_N35;
242 const std::vector<std::pair<int32_t, int32_t>> A_1_G_10_BIT({{103, 12}});
243 constexpr double A_1G_10_LSB = TWO_N51;
244 const std::vector<std::pair<int32_t, int32_t>> T_0_G_10_BIT({{115, 8}});
245 constexpr int32_t T_0_G_10_LSB = 3600;
246 const std::vector<std::pair<int32_t, int32_t>> WN_0_G_10_BIT({{123, 6}});
247 
248 
249 /* Page 0 */
250 const std::vector<std::pair<int32_t, int32_t>> TIME_0_BIT({{7, 2}});
251 const std::vector<std::pair<int32_t, int32_t>> WN_0_BIT({{97, 12}});
252 const std::vector<std::pair<int32_t, int32_t>> TOW_0_BIT({{109, 20}});
253 
254 
255 /** \} */
256 /** \} */
257 #endif // GNSS_SDR_GALILEO_INAV_H
constexpr double TWO_N59
2^-59
constexpr uint32_t GALILEO_INAV_PAGE_SYMBOLS
The complete Galileo INAV page length.
Definition: Galileo_INAV.h:34
constexpr double TWO_N5
2^-5
constexpr double TWO_N8
2^-8
constexpr double TWO_N50
2^-50
constexpr double TWO_N16
2^-16
constexpr double TWO_N33
2^-33
constexpr double TWO_N32
2^-32
constexpr double TWO_N14
2^-14
constexpr double PI_TWO_N43
Pi*2^-43.
constexpr double TWO_N38
2^-38
constexpr double PI_TWO_N31
Pi*2^-31.
constexpr double TWO_N35
2^-35
Defines useful mathematical constants and their scaled versions.
constexpr double TWO_N30
2^-30
constexpr double TWO_N46
2^-46
constexpr double TWO_N51
2^-51
constexpr double GALILEO_INAV_PAGE_PART_WITH_PREABLE_SECONDS
Page Duration + (Galileo I/NAV Preamble bits)*(Galileo E5b-I tiered Code Period(seconds)) ...
Definition: Galileo_INAV.h:33
constexpr double TWO_N34
2^-34
constexpr double TWO_N9
2^-9
constexpr double TWO_N29
2^-29
constexpr double TWO_N19
2^-19
constexpr double TWO_N2
2^-2
constexpr int32_t GALILEO_INAV_PAGE_PART_SYMBOLS
Each Galileo INAV pages are composed of two parts (even and odd) each of 250 symbols, including preamble. See Galileo ICD 4.3.2.
Definition: Galileo_INAV.h:37
constexpr double TWO_N15
2^-15