Add GnssStatusTel telemetry for the Blueye GNSS receiver - #292
Conversation
Adds a GnssStatus message carrying fix quality, satellite counts, HDOP, per-axis standard deviations, COG/SOG, per-satellite SNR, and driver health (connection state, baud rate, reconnect and error counters) so GNSS behaviour can be diagnosed from dive logs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Add the fields the driver already knows but the message dropped: - GnssSatellite gains elevation and azimuth, so a client can plot the sky the receiver sees rather than a bare list of signal strengths. Both use -1 for "not reported", which is unambiguous because neither value is ever negative. - satellites_in_view now carries the receiver's own in-view count. Field 5 kept its number but is renamed satellites_tracked, which is what it actually holds: the length of the satellites list, pruned to those that reported a signal within the last 30 s. - is_accuracy_valid distinguishes "no GST sentence yet" from a real zero-metre deviation, which the two stddev fields cannot express on their own. - is_course_valid mirrors the bit the driver derives but the status message dropped: NMEA RMC leaves the course empty when the receiver is stationary, so course_over_ground goes stale without it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SVWisosuY9Cep5iN5huuTc
|
First pass, superseded by the comment below once the scope widened to the whole GSA/geometry set. Kept for the reasoning that has not changed:
🤖 Generated with Claude Code |
Everything here is parsed by the driver and was being discarded before the wire, and all of it is what support needs to read a bad fix out of a dive log rather than reproducing it on a bench. - GnssSatellite.used_in_fix, gated by is_used_in_fix_valid. This is the distinction between a satellite the receiver is tracking and one actually contributing, which is what a sky plot draws as filled against hollow. The gate is needed because a GSA sentence without a system id cannot be attributed to a constellation, and a client must not read that as "nothing is in the fix". - fix_mode, pdop and vdop, from the same GSA sentence. HDOP alone says nothing about vertical geometry, and 2D against 3D explains an altitude that looks wrong. - The horizontal error ellipse (stddev_semi_major, stddev_semi_minor, error_ellipse_orientation), stddev_altitude and range_rms. Two axis-aligned deviations cannot describe a tilted uncertainty, which is the normal shape when half the sky is behind a quay wall. - altitude, which is the cheapest sanity check on a surface receiver: a multipath fix often keeps a respectable HDOP but puts the antenna hundreds of metres off vertically. - differential_age and differential_station, without which a fix quality of 2, 4 or 5 cannot be verified after the fact. Both use -1 for absent, which is unambiguous as neither is ever negative. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SVWisosuY9Cep5iN5huuTc
|
Reviewed against what the driver actually produces and extended in Satellite geometry. Four validity bits, each load-bearing. These exist because the alternative is a UI that lies:
Also added, all previously parsed and dropped: Skipped: GGA
🤖 Generated with Claude Code |
Summary
Adds a
GnssStatusTeltelemetry message backed by newGnssStatus,GnssSatellite, andGnssConstellationtypes so GNSS behaviour can be diagnosed from dive logs for the first time:Merge order
Part of the GNSS driver rework. This PR goes first; the p2_msgs, libguestport, and p2_drone PRs build on it.
🤖 Generated with Claude Code