From 8721269c783f172efb1f8aee65d4416a74e512d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beat=20K=C3=BCng?= Date: Thu, 19 Jun 2025 13:23:25 +0200 Subject: [PATCH] septentrio: avoid compilation error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Even though all enum values fit into 13 bits, there's an error: ../../src/drivers/gnss/septentrio/sbf/messages.h:101:21: error: ‘septentrio::sbf::Header::id_number’ is too small to hold all values of ‘enum class septentrio::sbf::BlockID’ [-Werror] This is with GCC 13.3.0 under Ubuntu 24.04 --- src/drivers/gnss/septentrio/sbf/decoder.cpp | 2 +- src/drivers/gnss/septentrio/sbf/messages.h | 12 ++++++------ src/drivers/gnss/septentrio/septentrio.cpp | 10 +++++----- .../gnss/septentrio/septentrio_fuzz_tests.cpp | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/drivers/gnss/septentrio/sbf/decoder.cpp b/src/drivers/gnss/septentrio/sbf/decoder.cpp index 7f9720bd82..308d26ef9b 100644 --- a/src/drivers/gnss/septentrio/sbf/decoder.cpp +++ b/src/drivers/gnss/septentrio/sbf/decoder.cpp @@ -102,7 +102,7 @@ Decoder::State Decoder::add_byte(uint8_t byte) BlockID Decoder::id() const { - return _state == State::Done ? _message.header.id_number : BlockID::Invalid; + return _state == State::Done ? static_cast(_message.header.id_number) : BlockID::Invalid; } int Decoder::parse(Header *header) const diff --git a/src/drivers/gnss/septentrio/sbf/messages.h b/src/drivers/gnss/septentrio/sbf/messages.h index 487a40054c..8b7ca0c95e 100644 --- a/src/drivers/gnss/septentrio/sbf/messages.h +++ b/src/drivers/gnss/septentrio/sbf/messages.h @@ -98,7 +98,7 @@ struct Header { uint8_t sync1; uint8_t sync2; uint16_t crc; - BlockID id_number: 13; + uint16_t id_number: 13; uint16_t id_revision: 3; uint16_t length; uint32_t tow; @@ -143,7 +143,7 @@ struct PVTGeodetic { MissingBaseStationCoordinates = 9, MissingRequiredRTKFixedPosition = 10, }; - ModeType mode_type: 4; + uint8_t mode_type: 4; uint8_t mode_reserved: 2; uint8_t mode_base_fixed: 1; uint8_t mode_2d: 1; @@ -314,8 +314,8 @@ struct AttEuler { InsufficientMeasurements = 1, }; uint8_t nr_sv; - Error error_aux1: 2; - Error error_aux2: 2; + uint8_t error_aux1: 2; + uint8_t error_aux2: 2; uint8_t error_reserved: 3; uint8_t error_not_requested: 1; uint16_t mode; @@ -334,8 +334,8 @@ struct AttCovEuler { InsufficientMeasurements = 1, }; uint8_t reserved; - Error error_aux1: 2; - Error error_aux2: 2; + uint8_t error_aux1: 2; + uint8_t error_aux2: 2; uint8_t error_reserved: 3; uint8_t error_not_requested: 1; float cov_headhead; diff --git a/src/drivers/gnss/septentrio/septentrio.cpp b/src/drivers/gnss/septentrio/septentrio.cpp index 5fca971fb5..a5ca8a95d1 100644 --- a/src/drivers/gnss/septentrio/septentrio.cpp +++ b/src/drivers/gnss/septentrio/septentrio.cpp @@ -1075,7 +1075,7 @@ int SeptentrioDriver::process_message() PVTGeodetic pvt_geodetic; if (_sbf_decoder.parse(&header) == PX4_OK && _sbf_decoder.parse(&pvt_geodetic) == PX4_OK) { - switch (pvt_geodetic.mode_type) { + switch (static_cast(pvt_geodetic.mode_type)) { case ModeType::NoPVT: _message_gps_state.fix_type = sensor_gps_s::FIX_TYPE_NONE; break; @@ -1242,8 +1242,8 @@ int SeptentrioDriver::process_message() if (_sbf_decoder.parse(&att_euler) == PX4_OK && !att_euler.error_not_requested && - att_euler.error_aux1 == Error::None && - att_euler.error_aux2 == Error::None && + static_cast(att_euler.error_aux1) == Error::None && + static_cast(att_euler.error_aux2) == Error::None && att_euler.heading > k_dnu_f4_value) { float heading = att_euler.heading * M_PI_F / 180.0f; // Range of degrees to range of radians in [0, 2PI]. @@ -1267,8 +1267,8 @@ int SeptentrioDriver::process_message() if (_sbf_decoder.parse(&att_cov_euler) == PX4_OK && !att_cov_euler.error_not_requested && - att_cov_euler.error_aux1 == Error::None && - att_cov_euler.error_aux2 == Error::None && + static_cast(att_cov_euler.error_aux1) == Error::None && + static_cast(att_cov_euler.error_aux2) == Error::None && att_cov_euler.cov_headhead > k_dnu_f4_value) { _message_gps_state.heading_accuracy = att_cov_euler.cov_headhead * M_PI_F / 180.0f; // Convert range of degrees to range of radians in [0, 2PI] } diff --git a/src/drivers/gnss/septentrio/septentrio_fuzz_tests.cpp b/src/drivers/gnss/septentrio/septentrio_fuzz_tests.cpp index 94f3c6b592..a28e618ee9 100644 --- a/src/drivers/gnss/septentrio/septentrio_fuzz_tests.cpp +++ b/src/drivers/gnss/septentrio/septentrio_fuzz_tests.cpp @@ -45,7 +45,7 @@ TEST(SeptentrioTestDecoding, decodeMessage) septentrio::sbf::message_t m{}; m.header.sync1 = '$'; m.header.sync2 = '@'; - m.header.id_number = septentrio::sbf::BlockID::PVTGeodetic; + m.header.id_number = static_cast(septentrio::sbf::BlockID::PVTGeodetic); m.header.length = sizeof(m.header) + sizeof(septentrio::sbf::PVTGeodetic); septentrio::sbf::PVTGeodetic pvt{}; pvt.latitude = 123;