1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2024-11-10 12:00:04 +00:00

Replace const std::string by constexpr char

This commit is contained in:
Carles Fernandez 2020-07-03 11:36:38 +02:00
parent 0db83f5dea
commit bb540c7b48
No known key found for this signature in database
GPG Key ID: 4C583C52B0C3877D
19 changed files with 174 additions and 222 deletions

View File

@ -28,7 +28,13 @@ const auto AUX_CEIL = [](float x) { return static_cast<int32_t>(static_cast<int6
void beidou_b1i_code_gen_int(own::span<int32_t> _dest, int32_t _prn, uint32_t _chip_shift)
{
const uint32_t _code_length = 2046;
constexpr uint32_t _code_length = 2046;
const std::array<int32_t, 33> delays = {712 /*PRN1*/, 1581, 1414, 1550, 581, 771, 1311, 1043, 1549, 359, 710, 1579, 1548, 1103, 579, 769, 358, 709, 1411, 1547,
1102, 578, 357, 1577, 1410, 1546, 1101, 707, 1576, 1409, 1545, 354 /*PRN32*/,
705};
const std::array<int32_t, 37> phase1 = {1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 8, 8, 8, 9, 9, 10};
const std::array<int32_t, 37> phase2 = {3, 4, 5, 6, 8, 9, 10, 11, 7, 4, 5, 6, 8, 9, 10, 11, 5, 6, 8, 9, 10, 11, 6, 8, 9, 10, 11, 8, 9, 10, 11, 9, 10, 11, 10, 11, 11};
std::bitset<_code_length> G1{};
std::bitset<_code_length> G2{};
@ -43,12 +49,6 @@ void beidou_b1i_code_gen_int(own::span<int32_t> _dest, int32_t _prn, uint32_t _c
uint32_t delay;
int32_t prn_idx;
const std::array<int32_t, 33> delays = {712 /*PRN1*/, 1581, 1414, 1550, 581, 771, 1311, 1043, 1549, 359, 710, 1579, 1548, 1103, 579, 769, 358, 709, 1411, 1547,
1102, 578, 357, 1577, 1410, 1546, 1101, 707, 1576, 1409, 1545, 354 /*PRN32*/,
705};
const std::array<int32_t, 37> phase1 = {1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 8, 8, 8, 9, 9, 10};
const std::array<int32_t, 37> phase2 = {3, 4, 5, 6, 8, 9, 10, 11, 7, 4, 5, 6, 8, 9, 10, 11, 5, 6, 8, 9, 10, 11, 6, 8, 9, 10, 11, 8, 9, 10, 11, 9, 10, 11, 10, 11, 11};
// compute delay array index for given PRN number
prn_idx = _prn - 1;
@ -103,7 +103,7 @@ void beidou_b1i_code_gen_int(own::span<int32_t> _dest, int32_t _prn, uint32_t _c
void beidou_b1i_code_gen_float(own::span<float> _dest, int32_t _prn, uint32_t _chip_shift)
{
const uint32_t _code_length = 2046;
constexpr uint32_t _code_length = 2046;
std::array<int32_t, _code_length> b1i_code_int{};
beidou_b1i_code_gen_int(own::span<int32_t>(b1i_code_int.data(), _code_length), _prn, _chip_shift);
@ -117,7 +117,7 @@ void beidou_b1i_code_gen_float(own::span<float> _dest, int32_t _prn, uint32_t _c
void beidou_b1i_code_gen_complex(own::span<std::complex<float>> _dest, int32_t _prn, uint32_t _chip_shift)
{
const uint32_t _code_length = 2046;
constexpr uint32_t _code_length = 2046;
std::array<int32_t, _code_length> b1i_code_int{};
beidou_b1i_code_gen_int(own::span<int32_t>(b1i_code_int.data(), _code_length), _prn, _chip_shift);
@ -130,43 +130,37 @@ void beidou_b1i_code_gen_complex(own::span<std::complex<float>> _dest, int32_t _
/*
* Generates complex GPS L1 C/A code for the desired SV ID and sampled to specific sampling frequency
* Generates complex BeiDou B1I code for the desired SV ID and sampled to specific sampling frequency
*/
void beidou_b1i_code_gen_complex_sampled(own::span<std::complex<float>> _dest, uint32_t _prn, int32_t _fs, uint32_t _chip_shift)
{
// This function is based on the GNU software GPS for MATLAB in the Kay Borre book
constexpr int32_t _codeFreqBasis = 2046000; // Hz
constexpr int32_t _codeLength = 2046;
constexpr float _tc = 1.0 / static_cast<float>(_codeFreqBasis); // B1I chip period in sec
const auto _samplesPerCode = static_cast<int32_t>(static_cast<double>(_fs) / (static_cast<double>(_codeFreqBasis) / static_cast<double>(_codeLength)));
const float _ts = 1.0 / static_cast<float>(_fs); // Sampling period in sec
std::array<std::complex<float>, 2046> _code{};
int32_t _samplesPerCode;
int32_t _codeValueIndex;
float _ts;
float _tc;
float aux;
const int32_t _codeFreqBasis = 2046000; // Hz
const int32_t _codeLength = 2046;
// --- Find number of samples per spreading code ---------------------------
_samplesPerCode = static_cast<int32_t>(static_cast<double>(_fs) / (static_cast<double>(_codeFreqBasis) / static_cast<double>(_codeLength)));
// --- Find time constants -------------------------------------------------
_ts = 1.0 / static_cast<float>(_fs); // Sampling period in sec
_tc = 1.0 / static_cast<float>(_codeFreqBasis); // C/A chip period in sec
beidou_b1i_code_gen_complex(_code, _prn, _chip_shift); // generate C/A code 1 sample per chip
beidou_b1i_code_gen_complex(_code, _prn, _chip_shift); // generate B1I code 1 sample per chip
for (int32_t i = 0; i < _samplesPerCode; i++)
{
// === Digitizing ==================================================
// --- Make index array to read C/A code values --------------------
// --- Make index array to read B1I code values --------------------
// The length of the index array depends on the sampling frequency -
// number of samples per millisecond (because one C/A code period is one
// millisecond).
// number of samples per millisecond (because one B1I code period is
// one millisecond).
aux = (_ts * (i + 1)) / _tc;
_codeValueIndex = AUX_CEIL(aux) - 1;
// --- Make the digitized version of the C/A code ------------------
// The "upsampled" code is made by selecting values form the CA code
// --- Make the digitized version of the B1I code ------------------
// The "upsampled" code is made by selecting values form the B1I code
// chip array (caCode) for the time instances of each sample.
if (i == _samplesPerCode - 1)
{

View File

@ -28,7 +28,7 @@ const auto AUX_CEIL = [](float x) { return static_cast<int32_t>(static_cast<int6
void beidou_b3i_code_gen_int(own::span<int> _dest, int32_t _prn, uint32_t _chip_shift)
{
const uint32_t _code_length = 10230;
constexpr uint32_t _code_length = 10230;
std::bitset<_code_length> G1{};
std::bitset<_code_length> G2{};
auto G1_register = std::bitset<13>{}.set(); // All true
@ -170,7 +170,7 @@ void beidou_b3i_code_gen_int(own::span<int> _dest, int32_t _prn, uint32_t _chip_
void beidou_b3i_code_gen_float(own::span<float> _dest, int32_t _prn, uint32_t _chip_shift)
{
const uint32_t _code_length = 10230;
constexpr uint32_t _code_length = 10230;
std::array<int, _code_length> b3i_code_int{};
beidou_b3i_code_gen_int(b3i_code_int, _prn, _chip_shift);
@ -184,7 +184,7 @@ void beidou_b3i_code_gen_float(own::span<float> _dest, int32_t _prn, uint32_t _c
void beidou_b3i_code_gen_complex(own::span<std::complex<float>> _dest, int32_t _prn, uint32_t _chip_shift)
{
const uint32_t _code_length = 10230;
constexpr uint32_t _code_length = 10230;
std::array<int, _code_length> b3i_code_int{};
beidou_b3i_code_gen_int(b3i_code_int, _prn, _chip_shift);
@ -198,38 +198,34 @@ void beidou_b3i_code_gen_complex(own::span<std::complex<float>> _dest, int32_t _
void beidou_b3i_code_gen_complex_sampled(own::span<std::complex<float>> _dest, uint32_t _prn, int _fs, uint32_t _chip_shift)
{
// This function is based on the GNU software GPS for MATLAB in the Kay Borre book
constexpr int32_t _codeFreqBasis = 10230000; // Hz
constexpr int32_t _codeLength = 10230;
constexpr float _tc = 1.0 / static_cast<float>(_codeFreqBasis); // B3I chip period in sec
const float _ts = 1.0 / static_cast<float>(_fs); // Sampling period in secs
const auto _samplesPerCode = static_cast<int32_t>(static_cast<double>(_fs) / (static_cast<double>(_codeFreqBasis) / static_cast<double>(_codeLength)));
std::array<std::complex<float>, 10230> _code{};
int32_t _samplesPerCode;
int32_t _codeValueIndex;
float _ts;
float _tc;
float aux;
const int32_t _codeFreqBasis = 10230000; // Hz
const int32_t _codeLength = 10230;
// --- Find number of samples per spreading code ---------------------------
_samplesPerCode = static_cast<int32_t>(static_cast<double>(_fs) / (static_cast<double>(_codeFreqBasis) / static_cast<double>(_codeLength)));
// --- Find time constants -------------------------------------------------
_ts = 1.0 / static_cast<float>(_fs); // Sampling period in sec
_tc = 1.0 / static_cast<float>(_codeFreqBasis); // C/A chip period in sec
beidou_b3i_code_gen_complex(_code, _prn, _chip_shift); // generate C/A code 1 sample per chip
beidou_b3i_code_gen_complex(_code, _prn, _chip_shift); // generate B3I code 1 sample per chip
for (int32_t i = 0; i < _samplesPerCode; i++)
{
// === Digitizing ==================================================
// --- Make index array to read C/A code values --------------------
// --- Make index array to read B3I code values --------------------
// The length of the index array depends on the sampling frequency -
// number of samples per millisecond (because one C/A code period is one
// millisecond).
// number of samples per millisecond (because one B3I code period is
// one millisecond).
aux = (_ts * (i + 1)) / _tc;
_codeValueIndex = AUX_CEIL(aux) - 1;
// --- Make the digitized version of the C/A code ------------------
// The "upsampled" code is made by selecting values form the CA code
// --- Make the digitized version of the B3I code ------------------
// The "upsampled" code is made by selecting values form the B3I code
// chip array (caCode) for the time instances of each sample.
if (i == _samplesPerCode - 1)
{

View File

@ -42,17 +42,17 @@ void galileo_e1_code_gen_int(own::span<int> _dest, const std::array<char, 3>& _S
if (_galileo_signal.rfind("1B") != std::string::npos && _galileo_signal.length() >= 2)
{
for (char i : GALILEO_E1_B_PRIMARY_CODE[prn])
for (size_t i = 0; i < GALILEO_E1_B_PRIMARY_CODE_STR_LENGTH; i++)
{
hex_to_binary_converter(_dest.subspan(index, 4), i);
hex_to_binary_converter(_dest.subspan(index, 4), GALILEO_E1_B_PRIMARY_CODE[prn][i]);
index += 4;
}
}
else if (_galileo_signal.rfind("1C") != std::string::npos && _galileo_signal.length() >= 2)
{
for (char i : GALILEO_E1_C_PRIMARY_CODE[prn])
for (size_t i = 0; i < GALILEO_E1_C_PRIMARY_CODE_STR_LENGTH; i++)
{
hex_to_binary_converter(_dest.subspan(index, 4), i);
hex_to_binary_converter(_dest.subspan(index, 4), GALILEO_E1_C_PRIMARY_CODE[prn][i]);
index += 4;
}
}
@ -61,7 +61,7 @@ void galileo_e1_code_gen_int(own::span<int> _dest, const std::array<char, 3>& _S
void galileo_e1_sinboc_11_gen_int(own::span<int> _dest, own::span<const int> _prn)
{
const uint32_t _length_in = GALILEO_E1_B_CODE_LENGTH_CHIPS;
constexpr uint32_t _length_in = GALILEO_E1_B_CODE_LENGTH_CHIPS;
auto _period = static_cast<uint32_t>(_dest.size() / _length_in);
for (uint32_t i = 0; i < _length_in; i++)
{
@ -79,7 +79,7 @@ void galileo_e1_sinboc_11_gen_int(own::span<int> _dest, own::span<const int> _pr
void galileo_e1_sinboc_61_gen_int(own::span<int> _dest, own::span<const int> _prn)
{
const uint32_t _length_in = GALILEO_E1_B_CODE_LENGTH_CHIPS;
constexpr uint32_t _length_in = GALILEO_E1_B_CODE_LENGTH_CHIPS;
auto _period = static_cast<uint32_t>(_dest.size() / _length_in);
for (uint32_t i = 0; i < _length_in; i++)
@ -111,11 +111,12 @@ void galileo_e1_code_gen_sinboc11_float(own::span<float> _dest, const std::array
void galileo_e1_gen_float(own::span<float> _dest, own::span<int> _prn, const std::array<char, 3>& _Signal)
{
std::string _galileo_signal = _Signal.data();
const uint32_t _codeLength = 12 * GALILEO_E1_B_CODE_LENGTH_CHIPS;
constexpr uint32_t _codeLength = 12 * GALILEO_E1_B_CODE_LENGTH_CHIPS;
const float alpha = sqrt(10.0 / 11.0);
const float beta = sqrt(1.0 / 11.0);
std::string _galileo_signal = _Signal.data();
std::array<int32_t, 12 * 4092> sinboc_11{};
std::array<int32_t, 12 * 4092> sinboc_61{};
own::span<int32_t> sinboc_11_(sinboc_11.data(), _codeLength);
@ -147,19 +148,17 @@ void galileo_e1_code_gen_float_sampled(own::span<float> _dest, const std::array<
bool _cboc, uint32_t _prn, int32_t _fs, uint32_t _chip_shift,
bool _secondary_flag)
{
// This function is based on the GNU software GPS for MATLAB in Kay Borre's book
std::string _galileo_signal = _Signal.data();
uint32_t _samplesPerCode;
const int32_t _codeFreqBasis = GALILEO_E1_CODE_CHIP_RATE_CPS; // Hz
std::vector<int32_t> primary_code_E1_chips(static_cast<int32_t>(GALILEO_E1_B_CODE_LENGTH_CHIPS));
_samplesPerCode = static_cast<uint32_t>(static_cast<double>(_fs) / (static_cast<double>(_codeFreqBasis) / GALILEO_E1_B_CODE_LENGTH_CHIPS));
constexpr int32_t _codeFreqBasis = GALILEO_E1_CODE_CHIP_RATE_CPS; // Hz
const int32_t _samplesPerChip = (_cboc == true) ? 12 : 2;
const uint32_t _codeLength = _samplesPerChip * GALILEO_E1_B_CODE_LENGTH_CHIPS;
auto _samplesPerCode = static_cast<uint32_t>(static_cast<double>(_fs) / (static_cast<double>(_codeFreqBasis) / GALILEO_E1_B_CODE_LENGTH_CHIPS));
const uint32_t delay = ((static_cast<int32_t>(GALILEO_E1_B_CODE_LENGTH_CHIPS) - _chip_shift) % static_cast<int32_t>(GALILEO_E1_B_CODE_LENGTH_CHIPS)) * _samplesPerCode / GALILEO_E1_B_CODE_LENGTH_CHIPS;
std::string _galileo_signal = _Signal.data();
std::vector<int32_t> primary_code_E1_chips(static_cast<int32_t>(GALILEO_E1_B_CODE_LENGTH_CHIPS));
galileo_e1_code_gen_int(primary_code_E1_chips, _Signal, _prn); // generate Galileo E1 code, 1 sample per chip
const uint32_t _codeLength = _samplesPerChip * GALILEO_E1_B_CODE_LENGTH_CHIPS;
std::vector<float> _signal_E1(_codeLength);
if (_cboc == true)
@ -213,8 +212,8 @@ void galileo_e1_code_gen_complex_sampled(own::span<std::complex<float>> _dest, c
bool _cboc, uint32_t _prn, int32_t _fs, uint32_t _chip_shift,
bool _secondary_flag)
{
constexpr int32_t _codeFreqBasis = GALILEO_E1_CODE_CHIP_RATE_CPS; // Hz
std::string _galileo_signal = _Signal.data();
const int32_t _codeFreqBasis = GALILEO_E1_CODE_CHIP_RATE_CPS; // Hz
auto _samplesPerCode = static_cast<uint32_t>(static_cast<double>(_fs) /
(static_cast<double>(_codeFreqBasis) / GALILEO_E1_B_CODE_LENGTH_CHIPS));

View File

@ -44,7 +44,7 @@ void galileo_e5_a_code_gen_complex_primary(own::span<std::complex<float>> _dest,
}
if (_Signal[0] == '5' && _Signal[1] == 'Q')
{
for (size_t i = 0; i < GALILEO_E5A_Q_PRIMARY_CODE[prn].length() - 1; i++)
for (size_t i = 0; i < GALILEO_E5A_Q_PRIMARY_CODE_STR_LENGTH - 1; i++)
{
hex_to_binary_converter(a, GALILEO_E5A_Q_PRIMARY_CODE[prn][i]);
_dest[index] = std::complex<float>(static_cast<float>(a[0]), 0.0);
@ -54,13 +54,13 @@ void galileo_e5_a_code_gen_complex_primary(own::span<std::complex<float>> _dest,
index = index + 4;
}
// last 2 bits are filled up zeros
hex_to_binary_converter(a, GALILEO_E5A_Q_PRIMARY_CODE[prn][GALILEO_E5A_Q_PRIMARY_CODE[prn].length() - 1]);
hex_to_binary_converter(a, GALILEO_E5A_Q_PRIMARY_CODE[prn][GALILEO_E5A_Q_PRIMARY_CODE_STR_LENGTH - 1]);
_dest[index] = std::complex<float>(static_cast<float>(a[0]), 0.0);
_dest[index + 1] = std::complex<float>(static_cast<float>(a[1]), 0.0);
}
else if (_Signal[0] == '5' && _Signal[1] == 'I')
{
for (size_t i = 0; i < GALILEO_E5A_I_PRIMARY_CODE[prn].length() - 1; i++)
for (size_t i = 0; i < GALILEO_E5A_I_PRIMARY_CODE_STR_LENGTH - 1; i++)
{
hex_to_binary_converter(a, GALILEO_E5A_I_PRIMARY_CODE[prn][i]);
_dest[index] = std::complex<float>(static_cast<float>(a[0]), 0.0);
@ -70,14 +70,14 @@ void galileo_e5_a_code_gen_complex_primary(own::span<std::complex<float>> _dest,
index = index + 4;
}
// last 2 bits are filled up zeros
hex_to_binary_converter(a, GALILEO_E5A_I_PRIMARY_CODE[prn][GALILEO_E5A_I_PRIMARY_CODE[prn].length() - 1]);
hex_to_binary_converter(a, GALILEO_E5A_I_PRIMARY_CODE[prn][GALILEO_E5A_I_PRIMARY_CODE_STR_LENGTH - 1]);
_dest[index] = std::complex<float>(static_cast<float>(a[0]), 0.0);
_dest[index + 1] = std::complex<float>(static_cast<float>(a[1]), 0.0);
}
else if (_Signal[0] == '5' && _Signal[1] == 'X')
{
std::array<int32_t, 4> b{};
for (size_t i = 0; i < GALILEO_E5A_I_PRIMARY_CODE[prn].length() - 1; i++)
for (size_t i = 0; i < GALILEO_E5A_I_PRIMARY_CODE_STR_LENGTH - 1; i++)
{
hex_to_binary_converter(a, GALILEO_E5A_I_PRIMARY_CODE[prn][i]);
hex_to_binary_converter(b, GALILEO_E5A_Q_PRIMARY_CODE[prn][i]);
@ -88,8 +88,8 @@ void galileo_e5_a_code_gen_complex_primary(own::span<std::complex<float>> _dest,
index = index + 4;
}
// last 2 bits are filled up zeros
hex_to_binary_converter(a, GALILEO_E5A_I_PRIMARY_CODE[prn][GALILEO_E5A_I_PRIMARY_CODE[prn].length() - 1]);
hex_to_binary_converter(b, GALILEO_E5A_Q_PRIMARY_CODE[prn][GALILEO_E5A_Q_PRIMARY_CODE[prn].length() - 1]);
hex_to_binary_converter(a, GALILEO_E5A_I_PRIMARY_CODE[prn][GALILEO_E5A_I_PRIMARY_CODE_STR_LENGTH - 1]);
hex_to_binary_converter(b, GALILEO_E5A_Q_PRIMARY_CODE[prn][GALILEO_E5A_Q_PRIMARY_CODE_STR_LENGTH - 1]);
_dest[index] = std::complex<float>(static_cast<float>(a[0]), static_cast<float>(b[0]));
_dest[index + 1] = std::complex<float>(static_cast<float>(a[1]), static_cast<float>(b[1]));
}
@ -141,7 +141,7 @@ void galileo_e5_b_code_gen_complex_primary(own::span<std::complex<float>> _dest,
}
if (_Signal[0] == '7' && _Signal[1] == 'Q')
{
for (size_t i = 0; i < GALILEO_E5B_Q_PRIMARY_CODE[prn].length() - 1; i++)
for (size_t i = 0; i < GALILEO_E5B_Q_PRIMARY_CODE_STR_LENGTH - 1; i++)
{
hex_to_binary_converter(a, GALILEO_E5B_Q_PRIMARY_CODE[prn][i]);
_dest[index] = std::complex<float>(static_cast<float>(a[0]), 0.0);
@ -151,13 +151,13 @@ void galileo_e5_b_code_gen_complex_primary(own::span<std::complex<float>> _dest,
index = index + 4;
}
// last 2 bits are filled up zeros
hex_to_binary_converter(a, GALILEO_E5B_Q_PRIMARY_CODE[prn][GALILEO_E5B_Q_PRIMARY_CODE[prn].length() - 1]);
hex_to_binary_converter(a, GALILEO_E5B_Q_PRIMARY_CODE[prn][GALILEO_E5B_Q_PRIMARY_CODE_STR_LENGTH - 1]);
_dest[index] = std::complex<float>(static_cast<float>(a[0]), 0.0);
_dest[index + 1] = std::complex<float>(static_cast<float>(a[1]), 0.0);
}
else if (_Signal[0] == '7' && _Signal[1] == 'I')
{
for (size_t i = 0; i < GALILEO_E5B_I_PRIMARY_CODE[prn].length() - 1; i++)
for (size_t i = 0; i < GALILEO_E5B_I_PRIMARY_CODE_STR_LENGTH - 1; i++)
{
hex_to_binary_converter(a, GALILEO_E5B_I_PRIMARY_CODE[prn][i]);
_dest[index] = std::complex<float>(static_cast<float>(a[0]), 0.0);
@ -167,14 +167,14 @@ void galileo_e5_b_code_gen_complex_primary(own::span<std::complex<float>> _dest,
index = index + 4;
}
// last 2 bits are filled up zeros
hex_to_binary_converter(a, GALILEO_E5B_I_PRIMARY_CODE[prn][GALILEO_E5B_I_PRIMARY_CODE[prn].length() - 1]);
hex_to_binary_converter(a, GALILEO_E5B_I_PRIMARY_CODE[prn][GALILEO_E5B_I_PRIMARY_CODE_STR_LENGTH - 1]);
_dest[index] = std::complex<float>(static_cast<float>(a[0]), 0.0);
_dest[index + 1] = std::complex<float>(static_cast<float>(a[1]), 0.0);
}
else if (_Signal[0] == '7' && _Signal[1] == 'X')
{
std::array<int32_t, 4> b{};
for (size_t i = 0; i < GALILEO_E5B_I_PRIMARY_CODE[prn].length() - 1; i++)
for (size_t i = 0; i < GALILEO_E5B_I_PRIMARY_CODE_STR_LENGTH - 1; i++)
{
hex_to_binary_converter(a, GALILEO_E5B_I_PRIMARY_CODE[prn][i]);
hex_to_binary_converter(b, GALILEO_E5B_Q_PRIMARY_CODE[prn][i]);
@ -185,8 +185,8 @@ void galileo_e5_b_code_gen_complex_primary(own::span<std::complex<float>> _dest,
index = index + 4;
}
// last 2 bits are filled up zeros
hex_to_binary_converter(a, GALILEO_E5B_I_PRIMARY_CODE[prn][GALILEO_E5B_I_PRIMARY_CODE[prn].length() - 1]);
hex_to_binary_converter(b, GALILEO_E5B_Q_PRIMARY_CODE[prn][GALILEO_E5B_Q_PRIMARY_CODE[prn].length() - 1]);
hex_to_binary_converter(a, GALILEO_E5B_I_PRIMARY_CODE[prn][GALILEO_E5B_I_PRIMARY_CODE_STR_LENGTH - 1]);
hex_to_binary_converter(b, GALILEO_E5B_Q_PRIMARY_CODE[prn][GALILEO_E5B_Q_PRIMARY_CODE_STR_LENGTH - 1]);
_dest[index] = std::complex<float>(static_cast<float>(a[0]), static_cast<float>(b[0]));
_dest[index + 1] = std::complex<float>(static_cast<float>(a[1]), static_cast<float>(b[1]));
}
@ -199,16 +199,16 @@ void galileo_e5_b_code_gen_complex_sampled(own::span<std::complex<float>> _dest,
int32_t _fs,
uint32_t _chip_shift)
{
uint32_t _samplesPerCode;
constexpr uint32_t _codeLength = GALILEO_E5B_CODE_LENGTH_CHIPS;
constexpr int32_t _codeFreqBasis = GALILEO_E5B_CODE_CHIP_RATE_CPS;
auto _samplesPerCode = static_cast<uint32_t>(static_cast<double>(_fs) / (static_cast<double>(_codeFreqBasis) / static_cast<double>(_codeLength)));
uint32_t delay;
const uint32_t _codeLength = GALILEO_E5B_CODE_LENGTH_CHIPS;
const int32_t _codeFreqBasis = GALILEO_E5B_CODE_CHIP_RATE_CPS;
std::vector<std::complex<float>> _code(_codeLength);
galileo_e5_b_code_gen_complex_primary(_code, _prn, _Signal);
_samplesPerCode = static_cast<uint32_t>(static_cast<double>(_fs) / (static_cast<double>(_codeFreqBasis) / static_cast<double>(_codeLength)));
_samplesPerCode =
delay = ((_codeLength - _chip_shift) % _codeLength) * _samplesPerCode / _codeLength;
if (_fs != _codeFreqBasis)

View File

@ -93,22 +93,16 @@ void glonass_l1_ca_code_gen_complex(own::span<std::complex<float>> _dest, uint32
*/
void glonass_l1_ca_code_gen_complex_sampled(own::span<std::complex<float>> _dest, int32_t _fs, uint32_t _chip_shift)
{
// This function is based on the GNU software GPS for MATLAB in the Kay Borre book
constexpr int32_t _codeFreqBasis = 511000; // Hz
constexpr int32_t _codeLength = 511;
constexpr float _tc = 1.0 / static_cast<float>(_codeFreqBasis); // C/A chip period in sec
const float _ts = 1.0 / static_cast<float>(_fs); // Sampling period in sec
const auto _samplesPerCode = static_cast<int32_t>(static_cast<double>(_fs) / (static_cast<double>(_codeFreqBasis) / static_cast<double>(_codeLength)));
std::array<std::complex<float>, 511> _code{};
int32_t _samplesPerCode;
int32_t _codeValueIndex;
float _ts;
float _tc;
float aux;
const int32_t _codeFreqBasis = 511000; // Hz
const int32_t _codeLength = 511;
// --- Find number of samples per spreading code ---------------------------
_samplesPerCode = static_cast<int32_t>(static_cast<double>(_fs) / (static_cast<double>(_codeFreqBasis) / static_cast<double>(_codeLength)));
// --- Find time constants -------------------------------------------------
_ts = 1.0 / static_cast<float>(_fs); // Sampling period in sec
_tc = 1.0 / static_cast<float>(_codeFreqBasis); // C/A chip period in sec
glonass_l1_ca_code_gen_complex(_code, _chip_shift); // generate C/A code 1 sample per chip

View File

@ -93,22 +93,16 @@ void glonass_l2_ca_code_gen_complex(own::span<std::complex<float>> _dest, uint32
*/
void glonass_l2_ca_code_gen_complex_sampled(own::span<std::complex<float>> _dest, int32_t _fs, uint32_t _chip_shift)
{
// This function is based on the GNU software GPS for MATLAB in the Kay Borre book
constexpr int32_t _codeFreqBasis = 511000; // Hz
constexpr int32_t _codeLength = 511;
constexpr float _tc = 1.0 / static_cast<float>(_codeFreqBasis); // C/A chip period in sec
const auto _samplesPerCode = static_cast<int32_t>(static_cast<double>(_fs) / (static_cast<double>(_codeFreqBasis) / static_cast<double>(_codeLength)));
const float _ts = 1.0 / static_cast<float>(_fs); // Sampling period in sec
std::array<std::complex<float>, 511> _code{};
int32_t _samplesPerCode;
int32_t _codeValueIndex;
float _ts;
float _tc;
float aux;
const int32_t _codeFreqBasis = 511000; // Hz
const int32_t _codeLength = 511;
// --- Find number of samples per spreading code ---------------------------
_samplesPerCode = static_cast<int32_t>(static_cast<double>(_fs) / (static_cast<double>(_codeFreqBasis) / static_cast<double>(_codeLength)));
// --- Find time constants -------------------------------------------------
_ts = 1.0 / static_cast<float>(_fs); // Sampling period in sec
_tc = 1.0 / static_cast<float>(_codeFreqBasis); // C/A chip period in sec
glonass_l2_ca_code_gen_complex(_code, _chip_shift); // generate C/A code 1 sample per chip

View File

@ -79,25 +79,19 @@ void gps_l2c_m_code_gen_float(own::span<float> _dest, uint32_t _prn)
*/
void gps_l2c_m_code_gen_complex_sampled(own::span<std::complex<float>> _dest, uint32_t _prn, int32_t _fs)
{
constexpr int32_t _codeLength = GPS_L2_M_CODE_LENGTH_CHIPS;
constexpr float _tc = 1.0 / static_cast<float>(GPS_L2_M_CODE_RATE_CPS); // L2C chip period in sec
const auto _samplesPerCode = static_cast<int32_t>(static_cast<double>(_fs) / (static_cast<double>(GPS_L2_M_CODE_RATE_CPS) / static_cast<double>(_codeLength)));
const float _ts = 1.0 / static_cast<float>(_fs); // Sampling period in sec
int32_t _codeValueIndex;
std::array<int32_t, GPS_L2_M_CODE_LENGTH_CHIPS> _code{};
if (_prn > 0 and _prn < 51)
{
gps_l2c_m_code(_code, _prn);
}
int32_t _samplesPerCode;
int32_t _codeValueIndex;
float _ts;
float _tc;
const int32_t _codeLength = GPS_L2_M_CODE_LENGTH_CHIPS;
// --- Find number of samples per spreading code ---------------------------
_samplesPerCode = static_cast<int32_t>(static_cast<double>(_fs) / (static_cast<double>(GPS_L2_M_CODE_RATE_CPS) / static_cast<double>(_codeLength)));
// --- Find time constants -------------------------------------------------
_ts = 1.0 / static_cast<float>(_fs); // Sampling period in sec
_tc = 1.0 / static_cast<float>(GPS_L2_M_CODE_RATE_CPS); // L2C chip period in sec
for (int32_t i = 0; i < _samplesPerCode; i++)
{
// === Digitizing ==================================================

View File

@ -196,25 +196,19 @@ void gps_l5i_code_gen_float(own::span<float> _dest, uint32_t _prn)
*/
void gps_l5i_code_gen_complex_sampled(own::span<std::complex<float>> _dest, uint32_t _prn, int32_t _fs)
{
constexpr int32_t _codeLength = GPS_L5I_CODE_LENGTH_CHIPS;
constexpr float _tc = 1.0 / static_cast<float>(GPS_L5I_CODE_RATE_CPS); // L5I primary chip period in sec
const auto _samplesPerCode = static_cast<int32_t>(static_cast<double>(_fs) / (static_cast<double>(GPS_L5I_CODE_RATE_CPS) / static_cast<double>(_codeLength)));
const float _ts = 1.0 / static_cast<float>(_fs); // Sampling period in sec
int32_t _codeValueIndex;
std::array<int32_t, GPS_L5I_CODE_LENGTH_CHIPS> _code{};
if (_prn > 0 and _prn < 51)
{
make_l5i(_code, _prn - 1);
}
int32_t _samplesPerCode;
int32_t _codeValueIndex;
float _ts;
float _tc;
const int32_t _codeLength = GPS_L5I_CODE_LENGTH_CHIPS;
// --- Find number of samples per spreading code ---------------------------
_samplesPerCode = static_cast<int32_t>(static_cast<double>(_fs) / (static_cast<double>(GPS_L5I_CODE_RATE_CPS) / static_cast<double>(_codeLength)));
// --- Find time constants -------------------------------------------------
_ts = 1.0 / static_cast<float>(_fs); // Sampling period in sec
_tc = 1.0 / static_cast<float>(GPS_L5I_CODE_RATE_CPS); // L5I primary chip period in sec
for (int32_t i = 0; i < _samplesPerCode; i++)
{
// === Digitizing ==================================================

View File

@ -145,21 +145,16 @@ void gps_l1_ca_code_gen_complex(own::span<std::complex<float>> _dest, int32_t _p
void gps_l1_ca_code_gen_complex_sampled(own::span<std::complex<float>> _dest, uint32_t _prn, int32_t _fs, uint32_t _chip_shift)
{
// This function is based on the GNU software GPS for MATLAB in the Kay Borre book
constexpr int32_t _codeFreqBasis = 1023000; // Hz
constexpr int32_t _codeLength = 1023;
constexpr float _tc = 1.0 / static_cast<float>(_codeFreqBasis); // C/A chip period in sec
const auto _samplesPerCode = static_cast<int32_t>(static_cast<double>(_fs) / (static_cast<double>(_codeFreqBasis) / static_cast<double>(_codeLength)));
const float _ts = 1.0 / static_cast<float>(_fs); // Sampling period in sec
std::array<std::complex<float>, 1023> _code{};
int32_t _samplesPerCode;
int32_t _codeValueIndex;
float _ts;
float _tc;
float aux;
const int32_t _codeFreqBasis = 1023000; // Hz
const int32_t _codeLength = 1023;
// --- Find number of samples per spreading code ---------------------------
_samplesPerCode = static_cast<int32_t>(static_cast<double>(_fs) / (static_cast<double>(_codeFreqBasis) / static_cast<double>(_codeLength)));
// --- Find time constants -------------------------------------------------
_ts = 1.0 / static_cast<float>(_fs); // Sampling period in sec
_tc = 1.0 / static_cast<float>(_codeFreqBasis); // C/A chip period in sec
gps_l1_ca_code_gen_complex(_code, _prn, _chip_shift); // generate C/A code 1 sample per chip
for (int32_t i = 0; i < _samplesPerCode; i++)

View File

@ -97,8 +97,8 @@ void signal_generator_c::init()
current_data_bit_int_.push_back(1);
current_data_bits_.emplace_back(1, 0);
ms_counter_.push_back(0);
data_modulation_.push_back((GALILEO_E5A_I_SECONDARY_CODE.at(0) == '0' ? 1 : -1));
pilot_modulation_.push_back((GALILEO_E5A_Q_SECONDARY_CODE[PRN_[sat]].at(0) == '0' ? 1 : -1));
data_modulation_.push_back((GALILEO_E5A_I_SECONDARY_CODE[0] == '0' ? 1 : -1));
pilot_modulation_.push_back((GALILEO_E5A_Q_SECONDARY_CODE[PRN_[sat]][0] == '0' ? 1 : -1));
if (system_[sat] == "G")
{
@ -365,8 +365,8 @@ int signal_generator_c::general_work(int noutput_items __attribute__((unused)),
// New random data bit
current_data_bit_int_[sat] = (uniform_dist(e1) % 2) == 0 ? 1 : -1;
}
data_modulation_[sat] = current_data_bit_int_[sat] * (GALILEO_E5A_I_SECONDARY_CODE.at((ms_counter_[sat] + delay_sec_[sat]) % 20) == '0' ? 1 : -1);
pilot_modulation_[sat] = (GALILEO_E5A_Q_SECONDARY_CODE[PRN_[sat] - 1].at((ms_counter_[sat] + delay_sec_[sat]) % 100) == '0' ? 1 : -1);
data_modulation_[sat] = current_data_bit_int_[sat] * (GALILEO_E5A_I_SECONDARY_CODE[(ms_counter_[sat] + delay_sec_[sat]) % 20] == '0' ? 1 : -1);
pilot_modulation_[sat] = (GALILEO_E5A_Q_SECONDARY_CODE[PRN_[sat] - 1][((ms_counter_[sat] + delay_sec_[sat]) % 100)] == '0' ? 1 : -1);
ms_counter_[sat] = ms_counter_[sat] + static_cast<int>(round(1e3 * GALILEO_E5A_CODE_PERIOD_S));

View File

@ -23,26 +23,25 @@
#include "MATH_CONSTANTS.h"
#include <cstdint>
#include <string>
// carrier and code frequencies
const double BEIDOU_B1I_FREQ_HZ = 1.561098e9; //!< B1I [Hz]
const double BEIDOU_B1I_CODE_RATE_CPS = 2.046e6; //!< Beidou B1I code rate [chips/s]
const double BEIDOU_B1I_CODE_LENGTH_CHIPS = 2046.0; //!< Beidou B1I code length [chips]
const double BEIDOU_B1I_CODE_PERIOD_S = 0.001; //!< Beidou B1I code period [seconds]
constexpr double BEIDOU_B1I_FREQ_HZ = 1.561098e9; //!< B1I [Hz]
constexpr double BEIDOU_B1I_CODE_RATE_CPS = 2.046e6; //!< Beidou B1I code rate [chips/s]
constexpr double BEIDOU_B1I_CODE_LENGTH_CHIPS = 2046.0; //!< Beidou B1I code length [chips]
constexpr double BEIDOU_B1I_CODE_PERIOD_S = 0.001; //!< Beidou B1I code period [seconds]
constexpr uint32_t BEIDOU_B1I_CODE_PERIOD_MS = 1; //!< Beidou B1I code period [ms]
const int32_t BEIDOU_B1I_SECONDARY_CODE_LENGTH = 20;
const std::string BEIDOU_B1I_SECONDARY_CODE_STR = "00000100110101001110";
const std::string BEIDOU_B1I_GEO_PREAMBLE_SYMBOLS_STR = {"1111110000001100001100"};
const int32_t BEIDOU_B1I_GEO_PREAMBLE_LENGTH_SYMBOLS = 22;
const std::string BEIDOU_B1I_D2_SECONDARY_CODE_STR = "00";
const uint32_t BEIDOU_B1I_PREAMBLE_LENGTH_BITS = 11;
const uint32_t BEIDOU_B1I_PREAMBLE_LENGTH_SYMBOLS = 220;
const double BEIDOU_B1I_PREAMBLE_DURATION_S = 0.220;
const int32_t BEIDOU_B1I_PREAMBLE_DURATION_MS = 220;
constexpr int32_t BEIDOU_B1I_SECONDARY_CODE_LENGTH = 20;
constexpr char BEIDOU_B1I_SECONDARY_CODE_STR[] = "00000100110101001110";
constexpr char BEIDOU_B1I_GEO_PREAMBLE_SYMBOLS_STR[] = "1111110000001100001100";
constexpr int32_t BEIDOU_B1I_GEO_PREAMBLE_LENGTH_SYMBOLS = 22;
constexpr char BEIDOU_B1I_D2_SECONDARY_CODE_STR[] = "00";
constexpr uint32_t BEIDOU_B1I_PREAMBLE_LENGTH_BITS = 11;
constexpr uint32_t BEIDOU_B1I_PREAMBLE_LENGTH_SYMBOLS = 220;
constexpr double BEIDOU_B1I_PREAMBLE_DURATION_S = 0.220;
constexpr int32_t BEIDOU_B1I_PREAMBLE_DURATION_MS = 220;
constexpr int32_t BEIDOU_B1I_TELEMETRY_RATE_BITS_SECOND = 50;
constexpr int32_t BEIDOU_B1I_TELEMETRY_SYMBOLS_PER_BIT = 20;
const int32_t BEIDOU_B1I_GEO_TELEMETRY_SYMBOLS_PER_BIT = 2;
constexpr int32_t BEIDOU_B1I_GEO_TELEMETRY_SYMBOLS_PER_BIT = 2;
constexpr int32_t BEIDOU_B1I_TELEMETRY_SYMBOL_PERIOD_MS = BEIDOU_B1I_TELEMETRY_SYMBOLS_PER_BIT * BEIDOU_B1I_CODE_PERIOD_MS;
constexpr int32_t BEIDOU_B1I_TELEMETRY_RATE_SYMBOLS_SECOND = BEIDOU_B1I_TELEMETRY_RATE_BITS_SECOND * BEIDOU_B1I_TELEMETRY_SYMBOLS_PER_BIT;

View File

@ -25,23 +25,23 @@
#include <string>
// carrier and code frequencies
const double BEIDOU_B3I_FREQ_HZ = 1.268520e9; //!< BeiDou B3I [Hz]
const double BEIDOU_B3I_CODE_RATE_CPS = 10.23e6; //!< BeiDou B3I code rate [chips/s]
const double BEIDOU_B3I_CODE_LENGTH_CHIPS = 10230.0; //!< BeiDou B3I code length [chips]
const double BEIDOU_B3I_CODE_PERIOD_S = 0.001; //!< BeiDou B3I code period [seconds]
constexpr double BEIDOU_B3I_FREQ_HZ = 1.268520e9; //!< BeiDou B3I [Hz]
constexpr double BEIDOU_B3I_CODE_RATE_CPS = 10.23e6; //!< BeiDou B3I code rate [chips/s]
constexpr double BEIDOU_B3I_CODE_LENGTH_CHIPS = 10230.0; //!< BeiDou B3I code length [chips]
constexpr double BEIDOU_B3I_CODE_PERIOD_S = 0.001; //!< BeiDou B3I code period [seconds]
constexpr uint32_t BEIDOU_B3I_CODE_PERIOD_MS = 1; //!< BeiDou B3I code period [ms]
const int32_t BEIDOU_B3I_SECONDARY_CODE_LENGTH = 20;
const std::string BEIDOU_B3I_SECONDARY_CODE_STR = "00000100110101001110";
const std::string BEIDOU_B3I_GEO_PREAMBLE_SYMBOLS_STR = {"1111110000001100001100"};
const int32_t BEIDOU_B3I_GEO_PREAMBLE_LENGTH_SYMBOLS = 22;
const std::string BEIDOU_B3I_D2_SECONDARY_CODE_STR = "00";
const uint32_t BEIDOU_B3I_PREAMBLE_LENGTH_BITS = 11;
const uint32_t BEIDOU_B3I_PREAMBLE_LENGTH_SYMBOLS = 220; // **************
const double BEIDOU_B3I_PREAMBLE_DURATION_S = 0.220;
const int32_t BEIDOU_B3I_PREAMBLE_DURATION_MS = 220;
constexpr int32_t BEIDOU_B3I_SECONDARY_CODE_LENGTH = 20;
constexpr char BEIDOU_B3I_SECONDARY_CODE_STR[] = "00000100110101001110";
constexpr char BEIDOU_B3I_GEO_PREAMBLE_SYMBOLS_STR[] = "1111110000001100001100";
constexpr int32_t BEIDOU_B3I_GEO_PREAMBLE_LENGTH_SYMBOLS = 22;
constexpr char BEIDOU_B3I_D2_SECONDARY_CODE_STR[] = "00";
constexpr uint32_t BEIDOU_B3I_PREAMBLE_LENGTH_BITS = 11;
constexpr uint32_t BEIDOU_B3I_PREAMBLE_LENGTH_SYMBOLS = 220; // **************
constexpr double BEIDOU_B3I_PREAMBLE_DURATION_S = 0.220;
constexpr int32_t BEIDOU_B3I_PREAMBLE_DURATION_MS = 220;
constexpr int32_t BEIDOU_B3I_TELEMETRY_RATE_BITS_SECOND = 50; //!< D1 NAV message bit rate [bits/s]
constexpr int32_t BEIDOU_B3I_TELEMETRY_SYMBOLS_PER_BIT = 20;
const int32_t BEIDOU_B3I_GEO_TELEMETRY_SYMBOLS_PER_BIT = 2; // *************
constexpr int32_t BEIDOU_B3I_GEO_TELEMETRY_SYMBOLS_PER_BIT = 2; // *************
constexpr int32_t BEIDOU_B3I_TELEMETRY_SYMBOL_PERIOD_MS = BEIDOU_B3I_TELEMETRY_SYMBOLS_PER_BIT * BEIDOU_B3I_CODE_PERIOD_MS;
constexpr int32_t BEIDOU_B3I_TELEMETRY_RATE_SYMBOLS_SECOND = BEIDOU_B3I_TELEMETRY_RATE_BITS_SECOND * BEIDOU_B3I_TELEMETRY_SYMBOLS_PER_BIT;

View File

@ -22,7 +22,6 @@
#include "MATH_CONSTANTS.h"
#include <cstdint>
#include <string>
#include <utility>
#include <vector>
@ -41,7 +40,7 @@ constexpr uint32_t BEIDOU_DNAV_SUBFRAME_SYMBOLS = 300;
constexpr int32_t BEIDOU_DNAV_SUBFRAME_DATA_BITS = 300; //!< Number of bits per subframe in the NAV message [bits]
constexpr uint32_t BEIDOU_DNAV_WORDS_SUBFRAME = 10;
constexpr uint32_t BEIDOU_DNAV_WORD_LENGTH_BITS = 30;
const std::string BEIDOU_DNAV_PREAMBLE = "11100010010";
constexpr char BEIDOU_DNAV_PREAMBLE[] = "11100010010";
// Number of leap seconds passed from the start of the GPS epoch up to the start of BeiDou epoch
constexpr int32_t BEIDOU_DNAV_BDT2GPST_LEAP_SEC_OFFSET = 14;

View File

@ -30,13 +30,6 @@
// CNAV GPS NAVIGATION MESSAGE STRUCTURE
// NAVIGATION MESSAGE FIELDS POSITIONS (from IS-GPS-200K Appendix III)
#define GPS_CNAV_PREAMBLE \
{ \
1, 0, 0, 0, 1, 0, 1, 1 \
}
#define GPS_CNAV_PREAMBLE_STR "10001011"
#define GPS_CNAV_INV_PREAMBLE_STR "01110100"
constexpr int32_t GPS_CNAV_DATA_PAGE_BITS = 300;
// common to all messages

View File

@ -24,7 +24,6 @@
#include "MATH_CONSTANTS.h"
#include "gnss_frequencies.h"
#include <cstdint>
#include <string>
#include <utility> // std::pair
#include <vector>
@ -67,13 +66,8 @@ constexpr double GPS_STARTOFFSET_MS = 68.802; // [ms] Initial signal travel tim
constexpr int32_t GPS_L1_CA_HISTORY_DEEP = 100;
// NAVIGATION MESSAGE DEMODULATION AND DECODING
#define GPS_PREAMBLE \
{ \
1, 0, 0, 0, 1, 0, 1, 1 \
}
const std::string GPS_CA_PREAMBLE = {"10001011"};
const std::string GPS_CA_PREAMBLE_SYMBOLS_STR = {"1111111111111111111100000000000000000000000000000000000000000000000000000000000011111111111111111111000000000000000000001111111111111111111111111111111111111111"};
constexpr char GPS_CA_PREAMBLE[] = "10001011";
constexpr char GPS_CA_PREAMBLE_SYMBOLS_STR[] = "1111111111111111111100000000000000000000000000000000000000000000000000000000000011111111111111111111000000000000000000001111111111111111111111111111111111111111";
constexpr int32_t GPS_CA_PREAMBLE_LENGTH_BITS = 8;
constexpr int32_t GPS_CA_PREAMBLE_LENGTH_SYMBOLS = 160;
constexpr double GPS_CA_PREAMBLE_DURATION_S = 0.160;

View File

@ -25,7 +25,6 @@
#include "MATH_CONSTANTS.h"
#include "gnss_frequencies.h"
#include <cstdint>
#include <string>
// Physical constants
@ -177,9 +176,9 @@ constexpr int32_t GPS_L5_CNAV_DATA_PAGE_SYMBOLS = 600;
constexpr int32_t GPS_L5_CNAV_DATA_PAGE_DURATION_S = 6;
constexpr int32_t GPS_L5I_NH_CODE_LENGTH = 10;
constexpr int32_t GPS_L5I_NH_CODE[10] = {0, 0, 0, 0, 1, 1, 0, 1, 0, 1};
const std::string GPS_L5I_NH_CODE_STR = "0000110101";
constexpr char GPS_L5I_NH_CODE_STR[] = "0000110101";
constexpr int32_t GPS_L5Q_NH_CODE_LENGTH = 20;
constexpr int32_t GPS_L5Q_NH_CODE[20] = {0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0};
const std::string GPS_L5Q_NH_CODE_STR = "00000100110101001110";
constexpr char GPS_L5Q_NH_CODE_STR[] = "00000100110101001110";
#endif // GNSS_SDR_GPS_L5_H

View File

@ -24,8 +24,8 @@
#include "MATH_CONSTANTS.h"
#include "gnss_frequencies.h"
#include <cstddef> // for size_t
#include <cstdint>
#include <string>
#include <utility> // std::pair
#include <vector>
@ -61,7 +61,7 @@ constexpr int32_t GALILEO_E1_HISTORY_DEEP = 100; //!< Observable history length
// Galileo INAV Telemetry structure
const std::string GALILEO_INAV_PREAMBLE = {"0101100000"};
constexpr char GALILEO_INAV_PREAMBLE[] = "0101100000";
constexpr int32_t GALILEO_INAV_PREAMBLE_LENGTH_BITS = 10;
constexpr double GALILEO_INAV_PAGE_PART_WITH_PREABLE_SECONDS = 2.0 + GALILEO_INAV_PREAMBLE_LENGTH_BITS * GALILEO_E1_CODE_PERIOD_S;
@ -287,7 +287,8 @@ const std::vector<std::pair<int32_t, int32_t>> TOW_0_BIT({{109, 20}});
// Galileo E1 primary codes
const std::string GALILEO_E1_B_PRIMARY_CODE[GALILEO_E1_NUMBER_OF_CODES] = {
constexpr size_t GALILEO_E1_B_PRIMARY_CODE_STR_LENGTH = 1023;
constexpr char GALILEO_E1_B_PRIMARY_CODE[GALILEO_E1_NUMBER_OF_CODES][1024] = {
"F5D710130573541B9DBD4FD9E9B20A0D59D144C54BC7935539D2E75810FB51E494093A0A19DD79C70C5A98E5657AA578097777E86BCC4651CC72F2F974DC766E07AEA3D0B557EF42FF57E6A58E805358CE9257669133B18F80FDBDFB38C5524C7FB1DE079842482990DF58F72321D9201F8979EAB159B2679C9E95AA6D53456C0DF75C2B4316D1E2309216882854253A1FA60CA2C94ECE013E2A8C943341E7D9E5A8464B3AD407E0AE465C3E3DD1BE60A8C3D50F831536401E776BE02A6042FC4A27AF653F0CFC4D4D013F115310788D68CAEAD3ECCCC5330587EB3C22A1459FC8E6FCCE9CDE849A5205E70C6D66D125814D698DD0EEBFEAE52CC65C5C84EEDF207379000E169D318426516AC5D1C31F2E18A65E07AE6E33FDD724B13098B3A444688389EFBBB5EEAB588742BB083B679D42FB26FF77919EAB21DE0389D9997498F967AE05AF0F4C7E177416E18C4D5E6987ED3590690AD127D872F14A8F4903A12329732A9768F82F295BEE391879293E3A97D51435A7F03ED7FBE275F102A83202DC3DE94AF4C712E9D006D182693E9632933E6EB773880CF147B922E74539E4582F79E39723B4C80E42EDCE4C08A8D02221BAE6D17734817D5B531C0D3C1AE723911F3FFF6AAC02E97FEA69E376AF4761E6451CA61FDB2F9187642EFCD63A09AAB680770C1593EEDD4FF4293BFFD6DD2C3367E85B14A654C834B6699421A", // 01
"96B856A629F581D1344FEF597835FE60434625D077ECF0D95FBE1155EA0431979E5AFF544AF591A332FDAEF98AB1EDD847A73F3AF15AAEE7E9A05C9D82C59EC325EF4CF264B8ADF2A8E8BA459354CB4B415CC50BF239ADBC31B3A9C87B0843CF3B9E6D646BA43F866276B053826F3A2334CC5E2EFB9F8F195B382E75EEA63F58A06B3F82A3B5C77C1800FD9498F803E524435B321210BB84690BED0BBBE16D363B3A90656A73720E27008852FB7DACC8284411B177728D9527C560859084A395A6F11A96AD9DB6B43E00642B000ED12BFD967868EAB1108552CD4FC89FBC408ACE7678C381EC91DD000319124EB5D5EF52C4CAC9AADEE2FA045C16CE492D7F43743CA77924C78696FCBF2F9F7F36D8E623752200C6FCBBD71ABBB6877F3C5D6E6740AB0389458A6B66440858B2D383244E853646FE2714211DEA9E6196252815BB704A20BFE556AC474F8998944E0CABBBE21A6400B87BFDCF937D12B2821D59298AF4AD378F0F42BD8C41693B8D993CF37C8B478F3BB5D33AD2A9FA24AD7B8FA895FDBC04964192F7BA3FF74E0E3A435B5DFE042E3115CACF29624C0645E9C917534A2EBC1F5665E4E1B1BC56208DBCD8A27CCB6474D5D0E20CA4072C960E5ACE41BDA3770DF3B681F2B318F6F8E1CB17C2857350FB6009AED665E13B2780D79217F73FAC7A8A48048DB0FB8A8A5007CDDC9A7B2DA8257C99F1CB605A18204",
"E57DE19A3E4A8C122FCB1DD6584B3D2DAE364D800F9C5A9E957B38F624CBD3ACC58FA3ED070B5E44857CCB813FBC0BB83B5D157C6C562422E5963CC4DD753C45B0264F8E136A0F1774D77A543E44D51EF8C6B9408B6E3B5CEE1347A94F13ECDC94DC764976E5A50B4CB0AE7557553B47EDFE03EC2CD32EA8D125A341E1EDFC77E75330D6E7B23DC838EBCE7E5567F5B8C80C3D15E7404B4E10F0BEB0C69626A814AF91334199864FC77E0FF548DC2A6FA6A71C3C0561F2B085CC05E8512E27B9DBA60B93D114B87935776C8E9A67905C429D48BF3AB1B0A56FAFBFD5D9C8D8C8A9E5918BFF273CF5E8664FF2B90314BDBFDAD5AB8C22A0E45C104ECE75EA43FE9BDCE306A5A28AE464628163D249D8056005F1A900951808CC8620F81768153436F741667A8E271DD986C7A1E5046FCC74C7CEBBF9A1296D6CF0B2FF85BE412D87214BB368DFF462AD649D7324A117252311C664D33E4DAFBD830FBCEB6EFBDD7391D4BADA7A775FD1949D981F619655DB3C22BAC34E5AE41222905C0C7E80D6EA28471EC0468756531C09A471EDBE200472E78F1701FEE96E5769A9893C0F11E7906B064442E06E21ED8B0D70AF288690C532A2D03B373E1E0085F62F7AAA658B569C5184E3DDC40ECAA88B887118601691892F9F55E2DE79E49DFF11D434C2BA3AA6447522A7C99DC215CAD2ED0114ED62CBDAE9D315E48AE14D2014B7F8E",
@ -340,7 +341,8 @@ const std::string GALILEO_E1_B_PRIMARY_CODE[GALILEO_E1_NUMBER_OF_CODES] = {
"97051FC67ACA30E8AEE73D3A8CF38BB13524D4E0EBD9BE68398C7C16227CABB1D0B0A0ABE7B6384ABA02905BA0C3C7363599D059C7B4C99DB165CD14FA12FA7912449CA7DD5E346D8010C85A757382270DAD15BA3CE36A76EF55F81A1E80BF366B37FE3A88EC722028C25E234E624040450A99CD808F942568AA7133981D72E7F2928894670AD5399482DF1B90E7E64062F830B736C79C30F36281495C76699CD48404673FA334F042F9E0E67DD7F3853BF71ABEAF6A9A5546855E840CE42B224D8F6490C6CE5FC02EBAF4FFC390107058F54CD635D4A7F2878099C1EF495750E6921BE2F39AD808C4210F287319F811A254CEF8CF153FC50AB2F3D694A530949E5F578D075DB96DDCF2BB90ED3DE09D9CA8E08662FD8982741DE1CE0A6B64C3D3D5004B5C04B2B0DFD976A20FACC94D1762D41EE03B40D2CF367612812EF4CC41D1BFE9CEB51AE3A22AF1BE7B85A057D3048D0E73FA0FDAF1119EFD76F0A41BE63128B22D64A5553E9549D411483BBCA1483EF30CF6A6D317AD2C7973EFA6D4C1121F703D2F48FCDA3177AD450D75D2A28D2C244AEA13F0E60AEED8ACBAB444D400DF5E280DB799B2D9A984DF1E2567D39D1DE58EF78CA6B4D8BC172B07DCB02D156CA96EEFAC69E556CFCE0AAB617C7FBB8C34871C1D35E74B7BD307D3F2E424C7A9AD676A1A69E0FE735EA50887A1DFAE6CA2FE4460FC7EF323ADE493020" // 50
};
const std::string GALILEO_E1_C_PRIMARY_CODE[GALILEO_E1_NUMBER_OF_CODES] = {
constexpr size_t GALILEO_E1_C_PRIMARY_CODE_STR_LENGTH = 1023;
constexpr char GALILEO_E1_C_PRIMARY_CODE[GALILEO_E1_NUMBER_OF_CODES][1024] = {
"B39340CA1C817D81EF4FAE4E95BF3504A7709089FB48560E9E3EF802180E85EB2194E05902C6C4C52021FEB7EC64FD416BCEBC8E39D64A4B5EE345291911AB8204A888C25B1CD3D9342A56C538636D3EAB957037D09E879AE5F3A39834FBB84A3D8D5090D7814246B62E9CA68533D2EC403B4FB9488467FF9758B0D15A8CEF89187A1D5897880040B6C3C5244E85A2AD14BCF2F5ABC44A7B1D4A87E8BDA05766218773ED4F70F8D1D07CBB1E8CA6298E64EE6DC5886D37495BA2EDB3E0B0B68AD9F300310B88898DDEEFD484538C31A9BCAA76ECAD0C16607D32189058B0862EE9D70CEA9D304755CE8037BA4C46C2573181748A212E4B2BDD04F9BC240518273DC17CBAFF21A03E9120FA7DCA18D56DD1D9A7E510C90CF219104385F531F2EFAFD185ECB6B911F9B7809D98D86F15516FFDDBE9BD1CF8662EB777C3F94EA3F962D7B79449FAAD39935429E92CAE5637E9BCF4E94D413D27934952409AB536BE4055AFBC4330CD1E4B5509EFE5F8EFC9ECBE9EF377DE7E37C479BB9D3EE7745E4609B0A6D2C5D92EB3C9E2278C1F2221FF907596AA5E096ACF8990EBA907E43AD320F8019CB6355A2BA8670EE5A4F463E8E56F8F1D3E7F4922510FB668E32C4CF23AD8496399638B095B47833E0CBB34977EB3E4242EAF870D86660D6A73F83E45D6E8A41EDCA3815079649544597C5C43B6C93FEBAD5700D22EDAF431FD340",
"A64F94BB47BD4033C76D4924305907EC1F618B43C7535F3CFC093E5AF5DDD5C4339F3BB6D835B5C2C2053CD3D5693368D4E1A7CAC59425D1FD96809C67285CFD3FC05B01053CB0773221D7205778022F487BF99D1650566BE287FD7AE882AA8E8F52E5D4E3C0C2F971C9FF70AA378691EBD8ADE45CF213822D09FD05243F9726F6C69893845E57C37A7643E16B770E26F431FF69D437271905D270EB85D8D229D7D87662121F0BEEB1E895ED9589A9CF5833408A04197AC9025D8570AD9B75DB7E192EA0A089504996E9DC652975D83633619CFF80667D8B519536B3475248BA8213C8A4C66DE69B4B3774BF9142425C57F34A27B1E288119E3FFCC6AF6A21087F9394F09DDFBD42F32D059B8CD4104A519BA640765D5CDE490E62F10E695FBFD33CBC9D2208A532C8EC25DA28B8CC1B6850AB43D9B5C00B6E74B7A148791AB07B328D347058C7E6233E18C5ED172C9F9E9ACF29D913E2A1614BFC0893D4967ED033B2B9AE6B51F908F1CED57C14FEEA85CD4D9711216BE7F79FA6721B7DCCA033C80127AC6E5FCF58EB4005EC24CB4886D787355362D5E7031B9B2AC2A86D730AD734181E723A811FF510A4DF868001973FE83288D78E6F9B9441DAF5BE2974A2848FD917C3BCD346A431922246EC852E4AAD467E60C15D61DD3BF4A207BB57DB45DCADEFE3210BE74B9DACC918A394469F2E2C95AD1E211947948FE24F5E4",
"FD1F6976002C39C87187C44E3D224ED4DF0B67750105944C651A5E57798F168A136AC0FB5979C4E847A82B20A2E6C45DB42EF2B930A80D3257BCCC53EDA966F5DCD9AD47CFB226EED9B62A874E9F6404D4087798A1005F4131171D3A47907A3CD602B83DABE094D2CB031867DF4595F3ED59FD8C4D76EDEEE59E422CE5C7D0A5F720BE94FA24DF05F758348EADD5EFE9197C6BB2292E2B14DB8C6DB24AA94C5FF0F5106D2B566058D32C58B63A150784F7B02478D9973DD4CFD2E84059AE0F4F1320754B7EE83F04A51C67EFFC2EB1C301C0C58DBAEBE95474E3484A76500103C14C40BB0B7D3A04D8BDABB605C1EF9FD4A6564934DEC50BD5878243AEE80F9796EED70CE1B1E8B55725DF76472D12D4A7A487989F42E6705818B1F7E149E97153A7B05A82FA3FBE51763E61171A4E12931472E94CCBA74CC09483DF93623FC60945070FDDF3A00B561650427E4BD64D675B1EB398B35EF057A66FD0B48EDBABBDCD57C32ABAE46F5CDD0CB1FCF17765258236F3DE40BD5D0A3C5C978D81DEB07367AB20B2CAA9834B9576161C4F20FB9C184A01DC9021A4E92B71333354E05BBEA9015E5AC4C66312E8B79F0B92279AC7EF1936BCC30802B83DB3D113BEF64452CAD7ACF6674FDA44023A661019841A101BE80FDA4E3210AE774E433A9ABD97F2755259AECE21F7A8C3B1A3D471F874D2EEC85B9B21BC0C2E2EC9016F847C6",
@ -392,6 +394,6 @@ const std::string GALILEO_E1_C_PRIMARY_CODE[GALILEO_E1_NUMBER_OF_CODES] = {
"CD7AAC98501F29507EA4E0183E8A40D2E5117E47BB5D18D01A3732DE4C821DFE86521CBEA7DB29BE1148BD544ECC681689BCD1B41EAF755310B7659342F8EE11CB41550CC30E566E192796B66C1A83C0B28BACCFA6C393043A0A2CB89712BC1CCB174DE58E66896AF39C1CEED1E05B0435F8CF6FD920D100F51584FE24879987399481DBF27DDB6286B6353919E552E669290CE02AB4CD5113D7F484229F379C7332767EC69E4336439B05DE1C1E3563DD303A4F580BFF20A40E49CB0822F715ED0221EBCDB5DBAD751124B1715E82F37488265135B6C8BBCF4F801ECC4D3525FF189493AD4EFF0C042B070C4CA8FB1FDF43D79F06A6E4E3D35D7B07D4B728D5DC54EEDACBBBA1EDDCDC07ADF7DFCFEF835E44DF1FF66DAF2A7BAEBE218AC3B15E183044D6A8A89B3C101B40BED97ED5DF93BBC1B84931D56B8C822A6D058AC74CFA4C85D8B456698E82D5B7574C17B041E5F4BEED09F75012355CBC322B822C63F10C18A8F279E9A0E18E1FEF183D23E13894E31F6D046956FE8A647558228F6D4D6910151EC03937876B6ED7A078D33DAEB3F2239353BB8181E62B286BBC41588DE10F478A5CE5B508F205A41820356767B0A0ED4B8DB9EFE348362E9A90D6C30218B295B338B51C09239D02FC8A1E7DAAAB60AC37F5E67CFC88EEF69567B5C81A03B449F4ED38B9D295A36AA3503173F6F6F66D93CE72D753076040FACDE",
"ADDCEDB50E907D20E826E6E8A0D30C20C74B2DF204EA784BAE9F618CAE33A3C937729DF9CB10BA2A4C33E0182A37200C0CC509729D828B8A2A20F283AC4F9306596684EA3FB5492A4C9F2DB459E7531C9F9C0950E7D9E93B3EE5912AE7E39AC8F4EC14B18F24E325003F477E347C5AC1B67CDB11AF3BBBBCD0AC3703024B5767AA67A208254F798684BFD1D3EACD757EEC77254950A146620400DB95E694574F739A991EBA771EBBDFF1056BB39A77DBE0636A032E17141332F951C57C6C90F348F165E3ABDD60D429D5D6BEC7E3E3463806F819EB2D212B3528A5EDE51F235AD100A35E890955F8A1DC51FDCB53EABCA2540997DD054C1F5B29462995B876B44D085904E55E1B838BEF600A992EB49CE078DF75AF3D0F137685AC0D07F0BE1EB87B63A41E74DDE869C8A683BDE60AF5D77FF18F7137495BCEFD0ED28F62F9C3E25D332B5F861D999FCDC0B4851A984A4DBB53401FD40351ADA4335C702BCC8D900C737507B990BDDBE91D201E3A0946DC968D43FD10D04B0B76667FF5B4291C2124B0124C6B710A6D1BCFAEB016B9DEEB0F7A4FE044CA4EA0CCD84B7682617C3A545071EC295B0663B3F577D562DE1D9DD80DE6A1EFD6D5991EB5246F1597B86D0E9A90CF6DB0EB2B8E7BAE9431E567F01AA98502C773742246467ABF911A91A51F6C1B9E0C3233DC1A37D17DB91A5F0F661B0EB5886964456C7818601BD0C"};
const std::string GALILEO_E1_C_SECONDARY_CODE = "0011100000001010110110010";
constexpr char GALILEO_E1_C_SECONDARY_CODE[] = "0011100000001010110110010";
#endif // GNSS_SDR_GALILEO_E1_H

View File

@ -22,8 +22,8 @@
#include "MATH_CONSTANTS.h"
#include "gnss_frequencies.h"
#include <cstddef> // for size_t
#include <cstdint>
#include <string>
#include <utility> // std::pair
#include <vector>
@ -52,7 +52,7 @@ constexpr uint32_t GALILEO_E5A_OPT_ACQ_FS_SPS = 10000000; //!< Sampling frequen
// F/NAV message structure
constexpr int32_t GALILEO_FNAV_PREAMBLE_LENGTH_BITS = 12;
const std::string GALILEO_FNAV_PREAMBLE = {"101101110000"};
constexpr char GALILEO_FNAV_PREAMBLE[] = "101101110000";
constexpr int32_t GALILEO_FNAV_CODES_PER_SYMBOL = 20; // (chip rate/ code length)/telemetry bps
constexpr int32_t GALILEO_FNAV_CODES_PER_PREAMBLE = 240; // bits preamble * codes/symbol
constexpr int32_t GALILEO_FNAV_SYMBOLS_PER_PAGE = 500; // Total symbols per page including preamble. See Galileo ICD 4.2.2
@ -215,7 +215,8 @@ const std::vector<std::pair<int32_t, int32_t>> FNAV_AF1_3_6_BIT({{197, 13}});
const std::vector<std::pair<int32_t, int32_t>> FNAV_E5AHS_3_6_BIT({{210, 2}});
// Galileo E5a-I primary codes
const std::string GALILEO_E5A_I_PRIMARY_CODE[GALILEO_E5A_NUMBER_OF_CODES] = {
constexpr size_t GALILEO_E5A_I_PRIMARY_CODE_STR_LENGTH = 2558;
constexpr char GALILEO_E5A_I_PRIMARY_CODE[GALILEO_E5A_NUMBER_OF_CODES][2559] = {
"3CEA9DA7B07B13A6CC0AE53DAD1EE2A0FCC70009338C08AC0EE457F76A1690815C3C940AB722487CC8F3D1F4C428828E7FD2A21230E42A3BBDF1E792165F644D0E0335F95EBDC93D6005CC0C680DB7B0E1B8C4946B7974319F9816141DB9E01011E4F20DA8F1B8E15A6F618CF599C3F5C1A1B276D51318ED4119BCE0ACD0332F3DD8F88EC5215AB311C51FF4987DA93B09A43BA84CF08032F6CB28F43043C54586811D870AD6FA27AA63785345C8BCDD3DA26A0134738BC7E08461D5409FF0B791D8574CE797FC5EF7821055028CB4AF92AE1088F8806CD55F0E5FDFCD8D74ED801B2B44AD5D79D1924D41DDC6AB2070B5360CB64CCF487FE517420348CC39BF50BDF78BE7DA91542FEAB689457B3EE69E43C75FADC303F31032FD96B7DC70A88C3B7BAC7322B285D9CFB3A93AC8B890165F23848FAD8477DBDD3D0AA4CB3CD73A48000B6D134DA2DA70B56E590A101AEE78864DA0C64A7BCC6B37CD6F31E9AFF10CA4D47630752D253944632DF6EC60AECDCD223F29399CDA3B74D1DFA5471277EE6C814464A8C55D3C0B83B36B6AC9FA90CE876ACDF65E3EA3FD61D309EB71ED29A3D510B2F4C0B6D6C5B57EC9060CFBE48389DCB17CBB2284E7F578565B91503B06F49CF3E8534870AEB6AD9707265A9A1E6E2E5E6DF6DAA367239A96EF5B02C19A4543D537EB4D9D73966C09E9B52B4706F57B3E0987885EB84DEA26F7823D895F62015188ED38C04CC6714F797FDB0BC713E3D0208462F9A68E3872A167BF1BF9791AEE8BB73CF527C50975B55C4E5C2F2E95B677F833ECC878D1764839608CC1108A75EE9E58FFCFE4CB52884E7AF15EE0632E0729DA1CF5B7A227028CFE1E08F8B881E1A743D52DD27BED33DE0EE75DC031B4864CF192DFEAF64F726D73321363A233F81C57232432D2B0A5A4C44F4320847A9C143F378F204185D2B571482FE45D6BCA152E6EA7223BFC6DCE06CEF90CE9114623EAB9B1EC789B2051B4AB711DABF5B16FCD970F437B8860313B4F1F14D384EE3976B7E55D2FDCB7E1BD9BE18B722E37C853ADC7E1CC2870A02881F95B78487780E1D1C296415109CF07AB63D0782A9F451CBEB3E8B919917AEDBCA8A8E563AD3784639793E0F25CC9CC62240FA04B2F141E71BF5C84EAC56431159556B8BCE077A51469A87737D3D6F06D97DD479FCC35129F4499C19EF98BDCEA9D4941B3756CDE1997C3AFCAE62B6D9E23341E11CD05A7FFF52F5814011A84D737E1264109006BEF5F19E3C6A9C7521B44741A8282755A8F0DC2FA0E1F6CA4FB34D8CD5FAA27E18808868725B9634376137C1BBC46934F83958112D03082DDD6148F353BD1DD24B9F8FD7AD89C40DA0A92A8DBE3608038CD56FFC4ACA35241D76FAC4CAE1211AAD9D73D51C81C59BCE05F71C345730D3A2C670F8F533A950EF24B00EFE6A3F1354694ABCC6FD9EC4E74DDE1F287AD4F847A297ECCCC39AF029EFCDDDB19932D906B9CEDFCBE0D422CEE305DD05E407340F28EEEA866664D60AF293A45D5D6D5C0000B05F79463DB513ED488DE7BD4EC9EACFEF973B23CE4E9539EFCB797456CF5FD1EC54FDCEE80B39063C48B91A5C2D2BEBC81B9B46D0AD6503BE5AACED2BA5EBE81F630B4E07510356E8229F7FC5EA532B8729CDB819E066A15379AC6942CD4BC5E97C6791E098105C323A3A3DA3880D5EE5562ABBA2BDC9906F4486B51ACF8AA4405E9D7A63DB9E3058782DD9AF3995FFB3D34AEF98234A0B3DC62C339325B60706C068F0198BD8FA658396D06931B069155217690C7F88FD230CDB38E3E48530BD47722FC",
"9D8CF144C4B667345D44F765622A956CAC4E097AB1CAB05CFBCC6BB68C709503AD9DB09C09C983D46A04A05B6F7EB26DB4D46F868C10E112828B1AEDB3C0074BE0DE3C9B7821BABB4F8B8E24F69869CCD981B09A783BF6A95F39ECFAF25DED6B16F89EA09D3A8413CCEBB545651B363DD385D12BB72420440C40E804FA27DE029A1E08629BAAB598C035DC58FDD309844F3BEBDE40FCC231F38605DED06572ADD85DC51D3D8B89B4480143D0B75283522354330E5CCF4DE1A6E68047D5B8D45D835A891F2D40C9DB8A76CEB1D18FE2BC38D080A8D97064CC87D692DF21184ABFDDA7642D0BD6F3209D06B4AE7600F7DDDB71DA751120599117ECCE645FD109CCA2EC7DB98F4177F14DB854FEB314B5D7CDC3385AD203464EADEAFF4AD08DFEF3D21240BFB8EFCAAC1356C72A0F5C61BE03CD2A21A7D756FA9003D562FC4A49A6BE788EC8D80054ACA881DFFF72C2966EECD09F185EDD11218C6696DB14E05FFF3644D11E508F4F1E9C5AB3074FB1C3FB21092A1C8D5AE05688FA4A9226C3C30D0BC3981933DC8648240F8CB67085F53AC5295428DC8447A1E5A46C2BA86796982C4C6CC647FD8079BC4024BB69E2B226E6F3D0F8A90B4D36DA2AED4C6BB60D318AA7479FDC2031143C67CB4381C27072E12935001524C7BECEDAA9954BCC2AA218E9EC2C95498FD8DF655C015896D9ED42CE7F91CBBA2CC4A7920038EBB5F5CE638F969F8B179E72AE252BE7E826E5CB53C2E85AAF1E1F1AD8D534F78A681928818AC3154651FFC583DEB0A6A1F40B98771ACC528AAF80D210ADAF83597869968D499ADE9A19BAF341E8CBA20F0E1473BDD898C24C7A5466F9924EC7EE992A2086AF295BEE1F6D0F8843D91180BF2C981C11FD978B23B6BAF7786BD526B458B76A87C31D7C52DFA43F3D362C8EEFFFB3FE5FB3F6E5F34B1FEC7EF1031146F3F609B32677F148F7DEBCF3526BB45582436A3092408193D6312626E46ECFA96FEAD12A234CACE10FAF9DE75EE2D238088146328E10E9ECDBB0B018ECDF2725415CF5A06AAB857403BBF6CBFC350903A982864827988BC805A3484A31FECF7A40D4FE251BC7E487613B9D3A48D3C7DAEFDC49C4B7E625F868DB53A798515A61050978552699EF2A5BF2F13BDD444EADC9B60B479FDD4633EB4C1062AA78BEF06692DED203819D3160310FD7F2343732156A9CBCB0B50BA9A8F93E339B702670E54BFA6DB2E2E773202C690FB71EB03671AB0B1B02B2F189BD99061ADD23F75F4914067AE638C9A29DD3661C28AE272CE692CBDE6AE880FBCF272E548342372CBAF6370C7E3AE9648341CE7310BE1C534B5702B0611AF65868F840B6B7613FDAEA21DEFB4F2024487023B02B8B58C9E9F27AA787EE775249EFC40913CBBD69C38538F239B203815F00F7B9CB30DC79E6A0C3E069D109E4A1BAEEE36D354C3D0121F1342F1F4AC504A68D69DEC158D54B04BE8164B48F31BC0827A0379C5237070B6F963741AD9ED4F3865698FB8233D7F49ED4E0EEF3AD927CBAF4FAE183252BC56AE4CDE3E329B1D9C87C6C11429B15B8EE589213CFAC208A12AA01B4F1F7CC35CD0AEAE217471B3DAC1C279F353DC61994FC45FEDBBE0005D8EC729385645864EF98A3A417E62F1EACA7E60D4E773BB2E4024D62830F103A7988733DD7BBCF3AB0CD0049006FE2F7EB3821724BEC37EAE44681A9699A025D212724CD98CA3415FE2BD09FADC02F1501FA38A6083427B662DDCBD0460E12A09072698EC8966C47B8A640AC79C1B7722E78A6C28680F4BB77BBA477BE0A6FAB959B9753217C5708",
"45D1C8FF162EE106CC87C3EBF6A837930F8CC797EC7A446E8A213ABD239582350636B19B5BE428A9C13F980B7AF5CD7F32630AFE8693CDF0EC0BC2C84F2472F5B86576E8C43136C14717A24705953D392BAC96C1055B782C7941D82FEA357E5FDEFF772FB9F3DF248455CADEAC4CBA2EBA9C91184006D1680E000D59E4BC8FBE2C2F7CC2E78BFA5B60EB292F244E6CF497D5A287432F2520B31B9D9FEC1210923299EDFF043CE077195509E92372F5959AAB4666AE486DEFA400D81463C388CD05C677BFD4953D2627105B0A776960FEE916C75D53981D30DC689581B7E8E0723D65949662ECFAA6FCC9F0CE8892E367721718F906207663F9AD450AE98D75DF004080FC15DC2CD7A1DCE013A0E547ADDC29A397ECB9E7FA02035327AC40240E2091098708D424563AB7C5867F3F2D78EE3EF5B658FDDBD49435060CA2EA3D559CDE957B7E48B98DB41CF875F7B3D9EBDF6547B4EDD98DF4B747B0793152FA8CC07C6D9EE5A2002464566D86466C2EDE54A2BF4BBE823049E57364C127A14BFE1B88ECF70EFB81EB831BBF50F6AE124E5F6A775F3F2620E91D489CCF24811C0890EF905E9E2ACD399E13DC81333A54BDD295B872EB74E412E2FB654A9874854FBC3A68C73434C5FC5CED27534B2B13C316205FF4E432FAFC13A7B5B7A7FFA9FEEDB5AE69036F8F2955DA124CE5856E8C53F24E609F7D3386DC5212B2E78B5AA23B59D45FE98AA08E9CFAA9D52ED260A36AF07522C047ED43808A39D7019E444EDF84D885A9AC84092A0F6BFED562F3E0D79FB5CF62F98E67EF219FA3F5AEB7D4E344642D3D4B1A7EEA18464F6CE8D4CB3181D9EBF6F4122751B54D0D7F3FC470A91B547148AAB1CA0DF59872120190640555A7561B0F2C11280768F74B1A56674FD5480B0F510491431810D99CECBC6DB85888BACBE2B020FB8B3D78039773229714156494EAEC3A2D0A59E718F72205747D69C05DDF1C678E2E154A1F84EF0CA2E24DC4A6A996F0850A396D2432596EAE84AEC0935B8C25D5C65B52A32722F01D281C4F753EE03EB10020E9FA02462CA303DA39560669637532D381EB78AE5EC0F6DBF6273EC979442E6243F65FC51F26C6C9554C6C0E3EFF33BC4EAB6A27CAB9383BE7DDDE4218C4998033B47919503E1C9A789711EBEAAD6C0298B3DC563F54D28675260F6D896F1B8D4FD0001C429210398E9544B3DAA12C31F7EE82EF4D2234E26F873610B76756DDACD24B6132BCFFE735FE75513ED527DD04D7DC6D24059F85706679DCD1474A9DB9571426BE17E6DEBA58B33B708567697F471CA8B78E8FA73B0E18CB6F88BF9E4F442F0FC21FAB89305484828F18B65F9D373A6A2B380D73F5924F80DA234C1DD87416D025E4E663C96F287B0C83DC92C2164D81830781B715209FD11A65E64962D805389BAAA91DFBB990D3511E506A8EC101131C5B7284252F861D047DB2C2027DBAAD487ABFE429CA21CBEA7671350618E441F4D62F2D579CAE29D97023A8873869B553293D9F54D4A929E252AF132325A6E3BCBF7B36D0DAFA1E56A39A5D801FD0D5A41111017BF62AAF8346C7D424FE007C32B437ADE60AAA9540AA5078FE6C3C3CCEA53EE863086646C976FE6C79434A0AA4F53B2E9E2C3B4CF9C9C4015391E27CDFF5C1FCCCC00BBF5B99715A1265F591E294D530DB14DFD485AD34BBCEA32E5B5D0EED15F88BF5D96D058E6D70BB1A232597E35A625E5E8C2EF5E7031A71F70309019A0591BA0A50E87C839498255A3602C0FAE53166BE5E49E29D24AEC47002B698F80FC49E718B66A8959259ACC540",
@ -269,7 +270,8 @@ const std::string GALILEO_E5A_I_PRIMARY_CODE[GALILEO_E5A_NUMBER_OF_CODES] = {
};
// Galileo E5a-Q primary codes
const std::string GALILEO_E5A_Q_PRIMARY_CODE[GALILEO_E5A_NUMBER_OF_CODES] = {
constexpr size_t GALILEO_E5A_Q_PRIMARY_CODE_STR_LENGTH = 2558;
constexpr char GALILEO_E5A_Q_PRIMARY_CODE[GALILEO_E5A_NUMBER_OF_CODES][2559] = {
"515537AD5E5F4216C16046FB0AC50DCDBE5CEE7E3CBB51B6ABB4E87A407B90E0EFD49DE1DE5ED29184E7FF0DC31F75FBB94F46FF6586B36C7771E5A68D060A965ACCF8D640C6B6E4530FDF19DD2491BCAB69ACBCFD3EC7281CCC31253A471B652E21C4CB0B43613EC542266460F0A6199B436BEFD95572DEBEE920A915FD854D17FFD0DF8C74E23B21B28493A0927709709B07C65878C43B69DC501E9D0AA21061ECF173876CAE708C764435832D9D6FCFE62DDF2543016D6325A56D9BF1007886E62E8A832BC32063CB0717D723C5E8C5F0C0EB3960577D364C93060B64EE04A539B7601CC3113E0AEC53CF21AFAD0154DC5CCECF038474E0F4004A65B1EE2801F81968B88C3D35E87CBB126C02D770CC3D32A552883D351DEF47847391484F80646728221F993921BFC14126EE3D9527DE607152724C6D2DD305D3FEA0AAAEDF6509A2FE3248494A54FDA8E3CE7E6BBCE234E4686BA5A19724BA2CB78CFE71A6AF45532EFB286C5BB47BC3C1EEF4E4A8C757786AE974F30A86CD60EBCBFDF5502AA8F643819CBA4301E731ADBA1345B61C0B444FE7B817EA86F8DD749C451AE7D24A68D914F26C918238953E8AE61CC8553213DD6856C7863F9F6BAB1B4C84B225911E7B92BFFC12AC211B2B2CD905877FE976E07057963D47C437FE47D89648053F81AC39E8FD2F3A726866F6693E503CB6F0C3F0AA9B3EE2EA3BCDB16D726E1C6D8B073AA15F64EB68D53B1F8CDAC19C7AC33361226E81F1C793BF188755A3FE1BAC38B91ABBD4F077F7A28983EAFADC346CB941D49492625893453B364D07FE06FE42B160C16FE0462AB6366FFDEE54DC9CE4DCCA21E4E4AE5E92C872D1E4EC6FF6D3063C98A5AA5EE72481A0BDF15152E2A5425AB722101474D0E1EC8401273EA1BE1DAF7403190A94305BD1C7DFBE1F35F65D5CB97E82B7A297047507FFA0012FB73360FB8719C174E78A989A96E60A9184B3F3A8188DE100AB361921D38E8142859C8F0F7D441DB1B2E9687BBD1086643987C83DEE0BE8CED4C83BCC82B62B45311CE4F13ABC55BF5EB1ECDF15F5A07F8B2C42F07FACE0E299E87727E2D534FEBF7B9C3894CC3E2E4127A294B9FA2A671273B174DBB81D247CD2846116500A072DC3962C65FFECD0C0B46DC2AF52882058259C26FDE50BEB319AEECFA1FABA34C069680B9EBAA9D96EEBD7EA30E748213E1283396A2AFC63527624641D4E1F1022A973B1898BD4CEF4D712B49371A51D60E08F42ED1EA90AC49EEFBCC53E7F9E899DD1AA4056F11462DF1A4C81620A73C831CEB897430A22252B901EC3D6F3DF58EF26422F796EA31AA4E0E9CE5B4A9C312A22305E298FEB3B3628283D405EDF726937327D90C542434BA3B60684584A9DB244839D2ACBCD7EF147A541E35687B5B8F5F07764973112D20D1ED75DC31F6A938542B42EFAAEE0F11B0583AA4925C3132356200E8D6BDB3127B975F4115A7A8A1C471836E3C5450B501A24D4A1308BB319AA827222B550F253F64B6F7D2322C6A2D3012FEC265A66A60102A3340CBDAB900DFDB36693D41DAD8DDB8875F8C3BE76AD5355DD81D67AAEBFFFE9458E522BE0312E60F63DD92F25C0D7CF82F223AEC0BD7456752CBD5151FEB5368F8857EAFAA90E8C7499B75D46EC4CA20BA8A24C90C016B5BD2CD7864828C6140E98EDB9509AD1194F56D49675D077DE92CD481B469E3A37F7DF0D5392DA4CE4CB282530F1C73482CC0926B877B00B0CE49FAD21E4C26194C7E950E0078F3854EF88755E08E9380165C584A3DBF1ECEF6A31B224FC321326B93797BFE8",
"D67539AFB80711A0BA3CD67D963BAD346BA813D35A2EEA104D36AAAB863C656A07AD61BA60598C07744D32ED01EFCE928346C09EAAC2D392E5655F0FEBC486815AE30A38014DD8520F73CCBB71D9D42636328A50998A2A3BED3E4B34D0DCD65B94807064E2EF0C420898DB96E3B99EA9A0AD91C63857DEAEDDA5E644E62212B23D72FEDBBAA78C6581C677B10689C4AF387626DAC55F4EBE1893D52D28D20EA365702448A64A0C553ED337C3BB911DDAE2A91727299D8064BEC880183064574B5E3631E70A0590210143F4079C572BD5E2F7634C2D53B1FB1DABE79C484799E7075EFF98F033F5B2EC66C373825335D883911CEC9CFBBE2E38129B7E03D9646A7E513D5069043BC62AF4C524F12D8F98D8C9DAC5D8642DFFF48CF6737AFBBCBE965925F55F03BBD5123C9DB47AAC780301DE91FBED3C01D03E6464C2C2915BFA187A4BD93E20C24574FB91F0358CBE0921DCC8D6B7E9976763A1D2158511861EFF5D1C0B71F608E7ADE91D9DCFF5640B55BC9BD1BB322C879C7EB5C06EB2601D06241D09CFB1BC1695DFA55FA044E0E2E4BC86EFBF6A55740C4640512DDD6CA069940BC0FE1738FD376C68BA8AF7CCBA7D89F7966B29355538836372EF418D149EBF3AC104919D91BCA2F13E79A7CF7684A4DC0AC556A2843E041A71F97C94B859FE009659F593EFFEBAA6F6C1C57A5BF22752613AFB26379C42AC25804AEDAE22D63B230FCB858F496B8EA6F37104D0890525DBDE06AD988BA0287B0938572F14A98EC9E60E973FD693DB1F2AFF671AB03FB12B729D0867938DF6B60EC69790C992C6C33A531FE56D0ECC1465F65E3E57FC9E45F0F65A1061CE6D3190B6C1B8708A8A5A47222369AE889D26499CDE8F0548B8D7071F2D4DF6C0F2418BE449552327981CB0B54F792F29A71E30DE257CE1B3A7553A22275E4C8B9FAC3B8D4E9912BB22B0A899E7337513C7ACBEDA15FAD3D6919FDDD941CA659D78B74FD39E2E2F622691B89CA82FFE602DB2578A20D4665184456F32DF4DD6CBC412EC7C6914CA427CEE02F6D9810AAE1406DD68ED3869BD8E3947A2B3A803E875FF82005D853E3F43A6BF936030744C34C8B71B7722BE0AD3F475E531C9249A42671D5F3A5C77C4C28DE29AE953EBFB572578B17B636F8365FC755C22871E7D53A1F1561C92909305C9FD36AAF79E8844B63370B800B25CC1355211D9919B830A988926829F808DD2C66400279E6AC14F8EECBBE8B6E9ABFA3BDBB38A49535F64F719EF48C5FE6B2738DC6F71AACD70274FD40A29BFCAA594AC3E7D0C3C522E406BA6392444C9F362339E8FF34BE330911DC7EB11A47FF3A62A46CDE961A40CD5B24020909E5B034F45FE96CB156FFE8E2FDBC12A7C12D60D24BFBE596544E4F03AF26F086A5A667496B7DF302E4DCFC568C7ABD665EA7EAD8A7F5A000DAD9F43E68C4D8A14742E050769B3CB270E3856D7E8F4E827046D3E55A52F0E02C883881914DE87AE3C24D93E61A94919B40398D3EABB1B5142431AB919208A9785962D05061EDC951C83C73FBF6AE8DD6FF839E631C9FCF6635FA053DBCF932E359F83FBB3EE310281569741E3A8975FAAD1E573E0EC3207F6DBCDB8CC90DCA1CE517C8DFC1D31AE4841F87A5157792738DAEE7C29240DAE26C6C3E9D8A899D2271B0C374BD2EE846C6625E31B2F8379A96F601323039D281608A01A1844E5D1D20CF1D92C52107CDA71BB3B7EC4DEA958CFD7A79F71868116CD1DD2B2E66BB94D1373B733F324BE489DA51BE72B01A8572880AE1E61650B839D03B0192D290D5B36A9CF93B304",
"58B2E58A13D4D5F84F37A389E6B01DFA66DBC6A25338B2884EF08056BF0A9124DA29254AA79CDF1B0944DDED4BC7FE683EF7A3C7A1C359E61E959471E30F9D534F43EEF274AC6535C616ADC7455BFBFF43ABF268F7C995CE020CEC73BDBD04007562F2710498AD1A324F25A6233B2DF2D9A429F1C39943E45F934986D1979D293F90CFBEBE01665C98C0D72D09A382348136980B31F5D4696B85C3F42D5C445996804159CD4C4CE7547C4A3FB718AB62D9E9826D05C44C6BD21D708CABB01F46514F29FBE7352866EDBFABD0ADBB6093E1A519D0E11E27737239A07866752B6D864686AF1E308481C53C635046C0756E8008D3CD26DB970C5D6EF8CB9DE6BC4339EE9F88EA45D11B74A1525E2F1B9F91567A78E403F7ECD47A99E95C098870B928E1B0DAA984CCECA13C6857F350E808BBF66AB4EDFB0F369F6F009268D19DEEB377F7D0C4ED6414EF6D23A0A5F37A25AAD3CD62C2115CB70409049CF0CE6D4DBCC5C96767614C6FAF73E9A76C7550BB970AB3D3ACE0C07FAA9F36F1935DFCD5228427BBEB5FC7A2F951D9210A5BC32ACCA7E78AFD5FD460CE2A79348714E5542BF2D453680B070E85F3244E8A6B4EB6ED49F803E60B8A383C8BE6283B1C4DF79E0C4A23D5DAFCB26DFC5DF1D1520FB6CDA23A05A1513F751EBD0143C2B9F5494BAA74F9F95F189C5767C6F5623559D9F20CC9B9C9ADFE285FA4E1BBDA481A52ABAB36A5393370091A49A59B968CFAE89BEAF33BCA5C2A9BCC1758CEEFC2D0A175C8A5CAD5C7E3FA706C2FEA55F4971A7B8A0C5D1F22A26D7DA9A70603AC34566E4929AE78C8F1926239950EC0A6E1B37D919E24431E53FB08B2F7DCDCA2EF4177BD7D2F81BFC784FBEA0471831CDCBB9E11D60C53D0E062E8BB8D98B8EE5A40960EBE10FA642751B96E1407B38A024DC64D5C2005E71198EF394673A4A0097187D2475CF27B3EAA7955AD9F412A89B36AFB27FDF7FE699B2CC8C03F7FA40549178DF8A3C1A39441EAE869BBC89D583ECB18E310885F33B95B719045CA6955720CA75D5CF0B29E5F1B9E9EAC5EC92980B2D37EF6509CCA6E67544A8116494AC7EB9032E1E8CDB053B5AC0F60DE59BBFB78E3491D50C7ADED95042A8885FE284E90C04FFC0370B92B68379B2E7D52392A42FEB26B2419CC64412BFFC036C01109B9EAEC5FAF485F0D61C37A703EAD02127611F9D25E4EC515CABE21247156F0779CAB57C35581646BB71E87941AB5D06FB3C06C423E9E83E0C07E611C89CB000344AF49498EF5C30305DDC8958F45A45E1218837269DEEDBB0AE51D2AD8B41BE425EB7AB798856911B6F0DC721756A8154B9D1CCD61092D16A3E9E1CD5E1D7C2C45D236C9B21A0ED64AD4C0660FE42FC0B543A34FB545B0D88D42F696D53BF54A1A259486846E81B44C16EF146310AEFB3933BA9F9D4497E74AFE1449D69105B9F295DB24B4563C3FC0166CB70F104B3360BC0998EFEBABC6276F570F7679865036DB59B51AD2F91C0CCD3BCF5C07492765D480494AB5B87E83FD04B75A35F88656D3329AA5FD550DBF493B0CD2C19DEBE4358661C72A71FB17C812F75BEB61302AAAA1F757288C1D8626461F4162A2EC6296B3CCABE21B4F0695F2D2CB02B86035251FC9C5F2FB5BBF28237417DC56471629B3B4C25AFEDC4C9CD108ADAD9DB1330AB680E4998C5B3D99BCE8F08156B630A63EF36A51C813CE22A6B178683EDA389ACF58653582BC2AE8170ADEC4BE03C04CBA603C0E4572A74BD9599A8442E894EB504F7703F2353A8A3525EC5535E750303AC07E08D952755F97AF236014",
@ -323,10 +325,11 @@ const std::string GALILEO_E5A_Q_PRIMARY_CODE[GALILEO_E5A_NUMBER_OF_CODES] = {
};
// Galileo E5a-I secondary code
const std::string GALILEO_E5A_I_SECONDARY_CODE = "10000100001011101001";
constexpr char GALILEO_E5A_I_SECONDARY_CODE[] = "10000100001011101001";
// Galileo E5a-Q secondary codes
const std::string GALILEO_E5A_Q_SECONDARY_CODE[GALILEO_E5A_NUMBER_OF_CODES] = {
constexpr size_t GALILEO_E5A_Q_SECONDARY_CODE_STR_LENGTH = 100;
constexpr char GALILEO_E5A_Q_SECONDARY_CODE[GALILEO_E5A_NUMBER_OF_CODES][101] = {
"1000001111110110111101101001110110001111011011100001010101000001000111111011100011001001101100011100",
"0110011001010101100010111101001111001110000011000111011110010010111010000011001101010000010100100101",
"0101100110100000001001011010100111000001101011110000011001010001101101110111100110101000001110000001",

View File

@ -23,8 +23,8 @@
#include "MATH_CONSTANTS.h"
#include "gnss_frequencies.h"
#include <cstddef>
#include <cstdint>
#include <string>
#include <utility>
#include <vector>
@ -58,7 +58,7 @@ constexpr uint32_t GALILEO_E5B_OPT_ACQ_FS_SPS = 10000000; //!< Sampling frequen
// Galileo I/NAV message structure
const std::string GALILEO_INAV_PREAMBLE = {"0101100000"};
constexpr char GALILEO_INAV_PREAMBLE[] = "0101100000";
constexpr int32_t GALILEO_INAV_PREAMBLE_LENGTH_BITS = 10;
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))
constexpr int32_t GALILEO_INAV_PREAMBLE_PERIOD_SYMBOLS = 250;
@ -287,7 +287,8 @@ const std::vector<std::pair<int32_t, int32_t>> WN_0_G_10_BIT({{123, 6}});
// Galileo E5b-I primary codes
const std::string GALILEO_E5B_I_PRIMARY_CODE[GALILEO_E5B_NUMBER_OF_CODES] = {
constexpr size_t GALILEO_E5B_I_PRIMARY_CODE_STR_LENGTH = 2558;
constexpr char GALILEO_E5B_I_PRIMARY_CODE[GALILEO_E5B_NUMBER_OF_CODES][2559] = {
"C5BEA11BADD79BC7A91DC8DBED9A215B8FFFE4978A981C98CDEECE756A364B33FF851B7B3AFDEA0564CF9DA207C784E13542404E3BDE45C1DD70B4D6B51C88E3ED42A1C524E0BA5441A9C8766013E712313070BDFAD3699A226B719410EF18EDC843818877FEF748A0D7C6AA36616330A087CB91058D7F1A245311AC571864DF734F99E3E643AB7627B4CB57DACD23E4D22C5F2E3D2FBD4F04DF616E8110A001565B030C993141FE038670F574DCC4DF46C8DC18C84B4491069D1CAB4BB923AE6CD41BB9528ED40F7D139CD425416EB2D6342AB8808009A40C042F153DF23C8B14F3F7235FAEBC9AFE0C845AD41F40E2FF7A7FB82971E014C9269C60AFE05F694AEFE32B3194956253AC39AD42E0B7575F96CF2A094011C91A2FD3A10C02CB42D3425A3D6D85B404CDE1171ADCB1B5EE752F5783DFA14A7E26507C231FA5541FD06330ED44E37DDA40008A91BA74EFACBBB617C7EDFA3DDE592EA284381EF17477038A8B7ABF3C5BD673D658D11A22B97DA9F247FECF2143D69468CF8A112A69FD3E9488F14AB1506DB1240F26C52D2F19AE7A81A39E9B9304F65CB7FB3D9B4404679701216BDEF9F9E576EB36F7C9D77847A8FC40A7D7C4C65C8D78BD82FC7E5F90C6BE1CF19A2B7576DB1547A26C24E5F9BE97D2AED0A71BDEF74B26F92B0CAAA683DD3412BC52C7BD443F32EB3E39B2C9B1CD6B274C825AC7618CADE08D9991E5150281E2D9076EA58B2A99C54236A1E93F4D467692766080113C58FC53093C739FA8B0CB85DD0B6683CCDFC0907EE124E79C33C3EAC7CDF8E9F679B87B4FA71688BADC1DEE44FCE4952CAFEB0D3D6432F0775E3B6F34D18A24233A39C0B59A1F458B9F28B958539193A054DA2AC02B60D1146A1C6D5B86DE1BC424C2C7C703CAF92997E09A345AC0243EEB72468B161E5CE268DFE2A76B10F84DECB01F5F20419D9C326E7AB0BA22BD4225CDD990DE4A0C7E8C60E24A385DEC7F342E8E5BDA079ECA357DEE07A2E1690CBB8C28247B6E13AB795D6DE97FA074596DEE8B5846E8D90439B61BD71C228D10C7BC45886288F33654F787B4D336950EE6CB2989EF35D14200B9082C085C6EFCAD497A12A053543DEE352E4AAEC83858967441F7023B90E263E8476D53E23FCA480599FF7FA69C006271E1353CC546E04FDA1D6E2EE8DDA422F25216522B9657FD3D02CBA1024798C00CC2396154E2DEEEEF4EE6E25C8C980C2B78991C545C09AAD403A0D3D16FFB8C485C15D93A160AB2DF8296B811A25030688196C7208D66269EAC5C17CC4F00BB35CF85BC73DEDFE1CE6C6547D6C7873135A351E4C4335C257694D766CFE21440BE04432BE32583A166569FA7C5ECA0DF8D478ECD43F44D914A707902234E9A9E5C68FC472C8DE48C5E96071A1999108D6F9800F8D1141EE18F376C9A422A73C21535D055080845586C931FE8600366FBE3C80522D32EAC06E9005B545F59373C64AA152226F66E100B183690347C53698ADC5B8FEDA8AAB5D36823A13F775B295EA8FD2EB09C23B80A3E96AC1580124E027004CB0A488FB2DDCD739E8BAF4B47B7539D2D7E3E79FB67255F5CEDBA801026A6DF3389A205DCDE967AE8F0BC766A53465E46AB20A67B379B11546D66E385B963CEC31C4B832C62F417122CE3D158DCB5D042A7290371BA414E9B59FE6379BDEE02FE476C9194F27E67B6953CDF9FE738A7B8256B2F8789D5679A5A172C46971176955E98BE1FAEABEF94D2B7E08ACDD9D9FA341A47D211123C6DFB12330142B8171DDF404225E20A90DC94DC00B1627B704BFBF6264A74C4",
"4F62483A58B2AA45A7F0B344DFA1C95568646AE79869337332CF0FB02D7A9A91633F160EC7D50EB74D2FBD3050B16E2E264EFC804070A7845AB5903A986183DF0F7146DE5BC92384144646BDB3D46E3A6E436FFB19E16C324B001C4CA6D4B223874D15032F743481B2E4D8B0D77B23BBEDCD2ADC458C23180C1632887694F12949B95584ADF4040F21E2F47F1F1F5E4E7FC3AD6521F1D8CAD7FEC9EB2BC1CF3C04AB70E54E55A31F654634A1D29005CDF05797D3E7FD5B2B94398BCEF55A6D2B0BA49C79066A5866FABFF8D59582FA407E795189B3AFC33B798F672FD41E6806D877ED31A4614627F6D46011FC6153A9F3143018BCEE9A0F98FF48194AE7C51539C175B66C5AFE7C9BCCF8D6B4926122EFEE9AEE07CECAAAF783BD40AD8376A95A0345A3EF7DC8F88237E25BFD6F509AFF85DE7C7101CF51766E6B4419424A10F15BF4343BEB845E5F6279FF544577F26DAAE7522580AC9EC833D3021AF903BAEA8CC53B5F0A630639789CDA3CA6FC72F96EF17EE975366610DBE3DA5063955CA0DB7FD3318E14AFAA514CBDC864F40261D54EC284F5106A1F385409CF82CDB91D535B470A883B0D82167435E2533D123A7B71FFC8914A370923B1214F5341C2D65BC868570185F2472E93E77FAE64BBB112A2E7B63F2117214B9BD0B2D9029AEAEA8F6E6A70F18D178B0B4D26AF7F5FDC8CF149B6744EF28F77B7D87DCC92D0E2CEF3977D383E8920F71D89846CA5DE3F4FD76D51A0B5B69A6589774EC227CEC64B16217EB55B37EFF5CA78B5DFBAAD361DE5E606627EBA04F5FADBA5224A6C38F63289E9874A56180B5C57DC188A62E1BC314488F06E728399066FB9EBDEBFCB2F20466CB0C6EE1B2B8B158B769C40409838D95EC5EB52E169DDFDCF0946700852FA1F10436E2C093E257DC969C5D3195CC4DA6E376CB1A915A92519EE1EB2034E3C55AF3C24C247D74832D46D532F9797268C3B0DAABD705945F4EC551419E94E84A13E75AC428B2559C2076333DED3A6E9CB604751E2FDF379B9A1BD6099274E90B523A19010478B0958A5C53A2E9A18CEC53589AFCFB075387425FB3A24C2F66B40E55DC3F52FC4048AC77730953DE72BE2E662AB41EEAAC4A661A6E43C65AD368FC2AEBB7F658C2D8A46C98234071009ABB81C7E33A75B86D89BB3484391D210582A9407637D82A9DEA9E2BECD0B4CF9CFDFA6E0B7D377E2EF3E91212D212B2F9515E6B541046EE2E5744887EDC1A0B149F848E7D4EF9CD5AAE0010132C6C5A8A5E1082CDDD46EF100C82AB553EBE5490184971B1F08D110156E0BCD083B81F94D47F19C0F41C815333C34384F16E9B34D659E6A65CB9B274725F9C535420AA73CF0B1497C96EF000D5227834F7C8124B114F9711A0AB19D7A563679092093D5B8DF349AF5AC30E87FC737DFFDACB3E95981837F7C48F97F3E34BF278616C5A14180D81B3BAA65420642B74606D764F6897BCB2A12EA2A07F0DAD3DD1DEC00E265C0D965EA6CFBBD5E3721F4CEACC09B3B04E4E23873AC76E64B17C071CE9A6E336676835E854D1E0E2B2618D918E41808FF0DB2296CE151A2883AA314FBF2E9A300A75C841AFCB3EC84DB34F392DF4DD970F5ECBEF9E81D9DCBA9EF78AF41CDFBD9D77B6EDC92795175D805137996CAB4F91FC8935EFCCDD788AE1F5FC650D4840EF222A78401DDD313EA4B4943A89DCE637F1F81636D06C6E1CC1062162320AA07D01F679F57384820286F29CBE9881FBECC3E1AE4D7FAC3A143046E29D9D4A19B95BA2508C7030C0E846E358D52284A921ECA6F2C7890696F6008",
"FD5488290C9EF7CC7C4E4F2A6900C2F9CB24239B239645B27D990BA8878505E1987F8DF3A71105499EED4410AED6FDF8434EAEF0C2C0FBC1C2508710CE37EBF740B273BDFE45F4B286259021B2182D6185078F0C7A6580B1371F023F07236F1655C9BE30F35F2485C9EEDBF030068C660A9E754C0B6F949CF5556C133AD512C65DD3E4AF6A01AC9F4B111F107FAD356EF7C4E0E8814527E486226D9A6FD2D9D0F1B7B1A0F840F99C83F8483E3DBA2F1B576634BD5ECC49640AEC7338185D72D629A03F12CF53EB3DE8FA86112F5D0E666DE0DC3CC772693897690EA2986B2B9F02C213FD46ABA0A2BA24A2D90CE15BF1E6069347D5A1E78BC55D13E2BE2D173003FF68317BFFC96A9BF858A07A4D2EC5CAD1D4FB21CDE30D67B1DE383096987B93F8C709E303377232EE2692324D8C585E35B3E9978B13B8579B0E759B4CA76B6E69CFDC350C1FD02F7088D0BFBA5633A8EDAB83871C1693BDCEFBE6A8D0E39A78DBB3D190196FBAF70332387921395615438C75D59705810BA4CA4380367AD26B08B85A19D167B0ECB27EB8600D9F6FB96375684ABA1EFE9460DECA0690FEA707B2410781C571ECCF567569E07B78311E5AFD6A3EABBCFB6E68068E365517FDFE9E1A15FDAC6A000C324D82FA7D451334B873888B6DD164C89CFF3253BFC2DEBE4CC3AF78C66EC6DCA4BD529C3DDBC8B932120733133E754F235354144B3EB4E37E30038F9073F211C432431B192E9605A63B39DC6C31AC889E468DF3CAFF2A8D63683235B935784F605502AE8E63794FF8E27C7A11502C99A834B0BBEA2AAD4300405F9C373203DC05D28CBFF5260C001DB0F963792F6D1D1BFE1345A4084A8A0EFEA3183A6C67E4852B90A426A257279EDFC751E4D3963816D5044B16248366BCCB874E9572DC9CF65FEC89F8D8A29F7E2328A0AAE3FE19301C7A440115F881A3808B64B8E3C17EC0F225F1AB1CA4824D54330E504F562B9981511392F4715BA02578130DD776C8023249FE78FDD66D92569D9D5E652EBBD89A5C55C6939BF99A3441E6E3ACC944033FC5560A4512C3EA1F78890064C1663EC86BFCC9626C30CE67487A0928E95FA0957B774DA5F9A6730BCB7022E74D5DF4A6EBBE76D27317B972CEA4C0FE3FE1517E88361C32E253C025B4F16F55D532A75C3F15FD1AD532CFB9BFC20AA18B5D957FF969185B55405AC7BB185CD83E5AB99C31D475B264954130BFC6318C437E5B437109818AFEEC7C2B78DBD7076EDCA94F0EF2E5EEFBBDB65B22BE8DA21CE7B83A018E78A671A7669B1F8EC62B7AC522886AD84377108E5E55FBC79A64E68CFCCCB535538F892F0278CCD295F266FD1C84B33DAA3B340128BCBFA8BE0BE4AEE9E88344E5861E14747AB0F9DA7EBBC32CCF2424CB8CFC50627532607D47DF5E878537307FDB54276B92C3C3B0366623F2777C7196E3B6D8794E5A7A70D3C1CA7C583A4935150B37A8A562BAAA8C5B5B30107B1D887499A4629B1A6621F5D79F9AC3764C42B763D603AB28A9C921827149922D9230581BB8F05079E1EB37215A45498B20667A25E613CAAD346A248F0140175E9A0CCD06BBFC25B8CBDFEA11B126DE738240AA33AA0B248C5D4AD67305E07BC8BE86464726151247DF7D35D08B8DD373FB6A26134846B4DB32DCBF3053E5001A50B625E12A8E480043E053793675DD68D2DCED8AE3FA434DC701CB8B96BC666BAADF5E1E70CD94B3082C36619E689A9CBA9CCDE701664DBED3B069242EA13EFCFFE6084846C0960D03E59C7451E223622864163749D6B7D938FB0524B057AC679D3BA4",
@ -340,7 +341,8 @@ const std::string GALILEO_E5B_I_PRIMARY_CODE[GALILEO_E5B_NUMBER_OF_CODES] = {
"AFC22B34A5791F52DAA66F3DBF2702032EBC688D1DE2824845108266F95BEF050B363999B83BD69EA7EF3E250F4280314E5D832C58F1D85E22EAB4255493F913AF7B08CE0DC2AB3708E4A3F779196B339625C38FA87B8AE0077ACFCC9F5CD95EEFD10BEF5FE9A4EE310716C4E9808501BD584CA7C0EE23976D565A9499210A95A3D2A78D7182F49009892716972323ACF295881DDF44CAC78983A4073D8CAB2D0442C15158CA46D55ED2BA8950F2D85353CFBF6525560B5743F61833101F37FFED90F1AE204811952000E608356105E43EED3CF09499A8593120BFB88FE0ECC4AB465B9F3FD4065A2A1951B872C92092A5ABE984E5B24AA606E711075AE6CE179B951E5B45B54EF72F8787A82DC82585A82D2A0CF368286AF117B399766A8A4DFDEA87072F18FC0A847B8D485FD28AC3C0F58B3DFEDE3E076D56F27DFD19D244C7564688EAB0197A61CEDFCF1598D8818BED9A53F973DD50CA6DF6FF651D3B8242655F0F0C9D22A886DD804C799AF860B3802C270B14A1FFDFAE3F92E09B31C12574DEB4ADC8684CC5B47F87C2D905DB1BADBFE78F1B7382C35E14BCC2AFA0020B942E1EC369E99CE9072C4CC0155ED1665839EEA138161EA1239AA10A5BE5A6526A5AD6905F5C7EAE5866085F64A35EA9A8ED52E382DF5E42D0576008BD378A5FB0A289C02EFFF02D6797110A7777D54845696BE0A7A78BEA81742F2F98003C55129A47D1D62E712A6B8C04B499295E0957A5F304A91AD0BC007024A0734EC99B769CB0C725D875B08C352F14C4A6245312278F67EFB74E16461598CF1970E30456C1C667E29885B3B291340514924D9F726B8A3EFF64CA0248DD03C45E5363FF1F17FB1D98E51DCB74848A028C42E864A3E477CF90BA6D14BDCD58250E849CE88E19DEF46476B726DF3A4D4A859BBEC49AF7D1B4F4F2A3101AFB0D0BCDB082C712C20C7C8DCD344361E3D9698C3A7FCA20BD554B954ADA52AE0710549CE57B5200D34795C91129F33DCD7DFF9F3EC88E72D2EECF48376A991E08C682C4A18EE1D97A6A8087099882F775E62ABB5A75408C505D9DCE34EFC173EBCA5C14DDAFFCAC5CF77464A22FE6BA0771E13C398B7AE6AAF10CFFC8CFE238FA9066F449AF172933BD0AA73AE90E406431BCCF4BDA4598818775D4D6233CF1E696810552890BD793B104F17BB1C219F52F6028EC1968F9C532CC723DB3D18D261721CD922443ECE10DEAA1A4703DA1393828DAEEDB4CE3541382AFC79BA928E7255920A3577D56EE8192F43B9BB2DDA58294B74C7C859B39EA7426C3397208703DA449A941ABFBBA8C0DD790B6FFBB1AC5F5237B59AD1C259D68E1775C6D001786090F3DF27F73D70A11C2491A461B7E8E5858436718C254DA1511221D0A6C8CB88E76D3243E3815857B556ECC9F9AA3B198896153B287F80E68B8DA221E14D620DDBFB2B76DCAD209C6B13876CB044A4EE78FC01F00F915F62ED2355EE9094071AA99BCA1F58A9F1DECEDACDC4FB94C26DC54C447A08FB4CFDBF6E5861F83B3E9277FB5DE96FC6C46C3CEF41ED9F187750FD51597D5A3D1580CBB3DD28DEBA103E036FC8B2508BD1A6C558849AED46C6EC216F6BB9306CEA01FE33E0B82A5AE7D18DA377FB5CCE75E6E3022D15D9EB3FFD02D22E2530D3D342C561F59BD0989865EEA7F59FC5F197D769CD6C62738646810ED1C94D87B0D47C13124572DED11BEC718C8161C78F0DE880A9E39257B2DE14241A0A5163F0B3E41491EDAC323A050F7D75DB77821608C341F5DFC461F84E7DA25EAF86E7A7DD99C1A004408DC9DADB36F08"};
// Galileo E5b-Q primary codes
const std::string GALILEO_E5B_Q_PRIMARY_CODE[GALILEO_E5B_NUMBER_OF_CODES] = {
constexpr size_t GALILEO_E5B_Q_PRIMARY_CODE_STR_LENGTH = 2558;
constexpr char GALILEO_E5B_Q_PRIMARY_CODE[GALILEO_E5B_NUMBER_OF_CODES][2559] = {
"E49AF0472DC849AFD1529E7227F001FC9FCDD82A502640F54EF88A2B201F911A1F90562966D0E4101A8846F50D25B0ABAF49171E3A0C8384465B39458FEC7D8644CD6ADDA0DE47617495DDD1886FFD3A960A255D58DAF9333F73AE833D840ABD6DD1D749C20B8EEC0C29E63661B0E0BC50E9EBF4A4CDD0FB5B48E141C16E196ADF48314E28E87986FA609DC9F11307B68EEDFE077AD6A5F8E7A333DBDFB74C126FDEE4E13E4C879CB19A381067DF74A075176104A3C60FA17C934F01CD20986A3844CC3395C2F14DBF38B4932660051732A813D7D224D6A9A46347702B342A8A1F214550A3E30DE0D007029BF701A32DE08148C67E341C95FDAB5D31FC4AC790DEF1521BED12156D12E68349B60431261D99176797A9CD9F855D3746D03C575D6CED7E62C401E24AA204A3571AD6316A9F288E02E99C4B29AF9FCAAAEDBE83306694FF697B2A894E350A3C2DA40EF7CB537E8C046368E47ADD96BFE35755871927A94AD9B7C5C70773FA1B707FBAC5483946B33887C82C27F7D86045749BA8717002FCAA21DCDDCFCA7F90CDC9AAA43825374066C254C65D7EADCD1BF4B2F32E0ED7C4C93A62F00B652938FAC680D874461D9F8624F23E26F7C40F52AD7668AF00CEBB7AAD8A47F144377BB81D9831DFA53DA0AC1D6C1B909FF9708B05A248EDFF820A84B08F94DEC6B1308C2DC6A44473CAA01A4CD4124CD99130899FC85F7D2C7FB1A12E5A93F75DC461F00290627EF320E3228338FAC94318B0D767956BA42A38B58571BEFDADD77921326E5C98F8983BFC70B0CDDFBD8C628A1A5CD6BD015767691E85A3D6FC1702C5FE9ED26DAB3B8148E28DA4AE64AF460EAF272E262BCCB5F47209438ACFC0743BE66C9285404C1703331A6420CF3BFEAE100F555C633F91FED3C382E7359ACC381A1E1044148A2BFAFC132833E748119EE745A927D24B72C1D9296AB2A28E6ED23CA85905AD923757E60528B78804E37CFCFEDDC55F799946622E9F20BEE58193FB78BF63F53116ADA238C24F44ED12EE018AF62CC20CA45B1EE8D6344D35574F395B065C4BB76074704334B317A512FB60E24BC5B3719C471E0DB67010F622D4B65400728CB7DFB821D63A79DC10090EB8C5D7E56F939F9E5339C29EE1673ED994F19F72FED83A247FCA65E12F3417B30EDA9C9B917BCBD372D1CE32520998E60E54F1D54ECBD87F4A5598600746D30011FCA3764686972C7FCD3CA7E5DCF79E226DC61C66AE6C70F2ADD41D34407F847582110810BF5F92978A50D5AACBE93F9A3632BEFA257B972D0996A6CAE12F87B8BD787016093BF64887367B84559C215B2C148403102DFE1D143F6724DF7078CA2EB855FCA5BF334010810EAA5C03094F2CC9EAB888BBC88886D7B1D83AB723D32FD7B6F80F2565FD7E087A4F6C48354C0FC63500DD7DCABAC255BD92AF6A6918B3159EB776EC62E6B4AF9A7A397C75E6963B92515FC9CF1123577B069B07CFE5F01E986F28A6E0883793F79F41822944AE6CEBCACB4CF4E2534CC70EF682CD066F4EE142A55844C104E1239F51D69D3C6BA1ECF2720243C340B4E04DDF68FBE8D5A07B26F4C97583422B3C3143C2316BEA8C96EA365055AFB39B719DFC45EBB2A52F52CC67341DE493D5A788E89671B705A6DE2F92FB0ACC6C31E200EB38E689F64D24E902C8AE95CC75B22BF9F44DC95130F9CE91B4F1C7EFA96D32001DCACC26D9D3F55B0C653D8B09AFC1F7DAF71C721D55F82F89E3DDE413080E8334898A5BECBB4B6FB2CFAA0D2390753F0862BA6C70C6CE011783C6240712939C93DEC36235A8",
"CE701F7B81A1EE81DEF8354D759C27FF6E4C6EBED2153250472ACB70A82E3BE39DF9DF9BEF543B6645CC6C5595565710BEFBDCAB8654CC62A8B60B6A90492EAF1216B47227F0B088A43D4E3B5E81946A7F49A14BF917765460C80543EE8867C116970B2957EDD5F7110654AF69375D673C72580640146C7A4F640F6524D3CD827342BFB29E5A211FC373C94E11F16771D58D008EDF116230ABD8F165797E8B0CFC589FEA57788516502A664C04AB9F15310C55758CADCD63FBE743FF9DDE95AD39DF253A669B1B5286C32F379AC7CB91973AAB3FA7759255DB068D225FD85DD5D8AB38484F4D09ED5AB3CDE5924851848C695EBEE8717B03919256AF0F0463CCF030ED39C5B38A5F4E5CAC680389FD80A7FB83868D09D18EA4BA07B19312BFBCD33715B8CCF2380060BDC7850176AEDB634F21BC15AE9BB76A879C76F10AD8A09D4AA8AD2E4AA1186D744E2A15B0A107C3921C10B007A0D41FC89025A9CCAE862BE52E136611F6F0B3742E115F29118E09CA13B078775CB26DA2C693BBEA490F3BD7882D397DC69F50999EA9F4BC3C276F6951B0E2281FA3CEDACFE572930350BA83D0055D492C310BD8E3B74582BD98CEC33847266015E207DE50CFDC1CF01530E76185991C238E63CC4AE2E14DAA55851C405EF1F38B7449C1C626555403069BDBF7D5CA63355EFC82F85B3CAD343BCF5B386E6974DF401E130BBD16A44F282F7E354048DB322D9CE029718DD62574CFE8614CC891AFF3905968FF8BBF0D6FFCAD3F738FA3B6F48714007024DC10FF6430FE2B4C9BE4EA2CDC2357AC71529F4362D9A792D4472E14682EE124892B8F186F397810496C4EE7115E14D991D51E8B4FCDED792E53CEF163726760741FCAEF963E4169B20F37D5B9627F62A503CFDA123AE58A780875171854D4D2C299E7B0E8377CF040313090AD9C53B4C79C7E49BA110A592673122871CADF826AB15B3E97275AC1CFE3948EA832E2D0EBBD317F8547CF916453D57A7A18D39CD3295B25977FDD73949B1E752CBCEE0C285DDCF38FC515E509FFA2721880892BC6B911289C3D437BE6F58E36FFEF9557A520C772E620597C691E85C6A63212CE7D1641A41055681A83CBD1F61024C6C475DEA3598819C7BC33F798D0E0AF48156852F9E262835607D496AE6A4C1261ED97D3BDC8D63A93EDB484089E228358AE37CB5EED7EF4BC2825F6DE89F79E4F8E5C8483479A3A63B0B0A5D54F5F79AF2A8657E167D08DC73CF1D91285DDA0B1277477B4E4B348F4167443B295730F4BAFB61DADC7F45D4EE9938D195F76CF1FE8947CAA68A6D59F2469DF27FA3DD5068E7271C55B42F882B54F5840E5A4FB09DAEA73ADE905604018C722CF9E1751C6998275BB40E8BB254A8948C13997BF83DE5E4640E8D40300FE6F708BE7B1CCC62063E24B4DFA3550CDE01EC28FFE7FC55F2732080E3FD4F9D06D0D826D49A1302AEFF95D88C7ACEE2E13DA40F29175030639DEEE713F5A3BBE9488349E594A5B2A27730B18C33943A89552D17F5CE967B05C55CFEA5E23230F49862375B8C6196650BB9B1B39C57E1878A67EB2C59D486CCB2D0AED2ADC102B5D0FD88C62CDF3C45221A76C09FA43F2924497B328E3AE725D108EA1907FDA8C8F75C1F53225DFE87C3E136BED8DDB491D0BE615598C6D6DC0C6D33E844E3DDBFDA299B1E12C11819FA83F9BE494A081862FAE5F687485E2264D9D7F0117CA3FE00B0EF59E03253BB2C5989B770951F16DD8B15E9D485E163AC60EBA10974F158D0F121C9274B15FBFD3C4B639F04D32F3A03CC2E6E32A7B4AA8",
"54B709AE2BBF27FCB2730AE75AC1B3CF690A17A43038405FB0B8F87E2C9A2242050998FD7E79B96CE5AC5CC9B986632BE6DF55BBB7BC0483EF2F1B27593C0408487E8F773A75FC51DEEFFF6581423D0155440563B04767549F4965089102A0ABE280DE00E9F92804D386E2B84BD9AF5D7C1F0565B75F04BECB19C156776E75C73A4855A5E18DDF796B8C8E7DFFFCDC51F3AFE9BEFE8DB161FFA8D6CB37044EF3E1906667BAC68EE3CC9A1ECACD94C2FD20B6D8EC553796DD9CBF3A4F81B395F7C2C8A56CF8B6CC27069A352DF4CE53A783F94823C233E4CB0E928335C744B75649E2518B8A8BC6E09A704DD025B73FE9FF962FDBF4FCF25653026CE0E66EB947A33727643568447C91B9DFA9623204FD4F127A708311CD25F7458E97F408F76FE14AB7267A4FE4AEE0D28B6DEF4D4309C55FBD6886E1372EC8FE61DFC89DEEE121898DE2EE7EE661F436BED8850E8C28F569D2CB2C9944D4F88384C0907A8076002E5A3E80F09FF52517932D78A647455B3D5F1AA72F9F70697617ED745DFBD402331BE6F72238C7E8B83C6A7B0DBC617D1C4D414AC016D337ED5043C0B7BBD46237949DC9E583C580A578FB36062F5BC5107E5D15508188FB8FA983A01C556F472C489173A1A219EFFFEE9815265EC1F0E87ED545BF55CC80AC26F5A17A04EA1C8167ADB4E97194D515B23B3DA5F1B77719B37F5FDDACA0671965C8AF2F900B0F1A26CA56EA0C3A801E05AE3DDAC42C5E975E7D8D65151AE2499702CA49B905F8BFBDA83225E363680E76B3C84442006EB644B19B01698BB63DEF284DD9C6B78E500EFB4C10AFFE3F5B19B755A9C47A6394551BE0C01F56DD60A7A0E6EAE7A57A74096142CC055F5883BE9B21010B7D6B1BF525C80C25DAF89E12A8C9BC8B09B7A796319D5562B0942421E6BFEC5F9A891C28EFF59BE7D93BE6A9AE3CE6BADF0057B009C3C83B5A70A546984181EB121D23ADD7DC74BF93118AE200344E200DA0496A930215EF923DF384C69E222B4D6C95D3E6698171205466B042E1EDB58F786172DCDD960C6F76992ED7DD5B8D88C8D4A3C452D30782206032C4D50AFAD089531863F5D3D12D7C12790E6D68C5AD406317A97CFA2970A0F5EAB7A6AB48F6B246BE7A9F1C17BCE38286190CAD21C0C0A2EDEA69CD82C0B50BD9CC9BBB321D1AD292632EB0D3793D6DABA3CA1217B25C72964464DA56A6731F1CD9868E4678122B0FD38DC51418BC199BDF6185FC9BC6C4596A6383A5409D9C32EE8415C3C9AEE2DD158F7482232BDD80A0D4E78F8E452822D360BA6E34AED9E50D44D34702497837AD5E095A4DF9ED4C018DF813D5D89E04BFE1E62424AB17E9640C6F7503DC9C03A85BC094B3D3077F263E11CA128EB8C14A4BD4F26DB8FFB2D0315B38EC76B46121E95AD03ACACB851DD792F8977056DF573E6F2B200FB02B9C26148EB88EFA66514C03ECD57801277D77744D6D77C2AE630DB858A29DD219DA84A814276F7A03BD0C4873CBD12C883353130DA044B887DCB397750C94AC5E047683D457E25A3E25E34D7C6E8D5905E2B04153ABB905CBAFD3413ECCC4C022754C05C0C0814EEE8284FB399EF2BA34020851E1B233C1F4095302F2FCB07BDA74F1483B213E74FC9D1A1B0FB1FC00ED8B59CA2EF39EC3099713C704D7D4CFF0D83E95B1B52BCB0A6B5AD81A9EC988E8165C8C1BF36FE3CDD1F416FAEC8E8255ACC758194064F4F75BFAAD22F2D000DEF719C09F10297D2D5307ADD524E23D44C36F1672D1482D15399450F46EF33A36466F34B15795388CEF2FE5C060F32F337AABDBE8",
@ -394,11 +396,12 @@ const std::string GALILEO_E5B_Q_PRIMARY_CODE[GALILEO_E5B_NUMBER_OF_CODES] = {
// Galileo E5b-I secondary code
const std::string GALILEO_E5B_I_SECONDARY_CODE = "1110";
constexpr char GALILEO_E5B_I_SECONDARY_CODE[] = "1110";
// Galileo E5b-Q secondary codes
const std::string GALILEO_E5B_Q_SECONDARY_CODE[GALILEO_E5B_NUMBER_OF_CODES] = {
constexpr size_t GALILEO_E5B_Q_SECONDARY_CODE_STR_LENGTH = 100;
constexpr char GALILEO_E5B_Q_SECONDARY_CODE[GALILEO_E5B_NUMBER_OF_CODES][101] = {
"1100111111111001000101001110111000111100011000010010011010100100100111111101010111100101110010010100",
"1111110000110001011111001001101010011011111110001100011000000011100010110101110010101101101010110011",
"1010001011101010110101110100101101101111100110000110011011100100000101000011100100111111001000111001",