1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2025-01-05 23:10:34 +00:00

Improve ISM handling and add PRN applicability check

This commit is contained in:
Carles Fernandez 2024-09-21 13:12:48 +02:00
parent bc800dea28
commit 311b0ea6f2
No known key found for this signature in database
GPG Key ID: 4C583C52B0C3877D
4 changed files with 104 additions and 62 deletions

View File

@ -44,7 +44,7 @@ Galileo_Inav_Message::Galileo_Inav_Message()
} }
// here the compiler knows how to destrcut rs // here the compiler knows how to destroy rs
Galileo_Inav_Message::~Galileo_Inav_Message() = default; Galileo_Inav_Message::~Galileo_Inav_Message() = default;
@ -388,6 +388,17 @@ bool Galileo_Inav_Message::have_new_reduced_ced()
} }
bool Galileo_Inav_Message::have_new_ism()
{
if (have_ISM)
{
have_ISM = false;
return true;
}
return false;
}
Galileo_Ephemeris Galileo_Inav_Message::get_ephemeris() const Galileo_Ephemeris Galileo_Inav_Message::get_ephemeris() const
{ {
Galileo_Ephemeris ephemeris; Galileo_Ephemeris ephemeris;
@ -1359,6 +1370,7 @@ int32_t Galileo_Inav_Message::page_jk_decoder(const char* data_jk)
<< "Tvalidity=" << static_cast<uint32_t>(gal_ism.get_Tvalidity_hours()) << " [h]"; << "Tvalidity=" << static_cast<uint32_t>(gal_ism.get_Tvalidity_hours()) << " [h]";
} }
} }
have_ISM = true;
} }
break; break;

View File

@ -90,6 +90,11 @@ public:
*/ */
bool have_new_reduced_ced(); bool have_new_reduced_ced();
/*
* \brief Returns true if new ISM data have arrived. The flag is set to false when the function is executed
*/
bool have_new_ism();
/* /*
* \brief Returns a Galileo_Ephemeris object filled with the latest navigation data received * \brief Returns a Galileo_Ephemeris object filled with the latest navigation data received
*/ */
@ -115,6 +120,9 @@ public:
*/ */
Galileo_Ephemeris get_reduced_ced() const; Galileo_Ephemeris get_reduced_ced() const;
/*
* \brief Returns a Galileo_ISM object filled with the latest ISM data received
*/
Galileo_ISM get_galileo_ism() const; Galileo_ISM get_galileo_ism() const;
inline bool get_flag_CRC_test() const inline bool get_flag_CRC_test() const
@ -403,7 +411,6 @@ private:
uint8_t IODnav_LSB19{}; uint8_t IODnav_LSB19{};
uint8_t IODnav_LSB20{}; uint8_t IODnav_LSB20{};
uint32_t ism_crc{};
uint8_t ism_constellation_id{}; uint8_t ism_constellation_id{};
uint8_t ism_service_level_id{}; uint8_t ism_service_level_id{};
@ -434,6 +441,7 @@ private:
bool flag_CED{}; bool flag_CED{};
bool enable_rs{}; bool enable_rs{};
bool have_ISM{};
}; };

View File

@ -19,98 +19,92 @@
void Galileo_ISM::set_ism_constellation_id(uint8_t const_id) void Galileo_ISM::set_ism_constellation_id(uint8_t const_id)
{ {
this->ism_constellation_id = const_id; this->d_ism_constellation_id = const_id;
} }
void Galileo_ISM::set_ism_service_level_id(uint8_t sl_id) void Galileo_ISM::set_ism_service_level_id(uint8_t sl_id)
{ {
this->ism_service_level_id = sl_id; this->d_ism_service_level_id = sl_id;
} }
void Galileo_ISM::set_ism_wn(uint16_t wn_ism) void Galileo_ISM::set_ism_wn(uint16_t wn_ism)
{ {
this->ism_wn = wn_ism; this->d_ism_wn = wn_ism;
} }
void Galileo_ISM::set_ism_t0(uint16_t t0) void Galileo_ISM::set_ism_t0(uint16_t t0)
{ {
this->ism_t0 = t0; this->d_ism_t0 = t0;
} }
void Galileo_ISM::set_ism_mask_msb(bool mask_msb) void Galileo_ISM::set_ism_mask_msb(bool mask_msb)
{ {
this->ism_mask_msb = mask_msb; this->d_ism_mask_msb = mask_msb;
} }
void Galileo_ISM::set_ism_mask(uint32_t mask) void Galileo_ISM::set_ism_mask(uint32_t mask)
{ {
this->ism_mask = mask; this->d_ism_mask = mask;
} }
void Galileo_ISM::set_ism_pconst(uint8_t pconst) void Galileo_ISM::set_ism_pconst(uint8_t pconst)
{ {
this->ism_pconst = pconst; this->d_ism_pconst = pconst;
} }
void Galileo_ISM::set_ism_psat(uint8_t psat) void Galileo_ISM::set_ism_psat(uint8_t psat)
{ {
this->ism_psat = psat; this->d_ism_psat = psat;
} }
void Galileo_ISM::set_ism_ura(uint8_t ura) void Galileo_ISM::set_ism_ura(uint8_t ura)
{ {
this->ism_ura = ura; this->d_ism_ura = ura;
} }
void Galileo_ISM::set_ism_ure(uint8_t ure) void Galileo_ISM::set_ism_ure(uint8_t ure)
{ {
this->ism_ure = ure; this->d_ism_ure = ure;
} }
void Galileo_ISM::set_ism_bnom(uint8_t bnom) void Galileo_ISM::set_ism_bnom(uint8_t bnom)
{ {
this->ism_bnom = bnom; this->d_ism_bnom = bnom;
} }
void Galileo_ISM::set_ism_Tvalidity(uint8_t tvalidity) void Galileo_ISM::set_ism_Tvalidity(uint8_t tvalidity)
{ {
this->ism_Tvalidity = tvalidity; this->d_ism_Tvalidity = tvalidity;
}
void Galileo_ISM::set_ism_crc(uint32_t crc)
{
this->ism_crc = crc;
} }
uint16_t Galileo_ISM::get_WN_ISM() const uint16_t Galileo_ISM::get_WN_ISM() const
{ {
return this->ism_wn; return this->d_ism_wn;
} }
uint16_t Galileo_ISM::get_t0_ISM() const uint16_t Galileo_ISM::get_t0_ISM() const
{ {
return (this->ism_t0 * 1800); return (this->d_ism_t0 * 1800);
} }
double Galileo_ISM::get_pconst_value() const double Galileo_ISM::get_pconst_value() const
{ {
auto it = ISM_PCONST_MAP.find(this->ism_pconst); auto it = d_ISM_PCONST_MAP.find(this->d_ism_pconst);
if (it == ISM_PCONST_MAP.end()) if (it == d_ISM_PCONST_MAP.end())
{ {
return 0.0; return 0.0;
} }
@ -120,8 +114,8 @@ double Galileo_ISM::get_pconst_value() const
double Galileo_ISM::get_psat_value() const double Galileo_ISM::get_psat_value() const
{ {
auto it = ISM_PSAT_MAP.find(this->ism_psat); auto it = d_ISM_PSAT_MAP.find(this->d_ism_psat);
if (it == ISM_PSAT_MAP.end()) if (it == d_ISM_PSAT_MAP.end())
{ {
return 0.0; return 0.0;
} }
@ -131,14 +125,14 @@ double Galileo_ISM::get_psat_value() const
bool Galileo_ISM::get_ism_mask_msb() const bool Galileo_ISM::get_ism_mask_msb() const
{ {
return ism_mask_msb; return d_ism_mask_msb;
} }
float Galileo_ISM::get_ura_m() const float Galileo_ISM::get_ura_m() const
{ {
auto it = ISM_URA_MAP.find(this->ism_ura); auto it = d_ISM_URA_MAP.find(this->d_ism_ura);
if (it == ISM_URA_MAP.end()) if (it == d_ISM_URA_MAP.end())
{ {
return 0.0; return 0.0;
} }
@ -148,8 +142,8 @@ float Galileo_ISM::get_ura_m() const
float Galileo_ISM::get_ure_m() const float Galileo_ISM::get_ure_m() const
{ {
auto it = ISM_URE_MAP.find(this->ism_ure); auto it = d_ISM_URE_MAP.find(this->d_ism_ure);
if (it == ISM_URE_MAP.end()) if (it == d_ISM_URE_MAP.end())
{ {
return 0.0; return 0.0;
} }
@ -159,14 +153,14 @@ float Galileo_ISM::get_ure_m() const
uint32_t Galileo_ISM::get_mask_ISM() const uint32_t Galileo_ISM::get_mask_ISM() const
{ {
return ism_mask; return d_ism_mask;
} }
float Galileo_ISM::get_bnom_m() const float Galileo_ISM::get_bnom_m() const
{ {
auto it = ISM_BNOM_MAP.find(this->ism_bnom); auto it = d_ISM_BNOM_MAP.find(this->d_ism_bnom);
if (it == ISM_BNOM_MAP.end()) if (it == d_ISM_BNOM_MAP.end())
{ {
return 5.0; // return 5.0; //
} }
@ -176,8 +170,8 @@ float Galileo_ISM::get_bnom_m() const
uint16_t Galileo_ISM::get_Tvalidity_hours() const uint16_t Galileo_ISM::get_Tvalidity_hours() const
{ {
auto it = ISM_TVALIDITY_MAP.find(this->ism_Tvalidity); auto it = d_ISM_TVALIDITY_MAP.find(this->d_ism_Tvalidity);
if (it == ISM_TVALIDITY_MAP.end()) if (it == d_ISM_TVALIDITY_MAP.end())
{ {
return 0.0; return 0.0;
} }
@ -197,7 +191,7 @@ bool Galileo_ISM::check_ism_crc(const std::bitset<GALILEO_DATA_JK_BITS>& bits)
{ {
crc_bits[i] = bits[i]; crc_bits[i] = bits[i];
} }
ism_crc = crc_bits.to_ulong(); this->d_ism_crc = crc_bits.to_ulong();
std::vector<uint8_t> data_bytes((data_bits.size() + 7) / 8); std::vector<uint8_t> data_bytes((data_bits.size() + 7) / 8);
for (size_t i = 0; i < data_bits.size(); i += 8) for (size_t i = 0; i < data_bits.size(); i += 8)
@ -213,7 +207,7 @@ bool Galileo_ISM::check_ism_crc(const std::bitset<GALILEO_DATA_JK_BITS>& bits)
std::reverse(data_bytes.begin(), data_bytes.end()); std::reverse(data_bytes.begin(), data_bytes.end());
const uint32_t crc_computed = this->compute_crc(data_bytes); const uint32_t crc_computed = this->compute_crc(data_bytes);
if (this->ism_crc == crc_computed) if (this->d_ism_crc == crc_computed)
{ {
return true; return true;
} }
@ -224,8 +218,36 @@ bool Galileo_ISM::check_ism_crc(const std::bitset<GALILEO_DATA_JK_BITS>& bits)
uint32_t Galileo_ISM::compute_crc(const std::vector<uint8_t>& data) uint32_t Galileo_ISM::compute_crc(const std::vector<uint8_t>& data)
{ {
crc32_ism.process_bytes(data.data(), data.size()); d_crc32_ism.process_bytes(data.data(), data.size());
const uint32_t crc = crc32_ism.checksum(); const uint32_t crc = d_crc32_ism.checksum();
crc32_ism.reset(); d_crc32_ism.reset();
return crc; return crc;
} }
bool Galileo_ISM::ism_parameters_apply(uint32_t prn) const
{
// ICD 2.1 Table 96
if (prn == 0 || prn > 63 || d_ism_service_level_id != 2 || d_ism_constellation_id != 1)
{
return false;
}
std::bitset<32> b(d_ism_mask);
if (d_ism_mask_msb == false)
{
// For numbering in the ICD, the most significant bit/byte is numbered as bit/byte 0
if (prn > 32)
{
return false;
}
return b.test(32 - prn);
}
else
{
if (prn <= 32)
{
return false;
}
return b.test(64 - prn);
}
}

View File

@ -57,7 +57,6 @@ public:
void set_ism_ure(uint8_t ure); void set_ism_ure(uint8_t ure);
void set_ism_bnom(uint8_t bnom); void set_ism_bnom(uint8_t bnom);
void set_ism_Tvalidity(uint8_t tvalidity); void set_ism_Tvalidity(uint8_t tvalidity);
void set_ism_crc(uint32_t crc);
bool check_ism_crc(const std::bitset<GALILEO_DATA_JK_BITS>& bits); bool check_ism_crc(const std::bitset<GALILEO_DATA_JK_BITS>& bits);
@ -71,13 +70,14 @@ public:
uint16_t get_t0_ISM() const; uint16_t get_t0_ISM() const;
uint16_t get_Tvalidity_hours() const; uint16_t get_Tvalidity_hours() const;
bool get_ism_mask_msb() const; bool get_ism_mask_msb() const;
bool ism_parameters_apply(uint32_t prn) const;
private: private:
uint32_t compute_crc(const std::vector<uint8_t>& data); uint32_t compute_crc(const std::vector<uint8_t>& data);
boost::crc_optimal<32, 0x814141AB, 0, 0, false, false> crc32_ism; boost::crc_optimal<32, 0x814141AB, 0, 0, false, false> d_crc32_ism;
// ICD 2.1 Table 97 // ICD 2.1 Table 97
std::unordered_map<uint8_t, double> ISM_PCONST_MAP = { std::unordered_map<uint8_t, double> d_ISM_PCONST_MAP = {
{0, 1.0e-8}, {0, 1.0e-8},
{1, 1.0e-7}, {1, 1.0e-7},
{2, 1.0e-6}, {2, 1.0e-6},
@ -96,7 +96,7 @@ private:
{15, 2.0e-4}}; {15, 2.0e-4}};
// ICD 2.1 Table 98 // ICD 2.1 Table 98
std::unordered_map<uint8_t, double> ISM_PSAT_MAP = { std::unordered_map<uint8_t, double> d_ISM_PSAT_MAP = {
{0, 1.0e-7}, {0, 1.0e-7},
{1, 3.0e-7}, {1, 3.0e-7},
{2, 6.0e-7}, {2, 6.0e-7},
@ -115,7 +115,7 @@ private:
{15, 3.0e-5}}; {15, 3.0e-5}};
// ICD 2.1 Table 99 // ICD 2.1 Table 99
std::unordered_map<uint8_t, float> ISM_URA_MAP = { std::unordered_map<uint8_t, float> d_ISM_URA_MAP = {
{0, 0.75}, {0, 0.75},
{1, 1.0}, {1, 1.0},
{2, 1.5}, {2, 1.5},
@ -134,7 +134,7 @@ private:
{15, 6.0}}; {15, 6.0}};
// ICD 2.1 Table 100 // ICD 2.1 Table 100
std::unordered_map<uint8_t, float> ISM_URE_MAP = { std::unordered_map<uint8_t, float> d_ISM_URE_MAP = {
{0, 0.25}, {0, 0.25},
{1, 0.50}, {1, 0.50},
{2, 0.75}, {2, 0.75},
@ -153,7 +153,7 @@ private:
{15, 4.00}}; {15, 4.00}};
// ICD 2.1 Table 101 // ICD 2.1 Table 101
std::unordered_map<uint8_t, float> ISM_BNOM_MAP = { std::unordered_map<uint8_t, float> d_ISM_BNOM_MAP = {
{0, 0.0}, {0, 0.0},
{1, 0.10}, {1, 0.10},
{2, 0.20}, {2, 0.20},
@ -172,7 +172,7 @@ private:
{15, 2.4}}; {15, 2.4}};
// ICD 2.1 Table 102 // ICD 2.1 Table 102
std::unordered_map<uint8_t, uint16_t> ISM_TVALIDITY_MAP = { std::unordered_map<uint8_t, uint16_t> d_ISM_TVALIDITY_MAP = {
{0, 1}, {0, 1},
{1, 2}, {1, 2},
{2, 3}, {2, 3},
@ -190,19 +190,19 @@ private:
{14, 720}, {14, 720},
{15, 1440}}; {15, 1440}};
uint32_t ism_crc{}; uint32_t d_ism_crc{};
uint32_t ism_mask{}; uint32_t d_ism_mask{};
uint16_t ism_wn{}; uint16_t d_ism_wn{};
uint16_t ism_t0{}; uint16_t d_ism_t0{};
uint8_t ism_constellation_id{}; uint8_t d_ism_constellation_id{};
uint8_t ism_service_level_id{}; uint8_t d_ism_service_level_id{};
uint8_t ism_pconst{}; uint8_t d_ism_pconst{};
uint8_t ism_psat{}; uint8_t d_ism_psat{};
uint8_t ism_ura{}; uint8_t d_ism_ura{};
uint8_t ism_ure{}; uint8_t d_ism_ure{};
uint8_t ism_bnom{}; uint8_t d_ism_bnom{};
uint8_t ism_Tvalidity{}; uint8_t d_ism_Tvalidity{};
bool ism_mask_msb{}; bool d_ism_mask_msb{};
}; };
/** \} */ /** \} */