mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2025-04-25 12:13:13 +00:00
Fix conflict
This commit is contained in:
commit
1bc6d466c5
@ -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 "
|
||||
@ -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<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)
|
||||
{
|
||||
LOG(INFO) << "Galileo OSNMA: received ADKD=0/12 navData, PRN_d (" << PRNa << ") " << "TOW_sf=" << TOW <<std::endl;
|
||||
d_satellite_nav_data[PRNa][TOW].ephemeris_iono_vector_2 = nav_data;
|
||||
}
|
||||
else if(nav_data.size() == 141)
|
||||
{
|
||||
LOG(INFO) << "Galileo OSNMA: received ADKD=4 navData, PRN_d (" << PRNa << ") " << "TOW_sf=" << TOW <<std::endl;
|
||||
d_satellite_nav_data[PRNa][TOW].utc_vector_2 = nav_data;
|
||||
}
|
||||
else
|
||||
LOG(ERROR) << "osnma_msg_receiver incorrect navData parsing!";
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG(WARNING) << "osnma_msg_receiver received an unknown object type!";
|
||||
LOG(ERROR) << "osnma_msg_receiver received an unknown object type!";
|
||||
}
|
||||
}
|
||||
catch (const wht::bad_any_cast& e)
|
||||
@ -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;
|
||||
@ -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<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 +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<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.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<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 +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<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 +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<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 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<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()
|
||||
{
|
||||
|
@ -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;
|
||||
};
|
||||
/** \} */
|
||||
/** \} */
|
||||
|
@ -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<std::tuple<uint32_t, std::string, uint32_t>>( // < 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<std::tuple<uint32_t, std::string, uint32_t>>( // < 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
|
||||
|
Loading…
x
Reference in New Issue
Block a user