diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc index 1f628832c..ceaa9d9ce 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc @@ -330,7 +330,6 @@ rtklib_pvt_gs::rtklib_pvt_gs(uint32_t nchannels, d_rtcm_MT1097_rate_ms = bc::lcm(1000, d_output_rate_ms); // default value if not set d_rtcm_MSM_rate_ms = bc::lcm(1000, d_output_rate_ms); // default value if not set } - d_rtcm_writing_started = false; d_rtcm_enabled = true; } else @@ -343,13 +342,10 @@ rtklib_pvt_gs::rtklib_pvt_gs(uint32_t nchannels, d_rtcm_MT1097_rate_ms = 0; d_rtcm_MSM_rate_ms = 0; d_rtcm_enabled = false; - d_rtcm_writing_started = false; d_rtcm_printer = nullptr; } // initialize RINEX printer - d_rinex_header_written = false; - d_rinex_header_updated = false; d_rinex_output_enabled = conf_.rinex_output_enabled; d_rinex_version = conf_.rinex_version; if (d_rinex_output_enabled) @@ -1085,7 +1081,7 @@ void rtklib_pvt_gs::msg_handler_telemetry(const pmt::pmt_t& msg) << "inserted with Toe=" << gps_eph->d_Toe << " and GPS Week=" << gps_eph->i_GPS_week; // update/insert new ephemeris record to the global ephemeris map - if (d_rinex_header_written) // The header is already written, we can now log the navigation message data + if (d_rp->d_rinex_header_written) // The header is already written, we can now log the navigation message data { bool new_annotation = false; if (d_internal_pvt_solver->gps_ephemeris_map.find(gps_eph->i_satellite_PRN) == d_internal_pvt_solver->gps_ephemeris_map.cend()) @@ -1103,56 +1099,8 @@ void rtklib_pvt_gs::msg_handler_telemetry(const pmt::pmt_t& msg) { // New record! std::map new_eph; - std::map new_gal_eph; - std::map new_glo_eph; new_eph[gps_eph->i_satellite_PRN] = *gps_eph; - switch (d_type_of_rx) - { - case 1: // GPS L1 C/A only - case 8: // L1+L5 - d_rp->log_rinex_nav(d_rp->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 - d_rp->log_rinex_nav(d_rp->navMixFile, new_eph, new_gal_eph); - break; - case 26: // GPS L1 C/A + GLONASS L1 C/A - if (d_rinex_version == 3) - { - d_rp->log_rinex_nav(d_rp->navMixFile, new_eph, new_glo_eph); - } - if (d_rinex_version == 2) - { - d_rp->log_rinex_nav(d_rp->navFile, new_glo_eph); - } - break; - case 29: // GPS L1 C/A + GLONASS L2 C/A - if (d_rinex_version == 3) - { - d_rp->log_rinex_nav(d_rp->navMixFile, new_eph, new_glo_eph); - } - if (d_rinex_version == 2) - { - d_rp->log_rinex_nav(d_rp->navFile, new_eph); - } - break; - case 32: // L1+E1+L5+E5a - case 33: // L1+E1+E5a - d_rp->log_rinex_nav(d_rp->navMixFile, new_eph, new_gal_eph); - break; - case 106: // GPS L1 C/A + Galileo E1B + Galileo E6B - d_rp->log_rinex_nav(d_rp->navMixFile, new_eph, new_gal_eph); - break; - case 1000: // L1+L2+L5 - d_rp->log_rinex_nav(d_rp->navFile, new_eph); - break; - case 1001: // L1+E1+L2+L5+E5a - d_rp->log_rinex_nav(d_rp->navMixFile, new_eph, new_gal_eph); - break; - default: - break; - } + d_rp->log_rinex_nav_gps_nav(d_type_of_rx, new_eph); } } d_internal_pvt_solver->gps_ephemeris_map[gps_eph->i_satellite_PRN] = *gps_eph; @@ -1188,7 +1136,7 @@ void rtklib_pvt_gs::msg_handler_telemetry(const pmt::pmt_t& msg) // ### GPS CNAV message ### const auto gps_cnav_ephemeris = boost::any_cast>(pmt::any_ref(msg)); // update/insert new ephemeris record to the global ephemeris map - if (d_rinex_header_written) // The header is already written, we can now log the navigation message data + if (d_rp->d_rinex_header_written) // The header is already written, we can now log the navigation message data { bool new_annotation = false; if (d_internal_pvt_solver->gps_cnav_ephemeris_map.find(gps_cnav_ephemeris->i_satellite_PRN) == d_internal_pvt_solver->gps_cnav_ephemeris_map.cend()) @@ -1205,27 +1153,9 @@ void rtklib_pvt_gs::msg_handler_telemetry(const pmt::pmt_t& msg) if (new_annotation == true) { // New record! - std::map new_gal_eph; std::map new_cnav_eph; - std::map new_glo_eph; new_cnav_eph[gps_cnav_ephemeris->i_satellite_PRN] = *gps_cnav_ephemeris; - switch (d_type_of_rx) - { - case 2: // GPS L2C only - case 3: // GPS L5 only - case 7: // GPS L1 C/A + GPS L2C - d_rp->log_rinex_nav(d_rp->navFile, new_cnav_eph); - break; - case 13: // L5+E5a - d_rp->log_rinex_nav(d_rp->navMixFile, new_cnav_eph, new_gal_eph); - break; - case 28: // GPS L2C + GLONASS L1 C/A - case 31: // GPS L2C + GLONASS L2 C/A - d_rp->log_rinex_nav(d_rp->navMixFile, new_cnav_eph, new_glo_eph); - break; - default: - break; - } + d_rp->log_rinex_nav_gps_cnav(d_type_of_rx, new_cnav_eph); } } d_internal_pvt_solver->gps_cnav_ephemeris_map[gps_cnav_ephemeris->i_satellite_PRN] = *gps_cnav_ephemeris; @@ -1279,7 +1209,7 @@ void rtklib_pvt_gs::msg_handler_telemetry(const pmt::pmt_t& msg) << ", GALILEO Week Number =" << galileo_eph->WN_5 << " and Ephemeris IOD = " << galileo_eph->IOD_ephemeris; // update/insert new ephemeris record to the global ephemeris map - if (d_rinex_header_written) // The header is already written, we can now log the navigation message data + if (d_rp->d_rinex_header_written) // The header is already written, we can now log the navigation message data { bool new_annotation = false; if (d_internal_pvt_solver->galileo_ephemeris_map.find(galileo_eph->i_satellite_PRN) == d_internal_pvt_solver->galileo_ephemeris_map.cend()) @@ -1297,52 +1227,8 @@ void rtklib_pvt_gs::msg_handler_telemetry(const pmt::pmt_t& msg) { // New record! std::map new_gal_eph; - std::map new_cnav_eph; - std::map new_eph; - std::map new_glo_eph; new_gal_eph[galileo_eph->i_satellite_PRN] = *galileo_eph; - switch (d_type_of_rx) - { - case 4: // Galileo E1B only - case 5: // Galileo E5a only - case 6: // Galileo E5b only - d_rp->log_rinex_nav(d_rp->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 - d_rp->log_rinex_nav(d_rp->navMixFile, new_eph, new_gal_eph); - break; - case 13: // L5+E5a - d_rp->log_rinex_nav(d_rp->navMixFile, new_cnav_eph, new_gal_eph); - break; - case 15: // Galileo E1B + Galileo E5b - d_rp->log_rinex_nav(d_rp->navGalFile, new_gal_eph); - break; - case 27: // Galileo E1B + GLONASS L1 C/A - case 30: // Galileo E1B + GLONASS L2 C/A - d_rp->log_rinex_nav(d_rp->navMixFile, new_gal_eph, new_glo_eph); - break; - case 32: // L1+E1+L5+E5a - case 33: // L1+E1+E5a - d_rp->log_rinex_nav(d_rp->navMixFile, new_eph, new_gal_eph); - break; - 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 - d_rp->log_rinex_nav(d_rp->navGalFile, new_gal_eph); - break; - case 106: // GPS L1 C/A + Galileo E1B + Galileo E6B - d_rp->log_rinex_nav(d_rp->navMixFile, new_eph, new_gal_eph); - break; - case 1001: // L1+E1+L2+L5+E5a - d_rp->log_rinex_nav(d_rp->navMixFile, new_eph, new_gal_eph); - break; - default: - break; - } + d_rp->log_rinex_nav_gal_nav(d_type_of_rx, new_gal_eph); } } d_internal_pvt_solver->galileo_ephemeris_map[galileo_eph->i_satellite_PRN] = *galileo_eph; @@ -1431,7 +1317,7 @@ void rtklib_pvt_gs::msg_handler_telemetry(const pmt::pmt_t& msg) << " and Ephemeris IOD in UTC = " << glonass_gnav_eph->compute_GLONASS_time(glonass_gnav_eph->d_t_b) << " from SV = " << glonass_gnav_eph->i_satellite_slot_number; // update/insert new ephemeris record to the global ephemeris map - if (d_rinex_header_written) // The header is already written, we can now log the navigation message data + if (d_rp->d_rinex_header_written) // The header is already written, we can now log the navigation message data { bool new_annotation = false; if (d_internal_pvt_solver->glonass_gnav_ephemeris_map.find(glonass_gnav_eph->i_satellite_PRN) == d_internal_pvt_solver->glonass_gnav_ephemeris_map.cend()) @@ -1448,53 +1334,9 @@ void rtklib_pvt_gs::msg_handler_telemetry(const pmt::pmt_t& msg) if (new_annotation == true) { // New record! - std::map new_gal_eph; - std::map new_cnav_eph; - std::map new_eph; std::map new_glo_eph; new_glo_eph[glonass_gnav_eph->i_satellite_PRN] = *glonass_gnav_eph; - switch (d_type_of_rx) - { - case 23: // GLONASS L1 C/A - case 24: // GLONASS L2 C/A - case 25: // GLONASS L1 C/A + GLONASS L2 C/A - d_rp->log_rinex_nav(d_rp->navGloFile, new_glo_eph); - break; - case 26: // GPS L1 C/A + GLONASS L1 C/A - if (d_rinex_version == 3) - { - d_rp->log_rinex_nav(d_rp->navMixFile, new_eph, new_glo_eph); - } - if (d_rinex_version == 2) - { - d_rp->log_rinex_nav(d_rp->navGloFile, new_glo_eph); - } - break; - case 27: // Galileo E1B + GLONASS L1 C/A - d_rp->log_rinex_nav(d_rp->navMixFile, new_gal_eph, new_glo_eph); - break; - case 28: // GPS L2C + GLONASS L1 C/A - d_rp->log_rinex_nav(d_rp->navMixFile, new_cnav_eph, new_glo_eph); - break; - case 29: // GPS L1 C/A + GLONASS L2 C/A - if (d_rinex_version == 3) - { - d_rp->log_rinex_nav(d_rp->navMixFile, new_eph, new_glo_eph); - } - if (d_rinex_version == 2) - { - d_rp->log_rinex_nav(d_rp->navGloFile, new_glo_eph); - } - break; - case 30: // Galileo E1B + GLONASS L2 C/A - d_rp->log_rinex_nav(d_rp->navMixFile, new_gal_eph, new_glo_eph); - break; - case 31: // GPS L2C + GLONASS L2 C/A - d_rp->log_rinex_nav(d_rp->navMixFile, new_cnav_eph, new_glo_eph); - break; - default: - break; - } + d_rp->log_rinex_nav_glo_gnav(d_type_of_rx, new_glo_eph); } } d_internal_pvt_solver->glonass_gnav_ephemeris_map[glonass_gnav_eph->i_satellite_PRN] = *glonass_gnav_eph; @@ -1538,7 +1380,7 @@ void rtklib_pvt_gs::msg_handler_telemetry(const pmt::pmt_t& msg) << "inserted with Toe=" << bds_dnav_eph->d_Toe << " and BDS Week=" << bds_dnav_eph->i_BEIDOU_week; // update/insert new ephemeris record to the global ephemeris map - if (d_rinex_header_written) // The header is already written, we can now log the navigation message data + if (d_rp->d_rinex_header_written) // The header is already written, we can now log the navigation message data { bool new_annotation = false; if (d_internal_pvt_solver->beidou_dnav_ephemeris_map.find(bds_dnav_eph->i_satellite_PRN) == d_internal_pvt_solver->beidou_dnav_ephemeris_map.cend()) @@ -1557,15 +1399,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->i_satellite_PRN] = *bds_dnav_eph; - switch (d_type_of_rx) - { - case 500: // BDS B1I only - case 600: // BDS B3I only - d_rp->log_rinex_nav(d_rp->navFile, new_bds_eph); - break; - default: - break; - } + d_rp->log_rinex_nav_bds_dnav(d_type_of_rx, new_bds_eph); } } d_internal_pvt_solver->beidou_dnav_ephemeris_map[bds_dnav_eph->i_satellite_PRN] = *bds_dnav_eph; @@ -2289,2162 +2123,27 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item d_nmea_printer->Print_Nmea_Line(d_user_pvt_solver.get(), false); } } - - /* - * TYPE | RECEIVER - * 0 | Unknown - * 1 | GPS L1 C/A - * 2 | GPS L2C - * 3 | GPS L5 - * 4 | Galileo E1B - * 5 | Galileo E5a - * 6 | Galileo E5b - * 7 | GPS L1 C/A + GPS L2C - * 8 | GPS L1 C/A + GPS L5 - * 9 | GPS L1 C/A + Galileo E1B - * 10 | GPS L1 C/A + Galileo E5a - * 11 | GPS L1 C/A + Galileo E5b - * 12 | Galileo E1B + GPS L2C - * 13 | Galileo E5a + GPS L5 - * 14 | Galileo E1B + Galileo E5a - * 15 | Galileo E1B + Galileo E5b - * 16 | GPS L2C + GPS L5 - * 17 | GPS L2C + Galileo E5a - * 18 | GPS L2C + Galileo E5b - * 21 | GPS L1 C/A + Galileo E1B + GPS L2C - * 22 | GPS L1 C/A + Galileo E1B + GPS L5 - * 23 | GLONASS L1 C/A - * 24 | GLONASS L2 C/A - * 25 | GLONASS L1 C/A + GLONASS L2 C/A - * 26 | GPS L1 C/A + GLONASS L1 C/A - * 27 | Galileo E1B + GLONASS L1 C/A - * 28 | GPS L2C + GLONASS L1 C/A - * 29 | GPS L1 C/A + GLONASS L2 C/A - * 30 | Galileo E1B + GLONASS L2 C/A - * 31 | GPS L2C + GLONASS L2 C/A - * 32 | GPS L1 C/A + Galileo E1B + GPS L5 + Galileo E5a - * 33 | GPS L1 C/A + Galileo E1B + Galileo E5a - = 100 | Galileo E6B - = 101 | Galileo E1B + Galileo E6B - * 102 | Galileo E5a + Galileo E6B - * 103 | Galileo E5b + Galileo E6B - * 104 | Galileo E1B + Galileo E5a + Galileo E6B - * 105 | Galileo E1B + Galileo E5b + Galileo E6B - * 106 | GPS L1 C/A + Galileo E1B + Galileo E6B - * 501 | BeiDou B1I + GPS L1 C/A - * 502 | BeiDou B1I + Galileo E1B - * 503 | BeiDou B1I + GLONASS L1 C/A - * 504 | BeiDou B1I + GPS L1 C/A + Galileo E1B - * 505 | BeiDou B1I + GPS L1 C/A + GLONASS L1 C/A + Galileo E1B - * 506 | BeiDou B1I + Beidou B3I - * 600 | BeiDou B3I - * 601 | BeiDou B3I + GPS L2C - * 602 | BeiDou B3I + GLONASS L2 C/A - * 603 | BeiDou B3I + GPS L2C + GLONASS L2 C/A - * 604 | BeiDou B3I + GPS L1 C/A - * 605 | BeiDou B3I + Galileo E1B - * 606 | BeiDou B3I + GLONASS L1 C/A - * 607 | BeiDou B3I + GPS L1 C/A + Galileo E1B - * 608 | BeiDou B3I + GPS L1 C/A + Galileo E1B + BeiDou B1I - * 609 | BeiDou B3I + GPS L1 C/A + Galileo E1B + GLONASS L1 C/A - * 610 | BeiDou B3I + GPS L1 C/A + Galileo E1B + GLONASS L1 C/A + BeiDou B1I - * 1000 | GPS L1 C/A + GPS L2C + GPS L5 - * 1001 | GPS L1 C/A + Galileo E1B + GPS L2C + GPS L5 + Galileo E5a - */ - - // ####################### RINEX FILES ################# if (d_rinex_output_enabled) { - 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; - if (!d_rinex_header_written) // & we have utc data in nav message! - { - galileo_ephemeris_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - gps_ephemeris_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - gps_cnav_ephemeris_iter = d_user_pvt_solver->gps_cnav_ephemeris_map.cbegin(); - glonass_gnav_ephemeris_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - beidou_dnav_ephemeris_iter = d_user_pvt_solver->beidou_dnav_ephemeris_map.cbegin(); - switch (d_type_of_rx) - { - case 1: // GPS L1 C/A only - if (gps_ephemeris_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - d_rp->rinex_obs_header(d_rp->obsFile, gps_ephemeris_iter->second, d_rx_time); - d_rp->rinex_nav_header(d_rp->navFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second); - d_rp->log_rinex_nav(d_rp->navFile, d_user_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 != d_user_pvt_solver->gps_cnav_ephemeris_map.cend()) - { - const std::string signal("2S"); - d_rp->rinex_obs_header(d_rp->obsFile, gps_cnav_ephemeris_iter->second, d_rx_time, signal); - d_rp->rinex_nav_header(d_rp->navFile, d_user_pvt_solver->gps_cnav_iono, d_user_pvt_solver->gps_cnav_utc_model); - d_rp->log_rinex_nav(d_rp->navFile, d_user_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 != d_user_pvt_solver->gps_cnav_ephemeris_map.cend()) - { - const std::string signal("L5"); - d_rp->rinex_obs_header(d_rp->obsFile, gps_cnav_ephemeris_iter->second, d_rx_time, signal); - d_rp->rinex_nav_header(d_rp->navFile, d_user_pvt_solver->gps_cnav_iono, d_user_pvt_solver->gps_cnav_utc_model); - d_rp->log_rinex_nav(d_rp->navFile, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rp->rinex_obs_header(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time); - d_rp->rinex_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navGalFile, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - const std::string signal("5X"); - d_rp->rinex_obs_header(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, signal); - d_rp->rinex_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navGalFile, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - const std::string signal("7X"); - d_rp->rinex_obs_header(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, signal); - d_rp->rinex_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navGalFile, d_user_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 != d_user_pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_ephemeris_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend())) - { - const std::string signal("1C 2S"); - d_rp->rinex_obs_header(d_rp->obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, d_rx_time, signal); - d_rp->rinex_nav_header(d_rp->navFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second); - d_rp->log_rinex_nav(d_rp->navFile, d_user_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 != d_user_pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_ephemeris_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend())) - { - const std::string signal("1C L5"); - d_rp->rinex_obs_header(d_rp->obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, d_rx_time, signal); - d_rp->rinex_nav_header(d_rp->navFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second); - d_rp->log_rinex_nav(d_rp->navFile, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend()) and (gps_ephemeris_iter != d_user_pvt_solver->gps_ephemeris_map.cend())) - { - const std::string gal_signal("1B"); - d_rp->rinex_obs_header(d_rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gal_signal); - d_rp->rinex_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navMixFile, d_user_pvt_solver->gps_ephemeris_map, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend()) and (gps_ephemeris_iter != d_user_pvt_solver->gps_ephemeris_map.cend())) - { - const std::string gal_signal("5X"); - d_rp->rinex_obs_header(d_rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gal_signal); - d_rp->rinex_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navMixFile, d_user_pvt_solver->gps_ephemeris_map, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend()) and (gps_ephemeris_iter != d_user_pvt_solver->gps_ephemeris_map.cend())) - { - const std::string gal_signal("7X"); - d_rp->rinex_obs_header(d_rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gal_signal); - d_rp->rinex_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navMixFile, d_user_pvt_solver->gps_ephemeris_map, d_user_pvt_solver->galileo_ephemeris_map); - d_rinex_header_written = true; // do not write header anymore - } - break; - case 13: // L5+E5a - if ((galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) and (gps_cnav_ephemeris_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend())) - { - const std::string gal_signal("5X"); - const std::string gps_signal("L5"); - d_rp->rinex_obs_header(d_rp->obsFile, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gps_signal, gal_signal); - d_rp->rinex_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_cnav_iono, d_user_pvt_solver->gps_cnav_utc_model, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navMixFile, d_user_pvt_solver->gps_cnav_ephemeris_map, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend())) - { - const std::string gal_signal("1B 5X"); - d_rp->rinex_obs_header(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gal_signal); - d_rp->rinex_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navGalFile, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend())) - { - const std::string gal_signal("1B 7X"); - d_rp->rinex_obs_header(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gal_signal); - d_rp->rinex_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navGalFile, d_user_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 != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - const std::string signal("1G"); - d_rp->rinex_obs_header(d_rp->obsFile, glonass_gnav_ephemeris_iter->second, d_rx_time, signal); - d_rp->rinex_nav_header(d_rp->navGloFile, d_user_pvt_solver->glonass_gnav_utc_model, glonass_gnav_ephemeris_iter->second); - d_rp->log_rinex_nav(d_rp->navGloFile, d_user_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 != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - const std::string signal("2G"); - d_rp->rinex_obs_header(d_rp->obsFile, glonass_gnav_ephemeris_iter->second, d_rx_time, signal); - d_rp->rinex_nav_header(d_rp->navGloFile, d_user_pvt_solver->glonass_gnav_utc_model, glonass_gnav_ephemeris_iter->second); - d_rp->log_rinex_nav(d_rp->navGloFile, d_user_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 != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - const std::string signal("1G 2G"); - d_rp->rinex_obs_header(d_rp->obsFile, glonass_gnav_ephemeris_iter->second, d_rx_time, signal); - d_rp->rinex_nav_header(d_rp->navGloFile, d_user_pvt_solver->glonass_gnav_utc_model, glonass_gnav_ephemeris_iter->second); - d_rp->log_rinex_nav(d_rp->navGloFile, d_user_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 != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) and (gps_ephemeris_iter != d_user_pvt_solver->gps_ephemeris_map.cend())) - { - const std::string glo_signal("1G"); - d_rp->rinex_obs_header(d_rp->obsFile, gps_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, glo_signal); - if (d_rinex_version == 3) - { - d_rp->rinex_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_user_pvt_solver->glonass_gnav_utc_model, d_user_pvt_solver->glonass_gnav_almanac); - d_rp->log_rinex_nav(d_rp->navMixFile, d_user_pvt_solver->gps_ephemeris_map, d_user_pvt_solver->glonass_gnav_ephemeris_map); - } - if (d_rinex_version == 2) - { - d_rp->rinex_nav_header(d_rp->navFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second); - d_rp->rinex_nav_header(d_rp->navGloFile, d_user_pvt_solver->glonass_gnav_utc_model, glonass_gnav_ephemeris_iter->second); - d_rp->log_rinex_nav(d_rp->navFile, d_user_pvt_solver->gps_ephemeris_map); - d_rp->log_rinex_nav(d_rp->navGloFile, d_user_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 != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) and (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend())) - { - const std::string glo_signal("1G"); - const std::string gal_signal("1B"); - d_rp->rinex_obs_header(d_rp->obsFile, galileo_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, glo_signal, gal_signal); - d_rp->rinex_nav_header(d_rp->navMixFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model, d_user_pvt_solver->glonass_gnav_utc_model, d_user_pvt_solver->glonass_gnav_almanac); - d_rp->log_rinex_nav(d_rp->navMixFile, d_user_pvt_solver->galileo_ephemeris_map, d_user_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 != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) and (gps_cnav_ephemeris_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend())) - { - const std::string glo_signal("1G"); - d_rp->rinex_obs_header(d_rp->obsFile, gps_cnav_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, glo_signal); - d_rp->rinex_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_cnav_iono, d_user_pvt_solver->gps_cnav_utc_model, d_user_pvt_solver->glonass_gnav_utc_model, d_user_pvt_solver->glonass_gnav_almanac); - d_rp->log_rinex_nav(d_rp->navMixFile, d_user_pvt_solver->gps_cnav_ephemeris_map, d_user_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 != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) and (gps_ephemeris_iter != d_user_pvt_solver->gps_ephemeris_map.cend())) - { - const std::string glo_signal("2G"); - d_rp->rinex_obs_header(d_rp->obsFile, gps_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, glo_signal); - if (d_rinex_version == 3) - { - d_rp->rinex_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_user_pvt_solver->glonass_gnav_utc_model, d_user_pvt_solver->glonass_gnav_almanac); - d_rp->log_rinex_nav(d_rp->navMixFile, d_user_pvt_solver->gps_ephemeris_map, d_user_pvt_solver->glonass_gnav_ephemeris_map); - } - if (d_rinex_version == 2) - { - d_rp->rinex_nav_header(d_rp->navFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second); - d_rp->rinex_nav_header(d_rp->navGloFile, d_user_pvt_solver->glonass_gnav_utc_model, glonass_gnav_ephemeris_iter->second); - d_rp->log_rinex_nav(d_rp->navFile, d_user_pvt_solver->gps_ephemeris_map); - d_rp->log_rinex_nav(d_rp->navGloFile, d_user_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 != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) and (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend())) - { - const std::string glo_signal("2G"); - const std::string gal_signal("1B"); - d_rp->rinex_obs_header(d_rp->obsFile, galileo_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, glo_signal, gal_signal); - d_rp->rinex_nav_header(d_rp->navMixFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model, d_user_pvt_solver->glonass_gnav_utc_model, d_user_pvt_solver->glonass_gnav_almanac); - d_rp->log_rinex_nav(d_rp->navMixFile, d_user_pvt_solver->galileo_ephemeris_map, d_user_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 != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) and (gps_cnav_ephemeris_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend())) - { - const std::string glo_signal("2G"); - d_rp->rinex_obs_header(d_rp->obsFile, gps_cnav_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, glo_signal); - d_rp->rinex_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_cnav_iono, d_user_pvt_solver->gps_cnav_utc_model, d_user_pvt_solver->glonass_gnav_utc_model, d_user_pvt_solver->glonass_gnav_almanac); - d_rp->log_rinex_nav(d_rp->navMixFile, d_user_pvt_solver->gps_cnav_ephemeris_map, d_user_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 != d_user_pvt_solver->gps_ephemeris_map.cend()) and - (gps_cnav_ephemeris_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend()) and - (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend())) - { - const std::string gal_signal("1B 5X"); - const std::string gps_signal("1C L5"); - d_rp->rinex_obs_header(d_rp->obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gps_signal, gal_signal); - d_rp->rinex_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navMixFile, d_user_pvt_solver->gps_ephemeris_map, d_user_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 != d_user_pvt_solver->gps_ephemeris_map.cend()) and - (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend())) - { - const std::string gal_signal("1B 5X"); - d_rp->rinex_obs_header(d_rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gal_signal); - d_rp->rinex_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navMixFile, d_user_pvt_solver->gps_ephemeris_map, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rp->rinex_obs_header(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time); - d_rp->rinex_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navGalFile, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - const std::string signal("5X"); - d_rp->rinex_obs_header(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, signal); - d_rp->rinex_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navGalFile, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - const std::string signal("7X"); - d_rp->rinex_obs_header(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, signal); - d_rp->rinex_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navGalFile, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend())) - { - const std::string gal_signal("1B 5X"); - d_rp->rinex_obs_header(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gal_signal); - d_rp->rinex_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navGalFile, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend())) - { - const std::string gal_signal("1B 7X"); - d_rp->rinex_obs_header(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gal_signal); - d_rp->rinex_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navGalFile, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend()) and (gps_ephemeris_iter != d_user_pvt_solver->gps_ephemeris_map.cend())) - { - const std::string gal_signal("1B"); - d_rp->rinex_obs_header(d_rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gal_signal); - d_rp->rinex_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navMixFile, d_user_pvt_solver->gps_ephemeris_map, d_user_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 != d_user_pvt_solver->beidou_dnav_ephemeris_map.cend()) - { - d_rp->rinex_obs_header(d_rp->obsFile, beidou_dnav_ephemeris_iter->second, d_rx_time, "B1"); - d_rp->rinex_nav_header(d_rp->navFile, d_user_pvt_solver->beidou_dnav_iono, d_user_pvt_solver->beidou_dnav_utc_model); - d_rp->log_rinex_nav(d_rp->navFile, d_user_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 != d_user_pvt_solver->gps_ephemeris_map.cend()) and (beidou_dnav_ephemeris_iter != d_user_pvt_solver->beidou_dnav_ephemeris_map.cend())) - { - const std::string bds_signal("B1"); - // d_rp->rinex_obs_header(d_rp->obsFile, gps_ephemeris_iter->second, beidou_dnav_ephemeris_iter->second, d_rx_time, bds_signal); - // d_rp->rinex_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_user_pvt_solver->beidou_dnav_iono, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend()) and (beidou_dnav_ephemeris_iter != d_user_pvt_solver->beidou_dnav_ephemeris_map.cend())) - { - const std::string bds_signal("B1"); - const std::string gal_signal("1B"); - // d_rp->rinex_obs_header(d_rp->obsFile, galileo_ephemeris_iter->second, beidou_dnav_ephemeris_iter->second, d_rx_time, gal_signal, bds_signal); - // d_rp->rinex_nav_header(d_rp->navMixFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model, d_user_pvt_solver->beidou_dnav_iono, d_user_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 != d_user_pvt_solver->beidou_dnav_ephemeris_map.cend()) - { - // d_rp->rinex_obs_header(d_rp->obsFile, beidou_dnav_ephemeris_iter->second, d_rx_time, "B1"); - // d_rp->rinex_nav_header(d_rp->navFile, d_user_pvt_solver->beidou_dnav_iono, d_user_pvt_solver->beidou_dnav_utc_model); - // d_rp->log_rinex_nav(d_rp->navFile, d_user_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 != d_user_pvt_solver->beidou_dnav_ephemeris_map.cend()) - { - d_rp->rinex_obs_header(d_rp->obsFile, beidou_dnav_ephemeris_iter->second, d_rx_time, "B3"); - d_rp->rinex_nav_header(d_rp->navFile, d_user_pvt_solver->beidou_dnav_iono, d_user_pvt_solver->beidou_dnav_utc_model); - d_rp->log_rinex_nav(d_rp->navFile, d_user_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 != d_user_pvt_solver->beidou_dnav_ephemeris_map.cend()) - { - d_rp->rinex_obs_header(d_rp->obsFile, beidou_dnav_ephemeris_iter->second, d_rx_time, "B3"); - // d_rp->rinex_nav_header(d_rp->navFile, d_user_pvt_solver->beidou_dnav_iono, d_user_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 != d_user_pvt_solver->gps_ephemeris_map.cend()) and - (gps_cnav_ephemeris_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend())) - { - const std::string gps_signal("1C 2S L5"); - d_rp->rinex_obs_header(d_rp->obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, d_rx_time, gps_signal); - d_rp->rinex_nav_header(d_rp->navFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second); - d_rp->log_rinex_nav(d_rp->navFile, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend()) and - (gps_ephemeris_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) and - (gps_cnav_ephemeris_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend())) - { - const std::string gal_signal("1B 5X"); - const std::string gps_signal("1C 2S L5"); - d_rp->rinex_obs_header(d_rp->obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gps_signal, gal_signal); - d_rp->rinex_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->log_rinex_nav(d_rp->navMixFile, d_user_pvt_solver->gps_ephemeris_map, d_user_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 = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - gps_ephemeris_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - gps_cnav_ephemeris_iter = d_user_pvt_solver->gps_cnav_ephemeris_map.cbegin(); - glonass_gnav_ephemeris_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - beidou_dnav_ephemeris_iter = d_user_pvt_solver->beidou_dnav_ephemeris_map.cbegin(); - - // Log observables into the RINEX file - if (flag_write_RINEX_obs_output) - { - switch (d_type_of_rx) - { - case 1: // GPS L1 C/A only - if (gps_ephemeris_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - d_rp->log_rinex_obs(d_rp->obsFile, gps_ephemeris_iter->second, d_rx_time, d_gnss_observables_map); - if (!d_rinex_header_updated and (d_user_pvt_solver->gps_utc_model.d_A0 != 0)) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->gps_utc_model); - d_rp->update_nav_header(d_rp->navFile, d_user_pvt_solver->gps_utc_model, d_user_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 != d_user_pvt_solver->gps_cnav_ephemeris_map.cend()) - { - d_rp->log_rinex_obs(d_rp->obsFile, gps_cnav_ephemeris_iter->second, d_rx_time, d_gnss_observables_map); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->gps_cnav_utc_model.d_A0 != 0)) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->gps_cnav_utc_model); - d_rp->update_nav_header(d_rp->navFile, d_user_pvt_solver->gps_cnav_utc_model, d_user_pvt_solver->gps_cnav_iono); - d_rinex_header_updated = true; - } - break; - case 4: // Galileo E1B only - if (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rp->log_rinex_obs(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, "1B"); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->galileo_utc_model.A0_6 != 0)) - { - d_rp->update_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 5: // Galileo E5a only - if (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rp->log_rinex_obs(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, "5X"); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->galileo_utc_model.A0_6 != 0)) - { - d_rp->update_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 6: // Galileo E5b only - if (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rp->log_rinex_obs(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, "7X"); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->galileo_utc_model.A0_6 != 0)) - { - d_rp->update_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 7: // GPS L1 C/A + GPS L2C - if ((gps_ephemeris_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_ephemeris_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend())) - { - d_rp->log_rinex_obs(d_rp->obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, d_rx_time, d_gnss_observables_map); - if (!d_rinex_header_updated and (d_user_pvt_solver->gps_utc_model.d_A0 != 0)) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->gps_utc_model); - d_rp->update_nav_header(d_rp->navFile, d_user_pvt_solver->gps_utc_model, d_user_pvt_solver->gps_iono, gps_ephemeris_iter->second); - d_rinex_header_updated = true; - } - } - break; - case 8: // L1+L5 - if ((gps_ephemeris_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_ephemeris_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend())) - { - d_rp->log_rinex_obs(d_rp->obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, d_rx_time, d_gnss_observables_map); - if (!d_rinex_header_updated and ((d_user_pvt_solver->gps_cnav_utc_model.d_A0 != 0) or (d_user_pvt_solver->gps_utc_model.d_A0 != 0))) - { - if (d_user_pvt_solver->gps_cnav_utc_model.d_A0 != 0) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->gps_cnav_utc_model); - d_rp->update_nav_header(d_rp->navFile, d_user_pvt_solver->gps_cnav_utc_model, d_user_pvt_solver->gps_cnav_iono); - } - else - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->gps_utc_model); - d_rp->update_nav_header(d_rp->navFile, d_user_pvt_solver->gps_utc_model, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend()) and (gps_ephemeris_iter != d_user_pvt_solver->gps_ephemeris_map.cend())) - { - d_rp->log_rinex_obs(d_rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, d_gnss_observables_map); - if (!d_rinex_header_updated and (d_user_pvt_solver->gps_utc_model.d_A0 != 0)) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->gps_utc_model); - d_rp->update_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - } - break; - case 13: // L5+E5a - if ((gps_cnav_ephemeris_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend()) and (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend())) - { - d_rp->log_rinex_obs(d_rp->obsFile, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, d_gnss_observables_map); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->gps_cnav_utc_model.d_A0 != 0) and (d_user_pvt_solver->galileo_utc_model.A0_6 != 0)) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->gps_cnav_utc_model); - d_rp->update_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_cnav_utc_model, d_user_pvt_solver->gps_cnav_iono, d_user_pvt_solver->galileo_iono, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rp->log_rinex_obs(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, "1B 5X"); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->galileo_utc_model.A0_6 != 0)) - { - d_rp->update_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 15: // Galileo E1B + Galileo E5b - if (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rp->log_rinex_obs(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, "1B 7X"); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->galileo_utc_model.A0_6 != 0)) - { - d_rp->update_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 23: // GLONASS L1 C/A only - if (glonass_gnav_ephemeris_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - d_rp->log_rinex_obs(d_rp->obsFile, glonass_gnav_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, "1C"); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->glonass_gnav_utc_model.d_tau_c != 0)) - { - d_rp->update_nav_header(d_rp->navGloFile, d_user_pvt_solver->glonass_gnav_utc_model, d_user_pvt_solver->glonass_gnav_almanac); - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->glonass_gnav_utc_model); - d_rinex_header_updated = true; - } - break; - case 24: // GLONASS L2 C/A only - if (glonass_gnav_ephemeris_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - d_rp->log_rinex_obs(d_rp->obsFile, glonass_gnav_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, "2C"); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->glonass_gnav_utc_model.d_tau_c != 0)) - { - d_rp->update_nav_header(d_rp->navGloFile, d_user_pvt_solver->glonass_gnav_utc_model, d_user_pvt_solver->glonass_gnav_almanac); - d_rp->update_obs_header(d_rp->obsFile, d_user_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 != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - d_rp->log_rinex_obs(d_rp->obsFile, glonass_gnav_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, "1C 2C"); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->glonass_gnav_utc_model.d_tau_c != 0)) - { - d_rp->update_nav_header(d_rp->navMixFile, d_user_pvt_solver->glonass_gnav_utc_model, d_user_pvt_solver->glonass_gnav_almanac); - d_rp->update_obs_header(d_rp->obsFile, d_user_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 != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) and (gps_ephemeris_iter != d_user_pvt_solver->gps_ephemeris_map.cend())) - { - d_rp->log_rinex_obs(d_rp->obsFile, gps_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, d_gnss_observables_map); - if (!d_rinex_header_updated and (d_user_pvt_solver->gps_utc_model.d_A0 != 0)) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->gps_utc_model); - d_rp->update_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_user_pvt_solver->glonass_gnav_utc_model, d_user_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 != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) and (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend())) - { - d_rp->log_rinex_obs(d_rp->obsFile, galileo_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, d_gnss_observables_map); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->galileo_utc_model.A0_6 != 0)) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->galileo_utc_model); - d_rp->update_nav_header(d_rp->navMixFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model, d_user_pvt_solver->glonass_gnav_utc_model, d_user_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 != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) and (gps_cnav_ephemeris_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend())) - { - d_rp->log_rinex_obs(d_rp->obsFile, gps_cnav_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, d_gnss_observables_map); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->gps_cnav_utc_model.d_A0 != 0)) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->gps_cnav_utc_model); - d_rp->update_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_cnav_iono, d_user_pvt_solver->gps_cnav_utc_model, d_user_pvt_solver->glonass_gnav_utc_model, d_user_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 != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) and (gps_ephemeris_iter != d_user_pvt_solver->gps_ephemeris_map.cend())) - { - d_rp->log_rinex_obs(d_rp->obsFile, gps_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, d_gnss_observables_map); - if (!d_rinex_header_updated and (d_user_pvt_solver->gps_utc_model.d_A0 != 0)) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->gps_utc_model); - d_rp->update_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_user_pvt_solver->glonass_gnav_utc_model, d_user_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 != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) and (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend())) - { - d_rp->log_rinex_obs(d_rp->obsFile, galileo_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, d_gnss_observables_map); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->galileo_utc_model.A0_6 != 0)) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->galileo_utc_model); - d_rp->update_nav_header(d_rp->navMixFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model, d_user_pvt_solver->glonass_gnav_utc_model, d_user_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 != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) and (gps_cnav_ephemeris_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend())) - { - d_rp->log_rinex_obs(d_rp->obsFile, gps_cnav_ephemeris_iter->second, glonass_gnav_ephemeris_iter->second, d_rx_time, d_gnss_observables_map); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->gps_cnav_utc_model.d_A0 != 0)) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->gps_cnav_utc_model); - d_rp->update_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_cnav_iono, d_user_pvt_solver->gps_cnav_utc_model, d_user_pvt_solver->glonass_gnav_utc_model, d_user_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 != d_user_pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_ephemeris_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend()) and (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend())) - { - d_rp->log_rinex_obs(d_rp->obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, d_gnss_observables_map); - if (!d_rinex_header_updated and ((d_user_pvt_solver->gps_cnav_utc_model.d_A0 != 0) or (d_user_pvt_solver->gps_utc_model.d_A0 != 0)) and (d_user_pvt_solver->galileo_utc_model.A0_6 != 0)) - { - if (d_user_pvt_solver->gps_cnav_utc_model.d_A0 != 0) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->gps_cnav_utc_model); - d_rp->update_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_cnav_utc_model, d_user_pvt_solver->gps_cnav_iono, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - } - else - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->gps_utc_model); - d_rp->update_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_user_pvt_solver->galileo_iono, d_user_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 != d_user_pvt_solver->gps_ephemeris_map.cend()) and (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend())) - { - d_rp->log_rinex_obs(d_rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, d_gnss_observables_map); - if (!d_rinex_header_updated and (d_user_pvt_solver->gps_utc_model.d_A0 != 0) and (d_user_pvt_solver->galileo_utc_model.A0_6 != 0)) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->gps_utc_model); - d_rp->update_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; // do not write header anymore - } - } - break; - case 101: // Galileo E1B + Galileo E6B - if (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rp->log_rinex_obs(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, "1B"); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->galileo_utc_model.A0_6 != 0)) - { - d_rp->update_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 102: // Galileo E5a + Galileo E6B - if (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rp->log_rinex_obs(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, "5X"); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->galileo_utc_model.A0_6 != 0)) - { - d_rp->update_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 103: // Galileo E5b + Galileo E6B - if (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rp->log_rinex_obs(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, "5X"); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->galileo_utc_model.A0_6 != 0)) - { - d_rp->update_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 104: // Galileo E1B + Galileo E5a + Galileo E6B - if (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rp->log_rinex_obs(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, "1B 5X"); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->galileo_utc_model.A0_6 != 0)) - { - d_rp->update_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - case 105: // Galileo E1B + Galileo E5b + Galileo E6B - if (galileo_ephemeris_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rp->log_rinex_obs(d_rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, "1B 7X"); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->galileo_utc_model.A0_6 != 0)) - { - d_rp->update_nav_header(d_rp->navGalFile, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rp->update_obs_header(d_rp->obsFile, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend()) and (gps_ephemeris_iter != d_user_pvt_solver->gps_ephemeris_map.cend())) - { - d_rp->log_rinex_obs(d_rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, d_gnss_observables_map); - if (!d_rinex_header_updated and (d_user_pvt_solver->gps_utc_model.d_A0 != 0)) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->gps_utc_model); - d_rp->update_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - } - break; - case 500: // BDS B1I only - if (beidou_dnav_ephemeris_iter != d_user_pvt_solver->beidou_dnav_ephemeris_map.cend()) - { - d_rp->log_rinex_obs(d_rp->obsFile, beidou_dnav_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, "B1"); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->beidou_dnav_utc_model.d_A0_UTC != 0)) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->beidou_dnav_utc_model); - d_rp->update_nav_header(d_rp->navFile, d_user_pvt_solver->beidou_dnav_utc_model, d_user_pvt_solver->beidou_dnav_iono); - d_rinex_header_updated = true; - } - break; - case 600: // BDS B3I only - if (beidou_dnav_ephemeris_iter != d_user_pvt_solver->beidou_dnav_ephemeris_map.cend()) - { - d_rp->log_rinex_obs(d_rp->obsFile, beidou_dnav_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, "B3"); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->beidou_dnav_utc_model.d_A0_UTC != 0)) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->beidou_dnav_utc_model); - d_rp->update_nav_header(d_rp->navFile, d_user_pvt_solver->beidou_dnav_utc_model, d_user_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 != d_user_pvt_solver->gps_ephemeris_map.cend()) and - (gps_cnav_ephemeris_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend())) - { - d_rp->log_rinex_obs(d_rp->obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, true); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->gps_utc_model.d_A0 != 0)) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->gps_utc_model); - d_rp->update_nav_header(d_rp->navFile, d_user_pvt_solver->gps_utc_model, d_user_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 != d_user_pvt_solver->galileo_ephemeris_map.cend()) and - (gps_ephemeris_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) and - (gps_cnav_ephemeris_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend())) - { - d_rp->log_rinex_obs(d_rp->obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, true); - } - if (!d_rinex_header_updated and (d_user_pvt_solver->gps_utc_model.d_A0 != 0) and (d_user_pvt_solver->galileo_utc_model.A0_6 != 0)) - { - d_rp->update_obs_header(d_rp->obsFile, d_user_pvt_solver->gps_utc_model); - d_rp->update_nav_header(d_rp->navMixFile, d_user_pvt_solver->gps_iono, d_user_pvt_solver->gps_utc_model, gps_ephemeris_iter->second, d_user_pvt_solver->galileo_iono, d_user_pvt_solver->galileo_utc_model); - d_rinex_header_updated = true; - } - break; - default: - break; - } - } - } + 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); } - - // ####################### RTCM MESSAGES ################# - try + if (d_rtcm_enabled) { - if (d_rtcm_writing_started and d_rtcm_enabled) - { - switch (d_type_of_rx) - { - case 1: // GPS L1 C/A - if (flag_write_RTCM_1019_output == true) - { - for (const auto& gps_eph_iter : d_user_pvt_solver->gps_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - const auto gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 4: // Galileo E1B - case 5: // Galileo E5a - case 6: // Galileo E5b - if (flag_write_RTCM_1045_output == true) - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - const auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 7: // GPS L1 C/A + GPS L2C - if (flag_write_RTCM_1019_output == true) - { - for (const auto& gps_eph_iter : d_user_pvt_solver->gps_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - const auto gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - const auto gps_cnav_eph_iter = d_user_pvt_solver->gps_cnav_ephemeris_map.cbegin(); - if ((gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_eph_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend())) - { - d_rtcm_printer->Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 8: // L1+L5 - if (flag_write_RTCM_1019_output == true) - { - for (const auto& gps_eph_iter : d_user_pvt_solver->gps_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - const auto gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - const auto gps_cnav_eph_iter = d_user_pvt_solver->gps_cnav_ephemeris_map.cbegin(); - if ((gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_eph_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend())) - { - d_rtcm_printer->Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 9: // GPS L1 C/A + Galileo E1B - if (flag_write_RTCM_1019_output == true) - { - for (const auto& gps_eph_iter : d_user_pvt_solver->gps_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (flag_write_RTCM_1045_output == true) - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - auto gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - int gps_channel = 0; - int gal_channel = 0; - for (const auto& gnss_observables_iter : d_gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (gal_channel == 0) - { - if (system == "E") - { - gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - } - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 13: // L5+E5a - if (flag_write_RTCM_1045_output == true) - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - - if (flag_write_RTCM_MSM_output and d_rtcm_MSM_rate_ms != 0) - { - auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - auto gps_cnav_eph_iter = d_user_pvt_solver->gps_cnav_ephemeris_map.cbegin(); - int gal_channel = 0; - int gps_channel = 0; - for (const auto& gnss_observables_iter : d_gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_cnav_eph_iter = d_user_pvt_solver->gps_cnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_cnav_eph_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (gal_channel == 0) - { - if (system == "E") - { - gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - } - - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend() and (d_rtcm_MT1097_rate_ms != 0)) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - if (gps_cnav_eph_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend() and (d_rtcm_MT1077_rate_ms != 0)) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, gps_cnav_eph_iter->second, {}, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 14: // Galileo E1B + Galileo E5a - case 15: // Galileo E1B + Galileo E5b - if (flag_write_RTCM_1045_output == true) - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - const auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 23: // GLONASS L1 C/A - case 24: // GLONASS L2 C/A - case 25: // GLONASS L1 C/A + GLONASS L2 C/A - if (flag_write_RTCM_1020_output == true) - { - for (const auto& glonass_gnav_ephemeris_iter : d_user_pvt_solver->glonass_gnav_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1020(glonass_gnav_ephemeris_iter.second, d_user_pvt_solver->glonass_gnav_utc_model); - } - } - if (flag_write_RTCM_MSM_output == true) - { - const auto glo_gnav_ephemeris_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - if (glo_gnav_ephemeris_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, {}, glo_gnav_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 26: // GPS L1 C/A + GLONASS L1 C/A - if (flag_write_RTCM_1019_output == true) - { - for (const auto& gps_eph_iter : d_user_pvt_solver->gps_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (flag_write_RTCM_1020_output == true) - { - for (const auto& glonass_gnav_ephemeris_iter : d_user_pvt_solver->glonass_gnav_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1020(glonass_gnav_ephemeris_iter.second, d_user_pvt_solver->glonass_gnav_utc_model); - } - } - if (flag_write_RTCM_MSM_output == true) - { - auto glonass_gnav_eph_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - auto gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - int gps_channel = 0; - int glo_channel = 0; - for (const auto& gnss_observables_iter : d_gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (glo_channel == 0) - { - if (system == "R") - { - glonass_gnav_eph_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (glonass_gnav_eph_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - glo_channel = 1; - } - } - } - } - - if (glonass_gnav_eph_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 27: // GLONASS L1 C/A + Galileo E1B - if (flag_write_RTCM_1020_output == true) - { - for (const auto& glonass_gnav_eph_iter : d_user_pvt_solver->glonass_gnav_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, d_user_pvt_solver->glonass_gnav_utc_model); - } - } - if (flag_write_RTCM_1045_output == true) - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - auto glonass_gnav_eph_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - int gal_channel = 0; - int glo_channel = 0; - for (const auto& gnss_observables_iter : d_gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gal_channel == 0) - { - if (system == "E") - { - // This is a channel with valid GPS signal - gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - if (glo_channel == 0) - { - if (system == "R") - { - glonass_gnav_eph_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (glonass_gnav_eph_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - glo_channel = 1; - } - } - } - } - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - if (glonass_gnav_eph_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 29: // GPS L1 C/A + GLONASS L2 C/A - if (flag_write_RTCM_1019_output == true) - { - for (const auto& gps_eph_iter : d_user_pvt_solver->gps_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (flag_write_RTCM_1020_output == true) - { - for (const auto& glonass_gnav_eph_iter : d_user_pvt_solver->glonass_gnav_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, d_user_pvt_solver->glonass_gnav_utc_model); - } - } - if (flag_write_RTCM_MSM_output == true) - { - auto gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - auto glonass_gnav_eph_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - int gps_channel = 0; - int glo_channel = 0; - for (const auto& gnss_observables_iter : d_gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (glo_channel == 0) - { - if (system == "R") - { - glonass_gnav_eph_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (glonass_gnav_eph_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - glo_channel = 1; - } - } - } - } - if (glonass_gnav_eph_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 30: // GLONASS L2 C/A + Galileo E1B - if (flag_write_RTCM_1020_output == true) - { - for (const auto& glonass_gnav_eph_iter : d_user_pvt_solver->glonass_gnav_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, d_user_pvt_solver->glonass_gnav_utc_model); - } - } - if (flag_write_RTCM_1045_output == true) - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - auto glonass_gnav_eph_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - int gal_channel = 0; - int glo_channel = 0; - for (const auto& gnss_observables_iter : d_gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gal_channel == 0) - { - if (system == "E") - { - // This is a channel with valid GPS signal - gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - if (glo_channel == 0) - { - if (system == "R") - { - glonass_gnav_eph_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (glonass_gnav_eph_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - glo_channel = 1; - } - } - } - } - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - if (glonass_gnav_eph_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 32: // L1+E1+L5+E5a - if (flag_write_RTCM_1019_output == true) - { - for (const auto& gps_eph_iter : d_user_pvt_solver->gps_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (flag_write_RTCM_1045_output == true) - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - auto gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - int gal_channel = 0; - int gps_channel = 0; - for (const auto& gnss_observables_iter : d_gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gal_channel == 0) - { - if (system == "E") - { - // This is a channel with valid GPS signal - gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - if (gps_channel == 0) - { - if (system == "G") - { - gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - } - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 101: // Galileo E1B + Galileo E6B - case 102: // Galileo E5a + Galileo E6B - case 103: // Galileo E5b + Galileo E6B - case 104: // Galileo E1B + Galileo E5a + Galileo E6B - case 105: // Galileo E1B + Galileo E5b + Galileo E6B - if (flag_write_RTCM_1045_output == true) - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - const auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - case 106: // GPS L1 C/A + Galileo E1B + Galileo E6B - if (flag_write_RTCM_1019_output == true) - { - for (const auto& gps_eph_iter : d_user_pvt_solver->gps_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (flag_write_RTCM_1045_output == true) - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (flag_write_RTCM_MSM_output == true) - { - auto gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - int gps_channel = 0; - int gal_channel = 0; - for (const auto& gnss_observables_iter : d_gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (gal_channel == 0) - { - if (system == "E") - { - gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - } - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - break; - default: - break; - } - } - - if (!d_rtcm_writing_started and d_rtcm_enabled) // the first time - { - switch (d_type_of_rx) - { - case 1: // GPS L1 C/A - if (d_rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gps_eph_iter : d_user_pvt_solver->gps_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (d_rtcm_MSM_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - const auto gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 4: // Galileo E1B - case 5: // Galileo E5a - case 6: // Galileo E5b - if (d_rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (d_rtcm_MSM_rate_ms != 0) - { - const auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 7: // GPS L1 C/A + GPS L2C - if (d_rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gps_eph_iter : d_user_pvt_solver->gps_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (d_rtcm_MSM_rate_ms != 0) - { - const auto gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - const auto gps_cnav_eph_iter = d_user_pvt_solver->gps_cnav_ephemeris_map.cbegin(); - if ((gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_eph_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend())) - { - d_rtcm_printer->Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 8: // L1+L5 - if (d_rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gps_eph_iter : d_user_pvt_solver->gps_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (d_rtcm_MSM_rate_ms != 0) - { - const auto gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - const auto gps_cnav_eph_iter = d_user_pvt_solver->gps_cnav_ephemeris_map.cbegin(); - if ((gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_eph_iter != d_user_pvt_solver->gps_cnav_ephemeris_map.cend())) - { - d_rtcm_printer->Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 9: // GPS L1 C/A + Galileo E1B - if (d_rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gps_eph_iter : d_user_pvt_solver->gps_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (d_rtcm_MT1045_rate_ms != 0) - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (d_rtcm_MSM_rate_ms != 0) - { - auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - auto gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - int gps_channel = 0; - int gal_channel = 0; - for (const auto& gnss_observables_iter : d_gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (gal_channel == 0) - { - if (system == "E") - { - gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - } - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - - case 13: // L5+E5a - if (d_rtcm_MT1045_rate_ms != 0) - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (d_rtcm_MSM_rate_ms != 0) - { - auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - int gal_channel = 0; - for (const auto& gnss_observables_iter : d_gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gal_channel == 0) - { - if (system == "E") - { - gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - } - - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend() and (d_rtcm_MT1097_rate_ms != 0)) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 14: // Galileo E1B + Galileo E5a - case 15: // Galileo E1B + Galileo E5b - if (d_rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (d_rtcm_MSM_rate_ms != 0) - { - const auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 23: // GLONASS L1 C/A - case 24: // GLONASS L2 C/A - case 25: // GLONASS L1 C/A + GLONASS L2 C/A - if (d_rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& glonass_gnav_eph_iter : d_user_pvt_solver->glonass_gnav_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, d_user_pvt_solver->glonass_gnav_utc_model); - } - } - if (d_rtcm_MSM_rate_ms != 0) - { - const auto glo_gnav_ephemeris_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - if (glo_gnav_ephemeris_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, {}, glo_gnav_ephemeris_iter->second, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 26: // GPS L1 C/A + GLONASS L1 C/A - if (d_rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gps_eph_iter : d_user_pvt_solver->gps_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (d_rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& glonass_gnav_eph_iter : d_user_pvt_solver->glonass_gnav_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, d_user_pvt_solver->glonass_gnav_utc_model); - } - } - if (d_rtcm_MSM_rate_ms != 0) - { - auto gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - auto glonass_gnav_eph_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - int gps_channel = 0; - int glo_channel = 0; - for (const auto& gnss_observables_iter : d_gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (glo_channel == 0) - { - if (system == "R") - { - glonass_gnav_eph_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (glonass_gnav_eph_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - glo_channel = 1; - } - } - } - } - if (glonass_gnav_eph_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 27: // GLONASS L1 C/A + Galileo E1B - if (d_rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& glonass_gnav_eph_iter : d_user_pvt_solver->glonass_gnav_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, d_user_pvt_solver->glonass_gnav_utc_model); - } - } - if (d_rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (d_rtcm_MSM_rate_ms != 0) - { - int gal_channel = 0; - int glo_channel = 0; - auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - auto glonass_gnav_eph_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - for (const auto& gnss_observables_iter : d_gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gal_channel == 0) - { - if (system == "E") - { - // This is a channel with valid GPS signal - gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - if (glo_channel == 0) - { - if (system == "R") - { - glonass_gnav_eph_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (glonass_gnav_eph_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - glo_channel = 1; - } - } - } - } - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - if (glonass_gnav_eph_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 29: // GPS L1 C/A + GLONASS L2 C/A - if (d_rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gps_eph_iter : d_user_pvt_solver->gps_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (d_rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& glonass_gnav_eph_iter : d_user_pvt_solver->glonass_gnav_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, d_user_pvt_solver->glonass_gnav_utc_model); - } - } - if (d_rtcm_MSM_rate_ms != 0) - { - auto gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - auto glonass_gnav_eph_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - int gps_channel = 0; - int glo_channel = 0; - for (const auto& gnss_observables_iter : d_gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (glo_channel == 0) - { - if (system == "R") - { - glonass_gnav_eph_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (glonass_gnav_eph_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - glo_channel = 1; - } - } - } - } - if (glonass_gnav_eph_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 30: // GLONASS L2 C/A + Galileo E1B - if (d_rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& glonass_gnav_eph_iter : d_user_pvt_solver->glonass_gnav_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, d_user_pvt_solver->glonass_gnav_utc_model); - } - } - if (d_rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (d_rtcm_MSM_rate_ms != 0) - { - int gal_channel = 0; - int glo_channel = 0; - auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - auto glonass_gnav_eph_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.cbegin(); - for (const auto& gnss_observables_iter : d_gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gal_channel == 0) - { - if (system == "E") - { - // This is a channel with valid GPS signal - gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - if (glo_channel == 0) - { - if (system == "R") - { - glonass_gnav_eph_iter = d_user_pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (glonass_gnav_eph_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - glo_channel = 1; - } - } - } - } - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - if (glonass_gnav_eph_iter != d_user_pvt_solver->glonass_gnav_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 32: // L1+E1+L5+E5a - if (d_rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gps_eph_iter : d_user_pvt_solver->gps_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (d_rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (d_rtcm_MSM_rate_ms != 0) - { - auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - auto gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - int gps_channel = 0; - int gal_channel = 0; - for (const auto& gnss_observables_iter : d_gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (gal_channel == 0) - { - if (system == "E") - { - gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - } - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 101: // Galileo E1B + Galileo E6B - case 102: // Galileo E5a + Galileo E6B - case 103: // Galileo E5b + Galileo E6B - if (d_rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (d_rtcm_MSM_rate_ms != 0) - { - const auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 104: // Galileo E1B + Galileo E5a + Galileo E6B - case 105: // Galileo E1B + Galileo E5b + Galileo E6B - if (d_rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (d_rtcm_MSM_rate_ms != 0) - { - const auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - case 106: // GPS L1 C/A + Galileo E1B + Galileo E6B - if (d_rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 - { - for (const auto& gps_eph_iter : d_user_pvt_solver->gps_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1019(gps_eph_iter.second); - } - } - if (d_rtcm_MT1045_rate_ms != 0) - { - for (const auto& gal_eph_iter : d_user_pvt_solver->galileo_ephemeris_map) - { - d_rtcm_printer->Print_Rtcm_MT1045(gal_eph_iter.second); - } - } - if (d_rtcm_MSM_rate_ms != 0) - { - auto gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.cbegin(); - auto gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.cbegin(); - int gps_channel = 0; - int gal_channel = 0; - for (const auto& gnss_observables_iter : d_gnss_observables_map) - { - const std::string system(gnss_observables_iter.second.System, 1); - if (gps_channel == 0) - { - if (system == "G") - { - // This is a channel with valid GPS signal - gps_eph_iter = d_user_pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - gps_channel = 1; - } - } - } - if (gal_channel == 0) - { - if (system == "E") - { - gal_eph_iter = d_user_pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - gal_channel = 1; - } - } - } - } - if (gps_eph_iter != d_user_pvt_solver->gps_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - if (gal_eph_iter != d_user_pvt_solver->galileo_ephemeris_map.cend()) - { - d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, d_rx_time, d_gnss_observables_map, d_enable_rx_clock_correction, 0, 0, false, false); - } - } - d_rtcm_writing_started = true; - break; - default: - break; - } - } - } - catch (const boost::exception& ex) - { - std::cout << "RTCM boost exception: " << boost::diagnostic_information(ex) << '\n'; - LOG(ERROR) << "RTCM boost exception: " << boost::diagnostic_information(ex); - } - catch (const std::exception& ex) - { - std::cout << "RTCM std exception: " << ex.what() << '\n'; - LOG(ERROR) << "RTCM std exception: " << ex.what(); + d_rtcm_printer->Print_Rtcm_Messages(d_user_pvt_solver.get(), + d_gnss_observables_map, + d_rx_time, + d_type_of_rx, + d_rtcm_MSM_rate_ms, + d_rtcm_MT1019_rate_ms, + d_rtcm_MT1020_rate_ms, + d_rtcm_MT1045_rate_ms, + d_rtcm_MT1077_rate_ms, + d_rtcm_MT1097_rate_ms, + flag_write_RTCM_MSM_output, + flag_write_RTCM_1019_output, + flag_write_RTCM_1020_output, + flag_write_RTCM_1045_output, + d_enable_rx_clock_correction); } } } diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h index b986b541c..e7f627ea2 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h @@ -255,20 +255,17 @@ private: bool d_dump; bool d_dump_mat; bool d_rinex_output_enabled; - bool d_rinex_header_written; - bool d_rinex_header_updated; bool d_geojson_output_enabled; bool d_gpx_output_enabled; bool d_kml_output_enabled; bool d_nmea_output_file_enabled; + bool d_rtcm_enabled; bool d_first_fix; bool d_xml_storage; bool d_flag_monitor_pvt_enabled; bool d_show_local_time_zone; bool d_waiting_obs_block_rx_clock_offset_correction_msg; bool d_enable_rx_clock_correction; - bool d_rtcm_writing_started; - bool d_rtcm_enabled; }; diff --git a/src/algorithms/PVT/libs/rinex_printer.cc b/src/algorithms/PVT/libs/rinex_printer.cc index 69bc92527..912289c23 100644 --- a/src/algorithms/PVT/libs/rinex_printer.cc +++ b/src/algorithms/PVT/libs/rinex_printer.cc @@ -39,6 +39,7 @@ #include "gps_iono.h" #include "gps_navigation_message.h" #include "gps_utc_model.h" +#include "rtklib_solver.h" #include #include #include @@ -77,7 +78,9 @@ namespace errorlib = boost::system; Rinex_Printer::Rinex_Printer(int32_t conf_version, const std::string& base_path, const std::string& base_name) { - pre_2009_file_ = false; + d_pre_2009_file = false; + d_rinex_header_updated = false; + d_rinex_header_written = false; std::string base_rinex_path = base_path; fs::path full_path(fs::current_path()); const fs::path p(base_rinex_path); @@ -218,17 +221,17 @@ Rinex_Printer::Rinex_Printer(int32_t conf_version, const std::string& base_path, if (conf_version == 2) { - version = 2; - stringVersion = "2.11"; + d_version = 2; + d_stringVersion = "2.11"; } else { - version = 3; - stringVersion = "3.02"; + d_version = 3; + d_stringVersion = "3.02"; } - numberTypesObservations = 4; // Number of available types of observable in the system - fake_cnav_iode = 1; + d_numberTypesObservations = 4; // Number of available types of observable in the system + d_fake_cnav_iode = 1; } @@ -318,6 +321,1066 @@ 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) +{ + 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; + 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) + { + 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); + 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); + 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); + 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); + 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); + 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); + 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()) and (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); + 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()) and (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); + 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()) and (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); + 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()) and (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); + 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()) and (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); + 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()) and (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); + 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); + 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); + 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); + 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); + 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); + 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()) and (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); + } + 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); + 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()) and (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); + 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()) and (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); + 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()) and (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); + 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); + 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()) and (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); + 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()) and (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); + 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); + 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); + 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 101: // Galileo E1B + Galileo E6B + 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); + 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"); + rinex_obs_header(obsFile, galileo_ephemeris_iter->second, rx_time, signal); + rinex_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); + 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"); + rinex_obs_header(obsFile, galileo_ephemeris_iter->second, rx_time, signal); + rinex_nav_header(navGalFile, pvt_solver->galileo_iono, pvt_solver->galileo_utc_model); + 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"); + 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); + 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"); + 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); + 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()) and (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); + 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); + 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()) and (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()) and (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); + 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); + 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); + 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) + { + switch (type_of_rx) + { + 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 and (pvt_solver->gps_utc_model.d_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 and (pvt_solver->gps_cnav_utc_model.d_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()) + { + log_rinex_obs(obsFile, galileo_ephemeris_iter->second, rx_time, gnss_observables_map, "1B"); + } + if (!d_rinex_header_updated and (pvt_solver->galileo_utc_model.A0_6 != 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 and (pvt_solver->galileo_utc_model.A0_6 != 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 and (pvt_solver->galileo_utc_model.A0_6 != 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()) 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); + if (!d_rinex_header_updated and (pvt_solver->gps_utc_model.d_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()) 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); + if (!d_rinex_header_updated and ((pvt_solver->gps_cnav_utc_model.d_A0 != 0) or (pvt_solver->gps_utc_model.d_A0 != 0))) + { + if (pvt_solver->gps_cnav_utc_model.d_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()) and (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 and (pvt_solver->gps_utc_model.d_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()) and (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 and (pvt_solver->gps_cnav_utc_model.d_A0 != 0) and (pvt_solver->galileo_utc_model.A0_6 != 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 and (pvt_solver->galileo_utc_model.A0_6 != 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 and (pvt_solver->galileo_utc_model.A0_6 != 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 and (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 and (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 and (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()) and (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 and (pvt_solver->gps_utc_model.d_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()) and (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 and (pvt_solver->galileo_utc_model.A0_6 != 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()) and (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 and (pvt_solver->gps_cnav_utc_model.d_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()) and (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 and (pvt_solver->gps_utc_model.d_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()) and (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 and (pvt_solver->galileo_utc_model.A0_6 != 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()) and (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 and (pvt_solver->gps_cnav_utc_model.d_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()) and (gps_cnav_ephemeris_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) and (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 and ((pvt_solver->gps_cnav_utc_model.d_A0 != 0) or (pvt_solver->gps_utc_model.d_A0 != 0)) and (pvt_solver->galileo_utc_model.A0_6 != 0)) + { + if (pvt_solver->gps_cnav_utc_model.d_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()) and (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 and (pvt_solver->gps_utc_model.d_A0 != 0) and (pvt_solver->galileo_utc_model.A0_6 != 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 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"); + } + if (!d_rinex_header_updated and (pvt_solver->galileo_utc_model.A0_6 != 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"); + } + if (!d_rinex_header_updated and (pvt_solver->galileo_utc_model.A0_6 != 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, "5X"); + } + if (!d_rinex_header_updated and (pvt_solver->galileo_utc_model.A0_6 != 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"); + } + if (!d_rinex_header_updated and (pvt_solver->galileo_utc_model.A0_6 != 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"); + } + if (!d_rinex_header_updated and (pvt_solver->galileo_utc_model.A0_6 != 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()) and (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 and (pvt_solver->gps_utc_model.d_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 and (pvt_solver->beidou_dnav_utc_model.d_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 and (pvt_solver->beidou_dnav_utc_model.d_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 and (pvt_solver->gps_utc_model.d_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 and (pvt_solver->gps_utc_model.d_A0 != 0) and (pvt_solver->galileo_utc_model.A0_6 != 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; + default: + break; + } + } + } +} + + +void Rinex_Printer::log_rinex_nav_gps_cnav(int type_of_rx, const std::map& new_cnav_eph) +{ + std::map new_gal_eph; + std::map new_glo_eph; + switch (type_of_rx) + { + 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 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) +{ + std::map new_glo_eph; + std::map new_cnav_eph; + std::map new_eph; + switch (type_of_rx) + { + 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 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 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 + 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 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) +{ + std::map new_gal_eph; + std::map new_cnav_eph; + std::map new_eph; + switch (type_of_rx) + { + 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) +{ + switch (type_of_rx) + { + case 500: // BDS B1I only + case 600: // BDS B3I only + log_rinex_nav(navFile, new_bds_eph); + break; + default: + break; + } +} + + void Rinex_Printer::lengthCheck(const std::string& line) const { if (line.length() != 80) @@ -462,7 +1525,7 @@ std::string Rinex_Printer::getLocalTime() const } strmMin << utc_minute; - if (version == 2) + if (d_version == 2) { const int32_t day = pt_tm.tm_mday; line += Rinex_Printer::rightJustify(std::to_string(day), 2); @@ -492,7 +1555,7 @@ std::string Rinex_Printer::getLocalTime() const line += std::string(5, ' '); } - if (version == 3) + if (d_version == 3) { line += boost::gregorian::to_iso_string(today); line += std::string(1, ' '); @@ -521,7 +1584,7 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Glonass_Gnav_Utc_M // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); @@ -563,7 +1626,7 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Glonass_Gnav_Utc_M out << line << '\n'; // -------- Line system time correction - if (version == 3) + if (d_version == 3) { line.clear(); line += std::string("GLUT"); @@ -590,7 +1653,7 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Glonass_Gnav_Utc_M Rinex_Printer::lengthCheck(line); out << line << '\n'; } - if (version == 2) + if (d_version == 2) { // Set reference time and its clock corrections const boost::posix_time::ptime p_utc_ref_time = glonass_gnav_eph.glot_to_utc(glonass_gnav_eph.d_t_b, 0.0); @@ -626,12 +1689,12 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_Iono& gps_iono { } // Avoid compiler warning std::string line; - stringVersion = "3.02"; - version = 3; + d_stringVersion = "3.02"; + d_version = 3; // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); @@ -718,7 +1781,7 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_Iono& gps_iono line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_utc_model.d_A1, 15, 2), 16); line += Rinex_Printer::rightJustify(std::to_string(gps_utc_model.d_t_OT), 7); - if (pre_2009_file_ == false) + if (d_pre_2009_file == false) { if (eph.i_GPS_week < 512) { @@ -786,12 +1849,12 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_CNAV_Iono& gps { } // Avoid compiler warning std::string line; - stringVersion = "3.02"; - version = 3; + d_stringVersion = "3.02"; + d_version = 3; // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); @@ -917,7 +1980,7 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Galileo_Iono& gali // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); @@ -1024,7 +2087,7 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Galileo_Iono& iono // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); @@ -1130,7 +2193,7 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_CNAV_Iono& ion // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); @@ -1246,7 +2309,7 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_CNAV_Iono& ion // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); @@ -1378,16 +2441,16 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_Iono& iono, co // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); - if (version == 2) + if (d_version == 2) { line += std::string("N: GPS NAV DATA"); line += std::string(25, ' '); } - if (version == 3) + if (d_version == 3) { line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); @@ -1434,7 +2497,7 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_Iono& iono, co // -------- Line ionospheric info 1 line.clear(); - if (version == 2) + if (d_version == 2) { line += std::string(2, ' '); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha0, 10, 2), 12); @@ -1444,7 +2507,7 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_Iono& iono, co line += std::string(10, ' '); line += Rinex_Printer::leftJustify("ION ALPHA", 20); } - if (version == 3) + if (d_version == 3) { line += std::string("GPSA"); line += std::string(1, ' '); @@ -1460,7 +2523,7 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_Iono& iono, co // -------- Line ionospheric info 2 line.clear(); - if (version == 2) + if (d_version == 2) { line += std::string(2, ' '); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta0, 10, 2), 12); @@ -1471,7 +2534,7 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_Iono& iono, co line += Rinex_Printer::leftJustify("ION BETA", 20); } - if (version == 3) + if (d_version == 3) { line += std::string("GPSB"); line += std::string(1, ' '); @@ -1487,13 +2550,13 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_Iono& iono, co // -------- Line 5 system time correction line.clear(); - if (version == 2) + if (d_version == 2) { line += std::string(3, ' '); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A0, 18, 2), 19); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A1, 18, 2), 19); line += Rinex_Printer::rightJustify(std::to_string(utc_model.d_t_OT), 9); - if (pre_2009_file_ == false) + if (d_pre_2009_file == false) { if (eph.i_GPS_week < 512) { @@ -1533,13 +2596,13 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_Iono& iono, co line += Rinex_Printer::leftJustify("DELTA-UTC: A0,A1,T,W", 20); } - if (version == 3) + if (d_version == 3) { line += std::string("GPUT"); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A0, 16, 2), 18); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A1, 15, 2), 16); line += Rinex_Printer::rightJustify(std::to_string(utc_model.d_t_OT), 7); - if (pre_2009_file_ == false) + if (d_pre_2009_file == false) { if (eph.i_GPS_week < 512) { @@ -1595,11 +2658,11 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_Iono& iono, co // For leap second information, see https://endruntechnologies.com/support/leap-seconds line.clear(); line += Rinex_Printer::rightJustify(std::to_string(utc_model.d_DeltaT_LS), 6); - if (version == 2) + if (d_version == 2) { line += std::string(54, ' '); } - if (version == 3) + if (d_version == 3) { line += Rinex_Printer::rightJustify(std::to_string(utc_model.d_DeltaT_LSF), 6); line += Rinex_Printer::rightJustify(std::to_string(utc_model.i_WN_LSF), 6); @@ -1625,7 +2688,7 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_Iono& gps_iono // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); @@ -1723,7 +2786,7 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_Iono& gps_iono line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_utc_model.d_A0, 16, 2), 18); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_utc_model.d_A1, 15, 2), 16); line += Rinex_Printer::rightJustify(std::to_string(gps_utc_model.d_t_OT), 7); - if (pre_2009_file_ == false) + if (d_pre_2009_file == false) { if (eph.i_GPS_week < 512) { @@ -1791,10 +2854,10 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Beidou_Dnav_Iono& // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); - if (version == 3) + if (d_version == 3) { line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); @@ -1902,7 +2965,7 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_Iono& gps_iono // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); @@ -2050,12 +3113,12 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_Iono& gps_iono void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_CNAV_Iono& gps_cnav_iono, const Gps_CNAV_Utc_Model& gps_cnav_utc_model, const Beidou_Dnav_Iono& bds_dnav_iono, const Beidou_Dnav_Utc_Model& bds_dnav_utc_model) { std::string line; - stringVersion = "3.02"; - version = 3; + d_stringVersion = "3.02"; + d_version = 3; // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); @@ -2183,7 +3246,7 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Glonass_Gnav_Utc_M // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); @@ -2300,7 +3363,7 @@ void Rinex_Printer::rinex_nav_header(std::fstream& out, const Galileo_Iono& gali // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); @@ -2735,7 +3798,7 @@ void Rinex_Printer::update_nav_header(std::fstream& out, const Gps_Utc_Model& ut { line_aux.clear(); - if (version == 2) + if (d_version == 2) { if (line_str.find("ION ALPHA", 59) != std::string::npos) { @@ -2765,7 +3828,7 @@ void Rinex_Printer::update_nav_header(std::fstream& out, const Gps_Utc_Model& ut line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A0, 18, 2), 19); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A1, 18, 2), 19); line_aux += Rinex_Printer::rightJustify(std::to_string(utc_model.d_t_OT), 9); - if (pre_2009_file_ == false) + if (d_pre_2009_file == false) { if (eph.i_GPS_week < 512) { @@ -2802,7 +3865,7 @@ void Rinex_Printer::update_nav_header(std::fstream& out, const Gps_Utc_Model& ut } } - if (version == 3) + if (d_version == 3) { if (line_str.find("GPSA", 0) != std::string::npos) { @@ -2834,7 +3897,7 @@ void Rinex_Printer::update_nav_header(std::fstream& out, const Gps_Utc_Model& ut line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A0, 16, 2), 18); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A1, 15, 2), 16); line_aux += Rinex_Printer::rightJustify(std::to_string(utc_model.d_t_OT), 7); - if (pre_2009_file_ == false) + if (d_pre_2009_file == false) { if (eph.i_GPS_week < 512) { @@ -3181,7 +4244,7 @@ void Rinex_Printer::update_nav_header(std::fstream& out, const Gps_Iono& gps_ion line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_utc_model.d_A0, 16, 2), 18); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_utc_model.d_A1, 15, 2), 16); line_aux += Rinex_Printer::rightJustify(std::to_string(gps_utc_model.d_t_OT), 7); - if (pre_2009_file_ == false) + if (d_pre_2009_file == false) { if (eph.i_GPS_week < 512) { @@ -3303,7 +4366,7 @@ void Rinex_Printer::update_nav_header(std::fstream& out, const Gps_Iono& gps_ion line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_utc_model.d_A0, 16, 2), 18); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_utc_model.d_A1, 15, 2), 16); line_aux += Rinex_Printer::rightJustify(std::to_string(gps_utc_model.d_t_OT), 7); - if (pre_2009_file_ == false) + if (d_pre_2009_file == false) { if (eph.i_GPS_week < 512) { @@ -3704,7 +4767,7 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::mapsecond.i_satellite_PRN), 2); line += std::string(1, ' '); @@ -3775,7 +4838,7 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::mapsecond.d_A_f2, 18, 2); line += std::string(1, ' '); } - if (version == 3) + if (d_version == 3) { line += satelliteSystem.find("GPS")->second; if (gps_ephemeris_iter->second.i_satellite_PRN < 10) @@ -3809,11 +4872,11 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::mapsecond.d_Delta_n, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_M_0, 18, 2); - if (version == 2) + if (d_version == 2) { line += std::string(1, ' '); } @@ -3841,11 +4904,11 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::mapsecond.d_Cus, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_sqrt_A, 18, 2); - if (version == 2) + if (d_version == 2) { line += std::string(1, ' '); } @@ -3865,11 +4928,11 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::mapsecond.d_OMEGA0, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_Cis, 18, 2); - if (version == 2) + if (d_version == 2) { line += std::string(1, ' '); } @@ -3889,11 +4952,11 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::mapsecond.d_OMEGA, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_OMEGA_DOT, 18, 2); - if (version == 2) + if (d_version == 2) { line += std::string(1, ' '); } @@ -3913,11 +4976,11 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::map(gps_ephemeris_iter->second.i_code_on_L2), 18, 2); line += std::string(1, ' '); double GPS_week_continuous_number; - if (pre_2009_file_ == false) + if (d_pre_2009_file == false) { if (gps_ephemeris_iter->second.i_GPS_week < 512) { @@ -3949,7 +5012,7 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::map(gps_ephemeris_iter->second.i_code_on_L2), 18, 2); - if (version == 2) + if (d_version == 2) { line += std::string(1, ' '); } @@ -3958,11 +5021,11 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::mapsecond.d_TGD, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_IODC, 18, 2); - if (version == 2) + if (d_version == 2) { line += std::string(1, ' '); } @@ -3982,11 +5045,11 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::mapsecond.d_Toe1 == gps_ephemeris_iter->second.d_Toe2) && (gps_ephemeris_iter->second.d_Toe1 == gps_ephemeris_iter->second.d_Toc))) // Toe1: Toe in message type 10, Toe2: Toe in message type 11 { // Toe1: Toe in message type 10, Toe2: Toe in message type 11, - fake_cnav_iode = fake_cnav_iode + 1; - if (fake_cnav_iode == 240) + d_fake_cnav_iode = d_fake_cnav_iode + 1; + if (d_fake_cnav_iode == 240) { - fake_cnav_iode = 1; + d_fake_cnav_iode = 1; } } - line += Rinex_Printer::doub2for(fake_cnav_iode, 18, 2); + line += Rinex_Printer::doub2for(d_fake_cnav_iode, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_Crs, 18, 2); line += std::string(1, ' '); @@ -4215,7 +5278,7 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::mapsecond.d_TGD, 18, 2); line += std::string(1, ' '); // no IODC in CNAV, so we fake it (see above) - line += Rinex_Printer::doub2for(fake_cnav_iode, 18, 2); + line += Rinex_Printer::doub2for(d_fake_cnav_iode, 18, 2); Rinex_Printer::lengthCheck(line); out << line << '\n'; @@ -4463,7 +5526,7 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::mapsecond.i_satellite_PRN), 2); line += std::string(1, ' '); @@ -4534,7 +5597,7 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::mapsecond.d_t_k, 18, 2); line += std::string(1, ' '); } - if (version == 3) + if (d_version == 3) { line += satelliteSystem.find("GLONASS")->second; if (glonass_gnav_ephemeris_iter->second.i_satellite_PRN < 10) @@ -4569,11 +5632,11 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::mapsecond.d_AXn, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(glonass_gnav_ephemeris_iter->second.d_B_n, 18, 2); - if (version == 2) + if (d_version == 2) { line += std::string(1, ' '); } @@ -4594,11 +5657,11 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::mapsecond.d_AYn, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(glonass_gnav_ephemeris_iter->second.i_satellite_freq_channel, 18, 2); - if (version == 2) + if (d_version == 2) { line += std::string(1, ' '); } @@ -4619,11 +5682,11 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::mapsecond.d_AZn, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(glonass_gnav_ephemeris_iter->second.d_E_n, 18, 2); - if (version == 2) + if (d_version == 2) { line += std::string(1, ' '); } @@ -4648,8 +5711,8 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::map& gps_eph_map, const std::map& galileo_eph_map) { - version = 3; - stringVersion = "3.02"; + d_version = 3; + d_stringVersion = "3.02"; Rinex_Printer::log_rinex_nav(out, gps_eph_map); Rinex_Printer::log_rinex_nav(out, galileo_eph_map); } @@ -4657,8 +5720,8 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::map& gps_cnav_eph_map, const std::map& galileo_eph_map) { - version = 3; - stringVersion = "3.02"; + d_version = 3; + d_stringVersion = "3.02"; Rinex_Printer::log_rinex_nav(out, gps_cnav_eph_map); Rinex_Printer::log_rinex_nav(out, galileo_eph_map); } @@ -4680,8 +5743,8 @@ void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::map& galileo_eph_map, const std::map& glonass_gnav_eph_map) { - version = 3; - stringVersion = "3.02"; + d_version = 3; + d_stringVersion = "3.02"; Rinex_Printer::log_rinex_nav(out, galileo_eph_map); Rinex_Printer::log_rinex_nav(out, glonass_gnav_eph_map); } @@ -4840,7 +5903,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Glonass_Gnav_Ephem // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += Rinex_Printer::leftJustify("OBSERVATION DATA", 20); line += satelliteSystem.find("GLONASS")->second; @@ -4851,11 +5914,11 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Glonass_Gnav_Ephem // -------- Line 2 line.clear(); - if (version == 2) + if (d_version == 2) { line += Rinex_Printer::leftJustify("BLANK OR G = GPS, R = GLONASS, E = GALILEO, M = MIXED", 60); } - if (version == 3) + if (d_version == 3) { line += Rinex_Printer::leftJustify("G = GPS R = GLONASS E = GALILEO S = GEO M = MIXED", 60); } @@ -4902,7 +5965,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Glonass_Gnav_Ephem out << line << '\n'; // -------- Line MARKER TYPE - if (version == 2) + if (d_version == 2) { line.clear(); line += Rinex_Printer::leftJustify("GROUND_CRAFT", 20); // put a flag or a property @@ -4911,7 +5974,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Glonass_Gnav_Ephem Rinex_Printer::lengthCheck(line); out << line << '\n'; } - if (version == 3) + if (d_version == 3) { line.clear(); line += Rinex_Printer::leftJustify("GROUND_CRAFT", 20); // put a flag or a property @@ -4992,7 +6055,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Glonass_Gnav_Ephem out << line << '\n'; // -------- SYS / OBS TYPES - if (version == 3) + if (d_version == 3) { // -------- SYS / OBS TYPES // one line per available system @@ -5000,8 +6063,8 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Glonass_Gnav_Ephem line += satelliteSystem.find("GLONASS")->second; line += std::string(2, ' '); std::stringstream strm; - numberTypesObservations = 4; - strm << numberTypesObservations; + d_numberTypesObservations = 4; + strm << d_numberTypesObservations; line += Rinex_Printer::rightJustify(strm.str(), 3); std::string signal_ = "1G"; @@ -5046,12 +6109,12 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Glonass_Gnav_Ephem Rinex_Printer::lengthCheck(line); out << line << '\n'; } - if (version == 2) + if (d_version == 2) { // -------- SYS / OBS TYPES line.clear(); std::stringstream strm; - strm << numberTypesObservations; + strm << d_numberTypesObservations; line += Rinex_Printer::rightJustify(strm.str(), 6); // per type of observation // GLONASS L1 C/A PSEUDORANGE @@ -5073,7 +6136,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Glonass_Gnav_Ephem } // -------- Signal Strength units (Only version 3) - if (version == 3) + if (d_version == 3) { // -------- Signal Strength units line.clear(); @@ -5107,8 +6170,8 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Glonass_Gnav_Ephem Rinex_Printer::lengthCheck(line); out << line << '\n'; - // -------- GLONASS SLOT / FRQ # (On;y version 3) - if (version == 3) + // -------- GLONASS SLOT / FRQ # (On;y d_version 3) + if (d_version == 3) { // -------- GLONASS SLOT / FRQ # // TODO Need to provide system with list of all satellites and update this accordingly @@ -5172,7 +6235,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += Rinex_Printer::leftJustify("OBSERVATION DATA", 20); line += satelliteSystem["Mixed"]; @@ -5220,7 +6283,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps out << line << '\n'; // -------- Line MARKER NAME / TYPE - if (version == 2) + if (d_version == 2) { line.clear(); line += Rinex_Printer::leftJustify("GROUND_CRAFT", 20); // put a flag or a property @@ -5229,7 +6292,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps Rinex_Printer::lengthCheck(line); out << line << '\n'; } - if (version == 3) + if (d_version == 3) { line.clear(); line += Rinex_Printer::leftJustify("GROUND_CRAFT", 20); // put a flag or a property @@ -5318,15 +6381,15 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps out << line << '\n'; // -------- SYS / OBS TYPES - if (version == 3) + if (d_version == 3) { // one line per available system line.clear(); line += satelliteSystem.find("GPS")->second; line += std::string(2, ' '); std::stringstream strm; - numberTypesObservations = 4; - strm << numberTypesObservations; + d_numberTypesObservations = 4; + strm << d_numberTypesObservations; line += Rinex_Printer::rightJustify(strm.str(), 3); // per type of observation // GPS L1 PSEUDORANGE @@ -5403,12 +6466,12 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps Rinex_Printer::lengthCheck(line); out << line << '\n'; } - if (version == 2) + if (d_version == 2) { // -------- SYS / OBS TYPES line.clear(); std::stringstream strm; - strm << numberTypesObservations; + strm << d_numberTypesObservations; line += Rinex_Printer::rightJustify(strm.str(), 6); // per type of observation // GLONASS L1 C/A PSEUDORANGE @@ -5430,7 +6493,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps } // -------- Signal Strength units (only version 3) - if (version == 3) + if (d_version == 3) { line.clear(); line += Rinex_Printer::leftJustify("DBHZ", 20); @@ -5464,7 +6527,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps out << line << '\n'; // -------- GLONASS SLOT / FRQ # (On;y version 3) - if (version == 3) + if (d_version == 3) { // -------- GLONASS SLOT / FRQ # // TODO Need to provide system with list of all satellites and update this accordingly @@ -5528,7 +6591,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += Rinex_Printer::leftJustify("OBSERVATION DATA", 20); line += satelliteSystem["Mixed"]; @@ -5583,7 +6646,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris out << line << '\n'; // -------- Line MARKER NUMBER / TYPE - if (version == 2) + if (d_version == 2) { line.clear(); line += Rinex_Printer::leftJustify("GROUND_CRAFT", 20); // put a flag or a property @@ -5592,7 +6655,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris Rinex_Printer::lengthCheck(line); out << line << '\n'; } - if (version == 3) + if (d_version == 3) { line.clear(); line += Rinex_Printer::leftJustify("GROUND_CRAFT", 20); // put a flag or a property @@ -5678,8 +6741,8 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris line += satelliteSystem.find("GPS")->second; line += std::string(2, ' '); std::stringstream strm; - numberTypesObservations = 4; - strm << numberTypesObservations; + d_numberTypesObservations = 4; + strm << d_numberTypesObservations; line += Rinex_Printer::rightJustify(strm.str(), 3); // per type of observation // GPS L1 PSEUDORANGE @@ -5845,7 +6908,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Galileo_Ephemeris& { } // avoid warning, not needed std::string line; - version = 3; + d_version = 3; // -------- Line 1 line = std::string(5, ' '); @@ -6165,7 +7228,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += Rinex_Printer::leftJustify("OBSERVATION DATA", 20); line += satelliteSystem.find("GPS")->second; @@ -6176,11 +7239,11 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph // -------- Line 2 line.clear(); - if (version == 2) + if (d_version == 2) { line += Rinex_Printer::leftJustify("BLANK OR G = GPS, R = GLONASS, E = GALILEO, M = MIXED", 60); } - if (version == 3) + if (d_version == 3) { line += Rinex_Printer::leftJustify("G = GPS R = GLONASS E = GALILEO S = GEO M = MIXED", 60); } @@ -6304,7 +7367,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph Rinex_Printer::lengthCheck(line); out << line << '\n'; - if (version == 2) + if (d_version == 2) { // --------- WAVELENGTH FACTOR // put here real data! @@ -6317,7 +7380,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph out << line << '\n'; } - if (version == 3) + if (d_version == 3) { // -------- SYS / OBS TYPES // one line per available system @@ -6325,8 +7388,8 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph line += satelliteSystem.find("GPS")->second; line += std::string(2, ' '); std::stringstream strm; - numberTypesObservations = 4; - strm << numberTypesObservations; + d_numberTypesObservations = 4; + strm << d_numberTypesObservations; line += Rinex_Printer::rightJustify(strm.str(), 3); // per type of observation // GPS L1 PSEUDORANGE @@ -6352,12 +7415,12 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph out << line << '\n'; } - if (version == 2) + if (d_version == 2) { // -------- SYS / OBS TYPES line.clear(); std::stringstream strm; - strm << numberTypesObservations; + strm << d_numberTypesObservations; line += Rinex_Printer::rightJustify(strm.str(), 6); // per type of observation // GPS L1 PSEUDORANGE @@ -6378,7 +7441,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph out << line << '\n'; } - if (version == 3) + if (d_version == 3) { // -------- Signal Strength units line.clear(); @@ -6429,7 +7492,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += Rinex_Printer::leftJustify("OBSERVATION DATA", 20); line += satelliteSystem.find("GPS")->second; @@ -6580,8 +7643,8 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris line += satelliteSystem.find("GPS")->second; line += std::string(2, ' '); std::stringstream strm; - numberTypesObservations = number_of_observations_gps; - strm << numberTypesObservations; + d_numberTypesObservations = number_of_observations_gps; + strm << d_numberTypesObservations; line += Rinex_Printer::rightJustify(strm.str(), 3); // per type of observation @@ -6680,7 +7743,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph // -------- Line 1 line = std::string(5, ' '); - line += stringVersion; + line += d_stringVersion; line += std::string(11, ' '); line += Rinex_Printer::leftJustify("OBSERVATION DATA", 20); line += satelliteSystem.find("GPS")->second; @@ -6837,8 +7900,8 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph line += satelliteSystem.find("GPS")->second; line += std::string(2, ' '); std::stringstream strm; - numberTypesObservations = number_of_observations_gps; - strm << numberTypesObservations; + d_numberTypesObservations = number_of_observations_gps; + strm << d_numberTypesObservations; line += Rinex_Printer::rightJustify(strm.str(), 3); // per type of observation if (found_1C != std::string::npos) @@ -6949,7 +8012,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps_eph, const Gps_CNAV_Ephemeris& eph_cnav, const Galileo_Ephemeris& galileo_eph, double d_TOW_first_observation, const std::string& gps_bands, const std::string& galileo_bands) { std::string line; - version = 3; + d_version = 3; if (eph_cnav.d_e_eccentricity == 0) { // avoid warning @@ -7118,8 +8181,8 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps line += satelliteSystem.find("GPS")->second; line += std::string(2, ' '); std::stringstream strm; - numberTypesObservations = number_of_observations_gps; - strm << numberTypesObservations; + d_numberTypesObservations = number_of_observations_gps; + strm << d_numberTypesObservations; line += Rinex_Printer::rightJustify(strm.str(), 3); // per type of observation if (found_1C != std::string::npos) @@ -7300,7 +8363,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris& eph_cnav, const Galileo_Ephemeris& galileo_eph, double d_TOW_first_observation, const std::string& gps_bands, const std::string& galileo_bands) { std::string line; - version = 3; + d_version = 3; if (galileo_eph.e_1 == 0) { // avoid warning @@ -7458,8 +8521,8 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris line += satelliteSystem.find("GPS")->second; line += std::string(2, ' '); std::stringstream strm; - numberTypesObservations = number_of_observations_gps; - strm << numberTypesObservations; + d_numberTypesObservations = number_of_observations_gps; + strm << d_numberTypesObservations; line += Rinex_Printer::rightJustify(strm.str(), 3); // per type of observation if (found_2S != std::string::npos) @@ -7621,7 +8684,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris void Rinex_Printer::rinex_obs_header(std::fstream& out, const Galileo_Ephemeris& eph, double d_TOW_first_observation, const std::string& bands) { std::string line; - version = 3; + d_version = 3; // -------- Line 1 line = std::string(5, ' '); @@ -7888,7 +8951,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps { } // avoid warning, not needed std::string line; - version = 3; + d_version = 3; // -------- Line 1 line = std::string(5, ' '); @@ -8030,8 +9093,8 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps line += satelliteSystem.find("GPS")->second; line += std::string(2, ' '); std::stringstream strm; - numberTypesObservations = 4; - strm << numberTypesObservations; + d_numberTypesObservations = 4; + strm << d_numberTypesObservations; line += Rinex_Printer::rightJustify(strm.str(), 3); // per type of observation // GPS L1 PSEUDORANGE @@ -8178,7 +9241,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps void Rinex_Printer::rinex_obs_header(std::fstream& out, const Beidou_Dnav_Ephemeris& eph, double d_TOW_first_observation, const std::string& bands) { std::string line; - version = 3; + d_version = 3; // -------- Line 1 line = std::string(5, ' '); @@ -8435,7 +9498,7 @@ void Rinex_Printer::update_obs_header(std::fstream& out, const Gps_Utc_Model& ut { line_aux.clear(); - if (version == 2) + if (d_version == 2) { if (line_str.find("TIME OF FIRST OBS", 59) != std::string::npos) // TIME OF FIRST OBS last header annotation might change in the future { @@ -8456,7 +9519,7 @@ void Rinex_Printer::update_obs_header(std::fstream& out, const Gps_Utc_Model& ut } } - if (version == 3) + if (d_version == 3) { if (line_str.find("TIME OF FIRST OBS", 59) != std::string::npos) { @@ -8697,7 +9760,7 @@ void Rinex_Printer::log_rinex_obs(std::fstream& out, const Glonass_Gnav_Ephemeri const std::string minutes(timestring, 11, 2); const double utc_sec = modf(obs_time, &int_sec) + p_glonass_time.time_of_day().seconds(); - if (version == 2) + if (d_version == 2) { line.clear(); const std::string year(timestring, 2, 2); @@ -8820,7 +9883,7 @@ void Rinex_Printer::log_rinex_obs(std::fstream& out, const Glonass_Gnav_Ephemeri } } - if (version == 3) + if (d_version == 3) { const std::string year(timestring, 0, 4); line += std::string(1, '>'); @@ -8951,7 +10014,7 @@ void Rinex_Printer::log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_ep const std::string hour(timestring, 9, 2); const std::string minutes(timestring, 11, 2); - if (version == 2) + if (d_version == 2) { line.clear(); const std::string year(timestring, 2, 2); @@ -8992,7 +10055,7 @@ void Rinex_Printer::log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_ep // Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event line += std::string(1, '0'); } - if (version == 3) + if (d_version == 3) { const std::string year(timestring, 0, 4); line += std::string(1, '>'); @@ -9080,7 +10143,7 @@ void Rinex_Printer::log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_ep const int32_t numGpsSatellitesObserved = observablesG1C.size(); const int32_t numSatellitesObserved = numGloSatellitesObserved + numGpsSatellitesObserved; line += Rinex_Printer::rightJustify(std::to_string(numSatellitesObserved), 3); - if (version == 2) + if (d_version == 2) { // Add list of GPS satellites for (observables_iter = observablesG1C.cbegin(); @@ -9133,7 +10196,7 @@ void Rinex_Printer::log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_ep lineObs.clear(); s.assign(1, observables_iter->second.System); - if (version == 3) + if (d_version == 3) { // Specify system only if in version 3 if (s == "G") @@ -9209,7 +10272,7 @@ void Rinex_Printer::log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_ep it++) { lineObs.clear(); - if (version == 3) + if (d_version == 3) { lineObs += satelliteSystem.find("GLONASS")->second; if (static_cast(*it) < 10) @@ -9804,7 +10867,7 @@ void Rinex_Printer::log_rinex_obs(std::fstream& out, const Gps_Ephemeris& eph, d const std::string hour(timestring, 9, 2); const std::string minutes(timestring, 11, 2); - if (version == 2) + if (d_version == 2) { line.clear(); const std::string year(timestring, 2, 2); @@ -9928,7 +10991,7 @@ void Rinex_Printer::log_rinex_obs(std::fstream& out, const Gps_Ephemeris& eph, d } } - if (version == 3) + if (d_version == 3) { const std::string year(timestring, 0, 4); line += std::string(1, '>'); @@ -11885,7 +12948,7 @@ boost::posix_time::ptime Rinex_Printer::compute_UTC_time(const Gps_Navigation_Me const double utc_t = nav_msg.utc_time(nav_msg.get_TOW()); const boost::posix_time::time_duration t = boost::posix_time::milliseconds(static_cast((utc_t + 604800 * static_cast(nav_msg.get_GPS_week())) * 1000)); // Handle week rollover - if (pre_2009_file_ == false) + if (d_pre_2009_file == false) { // Handle week rollover (valid from 2009 to 2029) if (nav_msg.get_GPS_week() < 512) @@ -11932,7 +12995,7 @@ boost::posix_time::ptime Rinex_Printer::compute_GPS_time(const Gps_Ephemeris& ep } // Handle week rollover - if (pre_2009_file_ == false) + if (d_pre_2009_file == false) { // Handle week rollover (valid from 2009 to 2029) if (eph.i_GPS_week < 512) @@ -12095,7 +13158,7 @@ double Rinex_Printer::get_leap_second(const Glonass_Gnav_Ephemeris& eph, double void Rinex_Printer::set_pre_2009_file(bool pre_2009_file) { - pre_2009_file_ = pre_2009_file; + d_pre_2009_file = pre_2009_file; } diff --git a/src/algorithms/PVT/libs/rinex_printer.h b/src/algorithms/PVT/libs/rinex_printer.h index 87789c585..207169daf 100644 --- a/src/algorithms/PVT/libs/rinex_printer.h +++ b/src/algorithms/PVT/libs/rinex_printer.h @@ -73,6 +73,7 @@ class Gps_Ephemeris; class Gps_Iono; class Gps_Navigation_Message; class Gps_Utc_Model; +class Rtklib_Solver; /*! @@ -92,6 +93,218 @@ public: */ ~Rinex_Printer(); + void 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); + + void log_rinex_nav_gps_cnav(int type_of_rx, const std::map& new_cnav_eph); + + void log_rinex_nav_gps_nav(int type_of_rx, const std::map& new_eph); + + void log_rinex_nav_gal_nav(int type_of_rx, const std::map& new_gal_eph); + + void log_rinex_nav_glo_gnav(int type_of_rx, const std::map& new_glo_eph); + + void log_rinex_nav_bds_dnav(int type_of_rx, const std::map& new_bds_eph); + + void set_pre_2009_file(bool pre_2009_file); + + /*! + * \brief Writes data from the GPS L1 C/A navigation message into the RINEX file + */ + void log_rinex_nav(std::fstream& out, const std::map& eph_map) const; + + /*! + * \brief Writes data from the GPS L2 navigation message into the RINEX file + */ + void log_rinex_nav(std::fstream& out, const std::map& eph_map); + + /*! + * \brief Writes data from the Galileo navigation message into the RINEX file + */ + void log_rinex_nav(std::fstream& out, const std::map& eph_map) const; + + /*! + * \brief Writes data from the Mixed (GPS/Galileo) navigation message into the RINEX file + */ + void log_rinex_nav(std::fstream& out, const std::map& gps_eph_map, const std::map& galileo_eph_map); + + /*! + * \brief Writes data from the Mixed (GPS/Galileo) navigation message into the RINEX file + */ + void log_rinex_nav(std::fstream& out, const std::map& gps_cnav_eph_map, const std::map& galileo_eph_map); + + /*! + * \brief Writes data from the GLONASS GNAV navigation message into the RINEX file + */ + void log_rinex_nav(std::fstream& out, const std::map& eph_map) const; + + /*! + * \brief Writes data from the Mixed (GPS/GLONASS GNAV) navigation message into the RINEX file + */ + void log_rinex_nav(std::fstream& out, const std::map& gps_eph_map, const std::map& glonass_gnav_eph_map) const; + + /*! + * \brief Writes data from the Mixed (GPS/GLONASS GNAV) navigation message into the RINEX file + */ + void log_rinex_nav(std::fstream& out, const std::map& gps_cnav_eph_map, const std::map& glonass_gnav_eph_map); + + /*! + * \brief Writes data from the Mixed (Galileo/ GLONASS GNAV) navigation message into the RINEX file + */ + void log_rinex_nav(std::fstream& out, const std::map& galileo_eph_map, const std::map& glonass_gnav_eph_map); + + /*! + * \brief Writes data from the Beidou B1I navigation message into the RINEX file + */ + void log_rinex_nav(std::fstream& out, const std::map& eph_map) const; + + /*! + * \brief Generates the GPS Observation data header + */ + void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph, double d_TOW_first_observation); + + /*! + * \brief Generates the GPS L2 Observation data header + */ + void rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris& eph, double d_TOW_first_observation, const std::string& gps_bands = "2S"); + + /*! + * \brief Generates the dual frequency GPS L1 & L2/L5 Observation data header + */ + void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph, const Gps_CNAV_Ephemeris& eph_cnav, double d_TOW_first_observation, const std::string& gps_bands = "1C 2S"); + + /*! + * \brief Generates the Galileo Observation data header. Example: bands("1B"), bands("1B 5X"), bands("5X"), ... Default: "1B". + */ + void rinex_obs_header(std::fstream& out, const Galileo_Ephemeris& eph, double d_TOW_first_observation, const std::string& bands = "1B"); + + /*! + * \brief Generates the Mixed (GPS/Galileo) Observation data header. Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". + */ + void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps_eph, const Galileo_Ephemeris& galileo_eph, double d_TOW_first_observation, const std::string& galileo_bands = "1B"); + + /*! + * \brief Generates the Mixed (GPS/Galileo) Observation data header. Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". + */ + void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps_eph, const Gps_CNAV_Ephemeris& eph_cnav, const Galileo_Ephemeris& galileo_eph, double d_TOW_first_observation, const std::string& gps_bands = "1C 2S", const std::string& galileo_bands = "1B"); + + /*! + * \brief Generates the Mixed (GPS/Galileo) Observation data header. Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". + */ + void rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris& eph_cnav, const Galileo_Ephemeris& galileo_eph, double d_TOW_first_observation, const std::string& gps_bands = "2S", const std::string& galileo_bands = "1B"); + + /*! + * \brief Generates the GLONASS GNAV Observation data header. Example: bands("1C"), bands("1C 2C"), bands("2C"), ... Default: "1C". + */ + void rinex_obs_header(std::fstream& out, const Glonass_Gnav_Ephemeris& eph, double d_TOW_first_observation, const std::string& bands = "1G"); + + /*! + * \brief Generates the Mixed (GPS L1 C/A /GLONASS) Observation data header. Example: galileo_bands("1C"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". + */ + void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double d_TOW_first_observation, const std::string& glonass_bands = "1C"); + + /*! + * \brief Generates the Mixed (Galileo/GLONASS) Observation data header. Example: galileo_bands("1C"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". + */ + void rinex_obs_header(std::fstream& out, const Galileo_Ephemeris& galileo_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double d_TOW_first_observation, const std::string& galileo_bands = "1B", const std::string& glonass_bands = "1C"); + + /*! + * \brief Generates the Mixed (GPS L2C/GLONASS) Observation data header. Example: galileo_bands("1G")... Default: "1G". + */ + void rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris& gps_cnav_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double d_TOW_first_observation, const std::string& glonass_bands = "1G"); + + /*! + * \brief Generates the a Beidou B1I Observation data header. Example: beidou_bands("B1") + */ + void rinex_obs_header(std::fstream& out, const Beidou_Dnav_Ephemeris& eph, double d_TOW_first_observation, const std::string& bands); + + /*! + * \brief Generates the SBAS raw data header + */ + void rinex_sbs_header(std::fstream& out) const; + + /*! + * \brief Writes GPS L1 observables into the RINEX file + */ + void log_rinex_obs(std::fstream& out, const Gps_Ephemeris& eph, double obs_time, const std::map& observables) const; + + /*! + * \brief Writes GPS L2 observables into the RINEX file + */ + void log_rinex_obs(std::fstream& out, const Gps_CNAV_Ephemeris& eph, double obs_time, const std::map& observables) const; + + /*! + * \brief Writes dual frequency GPS L1 and L2 observables into the RINEX file + */ + void log_rinex_obs(std::fstream& out, const Gps_Ephemeris& eph, const Gps_CNAV_Ephemeris& eph_cnav, double obs_time, const std::map& observables, bool triple_band = false) const; + + /*! + * \brief Writes Galileo observables into the RINEX file. Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". + */ + void log_rinex_obs(std::fstream& out, const Galileo_Ephemeris& eph, double obs_time, const std::map& observables, const std::string& galileo_bands = "1B") const; + + /*! + * \brief Writes Mixed GPS / Galileo observables into the RINEX file + */ + void log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_eph, const Galileo_Ephemeris& galileo_eph, double gps_obs_time, const std::map& observables) const; + + /*! + * \brief Writes Mixed GPS / Galileo observables into the RINEX file + */ + void log_rinex_obs(std::fstream& out, const Gps_CNAV_Ephemeris& eph, const Galileo_Ephemeris& galileo_eph, double gps_obs_time, const std::map& observables) const; + + /*! + * \brief Writes Mixed GPS / Galileo observables into the RINEX file + */ + void log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_eph, const Gps_CNAV_Ephemeris& gps_cnav_eph, const Galileo_Ephemeris& galileo_eph, double gps_obs_time, const std::map& observables, bool triple_band = false) const; + + /*! + * \brief Writes GLONASS GNAV observables into the RINEX file. Example: glonass_bands("1C"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". + */ + void log_rinex_obs(std::fstream& out, const Glonass_Gnav_Ephemeris& eph, double obs_time, const std::map& observables, const std::string& glonass_bands = "1C") const; + + /*! + * \brief Writes Mixed GPS L1 C/A - GLONASS observables into the RINEX file + */ + void log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double gps_obs_time, const std::map& observables) const; + + /*! + * \brief Writes Mixed GPS L2C - GLONASS observables into the RINEX file + */ + void log_rinex_obs(std::fstream& out, const Gps_CNAV_Ephemeris& gps_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double gps_obs_time, const std::map& observables) const; + + /*! + * \brief Writes Mixed Galileo/GLONASS observables into the RINEX file + */ + void log_rinex_obs(std::fstream& out, const Galileo_Ephemeris& galileo_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double galileo_obs_time, const std::map& observables) const; + + /*! + * \brief Writes BDS B1I observables into the RINEX file + */ + void log_rinex_obs(std::fstream& out, const Beidou_Dnav_Ephemeris& eph, double obs_time, const std::map& observables, const std::string& bds_bands) const; + + std::fstream obsFile; //!< Output file stream for RINEX observation file + std::fstream navFile; //!< Output file stream for RINEX navigation data file + 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 navMixFile; //!< Output file stream for RINEX Mixed navigation data file + + std::string navfilename; + std::string obsfilename; + std::string sbsfilename; + std::string navGalfilename; + std::string navGlofilename; + std::string navBdsfilename; + std::string navMixfilename; + + bool d_rinex_header_written; + +private: /*! * \brief Generates the GPS L1 C/A Navigation Data header */ @@ -162,70 +375,6 @@ public: */ void rinex_nav_header(std::fstream& out, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& galileo_utc_model, const Beidou_Dnav_Iono& bds_dnav_iono, const Beidou_Dnav_Utc_Model& bds_dnav_utc_model) const; - /*! - * \brief Generates the GPS Observation data header - */ - void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph, double d_TOW_first_observation); - - /*! - * \brief Generates the GPS L2 Observation data header - */ - void rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris& eph, double d_TOW_first_observation, const std::string& gps_bands = "2S"); - - /*! - * \brief Generates the dual frequency GPS L1 & L2/L5 Observation data header - */ - void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph, const Gps_CNAV_Ephemeris& eph_cnav, double d_TOW_first_observation, const std::string& gps_bands = "1C 2S"); - - /*! - * \brief Generates the Galileo Observation data header. Example: bands("1B"), bands("1B 5X"), bands("5X"), ... Default: "1B". - */ - void rinex_obs_header(std::fstream& out, const Galileo_Ephemeris& eph, double d_TOW_first_observation, const std::string& bands = "1B"); - - /*! - * \brief Generates the Mixed (GPS/Galileo) Observation data header. Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". - */ - void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps_eph, const Galileo_Ephemeris& galileo_eph, double d_TOW_first_observation, const std::string& galileo_bands = "1B"); - - /*! - * \brief Generates the Mixed (GPS/Galileo) Observation data header. Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". - */ - void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps_eph, const Gps_CNAV_Ephemeris& eph_cnav, const Galileo_Ephemeris& galileo_eph, double d_TOW_first_observation, const std::string& gps_bands = "1C 2S", const std::string& galileo_bands = "1B"); - - /*! - * \brief Generates the Mixed (GPS/Galileo) Observation data header. Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". - */ - void rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris& eph_cnav, const Galileo_Ephemeris& galileo_eph, double d_TOW_first_observation, const std::string& gps_bands = "2S", const std::string& galileo_bands = "1B"); - - /*! - * \brief Generates the GLONASS GNAV Observation data header. Example: bands("1C"), bands("1C 2C"), bands("2C"), ... Default: "1C". - */ - void rinex_obs_header(std::fstream& out, const Glonass_Gnav_Ephemeris& eph, double d_TOW_first_observation, const std::string& bands = "1G"); - - /*! - * \brief Generates the Mixed (GPS L1 C/A /GLONASS) Observation data header. Example: galileo_bands("1C"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". - */ - void rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double d_TOW_first_observation, const std::string& glonass_bands = "1C"); - - /*! - * \brief Generates the Mixed (Galileo/GLONASS) Observation data header. Example: galileo_bands("1C"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". - */ - void rinex_obs_header(std::fstream& out, const Galileo_Ephemeris& galileo_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double d_TOW_first_observation, const std::string& galileo_bands = "1B", const std::string& glonass_bands = "1C"); - - /*! - * \brief Generates the Mixed (GPS L2C/GLONASS) Observation data header. Example: galileo_bands("1G")... Default: "1G". - */ - void rinex_obs_header(std::fstream& out, const Gps_CNAV_Ephemeris& gps_cnav_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double d_TOW_first_observation, const std::string& glonass_bands = "1G"); - - /*! - * \brief Generates the a Beidou B1I Observation data header. Example: beidou_bands("B1") - */ - void rinex_obs_header(std::fstream& out, const Beidou_Dnav_Ephemeris& eph, double d_TOW_first_observation, const std::string& bands); - - /*! - * \brief Generates the SBAS raw data header - */ - void rinex_sbs_header(std::fstream& out) const; /*! * \brief Computes the BDS Time and returns a boost::posix_time::ptime object @@ -272,116 +421,6 @@ public: */ double get_leap_second(const Glonass_Gnav_Ephemeris& eph, double gps_obs_time) const; - /*! - * \brief Writes data from the GPS L1 C/A navigation message into the RINEX file - */ - void log_rinex_nav(std::fstream& out, const std::map& eph_map) const; - - /*! - * \brief Writes data from the GPS L2 navigation message into the RINEX file - */ - void log_rinex_nav(std::fstream& out, const std::map& eph_map); - - /*! - * \brief Writes data from the Galileo navigation message into the RINEX file - */ - void log_rinex_nav(std::fstream& out, const std::map& eph_map) const; - - /*! - * \brief Writes data from the Mixed (GPS/Galileo) navigation message into the RINEX file - */ - void log_rinex_nav(std::fstream& out, const std::map& gps_eph_map, const std::map& galileo_eph_map); - - /*! - * \brief Writes data from the Mixed (GPS/Galileo) navigation message into the RINEX file - */ - void log_rinex_nav(std::fstream& out, const std::map& gps_cnav_eph_map, const std::map& galileo_eph_map); - - /*! - * \brief Writes data from the GLONASS GNAV navigation message into the RINEX file - */ - void log_rinex_nav(std::fstream& out, const std::map& eph_map) const; - - /*! - * \brief Writes data from the Mixed (GPS/GLONASS GNAV) navigation message into the RINEX file - */ - void log_rinex_nav(std::fstream& out, const std::map& gps_eph_map, const std::map& glonass_gnav_eph_map) const; - - /*! - * \brief Writes data from the Mixed (GPS/GLONASS GNAV) navigation message into the RINEX file - */ - void log_rinex_nav(std::fstream& out, const std::map& gps_cnav_eph_map, const std::map& glonass_gnav_eph_map); - - /*! - * \brief Writes data from the Mixed (Galileo/ GLONASS GNAV) navigation message into the RINEX file - */ - void log_rinex_nav(std::fstream& out, const std::map& galileo_eph_map, const std::map& glonass_gnav_eph_map); - - /*! - * \brief Writes data from the Beidou B1I navigation message into the RINEX file - */ - void log_rinex_nav(std::fstream& out, const std::map& eph_map) const; - - /*! - * \brief Writes GPS L1 observables into the RINEX file - */ - void log_rinex_obs(std::fstream& out, const Gps_Ephemeris& eph, double obs_time, const std::map& observables) const; - - /*! - * \brief Writes GPS L2 observables into the RINEX file - */ - void log_rinex_obs(std::fstream& out, const Gps_CNAV_Ephemeris& eph, double obs_time, const std::map& observables) const; - - /*! - * \brief Writes dual frequency GPS L1 and L2 observables into the RINEX file - */ - void log_rinex_obs(std::fstream& out, const Gps_Ephemeris& eph, const Gps_CNAV_Ephemeris& eph_cnav, double obs_time, const std::map& observables, bool triple_band = false) const; - - /*! - * \brief Writes Galileo observables into the RINEX file. Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". - */ - void log_rinex_obs(std::fstream& out, const Galileo_Ephemeris& eph, double obs_time, const std::map& observables, const std::string& galileo_bands = "1B") const; - - /*! - * \brief Writes Mixed GPS / Galileo observables into the RINEX file - */ - void log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_eph, const Galileo_Ephemeris& galileo_eph, double gps_obs_time, const std::map& observables) const; - - /*! - * \brief Writes Mixed GPS / Galileo observables into the RINEX file - */ - void log_rinex_obs(std::fstream& out, const Gps_CNAV_Ephemeris& eph, const Galileo_Ephemeris& galileo_eph, double gps_obs_time, const std::map& observables) const; - - /*! - * \brief Writes Mixed GPS / Galileo observables into the RINEX file - */ - void log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_eph, const Gps_CNAV_Ephemeris& gps_cnav_eph, const Galileo_Ephemeris& galileo_eph, double gps_obs_time, const std::map& observables, bool triple_band = false) const; - - /*! - * \brief Writes GLONASS GNAV observables into the RINEX file. Example: glonass_bands("1C"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". - */ - void log_rinex_obs(std::fstream& out, const Glonass_Gnav_Ephemeris& eph, double obs_time, const std::map& observables, const std::string& glonass_bands = "1C") const; - - /*! - * \brief Writes Mixed GPS L1 C/A - GLONASS observables into the RINEX file - */ - void log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double gps_obs_time, const std::map& observables) const; - - /*! - * \brief Writes Mixed GPS L2C - GLONASS observables into the RINEX file - */ - void log_rinex_obs(std::fstream& out, const Gps_CNAV_Ephemeris& gps_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double gps_obs_time, const std::map& observables) const; - - /*! - * \brief Writes Mixed Galileo/GLONASS observables into the RINEX file - */ - void log_rinex_obs(std::fstream& out, const Galileo_Ephemeris& galileo_eph, const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double galileo_obs_time, const std::map& observables) const; - - /*! - * \brief Writes BDS B1I observables into the RINEX file - */ - void log_rinex_obs(std::fstream& out, const Beidou_Dnav_Ephemeris& eph, double obs_time, const std::map& observables, const std::string& bds_bands) const; - /*! * \brief Represents GPS time in the date time format. Leap years are considered, but leap seconds are not. @@ -423,25 +462,6 @@ public: void update_obs_header(std::fstream& out, const Beidou_Dnav_Utc_Model& utc_model) const; - void set_pre_2009_file(bool pre_2009_file); - - std::fstream obsFile; //!< Output file stream for RINEX observation file - std::fstream navFile; //!< Output file stream for RINEX navigation data file - 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 navMixFile; //!< Output file stream for RINEX Mixed navigation data file - - std::string navfilename; - std::string obsfilename; - std::string sbsfilename; - std::string navGalfilename; - std::string navGlofilename; - std::string navBdsfilename; - std::string navMixfilename; - -private: /* * Generation of RINEX signal strength indicators */ @@ -653,12 +673,14 @@ private: std::map satelliteSystem; // GPS, GLONASS, SBAS payload, Galileo or Beidou std::map observationType; // PSEUDORANGE, CARRIER_PHASE, DOPPLER, SIGNAL_STRENGTH std::map observationCode; // GNSS observation descriptors - std::string stringVersion; // RINEX version (2.10/2.11 or 3.01/3.02) + std::string d_stringVersion; // RINEX version (2.10/2.11 or 3.01/3.02) - double fake_cnav_iode; - int version; // RINEX version (2 for 2.10/2.11 and 3 for 3.01) - int numberTypesObservations; // Number of available types of observable in the system. Should be public? - bool pre_2009_file_; + double d_fake_cnav_iode; + int d_version; // RINEX version (2 for 2.10/2.11 and 3 for 3.01) + int d_numberTypesObservations; // Number of available types of observable in the system. Should be public? + bool d_rinex_header_updated; + + bool d_pre_2009_file; }; diff --git a/src/algorithms/PVT/libs/rtcm_printer.cc b/src/algorithms/PVT/libs/rtcm_printer.cc index 88dcd9d00..3857fea7d 100644 --- a/src/algorithms/PVT/libs/rtcm_printer.cc +++ b/src/algorithms/PVT/libs/rtcm_printer.cc @@ -29,6 +29,7 @@ #include "gps_cnav_ephemeris.h" #include "gps_ephemeris.h" #include "rtcm.h" +#include "rtklib_solver.h" #include #include #include // for tm @@ -37,7 +38,6 @@ #include // for cout, cerr #include // for tcgetattr #include // for close, write - #if HAS_STD_FILESYSTEM #include namespace errorlib = std; @@ -170,6 +170,7 @@ Rtcm_Printer::Rtcm_Printer(const std::string& filename, bool flag_rtcm_file_dump port = rtcm_tcp_port; station_id = rtcm_station_id; + d_rtcm_writing_started = false; rtcm = std::make_unique(port); @@ -229,6 +230,1250 @@ Rtcm_Printer::~Rtcm_Printer() } +void Rtcm_Printer::Print_Rtcm_Messages(const Rtklib_Solver* pvt_solver, + const std::map& gnss_observables_map, + double rx_time, + int32_t type_of_rx, + int32_t rtcm_MSM_rate_ms, + int32_t rtcm_MT1019_rate_ms, + int32_t rtcm_MT1020_rate_ms, + int32_t rtcm_MT1045_rate_ms, + int32_t rtcm_MT1077_rate_ms, + int32_t rtcm_MT1097_rate_ms, + bool flag_write_RTCM_MSM_output, + bool flag_write_RTCM_1019_output, + bool flag_write_RTCM_1020_output, + bool flag_write_RTCM_1045_output, + bool enable_rx_clock_correction) +{ + try + { + if (d_rtcm_writing_started) + { + switch (type_of_rx) + { + case 1: // GPS L1 C/A + if (flag_write_RTCM_1019_output == true) + { + for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) + { + Print_Rtcm_MT1019(gps_eph_iter.second); + } + } + if (flag_write_RTCM_MSM_output == true) + { + const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + break; + case 4: // Galileo E1B + case 5: // Galileo E5a + case 6: // Galileo E5b + if (flag_write_RTCM_1045_output == true) + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (flag_write_RTCM_MSM_output == true) + { + const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + break; + case 7: // GPS L1 C/A + GPS L2C + if (flag_write_RTCM_1019_output == true) + { + for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) + { + Print_Rtcm_MT1019(gps_eph_iter.second); + } + } + if (flag_write_RTCM_MSM_output == true) + { + const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + const auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin(); + if ((gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) + { + Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + break; + case 8: // L1+L5 + if (flag_write_RTCM_1019_output == true) + { + for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) + { + Print_Rtcm_MT1019(gps_eph_iter.second); + } + } + if (flag_write_RTCM_MSM_output == true) + { + const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + const auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin(); + if ((gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) + { + Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + break; + case 9: // GPS L1 C/A + Galileo E1B + if (flag_write_RTCM_1019_output == true) + { + for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) + { + Print_Rtcm_MT1019(gps_eph_iter.second); + } + } + if (flag_write_RTCM_1045_output == true) + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (flag_write_RTCM_MSM_output == true) + { + auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + int gps_channel = 0; + int gal_channel = 0; + for (const auto& gnss_observables_iter : gnss_observables_map) + { + const std::string system(gnss_observables_iter.second.System, 1); + if (gps_channel == 0) + { + if (system == "G") + { + // This is a channel with valid GPS signal + gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + gps_channel = 1; + } + } + } + if (gal_channel == 0) + { + if (system == "E") + { + gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + gal_channel = 1; + } + } + } + } + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + break; + case 13: // L5+E5a + if (flag_write_RTCM_1045_output == true) + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + + if (flag_write_RTCM_MSM_output and rtcm_MSM_rate_ms != 0) + { + auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin(); + int gal_channel = 0; + int gps_channel = 0; + for (const auto& gnss_observables_iter : gnss_observables_map) + { + const std::string system(gnss_observables_iter.second.System, 1); + if (gps_channel == 0) + { + if (system == "G") + { + // This is a channel with valid GPS signal + gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend()) + { + gps_channel = 1; + } + } + } + if (gal_channel == 0) + { + if (system == "E") + { + gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + gal_channel = 1; + } + } + } + } + + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend() and (rtcm_MT1097_rate_ms != 0)) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + if (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend() and (rtcm_MT1077_rate_ms != 0)) + { + Print_Rtcm_MSM(7, {}, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + break; + case 14: // Galileo E1B + Galileo E5a + case 15: // Galileo E1B + Galileo E5b + if (flag_write_RTCM_1045_output == true) + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (flag_write_RTCM_MSM_output == true) + { + const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + break; + case 23: // GLONASS L1 C/A + case 24: // GLONASS L2 C/A + case 25: // GLONASS L1 C/A + GLONASS L2 C/A + if (flag_write_RTCM_1020_output == true) + { + for (const auto& glonass_gnav_ephemeris_iter : pvt_solver->glonass_gnav_ephemeris_map) + { + Print_Rtcm_MT1020(glonass_gnav_ephemeris_iter.second, pvt_solver->glonass_gnav_utc_model); + } + } + if (flag_write_RTCM_MSM_output == true) + { + const auto glo_gnav_ephemeris_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); + if (glo_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, {}, glo_gnav_ephemeris_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + d_rtcm_writing_started = true; + break; + case 26: // GPS L1 C/A + GLONASS L1 C/A + if (flag_write_RTCM_1019_output == true) + { + for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) + { + Print_Rtcm_MT1019(gps_eph_iter.second); + } + } + if (flag_write_RTCM_1020_output == true) + { + for (const auto& glonass_gnav_ephemeris_iter : pvt_solver->glonass_gnav_ephemeris_map) + { + Print_Rtcm_MT1020(glonass_gnav_ephemeris_iter.second, pvt_solver->glonass_gnav_utc_model); + } + } + if (flag_write_RTCM_MSM_output == true) + { + auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); + auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + int gps_channel = 0; + int glo_channel = 0; + for (const auto& gnss_observables_iter : gnss_observables_map) + { + const std::string system(gnss_observables_iter.second.System, 1); + if (gps_channel == 0) + { + if (system == "G") + { + // This is a channel with valid GPS signal + gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + gps_channel = 1; + } + } + } + if (glo_channel == 0) + { + if (system == "R") + { + glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + glo_channel = 1; + } + } + } + } + + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + break; + case 27: // GLONASS L1 C/A + Galileo E1B + if (flag_write_RTCM_1020_output == true) + { + for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) + { + Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); + } + } + if (flag_write_RTCM_1045_output == true) + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (flag_write_RTCM_MSM_output == true) + { + auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); + int gal_channel = 0; + int glo_channel = 0; + for (const auto& gnss_observables_iter : gnss_observables_map) + { + const std::string system(gnss_observables_iter.second.System, 1); + if (gal_channel == 0) + { + if (system == "E") + { + // This is a channel with valid GPS signal + gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + gal_channel = 1; + } + } + } + if (glo_channel == 0) + { + if (system == "R") + { + glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + glo_channel = 1; + } + } + } + } + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + break; + case 29: // GPS L1 C/A + GLONASS L2 C/A + if (flag_write_RTCM_1019_output == true) + { + for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) + { + Print_Rtcm_MT1019(gps_eph_iter.second); + } + } + if (flag_write_RTCM_1020_output == true) + { + for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) + { + Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); + } + } + if (flag_write_RTCM_MSM_output == true) + { + auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); + int gps_channel = 0; + int glo_channel = 0; + for (const auto& gnss_observables_iter : gnss_observables_map) + { + const std::string system(gnss_observables_iter.second.System, 1); + if (gps_channel == 0) + { + if (system == "G") + { + // This is a channel with valid GPS signal + gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + gps_channel = 1; + } + } + } + if (glo_channel == 0) + { + if (system == "R") + { + glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + glo_channel = 1; + } + } + } + } + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + break; + case 30: // GLONASS L2 C/A + Galileo E1B + if (flag_write_RTCM_1020_output == true) + { + for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) + { + Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); + } + } + if (flag_write_RTCM_1045_output == true) + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (flag_write_RTCM_MSM_output == true) + { + auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); + int gal_channel = 0; + int glo_channel = 0; + for (const auto& gnss_observables_iter : gnss_observables_map) + { + const std::string system(gnss_observables_iter.second.System, 1); + if (gal_channel == 0) + { + if (system == "E") + { + // This is a channel with valid GPS signal + gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + gal_channel = 1; + } + } + } + if (glo_channel == 0) + { + if (system == "R") + { + glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + glo_channel = 1; + } + } + } + } + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + break; + case 32: // L1+E1+L5+E5a + if (flag_write_RTCM_1019_output == true) + { + for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) + { + Print_Rtcm_MT1019(gps_eph_iter.second); + } + } + if (flag_write_RTCM_1045_output == true) + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (flag_write_RTCM_MSM_output == true) + { + auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + int gal_channel = 0; + int gps_channel = 0; + for (const auto& gnss_observables_iter : gnss_observables_map) + { + const std::string system(gnss_observables_iter.second.System, 1); + if (gal_channel == 0) + { + if (system == "E") + { + // This is a channel with valid GPS signal + gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + gal_channel = 1; + } + } + } + if (gps_channel == 0) + { + if (system == "G") + { + gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + gps_channel = 1; + } + } + } + } + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + break; + case 101: // Galileo E1B + Galileo E6B + case 102: // Galileo E5a + Galileo E6B + case 103: // Galileo E5b + Galileo E6B + case 104: // Galileo E1B + Galileo E5a + Galileo E6B + case 105: // Galileo E1B + Galileo E5b + Galileo E6B + if (flag_write_RTCM_1045_output == true) + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (flag_write_RTCM_MSM_output == true) + { + const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + break; + case 106: // GPS L1 C/A + Galileo E1B + Galileo E6B + if (flag_write_RTCM_1019_output == true) + { + for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) + { + Print_Rtcm_MT1019(gps_eph_iter.second); + } + } + if (flag_write_RTCM_1045_output == true) + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (flag_write_RTCM_MSM_output == true) + { + auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + int gps_channel = 0; + int gal_channel = 0; + for (const auto& gnss_observables_iter : gnss_observables_map) + { + const std::string system(gnss_observables_iter.second.System, 1); + if (gps_channel == 0) + { + if (system == "G") + { + // This is a channel with valid GPS signal + gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + gps_channel = 1; + } + } + } + if (gal_channel == 0) + { + if (system == "E") + { + gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + gal_channel = 1; + } + } + } + } + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + break; + default: + break; + } + } + + if (!d_rtcm_writing_started) // the first time + { + switch (type_of_rx) + { + case 1: // GPS L1 C/A + if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) + { + Print_Rtcm_MT1019(gps_eph_iter.second); + } + } + if (rtcm_MSM_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + d_rtcm_writing_started = true; + break; + case 4: // Galileo E1B + case 5: // Galileo E5a + case 6: // Galileo E5b + if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (rtcm_MSM_rate_ms != 0) + { + const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + d_rtcm_writing_started = true; + break; + case 7: // GPS L1 C/A + GPS L2C + if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) + { + Print_Rtcm_MT1019(gps_eph_iter.second); + } + } + if (rtcm_MSM_rate_ms != 0) + { + const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + const auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin(); + if ((gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) + { + Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + d_rtcm_writing_started = true; + break; + case 8: // L1+L5 + if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) + { + Print_Rtcm_MT1019(gps_eph_iter.second); + } + } + if (rtcm_MSM_rate_ms != 0) + { + const auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + const auto gps_cnav_eph_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin(); + if ((gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) and (gps_cnav_eph_iter != pvt_solver->gps_cnav_ephemeris_map.cend())) + { + Print_Rtcm_MSM(7, gps_eph_iter->second, gps_cnav_eph_iter->second, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + d_rtcm_writing_started = true; + break; + case 9: // GPS L1 C/A + Galileo E1B + if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) + { + Print_Rtcm_MT1019(gps_eph_iter.second); + } + } + if (rtcm_MT1045_rate_ms != 0) + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (rtcm_MSM_rate_ms != 0) + { + auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + int gps_channel = 0; + int gal_channel = 0; + for (const auto& gnss_observables_iter : gnss_observables_map) + { + const std::string system(gnss_observables_iter.second.System, 1); + if (gps_channel == 0) + { + if (system == "G") + { + // This is a channel with valid GPS signal + gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + gps_channel = 1; + } + } + } + if (gal_channel == 0) + { + if (system == "E") + { + gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + gal_channel = 1; + } + } + } + } + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + d_rtcm_writing_started = true; + break; + + case 13: // L5+E5a + if (rtcm_MT1045_rate_ms != 0) + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (rtcm_MSM_rate_ms != 0) + { + auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + int gal_channel = 0; + for (const auto& gnss_observables_iter : gnss_observables_map) + { + const std::string system(gnss_observables_iter.second.System, 1); + if (gal_channel == 0) + { + if (system == "E") + { + gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + gal_channel = 1; + } + } + } + } + + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend() and (rtcm_MT1097_rate_ms != 0)) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + d_rtcm_writing_started = true; + break; + case 14: // Galileo E1B + Galileo E5a + case 15: // Galileo E1B + Galileo E5b + if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (rtcm_MSM_rate_ms != 0) + { + const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + d_rtcm_writing_started = true; + break; + case 23: // GLONASS L1 C/A + case 24: // GLONASS L2 C/A + case 25: // GLONASS L1 C/A + GLONASS L2 C/A + if (rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) + { + Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); + } + } + if (rtcm_MSM_rate_ms != 0) + { + const auto glo_gnav_ephemeris_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); + if (glo_gnav_ephemeris_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, {}, glo_gnav_ephemeris_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + d_rtcm_writing_started = true; + break; + case 26: // GPS L1 C/A + GLONASS L1 C/A + if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) + { + Print_Rtcm_MT1019(gps_eph_iter.second); + } + } + if (rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) + { + Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); + } + } + if (rtcm_MSM_rate_ms != 0) + { + auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); + int gps_channel = 0; + int glo_channel = 0; + for (const auto& gnss_observables_iter : gnss_observables_map) + { + const std::string system(gnss_observables_iter.second.System, 1); + if (gps_channel == 0) + { + if (system == "G") + { + // This is a channel with valid GPS signal + gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + gps_channel = 1; + } + } + } + if (glo_channel == 0) + { + if (system == "R") + { + glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + glo_channel = 1; + } + } + } + } + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + d_rtcm_writing_started = true; + break; + case 27: // GLONASS L1 C/A + Galileo E1B + if (rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) + { + Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); + } + } + if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (rtcm_MSM_rate_ms != 0) + { + int gal_channel = 0; + int glo_channel = 0; + auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); + for (const auto& gnss_observables_iter : gnss_observables_map) + { + const std::string system(gnss_observables_iter.second.System, 1); + if (gal_channel == 0) + { + if (system == "E") + { + // This is a channel with valid GPS signal + gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + gal_channel = 1; + } + } + } + if (glo_channel == 0) + { + if (system == "R") + { + glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + glo_channel = 1; + } + } + } + } + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + d_rtcm_writing_started = true; + break; + case 29: // GPS L1 C/A + GLONASS L2 C/A + if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) + { + Print_Rtcm_MT1019(gps_eph_iter.second); + } + } + if (rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) + { + Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); + } + } + if (rtcm_MSM_rate_ms != 0) + { + auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); + int gps_channel = 0; + int glo_channel = 0; + for (const auto& gnss_observables_iter : gnss_observables_map) + { + const std::string system(gnss_observables_iter.second.System, 1); + if (gps_channel == 0) + { + if (system == "G") + { + // This is a channel with valid GPS signal + gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + gps_channel = 1; + } + } + } + if (glo_channel == 0) + { + if (system == "R") + { + glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + glo_channel = 1; + } + } + } + } + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + d_rtcm_writing_started = true; + break; + case 30: // GLONASS L2 C/A + Galileo E1B + if (rtcm_MT1020_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& glonass_gnav_eph_iter : pvt_solver->glonass_gnav_ephemeris_map) + { + Print_Rtcm_MT1020(glonass_gnav_eph_iter.second, pvt_solver->glonass_gnav_utc_model); + } + } + if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (rtcm_MSM_rate_ms != 0) + { + int gal_channel = 0; + int glo_channel = 0; + auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + auto glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); + for (const auto& gnss_observables_iter : gnss_observables_map) + { + const std::string system(gnss_observables_iter.second.System, 1); + if (gal_channel == 0) + { + if (system == "E") + { + // This is a channel with valid GPS signal + gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + gal_channel = 1; + } + } + } + if (glo_channel == 0) + { + if (system == "R") + { + glonass_gnav_eph_iter = pvt_solver->glonass_gnav_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + glo_channel = 1; + } + } + } + } + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + if (glonass_gnav_eph_iter != pvt_solver->glonass_gnav_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, {}, glonass_gnav_eph_iter->second, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + d_rtcm_writing_started = true; + break; + case 32: // L1+E1+L5+E5a + if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) + { + Print_Rtcm_MT1019(gps_eph_iter.second); + } + } + if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (rtcm_MSM_rate_ms != 0) + { + auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + int gps_channel = 0; + int gal_channel = 0; + for (const auto& gnss_observables_iter : gnss_observables_map) + { + const std::string system(gnss_observables_iter.second.System, 1); + if (gps_channel == 0) + { + if (system == "G") + { + // This is a channel with valid GPS signal + gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + gps_channel = 1; + } + } + } + if (gal_channel == 0) + { + if (system == "E") + { + gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + gal_channel = 1; + } + } + } + } + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + d_rtcm_writing_started = true; + break; + case 101: // Galileo E1B + Galileo E6B + case 102: // Galileo E5a + Galileo E6B + case 103: // Galileo E5b + Galileo E6B + if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (rtcm_MSM_rate_ms != 0) + { + const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + d_rtcm_writing_started = true; + break; + case 104: // Galileo E1B + Galileo E5a + Galileo E6B + case 105: // Galileo E1B + Galileo E5b + Galileo E6B + if (rtcm_MT1045_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (rtcm_MSM_rate_ms != 0) + { + const auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + d_rtcm_writing_started = true; + break; + case 106: // GPS L1 C/A + Galileo E1B + Galileo E6B + if (rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 + { + for (const auto& gps_eph_iter : pvt_solver->gps_ephemeris_map) + { + Print_Rtcm_MT1019(gps_eph_iter.second); + } + } + if (rtcm_MT1045_rate_ms != 0) + { + for (const auto& gal_eph_iter : pvt_solver->galileo_ephemeris_map) + { + Print_Rtcm_MT1045(gal_eph_iter.second); + } + } + if (rtcm_MSM_rate_ms != 0) + { + auto gal_eph_iter = pvt_solver->galileo_ephemeris_map.cbegin(); + auto gps_eph_iter = pvt_solver->gps_ephemeris_map.cbegin(); + int gps_channel = 0; + int gal_channel = 0; + for (const auto& gnss_observables_iter : gnss_observables_map) + { + const std::string system(gnss_observables_iter.second.System, 1); + if (gps_channel == 0) + { + if (system == "G") + { + // This is a channel with valid GPS signal + gps_eph_iter = pvt_solver->gps_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + gps_channel = 1; + } + } + } + if (gal_channel == 0) + { + if (system == "E") + { + gal_eph_iter = pvt_solver->galileo_ephemeris_map.find(gnss_observables_iter.second.PRN); + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + gal_channel = 1; + } + } + } + } + if (gps_eph_iter != pvt_solver->gps_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, gps_eph_iter->second, {}, {}, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + if (gal_eph_iter != pvt_solver->galileo_ephemeris_map.cend()) + { + Print_Rtcm_MSM(7, {}, {}, gal_eph_iter->second, {}, rx_time, gnss_observables_map, enable_rx_clock_correction, 0, 0, false, false); + } + } + d_rtcm_writing_started = true; + break; + default: + break; + } + } + } + catch (const boost::exception& ex) + { + std::cout << "RTCM boost exception: " << boost::diagnostic_information(ex) << '\n'; + LOG(ERROR) << "RTCM boost exception: " << boost::diagnostic_information(ex); + } + catch (const std::exception& ex) + { + std::cout << "RTCM std exception: " << ex.what() << '\n'; + LOG(ERROR) << "RTCM std exception: " << ex.what(); + } +} + + bool Rtcm_Printer::Print_Rtcm_MT1001(const Gps_Ephemeris& gps_eph, double obs_time, const std::map& observables) { const std::string m1001 = rtcm->print_MT1001(gps_eph, obs_time, observables, station_id); diff --git a/src/algorithms/PVT/libs/rtcm_printer.h b/src/algorithms/PVT/libs/rtcm_printer.h index badf23263..5a149615f 100644 --- a/src/algorithms/PVT/libs/rtcm_printer.h +++ b/src/algorithms/PVT/libs/rtcm_printer.h @@ -42,6 +42,7 @@ class Gnss_Synchro; class Gps_CNAV_Ephemeris; class Gps_Ephemeris; class Rtcm; +class Rtklib_Solver; /*! * \brief This class provides a implementation of a subset of the RTCM Standard 10403.2 messages @@ -52,19 +53,63 @@ public: /*! * \brief Default constructor. */ - Rtcm_Printer(const std::string& filename, bool flag_rtcm_file_dump, bool flag_rtcm_server, bool flag_rtcm_tty_port, uint16_t rtcm_tcp_port, uint16_t rtcm_station_id, const std::string& rtcm_dump_devname, bool time_tag_name = true, const std::string& base_path = "."); + Rtcm_Printer(const std::string& filename, + bool flag_rtcm_file_dump, + bool flag_rtcm_server, + bool flag_rtcm_tty_port, + uint16_t rtcm_tcp_port, + uint16_t rtcm_station_id, + const std::string& rtcm_dump_devname, + bool time_tag_name = true, + const std::string& base_path = "."); /*! * \brief Default destructor. */ ~Rtcm_Printer(); + /*! + * \brief Print RTCM messages. + */ + void Print_Rtcm_Messages(const Rtklib_Solver* pvt_solver, + const std::map& gnss_observables_map, + double rx_time, + int32_t type_of_rx, + int32_t rtcm_MSM_rate_ms, + int32_t rtcm_MT1019_rate_ms, + int32_t rtcm_MT1020_rate_ms, + int32_t rtcm_MT1045_rate_ms, + int32_t rtcm_MT1077_rate_ms, + int32_t rtcm_MT1097_rate_ms, + bool flag_write_RTCM_MSM_output, + bool flag_write_RTCM_1019_output, + bool flag_write_RTCM_1020_output, + bool flag_write_RTCM_1045_output, + bool enable_rx_clock_correction); + + uint32_t lock_time(const Gps_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro); + uint32_t lock_time(const Gps_CNAV_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro); + uint32_t lock_time(const Galileo_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro); + + /*! + * \brief Locks time for logging given GLONASS GNAV Broadcast Ephemeris + * \note Code added as part of GSoC 2017 program + * \params glonass_gnav_eph GLONASS GNAV Broadcast Ephemeris + * \params obs_time Time of observation at the moment of printing + * \params observables Set of observables as defined by the platform + * \return locked time during logging process + */ + uint32_t lock_time(const Glonass_Gnav_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro); + + std::string print_MT1005_test(); //!< For testing purposes + +private: bool Print_Rtcm_MT1001(const Gps_Ephemeris& gps_eph, double obs_time, const std::map& observables); bool Print_Rtcm_MT1002(const Gps_Ephemeris& gps_eph, double obs_time, const std::map& observables); bool Print_Rtcm_MT1003(const Gps_Ephemeris& gps_eph, const Gps_CNAV_Ephemeris& cnav_eph, double obs_time, const std::map& observables); bool Print_Rtcm_MT1004(const Gps_Ephemeris& gps_eph, const Gps_CNAV_Ephemeris& cnav_eph, double obs_time, const std::map& observables); - /*! + /* * \brief Prints L1-Only GLONASS RTK Observables * \details This GLONASS message type is not generally used or supported; type 1012 is to be preferred. * \note Code added as part of GSoC 2017 program @@ -75,7 +120,7 @@ public: */ bool Print_Rtcm_MT1009(const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double obs_time, const std::map& observables); - /*! + /* * \brief Prints Extended L1-Only GLONASS RTK Observables * \details This GLONASS message type is used when only L1 data is present and bandwidth is very tight, often 1012 is used in such cases. * \note Code added as part of GSoC 2017 program @@ -86,7 +131,7 @@ public: */ bool Print_Rtcm_MT1010(const Glonass_Gnav_Ephemeris& glonass_gnav_eph, double obs_time, const std::map& observables); - /*! + /* * \brief Prints L1&L2 GLONASS RTK Observables * \details This GLONASS message type is not generally used or supported; type 1012 is to be preferred * \note Code added as part of GSoC 2017 program @@ -98,7 +143,7 @@ public: */ bool Print_Rtcm_MT1011(const Glonass_Gnav_Ephemeris& glonass_gnav_ephL1, const Glonass_Gnav_Ephemeris& glonass_gnav_ephL2, double obs_time, const std::map& observables); - /*! + /* * \brief Prints Extended L1&L2 GLONASS RTK Observables * \details This GLONASS message type is the most common observational message type, with L1/L2/SNR content. This is one of the most common messages found. * \note Code added as part of GSoC 2017 program @@ -110,10 +155,10 @@ public: */ bool Print_Rtcm_MT1012(const Glonass_Gnav_Ephemeris& glonass_gnav_ephL1, const Glonass_Gnav_Ephemeris& glonass_gnav_ephL2, double obs_time, const std::map& observables); - bool Print_Rtcm_MT1019(const Gps_Ephemeris& gps_eph); //!< GPS Ephemeris, should be broadcast in the event that the IODC does not match the IODE, and every 2 minutes. - bool Print_Rtcm_MT1045(const Galileo_Ephemeris& gal_eph); //!< Galileo Ephemeris, should be broadcast every 2 minutes + bool Print_Rtcm_MT1019(const Gps_Ephemeris& gps_eph); // GPS Ephemeris, should be broadcast in the event that the IODC does not match the IODE, and every 2 minutes. + bool Print_Rtcm_MT1045(const Galileo_Ephemeris& gal_eph); // Galileo Ephemeris, should be broadcast every 2 minutes - /*! + /* * \brief Prints GLONASS GNAV Ephemeris * \details This GLONASS message should be broadcast every 2 minutes * \note Code added as part of GSoC 2017 program @@ -136,22 +181,6 @@ public: bool divergence_free, bool more_messages); - std::string print_MT1005_test(); //!< For testing purposes - uint32_t lock_time(const Gps_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro); - uint32_t lock_time(const Gps_CNAV_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro); - uint32_t lock_time(const Galileo_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro); - - /*! - * \brief Locks time for logging given GLONASS GNAV Broadcast Ephemeris - * \note Code added as part of GSoC 2017 program - * \params glonass_gnav_eph GLONASS GNAV Broadcast Ephemeris - * \params obs_time Time of observation at the moment of printing - * \params observables Set of observables as defined by the platform - * \return locked time during logging process - */ - uint32_t lock_time(const Glonass_Gnav_Ephemeris& eph, double obs_time, const Gnss_Synchro& gnss_synchro); - -private: int32_t init_serial(const std::string& serial_device); // serial port control void close_serial(); bool Print_Message(const std::string& message); @@ -164,6 +193,7 @@ private: int32_t rtcm_dev_descriptor; // RTCM serial device descriptor (i.e. COM port) uint16_t port; uint16_t station_id; + bool d_rtcm_writing_started; bool d_rtcm_file_dump; };