diff --git a/README.md b/README.md index b804dc215..13904c1d8 100644 --- a/README.md +++ b/README.md @@ -36,8 +36,9 @@ In the L2 band: In the L5 band: -- 🛰 GPS L5 (centered at 1176.45 MHz) :white_check_mark: -- 🛰 Galileo E5a (centered at 1176.45 MHz) :white_check_mark: +- 🛰 Galileo E5b (centered at 1207.140 MHz) :white_check_mark: +- 🛰 Galileo E5a (centered at 1176.450 MHz) :white_check_mark: +- 🛰 GPS L5 (centered at 1176.450 MHz) :white_check_mark: GNSS-SDR provides interfaces for a wide range of radio frequency front-ends and raw sample file formats, generates processing outputs in standard formats, @@ -1662,6 +1663,7 @@ identifiers: | Glonass L2 C/A | 2G | | GPS L5 | L5 | | Galileo E5a | 5X | +| Galileo E5b | 7X | Example: Eight GPS L1 C/A channels. diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 2a25cd444..f284f6248 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -16,6 +16,8 @@ All notable changes to GNSS-SDR will be documented in this file. ### Improvements in Availability: +- Added the Galileo E5b receiving chain. The software is now able to compute PVT + solutions as a standalone Galileo E5b receiver. - Improved Time-To-First-Fix when using GPS L1 C/A signals, fixing a bug that was making the receiver to drop the satellite if the PLL got locked at 180 degrees, and making some optimizations on bit transition detection. diff --git a/src/algorithms/PVT/libs/rtklib_solver.cc b/src/algorithms/PVT/libs/rtklib_solver.cc index e239c2686..bfa3bd52b 100644 --- a/src/algorithms/PVT/libs/rtklib_solver.cc +++ b/src/algorithms/PVT/libs/rtklib_solver.cc @@ -406,6 +406,7 @@ bool Rtklib_Solver::get_PVT(const std::map &gnss_observables_ bool gps_dual_band = false; bool band1 = false; bool band2 = false; + bool gal_e5_is_e5b = false; for (gnss_observables_iter = gnss_observables_map.cbegin(); gnss_observables_iter != gnss_observables_map.cend(); ++gnss_observables_iter) @@ -468,7 +469,7 @@ bool Rtklib_Solver::get_PVT(const std::map &gnss_observables_ } // Galileo E5 - if (sig_ == "5X") + if ((sig_ == "5X") || (sig_ == "7X")) { // 1 Gal - find the ephemeris for the current GALILEO SV observation. The SV PRN ID is the map key galileo_ephemeris_iter = galileo_ephemeris_map.find(gnss_observables_iter->second.PRN); @@ -508,6 +509,10 @@ bool Rtklib_Solver::get_PVT(const std::map &gnss_observables_ { DLOG(INFO) << "No ephemeris data for SV " << gnss_observables_iter->second.PRN; } + if (sig_ == "7X") + { + gal_e5_is_e5b = true; + } } break; } @@ -874,7 +879,15 @@ bool Rtklib_Solver::get_PVT(const std::map &gnss_observables_ { for (int j = 0; j < NFREQ; j++) { - nav_data.lam[i][j] = satwavelen(i + 1, j, &nav_data); + if (j == 2 && gal_e5_is_e5b) + { + // frq = 4 corresponds to E5B in that function + nav_data.lam[i][j] = satwavelen(i + 1, 4, &nav_data); + } + else + { + nav_data.lam[i][j] = satwavelen(i + 1, j, &nav_data); + } } } diff --git a/src/algorithms/libs/rtklib/rtklib_conversions.cc b/src/algorithms/libs/rtklib/rtklib_conversions.cc index e7a088941..45eacabcb 100644 --- a/src/algorithms/libs/rtklib/rtklib_conversions.cc +++ b/src/algorithms/libs/rtklib/rtklib_conversions.cc @@ -71,6 +71,10 @@ obsd_t insert_obs_to_rtklib(obsd_t& rtklib_obs, const Gnss_Synchro& gnss_synchro break; case 'E': rtklib_obs.sat = gnss_synchro.PRN + NSATGPS + NSATGLO; + if (sig_ == "7X") + { + rtklib_obs.code[band] = static_cast(CODE_L7X); + } break; case 'R': rtklib_obs.sat = gnss_synchro.PRN + NSATGPS;