mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2025-01-18 21:23:02 +00:00
[TAS-224] Update telemetry decoder to directly process Navigation Data bits
This update refactors the telemetry decoder to directly retrieve and compute Navigation Data bits. WIP as the tag verification still fails
This commit is contained in:
parent
11e84e751b
commit
c8c7d4c352
@ -439,7 +439,7 @@ void galileo_telemetry_decoder_gs::decode_INAV_word(float *page_part_symbols, in
|
||||
}
|
||||
|
||||
// 4. Push the new navigation data to the queues
|
||||
if (d_inav_nav.have_new_ephemeris() == true)
|
||||
if (d_inav_nav.have_new_ephemeris() == true) // C: tells if W1-->W4 available from same blcok (and W5!)
|
||||
{
|
||||
// get object for this SV (mandatory)
|
||||
const std::shared_ptr<Galileo_Ephemeris> tmp_obj = std::make_shared<Galileo_Ephemeris>(d_inav_nav.get_ephemeris());
|
||||
@ -471,12 +471,26 @@ void galileo_telemetry_decoder_gs::decode_INAV_word(float *page_part_symbols, in
|
||||
this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj));
|
||||
d_first_eph_sent = true; // do not send reduced CED anymore, since we have the full ephemeris set
|
||||
|
||||
d_flag_osnma_adkd_0_12 = true; // W1-> W5 available
|
||||
// d_flag_osnma_adkd_0_12 = true; // W1-> W5 available
|
||||
// extract bits, reset container.
|
||||
bool check_size_is_ok = d_inav_nav.get_osnma_adkd_0_12_nav_bits().size() == 549;
|
||||
if(check_size_is_ok)
|
||||
{
|
||||
std::cout << "Galileo OSNMA: sending ADKD=0/12 navData, PRN_d (" << d_satellite.get_PRN() << ") " << "TOW_sf=" << d_inav_nav.get_TOW5() - 24 <<std::endl;
|
||||
const auto tmp_obj_osnma = std::make_shared<std::tuple<uint32_t, std::string,uint32_t>>( // < PRNd , navDataBits, TOW_Sosf>
|
||||
d_satellite.get_PRN(),
|
||||
d_inav_nav.get_osnma_adkd_0_12_nav_bits(),
|
||||
d_inav_nav.get_TOW5() - 24);
|
||||
this->message_port_pub(pmt::mp("OSNMA_from_TLM"), pmt::make_any(tmp_obj_osnma));
|
||||
d_inav_nav.reset_osnma_nav_bits_adkd0_12();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// If we still do not have ephemeris, check if we have a reduced CED
|
||||
if ((d_band == '1') && d_use_ced && !d_first_eph_sent && (d_inav_nav.have_new_reduced_ced() == true))
|
||||
if ((d_band == '1') && d_use_ced && !d_first_eph_sent && (d_inav_nav.have_new_reduced_ced() == true)) // C: W16 has some Eph. params, uneeded for OSNMa I guess
|
||||
{
|
||||
const std::shared_ptr<Galileo_Ephemeris> tmp_obj = std::make_shared<Galileo_Ephemeris>(d_inav_nav.get_reduced_ced());
|
||||
this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj));
|
||||
@ -492,7 +506,7 @@ void galileo_telemetry_decoder_gs::decode_INAV_word(float *page_part_symbols, in
|
||||
}
|
||||
}
|
||||
|
||||
if (d_inav_nav.have_new_iono_and_GST() == true)
|
||||
if (d_inav_nav.have_new_iono_and_GST() == true) // C: W5
|
||||
{
|
||||
// get object for this SV (mandatory)
|
||||
const std::shared_ptr<Galileo_Iono> tmp_obj = std::make_shared<Galileo_Iono>(d_inav_nav.get_iono());
|
||||
@ -521,10 +535,9 @@ void galileo_telemetry_decoder_gs::decode_INAV_word(float *page_part_symbols, in
|
||||
<< d_satellite << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision)
|
||||
<< " dB-Hz" << TEXT_RESET << std::endl;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (d_inav_nav.have_new_utc_model() == true)
|
||||
if (d_inav_nav.have_new_utc_model() == true) // C: tells if W6 is available
|
||||
{
|
||||
// get object for this SV (mandatory)
|
||||
const std::shared_ptr<Galileo_Utc_Model> tmp_obj = std::make_shared<Galileo_Utc_Model>(d_inav_nav.get_utc_model());
|
||||
@ -561,7 +574,7 @@ void galileo_telemetry_decoder_gs::decode_INAV_word(float *page_part_symbols, in
|
||||
d_flag_osnma_adkd_4_utc = true;
|
||||
}
|
||||
|
||||
if (d_inav_nav.have_new_almanac() == true)
|
||||
if (d_inav_nav.have_new_almanac() == true) // flag_almanac_4 tells if W10 available.
|
||||
{
|
||||
const std::shared_ptr<Galileo_Almanac_Helper> tmp_obj = std::make_shared<Galileo_Almanac_Helper>(d_inav_nav.get_almanac());
|
||||
this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj));
|
||||
@ -597,23 +610,32 @@ void galileo_telemetry_decoder_gs::decode_INAV_word(float *page_part_symbols, in
|
||||
}
|
||||
|
||||
// get osnma message if the needed nav data is available
|
||||
bool adkd_4_nav_data_available = d_flag_osnma_adkd_4_utc && d_flag_osnma_adkd_4_gst;
|
||||
auto newOSNMA = d_inav_nav.have_new_nma();if (d_band == '1' && newOSNMA && (adkd_4_nav_data_available == true || d_flag_osnma_adkd_0_12 == true))
|
||||
bool adkd_4_nav_data_available = d_flag_osnma_adkd_4_utc && d_flag_osnma_adkd_4_gst; // supposition: data did not change bt. flags reset and now.
|
||||
|
||||
// bool adkd_4_nav_data_available = d_inav_nav.get_osnma_adkd_4_nav_bits().size() == 141; // newApproach: let decoder decide when block starts and let it fill the data, and just check for length
|
||||
if(adkd_4_nav_data_available /*&& d_inav_nav.is_TOW5_set() not needed cause W6 has TOW also.*/)
|
||||
{
|
||||
bool check_size_is_ok = d_inav_nav.get_osnma_adkd_4_nav_bits().size() == 141;
|
||||
if(check_size_is_ok)
|
||||
{
|
||||
std::cout << "Galileo OSNMA: sending ADKD=4 navData, PRN_d (" << d_satellite.get_PRN() << ") " << "TOW_sf=" << d_inav_nav.get_TOW6() - 4 <<std::endl;
|
||||
|
||||
const auto tmp_obj = std::make_shared<std::tuple<uint32_t, std::string,uint32_t>>( // < PRNd , navDataBits, TOW_Sosf> // TODO conversion from W6 to W_Start_of_subframe
|
||||
d_satellite.get_PRN(),
|
||||
d_inav_nav.get_osnma_adkd_4_nav_bits(),
|
||||
d_inav_nav.get_TOW6() - 4);
|
||||
this->message_port_pub(pmt::mp("OSNMA_from_TLM"), pmt::make_any(tmp_obj));
|
||||
d_inav_nav.reset_osnma_nav_bits_adkd4();
|
||||
}
|
||||
|
||||
}
|
||||
auto newOSNMA = d_inav_nav.have_new_nma();
|
||||
if (d_band == '1' && newOSNMA)
|
||||
{
|
||||
const std::shared_ptr<OSNMA_msg> tmp_obj = std::make_shared<OSNMA_msg>(d_inav_nav.get_osnma_msg());
|
||||
|
||||
if(adkd_4_nav_data_available)
|
||||
tmp_obj->TimingData_2 = d_inav_nav.get_osnma_adkd_4_nav_bits();
|
||||
if(d_flag_osnma_adkd_0_12)
|
||||
tmp_obj->EphemerisClockAndStatusData_2 = d_inav_nav.get_osnma_adkd_0_12_nav_bits();
|
||||
|
||||
this->message_port_pub(pmt::mp("OSNMA_from_TLM"), pmt::make_any(tmp_obj));
|
||||
|
||||
d_flag_osnma_adkd_4_utc= false;
|
||||
d_flag_osnma_adkd_4_gst = false;
|
||||
d_flag_osnma_adkd_0_12 = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -95,7 +95,7 @@ void osnma_msg_receiver::msg_handler_osnma(const pmt::pmt_t& msg)
|
||||
if (msg_type_hash_code == typeid(std::shared_ptr<OSNMA_msg>).hash_code())
|
||||
{
|
||||
const auto nma_msg = wht::any_cast<std::shared_ptr<OSNMA_msg>>(pmt::any_ref(msg));
|
||||
const auto sat = Gnss_Satellite(std::string("Galileo"), nma_msg->PRN);
|
||||
const auto sat = Gnss_Satellite(std::string("Galileo"), nma_msg->PRN); // TODO remove if unneeded
|
||||
|
||||
std::ostringstream output_message;
|
||||
output_message << "Galileo OSNMA: Subframe received starting at "
|
||||
@ -110,6 +110,27 @@ void osnma_msg_receiver::msg_handler_osnma(const pmt::pmt_t& msg)
|
||||
|
||||
process_osnma_message(nma_msg);
|
||||
|
||||
std::cout << "Galileo OSNMA: d_tags_awaiting_verify :: size: " << d_tags_awaiting_verify.size() << std::endl;
|
||||
}
|
||||
else if (msg_type_hash_code == typeid(std::shared_ptr<std::tuple<uint32_t, std::string, uint32_t>>).hash_code())
|
||||
{
|
||||
// TODO - PRNa is a typo here, I think for d_satellite_nav_data, is PRN_d the name to use
|
||||
const auto inav_data = wht::any_cast<std::shared_ptr<std::tuple<uint32_t, std::string,uint32_t>>>(pmt::any_ref(msg));
|
||||
uint32_t PRNa = std::get<0>(*inav_data);
|
||||
std::string nav_data = std::get<1>(*inav_data);;
|
||||
uint32_t TOW = std::get<2>(*inav_data);
|
||||
|
||||
// iono data => 549 bits, utc data, 141 bits.
|
||||
if(nav_data.size() == 549)
|
||||
{
|
||||
d_satellite_nav_data[PRNa][TOW].ephemeris_iono_vector_2 = nav_data;
|
||||
}
|
||||
else if(nav_data.size() == 141)
|
||||
{
|
||||
d_satellite_nav_data[PRNa][TOW].utc_vector_2 = nav_data;
|
||||
}
|
||||
else
|
||||
LOG(ERROR) << "osnma_msg_receiver incorrect navData parsing!";
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -581,7 +602,7 @@ void osnma_msg_receiver::read_and_process_mack_block(const std::shared_ptr<OSNMA
|
||||
|
||||
// update the structure with newly coming NavData
|
||||
d_osnma_data.d_nav_data.init(osnma_msg); // TODO refactor it
|
||||
add_satellite_data(osnma_msg->PRN,osnma_msg->TOW_sf0,d_osnma_data.d_nav_data); // TODO change place
|
||||
// add_satellite_data(osnma_msg->PRN,osnma_msg->TOW_sf0,d_osnma_data.d_nav_data); // TODO change place
|
||||
// DEBUG PARSING MACK MESSAGES WHEN DSM-KROOT NOT YET AVAILABLE
|
||||
// d_osnma_data.d_dsm_kroot_message.ts = 9;
|
||||
// d_osnma_data.d_dsm_kroot_message.ks = 4;
|
||||
@ -923,14 +944,18 @@ void osnma_msg_receiver::process_mack_message()
|
||||
{
|
||||
it.second.status = Tag::SUCCESS;
|
||||
LOG(WARNING) << "Galileo OSNMA: Tag verification :: SUCCESS for tag Id= "
|
||||
<< it.second.tag_id
|
||||
<< ", TOW="
|
||||
<< it.second.TOW
|
||||
<< ", ADKD="
|
||||
<< static_cast<unsigned>(it.second.ADKD)
|
||||
<< ", from satellite "
|
||||
<< it.second.PRNa
|
||||
<< std::endl;
|
||||
<< it.second.tag_id
|
||||
<< ", value=0x" << std::setfill('0') << std::setw(10) << std::hex << std::uppercase
|
||||
<< it.second.received_tag << std::dec
|
||||
<< ", TOW="
|
||||
<< it.second.TOW
|
||||
<< ", ADKD="
|
||||
<< static_cast<unsigned>(it.second.ADKD)
|
||||
<< ", PRNa="
|
||||
<< static_cast<unsigned>(it.second.PRNa)
|
||||
<< ", PRNd="
|
||||
<< static_cast<unsigned>(it.second.PRN_d)
|
||||
<< std::endl;
|
||||
}
|
||||
/* TODO notify PVT via pmt
|
||||
* have_new_data() true
|
||||
@ -939,27 +964,36 @@ void osnma_msg_receiver::process_mack_message()
|
||||
else
|
||||
{
|
||||
it.second.status = Tag::FAIL;
|
||||
LOG(ERROR) << "Galileo OSNMA: Tag verification :: FAILURE for tag Id= "
|
||||
<< it.second.tag_id
|
||||
<< ", TOW="
|
||||
<< it.second.TOW
|
||||
<< ", ADKD="
|
||||
<< static_cast<unsigned>(it.second.ADKD)
|
||||
<< ", from satellite "
|
||||
<< it.second.PRNa
|
||||
<< std::endl;
|
||||
LOG(ERROR) << "Galileo OSNMA: Tag verification :: FAILURE for tag Id="
|
||||
<< it.second.tag_id
|
||||
<< ", value=0x" << std::setfill('0') << std::setw(10) << std::hex << std::uppercase
|
||||
<< it.second.received_tag << std::dec
|
||||
<< ", TOW="
|
||||
<< it.second.TOW
|
||||
<< ", ADKD="
|
||||
<< static_cast<unsigned>(it.second.ADKD)
|
||||
<< ", PRNa="
|
||||
<< static_cast<unsigned>(it.second.PRNa)
|
||||
<< ", PRNd="
|
||||
<< static_cast<unsigned>(it.second.PRN_d)
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
else {
|
||||
LOG(WARNING) << "Galileo OSNMA: Tag verification :: SKIPPED for Tag Id= "
|
||||
<< it.second.tag_id
|
||||
<< ", TOW="
|
||||
<< it.second.TOW
|
||||
<< ", ADKD="
|
||||
<< static_cast<unsigned>(it.second.ADKD)
|
||||
<< ", from satellite "
|
||||
<< it.second.PRNa
|
||||
<< " due to missing key or navData. ";
|
||||
<< it.second.tag_id
|
||||
<< ", value=0x" << std::setfill('0') << std::setw(10) << std::hex << std::uppercase
|
||||
<< it.second.received_tag << std::dec
|
||||
<< ", TOW="
|
||||
<< it.second.TOW
|
||||
<< ", ADKD="
|
||||
<< static_cast<unsigned>(it.second.ADKD)
|
||||
<< ", PRNa="
|
||||
<< static_cast<unsigned>(it.second.PRNa)
|
||||
<< ", PRNd="
|
||||
<< static_cast<unsigned>(it.second.PRN_d)
|
||||
<< ". Key available ("<< tag_has_key_available(it.second) <<"), navData ("<< tag_has_nav_data_available(it.second) <<"). "
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1078,7 +1112,23 @@ bool osnma_msg_receiver::verify_tag(Tag& tag)
|
||||
|
||||
// Compare computed tag with received one truncated
|
||||
if (tag.received_tag == computed_mac)
|
||||
{
|
||||
std::cout << "Galileo OSNMA: Tag verification :: SUCCESS for tag Id= "
|
||||
<< tag.tag_id
|
||||
<< ", value=0x" << std::setfill('0') << std::setw(10) << std::hex << std::uppercase
|
||||
<< tag.received_tag << std::dec
|
||||
<< ", TOW="
|
||||
<< tag.TOW
|
||||
<< ", ADKD="
|
||||
<< static_cast<unsigned>(tag.ADKD)
|
||||
<< ", PRNa="
|
||||
<< static_cast<unsigned>(tag.PRNa)
|
||||
<< ", PRNd="
|
||||
<< static_cast<unsigned>(tag.PRN_d)
|
||||
<< std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
else
|
||||
return false;
|
||||
}
|
||||
@ -1219,17 +1269,27 @@ void osnma_msg_receiver::remove_verified_tags()
|
||||
for (auto it = d_tags_awaiting_verify.begin(); it != d_tags_awaiting_verify.end() ; ){
|
||||
if (it->second.status == Tag::SUCCESS || it->second.status == Tag::FAIL)
|
||||
{
|
||||
LOG(INFO) << "Galileo OSNMA: delete tag for tag Id= "
|
||||
<< it->second.tag_id << ", PRN_a= "
|
||||
<< it->second.PRNa << ", TOW="
|
||||
<< it->second.TOW << ", ADKD= "
|
||||
<< static_cast<unsigned>(it->second.ADKD) << ", status= "
|
||||
<< it->second.status << std::endl;
|
||||
LOG(INFO) << "Galileo OSNMA: Tag verification :: DELETE tag Id="
|
||||
<< it->second.tag_id
|
||||
<< ", value=0x" << std::setfill('0') << std::setw(10) << std::hex << std::uppercase
|
||||
<< it->second.received_tag << std::dec
|
||||
<< ", TOW="
|
||||
<< it->second.TOW
|
||||
<< ", ADKD="
|
||||
<< static_cast<unsigned>(it->second.ADKD)
|
||||
<< ", PRNa="
|
||||
<< static_cast<unsigned>(it->second.PRNa)
|
||||
<< ", PRNd="
|
||||
<< static_cast<unsigned>(it->second.PRN_d)
|
||||
<< ", status= "
|
||||
<< it->second.status
|
||||
<< std::endl;
|
||||
it = d_tags_awaiting_verify.erase(it);
|
||||
}
|
||||
else
|
||||
++it;
|
||||
}
|
||||
std::cout << "Galileo OSNMA: d_tags_awaiting_verify :: size: " << d_tags_awaiting_verify.size() << std::endl;
|
||||
}
|
||||
/**
|
||||
* @brief Control the size of the tags awaiting verification multimap.
|
||||
|
@ -83,7 +83,7 @@ private:
|
||||
bool tag_has_nav_data_available(Tag& t);
|
||||
bool tag_has_key_available(Tag& t);
|
||||
|
||||
std::map<uint32_t, std::map<uint32_t, NavData>> d_satellite_nav_data; // map holding NavData sorted by SVID and TOW.
|
||||
std::map<uint32_t, std::map<uint32_t, NavData>> d_satellite_nav_data; // map holding NavData sorted by SVID (first key) and TOW (second key).
|
||||
std::map<uint32_t, std::vector<uint8_t>> d_tesla_keys; // tesla keys over time, sorted by TOW
|
||||
std::vector<MACK_message> d_macks_awaiting_MACSEQ_verification;
|
||||
std::multimap<uint32_t, Tag> d_tags_awaiting_verify; // container with tags to verify from arbitrary SVIDs, sorted by TOW
|
||||
|
@ -185,7 +185,7 @@ void Galileo_Inav_Message::split_page(std::string page_string, int32_t flag_even
|
||||
if (page_position_in_inav_subframe != 255)
|
||||
{
|
||||
if (page_position_in_inav_subframe == 0)
|
||||
{
|
||||
{ // TODO - is it redundant? receiving Word 2 already resets this
|
||||
nma_position_filled = std::array<int8_t, 15>{};
|
||||
nma_msg.mack = std::array<uint32_t, 15>{};
|
||||
nma_msg.hkroot = std::array<uint8_t, 15>{};
|
||||
@ -215,7 +215,7 @@ void Galileo_Inav_Message::split_page(std::string page_string, int32_t flag_even
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// C: tells if W1-->W4 available from same blcok
|
||||
bool Galileo_Inav_Message::have_new_ephemeris() // Check if we have a new ephemeris stored in the galileo navigation class
|
||||
{
|
||||
if ((flag_ephemeris_1 == true) and (flag_ephemeris_2 == true) and (flag_ephemeris_3 == true) and (flag_ephemeris_4 == true) and (flag_iono_and_GST == true))
|
||||
@ -349,7 +349,7 @@ bool Galileo_Inav_Message::have_new_ephemeris() // Check if we have a new ephem
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// C: tells if W5 is available
|
||||
bool Galileo_Inav_Message::have_new_iono_and_GST() // Check if we have a new iono data set stored in the galileo navigation class
|
||||
{
|
||||
if ((flag_iono_and_GST == true) and (flag_utc_model == true)) // the condition on flag_utc_model is added to have a time stamp for iono
|
||||
@ -361,7 +361,7 @@ bool Galileo_Inav_Message::have_new_iono_and_GST() // Check if we have a new io
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// C: tells if W6 is available
|
||||
bool Galileo_Inav_Message::have_new_utc_model() // Check if we have a new utc data set stored in the galileo navigation class
|
||||
{
|
||||
if (flag_utc_model == true)
|
||||
@ -373,9 +373,13 @@ bool Galileo_Inav_Message::have_new_utc_model() // Check if we have a new utc d
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// flag_almanac_4 tells if W10 available.
|
||||
bool Galileo_Inav_Message::have_new_almanac() // Check if we have a new almanac data set stored in the galileo navigation class
|
||||
{
|
||||
// if(flag_almanac_4)
|
||||
// {
|
||||
// flag_adkd_4_complete = true;
|
||||
// }
|
||||
if ((flag_almanac_1 == true) and (flag_almanac_2 == true) and (flag_almanac_3 == true) and (flag_almanac_4 == true))
|
||||
{
|
||||
// All Almanac data have been received
|
||||
@ -614,7 +618,7 @@ void Galileo_Inav_Message::read_page_1(const std::bitset<GALILEO_DATA_JK_BITS>&
|
||||
DLOG(INFO) << "A_1= " << A_1;
|
||||
flag_ephemeris_1 = true;
|
||||
DLOG(INFO) << "flag_tow_set" << flag_TOW_set;
|
||||
nav_bits_word_1 = data_bits.to_string().substr(5,120);
|
||||
nav_bits_word_1 = data_bits.to_string().substr(6,120);
|
||||
}
|
||||
|
||||
|
||||
@ -636,7 +640,7 @@ void Galileo_Inav_Message::read_page_2(const std::bitset<GALILEO_DATA_JK_BITS>&
|
||||
DLOG(INFO) << "iDot_2= " << iDot_2;
|
||||
flag_ephemeris_2 = true;
|
||||
DLOG(INFO) << "flag_tow_set" << flag_TOW_set;
|
||||
nav_bits_word_2 = data_bits.to_string().substr(5,120);
|
||||
nav_bits_word_2 = data_bits.to_string().substr(6,120);
|
||||
}
|
||||
|
||||
|
||||
@ -666,7 +670,7 @@ void Galileo_Inav_Message::read_page_3(const std::bitset<GALILEO_DATA_JK_BITS>&
|
||||
DLOG(INFO) << "SISA_3= " << SISA_3;
|
||||
flag_ephemeris_3 = true;
|
||||
DLOG(INFO) << "flag_tow_set" << flag_TOW_set;
|
||||
nav_bits_word_3 = data_bits.to_string().substr(5, 122);
|
||||
nav_bits_word_3 = data_bits.to_string().substr(6, 122);
|
||||
}
|
||||
|
||||
|
||||
@ -700,7 +704,7 @@ void Galileo_Inav_Message::read_page_4(const std::bitset<GALILEO_DATA_JK_BITS>&
|
||||
DLOG(INFO) << "spare_4 = " << spare_4;
|
||||
flag_ephemeris_4 = true;
|
||||
DLOG(INFO) << "flag_tow_set" << flag_TOW_set;
|
||||
nav_bits_word_4 = data_bits.to_string().substr(5, 120);
|
||||
nav_bits_word_4 = data_bits.to_string().substr(6, 120);
|
||||
}
|
||||
|
||||
|
||||
@ -872,10 +876,14 @@ int32_t Galileo_Inav_Message::page_jk_decoder(const char* data_jk)
|
||||
|
||||
case 2: // Word type 2: Ephemeris (2/4)
|
||||
{
|
||||
// start of subframe, reset osnma parameters TODO - refactor
|
||||
page_position_in_inav_subframe = 0;
|
||||
nma_msg.mack = std::array<uint32_t, 15>{};
|
||||
nma_msg.hkroot = std::array<uint8_t, 15>{};
|
||||
nma_position_filled = std::array<int8_t, 15>{};
|
||||
reset_osnma_nav_bits_adkd4();
|
||||
reset_osnma_nav_bits_adkd0_12();
|
||||
|
||||
read_page_2(data_jk_bits);
|
||||
if (enable_rs)
|
||||
{
|
||||
@ -1020,7 +1028,7 @@ int32_t Galileo_Inav_Message::page_jk_decoder(const char* data_jk)
|
||||
flag_iono_and_GST = true; // set to false externally
|
||||
flag_TOW_set = true; // set to false externally
|
||||
DLOG(INFO) << "flag_tow_set" << flag_TOW_set;
|
||||
nav_bits_word_5 = data_jk_bits.to_string().substr(5, 67);
|
||||
nav_bits_word_5 = data_jk_bits.to_string().substr(6, 67);
|
||||
break;
|
||||
|
||||
case 6: // Word type 6: GST-UTC conversion parameters
|
||||
@ -1050,7 +1058,7 @@ int32_t Galileo_Inav_Message::page_jk_decoder(const char* data_jk)
|
||||
flag_utc_model = true; // set to false externally
|
||||
flag_TOW_set = true; // set to false externally
|
||||
DLOG(INFO) << "flag_tow_set" << flag_TOW_set;
|
||||
nav_bits_word_6 = data_jk_bits.to_string().substr(5, 99);
|
||||
nav_bits_word_6 = data_jk_bits.to_string().substr(6, 99);
|
||||
break;
|
||||
|
||||
case 7: // Word type 7: Almanac for SVID1 (1/2), almanac reference time and almanac reference week number
|
||||
@ -1207,7 +1215,7 @@ int32_t Galileo_Inav_Message::page_jk_decoder(const char* data_jk)
|
||||
DLOG(INFO) << "WN_0G_10= " << WN_0G_10;
|
||||
flag_almanac_4 = true;
|
||||
DLOG(INFO) << "flag_tow_set" << flag_TOW_set;
|
||||
nav_bits_word_10 = data_jk_bits.to_string().substr(85, 42);
|
||||
nav_bits_word_10 = data_jk_bits.to_string().substr(86, 42);
|
||||
break;
|
||||
|
||||
case 16: // Word type 16: Reduced Clock and Ephemeris Data (CED) parameters
|
||||
@ -1387,6 +1395,8 @@ int32_t Galileo_Inav_Message::page_jk_decoder(const char* data_jk)
|
||||
nma_position_filled = std::array<int8_t, 15>{};
|
||||
nma_msg.mack = std::array<uint32_t, 15>{};
|
||||
nma_msg.hkroot = std::array<uint8_t, 15>{};
|
||||
reset_osnma_nav_bits_adkd4();
|
||||
reset_osnma_nav_bits_adkd0_12();
|
||||
}
|
||||
|
||||
return page_number;
|
||||
@ -1407,7 +1417,7 @@ OSNMA_msg Galileo_Inav_Message::get_osnma_msg()
|
||||
nma_position_filled = std::array<int8_t, 15>{};
|
||||
// Fill TOW and WN
|
||||
nma_msg.WN_sf0 = WN_0;
|
||||
int32_t TOW_sf0 = TOW_5 - 24; // TODO - why not TOW_0?
|
||||
int32_t TOW_sf0 = TOW_5 - 24; // according to OS SIS ICD, TOW of word 5 is 25 seconds after Sf start
|
||||
if (TOW_sf0 < 0)
|
||||
{
|
||||
TOW_sf0 += 604800;
|
||||
@ -1435,17 +1445,24 @@ bool Galileo_Inav_Message::have_new_nma()
|
||||
std::string Galileo_Inav_Message::get_osnma_adkd_4_nav_bits()
|
||||
{
|
||||
nav_bits_adkd_4 = nav_bits_word_6 + nav_bits_word_10;
|
||||
nav_bits_word_6 = "";
|
||||
nav_bits_word_10 = "";
|
||||
|
||||
return nav_bits_adkd_4;
|
||||
}
|
||||
std::string Galileo_Inav_Message::get_osnma_adkd_0_12_nav_bits()
|
||||
{
|
||||
nav_bits_adkd_0_12 = nav_bits_word_1 + nav_bits_word_2 + nav_bits_word_3 + nav_bits_word_4 + nav_bits_word_5;
|
||||
return nav_bits_adkd_0_12;
|
||||
}
|
||||
void Galileo_Inav_Message::reset_osnma_nav_bits_adkd0_12()
|
||||
{
|
||||
nav_bits_word_1 = "";
|
||||
nav_bits_word_2 = "";
|
||||
nav_bits_word_3 = "";
|
||||
nav_bits_word_4 = "";
|
||||
nav_bits_word_5 = "";
|
||||
return nav_bits_adkd_0_12;
|
||||
}
|
||||
void Galileo_Inav_Message::reset_osnma_nav_bits_adkd4()
|
||||
{
|
||||
nav_bits_word_6 = "";
|
||||
nav_bits_word_10 = "";
|
||||
}
|
||||
|
@ -143,11 +143,15 @@ public:
|
||||
* @brief Retrieves the OSNMA ADKD 4 NAV bits. Resets the string.
|
||||
*/
|
||||
std::string get_osnma_adkd_4_nav_bits();
|
||||
void reset_osnma_nav_bits_adkd4();
|
||||
bool flag_adkd_4_complete{false};
|
||||
|
||||
/*
|
||||
* @brief Retrieves the OSNMA ADKD 0/12 NAV bits. Resets the string.
|
||||
*/
|
||||
std::string get_osnma_adkd_0_12_nav_bits();
|
||||
void reset_osnma_nav_bits_adkd0_12();
|
||||
bool flag_adkd_0_12_complete{false};
|
||||
|
||||
inline bool get_flag_CRC_test() const
|
||||
{
|
||||
|
@ -37,8 +37,8 @@ void NavData::init(const std::shared_ptr<OSNMA_msg> &osnma_msg)
|
||||
TOW_sf0 = osnma_msg->TOW_sf0;
|
||||
|
||||
// new parsing, directly parsing bits
|
||||
ephemeris_iono_vector_2 = osnma_msg->EphemerisClockAndStatusData_2;
|
||||
utc_vector_2 = osnma_msg->TimingData_2;
|
||||
// ephemeris_iono_vector_2 = osnma_msg->EphemerisClockAndStatusData_2;
|
||||
// utc_vector_2 = osnma_msg->TimingData_2;
|
||||
};
|
||||
void NavData::generate_eph_iono_vector()
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user