18#ifndef GNSS_SDR_GALILEO_INAV_H
19#define GNSS_SDR_GALILEO_INAV_H
36constexpr int32_t GALILEO_INAV_PREAMBLE_LENGTH_BITS = 10;
37constexpr int32_t GALILEO_INAV_PREAMBLE_PERIOD_SYMBOLS = 250;
39constexpr int32_t GALILEO_INAV_PAGE_PART_SECONDS = 1;
40constexpr int32_t GALILEO_INAV_PAGE_PART_MS = 1000;
41constexpr int32_t GALILEO_INAV_PAGE_SECONDS = 2;
42constexpr int32_t GALILEO_INAV_INTERLEAVER_ROWS = 8;
43constexpr int32_t GALILEO_INAV_INTERLEAVER_COLS = 30;
44constexpr int32_t GALILEO_TELEMETRY_RATE_BITS_SECOND = 250;
45constexpr int32_t GALILEO_PAGE_TYPE_BITS = 6;
46constexpr int32_t GALILEO_DATA_JK_BITS = 128;
47constexpr int32_t GALILEO_DATA_FRAME_BITS = 196;
48constexpr int32_t GALILEO_DATA_FRAME_BYTES = 25;
49constexpr char GALILEO_INAV_PREAMBLE[11] =
"0101100000";
51const std::vector<std::pair<int32_t, int32_t>> TYPE({{1, 6}});
52const std::vector<std::pair<int32_t, int32_t>> PAGE_TYPE_BIT({{1, 6}});
55const std::vector<std::pair<int32_t, int32_t>> IOD_NAV_1_BIT({{7, 10}});
56const std::vector<std::pair<int32_t, int32_t>> T0_E_1_BIT({{17, 14}});
57constexpr int32_t T0E_1_LSB = 60;
58const std::vector<std::pair<int32_t, int32_t>> M0_1_BIT({{31, 32}});
60const std::vector<std::pair<int32_t, int32_t>> E_1_BIT({{63, 32}});
61constexpr double E_1_LSB =
TWO_N33;
62const std::vector<std::pair<int32_t, int32_t>> A_1_BIT({{95, 32}});
63constexpr double A_1_LSB_GAL =
TWO_N19;
68const std::vector<std::pair<int32_t, int32_t>> IOD_NAV_2_BIT({{7, 10}});
69const std::vector<std::pair<int32_t, int32_t>> OMEGA_0_2_BIT({{17, 32}});
71const std::vector<std::pair<int32_t, int32_t>> I_0_2_BIT({{49, 32}});
73const std::vector<std::pair<int32_t, int32_t>> OMEGA_2_BIT({{81, 32}});
75const std::vector<std::pair<int32_t, int32_t>> I_DOT_2_BIT({{113, 14}});
80const std::vector<std::pair<int32_t, int32_t>> IOD_NAV_3_BIT({{7, 10}});
81const std::vector<std::pair<int32_t, int32_t>> OMEGA_DOT_3_BIT({{17, 24}});
83const std::vector<std::pair<int32_t, int32_t>> DELTA_N_3_BIT({{41, 16}});
85const std::vector<std::pair<int32_t, int32_t>> C_UC_3_BIT({{57, 16}});
86constexpr double C_UC_3_LSB =
TWO_N29;
87const std::vector<std::pair<int32_t, int32_t>> C_US_3_BIT({{73, 16}});
88constexpr double C_US_3_LSB =
TWO_N29;
89const std::vector<std::pair<int32_t, int32_t>> C_RC_3_BIT({{89, 16}});
90constexpr double C_RC_3_LSB =
TWO_N5;
91const std::vector<std::pair<int32_t, int32_t>> C_RS_3_BIT({{105, 16}});
92constexpr double C_RS_3_LSB =
TWO_N5;
93const std::vector<std::pair<int32_t, int32_t>> SISA_3_BIT({{121, 8}});
97const std::vector<std::pair<int32_t, int32_t>> IOD_NAV_4_BIT({{7, 10}});
98const std::vector<std::pair<int32_t, int32_t>> SV_ID_PRN_4_BIT({{17, 6}});
99const std::vector<std::pair<int32_t, int32_t>> C_IC_4_BIT({{23, 16}});
100constexpr double C_IC_4_LSB =
TWO_N29;
101const std::vector<std::pair<int32_t, int32_t>> C_IS_4_BIT({{39, 16}});
102constexpr double C_IS_4_LSB =
TWO_N29;
103const std::vector<std::pair<int32_t, int32_t>> T0C_4_BIT({{55, 14}});
104constexpr int32_t T0C_4_LSB = 60;
105const std::vector<std::pair<int32_t, int32_t>> AF0_4_BIT({{69, 31}});
106constexpr double AF0_4_LSB =
TWO_N34;
107const std::vector<std::pair<int32_t, int32_t>> AF1_4_BIT({{100, 21}});
108constexpr double AF1_4_LSB =
TWO_N46;
109const std::vector<std::pair<int32_t, int32_t>> AF2_4_BIT({{121, 6}});
110constexpr double AF2_4_LSB =
TWO_N59;
111const std::vector<std::pair<int32_t, int32_t>> SPARE_4_BIT({{127, 2}});
117const std::vector<std::pair<int32_t, int32_t>> AI0_5_BIT({{7, 11}});
118constexpr double AI0_5_LSB =
TWO_N2;
119const std::vector<std::pair<int32_t, int32_t>> AI1_5_BIT({{18, 11}});
120constexpr double AI1_5_LSB =
TWO_N8;
121const std::vector<std::pair<int32_t, int32_t>> AI2_5_BIT({{29, 14}});
122constexpr double AI2_5_LSB =
TWO_N15;
124const std::vector<std::pair<int32_t, int32_t>> REGION1_5_BIT({{43, 1}});
125const std::vector<std::pair<int32_t, int32_t>> REGION2_5_BIT({{44, 1}});
126const std::vector<std::pair<int32_t, int32_t>> REGION3_5_BIT({{45, 1}});
127const std::vector<std::pair<int32_t, int32_t>> REGION4_5_BIT({{46, 1}});
128const std::vector<std::pair<int32_t, int32_t>> REGION5_5_BIT({{47, 1}});
129const std::vector<std::pair<int32_t, int32_t>> BGD_E1_E5A_5_BIT({{48, 10}});
130constexpr double BGD_E1_E5A_5_LSB =
TWO_N32;
131const std::vector<std::pair<int32_t, int32_t>> BGD_E1_E5B_5_BIT({{58, 10}});
132constexpr double BGD_E1_E5B_5_LSB =
TWO_N32;
133const std::vector<std::pair<int32_t, int32_t>> E5B_HS_5_BIT({{68, 2}});
134const std::vector<std::pair<int32_t, int32_t>> E1_B_HS_5_BIT({{70, 2}});
135const std::vector<std::pair<int32_t, int32_t>> E5B_DVS_5_BIT({{72, 1}});
136const std::vector<std::pair<int32_t, int32_t>> E1_B_DVS_5_BIT({{73, 1}});
138const std::vector<std::pair<int32_t, int32_t>> WN_5_BIT({{74, 12}});
139const std::vector<std::pair<int32_t, int32_t>> TOW_5_BIT({{86, 20}});
140const std::vector<std::pair<int32_t, int32_t>> SPARE_5_BIT({{106, 23}});
144const std::vector<std::pair<int32_t, int32_t>> A0_6_BIT({{7, 32}});
145constexpr double A0_6_LSB =
TWO_N30;
146const std::vector<std::pair<int32_t, int32_t>> A1_6_BIT({{39, 24}});
147constexpr double A1_6_LSB =
TWO_N50;
148const std::vector<std::pair<int32_t, int32_t>> DELTA_T_LS_6_BIT({{63, 8}});
149const std::vector<std::pair<int32_t, int32_t>> T0T_6_BIT({{71, 8}});
150constexpr int32_t T0T_6_LSB = 3600;
151const std::vector<std::pair<int32_t, int32_t>> W_NOT_6_BIT({{79, 8}});
152const std::vector<std::pair<int32_t, int32_t>> WN_LSF_6_BIT({{87, 8}});
153const std::vector<std::pair<int32_t, int32_t>> DN_6_BIT({{95, 3}});
154const std::vector<std::pair<int32_t, int32_t>> DELTA_T_LSF_6_BIT({{98, 8}});
155const std::vector<std::pair<int32_t, int32_t>> TOW_6_BIT({{106, 20}});
159const std::vector<std::pair<int32_t, int32_t>> IOD_A_7_BIT({{7, 4}});
160const std::vector<std::pair<int32_t, int32_t>> WN_A_7_BIT({{11, 2}});
161const std::vector<std::pair<int32_t, int32_t>> T0A_7_BIT({{13, 10}});
162constexpr int32_t T0A_7_LSB = 600;
163const std::vector<std::pair<int32_t, int32_t>> SVI_D1_7_BIT({{23, 6}});
164const std::vector<std::pair<int32_t, int32_t>> DELTA_A_7_BIT({{29, 13}});
165constexpr double DELTA_A_7_LSB =
TWO_N9;
166const std::vector<std::pair<int32_t, int32_t>> E_7_BIT({{42, 11}});
167constexpr double E_7_LSB =
TWO_N16;
168const std::vector<std::pair<int32_t, int32_t>> OMEGA_7_BIT({{53, 16}});
169constexpr double OMEGA_7_LSB =
TWO_N15;
170const std::vector<std::pair<int32_t, int32_t>> DELTA_I_7_BIT({{69, 11}});
171constexpr double DELTA_I_7_LSB =
TWO_N14;
172const std::vector<std::pair<int32_t, int32_t>> OMEGA0_7_BIT({{80, 16}});
173constexpr double OMEGA0_7_LSB =
TWO_N15;
174const std::vector<std::pair<int32_t, int32_t>> OMEGA_DOT_7_BIT({{96, 11}});
175constexpr double OMEGA_DOT_7_LSB =
TWO_N33;
176const std::vector<std::pair<int32_t, int32_t>> M0_7_BIT({{107, 16}});
177constexpr double M0_7_LSB =
TWO_N15;
181const std::vector<std::pair<int32_t, int32_t>> IOD_A_8_BIT({{7, 4}});
182const std::vector<std::pair<int32_t, int32_t>> AF0_8_BIT({{11, 16}});
183constexpr double AF0_8_LSB =
TWO_N19;
184const std::vector<std::pair<int32_t, int32_t>> AF1_8_BIT({{27, 13}});
185constexpr double AF1_8_LSB =
TWO_N38;
186const std::vector<std::pair<int32_t, int32_t>> E5B_HS_8_BIT({{40, 2}});
187const std::vector<std::pair<int32_t, int32_t>> E1_B_HS_8_BIT({{42, 2}});
188const std::vector<std::pair<int32_t, int32_t>> SVI_D2_8_BIT({{44, 6}});
189const std::vector<std::pair<int32_t, int32_t>> DELTA_A_8_BIT({{50, 13}});
190constexpr double DELTA_A_8_LSB =
TWO_N9;
191const std::vector<std::pair<int32_t, int32_t>> E_8_BIT({{63, 11}});
192constexpr double E_8_LSB =
TWO_N16;
193const std::vector<std::pair<int32_t, int32_t>> OMEGA_8_BIT({{74, 16}});
194constexpr double OMEGA_8_LSB =
TWO_N15;
195const std::vector<std::pair<int32_t, int32_t>> DELTA_I_8_BIT({{90, 11}});
196constexpr double DELTA_I_8_LSB =
TWO_N14;
197const std::vector<std::pair<int32_t, int32_t>> OMEGA0_8_BIT({{101, 16}});
198constexpr double OMEGA0_8_LSB =
TWO_N15;
199const std::vector<std::pair<int32_t, int32_t>> OMEGA_DOT_8_BIT({{117, 11}});
200constexpr double OMEGA_DOT_8_LSB =
TWO_N33;
204const std::vector<std::pair<int32_t, int32_t>> IOD_A_9_BIT({{7, 4}});
205const std::vector<std::pair<int32_t, int32_t>> WN_A_9_BIT({{11, 2}});
206const std::vector<std::pair<int32_t, int32_t>> T0A_9_BIT({{13, 10}});
207constexpr int32_t T0A_9_LSB = 600;
208const std::vector<std::pair<int32_t, int32_t>> M0_9_BIT({{23, 16}});
209constexpr double M0_9_LSB =
TWO_N15;
210const std::vector<std::pair<int32_t, int32_t>> AF0_9_BIT({{39, 16}});
211constexpr double AF0_9_LSB =
TWO_N19;
212const std::vector<std::pair<int32_t, int32_t>> AF1_9_BIT({{55, 13}});
213constexpr double AF1_9_LSB =
TWO_N38;
214const std::vector<std::pair<int32_t, int32_t>> E5B_HS_9_BIT({{68, 2}});
215const std::vector<std::pair<int32_t, int32_t>> E1_B_HS_9_BIT({{70, 2}});
216const std::vector<std::pair<int32_t, int32_t>> SVI_D3_9_BIT({{72, 6}});
217const std::vector<std::pair<int32_t, int32_t>> DELTA_A_9_BIT({{78, 13}});
218constexpr double DELTA_A_9_LSB =
TWO_N9;
219const std::vector<std::pair<int32_t, int32_t>> E_9_BIT({{91, 11}});
220constexpr double E_9_LSB =
TWO_N16;
221const std::vector<std::pair<int32_t, int32_t>> OMEGA_9_BIT({{102, 16}});
222constexpr double OMEGA_9_LSB =
TWO_N15;
223const std::vector<std::pair<int32_t, int32_t>> DELTA_I_9_BIT({{118, 11}});
224constexpr double DELTA_I_9_LSB =
TWO_N14;
228const std::vector<std::pair<int32_t, int32_t>> IOD_A_10_BIT({{7, 4}});
229const std::vector<std::pair<int32_t, int32_t>> OMEGA0_10_BIT({{11, 16}});
230constexpr double OMEGA0_10_LSB =
TWO_N15;
231const std::vector<std::pair<int32_t, int32_t>> OMEGA_DOT_10_BIT({{27, 11}});
232constexpr double OMEGA_DOT_10_LSB =
TWO_N33;
233const std::vector<std::pair<int32_t, int32_t>> M0_10_BIT({{38, 16}});
234constexpr double M0_10_LSB =
TWO_N15;
235const std::vector<std::pair<int32_t, int32_t>> AF0_10_BIT({{54, 16}});
236constexpr double AF0_10_LSB =
TWO_N19;
237const std::vector<std::pair<int32_t, int32_t>> AF1_10_BIT({{70, 13}});
238constexpr double AF1_10_LSB =
TWO_N38;
239const std::vector<std::pair<int32_t, int32_t>> E5B_HS_10_BIT({{83, 2}});
240const std::vector<std::pair<int32_t, int32_t>> E1_B_HS_10_BIT({{85, 2}});
241const std::vector<std::pair<int32_t, int32_t>> A_0_G_10_BIT({{87, 16}});
242constexpr double A_0G_10_LSB =
TWO_N35;
243const std::vector<std::pair<int32_t, int32_t>> A_1_G_10_BIT({{103, 12}});
244constexpr double A_1G_10_LSB =
TWO_N51;
245const std::vector<std::pair<int32_t, int32_t>> T_0_G_10_BIT({{115, 8}});
246constexpr int32_t T_0_G_10_LSB = 3600;
247const std::vector<std::pair<int32_t, int32_t>> WN_0_G_10_BIT({{123, 6}});
250constexpr double CED_DeltaAred_LSB =
TWO_P8;
251const std::vector<std::pair<int32_t, int32_t>> CED_DeltaAred_BIT({{7, 5}});
252constexpr double CED_exred_LSB =
TWO_N22;
253const std::vector<std::pair<int32_t, int32_t>> CED_exred_BIT({{12, 13}});
254constexpr double CED_eyred_LSB =
TWO_N22;
255const std::vector<std::pair<int32_t, int32_t>> CED_eyred_BIT({{25, 13}});
256constexpr double CED_Deltai0red_LSB =
TWO_N22;
257const std::vector<std::pair<int32_t, int32_t>> CED_Deltai0red_BIT({{38, 17}});
258constexpr double CED_Omega0red_LSB =
TWO_N22;
259const std::vector<std::pair<int32_t, int32_t>> CED_Omega0red_BIT({{55, 23}});
260constexpr double CED_lambda0red_LSB =
TWO_N22;
261const std::vector<std::pair<int32_t, int32_t>> CED_lambda0red_BIT({{78, 23}});
262constexpr double CED_af0red_LSB =
TWO_N26;
263const std::vector<std::pair<int32_t, int32_t>> CED_af0red_BIT({{101, 22}});
264constexpr double CED_af1red_LSB =
TWO_N35;
265const std::vector<std::pair<int32_t, int32_t>> CED_af1red_BIT({{123, 6}});
268const std::vector<std::pair<int32_t, int32_t>> RS_IODNAV_LSBS({{15, 2}});
269constexpr size_t INAV_RS_SUBVECTOR_LENGTH = 15;
270constexpr size_t INAV_RS_PARITY_VECTOR_LENGTH = 60;
271constexpr size_t INAV_RS_INFO_VECTOR_LENGTH = 58;
272constexpr size_t INAV_RS_BUFFER_LENGTH = 118;
273constexpr int32_t BITS_IN_OCTET = 8;
274constexpr int32_t FIRST_RS_BIT = 7;
275constexpr int32_t FIRST_RS_BIT_AFTER_IODNAV = 17;
278const std::vector<std::pair<int32_t, int32_t>> ISM_CONSTELLATION_ID_BIT({{7, 3}});
279const std::vector<std::pair<int32_t, int32_t>> ISM_SERVICE_LEVEL_ID_BIT({{10, 3}});
280const std::vector<std::pair<int32_t, int32_t>> ISM_WN_BIT({{13, 12}});
281const std::vector<std::pair<int32_t, int32_t>> ISM_T0_BIT({{25, 9}});
282const std::vector<std::pair<int32_t, int32_t>> ISM_MASK_MSB_BIT({{34, 1}});
283const std::vector<std::pair<int32_t, int32_t>> ISM_MASK_BIT({{35, 32}});
284const std::vector<std::pair<int32_t, int32_t>> ISM_PCONST_BIT({{67, 4}});
285const std::vector<std::pair<int32_t, int32_t>> ISM_PSAT_BIT({{71, 4}});
286const std::vector<std::pair<int32_t, int32_t>> ISM_URA_BIT({{75, 4}});
287const std::vector<std::pair<int32_t, int32_t>> ISM_URE_BIT({{79, 4}});
288const std::vector<std::pair<int32_t, int32_t>> ISM_BNOM_BIT({{83, 4}});
289const std::vector<std::pair<int32_t, int32_t>> ISM_TVALIDITY_BIT({{87, 4}});
290const std::vector<std::pair<int32_t, int32_t>> ISM_CRC_BIT({{97, 32}});
291constexpr int32_t GALILEO_ISM_CRC_DATA_BITS = 96;
292constexpr int32_t GALILEO_ISM_CRC_DATA_BYTES = 12;
295const std::vector<std::pair<int32_t, int32_t>> TIME_0_BIT({{7, 2}});
296const std::vector<std::pair<int32_t, int32_t>> WN_0_BIT({{97, 12}});
297const std::vector<std::pair<int32_t, int32_t>> TOW_0_BIT({{109, 20}});
300constexpr char GALILEO_INAV_PLAIN_SSP1[9] =
"00000100";
301constexpr char GALILEO_INAV_PLAIN_SSP2[9] =
"00101011";
302constexpr char GALILEO_INAV_PLAIN_SSP3[9] =
"00101111";
303constexpr char GALILEO_INAV_ENCODED_SSP1[17] =
"1110100100100101";
304constexpr char GALILEO_INAV_ENCODED_SSP2[17] =
"0110110001001110";
305constexpr char GALILEO_INAV_ENCODED_SSP3[17] =
"1101000000111110";
Defines useful mathematical constants and their scaled versions.
constexpr double GALILEO_INAV_PAGE_PART_WITH_PREABLE_SECONDS
Page Duration + (Galileo I/NAV Preamble bits)*(Galileo E5b-I tiered Code Period(seconds)).
constexpr double TWO_N22
2^-22
constexpr double PI_TWO_N31
Pi*2^-31.
constexpr int32_t GALILEO_INAV_PAGE_PART_SYMBOLS
Each Galileo INAV pages are composed of two parts (even and odd) each of 250 symbols,...
constexpr double TWO_N15
2^-15
constexpr double TWO_N16
2^-16
constexpr double PI_TWO_N43
Pi*2^-43.
constexpr double TWO_N5
2^-5
constexpr double TWO_N34
2^-34
constexpr double TWO_N51
2^-51
constexpr double TWO_N9
2^-9
constexpr double TWO_N19
2^-19
constexpr double TWO_N46
2^-46
constexpr double TWO_N59
2^-59
constexpr double TWO_N8
2^-8
constexpr double TWO_N2
2^-2
constexpr uint32_t GALILEO_INAV_PAGE_SYMBOLS
The complete Galileo INAV page length.
constexpr double TWO_N35
2^-35
constexpr double TWO_N32
2^-32
constexpr double TWO_P8
2^8
constexpr double TWO_N38
2^-38
constexpr double TWO_N26
2^-26
constexpr double TWO_N29
2^-29
constexpr double TWO_N30
2^-30
constexpr double TWO_N50
2^-50
constexpr double TWO_N33
2^-33
constexpr double TWO_N14
2^-14