From 18006bbbe91c4576fba94c1cfbdf46ac2b4f438d Mon Sep 17 00:00:00 2001 From: Mathieu Favreau Date: Wed, 23 Jul 2025 19:05:11 +0000 Subject: [PATCH 01/11] First pass to remove receiver_type --- src/algorithms/PVT/adapters/rtklib_pvt.cc | 2 +- .../PVT/gnuradio_blocks/rtklib_pvt_gs.cc | 29 +- .../PVT/gnuradio_blocks/rtklib_pvt_gs.h | 2 +- src/algorithms/PVT/libs/pvt_conf.h | 2 +- src/algorithms/PVT/libs/receiver_type.cc | 26 +- src/algorithms/PVT/libs/receiver_type.h | 22 +- src/algorithms/PVT/libs/rinex_printer.cc | 1788 ++++++----------- src/algorithms/PVT/libs/rinex_printer.h | 14 +- src/algorithms/PVT/libs/rtklib_solver.cc | 80 +- src/algorithms/PVT/libs/rtklib_solver.h | 4 +- .../pvt/nmea_printer_test.cc | 5 +- .../pvt/rinex_printer_test.cc | 99 +- 12 files changed, 727 insertions(+), 1346 deletions(-) diff --git a/src/algorithms/PVT/adapters/rtklib_pvt.cc b/src/algorithms/PVT/adapters/rtklib_pvt.cc index d8fc7236d..73d9cb84f 100644 --- a/src/algorithms/PVT/adapters/rtklib_pvt.cc +++ b/src/algorithms/PVT/adapters/rtklib_pvt.cc @@ -191,7 +191,7 @@ Rtklib_Pvt::Rtklib_Pvt(const ConfigurationInterface* configuration, pvt_output_parameters.an_rate_ms = configuration->property(role + ".an_rate_ms", pvt_output_parameters.an_rate_ms); const Signal_Enabled_Flags signal_enabled_flags(configuration); - pvt_output_parameters.type_of_receiver = get_type_of_receiver(signal_enabled_flags); + pvt_output_parameters.signal_enabled_flags = signal_enabled_flags.flags; // RTKLIB PVT solver options // Settings 1 diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc index ebd2178bf..513af549d 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc @@ -54,6 +54,7 @@ #include "nmea_printer.h" #include "osnma_data.h" #include "pvt_conf.h" +#include "receiver_type.h" #include "rinex_printer.h" #include "rtcm_printer.h" #include "rtklib_rtkcmn.h" @@ -169,7 +170,7 @@ rtklib_pvt_gs::rtklib_pvt_gs(uint32_t nchannels, d_report_rate_ms(1000), d_max_obs_block_rx_clock_offset_ms(conf_.max_obs_block_rx_clock_offset_ms), d_nchannels(nchannels), - d_type_of_rx(conf_.type_of_receiver), + d_signal_enabled_flags(conf_.signal_enabled_flags), d_observable_interval_ms(conf_.observable_interval_ms), d_pvt_errors_counter(0), d_dump(conf_.dump), @@ -455,8 +456,10 @@ rtklib_pvt_gs::rtklib_pvt_gs(uint32_t nchannels, d_xml_base_path = d_xml_base_path + fs::path::preferred_separator; } + const Signal_Enabled_Flags signal_enabled_flags(d_signal_enabled_flags); + // Initialize HAS simple printer - d_enable_has_messages = (((d_type_of_rx >= 100) && (d_type_of_rx < 109)) && (conf_.output_enabled)); + d_enable_has_messages = (signal_enabled_flags.check_any_enabled(GAL_E6) && (conf_.output_enabled)); if (d_enable_has_messages) { d_has_simple_printer = std::make_unique(conf_.has_output_file_path); @@ -573,19 +576,19 @@ rtklib_pvt_gs::rtklib_pvt_gs(uint32_t nchannels, { // setup two PVT solvers: internal solver for rx clock and user solver // user PVT solver - d_user_pvt_solver = std::make_shared(rtk, conf_, dump_ls_pvt_filename, d_type_of_rx, d_dump, d_dump_mat); + d_user_pvt_solver = std::make_shared(rtk, conf_, dump_ls_pvt_filename, d_signal_enabled_flags, d_dump, d_dump_mat); d_user_pvt_solver->set_pre_2009_file(conf_.pre_2009_file); // internal PVT solver, mainly used to estimate the receiver clock rtk_t internal_rtk = rtk; internal_rtk.opt.mode = PMODE_SINGLE; // use single positioning mode in internal PVT solver - d_internal_pvt_solver = std::make_shared(internal_rtk, conf_, dump_ls_pvt_filename, d_type_of_rx, false, false); + d_internal_pvt_solver = std::make_shared(internal_rtk, conf_, dump_ls_pvt_filename, d_signal_enabled_flags, false, false); d_internal_pvt_solver->set_pre_2009_file(conf_.pre_2009_file); } else { // only one solver, customized by the user options - d_internal_pvt_solver = std::make_shared(rtk, conf_, dump_ls_pvt_filename, d_type_of_rx, d_dump, d_dump_mat); + d_internal_pvt_solver = std::make_shared(rtk, conf_, dump_ls_pvt_filename, d_signal_enabled_flags, d_dump, d_dump_mat); d_internal_pvt_solver->set_pre_2009_file(conf_.pre_2009_file); d_user_pvt_solver = d_internal_pvt_solver; } @@ -1232,7 +1235,7 @@ void rtklib_pvt_gs::msg_handler_telemetry(const pmt::pmt_t& msg) // New record! std::map new_eph; new_eph[gps_eph->PRN] = *gps_eph; - d_rp->log_rinex_nav_gps_nav(d_type_of_rx, new_eph); + d_rp->log_rinex_nav_gps_nav(d_signal_enabled_flags, new_eph); } } d_internal_pvt_solver->gps_ephemeris_map[gps_eph->PRN] = *gps_eph; @@ -1300,7 +1303,7 @@ void rtklib_pvt_gs::msg_handler_telemetry(const pmt::pmt_t& msg) // New record! std::map new_cnav_eph; new_cnav_eph[gps_cnav_ephemeris->PRN] = *gps_cnav_ephemeris; - d_rp->log_rinex_nav_gps_cnav(d_type_of_rx, new_cnav_eph); + d_rp->log_rinex_nav_gps_cnav(d_signal_enabled_flags, new_cnav_eph); } } d_internal_pvt_solver->gps_cnav_ephemeris_map[gps_cnav_ephemeris->PRN] = *gps_cnav_ephemeris; @@ -1392,7 +1395,7 @@ void rtklib_pvt_gs::msg_handler_telemetry(const pmt::pmt_t& msg) // New record! std::map new_gal_eph; new_gal_eph[galileo_eph->PRN] = *galileo_eph; - d_rp->log_rinex_nav_gal_nav(d_type_of_rx, new_gal_eph); + d_rp->log_rinex_nav_gal_nav(d_signal_enabled_flags, new_gal_eph); } } d_internal_pvt_solver->galileo_ephemeris_map[galileo_eph->PRN] = *galileo_eph; @@ -1515,7 +1518,7 @@ void rtklib_pvt_gs::msg_handler_telemetry(const pmt::pmt_t& msg) // New record! std::map new_glo_eph; new_glo_eph[glonass_gnav_eph->PRN] = *glonass_gnav_eph; - d_rp->log_rinex_nav_glo_gnav(d_type_of_rx, new_glo_eph); + d_rp->log_rinex_nav_glo_gnav(d_signal_enabled_flags, new_glo_eph); } } d_internal_pvt_solver->glonass_gnav_ephemeris_map[glonass_gnav_eph->PRN] = *glonass_gnav_eph; @@ -1578,7 +1581,7 @@ void rtklib_pvt_gs::msg_handler_telemetry(const pmt::pmt_t& msg) // New record! std::map new_bds_eph; new_bds_eph[bds_dnav_eph->PRN] = *bds_dnav_eph; - d_rp->log_rinex_nav_bds_dnav(d_type_of_rx, new_bds_eph); + d_rp->log_rinex_nav_bds_dnav(d_signal_enabled_flags, new_bds_eph); } } d_internal_pvt_solver->beidou_dnav_ephemeris_map[bds_dnav_eph->PRN] = *bds_dnav_eph; @@ -2451,14 +2454,16 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item } if (d_rinex_output_enabled) { - d_rp->print_rinex_annotation(d_user_pvt_solver.get(), d_gnss_observables_map, d_rx_time, d_type_of_rx, flag_write_RINEX_obs_output); + d_rp->print_rinex_annotation(d_user_pvt_solver.get(), d_gnss_observables_map, d_rx_time, d_signal_enabled_flags, flag_write_RINEX_obs_output); } if (d_rtcm_enabled) { + const Signal_Enabled_Flags flags(d_signal_enabled_flags); + d_rtcm_printer->Print_Rtcm_Messages(d_user_pvt_solver.get(), d_gnss_observables_map, d_rx_time, - d_type_of_rx, + get_type_of_receiver(flags), d_rtcm_MSM_rate_ms, d_rtcm_MT1019_rate_ms, d_rtcm_MT1020_rate_ms, diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h index 4f2692f6e..c1bc01e66 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h @@ -262,7 +262,7 @@ private: int32_t d_max_obs_block_rx_clock_offset_ms; uint32_t d_nchannels; - uint32_t d_type_of_rx; + uint32_t d_signal_enabled_flags; uint32_t d_observable_interval_ms; uint32_t d_pvt_errors_counter; diff --git a/src/algorithms/PVT/libs/pvt_conf.h b/src/algorithms/PVT/libs/pvt_conf.h index f7dbfea0a..a9da84313 100644 --- a/src/algorithms/PVT/libs/pvt_conf.h +++ b/src/algorithms/PVT/libs/pvt_conf.h @@ -52,7 +52,7 @@ public: std::string udp_eph_addresses; std::string log_source_timetag_file; - uint32_t type_of_receiver = 0; + uint32_t signal_enabled_flags = 0; uint32_t observable_interval_ms = 20; int32_t output_rate_ms = 0; diff --git a/src/algorithms/PVT/libs/receiver_type.cc b/src/algorithms/PVT/libs/receiver_type.cc index 740188a23..7f36b0c68 100644 --- a/src/algorithms/PVT/libs/receiver_type.cc +++ b/src/algorithms/PVT/libs/receiver_type.cc @@ -18,8 +18,12 @@ #include "configuration_interface.h" // for ConfigurationInterface #include // for vector -Signal_Enabled_Flags::Signal_Enabled_Flags(const ConfigurationInterface* configuration) : flags_(0) +namespace { +uint32_t flags_from_config(const ConfigurationInterface* configuration) +{ + uint32_t flags = 0; + const std::vector> signal_flag_to_prop = { {GPS_1C, "Channels_1C.count"}, {GPS_2S, "Channels_2S.count"}, @@ -33,22 +37,30 @@ Signal_Enabled_Flags::Signal_Enabled_Flags(const ConfigurationInterface* configu {BDS_B1, "Channels_B1.count"}, {BDS_B3, "Channels_B3.count"}}; -#if NO_FOLD_EXPRESSIONS for (const auto& pair_aux : signal_flag_to_prop) { auto flag = pair_aux.first; auto prop = pair_aux.second; -#else - for (const auto& [flag, prop] : signal_flag_to_prop) - { -#endif const auto enabled = configuration->property(prop, 0) > 0; if (enabled) { - flags_ |= flag; + flags |= flag; } } + + return flags; +} +} // namespace + + +Signal_Enabled_Flags::Signal_Enabled_Flags(const ConfigurationInterface* configuration) : flags(flags_from_config(configuration)) +{ +} + + +Signal_Enabled_Flags::Signal_Enabled_Flags(uint32_t flags_) : flags(flags_) +{ } diff --git a/src/algorithms/PVT/libs/receiver_type.h b/src/algorithms/PVT/libs/receiver_type.h index 5008a988e..881e2a4b0 100644 --- a/src/algorithms/PVT/libs/receiver_type.h +++ b/src/algorithms/PVT/libs/receiver_type.h @@ -40,8 +40,8 @@ class Signal_Enabled_Flags { public: explicit Signal_Enabled_Flags(const ConfigurationInterface* configuration); + explicit Signal_Enabled_Flags(uint32_t flags_); -#if NO_FOLD_EXPRESSIONS template uint32_t or_all(const T& value) const { @@ -57,30 +57,16 @@ public: template bool check_only_enabled(const Args&... args) const { - return (flags_ ^ or_all(args...)) == 0; + return (flags ^ or_all(args...)) == 0; } template bool check_any_enabled(const Args&... args) const { - return (flags_ & or_all(args...)) > 0; - } -#else - template - bool check_only_enabled(const Args&... args) const - { - return (flags_ ^ (args | ...)) == 0; + return (flags & or_all(args...)) > 0; } - template - bool check_any_enabled(const Args&... args) const - { - return (flags_ & (args | ...)) > 0; - } -#endif - -private: - uint32_t flags_; + const uint32_t flags; }; // Infer the type of receiver diff --git a/src/algorithms/PVT/libs/rinex_printer.cc b/src/algorithms/PVT/libs/rinex_printer.cc index 6abca2750..c8b7ce453 100644 --- a/src/algorithms/PVT/libs/rinex_printer.cc +++ b/src/algorithms/PVT/libs/rinex_printer.cc @@ -16,10 +16,7 @@ */ #include "rinex_printer.h" -#include "Beidou_DNAV.h" #include "GLONASS_L1_L2_CA.h" -#include "GPS_L1_CA.h" -#include "Galileo_E1.h" #include "beidou_dnav_ephemeris.h" #include "beidou_dnav_iono.h" #include "beidou_dnav_utc_model.h" @@ -38,6 +35,7 @@ #include "gps_iono.h" #include "gps_navigation_message.h" #include "gps_utc_model.h" +#include "receiver_type.h" #include "rtklib_solver.h" #include #include @@ -47,7 +45,6 @@ #include // for floor #include #include // for cout -#include #include #include #include // for getlogin_r() @@ -296,1263 +293,684 @@ Rinex_Printer::~Rinex_Printer() } } - -void Rinex_Printer::print_rinex_annotation(const Rtklib_Solver* pvt_solver, const std::map& gnss_observables_map, double rx_time, int type_of_rx, bool flag_write_RINEX_obs_output) +namespace { - std::map::const_iterator galileo_ephemeris_iter; - std::map::const_iterator gps_ephemeris_iter; - std::map::const_iterator gps_cnav_ephemeris_iter; - std::map::const_iterator glonass_gnav_ephemeris_iter; - std::map::const_iterator beidou_dnav_ephemeris_iter; +std::string enabled_signal_flags_to_string(const Signal_Enabled_Flags& flags) +{ + std::vector signal_str_vector; + + if (flags.check_any_enabled(GPS_1C)) + { + signal_str_vector.emplace_back("1C"); + } + if (flags.check_any_enabled(GPS_2S)) + { + signal_str_vector.emplace_back("2S"); + } + if (flags.check_any_enabled(GPS_L5)) + { + signal_str_vector.emplace_back("L5"); + } + if (flags.check_any_enabled(GAL_1B)) + { + signal_str_vector.emplace_back("1B"); + } + if (flags.check_any_enabled(GAL_E5a)) + { + signal_str_vector.emplace_back("5X"); + } + if (flags.check_any_enabled(GAL_E5b)) + { + signal_str_vector.emplace_back("7X"); + } + if (flags.check_any_enabled(GAL_E6)) + { + signal_str_vector.emplace_back("E6"); + } + if (flags.check_any_enabled(GLO_1G)) + { + signal_str_vector.emplace_back("1G"); + } + if (flags.check_any_enabled(GLO_2G)) + { + signal_str_vector.emplace_back("2G"); + } + if (flags.check_any_enabled(BDS_B1)) + { + signal_str_vector.emplace_back("B1"); + } + if (flags.check_any_enabled(BDS_B3)) + { + signal_str_vector.emplace_back("B3"); + } + + std::ostringstream oss; + + for (size_t i = 0; i < signal_str_vector.size(); ++i) + { + oss << signal_str_vector[i]; + if (i != signal_str_vector.size() - 1) + { + oss << ' '; + } + } + + return oss.str(); +} +} // namespace + +void Rinex_Printer::print_rinex_annotation(const Rtklib_Solver* pvt_solver, + const std::map& gnss_observables_map, + double rx_time, + uint32_t signal_enabled_flags, + bool flag_write_RINEX_obs_output) +{ + const auto galileo_ephemeris_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + const auto gps_ephemeris_iter = pvt_solver->gps_ephemeris_map.cbegin(); + const auto gps_cnav_ephemeris_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin(); + const auto glonass_gnav_ephemeris_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); + const auto beidou_dnav_ephemeris_iter = pvt_solver->beidou_dnav_ephemeris_map.cbegin(); + + const Signal_Enabled_Flags flags(signal_enabled_flags); + const auto signal = enabled_signal_flags_to_string(flags); + const auto has_gps = flags.check_any_enabled(GPS_1C, GPS_2S, GPS_L5); + const auto has_galileo = flags.check_any_enabled(GAL_1B, GAL_E5a, GAL_E5b, GAL_E6); + const auto has_glonass = flags.check_any_enabled(GLO_1G, GLO_2G); + const auto has_beidou = flags.check_any_enabled(BDS_B1, BDS_B3); + const auto only_galileo = has_galileo && !(has_gps || has_glonass || has_beidou); + const auto only_glonass = has_glonass && !(has_gps || has_galileo || has_beidou); + const auto only_beidou = has_beidou && !(has_gps || has_galileo || has_glonass); + if (!d_rinex_header_written) // & we have utc data in nav message! { - galileo_ephemeris_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - gps_ephemeris_iter = pvt_solver->gps_ephemeris_map.cbegin(); - gps_cnav_ephemeris_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin(); - glonass_gnav_ephemeris_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - beidou_dnav_ephemeris_iter = pvt_solver->beidou_dnav_ephemeris_map.cbegin(); - switch (type_of_rx) + bool rinex_header_written = true; + + if (flags.check_only_enabled(GPS_1C) && + gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) { - case 1: // GPS L1 C/A only - if (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) + rinex_obs_header(obsFile, gps_ephemeris_iter->second, rx_time); + rinex_nav_header(navFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second); + output_navfilename.push_back(navfilename); + log_rinex_nav(navFile, pvt_solver->gps_ephemeris_map); + } + else if ((flags.check_only_enabled(GPS_2S) || flags.check_only_enabled(GPS_L5)) && + gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) + { + rinex_obs_header(obsFile, gps_cnav_ephemeris_iter->second, rx_time, signal); + rinex_nav_header(navFile, pvt_solver->gps_cnav_iono, pvt_solver->gps_cnav_utc_model); + output_navfilename.push_back(navfilename); + log_rinex_nav(navFile, pvt_solver->gps_cnav_ephemeris_map); + } + else if (only_galileo && galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + rinex_obs_header(obsFile, galileo_ephemeris_iter->second, rx_time, signal); + rinex_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); + output_navfilename.push_back(navGalfilename); + log_rinex_nav(navGalFile, pvt_solver->galileo_ephemeris_map); + } + else if (only_glonass && glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + rinex_obs_header(obsFile, glonass_gnav_ephemeris_iter->second, rx_time, signal); + rinex_nav_header(navGloFile, pvt_solver->glonass_gnav_utc_model, glonass_gnav_ephemeris_iter->second); + output_navfilename.push_back(navGlofilename); + log_rinex_nav(navGloFile, pvt_solver->glonass_gnav_ephemeris_map); + } + else if (only_beidou && beidou_dnav_ephemeris_iter != pvt_solver->beidou_dnav_ephemeris_map.cend()) + { + rinex_obs_header(obsFile, beidou_dnav_ephemeris_iter->second, rx_time, signal); + rinex_nav_header(navFile, pvt_solver->beidou_dnav_iono, pvt_solver->beidou_dnav_utc_model); + output_navfilename.push_back(navBdsfilename); + log_rinex_nav(navFile, pvt_solver->beidou_dnav_ephemeris_map); + } + else if ((flags.check_only_enabled(GPS_1C, GPS_2S) || + flags.check_only_enabled(GPS_1C, GPS_L5) || + flags.check_only_enabled(GPS_1C, GPS_2S, GPS_L5)) && + gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend() && + gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) + { + rinex_obs_header(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, rx_time, signal); + rinex_nav_header(navFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second); + output_navfilename.push_back(navfilename); + + if (flags.check_any_enabled(GPS_L5)) { + log_rinex_nav(navFile, pvt_solver->gps_ephemeris_map); + } + else + { + log_rinex_nav(navFile, pvt_solver->gps_cnav_ephemeris_map); + } + } + else if ((flags.check_only_enabled(GPS_1C, GAL_1B) || flags.check_only_enabled(GPS_1C, GAL_E5a) || flags.check_only_enabled(GPS_1C, GAL_E5b)) && + gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend() && + galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + rinex_obs_header(obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, signal); + rinex_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); + output_navfilename.push_back(navMixfilename); + log_rinex_nav(navMixFile, pvt_solver->gps_ephemeris_map, pvt_solver->galileo_ephemeris_map); + } + else if (flags.check_only_enabled(GPS_L5, GAL_E5a) && + gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend() && + galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + rinex_obs_header(obsFile, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, signal, signal); + rinex_nav_header(navMixFile, pvt_solver->gps_cnav_iono, pvt_solver->gps_cnav_utc_model, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); + output_navfilename.push_back(navMixfilename); + log_rinex_nav(navMixFile, pvt_solver->gps_cnav_ephemeris_map, pvt_solver->galileo_ephemeris_map); + } + else if ((flags.check_only_enabled(GPS_1C, GLO_1G) || flags.check_only_enabled(GPS_1C, GLO_2G)) && + gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend() && + glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + rinex_obs_header(obsFile, gps_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, signal); + if (d_version == 3) + { + rinex_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); + output_navfilename.push_back(navMixfilename); + log_rinex_nav(navMixFile, pvt_solver->gps_ephemeris_map, pvt_solver->glonass_gnav_ephemeris_map); + } + if (d_version == 2) + { + rinex_nav_header(navFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second); + rinex_nav_header(navGloFile, pvt_solver->glonass_gnav_utc_model, glonass_gnav_ephemeris_iter->second); + output_navfilename.push_back(navfilename); + output_navfilename.push_back(navGlofilename); + log_rinex_nav(navFile, pvt_solver->gps_ephemeris_map); + log_rinex_nav(navGloFile, pvt_solver->glonass_gnav_ephemeris_map); + } + } + else if ((flags.check_only_enabled(GLO_1G, GPS_2S) || flags.check_only_enabled(GLO_2G, GPS_2S)) && + gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend() && + glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + rinex_obs_header(obsFile, gps_cnav_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, signal); + rinex_nav_header(navMixFile, pvt_solver->gps_cnav_iono, pvt_solver->gps_cnav_utc_model, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); + output_navfilename.push_back(navfilename); + log_rinex_nav(navMixFile, pvt_solver->gps_cnav_ephemeris_map, pvt_solver->glonass_gnav_ephemeris_map); + } + else if ((flags.check_only_enabled(GAL_1B, GLO_1G) || flags.check_only_enabled(GAL_1B, GLO_2G)) && + galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend() && + glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + rinex_obs_header(obsFile, galileo_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, signal, signal); + rinex_nav_header(navMixFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); + output_navfilename.push_back(navMixfilename); + log_rinex_nav(navMixFile, pvt_solver->galileo_ephemeris_map, pvt_solver->glonass_gnav_ephemeris_map); + } + else if ((flags.check_only_enabled(GPS_1C, GAL_1B, GPS_L5, GAL_E5a) || + flags.check_only_enabled(GPS_1C, GAL_1B, GPS_L5, GAL_E5a, GAL_E6) || + flags.check_only_enabled(GPS_1C, GAL_1B, GPS_2S, GPS_L5, GAL_E5a)) && + gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend() && + gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend() && + galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + rinex_obs_header(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, signal, signal); + rinex_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); + output_navfilename.push_back(navMixfilename); + log_rinex_nav(navMixFile, pvt_solver->gps_ephemeris_map, pvt_solver->galileo_ephemeris_map); + } + else if ((flags.check_only_enabled(GPS_1C, GAL_1B, GAL_E5a) || flags.check_only_enabled(GPS_1C, GAL_1B, GAL_E5b)) && + gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend() && + galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + rinex_obs_header(obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, signal); + rinex_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); + output_navfilename.push_back(navMixfilename); + log_rinex_nav(navMixFile, pvt_solver->gps_ephemeris_map, pvt_solver->galileo_ephemeris_map); + } + else if (flags.check_only_enabled(GPS_1C, GAL_E6) && + gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) + { + if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + // we have Galileo ephemeris, maybe from assistance + rinex_obs_header(obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, signal); + rinex_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); + output_navfilename.push_back(navMixfilename); + log_rinex_nav(navMixFile, pvt_solver->gps_ephemeris_map, pvt_solver->galileo_ephemeris_map); + } + else + { + // we do not have galileo ephemeris, print only GPS data rinex_obs_header(obsFile, gps_ephemeris_iter->second, rx_time); rinex_nav_header(navFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second); output_navfilename.push_back(navfilename); log_rinex_nav(navFile, pvt_solver->gps_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore } - break; - case 2: // GPS L2C only - if (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) - { - const std::string signal("2S"); - rinex_obs_header(obsFile, gps_cnav_ephemeris_iter->second, rx_time, signal); - rinex_nav_header(navFile, pvt_solver->gps_cnav_iono, pvt_solver->gps_cnav_utc_model); - output_navfilename.push_back(navfilename); - log_rinex_nav(navFile, pvt_solver->gps_cnav_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 3: // GPS L5 only - if (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) - { - const std::string signal("L5"); - rinex_obs_header(obsFile, gps_cnav_ephemeris_iter->second, rx_time, signal); - rinex_nav_header(navFile, pvt_solver->gps_cnav_iono, pvt_solver->gps_cnav_utc_model); - output_navfilename.push_back(navfilename); - log_rinex_nav(navFile, pvt_solver->gps_cnav_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 4: // Galileo E1B only - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - rinex_obs_header(obsFile, galileo_ephemeris_iter->second, rx_time); - rinex_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navGalfilename); - log_rinex_nav(navGalFile, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 5: // Galileo E5a only - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - const std::string signal("5X"); - rinex_obs_header(obsFile, galileo_ephemeris_iter->second, rx_time, signal); - rinex_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navGalfilename); - log_rinex_nav(navGalFile, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 6: // Galileo E5b only - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - const std::string signal("7X"); - rinex_obs_header(obsFile, galileo_ephemeris_iter->second, rx_time, signal); - rinex_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navGalfilename); - log_rinex_nav(navGalFile, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 7: // GPS L1 C/A + GPS L2C - if ((gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) && (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - const std::string signal("1C 2S"); - rinex_obs_header(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, rx_time, signal); - rinex_nav_header(navFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second); - output_navfilename.push_back(navfilename); - log_rinex_nav(navFile, pvt_solver->gps_cnav_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 8: // GPS L1 + GPS L5 - if ((gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) && (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - const std::string signal("1C L5"); - rinex_obs_header(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, rx_time, signal); - rinex_nav_header(navFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second); - output_navfilename.push_back(navfilename); - log_rinex_nav(navFile, pvt_solver->gps_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 9: // GPS L1 C/A + Galileo E1B - if ((galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) && (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend())) - { - const std::string gal_signal("1B"); - rinex_obs_header(obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gal_signal); - rinex_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navMixfilename); - log_rinex_nav(navMixFile, pvt_solver->gps_ephemeris_map, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 10: // GPS L1 C/A + Galileo E5a - if ((galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) && (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend())) - { - const std::string gal_signal("5X"); - rinex_obs_header(obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gal_signal); - rinex_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navMixfilename); - log_rinex_nav(navMixFile, pvt_solver->gps_ephemeris_map, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 11: // GPS L1 C/A + Galileo E5b - if ((galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) && (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend())) - { - const std::string gal_signal("7X"); - rinex_obs_header(obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gal_signal); - rinex_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navMixfilename); - log_rinex_nav(navMixFile, pvt_solver->gps_ephemeris_map, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 13: // L5+E5a - if ((galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) && (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - const std::string gal_signal("5X"); - const std::string gps_signal("L5"); - rinex_obs_header(obsFile, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gps_signal, gal_signal); - rinex_nav_header(navMixFile, pvt_solver->gps_cnav_iono, pvt_solver->gps_cnav_utc_model, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navMixfilename); - log_rinex_nav(navMixFile, pvt_solver->gps_cnav_ephemeris_map, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 14: // Galileo E1B + Galileo E5a - if ((galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend())) - { - const std::string gal_signal("1B 5X"); - rinex_obs_header(obsFile, galileo_ephemeris_iter->second, rx_time, gal_signal); - rinex_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navGalfilename); - log_rinex_nav(navGalFile, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 15: // Galileo E1B + Galileo E5b - if ((galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend())) - { - const std::string gal_signal("1B 7X"); - rinex_obs_header(obsFile, galileo_ephemeris_iter->second, rx_time, gal_signal); - rinex_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navGalfilename); - log_rinex_nav(navGalFile, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 19: // Galileo E5a + Galileo E5b - if ((galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend())) - { - const std::string gal_signal("5X 7X"); - rinex_obs_header(obsFile, galileo_ephemeris_iter->second, rx_time, gal_signal); - rinex_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navGalfilename); - log_rinex_nav(navGalFile, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 23: // GLONASS L1 C/A only - if (glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - const std::string signal("1G"); - rinex_obs_header(obsFile, glonass_gnav_ephemeris_iter->second, rx_time, signal); - rinex_nav_header(navGloFile, pvt_solver->glonass_gnav_utc_model, glonass_gnav_ephemeris_iter->second); - output_navfilename.push_back(navGlofilename); - log_rinex_nav(navGloFile, pvt_solver->glonass_gnav_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 24: // GLONASS L2 C/A only - if (glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - const std::string signal("2G"); - rinex_obs_header(obsFile, glonass_gnav_ephemeris_iter->second, rx_time, signal); - rinex_nav_header(navGloFile, pvt_solver->glonass_gnav_utc_model, glonass_gnav_ephemeris_iter->second); - output_navfilename.push_back(navGlofilename); - log_rinex_nav(navGloFile, pvt_solver->glonass_gnav_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 25: // GLONASS L1 C/A + GLONASS L2 C/A - if (glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - const std::string signal("1G 2G"); - rinex_obs_header(obsFile, glonass_gnav_ephemeris_iter->second, rx_time, signal); - rinex_nav_header(navGloFile, pvt_solver->glonass_gnav_utc_model, glonass_gnav_ephemeris_iter->second); - output_navfilename.push_back(navGlofilename); - log_rinex_nav(navGloFile, pvt_solver->glonass_gnav_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 26: // GPS L1 C/A + GLONASS L1 C/A - if ((glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) && (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend())) - { - const std::string glo_signal("1G"); - rinex_obs_header(obsFile, gps_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, glo_signal); - if (d_version == 3) - { - rinex_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); - log_rinex_nav(navMixFile, pvt_solver->gps_ephemeris_map, pvt_solver->glonass_gnav_ephemeris_map); - output_navfilename.push_back(navMixfilename); - } - if (d_version == 2) - { - rinex_nav_header(navFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second); - rinex_nav_header(navGloFile, pvt_solver->glonass_gnav_utc_model, glonass_gnav_ephemeris_iter->second); - output_navfilename.push_back(navfilename); - output_navfilename.push_back(navGlofilename); - log_rinex_nav(navFile, pvt_solver->gps_ephemeris_map); - log_rinex_nav(navGloFile, pvt_solver->glonass_gnav_ephemeris_map); - } - d_rinex_header_written = true; // do not write header anymore - } - break; - case 27: // Galileo E1B + GLONASS L1 C/A - if ((glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) && (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend())) - { - const std::string glo_signal("1G"); - const std::string gal_signal("1B"); - rinex_obs_header(obsFile, galileo_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, glo_signal, gal_signal); - rinex_nav_header(navMixFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); - output_navfilename.push_back(navMixfilename); - log_rinex_nav(navMixFile, pvt_solver->galileo_ephemeris_map, pvt_solver->glonass_gnav_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 28: // GPS L2C + GLONASS L1 C/A - if ((glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) && (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - const std::string glo_signal("1G"); - rinex_obs_header(obsFile, gps_cnav_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, glo_signal); - rinex_nav_header(navMixFile, pvt_solver->gps_cnav_iono, pvt_solver->gps_cnav_utc_model, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); - output_navfilename.push_back(navfilename); - log_rinex_nav(navMixFile, pvt_solver->gps_cnav_ephemeris_map, pvt_solver->glonass_gnav_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 29: // GPS L1 C/A + GLONASS L2 C/A - if ((glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) && (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend())) - { - const std::string glo_signal("2G"); - rinex_obs_header(obsFile, gps_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, glo_signal); - if (d_version == 3) - { - rinex_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); - output_navfilename.push_back(navfilename); - log_rinex_nav(navMixFile, pvt_solver->gps_ephemeris_map, pvt_solver->glonass_gnav_ephemeris_map); - } - if (d_version == 2) - { - rinex_nav_header(navFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second); - rinex_nav_header(navGloFile, pvt_solver->glonass_gnav_utc_model, glonass_gnav_ephemeris_iter->second); - output_navfilename.push_back(navfilename); - output_navfilename.push_back(navGlofilename); - log_rinex_nav(navFile, pvt_solver->gps_ephemeris_map); - log_rinex_nav(navGloFile, pvt_solver->glonass_gnav_ephemeris_map); - } - d_rinex_header_written = true; // do not write header anymore - } - break; - case 30: // Galileo E1B + GLONASS L2 C/A - if ((glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) && (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend())) - { - const std::string glo_signal("2G"); - const std::string gal_signal("1B"); - rinex_obs_header(obsFile, galileo_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, glo_signal, gal_signal); - rinex_nav_header(navMixFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); - output_navfilename.push_back(navMixfilename); - log_rinex_nav(navMixFile, pvt_solver->galileo_ephemeris_map, pvt_solver->glonass_gnav_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 31: // GPS L2C + GLONASS L2 C/A - if ((glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) && (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - const std::string glo_signal("2G"); - rinex_obs_header(obsFile, gps_cnav_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, glo_signal); - rinex_nav_header(navMixFile, pvt_solver->gps_cnav_iono, pvt_solver->gps_cnav_utc_model, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); - output_navfilename.push_back(navfilename); - log_rinex_nav(navMixFile, pvt_solver->gps_cnav_ephemeris_map, pvt_solver->glonass_gnav_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 32: // L1+E1+L5+E5a - if ((gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) and - (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) and - (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend())) - { - const std::string gal_signal("1B 5X"); - const std::string gps_signal("1C L5"); - rinex_obs_header(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gps_signal, gal_signal); - rinex_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navMixfilename); - log_rinex_nav(navMixFile, pvt_solver->gps_ephemeris_map, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 33: // L1+E1+E5a - if ((gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) and - (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend())) - { - const std::string gal_signal("1B 5X"); - rinex_obs_header(obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gal_signal); - rinex_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navMixfilename); - log_rinex_nav(navMixFile, pvt_solver->gps_ephemeris_map, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 100: // Galileo E6B - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - const std::string gal_signal("E6"); - rinex_obs_header(obsFile, galileo_ephemeris_iter->second, rx_time, gal_signal); - rinex_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navGalfilename); - log_rinex_nav(navGalFile, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 101: // Galileo E1B + Galileo E6B - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - const std::string gal_signal("1B E6"); - rinex_obs_header(obsFile, galileo_ephemeris_iter->second, rx_time, gal_signal); - rinex_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navGalfilename); - log_rinex_nav(navGalFile, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 102: // Galileo E5a + Galileo E6B - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - const std::string signal("5X E6"); - rinex_obs_header(obsFile, galileo_ephemeris_iter->second, rx_time, signal); - rinex_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navGalfilename); - log_rinex_nav(navGalFile, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 103: // Galileo E5b + Galileo E6B - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - const std::string signal("7X E6"); - rinex_obs_header(obsFile, galileo_ephemeris_iter->second, rx_time, signal); - rinex_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navGalfilename); - log_rinex_nav(navGalFile, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 104: // Galileo E1B + Galileo E5a + Galileo E6B - if ((galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend())) - { - const std::string gal_signal("1B 5X E6"); - rinex_obs_header(obsFile, galileo_ephemeris_iter->second, rx_time, gal_signal); - rinex_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navGalfilename); - log_rinex_nav(navGalFile, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 105: // Galileo E1B + Galileo E5b + Galileo E6B - if ((galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend())) - { - const std::string gal_signal("1B 7X E6"); - rinex_obs_header(obsFile, galileo_ephemeris_iter->second, rx_time, gal_signal); - rinex_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navGalfilename); - log_rinex_nav(navGalFile, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 106: // GPS L1 C/A + Galileo E1B + Galileo E6B - if ((galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) && (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend())) - { - const std::string gal_signal("1B E6"); - rinex_obs_header(obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gal_signal); - rinex_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navMixfilename); - log_rinex_nav(navMixFile, pvt_solver->gps_ephemeris_map, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 107: // GPS L1 C/A + Galileo E6B - if (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) - { - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - // we have Galileo ephemeris, maybe from assistance - const std::string gal_signal("E6"); - rinex_obs_header(obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gal_signal); - rinex_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navMixfilename); - log_rinex_nav(navMixFile, pvt_solver->gps_ephemeris_map, pvt_solver->galileo_ephemeris_map); - } - else - { - // we do not have galileo ephemeris, print only GPS data - rinex_obs_header(obsFile, gps_ephemeris_iter->second, rx_time); - rinex_nav_header(navFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second); - output_navfilename.push_back(navfilename); - log_rinex_nav(navFile, pvt_solver->gps_ephemeris_map); - } - d_rinex_header_written = true; // do not write header anymore - } - break; - case 108: // GPS L1 C/A + Galileo E1B + GPS L5 + Galileo E5a + Galileo E6B - if ((galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) and - (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) and - (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - const std::string gal_signal("1B 5X E6"); - const std::string gps_signal("1C L5"); - rinex_obs_header(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gps_signal, gal_signal); - rinex_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navMixfilename); - log_rinex_nav(navMixFile, pvt_solver->gps_ephemeris_map, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 500: // BDS B1I only - if (beidou_dnav_ephemeris_iter != pvt_solver->beidou_dnav_ephemeris_map.cend()) - { - rinex_obs_header(obsFile, beidou_dnav_ephemeris_iter->second, rx_time, "B1"); - rinex_nav_header(navFile, pvt_solver->beidou_dnav_iono, pvt_solver->beidou_dnav_utc_model); - output_navfilename.push_back(navfilename); - log_rinex_nav(navFile, pvt_solver->beidou_dnav_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - - break; - case 501: // BeiDou B1I + GPS L1 C/A - if ((gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) && (beidou_dnav_ephemeris_iter != pvt_solver->beidou_dnav_ephemeris_map.cend())) - { - const std::string bds_signal("B1"); - // rinex_obs_header(obsFile, gps_ephemeris_iter->second, beidou_dnav_ephemeris_iter->second, rx_time, bds_signal); - // rinex_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->beidou_dnav_iono, pvt_solver->beidou_dnav_utc_model); - d_rinex_header_written = true; // do not write header anymore - } - - break; - case 502: // BeiDou B1I + Galileo E1B - if ((galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) && (beidou_dnav_ephemeris_iter != pvt_solver->beidou_dnav_ephemeris_map.cend())) - { - const std::string bds_signal("B1"); - const std::string gal_signal("1B"); - // rinex_obs_header(obsFile, galileo_ephemeris_iter->second, beidou_dnav_ephemeris_iter->second, rx_time, gal_signal, bds_signal); - // rinex_nav_header(navMixFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model, pvt_solver->beidou_dnav_iono, pvt_solver->beidou_dnav_utc_model); - d_rinex_header_written = true; // do not write header anymore - } - - break; - case 503: // BeiDou B1I + GLONASS L1 C/A - case 504: // BeiDou B1I + GPS L1 C/A + Galileo E1B - case 505: // BeiDou B1I + GPS L1 C/A + GLONASS L1 C/A + Galileo E1B - case 506: // BeiDou B1I + Beidou B3I - if (beidou_dnav_ephemeris_iter != pvt_solver->beidou_dnav_ephemeris_map.cend()) - { - // rinex_obs_header(obsFile, beidou_dnav_ephemeris_iter->second, rx_time, "B1"); - // rinex_nav_header(navFile, pvt_solver->beidou_dnav_iono, pvt_solver->beidou_dnav_utc_model); - // log_rinex_nav(navFile, pvt_solver->beidou_dnav_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - - break; - case 600: // BDS B3I only - if (beidou_dnav_ephemeris_iter != pvt_solver->beidou_dnav_ephemeris_map.cend()) - { - rinex_obs_header(obsFile, beidou_dnav_ephemeris_iter->second, rx_time, "B3"); - rinex_nav_header(navFile, pvt_solver->beidou_dnav_iono, pvt_solver->beidou_dnav_utc_model); - output_navfilename.push_back(navfilename); - log_rinex_nav(navFile, pvt_solver->beidou_dnav_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - - break; - case 601: // BeiDou B3I + GPS L2C - case 602: // BeiDou B3I + GLONASS L2 C/A - case 603: // BeiDou B3I + GPS L2C + GLONASS L2 C/A - if (beidou_dnav_ephemeris_iter != pvt_solver->beidou_dnav_ephemeris_map.cend()) - { - rinex_obs_header(obsFile, beidou_dnav_ephemeris_iter->second, rx_time, "B3"); - // rinex_nav_header(navFile, pvt_solver->beidou_dnav_iono, pvt_solver->beidou_dnav_utc_model); - d_rinex_header_written = true; // do not write header anymore - } - - break; - case 1000: // GPS L1 C/A + GPS L2C + GPS L5 - if ((gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) and - (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - const std::string gps_signal("1C 2S L5"); - rinex_obs_header(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, rx_time, gps_signal); - rinex_nav_header(navFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second); - output_navfilename.push_back(navfilename); - log_rinex_nav(navFile, pvt_solver->gps_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 1001: // GPS L1 C/A + Galileo E1B + GPS L2C + GPS L5 + Galileo E5a - if ((galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) and - (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) and - (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - const std::string gal_signal("1B 5X"); - const std::string gps_signal("1C 2S L5"); - rinex_obs_header(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gps_signal, gal_signal); - rinex_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - output_navfilename.push_back(navMixfilename); - log_rinex_nav(navMixFile, pvt_solver->gps_ephemeris_map, pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - default: - break; } - } - if (d_rinex_header_written) // The header is already written, we can now log the navigation message data - { - galileo_ephemeris_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - gps_ephemeris_iter = pvt_solver->gps_ephemeris_map.cbegin(); - gps_cnav_ephemeris_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin(); - glonass_gnav_ephemeris_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - beidou_dnav_ephemeris_iter = pvt_solver->beidou_dnav_ephemeris_map.cbegin(); - - // Log observables into the RINEX file - if (flag_write_RINEX_obs_output) + else if (has_beidou && beidou_dnav_ephemeris_iter != pvt_solver->beidou_dnav_ephemeris_map.cend()) { - switch (type_of_rx) + rinex_obs_header(obsFile, beidou_dnav_ephemeris_iter->second, rx_time, signal); + // Not implemented for beidou + } + else + { + rinex_header_written = false; + } + + d_rinex_header_written = rinex_header_written; + } + + if (d_rinex_header_written && flag_write_RINEX_obs_output) // The header is already written, we can now log the navigation message data + { + if (flags.check_only_enabled(GPS_1C) && + gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) + { + log_rinex_obs(obsFile, gps_ephemeris_iter->second, rx_time, gnss_observables_map); + if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0)) { - case 1: // GPS L1 C/A only - if (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, gps_ephemeris_iter->second, rx_time, gnss_observables_map); - if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0)) - { - update_obs_header(obsFile, pvt_solver->gps_utc_model); - update_nav_header(navFile, pvt_solver->gps_utc_model, pvt_solver->gps_iono, gps_ephemeris_iter->second); - d_rinex_header_updated = true; - } - } - break; - case 2: // GPS L2C only - case 3: // GPS L5 - if (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, gps_cnav_ephemeris_iter->second, rx_time, gnss_observables_map); - } - if (!d_rinex_header_updated && (pvt_solver->gps_cnav_utc_model.A0 != 0)) + update_obs_header(obsFile, pvt_solver->gps_utc_model); + update_nav_header(navFile, pvt_solver->gps_utc_model, pvt_solver->gps_iono, gps_ephemeris_iter->second); + d_rinex_header_updated = true; + } + } + else if (flags.check_only_enabled(GPS_1C, GPS_2S) && + gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend() && + gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) + { + log_rinex_obs(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, rx_time, gnss_observables_map); + if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0)) + { + update_obs_header(obsFile, pvt_solver->gps_utc_model); + update_nav_header(navFile, pvt_solver->gps_utc_model, pvt_solver->gps_iono, gps_ephemeris_iter->second); + d_rinex_header_updated = true; + } + } + else if (flags.check_only_enabled(GPS_1C, GPS_L5) && + gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend() && + gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) + { + log_rinex_obs(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, rx_time, gnss_observables_map); + if (!d_rinex_header_updated && ((pvt_solver->gps_cnav_utc_model.A0 != 0) || (pvt_solver->gps_utc_model.A0 != 0))) + { + if (pvt_solver->gps_cnav_utc_model.A0 != 0) { update_obs_header(obsFile, pvt_solver->gps_cnav_utc_model); update_nav_header(navFile, pvt_solver->gps_cnav_utc_model, pvt_solver->gps_cnav_iono); - d_rinex_header_updated = true; } - break; - case 4: // Galileo E1B only - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) + else { - log_rinex_obs(obsFile, galileo_ephemeris_iter->second, rx_time, gnss_observables_map, "1B"); + update_obs_header(obsFile, pvt_solver->gps_utc_model); + update_nav_header(navFile, pvt_solver->gps_utc_model, pvt_solver->gps_iono, gps_ephemeris_iter->second); } - if (!d_rinex_header_updated && (pvt_solver->galileo_utc_model.A0 != 0)) + d_rinex_header_updated = true; + } + } + else if (flags.check_only_enabled(GPS_2S) || flags.check_only_enabled(GPS_L5) || flags.check_only_enabled(GPS_2S, GPS_L5)) + { + if (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) + { + log_rinex_obs(obsFile, gps_cnav_ephemeris_iter->second, rx_time, gnss_observables_map); + } + if (!d_rinex_header_updated && (pvt_solver->gps_cnav_utc_model.A0 != 0)) + { + update_obs_header(obsFile, pvt_solver->gps_cnav_utc_model); + update_nav_header(navFile, pvt_solver->gps_cnav_utc_model, pvt_solver->gps_cnav_iono); + d_rinex_header_updated = true; + } + } + else if (flags.check_only_enabled(GPS_1C, GPS_2S, GPS_L5)) + { + if (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend() && + gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) + { + log_rinex_obs(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, rx_time, gnss_observables_map, true); + } + if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0) && (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend())) + { + update_obs_header(obsFile, pvt_solver->gps_utc_model); + update_nav_header(navFile, pvt_solver->gps_utc_model, pvt_solver->gps_iono, gps_ephemeris_iter->second); + d_rinex_header_updated = true; + } + } + else if (only_galileo) + { + if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + log_rinex_obs(obsFile, galileo_ephemeris_iter->second, rx_time, gnss_observables_map, signal); + } + if (!d_rinex_header_updated && (pvt_solver->galileo_utc_model.A0 != 0)) + { + update_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); + update_obs_header(obsFile, pvt_solver->galileo_utc_model); + d_rinex_header_updated = true; + } + } + else if (only_glonass) + { + if (glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + log_rinex_obs(obsFile, glonass_gnav_ephemeris_iter->second, rx_time, gnss_observables_map, signal); + } + if (!d_rinex_header_updated && (pvt_solver->glonass_gnav_utc_model.d_tau_c != 0)) + { + update_nav_header(navGloFile, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); + update_obs_header(obsFile, pvt_solver->glonass_gnav_utc_model); + d_rinex_header_updated = true; + } + } + else if (only_beidou) + { + if (beidou_dnav_ephemeris_iter != pvt_solver->beidou_dnav_ephemeris_map.cend()) + { + log_rinex_obs(obsFile, beidou_dnav_ephemeris_iter->second, rx_time, gnss_observables_map, signal); + } + if (!d_rinex_header_updated && (pvt_solver->beidou_dnav_utc_model.A0_UTC != 0)) + { + update_obs_header(obsFile, pvt_solver->beidou_dnav_utc_model); + update_nav_header(navBdsFile, pvt_solver->beidou_dnav_utc_model, pvt_solver->beidou_dnav_iono); + d_rinex_header_updated = true; + } + } + else if ((flags.check_only_enabled(GPS_1C, GAL_1B) || flags.check_only_enabled(GPS_1C, GAL_1B, GAL_E6)) && + gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend() && + galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + log_rinex_obs(obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gnss_observables_map); + if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0)) + { + update_obs_header(obsFile, pvt_solver->gps_utc_model); + update_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); + d_rinex_header_updated = true; + } + } + else if ((flags.check_only_enabled(GPS_1C, GLO_1G) || flags.check_only_enabled(GPS_1C, GLO_2G)) && + gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend() && + glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + log_rinex_obs(obsFile, gps_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, gnss_observables_map); + if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0)) + { + update_obs_header(obsFile, pvt_solver->gps_utc_model); + update_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); + d_rinex_header_updated = true; // do not write header anymore + } + } + else if (flags.check_only_enabled(GPS_L5, GAL_E5a) && + gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend() && + galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + if ((gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) && (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend())) + { + log_rinex_obs(obsFile, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gnss_observables_map); + } + if (!d_rinex_header_updated && (pvt_solver->gps_cnav_utc_model.A0 != 0) && (pvt_solver->galileo_utc_model.A0 != 0)) + { + update_obs_header(obsFile, pvt_solver->gps_cnav_utc_model); + update_nav_header(navMixFile, pvt_solver->gps_cnav_utc_model, pvt_solver->gps_cnav_iono, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); + d_rinex_header_updated = true; // do not write header anymore + } + } + else if (flags.check_only_enabled(GAL_1B, GLO_1G) || flags.check_only_enabled(GAL_1B, GLO_2G)) + { + if ((glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) && (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend())) + { + log_rinex_obs(obsFile, galileo_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, gnss_observables_map); + } + if (!d_rinex_header_updated && (pvt_solver->galileo_utc_model.A0 != 0)) + { + update_obs_header(obsFile, pvt_solver->galileo_utc_model); + update_nav_header(navMixFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); + d_rinex_header_updated = true; // do not write header anymore + } + } + else if (flags.check_only_enabled(GPS_2S, GLO_1G) || flags.check_only_enabled(GPS_2S, GLO_2G)) + { + if ((glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) && (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) + { + log_rinex_obs(obsFile, gps_cnav_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, gnss_observables_map); + } + if (!d_rinex_header_updated && (pvt_solver->gps_cnav_utc_model.A0 != 0)) + { + update_obs_header(obsFile, pvt_solver->gps_cnav_utc_model); + update_nav_header(navMixFile, pvt_solver->gps_cnav_iono, pvt_solver->gps_cnav_utc_model, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); + d_rinex_header_updated = true; // do not write header anymore + } + } + else if (flags.check_only_enabled(GPS_1C, GAL_1B, GPS_L5, GAL_E5a)) + { + if (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend() && + gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend() && + galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + log_rinex_obs(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gnss_observables_map); + if (!d_rinex_header_updated && ((pvt_solver->gps_cnav_utc_model.A0 != 0) || (pvt_solver->gps_utc_model.A0 != 0)) && (pvt_solver->galileo_utc_model.A0 != 0)) { - update_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - update_obs_header(obsFile, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 5: // Galileo E5a only - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, galileo_ephemeris_iter->second, rx_time, gnss_observables_map, "5X"); - } - if (!d_rinex_header_updated && (pvt_solver->galileo_utc_model.A0 != 0)) - { - update_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - update_obs_header(obsFile, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 6: // Galileo E5b only - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, galileo_ephemeris_iter->second, rx_time, gnss_observables_map, "7X"); - } - if (!d_rinex_header_updated && (pvt_solver->galileo_utc_model.A0 != 0)) - { - update_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - update_obs_header(obsFile, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 7: // GPS L1 C/A + GPS L2C - if ((gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) && (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - log_rinex_obs(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, rx_time, gnss_observables_map); - if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0)) + if (pvt_solver->gps_cnav_utc_model.A0 != 0) { - update_obs_header(obsFile, pvt_solver->gps_utc_model); - update_nav_header(navFile, pvt_solver->gps_utc_model, pvt_solver->gps_iono, gps_ephemeris_iter->second); - d_rinex_header_updated = true; - } - } - break; - case 8: // L1+L5 - if ((gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) && (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - log_rinex_obs(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, rx_time, gnss_observables_map); - if (!d_rinex_header_updated && ((pvt_solver->gps_cnav_utc_model.A0 != 0) || (pvt_solver->gps_utc_model.A0 != 0))) - { - if (pvt_solver->gps_cnav_utc_model.A0 != 0) - { - update_obs_header(obsFile, pvt_solver->gps_cnav_utc_model); - update_nav_header(navFile, pvt_solver->gps_cnav_utc_model, pvt_solver->gps_cnav_iono); - } - else - { - update_obs_header(obsFile, pvt_solver->gps_utc_model); - update_nav_header(navFile, pvt_solver->gps_utc_model, pvt_solver->gps_iono, gps_ephemeris_iter->second); - } - d_rinex_header_updated = true; - } - } - break; - case 9: // GPS L1 C/A + Galileo E1B - if ((galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) && (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend())) - { - log_rinex_obs(obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gnss_observables_map); - if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0)) - { - update_obs_header(obsFile, pvt_solver->gps_utc_model); - update_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - } - break; - case 13: // L5+E5a - if ((gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) && (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend())) - { - log_rinex_obs(obsFile, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gnss_observables_map); - } - if (!d_rinex_header_updated && (pvt_solver->gps_cnav_utc_model.A0 != 0) && (pvt_solver->galileo_utc_model.A0 != 0)) - { - update_obs_header(obsFile, pvt_solver->gps_cnav_utc_model); - update_nav_header(navMixFile, pvt_solver->gps_cnav_utc_model, pvt_solver->gps_cnav_iono, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; // do not write header anymore - } - break; - case 14: // Galileo E1B + Galileo E5a - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, galileo_ephemeris_iter->second, rx_time, gnss_observables_map, "1B 5X"); - } - if (!d_rinex_header_updated && (pvt_solver->galileo_utc_model.A0 != 0)) - { - update_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - update_obs_header(obsFile, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 15: // Galileo E1B + Galileo E5b - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, galileo_ephemeris_iter->second, rx_time, gnss_observables_map, "1B 7X"); - } - if (!d_rinex_header_updated && (pvt_solver->galileo_utc_model.A0 != 0)) - { - update_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - update_obs_header(obsFile, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 19: // Galileo E5a + Galileo E5b - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, galileo_ephemeris_iter->second, rx_time, gnss_observables_map, "5X 7X"); - } - if (!d_rinex_header_updated && (pvt_solver->galileo_utc_model.A0 != 0)) - { - update_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - update_obs_header(obsFile, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 23: // GLONASS L1 C/A only - if (glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, glonass_gnav_ephemeris_iter->second, rx_time, gnss_observables_map, "1C"); - } - if (!d_rinex_header_updated && (pvt_solver->glonass_gnav_utc_model.d_tau_c != 0)) - { - update_nav_header(navGloFile, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); - update_obs_header(obsFile, pvt_solver->glonass_gnav_utc_model); - d_rinex_header_updated = true; - } - break; - case 24: // GLONASS L2 C/A only - if (glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, glonass_gnav_ephemeris_iter->second, rx_time, gnss_observables_map, "2C"); - } - if (!d_rinex_header_updated && (pvt_solver->glonass_gnav_utc_model.d_tau_c != 0)) - { - update_nav_header(navGloFile, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); - update_obs_header(obsFile, pvt_solver->glonass_gnav_utc_model); - d_rinex_header_updated = true; - } - break; - case 25: // GLONASS L1 C/A + GLONASS L2 C/A - if (glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, glonass_gnav_ephemeris_iter->second, rx_time, gnss_observables_map, "1C 2C"); - } - if (!d_rinex_header_updated && (pvt_solver->glonass_gnav_utc_model.d_tau_c != 0)) - { - update_nav_header(navMixFile, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); - update_obs_header(obsFile, pvt_solver->glonass_gnav_utc_model); - d_rinex_header_updated = true; - } - break; - case 26: // GPS L1 C/A + GLONASS L1 C/A - if ((glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) && (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend())) - { - log_rinex_obs(obsFile, gps_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, gnss_observables_map); - if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0)) - { - update_obs_header(obsFile, pvt_solver->gps_utc_model); - update_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); - d_rinex_header_updated = true; // do not write header anymore - } - } - break; - case 27: // Galileo E1B + GLONASS L1 C/A - if ((glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) && (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend())) - { - log_rinex_obs(obsFile, galileo_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, gnss_observables_map); - } - if (!d_rinex_header_updated && (pvt_solver->galileo_utc_model.A0 != 0)) - { - update_obs_header(obsFile, pvt_solver->galileo_utc_model); - update_nav_header(navMixFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); - d_rinex_header_updated = true; // do not write header anymore - } - break; - case 28: // GPS L2C + GLONASS L1 C/A - if ((glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) && (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - log_rinex_obs(obsFile, gps_cnav_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, gnss_observables_map); - } - if (!d_rinex_header_updated && (pvt_solver->gps_cnav_utc_model.A0 != 0)) - { - update_obs_header(obsFile, pvt_solver->gps_cnav_utc_model); - update_nav_header(navMixFile, pvt_solver->gps_cnav_iono, pvt_solver->gps_cnav_utc_model, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); - d_rinex_header_updated = true; // do not write header anymore - } - break; - case 29: // GPS L1 C/A + GLONASS L2 C/A - if ((glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) && (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend())) - { - log_rinex_obs(obsFile, gps_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, gnss_observables_map); - if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0)) - { - update_obs_header(obsFile, pvt_solver->gps_utc_model); - update_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); - d_rinex_header_updated = true; // do not write header anymore - } - } - break; - case 30: // Galileo E1B + GLONASS L2 C/A - if ((glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) && (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend())) - { - log_rinex_obs(obsFile, galileo_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, gnss_observables_map); - } - if (!d_rinex_header_updated && (pvt_solver->galileo_utc_model.A0 != 0)) - { - update_obs_header(obsFile, pvt_solver->galileo_utc_model); - update_nav_header(navMixFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); - d_rinex_header_updated = true; // do not write header anymore - } - break; - case 31: // GPS L2C + GLONASS L2 C/A - if ((glonass_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) && (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - log_rinex_obs(obsFile, gps_cnav_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, rx_time, gnss_observables_map); - } - if (!d_rinex_header_updated && (pvt_solver->gps_cnav_utc_model.A0 != 0)) - { - update_obs_header(obsFile, pvt_solver->gps_cnav_utc_model); - update_nav_header(navMixFile, pvt_solver->gps_cnav_iono, pvt_solver->gps_cnav_utc_model, pvt_solver->glonass_gnav_utc_model, pvt_solver->glonass_gnav_almanac); - d_rinex_header_updated = true; // do not write header anymore - } - break; - case 32: // L1+E1+L5+E5a - if ((gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) && (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) && (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend())) - { - log_rinex_obs(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gnss_observables_map); - if (!d_rinex_header_updated && ((pvt_solver->gps_cnav_utc_model.A0 != 0) || (pvt_solver->gps_utc_model.A0 != 0)) && (pvt_solver->galileo_utc_model.A0 != 0)) - { - if (pvt_solver->gps_cnav_utc_model.A0 != 0) - { - update_obs_header(obsFile, pvt_solver->gps_cnav_utc_model); - update_nav_header(navMixFile, pvt_solver->gps_cnav_utc_model, pvt_solver->gps_cnav_iono, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - } - else - { - update_obs_header(obsFile, pvt_solver->gps_utc_model); - update_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - } - d_rinex_header_updated = true; // do not write header anymore - } - } - break; - case 33: // L1+E1+E5a - if ((gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) && (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend())) - { - log_rinex_obs(obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gnss_observables_map); - if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0) && (pvt_solver->galileo_utc_model.A0 != 0)) - { - update_obs_header(obsFile, pvt_solver->gps_utc_model); - update_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; // do not write header anymore - } - } - break; - case 100: // Galileo E6B - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, galileo_ephemeris_iter->second, rx_time, gnss_observables_map, "E6"); - } - if (!d_rinex_header_updated && (pvt_solver->galileo_utc_model.A0 != 0)) - { - update_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - update_obs_header(obsFile, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 101: // Galileo E1B + Galileo E6B - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, galileo_ephemeris_iter->second, rx_time, gnss_observables_map, "1B E6"); - } - if (!d_rinex_header_updated && (pvt_solver->galileo_utc_model.A0 != 0)) - { - update_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - update_obs_header(obsFile, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 102: // Galileo E5a + Galileo E6B - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, galileo_ephemeris_iter->second, rx_time, gnss_observables_map, "5X E6"); - } - if (!d_rinex_header_updated && (pvt_solver->galileo_utc_model.A0 != 0)) - { - update_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - update_obs_header(obsFile, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 103: // Galileo E5b + Galileo E6B - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, galileo_ephemeris_iter->second, rx_time, gnss_observables_map, "7X E6"); - } - if (!d_rinex_header_updated && (pvt_solver->galileo_utc_model.A0 != 0)) - { - update_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - update_obs_header(obsFile, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 104: // Galileo E1B + Galileo E5a + Galileo E6B - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, galileo_ephemeris_iter->second, rx_time, gnss_observables_map, "1B 5X E6"); - } - if (!d_rinex_header_updated && (pvt_solver->galileo_utc_model.A0 != 0)) - { - update_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - update_obs_header(obsFile, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 105: // Galileo E1B + Galileo E5b + Galileo E6B - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, galileo_ephemeris_iter->second, rx_time, gnss_observables_map, "1B 7X E6"); - } - if (!d_rinex_header_updated && (pvt_solver->galileo_utc_model.A0 != 0)) - { - update_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - update_obs_header(obsFile, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 106: // GPS L1 C/A + Galileo E1B + Galileo E6B - if ((galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) && (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend())) - { - log_rinex_obs(obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gnss_observables_map); - if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0)) - { - update_obs_header(obsFile, pvt_solver->gps_utc_model); - update_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - } - break; - case 107: - if (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) - { - if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - // we have Galileo ephemeris, maybe from assistance - log_rinex_obs(obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gnss_observables_map); - if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0)) - { - update_obs_header(obsFile, pvt_solver->gps_utc_model); - update_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } + update_obs_header(obsFile, pvt_solver->gps_cnav_utc_model); + update_nav_header(navMixFile, pvt_solver->gps_cnav_utc_model, pvt_solver->gps_cnav_iono, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); } else { - // we do not have galileo ephemeris, print only GPS data - log_rinex_obs(obsFile, gps_ephemeris_iter->second, rx_time, gnss_observables_map); - if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0)) - { - update_obs_header(obsFile, pvt_solver->gps_utc_model); - update_nav_header(navFile, pvt_solver->gps_utc_model, pvt_solver->gps_iono, gps_ephemeris_iter->second); - d_rinex_header_updated = true; - } + update_obs_header(obsFile, pvt_solver->gps_utc_model); + update_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); } + d_rinex_header_updated = true; // do not write header anymore } - break; - case 108: // GPS L1 C/A + Galileo E1B + GPS L5 + Galileo E5a + Galileo E6B - if ((galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) and - (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) and - (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) + } + } + else if (flags.check_only_enabled(GPS_1C, GAL_1B, GAL_E5a)) + { + if (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend() && + galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + log_rinex_obs(obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gnss_observables_map); + if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0) && (pvt_solver->galileo_utc_model.A0 != 0)) { - log_rinex_obs(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gnss_observables_map, true); + update_obs_header(obsFile, pvt_solver->gps_utc_model); + update_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); + d_rinex_header_updated = true; // do not write header anymore } - if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0) && (pvt_solver->galileo_utc_model.A0 != 0) && (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend())) + } + } + else if (flags.check_only_enabled(GPS_1C, GAL_1B, GPS_L5, GAL_E5a, GAL_E6) || flags.check_only_enabled(GPS_1C, GAL_1B, GPS_2S, GPS_L5, GAL_E5a)) + { + if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend() && + gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend() && + gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) + { + log_rinex_obs(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gnss_observables_map, true); + } + if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0) && (pvt_solver->galileo_utc_model.A0 != 0) && (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend())) + { + update_obs_header(obsFile, pvt_solver->gps_utc_model); + update_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); + d_rinex_header_updated = true; + } + } + else if (flags.check_only_enabled(GPS_1C, GAL_E6) && gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) + { + if (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + // we have Galileo ephemeris, maybe from assistance + log_rinex_obs(obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gnss_observables_map); + if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0)) { update_obs_header(obsFile, pvt_solver->gps_utc_model); update_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); d_rinex_header_updated = true; } - break; - case 500: // BDS B1I only - if (beidou_dnav_ephemeris_iter != pvt_solver->beidou_dnav_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, beidou_dnav_ephemeris_iter->second, rx_time, gnss_observables_map, "B1"); - } - if (!d_rinex_header_updated && (pvt_solver->beidou_dnav_utc_model.A0_UTC != 0)) - { - update_obs_header(obsFile, pvt_solver->beidou_dnav_utc_model); - update_nav_header(navFile, pvt_solver->beidou_dnav_utc_model, pvt_solver->beidou_dnav_iono); - d_rinex_header_updated = true; - } - break; - case 600: // BDS B3I only - if (beidou_dnav_ephemeris_iter != pvt_solver->beidou_dnav_ephemeris_map.cend()) - { - log_rinex_obs(obsFile, beidou_dnav_ephemeris_iter->second, rx_time, gnss_observables_map, "B3"); - } - if (!d_rinex_header_updated && (pvt_solver->beidou_dnav_utc_model.A0_UTC != 0)) - { - update_obs_header(obsFile, pvt_solver->beidou_dnav_utc_model); - update_nav_header(navFile, pvt_solver->beidou_dnav_utc_model, pvt_solver->beidou_dnav_iono); - d_rinex_header_updated = true; - } - break; - case 1000: // GPS L1 C/A + GPS L2C + GPS L5 - if ((gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) and - (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - log_rinex_obs(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, rx_time, gnss_observables_map, true); - } - if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0) && (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend())) + } + else + { + // we do not have galileo ephemeris, print only GPS data + log_rinex_obs(obsFile, gps_ephemeris_iter->second, rx_time, gnss_observables_map); + if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0)) { update_obs_header(obsFile, pvt_solver->gps_utc_model); update_nav_header(navFile, pvt_solver->gps_utc_model, pvt_solver->gps_iono, gps_ephemeris_iter->second); d_rinex_header_updated = true; } - break; - case 1001: // GPS L1 C/A + Galileo E1B + GPS L2C + GPS L5 + Galileo E5a - if ((galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) and - (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend()) and - (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - log_rinex_obs(obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, rx_time, gnss_observables_map, true); - } - if (!d_rinex_header_updated && (pvt_solver->gps_utc_model.A0 != 0) && (pvt_solver->galileo_utc_model.A0 != 0) && (gps_ephemeris_iter != pvt_solver->gps_ephemeris_map.cend())) - { - update_obs_header(obsFile, pvt_solver->gps_utc_model); - update_nav_header(navMixFile, pvt_solver->gps_iono, pvt_solver->gps_utc_model, gps_ephemeris_iter->second, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - default: - break; } } } } -void Rinex_Printer::log_rinex_nav_gps_cnav(int type_of_rx, const std::map& new_cnav_eph) +void Rinex_Printer::log_rinex_nav_gps_nav(uint32_t signal_enabled_flags, const std::map& new_eph) { std::map new_gal_eph; std::map new_glo_eph; - switch (type_of_rx) + const Signal_Enabled_Flags flags(signal_enabled_flags); + + if (!flags.check_any_enabled(GPS_1C)) + { + return; + } + + if (flags.check_any_enabled(GAL_1B, GAL_E5a, GAL_E5b, GAL_E6)) + { + if (flags.check_any_enabled(GAL_E6) && navMixFile.tellp() == 0) + { + log_rinex_nav(navFile, new_eph); + } + else + { + log_rinex_nav(navMixFile, new_eph, new_gal_eph); + } + } + else if (flags.check_any_enabled(GLO_1G, GLO_2G)) + { + if (d_version == 3) + { + log_rinex_nav(navMixFile, new_eph, new_glo_eph); + } + else if (d_version == 2) + { + if (flags.check_any_enabled(GLO_1G)) + { + log_rinex_nav(navFile, new_glo_eph); + } + else + { + log_rinex_nav(navFile, new_eph); + } + } + } + else + { + log_rinex_nav(navFile, new_eph); + } +} + + +void Rinex_Printer::log_rinex_nav_gps_cnav(uint32_t signal_enabled_flags, const std::map& new_cnav_eph) +{ + std::map new_gal_eph; + std::map new_glo_eph; + const Signal_Enabled_Flags flags(signal_enabled_flags); + + if (!flags.check_any_enabled(GPS_2S, GPS_L5)) + { + return; + } + + if (flags.check_any_enabled(GAL_1B, GAL_E5a, GAL_E5b, GAL_E6)) + { + log_rinex_nav(navMixFile, new_cnav_eph, new_gal_eph); + } + else if (flags.check_any_enabled(GLO_1G, GLO_2G)) + { + log_rinex_nav(navMixFile, new_cnav_eph, new_glo_eph); + } + else { - case 2: // GPS L2C only - case 3: // GPS L5 only - case 7: // GPS L1 C/A + GPS L2C log_rinex_nav(navFile, new_cnav_eph); - break; - case 13: // L5+E5a - log_rinex_nav(navMixFile, new_cnav_eph, new_gal_eph); - break; - case 28: // GPS L2C + GLONASS L1 C/A - case 31: // GPS L2C + GLONASS L2 C/A - log_rinex_nav(navMixFile, new_cnav_eph, new_glo_eph); - break; - default: - break; } } -void Rinex_Printer::log_rinex_nav_gps_nav(int type_of_rx, const std::map& new_eph) -{ - std::map new_gal_eph; - std::map new_glo_eph; - switch (type_of_rx) - { - case 1: // GPS L1 C/A only - case 8: // L1+L5 - log_rinex_nav(navFile, new_eph); - break; - case 9: // GPS L1 C/A + Galileo E1B - case 10: // GPS L1 C/A + Galileo E5a - case 11: // GPS L1 C/A + Galileo E5b - log_rinex_nav(navMixFile, new_eph, new_gal_eph); - break; - case 26: // GPS L1 C/A + GLONASS L1 C/A - if (d_version == 3) - { - log_rinex_nav(navMixFile, new_eph, new_glo_eph); - } - if (d_version == 2) - { - log_rinex_nav(navFile, new_glo_eph); - } - break; - case 29: // GPS L1 C/A + GLONASS L2 C/A - if (d_version == 3) - { - log_rinex_nav(navMixFile, new_eph, new_glo_eph); - } - if (d_version == 2) - { - log_rinex_nav(navFile, new_eph); - } - break; - case 32: // L1+E1+L5+E5a - case 33: // L1+E1+E5a - log_rinex_nav(navMixFile, new_eph, new_gal_eph); - break; - case 106: // GPS L1 C/A + Galileo E1B + Galileo E6B - log_rinex_nav(navMixFile, new_eph, new_gal_eph); - break; - case 107: // GPS L1 C/A + Galileo E6B - if (navMixFile.tellp() != 0) - { - log_rinex_nav(navMixFile, new_eph, new_gal_eph); - } - else - { - log_rinex_nav(navFile, new_eph); - } - break; - case 108: // GPS L1 C/A + Galileo E1B + GPS L5 + Galileo E5a + Galileo E6B - if (navMixFile.tellp() != 0) - { - log_rinex_nav(navMixFile, new_eph, new_gal_eph); - } - else - { - log_rinex_nav(navFile, new_eph); - } - break; - case 1000: // L1+L2+L5 - log_rinex_nav(navFile, new_eph); - break; - case 1001: // L1+E1+L2+L5+E5a - log_rinex_nav(navMixFile, new_eph, new_gal_eph); - break; - default: - break; - } -} - - -void Rinex_Printer::log_rinex_nav_gal_nav(int type_of_rx, const std::map& new_gal_eph) +void Rinex_Printer::log_rinex_nav_gal_nav(uint32_t signal_enabled_flags, const std::map& new_gal_eph) { std::map new_glo_eph; std::map new_cnav_eph; std::map new_eph; - switch (type_of_rx) + const Signal_Enabled_Flags flags(signal_enabled_flags); + + if (!flags.check_any_enabled(GAL_1B, GAL_E5a, GAL_E5b, GAL_E6)) + { + return; + } + + if (flags.check_any_enabled(GPS_1C, GPS_2S, GPS_L5)) + { + if (flags.check_any_enabled(GAL_E6) && navMixFile.tellp() == 0) + { + return; + } + + if (flags.check_any_enabled(GPS_1C)) + { + log_rinex_nav(navMixFile, new_eph, new_gal_eph); + } + else + { + log_rinex_nav(navMixFile, new_cnav_eph, new_gal_eph); + } + } + else if (flags.check_any_enabled(GLO_1G, GLO_2G)) { - case 4: // Galileo E1B only - case 5: // Galileo E5a only - case 6: // Galileo E5b only - log_rinex_nav(navGalFile, new_gal_eph); - break; - case 9: // GPS L1 C/A + Galileo E1B - case 10: // GPS L1 C/A + Galileo E5a - case 11: // GPS L1 C/A + Galileo E5b - log_rinex_nav(navMixFile, new_eph, new_gal_eph); - break; - case 13: // L5+E5a - log_rinex_nav(navMixFile, new_cnav_eph, new_gal_eph); - break; - case 15: // Galileo E1B + Galileo E5b - log_rinex_nav(navGalFile, new_gal_eph); - break; - case 19: // Galileo E1B + Galileo E5b - log_rinex_nav(navGalFile, new_gal_eph); - break; - case 27: // Galileo E1B + GLONASS L1 C/A - case 30: // Galileo E1B + GLONASS L2 C/A log_rinex_nav(navMixFile, new_gal_eph, new_glo_eph); - break; - case 32: // L1+E1+L5+E5a - case 33: // L1+E1+E5a - log_rinex_nav(navMixFile, new_eph, new_gal_eph); - break; - case 100: // E6B - case 101: // E1B + E6B - case 102: // Galileo E5a + Galileo E6B - case 103: // Galileo E5b + Galileo E6B - case 104: // Galileo E1B + Galileo E5a + Galileo E6B - case 105: // Galileo E1B + Galileo E5b + Galileo E6B + } + else + { log_rinex_nav(navGalFile, new_gal_eph); - break; - case 106: // GPS L1 C/A + Galileo E1B + Galileo E6B - log_rinex_nav(navMixFile, new_eph, new_gal_eph); - break; - case 107: // GPS L1 C/A + Galileo E6B - if (navMixFile.tellp() != 0) - { - log_rinex_nav(navMixFile, new_eph, new_gal_eph); - } - break; - case 108: // GPS L1 C/A + Galileo E1B + GPS L5 + Galileo E5a + Galileo E6B - if (navMixFile.tellp() != 0) - { - log_rinex_nav(navMixFile, new_eph, new_gal_eph); - } - break; - case 1001: // L1+E1+L2+L5+E5a - log_rinex_nav(navMixFile, new_eph, new_gal_eph); - break; - default: - break; } } -void Rinex_Printer::log_rinex_nav_glo_gnav(int type_of_rx, const std::map& new_glo_eph) +void Rinex_Printer::log_rinex_nav_glo_gnav(uint32_t signal_enabled_flags, const std::map& new_glo_eph) { std::map new_gal_eph; std::map new_cnav_eph; std::map new_eph; - switch (type_of_rx) + const Signal_Enabled_Flags flags(signal_enabled_flags); + + if (!flags.check_any_enabled(GLO_1G, GLO_2G)) + { + return; + } + + if (flags.check_any_enabled(GPS_1C, GPS_2S, GPS_L5)) + { + if (flags.check_any_enabled(GPS_1C)) + { + if (d_version == 3) + { + log_rinex_nav(navMixFile, new_eph, new_glo_eph); + } + else if (d_version == 2) + { + log_rinex_nav(navGloFile, new_glo_eph); + } + } + else + { + log_rinex_nav(navMixFile, new_cnav_eph, new_glo_eph); + } + } + + else if (flags.check_any_enabled(GAL_1B, GAL_E5a, GAL_E5b, GAL_E6)) + { + log_rinex_nav(navMixFile, new_gal_eph, new_glo_eph); + } + else { - case 23: // GLONASS L1 C/A - case 24: // GLONASS L2 C/A - case 25: // GLONASS L1 C/A + GLONASS L2 C/A log_rinex_nav(navGloFile, new_glo_eph); - break; - case 26: // GPS L1 C/A + GLONASS L1 C/A - if (d_version == 3) - { - log_rinex_nav(navMixFile, new_eph, new_glo_eph); - } - if (d_version == 2) - { - log_rinex_nav(navGloFile, new_glo_eph); - } - break; - case 27: // Galileo E1B + GLONASS L1 C/A - log_rinex_nav(navMixFile, new_gal_eph, new_glo_eph); - break; - case 28: // GPS L2C + GLONASS L1 C/A - log_rinex_nav(navMixFile, new_cnav_eph, new_glo_eph); - break; - case 29: // GPS L1 C/A + GLONASS L2 C/A - if (d_version == 3) - { - log_rinex_nav(navMixFile, new_eph, new_glo_eph); - } - if (d_version == 2) - { - log_rinex_nav(navGloFile, new_glo_eph); - } - break; - case 30: // Galileo E1B + GLONASS L2 C/A - log_rinex_nav(navMixFile, new_gal_eph, new_glo_eph); - break; - case 31: // GPS L2C + GLONASS L2 C/A - log_rinex_nav(navMixFile, new_cnav_eph, new_glo_eph); - break; - default: - break; } } -void Rinex_Printer::log_rinex_nav_bds_dnav(int type_of_rx, const std::map& new_bds_eph) +void Rinex_Printer::log_rinex_nav_bds_dnav(uint32_t signal_enabled_flags, const std::map& new_bds_eph) { - switch (type_of_rx) + const Signal_Enabled_Flags flags(signal_enabled_flags); + + if (flags.check_any_enabled(BDS_B1) || + flags.check_any_enabled(BDS_B3)) { - case 500: // BDS B1I only - case 600: // BDS B3I only - log_rinex_nav(navFile, new_bds_eph); - break; - default: - break; + log_rinex_nav(navBdsFile, new_bds_eph); } } diff --git a/src/algorithms/PVT/libs/rinex_printer.h b/src/algorithms/PVT/libs/rinex_printer.h index 8718a4b2f..726fff36b 100644 --- a/src/algorithms/PVT/libs/rinex_printer.h +++ b/src/algorithms/PVT/libs/rinex_printer.h @@ -170,37 +170,37 @@ public: void print_rinex_annotation(const Rtklib_Solver* pvt_solver, const std::map& gnss_observables_map, double rx_time, - int type_of_rx, + uint32_t signal_enabled_flags, bool flag_write_RINEX_obs_output); /*! * \brief Print RINEX annotation for GPS NAV message */ - void log_rinex_nav_gps_nav(int type_of_rx, + void log_rinex_nav_gps_nav(uint32_t signal_enabled_flags, const std::map& new_eph); /*! * \brief Print RINEX annotation for GPS CNAV message */ - void log_rinex_nav_gps_cnav(int type_of_rx, + void log_rinex_nav_gps_cnav(uint32_t signal_enabled_flags, const std::map& new_cnav_eph); /*! * \brief Print RINEX annotation for Galileo NAV message */ - void log_rinex_nav_gal_nav(int type_of_rx, + void log_rinex_nav_gal_nav(uint32_t signal_enabled_flags, const std::map& new_gal_eph); /*! * \brief Print RINEX annotation for Glonass GNAV message */ - void log_rinex_nav_glo_gnav(int type_of_rx, + void log_rinex_nav_glo_gnav(uint32_t signal_enabled_flags, const std::map& new_glo_eph); /*! * \brief Print RINEX annotation for BeiDou DNAV message */ - void log_rinex_nav_bds_dnav(int type_of_rx, + void log_rinex_nav_bds_dnav(uint32_t signal_enabled_flags, const std::map& new_bds_eph); /*! @@ -1002,7 +1002,7 @@ private: std::fstream sbsFile; // Output file stream for RINEX SBAS raw data file std::fstream navGalFile; // Output file stream for RINEX Galileo navigation data file std::fstream navGloFile; // Output file stream for RINEX GLONASS navigation data file - std::fstream navBdsFile; // Output file stream for RINEX Galileo navigation data file + std::fstream navBdsFile; // Output file stream for RINEX Beidou navigation data file std::fstream navMixFile; // Output file stream for RINEX Mixed navigation data file std::string navfilename; // Name of RINEX navigation file for GPS L1 diff --git a/src/algorithms/PVT/libs/rtklib_solver.cc b/src/algorithms/PVT/libs/rtklib_solver.cc index 12207ecb4..95aa27263 100644 --- a/src/algorithms/PVT/libs/rtklib_solver.cc +++ b/src/algorithms/PVT/libs/rtklib_solver.cc @@ -33,10 +33,9 @@ #include "rtklib_solver.h" #include "Beidou_DNAV.h" #include "gnss_sdr_filesystem.h" +#include "receiver_type.h" #include "rtklib_rtkpos.h" -#include "rtklib_solution.h" #include -#include #include #include #include @@ -51,12 +50,12 @@ Rtklib_Solver::Rtklib_Solver(const rtk_t &rtk, const Pvt_Conf &conf, const std::string &dump_filename, - uint32_t type_of_rx, + uint32_t signal_enabled_flags, bool flag_dump_to_file, bool flag_dump_to_mat) : d_dump_filename(dump_filename), d_rtk(rtk), d_conf(conf), - d_type_of_rx(type_of_rx), + d_signal_enabled_flags(signal_enabled_flags), d_flag_dump_enabled(flag_dump_to_file), d_flag_dump_mat_enabled(flag_dump_to_mat) { @@ -78,65 +77,58 @@ Rtklib_Solver::Rtklib_Solver(const rtk_t &rtk, d_rtklib_band_index["L5"] = 2; d_rtklib_band_index["E6"] = 0; - switch (d_type_of_rx) + const Signal_Enabled_Flags flags(d_signal_enabled_flags); + + if (flags.check_only_enabled(GAL_E5b) || + flags.check_only_enabled(GPS_1C, GAL_E5b) || + flags.check_only_enabled(GAL_1B, GAL_E5b) || + flags.check_only_enabled(GPS_2S, GAL_E5b)) { - case 6: // E5b only d_rtklib_freq_index[2] = 4; - break; - case 11: // GPS L1 C/A + Galileo E5b - d_rtklib_freq_index[2] = 4; - break; - case 15: // Galileo E1B + Galileo E5b - d_rtklib_freq_index[2] = 4; - break; - case 18: // GPS L2C + Galileo E5b - d_rtklib_freq_index[2] = 4; - break; - case 19: // Galileo E5a + Galileo E5b + } + else if (flags.check_only_enabled(GAL_E5a, GAL_E5b)) + { d_rtklib_band_index["5X"] = 0; d_rtklib_freq_index[0] = 2; d_rtklib_freq_index[2] = 4; - break; - case 20: // GPS L5 + Galileo E5b + } + else if (flags.check_only_enabled(GPS_L5, GAL_E5b)) + { d_rtklib_band_index["L5"] = 0; d_rtklib_freq_index[0] = 2; d_rtklib_freq_index[2] = 4; - break; - case 100: // E6B only + } + else if (flags.check_only_enabled(GAL_E6)) + { d_rtklib_freq_index[0] = 3; - break; - case 101: // E1 + E6B + } + else if (flags.check_only_enabled(GAL_1B, GAL_E6) || + flags.check_only_enabled(GAL_E5a, GAL_E6) || + flags.check_only_enabled(GAL_1B, GAL_E5a, GAL_E6)) + { d_rtklib_band_index["E6"] = 1; d_rtklib_freq_index[1] = 3; - break; - case 102: // E5a + E6B - d_rtklib_band_index["E6"] = 1; - d_rtklib_freq_index[1] = 3; - break; - case 103: // E5b + E6B + } + else if (flags.check_only_enabled(GAL_E5b, GAL_E6) || + flags.check_only_enabled(GAL_1B, GAL_E5b, GAL_E6)) + { d_rtklib_band_index["E6"] = 1; d_rtklib_freq_index[1] = 3; d_rtklib_freq_index[2] = 4; - break; - case 104: // Galileo E1B + Galileo E5a + Galileo E6B + } + else if (flags.check_only_enabled(GAL_1B, GAL_E5a, GAL_E6) || + flags.check_only_enabled(GPS_1C, GAL_1B, GAL_E6) || + flags.check_only_enabled(GPS_1C, GAL_E6)) + { d_rtklib_band_index["E6"] = 1; d_rtklib_freq_index[1] = 3; - break; - case 105: // Galileo E1B + Galileo E5b + Galileo E6B - d_rtklib_freq_index[2] = 4; - d_rtklib_band_index["E6"] = 1; - d_rtklib_freq_index[1] = 3; - break; - case 106: // GPS L1 C/A + Galileo E1B + Galileo E6B - case 107: // GPS L1 C/A + Galileo E6B - d_rtklib_band_index["E6"] = 1; - d_rtklib_freq_index[1] = 3; - break; - case 108: // GPS L1 C/A + Galileo E1B + GPS L5 + Galileo E5a + Galileo E6B + } + else if (flags.check_only_enabled(GPS_1C, GAL_1B, GPS_L5, GAL_E5a, GAL_E5b)) + { d_rtklib_band_index["E6"] = 2; d_rtklib_freq_index[2] = 3; - break; } + // auto empty_map = std::map < int, HAS_obs_corrections >> (); // d_has_obs_corr_map["L1 C/A"] = empty_map; diff --git a/src/algorithms/PVT/libs/rtklib_solver.h b/src/algorithms/PVT/libs/rtklib_solver.h index 4ce472581..17c9000d8 100644 --- a/src/algorithms/PVT/libs/rtklib_solver.h +++ b/src/algorithms/PVT/libs/rtklib_solver.h @@ -85,7 +85,7 @@ public: Rtklib_Solver(const rtk_t& rtk, const Pvt_Conf& conf, const std::string& dump_filename, - uint32_t type_of_rx, + uint32_t signal_enabled_flags, bool flag_dump_to_file, bool flag_dump_to_mat); @@ -155,7 +155,7 @@ private: Monitor_Pvt d_monitor_pvt{}; Pvt_Conf d_conf; Pvt_Kf d_pvt_kf; - uint32_t d_type_of_rx; + uint32_t d_signal_enabled_flags; bool d_flag_dump_enabled; bool d_flag_dump_mat_enabled; }; diff --git a/tests/unit-tests/signal-processing-blocks/pvt/nmea_printer_test.cc b/tests/unit-tests/signal-processing-blocks/pvt/nmea_printer_test.cc index eac226411..70f05e714 100644 --- a/tests/unit-tests/signal-processing-blocks/pvt/nmea_printer_test.cc +++ b/tests/unit-tests/signal-processing-blocks/pvt/nmea_printer_test.cc @@ -15,11 +15,12 @@ */ -#include "gnss_sdr_filesystem.h" #include "nmea_printer.h" #include "pvt_conf.h" +#include "receiver_type.h" #include "rtklib_rtkpos.h" #include "rtklib_solver.h" +#include #include #include @@ -147,7 +148,7 @@ TEST_F(NmeaPrinterTest, PrintLine) std::string filename("nmea_test.nmea"); Pvt_Conf conf; conf.use_e6_for_pvt = false; - std::shared_ptr pvt_solution = std::make_shared(rtk, conf, "filename", 1, false, false); + std::shared_ptr pvt_solution = std::make_shared(rtk, conf, "filename", GPS_1C, false, false); boost::posix_time::ptime pt(boost::gregorian::date(1994, boost::date_time::Nov, 19), boost::posix_time::hours(22) + boost::posix_time::minutes(54) + boost::posix_time::seconds(46)); diff --git a/tests/unit-tests/signal-processing-blocks/pvt/rinex_printer_test.cc b/tests/unit-tests/signal-processing-blocks/pvt/rinex_printer_test.cc index 754bae627..01c325b00 100644 --- a/tests/unit-tests/signal-processing-blocks/pvt/rinex_printer_test.cc +++ b/tests/unit-tests/signal-processing-blocks/pvt/rinex_printer_test.cc @@ -14,11 +14,12 @@ * ----------------------------------------------------------------------------- */ -#include "gnss_sdr_filesystem.h" #include "pvt_conf.h" +#include "receiver_type.h" #include "rinex_printer.h" #include "rtklib_rtkpos.h" #include "rtklib_solver.h" +#include #include #include #include @@ -146,7 +147,8 @@ TEST_F(RinexPrinterTest, GalileoObsHeader) { Pvt_Conf conf; conf.use_e6_for_pvt = false; - auto pvt_solution = std::make_shared(rtk, conf, "filename", 4, false, false); + const auto signal_enabled_flags = GAL_1B; + auto pvt_solution = std::make_shared(rtk, conf, "filename", signal_enabled_flags, false, false); auto eph = Galileo_Ephemeris(); eph.PRN = 1; pvt_solution->galileo_ephemeris_map[1] = std::move(eph); @@ -158,11 +160,7 @@ TEST_F(RinexPrinterTest, GalileoObsHeader) auto rp = std::make_shared(); - rp->print_rinex_annotation(pvt_solution.get(), - gnss_observables_map, - 0.0, - 4, - true); + rp->print_rinex_annotation(pvt_solution.get(), gnss_observables_map, 0.0, signal_enabled_flags, true); std::string obsfile = rp->get_obsfilename(); std::string navfile = rp->get_navfilename()[0]; @@ -196,11 +194,7 @@ TEST_F(RinexPrinterTest, GalileoObsHeader) auto rp2 = std::make_shared(); - rp2->print_rinex_annotation(pvt_solution.get(), - gnss_observables_map, - 0.0, - 15, - true); + rp2->print_rinex_annotation(pvt_solution.get(), gnss_observables_map, 0.0, GAL_1B | GAL_E5b, true); obsfile = rp2->get_obsfilename(); navfile = rp2->get_navfilename()[0]; @@ -234,7 +228,8 @@ TEST_F(RinexPrinterTest, GlonassObsHeader) { Pvt_Conf conf; conf.use_e6_for_pvt = false; - auto pvt_solution = std::make_shared(rtk, conf, "filename", 28, false, false); + const auto signal_enabled_flags = GLO_1G; + auto pvt_solution = std::make_shared(rtk, conf, "filename", signal_enabled_flags, false, false); auto eph = Glonass_Gnav_Ephemeris(); eph.PRN = 1; pvt_solution->glonass_gnav_ephemeris_map[1] = std::move(eph); @@ -246,11 +241,7 @@ TEST_F(RinexPrinterTest, GlonassObsHeader) auto rp = std::make_shared(3); - rp->print_rinex_annotation(pvt_solution.get(), - gnss_observables_map, - 0.0, - 23, - true); + rp->print_rinex_annotation(pvt_solution.get(), gnss_observables_map, 0.0, signal_enabled_flags, true); std::string obsfile = rp->get_obsfilename(); std::string navfile = rp->get_navfilename()[0]; @@ -296,7 +287,8 @@ TEST_F(RinexPrinterTest, MixedObsHeader) eph_gps.PRN = 1; Pvt_Conf conf; conf.use_e6_for_pvt = false; - auto pvt_solution = std::make_shared(rtk, conf, "filename", 106, false, false); + const auto signal_enabled_flags = GPS_1C | GAL_1B | GAL_E5a; + auto pvt_solution = std::make_shared(rtk, conf, "filename", signal_enabled_flags, false, false); pvt_solution->galileo_ephemeris_map[1] = std::move(eph_gal); pvt_solution->gps_ephemeris_map[1] = std::move(eph_gps); @@ -309,11 +301,7 @@ TEST_F(RinexPrinterTest, MixedObsHeader) auto rp = std::make_shared(); - rp->print_rinex_annotation(pvt_solution.get(), - gnss_observables_map, - 0.0, - 33, - true); + rp->print_rinex_annotation(pvt_solution.get(), gnss_observables_map, 0.0, signal_enabled_flags, true); std::string obsfile = rp->get_obsfilename(); std::string navfile = rp->get_navfilename()[0]; @@ -368,7 +356,8 @@ TEST_F(RinexPrinterTest, MixedObsHeaderGpsGlo) eph_gps.PRN = 1; Pvt_Conf conf; conf.use_e6_for_pvt = false; - auto pvt_solution = std::make_shared(rtk, conf, "filename", 26, false, false); + const auto signal_enabled_flags = GPS_1C | GLO_1G; + auto pvt_solution = std::make_shared(rtk, conf, "filename", signal_enabled_flags, false, false); pvt_solution->glonass_gnav_ephemeris_map[1] = std::move(eph_glo); pvt_solution->gps_ephemeris_map[1] = std::move(eph_gps); @@ -381,11 +370,7 @@ TEST_F(RinexPrinterTest, MixedObsHeaderGpsGlo) auto rp = std::make_shared(); - rp->print_rinex_annotation(pvt_solution.get(), - gnss_observables_map, - 0.0, - 26, - true); + rp->print_rinex_annotation(pvt_solution.get(), gnss_observables_map, 0.0, signal_enabled_flags, true); std::string obsfile = rp->get_obsfilename(); std::string navfile = rp->get_navfilename()[0]; @@ -437,7 +422,8 @@ TEST_F(RinexPrinterTest, GalileoObsLog) eph.PRN = 1; Pvt_Conf conf; conf.use_e6_for_pvt = false; - auto pvt_solution = std::make_shared(rtk, conf, "filename", 4, false, false); + const auto signal_enabled_flags = GAL_1B; + auto pvt_solution = std::make_shared(rtk, conf, "filename", signal_enabled_flags, false, false); pvt_solution->galileo_ephemeris_map[1] = eph; std::map gnss_observables_map; @@ -474,11 +460,7 @@ TEST_F(RinexPrinterTest, GalileoObsLog) gnss_observables_map.insert(std::pair(4, gs4)); auto rp = std::make_shared(); - rp->print_rinex_annotation(pvt_solution.get(), - gnss_observables_map, - 0.0, - 4, - true); + rp->print_rinex_annotation(pvt_solution.get(), gnss_observables_map, 0.0, signal_enabled_flags, true); std::string obsfile = rp->get_obsfilename(); std::string navfile = rp->get_navfilename()[0]; @@ -519,7 +501,8 @@ TEST_F(RinexPrinterTest, GlonassObsLog) eph.PRN = 22; Pvt_Conf conf; conf.use_e6_for_pvt = false; - auto pvt_solution = std::make_shared(rtk, conf, "filename", 23, false, false); + const auto signal_enabled_flags = GLO_1G; + auto pvt_solution = std::make_shared(rtk, conf, "filename", signal_enabled_flags, false, false); pvt_solution->glonass_gnav_ephemeris_map[1] = eph; std::map gnss_observables_map; @@ -556,11 +539,7 @@ TEST_F(RinexPrinterTest, GlonassObsLog) gnss_observables_map.insert(std::pair(4, gs4)); auto rp = std::make_shared(); - rp->print_rinex_annotation(pvt_solution.get(), - gnss_observables_map, - 0.0, - 23, - true); + rp->print_rinex_annotation(pvt_solution.get(), gnss_observables_map, 0.0, signal_enabled_flags, true); std::string obsfile = rp->get_obsfilename(); std::string navfile = rp->get_navfilename()[0]; @@ -603,7 +582,8 @@ TEST_F(RinexPrinterTest, GpsObsLogDualBand) eph_cnav.PRN = 1; Pvt_Conf conf; conf.use_e6_for_pvt = false; - auto pvt_solution = std::make_shared(rtk, conf, "filename", 7, false, false); + const auto signal_enabled_flags = GPS_1C | GPS_2S; + auto pvt_solution = std::make_shared(rtk, conf, "filename", signal_enabled_flags, false, false); pvt_solution->gps_ephemeris_map[1] = std::move(eph); pvt_solution->gps_cnav_ephemeris_map[1] = std::move(eph_cnav); std::map gnss_observables_map; @@ -653,11 +633,7 @@ TEST_F(RinexPrinterTest, GpsObsLogDualBand) gnss_observables_map.insert(std::pair(4, gs4)); auto rp = std::make_shared(); - rp->print_rinex_annotation(pvt_solution.get(), - gnss_observables_map, - 0.0, - 7, - true); + rp->print_rinex_annotation(pvt_solution.get(), gnss_observables_map, 0.0, signal_enabled_flags, true); std::string obsfile = rp->get_obsfilename(); std::string navfile = rp->get_navfilename()[0]; @@ -693,7 +669,8 @@ TEST_F(RinexPrinterTest, GalileoObsLogDualBand) { Pvt_Conf conf; conf.use_e6_for_pvt = false; - auto pvt_solution = std::make_shared(rtk, conf, "filename", 14, false, false); + const auto signal_enabled_flags = GAL_1B | GAL_E5a; + auto pvt_solution = std::make_shared(rtk, conf, "filename", signal_enabled_flags, false, false); auto eph = Galileo_Ephemeris(); eph.PRN = 1; pvt_solution->galileo_ephemeris_map[1] = eph; @@ -745,11 +722,7 @@ TEST_F(RinexPrinterTest, GalileoObsLogDualBand) auto rp = std::make_shared(); - rp->print_rinex_annotation(pvt_solution.get(), - gnss_observables_map, - 0.0, - 14, - true); + rp->print_rinex_annotation(pvt_solution.get(), gnss_observables_map, 0.0, signal_enabled_flags, true); std::string obsfile = rp->get_obsfilename(); std::string navfile = rp->get_navfilename()[0]; @@ -795,7 +768,8 @@ TEST_F(RinexPrinterTest, MixedObsLog) eph_gal.PRN = 1; Pvt_Conf conf; conf.use_e6_for_pvt = false; - auto pvt_solution = std::make_shared(rtk, conf, "filename", 9, false, false); + const auto signal_enabled_flags = GPS_1C | GAL_1B; + auto pvt_solution = std::make_shared(rtk, conf, "filename", signal_enabled_flags, false, false); pvt_solution->gps_ephemeris_map[1] = std::move(eph_gps); pvt_solution->galileo_ephemeris_map[1] = std::move(eph_gal); std::map gnss_observables_map; @@ -875,11 +849,7 @@ TEST_F(RinexPrinterTest, MixedObsLog) auto rp = std::make_shared(); - rp->print_rinex_annotation(pvt_solution.get(), - gnss_observables_map, - 0.0, - 9, - true); + rp->print_rinex_annotation(pvt_solution.get(), gnss_observables_map, 0.0, signal_enabled_flags, true); std::string obsfile = rp->get_obsfilename(); std::string navfile = rp->get_navfilename()[0]; @@ -921,7 +891,8 @@ TEST_F(RinexPrinterTest, MixedObsLogGpsGlo) eph_glo.PRN = 1; Pvt_Conf conf; conf.use_e6_for_pvt = false; - auto pvt_solution = std::make_shared(rtk, conf, "filename", 26, false, false); + const auto signal_enabled_flags = GPS_1C | GLO_1G; + auto pvt_solution = std::make_shared(rtk, conf, "filename", signal_enabled_flags, false, false); pvt_solution->gps_ephemeris_map[1] = std::move(eph_gps); pvt_solution->glonass_gnav_ephemeris_map[1] = std::move(eph_glo); std::map gnss_observables_map; @@ -999,11 +970,7 @@ TEST_F(RinexPrinterTest, MixedObsLogGpsGlo) auto rp = std::make_shared(); - rp->print_rinex_annotation(pvt_solution.get(), - gnss_observables_map, - 0.0, - 26, - true); + rp->print_rinex_annotation(pvt_solution.get(), gnss_observables_map, 0.0, signal_enabled_flags, true); std::string obsfile = rp->get_obsfilename(); std::string navfile = rp->get_navfilename()[0]; From 6d5f7b625484a7e5dbfeb895c3dc4c344e42e864 Mon Sep 17 00:00:00 2001 From: Mathieu Favreau Date: Wed, 23 Jul 2025 20:43:00 +0000 Subject: [PATCH 02/11] Finish removal of receiver type --- .../PVT/gnuradio_blocks/rtklib_pvt_gs.cc | 9 +- src/algorithms/PVT/libs/receiver_type.cc | 230 --- src/algorithms/PVT/libs/receiver_type.h | 68 - src/algorithms/PVT/libs/rtcm_printer.cc | 1348 ++--------------- src/algorithms/PVT/libs/rtcm_printer.h | 8 +- 5 files changed, 112 insertions(+), 1551 deletions(-) diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc index 513af549d..6925152f2 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc @@ -2458,17 +2458,12 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item } if (d_rtcm_enabled) { - const Signal_Enabled_Flags flags(d_signal_enabled_flags); - d_rtcm_printer->Print_Rtcm_Messages(d_user_pvt_solver.get(), d_gnss_observables_map, d_rx_time, - get_type_of_receiver(flags), - d_rtcm_MSM_rate_ms, - d_rtcm_MT1019_rate_ms, - d_rtcm_MT1020_rate_ms, - d_rtcm_MT1045_rate_ms, + d_signal_enabled_flags, d_rtcm_MT1077_rate_ms, + d_rtcm_MT1087_rate_ms, d_rtcm_MT1097_rate_ms, flag_write_RTCM_MSM_output, flag_write_RTCM_1019_output, diff --git a/src/algorithms/PVT/libs/receiver_type.cc b/src/algorithms/PVT/libs/receiver_type.cc index 7f36b0c68..cd04705a2 100644 --- a/src/algorithms/PVT/libs/receiver_type.cc +++ b/src/algorithms/PVT/libs/receiver_type.cc @@ -62,233 +62,3 @@ Signal_Enabled_Flags::Signal_Enabled_Flags(const ConfigurationInterface* configu Signal_Enabled_Flags::Signal_Enabled_Flags(uint32_t flags_) : flags(flags_) { } - - -uint32_t get_type_of_receiver(const Signal_Enabled_Flags& signal_enabled_flags) -{ - if (signal_enabled_flags.check_only_enabled(GPS_1C)) - { - return 1; // GPS L1 C/A - } - if (signal_enabled_flags.check_only_enabled(GPS_2S)) - { - return 2; // GPS L2C - } - if (signal_enabled_flags.check_only_enabled(GPS_L5)) - { - return 3; // L5 - } - if (signal_enabled_flags.check_only_enabled(GAL_1B)) - { - return 4; // E1 - } - if (signal_enabled_flags.check_only_enabled(GAL_E5a)) - { - return 5; // E5a - } - if (signal_enabled_flags.check_only_enabled(GAL_E5b)) - { - return 6; // E5b - } - if (signal_enabled_flags.check_only_enabled(GPS_1C, GPS_2S)) - { - return 7; // GPS L1 C/A + GPS L2C - } - if (signal_enabled_flags.check_only_enabled(GPS_1C, GPS_L5)) - { - return 8; // L1+L5 - } - if (signal_enabled_flags.check_only_enabled(GPS_1C, GAL_1B)) - { - return 9; // L1+E1 - } - if (signal_enabled_flags.check_only_enabled(GPS_1C, GAL_E5a)) - { - return 10; // GPS L1 C/A + Galileo E5a - } - if (signal_enabled_flags.check_only_enabled(GPS_1C, GAL_E5b)) - { - return 11; // GPS L1 C/A + Galileo E5b - } - if (signal_enabled_flags.check_only_enabled(GPS_2S, GAL_1B)) - { - return 12; // Galileo E1B + GPS L2C - } - if (signal_enabled_flags.check_only_enabled(GPS_L5, GAL_E5a)) - { - return 13; // L5+E5a - } - if (signal_enabled_flags.check_only_enabled(GAL_1B, GAL_E5a)) - { - return 14; // Galileo E1B + Galileo E5a - } - if (signal_enabled_flags.check_only_enabled(GAL_1B, GAL_E5b)) - { - return 15; // Galileo E1B + Galileo E5b - } - if (signal_enabled_flags.check_only_enabled(GPS_2S, GPS_L5)) - { - return 16; // GPS L2C + GPS L5 - } - if (signal_enabled_flags.check_only_enabled(GPS_2S, GAL_E5a)) - { - return 17; // GPS L2C + Galileo E5a - } - if (signal_enabled_flags.check_only_enabled(GPS_2S, GAL_E5b)) - { - return 18; // GPS L2C + Galileo E5b - } - if (signal_enabled_flags.check_only_enabled(GAL_E5a, GAL_E5b)) - { - return 19; // Galileo E5a + Galileo E5b - } - if (signal_enabled_flags.check_only_enabled(GPS_L5, GAL_E5b)) - { - return 20; // GPS L5 + Galileo E5b - } - if (signal_enabled_flags.check_only_enabled(GPS_1C, GAL_1B, GPS_2S)) - { - return 21; // GPS L1 C/A + Galileo E1B + GPS L2C - } - if (signal_enabled_flags.check_only_enabled(GPS_1C, GAL_1B, GPS_L5)) - { - return 22; // GPS L1 C/A + Galileo E1B + GPS L5 - } - if (signal_enabled_flags.check_only_enabled(GLO_1G)) - { - return 23; // GLONASS L1 C/A - } - if (signal_enabled_flags.check_only_enabled(GLO_2G)) - { - return 24; // GLONASS L2 C/A - } - if (signal_enabled_flags.check_only_enabled(GLO_1G, GLO_2G)) - { - return 25; // GLONASS L1 C/A + GLONASS L2 C/A - } - if (signal_enabled_flags.check_only_enabled(GPS_1C, GLO_1G)) - { - return 26; // GPS L1 C/A + GLONASS L1 C/A - } - if (signal_enabled_flags.check_only_enabled(GAL_1B, GLO_1G)) - { - return 27; // Galileo E1B + GLONASS L1 C/A - } - if (signal_enabled_flags.check_only_enabled(GPS_2S, GLO_1G)) - { - return 28; // GPS L2C + GLONASS L1 C/A - } - if (signal_enabled_flags.check_only_enabled(GPS_1C, GLO_2G)) - { - return 29; // GPS L1 C/A + GLONASS L2 C/A - } - if (signal_enabled_flags.check_only_enabled(GAL_1B, GLO_2G)) - { - return 30; // Galileo E1B + GLONASS L2 C/A - } - if (signal_enabled_flags.check_only_enabled(GPS_2S, GLO_2G)) - { - return 31; // GPS L2C + GLONASS L2 C/A - } - if (signal_enabled_flags.check_only_enabled(GPS_1C, GAL_1B, GPS_L5, GAL_E5a)) - { - return 32; // L1+E1+L5+E5a - } - if (signal_enabled_flags.check_only_enabled(GPS_1C, GAL_1B, GAL_E5a)) - { - return 33; // L1+E1+E5a - } - // Galileo E6 - if (signal_enabled_flags.check_only_enabled(GAL_E6)) - { - return 100; // Galileo E6B - } - if (signal_enabled_flags.check_only_enabled(GAL_1B, GAL_E6)) - { - return 101; // Galileo E1B + Galileo E6B - } - if (signal_enabled_flags.check_only_enabled(GAL_E5a, GAL_E6)) - { - return 102; // Galileo E5a + Galileo E6B - } - if (signal_enabled_flags.check_only_enabled(GAL_E5b, GAL_E6)) - { - return 103; // Galileo E5b + Galileo E6B - } - if (signal_enabled_flags.check_only_enabled(GAL_1B, GAL_E5a, GAL_E6)) - { - return 104; // Galileo E1B + Galileo E5a + Galileo E6B - } - if (signal_enabled_flags.check_only_enabled(GAL_1B, GAL_E5b, GAL_E6)) - { - return 105; // Galileo E1B + Galileo E5b + Galileo E6B - } - if (signal_enabled_flags.check_only_enabled(GPS_1C, GAL_1B, GAL_E6)) - { - return 106; // GPS L1 C/A + Galileo E1B + Galileo E6B - } - if (signal_enabled_flags.check_only_enabled(GPS_1C, GAL_E6)) - { - return 107; // GPS L1 C/A + Galileo E6B - } - if (signal_enabled_flags.check_only_enabled(GPS_1C, GAL_1B, GPS_L5, GAL_E5a, GAL_E6)) - { - return 108; // GPS L1 C/A + Galileo E1B + GPS L5 + Galileo E5a + Galileo E6B - } - // BeiDou B1I Receiver - if (signal_enabled_flags.check_only_enabled(BDS_B1)) - { - return 500; // Beidou B1I - } - if (signal_enabled_flags.check_only_enabled(BDS_B1, GPS_1C)) - { - return 501; // Beidou B1I + GPS L1 C/A - } - if (signal_enabled_flags.check_only_enabled(BDS_B1, GAL_1B)) - { - return 502; // Beidou B1I + Galileo E1B - } - if (signal_enabled_flags.check_only_enabled(BDS_B1, GLO_1G)) - { - return 503; // Beidou B1I + GLONASS L1 C/A - } - if (signal_enabled_flags.check_only_enabled(BDS_B1, GPS_1C, GAL_1B)) - { - return 504; // Beidou B1I + GPS L1 C/A + Galileo E1B - } - if (signal_enabled_flags.check_only_enabled(BDS_B1, GPS_1C, GLO_1G, GAL_1B)) - { - return 505; // Beidou B1I + GPS L1 C/A + GLONASS L1 C/A + Galileo E1B - } - if (signal_enabled_flags.check_only_enabled(BDS_B1, BDS_B3)) - { - return 506; // Beidou B1I + Beidou B3I - } - // BeiDou B3I Receiver - if (signal_enabled_flags.check_only_enabled(BDS_B3)) - { - return 600; // Beidou B3I - } - if (signal_enabled_flags.check_only_enabled(BDS_B3, GPS_2S)) - { - return 601; // Beidou B3I + GPS L2C - } - if (signal_enabled_flags.check_only_enabled(BDS_B3, GLO_2G)) - { - return 602; // Beidou B3I + GLONASS L2 C/A - } - if (signal_enabled_flags.check_only_enabled(BDS_B3, GPS_2S, GLO_2G)) - { - return 603; // Beidou B3I + GPS L2C + GLONASS L2 C/A - } - if (signal_enabled_flags.check_only_enabled(GPS_1C, GPS_2S, GPS_L5)) - { - return 1000; // GPS L1 + GPS L2C + GPS L5 - } - if (signal_enabled_flags.check_only_enabled(GPS_1C, GAL_1B, GPS_2S, GPS_L5, GAL_E5a)) - { - return 1001; // GPS L1 + Galileo E1B + GPS L2C + GPS L5 + Galileo E5a - } - - return 0; -} diff --git a/src/algorithms/PVT/libs/receiver_type.h b/src/algorithms/PVT/libs/receiver_type.h index 881e2a4b0..f2e75a0f6 100644 --- a/src/algorithms/PVT/libs/receiver_type.h +++ b/src/algorithms/PVT/libs/receiver_type.h @@ -69,72 +69,4 @@ public: const uint32_t flags; }; -// Infer the type of receiver -/* - * TYPE | RECEIVER - * 0 | Unknown - * 1 | GPS L1 C/A - * 2 | GPS L2C - * 3 | GPS L5 - * 4 | Galileo E1B - * 5 | Galileo E5a - * 6 | Galileo E5b - * 7 | GPS L1 C/A + GPS L2C - * 8 | GPS L1 C/A + GPS L5 - * 9 | GPS L1 C/A + Galileo E1B - * 10 | GPS L1 C/A + Galileo E5a - * 11 | GPS L1 C/A + Galileo E5b - * 12 | Galileo E1B + GPS L2C - * 13 | Galileo E5a + GPS L5 - * 14 | Galileo E1B + Galileo E5a - * 15 | Galileo E1B + Galileo E5b - * 16 | GPS L2C + GPS L5 - * 17 | GPS L2C + Galileo E5a - * 18 | GPS L2C + Galileo E5b - * 19 | Galileo E5a + Galileo E5b - * 20 | GPS L5 + Galileo E5b - * 21 | GPS L1 C/A + Galileo E1B + GPS L2C - * 22 | GPS L1 C/A + Galileo E1B + GPS L5 - * 23 | GLONASS L1 C/A - * 24 | GLONASS L2 C/A - * 25 | GLONASS L1 C/A + GLONASS L2 C/A - * 26 | GPS L1 C/A + GLONASS L1 C/A - * 27 | Galileo E1B + GLONASS L1 C/A - * 28 | GPS L2C + GLONASS L1 C/A - * 29 | GPS L1 C/A + GLONASS L2 C/A - * 30 | Galileo E1B + GLONASS L2 C/A - * 31 | GPS L2C + GLONASS L2 C/A - * 32 | GPS L1 C/A + Galileo E1B + GPS L5 + Galileo E5a - * 33 | GPS L1 C/A + Galileo E1B + Galileo E5a - * - * Skipped previous values to avoid overlapping - * 100 | Galileo E6B - * 101 | Galileo E1B + Galileo E6B - * 102 | Galileo E5a + Galileo E6B - * 103 | Galileo E5b + Galileo E6B - * 104 | Galileo E1B + Galileo E5a + Galileo E6B - * 105 | Galileo E1B + Galileo E5b + Galileo E6B - * 106 | GPS L1 C/A + Galileo E1B + Galileo E6B - * 107 | GPS L1 C/A + Galileo E6B - * 108 | GPS L1 C/A + Galileo E1B + GPS L5 + Galileo E5a + Galileo E6B - * Skipped previous values to avoid overlapping - * 500 | BeiDou B1I - * 501 | BeiDou B1I + GPS L1 C/A - * 502 | BeiDou B1I + Galileo E1B - * 503 | BeiDou B1I + GLONASS L1 C/A - * 504 | BeiDou B1I + GPS L1 C/A + Galileo E1B - * 505 | BeiDou B1I + GPS L1 C/A + GLONASS L1 C/A + Galileo E1B - * 506 | BeiDou B1I + Beidou B3I - * Skipped previous values to avoid overlapping - * 600 | BeiDou B3I - * 601 | BeiDou B3I + GPS L2C - * 602 | BeiDou B3I + GLONASS L2 C/A - * 603 | BeiDou B3I + GPS L2C + GLONASS L2 C/A - * - * 1000 | GPS L1 C/A + GPS L2C + GPS L5 - * 1001 | GPS L1 C/A + Galileo E1B + GPS L2C + GPS L5 + Galileo E5a - */ - -uint32_t get_type_of_receiver(const Signal_Enabled_Flags& signal_enabled_flags); - #endif // GNSS_SDR_RECEIVER_TYPE_H diff --git a/src/algorithms/PVT/libs/rtcm_printer.cc b/src/algorithms/PVT/libs/rtcm_printer.cc index f6e382259..3265739b3 100644 --- a/src/algorithms/PVT/libs/rtcm_printer.cc +++ b/src/algorithms/PVT/libs/rtcm_printer.cc @@ -27,6 +27,7 @@ #include "gnss_synchro.h" #include "gps_cnav_ephemeris.h" #include "gps_ephemeris.h" +#include "receiver_type.h" #include "rtcm.h" #include "rtklib_solver.h" #include @@ -56,7 +57,6 @@ Rtcm_Printer::Rtcm_Printer(const std::string& filename, rtcm_devname(rtcm_dump_devname), port(rtcm_tcp_port), station_id(rtcm_station_id), - d_rtcm_writing_started(false), d_rtcm_file_dump(flag_rtcm_file_dump) { const boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time(); @@ -225,12 +225,9 @@ Rtcm_Printer::~Rtcm_Printer() void Rtcm_Printer::Print_Rtcm_Messages(const Rtklib_Solver* pvt_solver, const std::map& gnss_observables_map, double rx_time, - int32_t type_of_rx, - int32_t rtcm_MSM_rate_ms, - int32_t rtcm_MT1019_rate_ms, - int32_t rtcm_MT1020_rate_ms, - int32_t rtcm_MT1045_rate_ms, + uint32_t signal_enabled_flags, int32_t rtcm_MT1077_rate_ms, + int32_t rtcm_MT1087_rate_ms, int32_t rtcm_MT1097_rate_ms, bool flag_write_RTCM_MSM_output, bool flag_write_RTCM_1019_output, @@ -240,1268 +237,139 @@ void Rtcm_Printer::Print_Rtcm_Messages(const Rtklib_Solver* pvt_solver, { try { - if (d_rtcm_writing_started) + const Signal_Enabled_Flags flags(signal_enabled_flags); + const auto has_gps = flags.check_any_enabled(GPS_1C, GPS_2S, GPS_L5); + const auto has_galileo = flags.check_any_enabled(GAL_1B, GAL_E5a, GAL_E5b, GAL_E6); + const auto has_glonass = flags.check_any_enabled(GLO_1G, GLO_2G); + const auto has_beidou = flags.check_any_enabled(BDS_B1, BDS_B3); + const auto only_galileo = has_galileo && !(has_gps || has_glonass || has_beidou); + const auto only_glonass = has_glonass && !(has_gps || has_galileo || has_beidou); + + if (flag_write_RTCM_1019_output && flags.check_any_enabled(GPS_1C)) { - switch (type_of_rx) + for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) { - case 1: // GPS L1 C/A - if (flag_write_RTCM_1019_output == true) - { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 4: // Galileo E1B - case 5: // Galileo E5a - case 6: // Galileo E5b - if (flag_write_RTCM_1045_output == true) - { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 7: // GPS L1 C/A + GPS L2C - if (flag_write_RTCM_1019_output == true) - { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - const auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin(); - if ((gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 8: // L1+L5 - if (flag_write_RTCM_1019_output == true) - { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - const auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin(); - if ((gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 9: // GPS L1 C/A + Galileo E1B - if (flag_write_RTCM_1019_output == true) - { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (flag_write_RTCM_1045_output == true) - { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - int gps_channel = 0; - int gal_channel = 0; - for (const auto& gnss_observables_iter : gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (gal_channel == 0) - { - if (system == "E") - { - gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - } - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 13: // L5+E5a - if (flag_write_RTCM_1045_output == true) - { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - - if (flag_write_RTCM_MSM_output and rtcm_MSM_rate_ms != 0) - { - auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin(); - int gal_channel = 0; - int gps_channel = 0; - for (const auto& gnss_observables_iter : gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (gal_channel == 0) - { - if (system == "E") - { - gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - } - - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend() and (rtcm_MT1097_rate_ms != 0)) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - if (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend() and (rtcm_MT1077_rate_ms != 0)) - { - Print_Rtcm_MSM(7, {}, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 14: // Galileo E1B + Galileo E5a - case 15: // Galileo E1B + Galileo E5b - if (flag_write_RTCM_1045_output == true) - { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 23: // GLONASS L1 C/A - case 24: // GLONASS L2 C/A - case 25: // GLONASS L1 C/A + GLONASS L2 C/A - if (flag_write_RTCM_1020_output == true) - { - for (const auto& glonass_gnav_ephemeris_iter : pvt_solver->glonass_gnav_ephemeris_map) - { - Print_Rtcm_MT1020(glonass_gnav_ephemeris_iter.second, pvt_solver->glonass_gnav_utc_model); - } - } - if (flag_write_RTCM_MSM_output == true) - { - const auto glo_gnav_ephemeris_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - if (glo_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, {}, glo_gnav_ephemeris_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 26: // GPS L1 C/A + GLONASS L1 C/A - if (flag_write_RTCM_1019_output == true) - { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (flag_write_RTCM_1020_output == true) - { - for (const auto& glonass_gnav_ephemeris_iter : pvt_solver->glonass_gnav_ephemeris_map) - { - Print_Rtcm_MT1020(glonass_gnav_ephemeris_iter.second, pvt_solver->glonass_gnav_utc_model); - } - } - if (flag_write_RTCM_MSM_output == true) - { - auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - int gps_channel = 0; - int glo_channel = 0; - for (const auto& gnss_observables_iter : gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (glo_channel == 0) - { - if (system == "R") - { - glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - glo_channel = 1; - } - } - } - } - - if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 27: // GLONASS L1 C/A + Galileo E1B - if (flag_write_RTCM_1020_output == true) - { - for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) - { - Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); - } - } - if (flag_write_RTCM_1045_output == true) - { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - int gal_channel = 0; - int glo_channel = 0; - for (const auto& gnss_observables_iter : gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gal_channel == 0) - { - if (system == "E") - { - // This is a channel with valid GPS signal - gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - if (glo_channel == 0) - { - if (system == "R") - { - glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - glo_channel = 1; - } - } - } - } - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 29: // GPS L1 C/A + GLONASS L2 C/A - if (flag_write_RTCM_1019_output == true) - { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (flag_write_RTCM_1020_output == true) - { - for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) - { - Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); - } - } - if (flag_write_RTCM_MSM_output == true) - { - auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - int gps_channel = 0; - int glo_channel = 0; - for (const auto& gnss_observables_iter : gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (glo_channel == 0) - { - if (system == "R") - { - glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - glo_channel = 1; - } - } - } - } - if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 30: // GLONASS L2 C/A + Galileo E1B - if (flag_write_RTCM_1020_output == true) - { - for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) - { - Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); - } - } - if (flag_write_RTCM_1045_output == true) - { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - int gal_channel = 0; - int glo_channel = 0; - for (const auto& gnss_observables_iter : gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gal_channel == 0) - { - if (system == "E") - { - // This is a channel with valid GPS signal - gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - if (glo_channel == 0) - { - if (system == "R") - { - glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - glo_channel = 1; - } - } - } - } - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 32: // L1+E1+L5+E5a - if (flag_write_RTCM_1019_output == true) - { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (flag_write_RTCM_1045_output == true) - { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - int gal_channel = 0; - int gps_channel = 0; - for (const auto& gnss_observables_iter : gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gal_channel == 0) - { - if (system == "E") - { - // This is a channel with valid GPS signal - gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - if (gps_channel == 0) - { - if (system == "G") - { - gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - } - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 101: // Galileo E1B + Galileo E6B - case 102: // Galileo E5a + Galileo E6B - case 103: // Galileo E5b + Galileo E6B - case 104: // Galileo E1B + Galileo E5a + Galileo E6B - case 105: // Galileo E1B + Galileo E5b + Galileo E6B - if (flag_write_RTCM_1045_output == true) - { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 106: // GPS L1 C/A + Galileo E1B + Galileo E6B - if (flag_write_RTCM_1019_output == true) - { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (rtcm_MT1045_rate_ms != 0) - { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - int gal_channel = 0; - int gps_channel = 0; - for (const auto& gnss_observables_iter : gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gal_channel == 0) - { - if (system == "E") - { - // This is a channel with valid GPS signal - gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - if (gps_channel == 0) - { - if (system == "G") - { - gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - } - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 107: // GPS L1 C/A + Galileo E6B (print only GPS data) - if (flag_write_RTCM_1019_output == true) - { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - default: - break; + Print_Rtcm_MT1019(gps_eph_iter.second); } } - - if (!d_rtcm_writing_started) // the first time + if (flag_write_RTCM_1020_output && has_glonass) { - switch (type_of_rx) + for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) { - case 1: // GPS L1 C/A - if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 + Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); + } + } + if (flag_write_RTCM_1045_output && has_galileo) + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (flag_write_RTCM_MSM_output) + { + if (flags.check_only_enabled(GPS_1C) || flags.check_only_enabled(GPS_1C, GAL_E6)) + { + const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } + Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); } - if (rtcm_MSM_rate_ms != 0) // allows deactivating messages by setting rate = 0 + } + else if (flags.check_only_enabled(GPS_1C, GPS_2S) || flags.check_only_enabled(GPS_1C, GPS_L5)) + { + const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + const auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin(); + if ((gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) { - const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } + Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); } - d_rtcm_writing_started = true; - break; - case 4: // Galileo E1B - case 5: // Galileo E5a - case 6: // Galileo E5b - if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 + } + else if (only_galileo) + { + const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); } - if (rtcm_MSM_rate_ms != 0) + } + else if (only_glonass) + { + const auto glo_gnav_ephemeris_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); + if (glo_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) { - const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } + Print_Rtcm_MSM(7, {}, {}, {}, glo_gnav_ephemeris_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); } - d_rtcm_writing_started = true; - break; - case 7: // GPS L1 C/A + GPS L2C - if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (rtcm_MSM_rate_ms != 0) - { - const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - const auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin(); - if ((gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 8: // L1+L5 - if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (rtcm_MSM_rate_ms != 0) - { - const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - const auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin(); - if ((gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 9: // GPS L1 C/A + Galileo E1B - if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (rtcm_MT1045_rate_ms != 0) - { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (rtcm_MSM_rate_ms != 0) - { - auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - int gps_channel = 0; - int gal_channel = 0; - for (const auto& gnss_observables_iter : gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (gal_channel == 0) - { - if (system == "E") - { - gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - } - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; + } + else + { + auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cend(); + auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cend(); + auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cend(); + auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cend(); - case 13: // L5+E5a - if (rtcm_MT1045_rate_ms != 0) - { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (rtcm_MSM_rate_ms != 0) - { - auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - int gal_channel = 0; - for (const auto& gnss_observables_iter : gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gal_channel == 0) - { - if (system == "E") - { - gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - } + bool search_gps_nav = flags.check_any_enabled(GPS_1C); + bool search_gps_cnav = !search_gps_nav && flags.check_any_enabled(GPS_2S, GPS_L5); + bool search_gal = has_galileo; + bool search_glo = has_glonass; - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend() and (rtcm_MT1097_rate_ms != 0)) + for (const auto& gnss_observables_iter : gnss_observables_map) + { + switch (gnss_observables_iter.second.System) { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + case 'G': + { + if (search_gps_nav) + { + gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); + search_gps_nav = gps_eph_iter == pvt_solver->gps_ephemeris_map.cend(); + } + if (search_gps_cnav) + { + gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.find(gnss_observables_iter.second.PRN); + search_gps_cnav = gps_cnav_eph_iter == pvt_solver->gps_cnav_ephemeris_map.cend(); + } + break; + } + case 'E': + { + if (search_gal) + { + gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); + search_gal = gal_eph_iter == pvt_solver->galileo_ephemeris_map.cend(); + } + break; + } + case 'R': + { + if (search_glo) + { + glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); + search_glo = glonass_gnav_eph_iter == pvt_solver->glonass_gnav_ephemeris_map.cend(); + } + break; + } + default: + break; } } - d_rtcm_writing_started = true; - break; - case 14: // Galileo E1B + Galileo E5a - case 15: // Galileo E1B + Galileo E5b - if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (rtcm_MSM_rate_ms != 0) - { - const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 23: // GLONASS L1 C/A - case 24: // GLONASS L2 C/A - case 25: // GLONASS L1 C/A + GLONASS L2 C/A - if (rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) - { - Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); - } - } - if (rtcm_MSM_rate_ms != 0) - { - const auto glo_gnav_ephemeris_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - if (glo_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, {}, glo_gnav_ephemeris_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 26: // GPS L1 C/A + GLONASS L1 C/A - if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) - { - Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); - } - } - if (rtcm_MSM_rate_ms != 0) - { - auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - int gps_channel = 0; - int glo_channel = 0; - for (const auto& gnss_observables_iter : gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (glo_channel == 0) - { - if (system == "R") - { - glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - glo_channel = 1; - } - } - } - } - if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 27: // GLONASS L1 C/A + Galileo E1B - if (rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) - { - Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); - } - } - if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (rtcm_MSM_rate_ms != 0) - { - int gal_channel = 0; - int glo_channel = 0; - auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - for (const auto& gnss_observables_iter : gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gal_channel == 0) - { - if (system == "E") - { - // This is a channel with valid GPS signal - gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - if (glo_channel == 0) - { - if (system == "R") - { - glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - glo_channel = 1; - } - } - } - } - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 29: // GPS L1 C/A + GLONASS L2 C/A - if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) - { - Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); - } - } - if (rtcm_MSM_rate_ms != 0) - { - auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - int gps_channel = 0; - int glo_channel = 0; - for (const auto& gnss_observables_iter : gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (glo_channel == 0) - { - if (system == "R") - { - glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - glo_channel = 1; - } - } - } - } - if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 30: // GLONASS L2 C/A + Galileo E1B - if (rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0 + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend() && rtcm_MT1077_rate_ms != 0) { - for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) - { - Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); - } + Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); } - if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 + if (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend() && rtcm_MT1077_rate_ms != 0) { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } + Print_Rtcm_MSM(7, {}, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); } - if (rtcm_MSM_rate_ms != 0) + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend() && rtcm_MT1097_rate_ms != 0) { - int gal_channel = 0; - int glo_channel = 0; - auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - for (const auto& gnss_observables_iter : gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gal_channel == 0) - { - if (system == "E") - { - // This is a channel with valid GPS signal - gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - if (glo_channel == 0) - { - if (system == "R") - { - glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - glo_channel = 1; - } - } - } - } - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); } - d_rtcm_writing_started = true; - break; - case 32: // L1+E1+L5+E5a - if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend() && rtcm_MT1087_rate_ms != 0) { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } + Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); } - if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (rtcm_MSM_rate_ms != 0) - { - auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - int gps_channel = 0; - int gal_channel = 0; - for (const auto& gnss_observables_iter : gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (gal_channel == 0) - { - if (system == "E") - { - gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - } - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 101: // Galileo E1B + Galileo E6B - case 102: // Galileo E5a + Galileo E6B - case 103: // Galileo E5b + Galileo E6B - if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (rtcm_MSM_rate_ms != 0) - { - const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 104: // Galileo E1B + Galileo E5a + Galileo E6B - case 105: // Galileo E1B + Galileo E5b + Galileo E6B - if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (rtcm_MSM_rate_ms != 0) - { - const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 106: // GPS L1 C/A + Galileo E1B + Galileo E6B - if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (rtcm_MT1045_rate_ms != 0) - { - for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) - { - Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (rtcm_MSM_rate_ms != 0) - { - auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); - auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - int gal_channel = 0; - int gps_channel = 0; - for (const auto& gnss_observables_iter : gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gal_channel == 0) - { - if (system == "E") - { - // This is a channel with valid GPS signal - gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - if (gps_channel == 0) - { - if (system == "G") - { - gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - } - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 107: - if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) - { - Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (rtcm_MSM_rate_ms != 0) - { - auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); - int gps_channel = 0; - for (const auto& gnss_observables_iter : gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - } - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) - { - Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - default: - break; } } } diff --git a/src/algorithms/PVT/libs/rtcm_printer.h b/src/algorithms/PVT/libs/rtcm_printer.h index 66a5959b4..0ad27a879 100644 --- a/src/algorithms/PVT/libs/rtcm_printer.h +++ b/src/algorithms/PVT/libs/rtcm_printer.h @@ -72,12 +72,9 @@ public: void Print_Rtcm_Messages(const Rtklib_Solver* pvt_solver, const std::map& gnss_observables_map, double rx_time, - int32_t type_of_rx, - int32_t rtcm_MSM_rate_ms, - int32_t rtcm_MT1019_rate_ms, - int32_t rtcm_MT1020_rate_ms, - int32_t rtcm_MT1045_rate_ms, + uint32_t signal_enabled_flags, int32_t rtcm_MT1077_rate_ms, + int32_t rtcm_MT1087_rate_ms, int32_t rtcm_MT1097_rate_ms, bool flag_write_RTCM_MSM_output, bool flag_write_RTCM_1019_output, @@ -198,7 +195,6 @@ private: int32_t rtcm_dev_descriptor; // RTCM serial device descriptor (i.e. COM port) uint16_t port; uint16_t station_id; - bool d_rtcm_writing_started; bool d_rtcm_file_dump; }; From 3aa97191dfe1cbbb71611ef4158afa9c68ebe8d2 Mon Sep 17 00:00:00 2001 From: Mathieu Favreau Date: Wed, 23 Jul 2025 20:58:58 +0000 Subject: [PATCH 03/11] Rename file --- src/algorithms/PVT/adapters/rtklib_pvt.cc | 2 +- src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc | 2 +- src/algorithms/PVT/libs/CMakeLists.txt | 4 ++-- src/algorithms/PVT/libs/rinex_printer.cc | 2 +- src/algorithms/PVT/libs/rtcm_printer.cc | 2 +- src/algorithms/PVT/libs/rtklib_solver.cc | 2 +- .../libs/{receiver_type.cc => signal_enabled_flags.cc} | 6 +++--- .../libs/{receiver_type.h => signal_enabled_flags.h} | 10 +++++----- .../signal-processing-blocks/pvt/nmea_printer_test.cc | 2 +- .../signal-processing-blocks/pvt/rinex_printer_test.cc | 2 +- 10 files changed, 17 insertions(+), 17 deletions(-) rename src/algorithms/PVT/libs/{receiver_type.cc => signal_enabled_flags.cc} (94%) rename src/algorithms/PVT/libs/{receiver_type.h => signal_enabled_flags.h} (88%) diff --git a/src/algorithms/PVT/adapters/rtklib_pvt.cc b/src/algorithms/PVT/adapters/rtklib_pvt.cc index 73d9cb84f..0751a0404 100644 --- a/src/algorithms/PVT/adapters/rtklib_pvt.cc +++ b/src/algorithms/PVT/adapters/rtklib_pvt.cc @@ -25,8 +25,8 @@ #include "gps_almanac.h" // for Gps_Almanac #include "gps_ephemeris.h" // for Gps_Ephemeris #include "pvt_conf.h" // for Pvt_Conf -#include "receiver_type.h" // for get_type_of_receiver #include "rtklib_rtkpos.h" // for rtkfree, rtkinit +#include "signal_enabled_flags.h" // for get_type_of_receiver #include // for std::cout #if USE_GLOG_AND_GFLAGS #include diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc index 6925152f2..e79db7d8c 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc @@ -54,11 +54,11 @@ #include "nmea_printer.h" #include "osnma_data.h" #include "pvt_conf.h" -#include "receiver_type.h" #include "rinex_printer.h" #include "rtcm_printer.h" #include "rtklib_rtkcmn.h" #include "rtklib_solver.h" +#include "signal_enabled_flags.h" #include "trackingcmd.h" #include // for xml_iarchive #include // for xml_oarchive diff --git a/src/algorithms/PVT/libs/CMakeLists.txt b/src/algorithms/PVT/libs/CMakeLists.txt index 7a98f50ad..ae65cab84 100644 --- a/src/algorithms/PVT/libs/CMakeLists.txt +++ b/src/algorithms/PVT/libs/CMakeLists.txt @@ -24,7 +24,7 @@ set(PVT_LIB_SOURCES has_simple_printer.cc geohash.cc pvt_kf.cc - receiver_type.cc + signal_enabled_flags.cc ) set(PVT_LIB_HEADERS @@ -48,7 +48,7 @@ set(PVT_LIB_HEADERS has_simple_printer.h geohash.h pvt_kf.h - receiver_type.h + signal_enabled_flags.h ) list(SORT PVT_LIB_HEADERS) diff --git a/src/algorithms/PVT/libs/rinex_printer.cc b/src/algorithms/PVT/libs/rinex_printer.cc index c8b7ce453..37e47c192 100644 --- a/src/algorithms/PVT/libs/rinex_printer.cc +++ b/src/algorithms/PVT/libs/rinex_printer.cc @@ -35,8 +35,8 @@ #include "gps_iono.h" #include "gps_navigation_message.h" #include "gps_utc_model.h" -#include "receiver_type.h" #include "rtklib_solver.h" +#include "signal_enabled_flags.h" #include #include #include diff --git a/src/algorithms/PVT/libs/rtcm_printer.cc b/src/algorithms/PVT/libs/rtcm_printer.cc index 3265739b3..d7bd3ba3c 100644 --- a/src/algorithms/PVT/libs/rtcm_printer.cc +++ b/src/algorithms/PVT/libs/rtcm_printer.cc @@ -27,9 +27,9 @@ #include "gnss_synchro.h" #include "gps_cnav_ephemeris.h" #include "gps_ephemeris.h" -#include "receiver_type.h" #include "rtcm.h" #include "rtklib_solver.h" +#include "signal_enabled_flags.h" #include #include // for tm #include // for exception diff --git a/src/algorithms/PVT/libs/rtklib_solver.cc b/src/algorithms/PVT/libs/rtklib_solver.cc index 95aa27263..c61df11d5 100644 --- a/src/algorithms/PVT/libs/rtklib_solver.cc +++ b/src/algorithms/PVT/libs/rtklib_solver.cc @@ -33,8 +33,8 @@ #include "rtklib_solver.h" #include "Beidou_DNAV.h" #include "gnss_sdr_filesystem.h" -#include "receiver_type.h" #include "rtklib_rtkpos.h" +#include "signal_enabled_flags.h" #include #include #include diff --git a/src/algorithms/PVT/libs/receiver_type.cc b/src/algorithms/PVT/libs/signal_enabled_flags.cc similarity index 94% rename from src/algorithms/PVT/libs/receiver_type.cc rename to src/algorithms/PVT/libs/signal_enabled_flags.cc index cd04705a2..d7cd8a324 100644 --- a/src/algorithms/PVT/libs/receiver_type.cc +++ b/src/algorithms/PVT/libs/signal_enabled_flags.cc @@ -1,6 +1,6 @@ /*! - * \file receiver_type.cc - * \brief Helper function to get the receiver type + * \file signal_enabled_flags.cc + * \brief Class to check the enabled signals * \author Mathieu Favreau, 2025. favreau.mathieu(at)hotmail.com * * ----------------------------------------------------------------------------- @@ -14,7 +14,7 @@ * ----------------------------------------------------------------------------- */ -#include "receiver_type.h" +#include "signal_enabled_flags.h" #include "configuration_interface.h" // for ConfigurationInterface #include // for vector diff --git a/src/algorithms/PVT/libs/receiver_type.h b/src/algorithms/PVT/libs/signal_enabled_flags.h similarity index 88% rename from src/algorithms/PVT/libs/receiver_type.h rename to src/algorithms/PVT/libs/signal_enabled_flags.h index f2e75a0f6..8aae82ed4 100644 --- a/src/algorithms/PVT/libs/receiver_type.h +++ b/src/algorithms/PVT/libs/signal_enabled_flags.h @@ -1,6 +1,6 @@ /*! - * \file receiver_type.h - * \brief Helper function to get the receiver type + * \file signal_enabled_flags.h + * \brief Class to check the enabled signals * \author Mathieu Favreau, 2025. favreau.mathieu(at)hotmail.com * * ----------------------------------------------------------------------------- @@ -14,8 +14,8 @@ * ----------------------------------------------------------------------------- */ -#ifndef GNSS_SDR_RECEIVER_TYPE_H -#define GNSS_SDR_RECEIVER_TYPE_H +#ifndef GNSS_SDR_SIGNAL_ENABLED_FLAGS_H +#define GNSS_SDR_SIGNAL_ENABLED_FLAGS_H #include @@ -69,4 +69,4 @@ public: const uint32_t flags; }; -#endif // GNSS_SDR_RECEIVER_TYPE_H +#endif // GNSS_SDR_SIGNAL_ENABLED_FLAGS_H diff --git a/tests/unit-tests/signal-processing-blocks/pvt/nmea_printer_test.cc b/tests/unit-tests/signal-processing-blocks/pvt/nmea_printer_test.cc index 70f05e714..a87759752 100644 --- a/tests/unit-tests/signal-processing-blocks/pvt/nmea_printer_test.cc +++ b/tests/unit-tests/signal-processing-blocks/pvt/nmea_printer_test.cc @@ -17,9 +17,9 @@ #include "nmea_printer.h" #include "pvt_conf.h" -#include "receiver_type.h" #include "rtklib_rtkpos.h" #include "rtklib_solver.h" +#include "signal_enabled_flags.h" #include #include #include diff --git a/tests/unit-tests/signal-processing-blocks/pvt/rinex_printer_test.cc b/tests/unit-tests/signal-processing-blocks/pvt/rinex_printer_test.cc index 01c325b00..87ab3c425 100644 --- a/tests/unit-tests/signal-processing-blocks/pvt/rinex_printer_test.cc +++ b/tests/unit-tests/signal-processing-blocks/pvt/rinex_printer_test.cc @@ -15,10 +15,10 @@ */ #include "pvt_conf.h" -#include "receiver_type.h" #include "rinex_printer.h" #include "rtklib_rtkpos.h" #include "rtklib_solver.h" +#include "signal_enabled_flags.h" #include #include #include From 52cc8a5e2ca7478cc9d22b74ce32266f860c6b0e Mon Sep 17 00:00:00 2001 From: Mathieu Favreau Date: Wed, 23 Jul 2025 21:08:59 +0000 Subject: [PATCH 04/11] Fix comment --- src/algorithms/PVT/adapters/rtklib_pvt.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/PVT/adapters/rtklib_pvt.cc b/src/algorithms/PVT/adapters/rtklib_pvt.cc index 0751a0404..bdd2f21e5 100644 --- a/src/algorithms/PVT/adapters/rtklib_pvt.cc +++ b/src/algorithms/PVT/adapters/rtklib_pvt.cc @@ -26,7 +26,7 @@ #include "gps_ephemeris.h" // for Gps_Ephemeris #include "pvt_conf.h" // for Pvt_Conf #include "rtklib_rtkpos.h" // for rtkfree, rtkinit -#include "signal_enabled_flags.h" // for get_type_of_receiver +#include "signal_enabled_flags.h" // for signal_enabled_flags #include // for std::cout #if USE_GLOG_AND_GFLAGS #include From 802b8bc1fffae6bc3f49ddcc47511eb0b6663e10 Mon Sep 17 00:00:00 2001 From: Mathieu Favreau Date: Thu, 24 Jul 2025 12:23:56 +0000 Subject: [PATCH 05/11] Fix rtcm printer --- .../PVT/gnuradio_blocks/rtklib_pvt_gs.cc | 26 ++++++++++--- src/algorithms/PVT/libs/rtcm_printer.cc | 39 ++++++++++++------- src/algorithms/PVT/libs/rtcm_printer.h | 10 +++-- 3 files changed, 51 insertions(+), 24 deletions(-) diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc index e79db7d8c..1b8992d71 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc @@ -2349,6 +2349,15 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item // save_gnss_synchro_map_xml("./gnss_synchro_map.xml"); // getchar(); // stop the execution // end debug + + // allows deactivating messages by setting rate = 0 + const bool rtcm_MT1019_enabled = d_rtcm_MT1019_rate_ms != 0; + const bool rtcm_MT1020_enabled = d_rtcm_MT1020_rate_ms != 0; + const bool rtcm_MT1045_enabled = d_rtcm_MT1045_rate_ms != 0; + const bool rtcm_MT1077_enabled = d_rtcm_MT1077_rate_ms != 0; + const bool rtcm_MT1087_enabled = d_rtcm_MT1087_rate_ms != 0; + const bool rtcm_MT1097_enabled = d_rtcm_MT1097_rate_ms != 0; + if (d_display_rate_ms != 0) { if (current_RX_time_ms % d_display_rate_ms == 0) @@ -2356,27 +2365,28 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item flag_display_pvt = true; } } - if (d_rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 + if (rtcm_MT1019_enabled) { if (current_RX_time_ms % d_rtcm_MT1019_rate_ms == 0) { flag_write_RTCM_1019_output = true; } } - if (d_rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0 + if (rtcm_MT1020_enabled) // allows deactivating messages by setting rate = 0 { if (current_RX_time_ms % d_rtcm_MT1020_rate_ms == 0) { flag_write_RTCM_1020_output = true; } } - if (d_rtcm_MT1045_rate_ms != 0) + if (rtcm_MT1045_enabled != 0) { if (current_RX_time_ms % d_rtcm_MT1045_rate_ms == 0) { flag_write_RTCM_1045_output = true; } } + // TODO: RTCM 1077, 1087 and 1097 are not used, so, disable the output rates // if (current_RX_time_ms % d_rtcm_MT1077_rate_ms==0 && d_rtcm_MT1077_rate_ms != 0) // { @@ -2390,6 +2400,7 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item // { // last_RTCM_1097_output_time = current_RX_time; // } + if (d_rtcm_MSM_rate_ms != 0) { if (current_RX_time_ms % d_rtcm_MSM_rate_ms == 0) @@ -2462,9 +2473,12 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item d_gnss_observables_map, d_rx_time, d_signal_enabled_flags, - d_rtcm_MT1077_rate_ms, - d_rtcm_MT1087_rate_ms, - d_rtcm_MT1097_rate_ms, + rtcm_MT1019_enabled, + rtcm_MT1020_enabled, + rtcm_MT1045_enabled, + rtcm_MT1077_enabled, + rtcm_MT1087_enabled, + rtcm_MT1097_enabled, flag_write_RTCM_MSM_output, flag_write_RTCM_1019_output, flag_write_RTCM_1020_output, diff --git a/src/algorithms/PVT/libs/rtcm_printer.cc b/src/algorithms/PVT/libs/rtcm_printer.cc index d7bd3ba3c..d20d108fd 100644 --- a/src/algorithms/PVT/libs/rtcm_printer.cc +++ b/src/algorithms/PVT/libs/rtcm_printer.cc @@ -57,6 +57,7 @@ Rtcm_Printer::Rtcm_Printer(const std::string& filename, rtcm_devname(rtcm_dump_devname), port(rtcm_tcp_port), station_id(rtcm_station_id), + d_rtcm_has_written_once(false), d_rtcm_file_dump(flag_rtcm_file_dump) { const boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time(); @@ -226,9 +227,12 @@ void Rtcm_Printer::Print_Rtcm_Messages(const Rtklib_Solver* pvt_solver, const std::map& gnss_observables_map, double rx_time, uint32_t signal_enabled_flags, - int32_t rtcm_MT1077_rate_ms, - int32_t rtcm_MT1087_rate_ms, - int32_t rtcm_MT1097_rate_ms, + bool rtcm_MT1019_enabled, + bool rtcm_MT1020_enabled, + bool rtcm_MT1045_enabled, + bool rtcm_MT1077_enabled, + bool rtcm_MT1087_enabled, + bool rtcm_MT1097_enabled, bool flag_write_RTCM_MSM_output, bool flag_write_RTCM_1019_output, bool flag_write_RTCM_1020_output, @@ -244,31 +248,35 @@ void Rtcm_Printer::Print_Rtcm_Messages(const Rtklib_Solver* pvt_solver, const auto has_beidou = flags.check_any_enabled(BDS_B1, BDS_B3); const auto only_galileo = has_galileo && !(has_gps || has_glonass || has_beidou); const auto only_glonass = has_glonass && !(has_gps || has_galileo || has_beidou); + const auto print_MT1019 = (!d_rtcm_has_written_once && rtcm_MT1019_enabled) || flag_write_RTCM_1019_output; + const auto print_MT1020 = (!d_rtcm_has_written_once && rtcm_MT1020_enabled) || flag_write_RTCM_1020_output; + const auto print_MT1045 = (!d_rtcm_has_written_once && rtcm_MT1045_enabled) || flag_write_RTCM_1045_output; + const auto Print_MSM = !d_rtcm_has_written_once || flag_write_RTCM_MSM_output; - if (flag_write_RTCM_1019_output && flags.check_any_enabled(GPS_1C)) + if (print_MT1019 && flags.check_any_enabled(GPS_1C)) { for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) { Print_Rtcm_MT1019(gps_eph_iter.second); } } - if (flag_write_RTCM_1020_output && has_glonass) + if (print_MT1020 && has_glonass) { for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) { Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); } } - if (flag_write_RTCM_1045_output && has_galileo) + if (print_MT1045 && has_galileo) { for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) { Print_Rtcm_MT1045(gal_eph_iter.second); } } - if (flag_write_RTCM_MSM_output) + if (Print_MSM) { - if (flags.check_only_enabled(GPS_1C) || flags.check_only_enabled(GPS_1C, GAL_E6)) + if (rtcm_MT1077_enabled && (flags.check_only_enabled(GPS_1C) || flags.check_only_enabled(GPS_1C, GAL_E6))) { const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) @@ -276,7 +284,7 @@ void Rtcm_Printer::Print_Rtcm_Messages(const Rtklib_Solver* pvt_solver, Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); } } - else if (flags.check_only_enabled(GPS_1C, GPS_2S) || flags.check_only_enabled(GPS_1C, GPS_L5)) + else if (rtcm_MT1077_enabled && (flags.check_only_enabled(GPS_1C, GPS_2S) || flags.check_only_enabled(GPS_1C, GPS_L5))) { const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); const auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin(); @@ -285,7 +293,7 @@ void Rtcm_Printer::Print_Rtcm_Messages(const Rtklib_Solver* pvt_solver, Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); } } - else if (only_galileo) + else if (rtcm_MT1097_enabled && only_galileo) { const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) @@ -293,7 +301,7 @@ void Rtcm_Printer::Print_Rtcm_Messages(const Rtklib_Solver* pvt_solver, Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); } } - else if (only_glonass) + else if (rtcm_MT1087_enabled && only_glonass) { const auto glo_gnav_ephemeris_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); if (glo_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) @@ -354,24 +362,25 @@ void Rtcm_Printer::Print_Rtcm_Messages(const Rtklib_Solver* pvt_solver, } } - if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend() && rtcm_MT1077_rate_ms != 0) + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend() && rtcm_MT1077_enabled) { Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); } - if (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend() && rtcm_MT1077_rate_ms != 0) + if (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend() && rtcm_MT1077_enabled) { Print_Rtcm_MSM(7, {}, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); } - if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend() && rtcm_MT1097_rate_ms != 0) + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend() && rtcm_MT1097_enabled) { Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); } - if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend() && rtcm_MT1087_rate_ms != 0) + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend() && rtcm_MT1087_enabled) { Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); } } } + d_rtcm_has_written_once = true; } catch (const boost::exception& ex) { diff --git a/src/algorithms/PVT/libs/rtcm_printer.h b/src/algorithms/PVT/libs/rtcm_printer.h index 0ad27a879..4445e42be 100644 --- a/src/algorithms/PVT/libs/rtcm_printer.h +++ b/src/algorithms/PVT/libs/rtcm_printer.h @@ -73,9 +73,12 @@ public: const std::map& gnss_observables_map, double rx_time, uint32_t signal_enabled_flags, - int32_t rtcm_MT1077_rate_ms, - int32_t rtcm_MT1087_rate_ms, - int32_t rtcm_MT1097_rate_ms, + bool rtcm_MT1019_enabled, + bool rtcm_MT1020_enabled, + bool rtcm_MT1045_enabled, + bool rtcm_MT1077_enabled, + bool rtcm_MT1087_enabled, + bool rtcm_MT1097_enabled, bool flag_write_RTCM_MSM_output, bool flag_write_RTCM_1019_output, bool flag_write_RTCM_1020_output, @@ -195,6 +198,7 @@ private: int32_t rtcm_dev_descriptor; // RTCM serial device descriptor (i.e. COM port) uint16_t port; uint16_t station_id; + bool d_rtcm_has_written_once; bool d_rtcm_file_dump; }; From ffd68933293c66ad995e726b8b049ee0c9bae6be Mon Sep 17 00:00:00 2001 From: Mathieu Favreau Date: Thu, 24 Jul 2025 12:29:08 +0000 Subject: [PATCH 06/11] Fix more rtcm printer issues --- src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc | 6 ++++-- src/algorithms/PVT/libs/rtcm_printer.cc | 5 +++-- src/algorithms/PVT/libs/rtcm_printer.h | 1 + 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc index 1b8992d71..26d42afcb 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc @@ -2357,6 +2357,7 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item const bool rtcm_MT1077_enabled = d_rtcm_MT1077_rate_ms != 0; const bool rtcm_MT1087_enabled = d_rtcm_MT1087_rate_ms != 0; const bool rtcm_MT1097_enabled = d_rtcm_MT1097_rate_ms != 0; + const bool rtcm_MSM_enabled = d_rtcm_MSM_rate_ms != 0; if (d_display_rate_ms != 0) { @@ -2379,7 +2380,7 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item flag_write_RTCM_1020_output = true; } } - if (rtcm_MT1045_enabled != 0) + if (rtcm_MT1045_enabled) { if (current_RX_time_ms % d_rtcm_MT1045_rate_ms == 0) { @@ -2401,7 +2402,7 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item // last_RTCM_1097_output_time = current_RX_time; // } - if (d_rtcm_MSM_rate_ms != 0) + if (rtcm_MSM_enabled) { if (current_RX_time_ms % d_rtcm_MSM_rate_ms == 0) { @@ -2473,6 +2474,7 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item d_gnss_observables_map, d_rx_time, d_signal_enabled_flags, + rtcm_MSM_enabled, rtcm_MT1019_enabled, rtcm_MT1020_enabled, rtcm_MT1045_enabled, diff --git a/src/algorithms/PVT/libs/rtcm_printer.cc b/src/algorithms/PVT/libs/rtcm_printer.cc index d20d108fd..382804f3f 100644 --- a/src/algorithms/PVT/libs/rtcm_printer.cc +++ b/src/algorithms/PVT/libs/rtcm_printer.cc @@ -227,6 +227,7 @@ void Rtcm_Printer::Print_Rtcm_Messages(const Rtklib_Solver* pvt_solver, const std::map& gnss_observables_map, double rx_time, uint32_t signal_enabled_flags, + bool rtcm_MSM_enabled, bool rtcm_MT1019_enabled, bool rtcm_MT1020_enabled, bool rtcm_MT1045_enabled, @@ -251,7 +252,7 @@ void Rtcm_Printer::Print_Rtcm_Messages(const Rtklib_Solver* pvt_solver, const auto print_MT1019 = (!d_rtcm_has_written_once && rtcm_MT1019_enabled) || flag_write_RTCM_1019_output; const auto print_MT1020 = (!d_rtcm_has_written_once && rtcm_MT1020_enabled) || flag_write_RTCM_1020_output; const auto print_MT1045 = (!d_rtcm_has_written_once && rtcm_MT1045_enabled) || flag_write_RTCM_1045_output; - const auto Print_MSM = !d_rtcm_has_written_once || flag_write_RTCM_MSM_output; + const auto print_MSM = (!d_rtcm_has_written_once && rtcm_MSM_enabled) || flag_write_RTCM_MSM_output; if (print_MT1019 && flags.check_any_enabled(GPS_1C)) { @@ -274,7 +275,7 @@ void Rtcm_Printer::Print_Rtcm_Messages(const Rtklib_Solver* pvt_solver, Print_Rtcm_MT1045(gal_eph_iter.second); } } - if (Print_MSM) + if (print_MSM) { if (rtcm_MT1077_enabled && (flags.check_only_enabled(GPS_1C) || flags.check_only_enabled(GPS_1C, GAL_E6))) { diff --git a/src/algorithms/PVT/libs/rtcm_printer.h b/src/algorithms/PVT/libs/rtcm_printer.h index 4445e42be..6b2b63004 100644 --- a/src/algorithms/PVT/libs/rtcm_printer.h +++ b/src/algorithms/PVT/libs/rtcm_printer.h @@ -73,6 +73,7 @@ public: const std::map& gnss_observables_map, double rx_time, uint32_t signal_enabled_flags, + bool rtcm_MSM_enabled, bool rtcm_MT1019_enabled, bool rtcm_MT1020_enabled, bool rtcm_MT1045_enabled, From a6e4931938305cc371d76d04ae5c9e0fffd90caf Mon Sep 17 00:00:00 2001 From: Mathieu Favreau Date: Thu, 24 Jul 2025 12:33:41 +0000 Subject: [PATCH 07/11] Move unnamed namespace --- src/algorithms/PVT/libs/rinex_printer.cc | 132 +++++++++++------------ 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/src/algorithms/PVT/libs/rinex_printer.cc b/src/algorithms/PVT/libs/rinex_printer.cc index 37e47c192..3c84a5f4c 100644 --- a/src/algorithms/PVT/libs/rinex_printer.cc +++ b/src/algorithms/PVT/libs/rinex_printer.cc @@ -57,6 +57,72 @@ #include #endif +namespace +{ +std::string enabled_signal_flags_to_string(const Signal_Enabled_Flags& flags) +{ + std::vector signal_str_vector; + + if (flags.check_any_enabled(GPS_1C)) + { + signal_str_vector.emplace_back("1C"); + } + if (flags.check_any_enabled(GPS_2S)) + { + signal_str_vector.emplace_back("2S"); + } + if (flags.check_any_enabled(GPS_L5)) + { + signal_str_vector.emplace_back("L5"); + } + if (flags.check_any_enabled(GAL_1B)) + { + signal_str_vector.emplace_back("1B"); + } + if (flags.check_any_enabled(GAL_E5a)) + { + signal_str_vector.emplace_back("5X"); + } + if (flags.check_any_enabled(GAL_E5b)) + { + signal_str_vector.emplace_back("7X"); + } + if (flags.check_any_enabled(GAL_E6)) + { + signal_str_vector.emplace_back("E6"); + } + if (flags.check_any_enabled(GLO_1G)) + { + signal_str_vector.emplace_back("1G"); + } + if (flags.check_any_enabled(GLO_2G)) + { + signal_str_vector.emplace_back("2G"); + } + if (flags.check_any_enabled(BDS_B1)) + { + signal_str_vector.emplace_back("B1"); + } + if (flags.check_any_enabled(BDS_B3)) + { + signal_str_vector.emplace_back("B3"); + } + + std::ostringstream oss; + + for (size_t i = 0; i < signal_str_vector.size(); ++i) + { + oss << signal_str_vector[i]; + if (i != signal_str_vector.size() - 1) + { + oss << ' '; + } + } + + return oss.str(); +} +} // namespace + Rinex_Printer::Rinex_Printer(int32_t conf_version, const std::string& base_path, const std::string& base_name) : d_fake_cnav_iode(1), @@ -293,72 +359,6 @@ Rinex_Printer::~Rinex_Printer() } } -namespace -{ -std::string enabled_signal_flags_to_string(const Signal_Enabled_Flags& flags) -{ - std::vector signal_str_vector; - - if (flags.check_any_enabled(GPS_1C)) - { - signal_str_vector.emplace_back("1C"); - } - if (flags.check_any_enabled(GPS_2S)) - { - signal_str_vector.emplace_back("2S"); - } - if (flags.check_any_enabled(GPS_L5)) - { - signal_str_vector.emplace_back("L5"); - } - if (flags.check_any_enabled(GAL_1B)) - { - signal_str_vector.emplace_back("1B"); - } - if (flags.check_any_enabled(GAL_E5a)) - { - signal_str_vector.emplace_back("5X"); - } - if (flags.check_any_enabled(GAL_E5b)) - { - signal_str_vector.emplace_back("7X"); - } - if (flags.check_any_enabled(GAL_E6)) - { - signal_str_vector.emplace_back("E6"); - } - if (flags.check_any_enabled(GLO_1G)) - { - signal_str_vector.emplace_back("1G"); - } - if (flags.check_any_enabled(GLO_2G)) - { - signal_str_vector.emplace_back("2G"); - } - if (flags.check_any_enabled(BDS_B1)) - { - signal_str_vector.emplace_back("B1"); - } - if (flags.check_any_enabled(BDS_B3)) - { - signal_str_vector.emplace_back("B3"); - } - - std::ostringstream oss; - - for (size_t i = 0; i < signal_str_vector.size(); ++i) - { - oss << signal_str_vector[i]; - if (i != signal_str_vector.size() - 1) - { - oss << ' '; - } - } - - return oss.str(); -} -} // namespace - void Rinex_Printer::print_rinex_annotation(const Rtklib_Solver* pvt_solver, const std::map& gnss_observables_map, double rx_time, From dbe16a6310d50d77b3474694f5bc0ebbaf455122 Mon Sep 17 00:00:00 2001 From: Mathieu Favreau Date: Thu, 24 Jul 2025 12:37:15 +0000 Subject: [PATCH 08/11] Fix double checking --- src/algorithms/PVT/libs/rinex_printer.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/algorithms/PVT/libs/rinex_printer.cc b/src/algorithms/PVT/libs/rinex_printer.cc index 3c84a5f4c..12b3c6329 100644 --- a/src/algorithms/PVT/libs/rinex_printer.cc +++ b/src/algorithms/PVT/libs/rinex_printer.cc @@ -687,9 +687,7 @@ void Rinex_Printer::print_rinex_annotation(const Rtklib_Solver* pvt_solver, d_rinex_header_updated = true; // do not write header anymore } } - else if (flags.check_only_enabled(GPS_L5, GAL_E5a) && - gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend() && - galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend()) + else if (flags.check_only_enabled(GPS_L5, GAL_E5a)) { if ((gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) && (galileo_ephemeris_iter != pvt_solver->galileo_ephemeris_map.cend())) { From 80112f6831d0c88a0caba5a6e8472b6c0d1f4c88 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 28 Jul 2025 14:01:25 +0200 Subject: [PATCH 09/11] Fix generation of BeiDou RINEX navigation files --- src/algorithms/PVT/libs/rinex_printer.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/algorithms/PVT/libs/rinex_printer.cc b/src/algorithms/PVT/libs/rinex_printer.cc index 12b3c6329..c600ba294 100644 --- a/src/algorithms/PVT/libs/rinex_printer.cc +++ b/src/algorithms/PVT/libs/rinex_printer.cc @@ -418,9 +418,9 @@ void Rinex_Printer::print_rinex_annotation(const Rtklib_Solver* pvt_solver, else if (only_beidou && beidou_dnav_ephemeris_iter != pvt_solver->beidou_dnav_ephemeris_map.cend()) { rinex_obs_header(obsFile, beidou_dnav_ephemeris_iter->second, rx_time, signal); - rinex_nav_header(navFile, pvt_solver->beidou_dnav_iono, pvt_solver->beidou_dnav_utc_model); + rinex_nav_header(navBdsFile, pvt_solver->beidou_dnav_iono, pvt_solver->beidou_dnav_utc_model); output_navfilename.push_back(navBdsfilename); - log_rinex_nav(navFile, pvt_solver->beidou_dnav_ephemeris_map); + log_rinex_nav(navBdsFile, pvt_solver->beidou_dnav_ephemeris_map); } else if ((flags.check_only_enabled(GPS_1C, GPS_2S) || flags.check_only_enabled(GPS_1C, GPS_L5) || @@ -1013,7 +1013,7 @@ std::string Rinex_Printer::createFilename(const std::string& type, const std::st fileType.insert(std::pair("RINEX_FILE_TYPE_SBAS", "B")); // B - SBAS broadcast data file. fileType.insert(std::pair("RINEX_FILE_TYPE_CLK", "C")); // C - Clock file. fileType.insert(std::pair("RINEX_FILE_TYPE_SUMMARY", "S")); // S - Summary file (used e.g., by IGS, not a standard!). - fileType.insert(std::pair("RINEX_FILE_TYPE_BDS_NAV", "F")); // G - GLONASS navigation file. + fileType.insert(std::pair("RINEX_FILE_TYPE_BDS_NAV", "F")); // F - BeiDou navigation file. const boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time(); const tm pt_tm = boost::posix_time::to_tm(pt); From 06dc0e63701dbf946fc1fb1a0aecc7b68d289edb Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 28 Jul 2025 18:42:41 +0200 Subject: [PATCH 10/11] Remove old comment no longer applicable --- src/algorithms/PVT/libs/rinex_printer.h | 66 +------------------------ 1 file changed, 1 insertion(+), 65 deletions(-) diff --git a/src/algorithms/PVT/libs/rinex_printer.h b/src/algorithms/PVT/libs/rinex_printer.h index 726fff36b..4b45bbb67 100644 --- a/src/algorithms/PVT/libs/rinex_printer.h +++ b/src/algorithms/PVT/libs/rinex_printer.h @@ -100,71 +100,7 @@ public: * prints the RINEX headers for navigation and observation files. If it is * not the first annotation, it only annotates the observation, and updates * the navigation header if UTC data was not available when writing it for - * the first time. The meaning of type_of_rx is as follows: - * - * type_of_rx | Signals - * ------------- | ------------- - * 0 | Unknown - * 1 | GPS L1 C/A - * 2 | GPS L2C - * 3 | GPS L5 - * 4 | Galileo E1B - * 5 | Galileo E5a - * 6 | Galileo E5b - * 7 | GPS L1 C/A + GPS L2C - * 8 | GPS L1 C/A + GPS L5 - * 9 | GPS L1 C/A + Galileo E1B - * 10 | GPS L1 C/A + Galileo E5a - * 11 | GPS L1 C/A + Galileo E5b - * 12 | Galileo E1B + GPS L2C - * 13 | Galileo E5a + GPS L5 - * 14 | Galileo E1B + Galileo E5a - * 15 | Galileo E1B + Galileo E5b - * 16 | GPS L2C + GPS L5 - * 17 | GPS L2C + Galileo E5a - * 20 | GPS L5 + Galileo E5b - * 21 | GPS L1 C/A + Galileo E1B + GPS L2C - * 22 | GPS L1 C/A + Galileo E1B + GPS L5 - * 23 | GLONASS L1 C/A - * 24 | GLONASS L2 C/A - * 25 | GLONASS L1 C/A + GLONASS L2 C/A - * 26 | GPS L1 C/A + GLONASS L1 C/A - * 27 | Galileo E1B + GLONASS L1 C/A - * 28 | GPS L2C + GLONASS L1 C/A - * 29 | GPS L1 C/A + GLONASS L2 C/A - * 30 | Galileo E1B + GLONASS L2 C/A - * 31 | GPS L2C + GLONASS L2 C/A - * 32 | GPS L1 C/A + Galileo E1B + GPS L5 + Galileo E5a - * 33 | GPS L1 C/A + Galileo E1B + Galileo E5a - * 100 | Galileo E6B - * 101 | Galileo E1B + Galileo E6B - * 102 | Galileo E5a + Galileo E6B - * 103 | Galileo E5b + Galileo E6B - * 104 | Galileo E1B + Galileo E5a + Galileo E6B - * 105 | Galileo E1B + Galileo E5b + Galileo E6B - * 106 | GPS L1 C/A + Galileo E1B + Galileo E6B - * 107 | GPS L1 C/A + Galileo E6B - * 108 | GPS L1 C/A + Galileo E1B + GPS L5 + Galileo E5a + Galileo E6B - * 500 | BeiDou B1I - * 501 | BeiDou B1I + GPS L1 C/A - * 502 | BeiDou B1I + Galileo E1B - * 503 | BeiDou B1I + GLONASS L1 C/A - * 504 | BeiDou B1I + GPS L1 C/A + Galileo E1B - * 505 | BeiDou B1I + GPS L1 C/A + GLONASS L1 C/A + Galileo E1B - * 506 | BeiDou B1I + Beidou B3I - * 600 | BeiDou B3I - * 601 | BeiDou B3I + GPS L2C - * 602 | BeiDou B3I + GLONASS L2 C/A - * 603 | BeiDou B3I + GPS L2C + GLONASS L2 C/A - * 604 | BeiDou B3I + GPS L1 C/A - * 605 | BeiDou B3I + Galileo E1B - * 606 | BeiDou B3I + GLONASS L1 C/A - * 607 | BeiDou B3I + GPS L1 C/A + Galileo E1B - * 608 | BeiDou B3I + GPS L1 C/A + Galileo E1B + BeiDou B1I - * 609 | BeiDou B3I + GPS L1 C/A + Galileo E1B + GLONASS L1 C/A - * 610 | BeiDou B3I + GPS L1 C/A + Galileo E1B + GLONASS L1 C/A + BeiDou B1I - * 1000 | GPS L1 C/A + GPS L2C + GPS L5 - * 1001 | GPS L1 C/A + Galileo E1B + GPS L2C + GPS L5 + Galileo E5a + * the first time. * */ void print_rinex_annotation(const Rtklib_Solver* pvt_solver, From 4acbbf65793e01e79475b183f950b4ad33b15502 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 28 Jul 2025 18:55:49 +0200 Subject: [PATCH 11/11] Update changelog --- docs/CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 210a7ccb8..295f753aa 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -31,6 +31,9 @@ All notable changes to GNSS-SDR will be documented in this file. implementations, greatly improving maintainability, simplifying the addition of new signals, and eliminating a lot of duplicated code. Awesome contribution by @MathieuFavreau. +- Refactored the internal handling of multi-signal configurations in the PVT + block for improved maintainability and extensibility. Another excellent + contribution by @MathieuFavreau. ### Improvements in Portability: