10942 Commits
Author SHA1 Message Date
Carles Fernandez 8c116a7d1e Make RinexPrinterTest more robust in CI environments 2026-09-03 21:45:37 +02:00
Carles Fernandez 89a2004d26 Fix E6 TOW anchoring for pseudorange and PVT computation 2026-09-01 22:04:52 +02:00
Carles Fernandez 6d32699ea6 Update local version of Protocol Buffers to v36.1 2026-09-01 12:11:10 +02:00
Carles Fernandez cae59e5b1b Merge branch 'joebre-feat/assisted-acq-doppler-narrowing' into next 2026-09-01 12:10:14 +02:00
Carles Fernandez 1f8f688ed1 Fix test building in some environments 2026-09-01 10:09:41 +02:00
Carles Fernandez bd66dd2c25 Improve dual-band acquisition assistance Doppler projection 2026-09-01 09:25:49 +02:00
Carles Fernandez 0af508713a Fix Acquisition dump readers
Update changelog
Add Joel to the CITATION.cff file
2026-09-01 09:22:38 +02:00
Carles Fernandez b980b55ed2 Fix one-bin assisted acquisition narrowing 2026-08-31 15:19:58 +02:00
Carles Fernandez df2300d89f Merge branch 'feat/assisted-acq-doppler-narrowing' of https://github.com/joebre/gnss-sdr into joebre-feat/assisted-acq-doppler-narrowing 2026-08-31 14:44:16 +02:00
Carles Fernandez f0482a9b00 CI: update android job 2026-08-31 10:26:48 +02:00
joebre 8f67752b9e Address review: memory safety, candidate selection, PFA, dump, naming
- Rename doppler_uncertanty -> doppler_uncertainty throughout (interface,
  adapter, block, comments, log message).

- Fix the out-of-bounds write and mis-detection in narrowed-mode
  activation: track it with an explicit d_doppler_search_narrowed flag,
  set directly in set_doppler_uncertainty() and guarded on
  d_num_doppler_bins > 1, instead of inferring it from
  "d_num_doppler_bins_active < d_num_doppler_bins". That inferred check
  broke two ways: for a 1-bin full grid (a valid, already-accepted
  config), it still forced 2 active bins, writing past the grid/wipeoff
  allocations sized to d_num_doppler_bins; for a 2-bin full grid, an
  actually-narrowed request computes the same active count as the full
  grid (2 < 2 is false), so it silently searched the full grid's own
  bin layout instead of the assisted {center, center + doppler_max}
  pair. Reproduced the out-of-bounds write directly (temporarily
  reverting to the inferred check crashes with "corrupted double-linked
  list" under the new NarrowingEnabledOneBinGrid test) and the
  mis-detection (NarrowingEnabledTwoBinGrid).

- Keep the noise-reference bin out of candidate selection: both
  max_to_input_power_statistic() and first_vs_second_peak_statistic()
  now take a separate candidate_count, used only for the peak-search
  loop bound; the CFAR path's own num_doppler_bins (used for the
  "opposite bin" reference lookup) is unchanged. In narrowed mode,
  candidate_count is 1 -- the noise-reference bin can no longer win and
  be reported as the acquisition result, regardless of its own power
  (verified against a live signal deliberately placed in the reference
  bin instead of the known/candidate bin: reverting this fix, both the
  CFAR and peak-ratio statistic mistakenly report the reference bin's
  Doppler as if it were the assisted center).

- Recalibrate the acceptance threshold for narrowed acquisition: adds
  d_threshold_narrowed, computed like d_threshold but with
  num_doppler_bins = 1 (the true candidate count in narrowed mode)
  instead of the full grid's bin count, since compute_threshold() folds
  the candidate count into the false-alarm probability and reusing the
  full-grid threshold in narrowed mode was effectively far stricter
  than the requested PFA. get_threshold() returns it whenever
  d_doppler_search_narrowed is true.

- Fix narrowed dump layout/metadata: ensure_dump_grid_allocated() now
  sizes acq_grid to d_num_doppler_bins_active (not the full grid width),
  matching what copy_magnitude_grid_to_dump_grid() actually writes each
  cycle -- this also makes narrow<->full transitions between dumps
  self-correcting. dump_results() writes accurate, mode-appropriate
  doppler_max/doppler_step (the same {0, doppler_max} encoding
  compute_statistics() uses internally when narrowed), plus new
  doppler_center and doppler_narrowed fields so offline post-processing
  can tell which encoding is in effect. Verified end to end against a
  live dump (NarrowedDumpMetadata).

- Strengthen Acq_Conf::enable_doppler_narrowing's doc comment (default,
  which implementations it applies to, its dependency on the caller
  passing doppler_uncertainty == 0) and add a commented usage example
  next to GNSS-SDR.assist_dual_frequency_acq in a dual-frequency
  Galileo E1B+E5a example config.

- Add tests/.../pcps_acquisition_doppler_narrowing_test.cc: 8 focused
  tests (narrowing enabled/disabled, 1-bin and 2-bin full-grid
  configurations, CFAR and peak-ratio statistics, a full-narrow-full
  transition, two-step acquisition with step-1 narrowing, and narrowed
  dump metadata), built on the same real-capture/known-ground-truth
  pattern as gps_l1_ca_pcps_acquisition_test.cc. Confirmed each targeted
  regression test actually fails without its corresponding fix before
  finalizing them.

Signed-off-by: joebre <joel.brenner@saphyrion.ch>
2026-08-31 09:38:13 +02:00
Carles Fernandez 443a93a63f Merge branch 'feat/assisted-acq-doppler-narrowing' of https://github.com/joebre/gnss-sdr into joebre-feat/assisted-acq-doppler-narrowing 2026-08-29 14:15:28 +02:00
Carles Fernandez cd7e2d0d58 CMake: detect libbladeRF version also without pkg-config 2026-08-29 13:39:08 +02:00
Carles Fernandez fa396da453 Merge branch 'joebre-feat/monitor-pvt-used-satellites' into next 2026-08-29 12:59:45 +02:00
Carles Fernandez a87bbdd09a Update CHANGELOG.md 2026-08-29 12:58:10 +02:00
Carles Fernandez 9f707ee89e Merge branch 'feat/monitor-pvt-used-satellites' of https://github.com/joebre/gnss-sdr into joebre-feat/monitor-pvt-used-satellites 2026-08-28 20:02:31 +02:00
joebre aba6cfaeb6 Narrow acquisition Doppler search when dual-frequency-assisted
When acquiring a secondary frequency (e.g. Galileo E5a) of a satellite
whose primary frequency (e.g. E1) is already tracked, the primary's
Doppler can be projected onto the secondary and passed in as an
already-known estimate (GNSS-SDR.assist_dual_frequency_acq). Even so,
the acquisition still searched the full configured Doppler grid around
that estimate rather than trusting it.

Adds Acquisition_<Sig>.enable_doppler_narrowing (default false): when
the projected Doppler is passed in as exact (doppler_uncertanty == 0),
collapses the search to just that bin plus one reference bin (used as
the existing noise-power estimate, at the same separation the full
grid search already uses for its own "opposite" bin), instead of
running the full multi-bin grid. Falls back to the full grid whenever
the Doppler isn't known this precisely (single-frequency acquisition,
or dual-frequency assist disabled/unavailable).

set_doppler_uncertanty() threads through
AcquisitionInterface -> PcpsAcquisitionAdapter -> pcps_acquisition,
and Channel::assist_acquisition_doppler() gains a doppler_uncertanty
parameter (default 1, i.e. "not known precisely") so existing callers
are unaffected unless they opt in.

Also fixes max_to_input_power_statistic()'s "opposite bin" index to
wrap using its own num_doppler_bins parameter instead of the
always-full-grid d_num_doppler_bins member, which was already
inconsistent with step-two's narrower bin count and would have been
wrong for the narrowed 2-bin case introduced here.

Signed-off-by: joebre <joel.brenner@saphyrion.ch>
2026-08-28 17:39:36 +02:00
Carles Fernandez b0749cb955 Merge branch 'joebre-fix/cog-ground-speed-next' into next 2026-08-28 12:21:27 +02:00
joebre 0bd64b7845 Re-trigger CI (previous run's failure was an unrelated flaky RinexPrinterTest, not this change)
Signed-off-by: joebre <joel.brenner@saphyrion.ch>
2026-08-28 11:25:38 +02:00
joebre a78865b555 Add per-satellite azimuth/elevation and used signals to MonitorPvt
An application monitoring gnss-sdr (e.g. for a sky plot or a per-satellite
status view) typically needs to know which satellites and signals actually
contributed to the current PVT solution, and their azimuth/elevation --
none of that is currently exposed on the MonitorPvt UDP interface, only the
scalar solution.

Adds a repeated UsedSatellite field to MonitorPvt (proto field 37), one
entry per satellite/signal used in the fix: PRN, constellation, signal ID,
azimuth, elevation, and whether that satellite's signals were combined
(e.g. Galileo E1+E5a iono-free). Signals are kept as separate entries
rather than merged into one per-satellite record, since a receiver may
track more than one signal of the same satellite independently and a
consumer may care which ones specifically contributed.

Populated in Rtklib_Solver::get_PVT() from RTKLIB's per-satellite azel
solution (pvt_ssat[]) intersected with the observables actually used in
that epoch.

Signed-off-by: joebre <joel.brenner@saphyrion.ch>
2026-08-28 11:03:35 +02:00
joebre f372d13435 Fix Course Over Ground never being estimated
ground_speed_ms was declared and left at its 0.0 initializer instead
of being assigned the computed ENU ground speed, so the
"ground_speed_ms >= 1.0" gate in Rtklib_Solver::get_PVT() was always
false. As a result, Course Over Ground was permanently left at its
-9999.0 "not estimated" sentinel regardless of actual receiver speed.

Signed-off-by: joebre <joel.brenner@saphyrion.ch>
2026-08-28 10:45:49 +02:00
Carles Fernandez 4fdd65b1e6 Update XML schemas 2026-08-28 09:01:52 +02:00
Carles Fernandez 272406467a Merge branch 'MrCry0-fix/opencl-test' into next 2026-08-27 16:49:34 +02:00
Carles Fernandez fac0496787 Fix segfault when testing with -DENABLE_OPENCL=ON in some environments 2026-08-27 16:38:30 +02:00
Carles Fernandez 7169a02c60 Merge branch 'fix/opencl-test' of https://github.com/MrCry0/gnss-sdr into MrCry0-fix/opencl-test 2026-08-27 16:13:59 +02:00
Carles Fernandez 409af58c10 Merge branch 'fix/opencl-acquisition' of https://github.com/MrCry0/gnss-sdr into MrCry0-fix/opencl-acquisition 2026-08-27 16:07:45 +02:00
Carles Fernandez f8399ece0d Merge branch 'joebre-fix/tracking-dump-signal-labeling' into next 2026-08-27 16:01:31 +02:00
joebre a9c12954f3 python: fix signal-type label when overriding the plotted channel range
apply_conf_defaults() picked the plotted signal-type label as
signals[0].signal whenever --first-channel/--channels was passed
explicitly to override the conf-derived channel range. signals[0] is
just the first enabled signal in SIGNAL_ORDER for the given conf, so
it is only correct when the manually requested range happens to start
at channel 0 of that same signal; for any other range it mislabels
every plot with the wrong signal type, even though the correct .dat
files are read (since --file-prefix is typically also given
explicitly in that case).

For example, running
  --conf EVK1029_Galileo_E1_E5a.conf --file-prefix trk_GalileoE5a_ch \
  --first-channel 10 --channels 10
correctly reads the Galileo E5a tracking dumps but titled every plot
"Galileo E1B", the conf's first enabled signal.

Resolve each requested channel's signal type from the conf's own
per-signal channel ranges (SignalConfig.channels) instead, falling
back to the previous behavior only when no conf is available at all.

Signed-off-by: joebre <joel.brenner@saphyrion.ch>
2026-08-27 15:48:11 +02:00
joebre 6d3bdbc3cc python: add missing BeiDou B1C/SBAS L1 entries to plot SIGNAL_ORDER
SIGNAL_ORDER in utils/python/lib/gnss_sdr_conf.py is meant to mirror
signal_mapping in src/core/receiver/gnss_block_factory.cc, which
GetChannels() walks in a fixed order to assign absolute channel IDs
(consuming Channels_<type>.count channels per entry; the per-channel
Channel<N>.signal lines in the conf file are not used for this).

SIGNAL_ORDER was missing "1D" (BeiDou B1C) and "S1" (SBAS L1), both
present in signal_mapping. Any configuration enabling BeiDou B1C or
SBAS alongside other signal types would get every later signal's
inferred channel range shifted, mislabeling tracking dump plots for
those channels. Added both entries, in the same relative position as
signal_mapping, along with their SignalType metadata.

Signed-off-by: joebre <joel.brenner@saphyrion.ch>
2026-08-27 15:48:02 +02:00
joebre 5a7803d620 Fix I/Q swap in dll_pll_veml_tracking dump for pilot-tracked signals
log_data() read the data-arm Prompt correlator's real/imaginary parts
directly instead of going through map_correlator_to_iq(), unlike
assign_correlators_to_synchro() which already applies that mapping
correctly. For signals whose data and pilot components are true RF
quadrature (Galileo E5a/E5b, GPS L5), d_interchange_iq is true and the
actual data bits live on the imaginary axis of d_Prompt_Data, not the
real one used unconditionally by the dump.

This only affected the tracking .dat/.mat dump used by the Python/MATLAB
plotting utilities (utils/python/dll_pll_veml_plot_sample.py and
utils/matlab equivalents) for signals such as Galileo E5a: the "Prompt
I" / "Bits of the navigation message" plots showed pilot phase-noise
leakage on the wrong axis instead of the actual navigation bits, while
receiver operation itself (telemetry decoding, PVT) was unaffected
since it uses assign_correlators_to_synchro().

Signed-off-by: joebre <joel.brenner@saphyrion.ch>
2026-08-27 15:47:52 +02:00
Carles Fernandez 04484bc1e9 Merge branch 'MrCry0-feat/support-bladerf' into next 2026-08-27 11:43:47 +02:00
Carles Fernandez df001f4dc7 Add Oleksandr Suvorov to the list of contributors 2026-08-27 11:33:31 +02:00
Oleksandr Suvorov bec24f3081 conf: add 4-constellation L1 config for native bladeRF source
Add a sample configuration enabling GPS L1 C/A, Galileo E1, GLONASS
L1 C/A, and BeiDou B1I simultaneously through the new native
Bladerf_Signal_Source, following the same single-capture, multi-band
split already used by the existing USRP X300 and HackRF multichannel
templates.

One 56 Msps / 56 MHz wideband capture centered at 1584 MHz (the
maximum bandwidth supported by a bladeRF 2.0 Micro) is split via
SignalSource.RF_channels=3 into three Freq_Xlating_Fir_Filter
sub-bands tapping the same physical stream: BeiDou B1I (1561.098
MHz), GPS L1 C/A + Galileo E1 (co-located at 1575.42 MHz), and
GLONASS L1 C/A (FDMA, centered near 1602 MHz). The frequency plan and
per-system acquisition/tracking parameters are carried over from the
existing USRP X300 four-constellation template.

Verified against a physical bladeRF 2.0 Micro: the receiver
simultaneously acquired and tracked real satellites on all four
systems from a live antenna.

Signed-off-by: Oleksandr Suvorov <cryosay@gmail.com>
2026-08-27 11:06:17 +03:00
Oleksandr Suvorov a5a6b9359b signal_source: add native BladeRF support via libbladeRF
Add a Bladerf_Signal_Source that streams RX samples directly from
bladeRF front-ends (bladeRF x40, x115, and bladeRF 2.0 Micro xA4/xA9)
through libbladeRF, instead of going through the generic gr-osmosdr
wrapper. gr-osmosdr's bladerf backend does not expose usable per-stage
gain control on bladeRF2 hardware and has no support for the RX bias
tee used to power an active antenna on the 2.0 Micro.

The new gr::sync_block (bladerf_source) talks to libbladeRF's
synchronous streaming API directly; the adapter (BladerfSignalSource)
follows the existing SignalSourceBase pattern used by the other signal
sources, with valve and dump support wired the same way. Building it
is gated behind -DENABLE_BLADERF=ON, degrades gracefully when
libbladeRF is absent, and requires libbladeRF v2.6.0 or newer,
enforced at configure time.

Verified against a physical bladeRF 2.0 Micro: the receiver opens the
device, streams live samples, and acquires and tracks real GPS
satellites end to end using the new sample configuration file.

Only single-channel (SISO) reception is supported for now; the second
RX channel is not yet exposed.

Signed-off-by: Oleksandr Suvorov <cryosay@gmail.com>
2026-08-27 11:06:11 +03:00
Carles Fernandez 4e0457bdaa Report NTRIP client status on the console 2026-08-25 22:21:11 +02:00
Carles Fernandez ec14efe2c6 Fix cppcoreguidelines-special-member-functions 2026-08-25 10:44:33 +02:00
Carles Fernandez 2a636daed3 Update local matio to v1.6.0 2026-08-25 09:56:48 +02:00
Mathieu FavreauandCarles Fernandez 200a119c9e Fix threshold 2 step acquisition 2026-08-24 18:32:01 +02:00
dependabot[bot]andCarles Fernandez 76adce46e1 Bump uraimo/run-on-arch-action in the github-actions group
Bumps the github-actions group with 1 update: [uraimo/run-on-arch-action](https://github.com/uraimo/run-on-arch-action).


Updates `uraimo/run-on-arch-action` from 3.1.0 to 3.2.0
- [Release notes](https://github.com/uraimo/run-on-arch-action/releases)
- [Commits](https://github.com/uraimo/run-on-arch-action/compare/v3.1.0...v3.2.0)

---
updated-dependencies:
- dependency-name: uraimo/run-on-arch-action
  dependency-version: 3.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-24 09:50:19 +02:00
Carles Fernandez c60c1a3c53 Update local matio to v1.6.0 2026-08-24 08:59:22 +02:00
Carles Fernandez a72369f2a3 Merge branch 'add-rtk' into next 2026-08-24 08:37:34 +02:00
Carles Fernandez 1f0be04d58 Update changelog 2026-08-23 13:22:29 +02:00
Carles Fernandez 8ac0737031 Fix application of BDS B1C corrections 2026-08-23 08:08:04 +02:00
Carles Fernandez 59b52c87a9 Improve DNS threads handling in NTRIP client 2026-08-22 22:27:31 +02:00
Carles Fernandez ac3f3f8e4c Improve robustness against a corrupted reference satellite 2026-08-22 11:10:08 +02:00
Carles Fernandez cb7366d2d9 Improve robustness against code outliers 2026-08-22 10:11:55 +02:00
Carles Fernandez 2f5322c20e Fix handling of malformed HTTP chunks 2026-08-22 10:01:31 +02:00
Carles Fernandez 07a0bed246 Improve snapshot caching in NTRIP client 2026-08-22 09:40:56 +02:00
Carles Fernandez 3867acb595 Fix DNS stalls in NTRIP client 2026-08-22 09:08:30 +02:00
Carles Fernandez e66c9a9538 Fix B3I-only Single Point Positioning ionosphere scaling 2026-08-22 08:47:13 +02:00