From 18006bbbe91c4576fba94c1cfbdf46ac2b4f438d Mon Sep 17 00:00:00 2001 From: Mathieu Favreau Date: Wed, 23 Jul 2025 19:05:11 +0000 Subject: [PATCH] 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];