1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2024-12-12 11:10:33 +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;
@ -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 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]";
}
}
have_ISM = true;
}
break;

View File

@ -90,6 +90,11 @@ public:
*/
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
*/
@ -115,6 +120,9 @@ public:
*/
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;
inline bool get_flag_CRC_test() const
@ -403,7 +411,6 @@ private:
uint8_t IODnav_LSB19{};
uint8_t IODnav_LSB20{};
uint32_t ism_crc{};
uint8_t ism_constellation_id{};
uint8_t ism_service_level_id{};
@ -434,6 +441,7 @@ private:
bool flag_CED{};
bool enable_rs{};
bool have_ISM{};
};

View File

@ -19,98 +19,92 @@
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)
{
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)
{
this->ism_wn = wn_ism;
this->d_ism_wn = wn_ism;
}
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)
{
this->ism_mask_msb = mask_msb;
this->d_ism_mask_msb = mask_msb;
}
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)
{
this->ism_pconst = pconst;
this->d_ism_pconst = pconst;
}
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)
{
this->ism_ura = ura;
this->d_ism_ura = ura;
}
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)
{
this->ism_bnom = bnom;
this->d_ism_bnom = bnom;
}
void Galileo_ISM::set_ism_Tvalidity(uint8_t tvalidity)
{
this->ism_Tvalidity = tvalidity;
}
void Galileo_ISM::set_ism_crc(uint32_t crc)
{
this->ism_crc = crc;
this->d_ism_Tvalidity = tvalidity;
}
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
{
return (this->ism_t0 * 1800);
return (this->d_ism_t0 * 1800);
}
double Galileo_ISM::get_pconst_value() const
{
auto it = ISM_PCONST_MAP.find(this->ism_pconst);
if (it == ISM_PCONST_MAP.end())
auto it = d_ISM_PCONST_MAP.find(this->d_ism_pconst);
if (it == d_ISM_PCONST_MAP.end())
{
return 0.0;
}
@ -120,8 +114,8 @@ double Galileo_ISM::get_pconst_value() const
double Galileo_ISM::get_psat_value() const
{
auto it = ISM_PSAT_MAP.find(this->ism_psat);
if (it == ISM_PSAT_MAP.end())
auto it = d_ISM_PSAT_MAP.find(this->d_ism_psat);
if (it == d_ISM_PSAT_MAP.end())
{
return 0.0;
}
@ -131,14 +125,14 @@ double Galileo_ISM::get_psat_value() 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
{
auto it = ISM_URA_MAP.find(this->ism_ura);
if (it == ISM_URA_MAP.end())
auto it = d_ISM_URA_MAP.find(this->d_ism_ura);
if (it == d_ISM_URA_MAP.end())
{
return 0.0;
}
@ -148,8 +142,8 @@ float Galileo_ISM::get_ura_m() const
float Galileo_ISM::get_ure_m() const
{
auto it = ISM_URE_MAP.find(this->ism_ure);
if (it == ISM_URE_MAP.end())
auto it = d_ISM_URE_MAP.find(this->d_ism_ure);
if (it == d_ISM_URE_MAP.end())
{
return 0.0;
}
@ -159,14 +153,14 @@ float Galileo_ISM::get_ure_m() const
uint32_t Galileo_ISM::get_mask_ISM() const
{
return ism_mask;
return d_ism_mask;
}
float Galileo_ISM::get_bnom_m() const
{
auto it = ISM_BNOM_MAP.find(this->ism_bnom);
if (it == ISM_BNOM_MAP.end())
auto it = d_ISM_BNOM_MAP.find(this->d_ism_bnom);
if (it == d_ISM_BNOM_MAP.end())
{
return 5.0; //
}
@ -176,8 +170,8 @@ float Galileo_ISM::get_bnom_m() const
uint16_t Galileo_ISM::get_Tvalidity_hours() const
{
auto it = ISM_TVALIDITY_MAP.find(this->ism_Tvalidity);
if (it == ISM_TVALIDITY_MAP.end())
auto it = d_ISM_TVALIDITY_MAP.find(this->d_ism_Tvalidity);
if (it == d_ISM_TVALIDITY_MAP.end())
{
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];
}
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);
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());
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;
}
@ -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)
{
crc32_ism.process_bytes(data.data(), data.size());
const uint32_t crc = crc32_ism.checksum();
crc32_ism.reset();
d_crc32_ism.process_bytes(data.data(), data.size());
const uint32_t crc = d_crc32_ism.checksum();
d_crc32_ism.reset();
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_bnom(uint8_t bnom);
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);
@ -71,13 +70,14 @@ public:
uint16_t get_t0_ISM() const;
uint16_t get_Tvalidity_hours() const;
bool get_ism_mask_msb() const;
bool ism_parameters_apply(uint32_t prn) const;
private:
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
std::unordered_map<uint8_t, double> ISM_PCONST_MAP = {
std::unordered_map<uint8_t, double> d_ISM_PCONST_MAP = {
{0, 1.0e-8},
{1, 1.0e-7},
{2, 1.0e-6},
@ -96,7 +96,7 @@ private:
{15, 2.0e-4}};
// 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},
{1, 3.0e-7},
{2, 6.0e-7},
@ -115,7 +115,7 @@ private:
{15, 3.0e-5}};
// 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},
{1, 1.0},
{2, 1.5},
@ -134,7 +134,7 @@ private:
{15, 6.0}};
// 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},
{1, 0.50},
{2, 0.75},
@ -153,7 +153,7 @@ private:
{15, 4.00}};
// 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},
{1, 0.10},
{2, 0.20},
@ -172,7 +172,7 @@ private:
{15, 2.4}};
// 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},
{1, 2},
{2, 3},
@ -190,19 +190,19 @@ private:
{14, 720},
{15, 1440}};
uint32_t ism_crc{};
uint32_t ism_mask{};
uint16_t ism_wn{};
uint16_t ism_t0{};
uint8_t ism_constellation_id{};
uint8_t ism_service_level_id{};
uint8_t ism_pconst{};
uint8_t ism_psat{};
uint8_t ism_ura{};
uint8_t ism_ure{};
uint8_t ism_bnom{};
uint8_t ism_Tvalidity{};
bool ism_mask_msb{};
uint32_t d_ism_crc{};
uint32_t d_ism_mask{};
uint16_t d_ism_wn{};
uint16_t d_ism_t0{};
uint8_t d_ism_constellation_id{};
uint8_t d_ism_service_level_id{};
uint8_t d_ism_pconst{};
uint8_t d_ism_psat{};
uint8_t d_ism_ura{};
uint8_t d_ism_ure{};
uint8_t d_ism_bnom{};
uint8_t d_ism_Tvalidity{};
bool d_ism_mask_msb{};
};
/** \} */