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..8447fb5fc 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 " @@ -109,11 +109,32 @@ void osnma_msg_receiver::msg_handler_osnma(const pmt::pmt_t& msg) std::cout << output_message.str() << std::endl; process_osnma_message(nma_msg); + } + 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) + { + LOG(INFO) << "Galileo OSNMA: received ADKD=0/12 navData, PRN_d (" << PRNa << ") " << "TOW_sf=" << TOW <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; @@ -894,6 +915,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 @@ -923,14 +945,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 +965,37 @@ 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.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 + << ", 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 +1114,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 +1271,46 @@ 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 if (it->second.skipped >= 20) + { + 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() { 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; }; /** \} */ /** \} */ 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 c54d25580..35cb9fd45 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 @@ -224,10 +224,10 @@ 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 + // Fill NavData bits -- Iterate over the extraction parameters // 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; @@ -235,8 +235,19 @@ TEST_F(OsnmaMsgReceiverTest, OsnmaTestVectorsSimulation) uint8_t length = param.second.second; // Extract the required bits and fill osnma block - osnmaMsg_sptr->EphemerisClockAndStatusData_2 += words[wordKey].to_string().substr( - start, length); + 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 << std::endl; + const auto tmp_obj_osnma = std::make_shared>( // < 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)); } } @@ -251,6 +262,7 @@ TEST_F(OsnmaMsgReceiverTest, OsnmaTestVectorsSimulation) {6, {6, 99}}, {10, {86, 42}}}; + std::string nav_data_ADKD_4 = ""; // Fill NavData bits -- Iterate over the extraction parameters for (const auto& param : extractionParams) { @@ -259,9 +271,22 @@ 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 << std::endl; + const auto tmp_obj_osnma = std::make_shared>( // < PRNd , navDataBits, TOW_Sosf> + tv.svId, + nav_data_ADKD_4, + osnmaMsg_sptr->TOW_sf0); + osnma->msg_handler_osnma(pmt::make_any(tmp_obj_osnma)); + } } // Call the handler, as if it came from telemetry decoder block