feat: Enhanced NTRIP positioning with Skyplot and GNSS Status views#7054
Draft
pobsteta wants to merge 42 commits intoopengisch:masterfrom
Draft
feat: Enhanced NTRIP positioning with Skyplot and GNSS Status views#7054pobsteta wants to merge 42 commits intoopengisch:masterfrom
pobsteta wants to merge 42 commits intoopengisch:masterfrom
Conversation
Resolved conflicts: - Updated mReceiver to use std::unique_ptr (from upstream) - Preserved NTRIP client functionality (from ntrip-client branch) - Added onDeviceSocketStateChanged connection for NTRIP support
… request size estimation
…rror messages if need
…ion state and last error
…er to use a virtual mountpoint
… the French file.
- Refactor RTCM forwarding via virtual writeRawData() on AbstractGnssReceiver, replacing dynamic_cast<BluetoothReceiver*> with a generic interface supporting Bluetooth, TCP, UDP, and serial port receivers - Extend NtripState enum to 5 states (Disconnected/Connecting/Connected/ Reconnecting/Error) with exponential backoff reconnection (1s-60s) - Add SatelliteModel (QAbstractListModel) exposing per-satellite data with constellation detection via Qgis::SatelliteSystem + PRN range fallback - Add fix type color tokens in Theme and colored badge on GNSS button showing RTK Fixed/Float/DGPS quality indicator - Fix ntripStatusChanged signal mismatch between Positioning and PositioningSource QRemoteObjects mirror Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
QgsSatelliteInfo::satType is a QChar containing the NMEA $GxGSV talker ID (P=GPS, L=GLONASS, A=Galileo, B=BeiDou, S=SBAS, Q=QZSS), not an integer enum. This caused a compilation error with static_cast<int>. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Collaborator
📱 Android buildsDownload an Android arm64 build of this PR for testing. Other Android architectures🍎 MacOS DMG universal buildsDownload a MacOS DMG universal build of this PR for testing. 🪟 Windows buildsDownload a Windows build of this PR for testing. |
Classify HTTP errors from NTRIP casters as permanent (4xx, SOURCETABLE) or transient (5xx, network). Permanent errors go directly to Error state without scheduling reconnect attempts. Reduce max reconnect backoff from 60s to 30s. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Author
Added: Permanent error handling + backoff 30sLatest commit ( Changes:
|
Add sourcetable parser and mountpoint browser so users can fetch and select the correct NTRIP mountpoint from a list instead of typing it manually. The MountpointModel handles its own TCP fetch and exposes the parsed STR records as a QAbstractListModel for QML consumption. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add Haversine distance calculation to MountpointModel, sort mountpoints by proximity, highlight nearest entry with bold text, and display distance in km. Mountpoints with missing coordinates (0,0) are skipped and sorted to the end. Without a valid GPS position, no sorting or distance is shown. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add NTRIP v2 (HTTP/1.1 + Ntrip-Version: Ntrip/2.0) alongside existing v1. NtripSocketClient handles chunked Transfer-Encoding via a state machine parser. Version preference is propagated through PositioningSource, Positioning, and QML settings. V1 remains the default. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add RTCM binary logging to NtripClient, triggered by the same logging toggle as NMEA. Writes [timestamp_ms][data_length][raw_rtcm_bytes] per block with periodic flush. Integrated into PositioningSource lifecycle (setLogging, setLoggingPath, start/stop/reconnect). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a QfToolButtonDrawer in the top-left mainToolbar for accessing GNSS diagnostic views when an external GNSS receiver is active. The drawer contains two sub-buttons opening full-screen stub pages (SkyplotView and GnssStatusView) to be completed in Stories 4.3 and 5.1. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…g info Replace the SkyplotView stub with a full-screen diagnostic page featuring: - Polar grid with concentric elevation circles (0/30/60 deg) and N/S/E/W axes - Real-time satellite positioning by azimuth/elevation from SatelliteModel - Shape distinction: filled circles for in-use, triangles for tracked-only - Constellation color-coding (GPS green, GLONASS red-orange, Galileo gold, BeiDou blue) - SNR bar chart with dBHz values and constellation-prefixed satellite IDs - Info block with UTC time, lat/lon, translated fix type, HDOP, satellite count - Constellation legend with color and shape distinction - Empty state handling when no satellites available Adds constellation color tokens and constellationColor() helper to Theme.qml. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the stub with a full-screen GNSS Status page showing 7 data sections (Source/Time, Position, Altitude, Fix, Speed, DOP, Satellites) using inline QML components for consistent label:value layout. Fix type is color-coded via qualityDescription. Stale data (>30s) shows em-dash placeholders. Move fixTypeColor() to Theme.qml as shared utility. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…StatusView Add Precision section with color-coded H/V accuracy (mm), plus placeholder sections for Differential, Baseline, and Battery for future data sources. Theme.accuracyColor() shared function for accuracy threshold coloring. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Simplify fix type QfBadge to use shared Theme.fixTypeColor() and display for all quality values (0-6), making No Fix and Autonomous states visible. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add visual NTRIP feedback: a color-coded badge (TopLeft) on the GNSS button showing connection state at a glance, and a detailed NTRIP section in GnssStatusView with state, details, and data transfer stats. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Change NTRIP default credentials to "centipede" (matching the French Centipede network) to fix connection errors on crtk.net. Replace generic location/compass icons with dedicated satellite and antenna SVG icons for the GNSS drawer and skyplot buttons. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The NTRIP caster normally closes the connection after sending the sourcetable, which triggered a RemoteHostClosedError before the disconnected signal. This caused the fetch to fail instead of parsing the received data. Now ignore this expected error and let onSocketDisconnected() handle the response. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add missing `import org.qfield` to SkyplotView and GnssStatusView so QML can resolve Q_GADGET sub-properties of GnssPositionInformation. Add explicit Q_PROPERTY(count) to SatelliteModel since QAbstractListModel does not expose it in Qt 6 QML. Swap drawer/skyplot icons and display accuracy in cm. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a Connections listener on positionSource so that updatePosition() is called when GPS fix becomes available after the sourcetable has already been fetched, ensuring nearest stations are shown on first use. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR adds comprehensive NTRIP RTK correction support and GNSS diagnostic views to QField, enabling centimeter-level positioning with external GNSS receivers.
NTRIP Client
Mountpoint Browser
Skyplot Page
GNSS Status Page
UI Enhancements
Defaults
New Files
src/core/positioning/ntripclient.{h,cpp}src/core/positioning/ntripsocketclient.{h,cpp}src/core/positioning/mountpointmodel.{h,cpp}src/core/positioning/sourcetableparser.{h,cpp}src/core/positioning/satellitemodel.{h,cpp}src/qml/SkyplotView.qmlsrc/qml/GnssStatusView.qmlimages/.../ic_gnss_satellite_white_24dp.svgimages/.../ic_gnss_antenna_white_24dp.svgTest Plan
🤖 Generated with Claude Code