From dfe1c91bfc824228326f5a39f0475e08396f2461 Mon Sep 17 00:00:00 2001 From: Alexander Lerach Date: Fri, 20 Jun 2025 13:30:18 +0200 Subject: [PATCH] septentrio: implement jamming/spoofing state --- src/drivers/gnss/septentrio/sbf/decoder.cpp | 2 +- src/drivers/gnss/septentrio/septentrio.cpp | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/drivers/gnss/septentrio/sbf/decoder.cpp b/src/drivers/gnss/septentrio/sbf/decoder.cpp index 3e742bcd3cb4..9c359aa145a5 100644 --- a/src/drivers/gnss/septentrio/sbf/decoder.cpp +++ b/src/drivers/gnss/septentrio/sbf/decoder.cpp @@ -163,7 +163,7 @@ int Decoder::parse(QualityInd *message) const int Decoder::parse(RFStatus *message) const { - if (can_parse() && id() == BlockID::PVTGeodetic) { + if (can_parse() && id() == BlockID::RFStatus) { static_assert(sizeof(*message) <= sizeof(_message.payload), "Buffer too small"); memcpy(message, _message.payload, sizeof(RFStatus) - sizeof(RFStatus::rf_band)); diff --git a/src/drivers/gnss/septentrio/septentrio.cpp b/src/drivers/gnss/septentrio/septentrio.cpp index 9bd5a8bb0557..114c97c184fa 100644 --- a/src/drivers/gnss/septentrio/septentrio.cpp +++ b/src/drivers/gnss/septentrio/septentrio.cpp @@ -112,7 +112,7 @@ constexpr const char *k_command_reset_hot = "erst,soft,none\n"; constexpr const char *k_command_reset_warm = "erst,soft,PVTData\n"; constexpr const char *k_command_reset_cold = "erst,hard,SatData\n"; constexpr const char *k_command_sbf_output_pvt = - "sso,Stream%lu,%s,PVTGeodetic+VelCovGeodetic+DOP+AttEuler+AttCovEuler+EndOfPVT+ReceiverStatus,%s\n"; + "sso,Stream%lu,%s,PVTGeodetic+VelCovGeodetic+DOP+AttEuler+AttCovEuler+EndOfPVT+ReceiverStatus+RFStatus,%s\n"; constexpr const char *k_command_set_sbf_output = "sso,Stream%lu,%s,%s%s,%s\n"; constexpr const char *k_command_clear_sbf = "sso,Stream%lu,%s,none,off\n"; @@ -1212,6 +1212,16 @@ int SeptentrioDriver::process_message() } case BlockID::RFStatus: { SEP_TRACE_PARSING("Processing RFStatus SBF message"); + + RFStatus rf_status; + + if (_sbf_decoder.parse(&rf_status) == PX4_OK) { + // The signal may be jammed or spoofed. No clear indication, so report as a jamming warning. + _message_gps_state.jamming_state = rf_status.flags_inauthentic_gnss_signals ? sensor_gps_s::JAMMING_STATE_WARNING : sensor_gps_s::JAMMING_STATE_OK; + // The message authentication failed, good spoofing indicator. + _message_gps_state.spoofing_state = rf_status.flags_inauthentic_navigation_message ? sensor_gps_s::SPOOFING_STATE_INDICATED : sensor_gps_s::SPOOFING_STATE_NONE; + } + break; } case BlockID::GALAuthStatus: {