From c8c7d4c3520164f8425920e378c47bc0c46ef4bd Mon Sep 17 00:00:00 2001 From: cesaaargm Date: Fri, 21 Jun 2024 19:46:49 +0200 Subject: [PATCH 1/3] [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 --- .../galileo_telemetry_decoder_gs.cc | 56 +++++--- src/core/libs/osnma_msg_receiver.cc | 126 +++++++++++++----- src/core/libs/osnma_msg_receiver.h | 2 +- .../system_parameters/galileo_inav_message.cc | 49 ++++--- .../system_parameters/galileo_inav_message.h | 4 + src/core/system_parameters/osnma_data.cc | 4 +- 6 files changed, 172 insertions(+), 69 deletions(-) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.cc index 14e1c52d8..a404a100a 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.cc @@ -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 tmp_obj = std::make_shared(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 <>( // < 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 tmp_obj = std::make_shared(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 tmp_obj = std::make_shared(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 tmp_obj = std::make_shared(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 tmp_obj = std::make_shared(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 <>( // < 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 tmp_obj = std::make_shared(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; } } diff --git a/src/core/libs/osnma_msg_receiver.cc b/src/core/libs/osnma_msg_receiver.cc index 1a9c8cfc7..302609798 100644 --- a/src/core/libs/osnma_msg_receiver.cc +++ b/src/core/libs/osnma_msg_receiver.cc @@ -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).hash_code()) { const auto nma_msg = wht::any_cast>(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>).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>>(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_ptrPRN,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(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(it.second.ADKD) + << ", PRNa=" + << static_cast(it.second.PRNa) + << ", PRNd=" + << static_cast(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(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(it.second.ADKD) + << ", PRNa=" + << static_cast(it.second.PRNa) + << ", PRNd=" + << static_cast(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(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(it.second.ADKD) + << ", PRNa=" + << static_cast(it.second.PRNa) + << ", PRNd=" + << static_cast(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(tag.ADKD) + << ", PRNa=" + << static_cast(tag.PRNa) + << ", PRNd=" + << static_cast(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(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(it->second.ADKD) + << ", PRNa=" + << static_cast(it->second.PRNa) + << ", PRNd=" + << static_cast(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. diff --git a/src/core/libs/osnma_msg_receiver.h b/src/core/libs/osnma_msg_receiver.h index d7aeb9df4..4e662ef55 100644 --- a/src/core/libs/osnma_msg_receiver.h +++ b/src/core/libs/osnma_msg_receiver.h @@ -83,7 +83,7 @@ private: bool tag_has_nav_data_available(Tag& t); bool tag_has_key_available(Tag& t); - std::map> d_satellite_nav_data; // map holding NavData sorted by SVID and TOW. + std::map> d_satellite_nav_data; // map holding NavData sorted by SVID (first key) and TOW (second key). std::map> d_tesla_keys; // tesla keys over time, sorted by TOW std::vector d_macks_awaiting_MACSEQ_verification; std::multimap d_tags_awaiting_verify; // container with tags to verify from arbitrary SVIDs, sorted by TOW diff --git a/src/core/system_parameters/galileo_inav_message.cc b/src/core/system_parameters/galileo_inav_message.cc index 442f67178..baa140149 100644 --- a/src/core/system_parameters/galileo_inav_message.cc +++ b/src/core/system_parameters/galileo_inav_message.cc @@ -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{}; nma_msg.mack = std::array{}; nma_msg.hkroot = std::array{}; @@ -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& 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& 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& 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& 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{}; nma_msg.hkroot = std::array{}; nma_position_filled = std::array{}; + 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{}; nma_msg.mack = std::array{}; nma_msg.hkroot = std::array{}; + 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{}; // 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 = ""; } diff --git a/src/core/system_parameters/galileo_inav_message.h b/src/core/system_parameters/galileo_inav_message.h index 19999a735..a4cc6a31a 100644 --- a/src/core/system_parameters/galileo_inav_message.h +++ b/src/core/system_parameters/galileo_inav_message.h @@ -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 { diff --git a/src/core/system_parameters/osnma_data.cc b/src/core/system_parameters/osnma_data.cc index 4424c55ba..49051b7be 100644 --- a/src/core/system_parameters/osnma_data.cc +++ b/src/core/system_parameters/osnma_data.cc @@ -37,8 +37,8 @@ void NavData::init(const std::shared_ptr &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() { From f1e616c4e5e556e83fb49821875e62792fb4e5f7 Mon Sep 17 00:00:00 2001 From: cesaaargm Date: Sat, 22 Jun 2024 14:04:08 +0200 Subject: [PATCH 2/3] =?UTF-8?q?[TAS-226]=20[FEAT]=20Remove=20tags=20skippe?= =?UTF-8?q?d=20=E2=89=A5=2010=20times?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/libs/osnma_msg_receiver.cc | 25 ++++++++++++++++++++++--- src/core/system_parameters/osnma_data.h | 5 +++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/core/libs/osnma_msg_receiver.cc b/src/core/libs/osnma_msg_receiver.cc index 302609798..02c3d48e4 100644 --- a/src/core/libs/osnma_msg_receiver.cc +++ b/src/core/libs/osnma_msg_receiver.cc @@ -109,8 +109,6 @@ void osnma_msg_receiver::msg_handler_osnma(const pmt::pmt_t& msg) std::cout << output_message.str() << std::endl; 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>).hash_code()) { @@ -915,6 +913,7 @@ void osnma_msg_receiver::process_mack_message() d_tags_awaiting_verify.insert(std::pair(mack->TOW, t)); LOG(WARNING) << "Galileo OSNMA: MACSEQ verification :: SUCCESS for Mack at TOW=" << mack->TOW << ", PRN" << mack->PRNa; } + std::cout << "Galileo OSNMA: d_tags_awaiting_verify :: size: " << d_tags_awaiting_verify.size() << std::endl; mack = d_macks_awaiting_MACSEQ_verification.erase(mack); } else @@ -980,7 +979,8 @@ void osnma_msg_receiver::process_mack_message() } } else { - LOG(WARNING) << "Galileo OSNMA: Tag verification :: SKIPPED for Tag Id= " + it.second.skipped ++; + LOG(WARNING) << "Galileo OSNMA: Tag verification :: SKIPPED (x"<< it.second.skipped <<")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 @@ -1286,6 +1286,25 @@ void osnma_msg_receiver::remove_verified_tags() << std::endl; it = d_tags_awaiting_verify.erase(it); } + else if (it->second.skipped >= 10) + { + 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(it->second.ADKD) + << ", PRNa=" + << static_cast(it->second.PRNa) + << ", PRNd=" + << static_cast(it->second.PRN_d) + << ", status= " + << it->second.status + << std::endl; + it = d_tags_awaiting_verify.erase(it); + } else ++it; } diff --git a/src/core/system_parameters/osnma_data.h b/src/core/system_parameters/osnma_data.h index cf9bcb7d9..b27f6dfb3 100644 --- a/src/core/system_parameters/osnma_data.h +++ b/src/core/system_parameters/osnma_data.h @@ -182,8 +182,8 @@ public: computed_tag(0), PRN_d(MTI.tag_info.PRN_d), ADKD(MTI.tag_info.ADKD), - cop(MTI.tag_info.cop) - + cop(MTI.tag_info.cop), + skipped(0) { } @@ -201,6 +201,7 @@ public: uint8_t PRN_d; uint8_t ADKD; uint8_t cop; + uint32_t skipped; }; /** \} */ /** \} */ From 849a900adfde07030ed9a84e62270b754b7c830c Mon Sep 17 00:00:00 2001 From: cesaaargm Date: Sat, 22 Jun 2024 14:54:08 +0200 Subject: [PATCH 3/3] [TAS-228] [FEAT] adapt osnma test vector to new navData passing All tags either verified SUCCESSFULLY or Skipped. Skipping issue still present. --- src/core/libs/osnma_msg_receiver.cc | 6 ++-- .../osnma/osnma_msg_receiver_test.cc | 31 +++++++++++++++++-- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/core/libs/osnma_msg_receiver.cc b/src/core/libs/osnma_msg_receiver.cc index 02c3d48e4..8447fb5fc 100644 --- a/src/core/libs/osnma_msg_receiver.cc +++ b/src/core/libs/osnma_msg_receiver.cc @@ -121,10 +121,12 @@ void osnma_msg_receiver::msg_handler_osnma(const pmt::pmt_t& msg) // iono data => 549 bits, utc data, 141 bits. if(nav_data.size() == 549) { + LOG(INFO) << "Galileo OSNMA: received ADKD=0/12 navData, PRN_d (" << PRNa << ") " << "TOW_sf=" << TOW <second.skipped >= 10) + else if (it->second.skipped >= 20) { LOG(INFO) << "Galileo OSNMA: Tag verification :: DELETE tag Id=" << it->second.tag_id diff --git a/src/tests/unit-tests/signal-processing-blocks/osnma/osnma_msg_receiver_test.cc b/src/tests/unit-tests/signal-processing-blocks/osnma/osnma_msg_receiver_test.cc index 226e8e892..ec89911ce 100644 --- a/src/tests/unit-tests/signal-processing-blocks/osnma/osnma_msg_receiver_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/osnma/osnma_msg_receiver_test.cc @@ -225,20 +225,32 @@ TEST_F(OsnmaMsgReceiverTest, OsnmaTestVectorsSimulation) {3, {6, 122}}, {4, {6, 120}}, {5, {6, 67}}, - // TODO words 6 and 10 for TimingData }; // Fill NavData bits -- Iterate over the extraction parameters + std::string nav_data_ADKD_0_12 = ""; for (const auto& param : extractionParams) { uint8_t wordKey = param.first; uint8_t start = param.second.first; uint8_t length = param.second.second; // Extract the required bits and fill osnma block - osnmaMsg_sptr->EphemerisClockAndStatusData_2 += words[wordKey]. + nav_data_ADKD_0_12 += words[wordKey]. to_string().substr( start, length); } + // send to osnma block + bool check_size_is_ok = nav_data_ADKD_0_12.size() == 549; + if(check_size_is_ok) + { + std::cout << "Galileo OSNMA: sending ADKD=0/12 navData, PRN_d (" << tv.svId << ") " << "TOW_sf=" << osnmaMsg_sptr->TOW_sf0 <>( // < PRNd , navDataBits, TOW_Sosf> + tv.svId, + nav_data_ADKD_0_12, + osnmaMsg_sptr->TOW_sf0); + osnma->msg_handler_osnma(pmt::make_any(tmp_obj_osnma)); + + } } // check w6 && w10 is received => fill TimingData data vector @@ -252,6 +264,7 @@ TEST_F(OsnmaMsgReceiverTest, OsnmaTestVectorsSimulation) {10, {86, 42}} }; + std::string nav_data_ADKD_4 = ""; // Fill NavData bits -- Iterate over the extraction parameters for (const auto& param : extractionParams) { @@ -260,9 +273,21 @@ TEST_F(OsnmaMsgReceiverTest, OsnmaTestVectorsSimulation) uint8_t length = param.second.second; // Extract the required bits and fill osnma block - osnmaMsg_sptr->TimingData_2 += words[wordKey].to_string().substr( + nav_data_ADKD_4 += words[wordKey].to_string().substr( start, length); } + // send to osnma block + bool check_size_is_ok = nav_data_ADKD_4.size() == 141; + if(check_size_is_ok) + { + std::cout << "Galileo OSNMA: sending ADKD=04 navData, PRN_d (" << tv.svId << ") " << "TOW_sf=" << osnmaMsg_sptr->TOW_sf0 <>( // < PRNd , navDataBits, TOW_Sosf> + tv.svId, + nav_data_ADKD_4, + osnmaMsg_sptr->TOW_sf0); + osnma->msg_handler_osnma(pmt::make_any(tmp_obj_osnma)); + + } }