From 12e5e97d04c90cd07067aab44b184f8f5358d591 Mon Sep 17 00:00:00 2001 From: flipflip Date: Tue, 27 Oct 2026 17:35:18 +0100 Subject: [PATCH 1/4] update gnss fix type enums --- .../include/fpsdk_common/parser/fpa.hpp | 5 ++-- fpsdk_common/src/parser/fpa.cpp | 25 +++++++++++++------ fpsdk_common/test/parser_fpa_test.cpp | 8 +++--- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/fpsdk_common/include/fpsdk_common/parser/fpa.hpp b/fpsdk_common/include/fpsdk_common/parser/fpa.hpp index 6d91b0f..9797258 100644 --- a/fpsdk_common/include/fpsdk_common/parser/fpa.hpp +++ b/fpsdk_common/include/fpsdk_common/parser/fpa.hpp @@ -315,10 +315,10 @@ enum class FpaGnssStatus : int NO_FIX = '0', //!< No fix SPP = '1', //!< Single-point positioning (SPP) RTK_MB = '2', //!< RTK moving baseline - RESERVED3 = '3', //!< Reserved + PPP_FLOAT = '3', //!< PPP float RESERVED4 = '4', //!< Reserved RTK_FLOAT = '5', //!< RTK float - RESERVED6 = '6', //!< Reserved + PPP_FIXED = '6', //!< PPP fixed RESERVED7 = '7', //!< Reserved RTK_FIXED = '8', //!< RTK fixed RESERVED9 = '9', //!< Reserved @@ -528,6 +528,7 @@ enum class FpaGnssFix : int S3D_DR = '6', //!< Single 3D fix with dead-reckoning RTK_FLOAT = '7', //!< RTK float fix RTK_FIXED = '8', //!< RTK fixed fix + PPP = 'b', //!< PPP fix (11) }; // clang-format on /** diff --git a/fpsdk_common/src/parser/fpa.cpp b/fpsdk_common/src/parser/fpa.cpp index 08177c7..a1ad631 100644 --- a/fpsdk_common/src/parser/fpa.cpp +++ b/fpsdk_common/src/parser/fpa.cpp @@ -233,10 +233,10 @@ const char* FpaGnssStatusStr(const FpaGnssStatus status) case FpaGnssStatus::NO_FIX: return "NO_FIX"; case FpaGnssStatus::SPP: return "SPP"; case FpaGnssStatus::RTK_MB: return "RTK_MB"; - case FpaGnssStatus::RESERVED3: return "RESERVED3"; + case FpaGnssStatus::PPP_FLOAT: return "PPP_FLOAT"; case FpaGnssStatus::RESERVED4: return "RESERVED4"; case FpaGnssStatus::RTK_FLOAT: return "RTK_FLOAT"; - case FpaGnssStatus::RESERVED6: return "RESERVED6"; + case FpaGnssStatus::PPP_FIXED: return "PPP_FIXED"; case FpaGnssStatus::RESERVED7: return "RESERVED7"; case FpaGnssStatus::RTK_FIXED: return "RTK_FIXED"; case FpaGnssStatus::RESERVED9: return "RESERVED9"; @@ -383,6 +383,7 @@ const char* FpaGnssFixStr(const FpaGnssFix fix) case FpaGnssFix::S3D_DR: return "S3D_DR"; case FpaGnssFix::RTK_FLOAT: return "RTK_FLOAT"; case FpaGnssFix::RTK_FIXED: return "RTK_FIXED"; + case FpaGnssFix::PPP: return "PPP"; } // clang-format on return "?"; } @@ -768,10 +769,10 @@ static bool GetGnssStatus(FpaGnssStatus& status, const std::string& field) case FpaGnssStatus::NO_FIX: status = FpaGnssStatus::NO_FIX; ok = true; break; case FpaGnssStatus::SPP: status = FpaGnssStatus::SPP; ok = true; break; case FpaGnssStatus::RTK_MB: status = FpaGnssStatus::RTK_MB; ok = true; break; - case FpaGnssStatus::RESERVED3: status = FpaGnssStatus::RESERVED3; ok = true; break; + case FpaGnssStatus::PPP_FLOAT: status = FpaGnssStatus::PPP_FLOAT; ok = true; break; case FpaGnssStatus::RESERVED4: status = FpaGnssStatus::RESERVED4; ok = true; break; case FpaGnssStatus::RTK_FLOAT: status = FpaGnssStatus::RTK_FLOAT; ok = true; break; - case FpaGnssStatus::RESERVED6: status = FpaGnssStatus::RESERVED6; ok = true; break; + case FpaGnssStatus::PPP_FIXED: status = FpaGnssStatus::PPP_FIXED; ok = true; break; case FpaGnssStatus::RESERVED7: status = FpaGnssStatus::RESERVED7; ok = true; break; case FpaGnssStatus::RTK_FIXED: status = FpaGnssStatus::RTK_FIXED; ok = true; break; case FpaGnssStatus::RESERVED9: status = FpaGnssStatus::RESERVED9; ok = true; break; @@ -952,7 +953,12 @@ static bool GetGnssFix(FpaGnssFix& fix, const std::string& field) { bool ok = false; fix = FpaGnssFix::UNSPECIFIED; - if (!field.empty()) { + // Two-digits vlues + if (field.size() == 2) { // clang-format off + if (field == "11") { fix = FpaGnssFix::PPP; ok = true; } + } // clang-format on + // Single-digit values + else if (field.size() == 1) { switch ((FpaGnssFix)field[0]) { // clang-format off case FpaGnssFix::UNKNOWN: fix = FpaGnssFix::UNKNOWN; ok = true; break; case FpaGnssFix::NOFIX: fix = FpaGnssFix::NOFIX; ok = true; break; @@ -962,9 +968,12 @@ static bool GetGnssFix(FpaGnssFix& fix, const std::string& field) case FpaGnssFix::S3D: fix = FpaGnssFix::S3D; ok = true; break; case FpaGnssFix::S3D_DR: fix = FpaGnssFix::S3D_DR; ok = true; break; case FpaGnssFix::RTK_FLOAT: fix = FpaGnssFix::RTK_FLOAT; ok = true; break; - case FpaGnssFix::RTK_FIXED: fix = FpaGnssFix::RTK_FIXED; ok = true; break; - case FpaGnssFix::UNSPECIFIED: break; - } // clang-format on + case FpaGnssFix::RTK_FIXED: fix = FpaGnssFix::RTK_FIXED; ok = true; break; // clang-format on + // Not single-digit value, handled above or invalid + case FpaGnssFix::PPP: + case FpaGnssFix::UNSPECIFIED: + break; + } } else { ok = true; } diff --git a/fpsdk_common/test/parser_fpa_test.cpp b/fpsdk_common/test/parser_fpa_test.cpp index a7106ad..4716747 100644 --- a/fpsdk_common/test/parser_fpa_test.cpp +++ b/fpsdk_common/test/parser_fpa_test.cpp @@ -312,7 +312,7 @@ TEST(ParserFpaTest, FpaGnsscorrPayload) } { FpaGnsscorrPayload payload; - const char* msg = "$FP,GNSSCORR,1,2237,250548.999744,8,25,18,8,25,18,,,,,,,,,*24\r\n"; + const char* msg = "$FP,GNSSCORR,1,2237,250548.999744,8,25,18,11,25,18,,,,,,,,,*XX\r\n"; EXPECT_TRUE(payload.SetFromMsg((const uint8_t*)msg, std::strlen(msg))); EXPECT_TRUE(payload.valid_); EXPECT_TRUE(payload.gps_time.week.valid); @@ -325,7 +325,7 @@ TEST(ParserFpaTest, FpaGnsscorrPayload) EXPECT_EQ(payload.gnss1_nsig_l1.value, 25); EXPECT_TRUE(payload.gnss1_nsig_l2.valid); EXPECT_EQ(payload.gnss1_nsig_l2.value, 18); - EXPECT_EQ(payload.gnss2_fix, FpaGnssFix::RTK_FIXED); + EXPECT_EQ(payload.gnss2_fix, FpaGnssFix::PPP); EXPECT_TRUE(payload.gnss2_nsig_l1.valid); EXPECT_EQ(payload.gnss2_nsig_l1.value, 25); EXPECT_TRUE(payload.gnss2_nsig_l2.valid); @@ -733,7 +733,7 @@ TEST(ParserFpaTest, FpaOdomstatusPayload) { FpaOdomstatusPayload payload; const char* msg = // clang-format off - "$FP,ODOMSTATUS,1,2342,321241.350000,2,2,1,1,1,1,,0,,,,,,1,1,3,8,8,3,5,5,,0,6,,,,,,,,,,,,*24\r\n"; // clang-format on + "$FP,ODOMSTATUS,1,2342,321241.350000,2,2,1,1,1,1,,0,,,,,,1,1,3,8,3,3,5,5,,0,6,,,,,,,,,,,,*24\r\n"; // clang-format on EXPECT_TRUE(payload.SetFromMsg((const uint8_t*)msg, std::strlen(msg))); EXPECT_EQ(payload.msg_type_, FpaMessageType::ODOMSTATUS); EXPECT_TRUE(payload.valid_); @@ -754,7 +754,7 @@ TEST(ParserFpaTest, FpaOdomstatusPayload) EXPECT_EQ(payload.imu_noise, FpaImuNoise::LOW_NOISE); EXPECT_EQ(payload.imu_conv, FpaImuConv::WAIT_MOTION); EXPECT_EQ(payload.gnss1_status, FpaGnssStatus::RTK_FIXED); - EXPECT_EQ(payload.gnss2_status, FpaGnssStatus::RTK_FIXED); + EXPECT_EQ(payload.gnss2_status, FpaGnssStatus::PPP_FLOAT); EXPECT_EQ(payload.baseline_status, FpaBaselineStatus::PASSING); EXPECT_EQ(payload.corr_status, FpaCorrStatus::GOOD_CORR); EXPECT_EQ(payload.cam1_status, FpaCamStatus::GOOD); From e6dc55b0176d20193e6ca5cbcc1e94bf9e284975 Mon Sep 17 00:00:00 2001 From: flipflip Date: Wed, 28 Oct 2026 11:09:05 +0100 Subject: [PATCH 2/4] more --- fpsdk_common/include/fpsdk_common/gnss.hpp | 4 ++++ .../include/fpsdk_common/parser/ubx.hpp | 21 ++++++++++++------- fpsdk_common/src/gnss.cpp | 4 ++++ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/fpsdk_common/include/fpsdk_common/gnss.hpp b/fpsdk_common/include/fpsdk_common/gnss.hpp index 79e18c3..ed0eb19 100644 --- a/fpsdk_common/include/fpsdk_common/gnss.hpp +++ b/fpsdk_common/include/fpsdk_common/gnss.hpp @@ -202,6 +202,10 @@ enum class SigCorr : uint8_t RTCM3_SSR, //!< RTCM v3.x SSR type RTK corrections available QZSS_SLAS, //!< QZSS SLAS corrections available SPARTN, //!< SPARTN corrections available + CLAS, //!< QZSS centimeter-level augmentation service (CLAS) corrections available + LPP_OSR, //!< LTE positioning protocol (LPP) OSR type corrections available + LPP_SSR, //!< LTE positioning protocol (LPP) SSR type corrections available + GAL_HAS, //!< Galileo high-accurcy service (HAS) corrections available }; /** diff --git a/fpsdk_common/include/fpsdk_common/parser/ubx.hpp b/fpsdk_common/include/fpsdk_common/parser/ubx.hpp index 1536fe0..0c3ba24 100644 --- a/fpsdk_common/include/fpsdk_common/parser/ubx.hpp +++ b/fpsdk_common/include/fpsdk_common/parser/ubx.hpp @@ -2312,14 +2312,19 @@ static constexpr bool UBX_NAV_SIG_V0_SIGFLAGS_PR_CORR_USED(const uint16_t static constexpr bool UBX_NAV_SIG_V0_SIGFLAGS_CR_CORR_USED(const uint16_t sigFlags) { return (sigFlags & 0x0080) == 0x0080; } //!< @todo documentation static constexpr bool UBX_NAV_SIG_V0_SIGFLAGS_DO_CORR_USED(const uint16_t sigFlags) { return (sigFlags & 0x0100) == 0x0100; } //!< @todo documentation static constexpr bool UBX_NAV_SIG_V0_SIGFLAGS_AUTH_STATUS(const uint16_t sigFlags) { return (sigFlags & 0x0200) == 0x0200; } //!< @todo documentation -static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_NONE = 0; //!< @todo documentation -static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_SBAS = 1; //!< @todo documentation -static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_BDS = 2; //!< @todo documentation -static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_RTCM2 = 3; //!< @todo documentation -static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_RTCM3_OSR = 4; //!< @todo documentation -static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_RTCM3_SSR = 5; //!< @todo documentation -static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_QZSS_SLAS = 6; //!< @todo documentation -static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_SPARTN = 7; //!< @todo documentation +static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_NONE = 0; //!< @todo documentation +static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_SBAS = 1; //!< @todo documentation +static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_BDS = 2; //!< @todo documentation +static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_RTCM2 = 3; //!< @todo documentation +static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_RTCM3_OSR = 4; //!< @todo documentation +static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_RTCM3_SSR = 5; //!< @todo documentation +static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_QZSS_SLAS = 6; //!< @todo documentation +static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_SPARTN = 7; //!< @todo documentation +static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_CLAS = 9; //!< @todo documentation +static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_LPP_OSR = 10; //!< @todo documentation +static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_LPP_SSR = 11; //!< @todo documentation +static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_GAL_HAS = 12; //!< @todo documentation + inline const char * UBX_NAV_SIG_V0_CORRSOURCE_STR(const uint8_t corrSource) { return types::IxToStr(corrSource, "NONE", "SBAS", "BDS", "RTCM2", "RTCM3_OSR", "RTCM3_SSR", "QZSS_SLAS", "SPARTN"); } //!< @todo documentation static constexpr double UBX_NAV_SIG_V0_PRRES_SCALE = 1e-1; //!< @todo documentation // clang-format on diff --git a/fpsdk_common/src/gnss.cpp b/fpsdk_common/src/gnss.cpp index 1ffd24f..55c6044 100644 --- a/fpsdk_common/src/gnss.cpp +++ b/fpsdk_common/src/gnss.cpp @@ -164,6 +164,10 @@ const char* SigCorrStr(const SigCorr corr) case SigCorr::RTCM3_SSR: return "RTCM3_SSR"; case SigCorr::QZSS_SLAS: return "QZSS_SLAS"; case SigCorr::SPARTN: return "SPARTN"; + case SigCorr::CLAS: return "CLAS"; + case SigCorr::LPP_OSR: return "LPP_OSR"; + case SigCorr::LPP_SSR: return "LPP_SSR"; + case SigCorr::GAL_HAS: return "GAL_HAS"; } // clang-format on return "?"; } From 4f101ce72178554989224eec92a8a4dbbe2395c4 Mon Sep 17 00:00:00 2001 From: flipflip Date: Wed, 28 Oct 2026 13:53:43 +0100 Subject: [PATCH 3/4] gll vtg --- fpsdk_common/include/fpsdk_common/gnss.hpp | 11 ++- .../include/fpsdk_common/parser/fpa.hpp | 3 +- .../include/fpsdk_common/parser/nmea.hpp | 48 ++++++++--- .../fpsdk_common/to_json/parser_nmea.hpp | 9 +- fpsdk_common/src/gnss.cpp | 31 +++++-- fpsdk_common/src/parser/fpa.cpp | 11 ++- fpsdk_common/src/parser/nmea.cpp | 84 ++++++++++++++----- fpsdk_common/test/parser_fpa_test.cpp | 2 +- fpsdk_common/test/parser_nmea_test.cpp | 6 +- 9 files changed, 152 insertions(+), 53 deletions(-) diff --git a/fpsdk_common/include/fpsdk_common/gnss.hpp b/fpsdk_common/include/fpsdk_common/gnss.hpp index ed0eb19..1b43df1 100644 --- a/fpsdk_common/include/fpsdk_common/gnss.hpp +++ b/fpsdk_common/include/fpsdk_common/gnss.hpp @@ -567,6 +567,15 @@ FixType NmeaQualityGgaToFixType(const parser::nmea::NmeaQualityGga quality); */ FixType NmeaModeRmcGnsToFixType(const parser::nmea::NmeaModeRmcGns mode); +/** + * @brief Convert NMEA GLL mode to fix type + * + * @param[in] mode NMEA GLL mode + * + * @returns the fix type corresponding to the mode + */ +FixType NmeaModeGllToFixType(const parser::nmea::NmeaModeGll mode); + /** * @brief Convert NMEA GLL/VTG mode to fix type * @@ -574,7 +583,7 @@ FixType NmeaModeRmcGnsToFixType(const parser::nmea::NmeaModeRmcGns mode); * * @returns the fix type corresponding to the mode */ -FixType NmeaModeGllVtgToFixType(const parser::nmea::NmeaModeGllVtg mode); +FixType NmeaModeVtgToFixType(const parser::nmea::NmeaModeVtg mode); /** * @brief Convert NMEA system ID and satellite number to satellite diff --git a/fpsdk_common/include/fpsdk_common/parser/fpa.hpp b/fpsdk_common/include/fpsdk_common/parser/fpa.hpp index 9797258..58c5825 100644 --- a/fpsdk_common/include/fpsdk_common/parser/fpa.hpp +++ b/fpsdk_common/include/fpsdk_common/parser/fpa.hpp @@ -528,7 +528,8 @@ enum class FpaGnssFix : int S3D_DR = '6', //!< Single 3D fix with dead-reckoning RTK_FLOAT = '7', //!< RTK float fix RTK_FIXED = '8', //!< RTK fixed fix - PPP = 'b', //!< PPP fix (11) + PPP_FLOAT = 'b', //!< PPP fix (11 == 0xb) + PPP_FIXED = 'c', //!< PPP fix (12 == 0xc) }; // clang-format on /** diff --git a/fpsdk_common/include/fpsdk_common/parser/nmea.hpp b/fpsdk_common/include/fpsdk_common/parser/nmea.hpp index a0ce04a..79d9b8a 100644 --- a/fpsdk_common/include/fpsdk_common/parser/nmea.hpp +++ b/fpsdk_common/include/fpsdk_common/parser/nmea.hpp @@ -306,29 +306,55 @@ enum class NmeaStatusGllRmc : int const char* NmeaStatusGllRmcStr(const NmeaStatusGllRmc status); /** - * @brief NMEA-Gx-GLL and NMEA-Gx-VTG pos mode + * @brief NMEA-Gx-GLL pos mode * * @note Do not use <, >, >=, <= operators on this! */ -enum class NmeaModeGllVtg : int +enum class NmeaModeGll : int { // clang-format off UNSPECIFIED = '!', //!< Unspecified + AUTONOMOUS = 'A', //!< Autonomous mode (SPP) + DGNSS = 'D', //!< Differential GNSS fix + ESTIMATED = 'E', //!< Estimated (dead reckoning only) + MANUAL = 'M', //!< Manual input mode + SIM = 'S', //!< Simulator mode INVALID = 'N', //!< Invalid (no fix) +}; // clang-format on + +/** + * @brief Stringify NMEA-Gx-GLL pos mode + * + * @param[in] mode The NMEA-Gx-GLL pos mode + * + * @returns the stringification of the NMEA-Gx-GLL and NMEA-Gx-VTG pos mode + */ +const char* NmeaModeGllStr(const NmeaModeGll mode); + +/** + * @brief NMEA-Gx-VTG pos mode + * + * @note Do not use <, >, >=, <= operators on this! + */ +enum class NmeaModeVtg : int +{ // clang-format off + UNSPECIFIED = '!', //!< Unspecified AUTONOMOUS = 'A', //!< Autonomous mode (SPP) DGNSS = 'D', //!< Differential GNSS fix ESTIMATED = 'E', //!< Estimated (dead reckoning only) MANUAL = 'M', //!< Manual input mode + INVALID = 'N', //!< Invalid (no fix) + PRECISE = 'P', //!< Precise (e.g. PPP) SIM = 'S', //!< Simulator mode }; // clang-format on /** - * @brief Stringify NMEA-Gx-GLL and NMEA-Gx-VTG pos mode + * @brief Stringify NMEA-Gx-VTG pos mode * - * @param[in] mode The NMEA-Gx-GLL and NMEA-Gx-VTG pos mode + * @param[in] mode The NMEA-Gx-VTG pos mode * * @returns the stringification of the NMEA-Gx-GLL and NMEA-Gx-VTG pos mode */ -const char* NmeaModeGllVtgStr(const NmeaModeGllVtg mode); +const char* NmeaModeVtgStr(const NmeaModeVtg mode); /** * @brief NMEA-Gx-RMC and NMEA-Gx-GNS pos mode @@ -675,7 +701,7 @@ struct NmeaGllPayload : public NmeaPayload NmeaLlh ll; //!< Position (no height) NmeaTime time; //!< Time NmeaStatusGllRmc status = NmeaStatusGllRmc::UNSPECIFIED; //!< Positioning system status - NmeaModeGllVtg mode = NmeaModeGllVtg::UNSPECIFIED; //!< Positioning system mode + NmeaModeGll mode = NmeaModeGll::UNSPECIFIED; //!< Positioning system mode bool SetFromMsg(const uint8_t* msg, const std::size_t msg_size) final; @@ -706,11 +732,11 @@ struct NmeaRmcPayload : public NmeaPayload */ struct NmeaVtgPayload : public NmeaPayload { - NmeaFloat cogt; //!< Course over ground (true) [deg] - NmeaFloat cogm; //!< Course over ground (magnetic) [deg], not typically available - NmeaFloat sogn; //!< Speed over ground [knots] - NmeaFloat sogk; //!< Speed over ground [km/h] - NmeaModeGllVtg mode = NmeaModeGllVtg::UNSPECIFIED; //!< Positioning system mode + NmeaFloat cogt; //!< Course over ground (true) [deg] + NmeaFloat cogm; //!< Course over ground (magnetic) [deg], not typically available + NmeaFloat sogn; //!< Speed over ground [knots] + NmeaFloat sogk; //!< Speed over ground [km/h] + NmeaModeVtg mode = NmeaModeVtg::UNSPECIFIED; //!< Positioning system mode bool SetFromMsg(const uint8_t* msg, const std::size_t msg_size) final; diff --git a/fpsdk_common/include/fpsdk_common/to_json/parser_nmea.hpp b/fpsdk_common/include/fpsdk_common/to_json/parser_nmea.hpp index 9b9a6af..b1c3592 100644 --- a/fpsdk_common/include/fpsdk_common/to_json/parser_nmea.hpp +++ b/fpsdk_common/include/fpsdk_common/to_json/parser_nmea.hpp @@ -45,9 +45,14 @@ inline void to_json(nlohmann::json& j, const NmeaStatusGllRmc e) j = NmeaStatusGllRmcStr(e); } -inline void to_json(nlohmann::json& j, const NmeaModeGllVtg e) +inline void to_json(nlohmann::json& j, const NmeaModeGll e) { - j = NmeaModeGllVtgStr(e); + j = NmeaModeGllStr(e); +} + +inline void to_json(nlohmann::json& j, const NmeaModeVtg e) +{ + j = NmeaModeVtgStr(e); } inline void to_json(nlohmann::json& j, const NmeaModeRmcGns e) diff --git a/fpsdk_common/src/gnss.cpp b/fpsdk_common/src/gnss.cpp index 55c6044..051e33e 100644 --- a/fpsdk_common/src/gnss.cpp +++ b/fpsdk_common/src/gnss.cpp @@ -592,16 +592,31 @@ FixType NmeaModeRmcGnsToFixType(const parser::nmea::NmeaModeRmcGns mode) return FixType::UNKNOWN; } -FixType NmeaModeGllVtgToFixType(const parser::nmea::NmeaModeGllVtg mode) +FixType NmeaModeGllToFixType(const parser::nmea::NmeaModeGll mode) { switch (mode) { // clang-format off - case parser::nmea::NmeaModeGllVtg::INVALID: /* FALLTHROUGH */ - case parser::nmea::NmeaModeGllVtg::MANUAL: return FixType::NOFIX; - case parser::nmea::NmeaModeGllVtg::AUTONOMOUS: /* FALLTHROUGH */ - case parser::nmea::NmeaModeGllVtg::DGNSS: /* FALLTHROUGH */ - case parser::nmea::NmeaModeGllVtg::SIM: return FixType::SPP_3D; - case parser::nmea::NmeaModeGllVtg::ESTIMATED: return FixType::DRONLY; - case parser::nmea::NmeaModeGllVtg::UNSPECIFIED: break; + case parser::nmea::NmeaModeGll::INVALID: /* FALLTHROUGH */ + case parser::nmea::NmeaModeGll::MANUAL: return FixType::NOFIX; + case parser::nmea::NmeaModeGll::AUTONOMOUS: /* FALLTHROUGH */ + case parser::nmea::NmeaModeGll::DGNSS: /* FALLTHROUGH */ + case parser::nmea::NmeaModeGll::SIM: return FixType::SPP_3D; + case parser::nmea::NmeaModeGll::ESTIMATED: return FixType::DRONLY; + case parser::nmea::NmeaModeGll::UNSPECIFIED: break; + } // clang-format on + return FixType::UNKNOWN; +} + +FixType NmeaModeVtgToFixType(const parser::nmea::NmeaModeVtg mode) +{ + switch (mode) { // clang-format off + case parser::nmea::NmeaModeVtg::INVALID: /* FALLTHROUGH */ + case parser::nmea::NmeaModeVtg::MANUAL: return FixType::NOFIX; + case parser::nmea::NmeaModeVtg::AUTONOMOUS: /* FALLTHROUGH */ + case parser::nmea::NmeaModeVtg::DGNSS: /* FALLTHROUGH */ + case parser::nmea::NmeaModeVtg::PRECISE: /* FALLTHROUGH */ + case parser::nmea::NmeaModeVtg::SIM: return FixType::SPP_3D; + case parser::nmea::NmeaModeVtg::ESTIMATED: return FixType::DRONLY; + case parser::nmea::NmeaModeVtg::UNSPECIFIED: break; } // clang-format on return FixType::UNKNOWN; } diff --git a/fpsdk_common/src/parser/fpa.cpp b/fpsdk_common/src/parser/fpa.cpp index a1ad631..20758bc 100644 --- a/fpsdk_common/src/parser/fpa.cpp +++ b/fpsdk_common/src/parser/fpa.cpp @@ -383,7 +383,8 @@ const char* FpaGnssFixStr(const FpaGnssFix fix) case FpaGnssFix::S3D_DR: return "S3D_DR"; case FpaGnssFix::RTK_FLOAT: return "RTK_FLOAT"; case FpaGnssFix::RTK_FIXED: return "RTK_FIXED"; - case FpaGnssFix::PPP: return "PPP"; + case FpaGnssFix::PPP_FLOAT: return "PPP_FLOAT"; + case FpaGnssFix::PPP_FIXED: return "PPP_FIXED"; } // clang-format on return "?"; } @@ -953,9 +954,10 @@ static bool GetGnssFix(FpaGnssFix& fix, const std::string& field) { bool ok = false; fix = FpaGnssFix::UNSPECIFIED; - // Two-digits vlues + // Two-digits values if (field.size() == 2) { // clang-format off - if (field == "11") { fix = FpaGnssFix::PPP; ok = true; } + if (field == "11") { fix = FpaGnssFix::PPP_FLOAT; ok = true; } + else if (field == "12") { fix = FpaGnssFix::PPP_FIXED; ok = true; } } // clang-format on // Single-digit values else if (field.size() == 1) { @@ -970,7 +972,8 @@ static bool GetGnssFix(FpaGnssFix& fix, const std::string& field) case FpaGnssFix::RTK_FLOAT: fix = FpaGnssFix::RTK_FLOAT; ok = true; break; case FpaGnssFix::RTK_FIXED: fix = FpaGnssFix::RTK_FIXED; ok = true; break; // clang-format on // Not single-digit value, handled above or invalid - case FpaGnssFix::PPP: + case FpaGnssFix::PPP_FLOAT: + case FpaGnssFix::PPP_FIXED: case FpaGnssFix::UNSPECIFIED: break; } diff --git a/fpsdk_common/src/parser/nmea.cpp b/fpsdk_common/src/parser/nmea.cpp index e480354..10a79a4 100644 --- a/fpsdk_common/src/parser/nmea.cpp +++ b/fpsdk_common/src/parser/nmea.cpp @@ -284,16 +284,33 @@ const char* NmeaStatusGllRmcStr(const NmeaStatusGllRmc status) // --------------------------------------------------------------------------------------------------------------------- -const char* NmeaModeGllVtgStr(const NmeaModeGllVtg mode) +const char* NmeaModeGllStr(const NmeaModeGll mode) { switch (mode) { // clang-format off - case NmeaModeGllVtg::UNSPECIFIED: return "UNSPECIFIED"; - case NmeaModeGllVtg::INVALID: return "INVALID"; - case NmeaModeGllVtg::AUTONOMOUS: return "AUTONOMOUS"; - case NmeaModeGllVtg::DGNSS: return "DGNSS"; - case NmeaModeGllVtg::ESTIMATED: return "ESTIMATED"; - case NmeaModeGllVtg::MANUAL: return "MANUAL"; - case NmeaModeGllVtg::SIM: return "SIM"; + case NmeaModeGll::UNSPECIFIED: return "UNSPECIFIED"; + case NmeaModeGll::AUTONOMOUS: return "AUTONOMOUS"; + case NmeaModeGll::DGNSS: return "DGNSS"; + case NmeaModeGll::ESTIMATED: return "ESTIMATED"; + case NmeaModeGll::MANUAL: return "MANUAL"; + case NmeaModeGll::SIM: return "SIM"; + case NmeaModeGll::INVALID: return "INVALID"; + } // clang-format on + return "?"; +} + +// --------------------------------------------------------------------------------------------------------------------- + +const char* NmeaModeVtgStr(const NmeaModeVtg mode) +{ + switch (mode) { // clang-format off + case NmeaModeVtg::UNSPECIFIED: return "UNSPECIFIED"; + case NmeaModeVtg::AUTONOMOUS: return "AUTONOMOUS"; + case NmeaModeVtg::DGNSS: return "DGNSS"; + case NmeaModeVtg::ESTIMATED: return "ESTIMATED"; + case NmeaModeVtg::MANUAL: return "MANUAL"; + case NmeaModeVtg::INVALID: return "INVALID"; + case NmeaModeVtg::PRECISE: return "PRECISE"; + case NmeaModeVtg::SIM: return "SIM"; } // clang-format on return "?"; } @@ -746,24 +763,46 @@ static bool GetStatusGllRmc(NmeaStatusGllRmc& status, const std::string& field) return ok; } -// Get GLL/VTG mode flag -static bool GetModeGllVtg(NmeaModeGllVtg& mode, const std::string& field) +// Get GLL mode flag +static bool GetModeGll(NmeaModeGll& mode, const std::string& field) +{ + bool ok = true; + if (!field.empty()) { + switch ((NmeaModeGll)field[0]) { // clang-format off + case NmeaModeGll::AUTONOMOUS: mode = NmeaModeGll::AUTONOMOUS; break; + case NmeaModeGll::DGNSS: mode = NmeaModeGll::DGNSS; break; + case NmeaModeGll::ESTIMATED: mode = NmeaModeGll::ESTIMATED; break; + case NmeaModeGll::MANUAL: mode = NmeaModeGll::MANUAL; break; + case NmeaModeGll::SIM: mode = NmeaModeGll::SIM; break; + case NmeaModeGll::INVALID: mode = NmeaModeGll::INVALID; break; + case NmeaModeGll::UNSPECIFIED: ok = false; break; + } // clang-format on + } else { + ok = false; + } + NMEA_TRACE("GetModeGll(\"%s\")=%s mode=%c", field.c_str(), string::ToStr(ok), types::EnumToVal(mode)); + return ok; +} + +// Get VTG mode flag +static bool GetModeVtg(NmeaModeVtg& mode, const std::string& field) { bool ok = true; if (!field.empty()) { - switch ((NmeaModeGllVtg)field[0]) { // clang-format off - case NmeaModeGllVtg::INVALID: mode = NmeaModeGllVtg::INVALID; break; - case NmeaModeGllVtg::AUTONOMOUS: mode = NmeaModeGllVtg::AUTONOMOUS; break; - case NmeaModeGllVtg::DGNSS: mode = NmeaModeGllVtg::DGNSS; break; - case NmeaModeGllVtg::ESTIMATED: mode = NmeaModeGllVtg::ESTIMATED; break; - case NmeaModeGllVtg::MANUAL: mode = NmeaModeGllVtg::MANUAL; break; - case NmeaModeGllVtg::SIM: mode = NmeaModeGllVtg::SIM; break; - case NmeaModeGllVtg::UNSPECIFIED: ok = false; break; + switch ((NmeaModeVtg)field[0]) { // clang-format off + case NmeaModeVtg::AUTONOMOUS: mode = NmeaModeVtg::AUTONOMOUS; break; + case NmeaModeVtg::DGNSS: mode = NmeaModeVtg::DGNSS; break; + case NmeaModeVtg::ESTIMATED: mode = NmeaModeVtg::ESTIMATED; break; + case NmeaModeVtg::MANUAL: mode = NmeaModeVtg::MANUAL; break; + case NmeaModeVtg::INVALID: mode = NmeaModeVtg::INVALID; break; + case NmeaModeVtg::PRECISE: mode = NmeaModeVtg::PRECISE; break; + case NmeaModeVtg::SIM: mode = NmeaModeVtg::SIM; break; + case NmeaModeVtg::UNSPECIFIED: ok = false; break; } // clang-format on } else { ok = false; } - NMEA_TRACE("GetModeGllVtg(\"%s\")=%s mode=%c", field.c_str(), string::ToStr(ok), types::EnumToVal(mode)); + NMEA_TRACE("GetModeVtg(\"%s\")=%s mode=%c", field.c_str(), string::ToStr(ok), types::EnumToVal(mode)); return ok; } @@ -1062,9 +1101,8 @@ bool NmeaGllPayload::SetFromMsg(const uint8_t* msg, const std::size_t msg_size) bool ok = false; NmeaParts m; if (GetParts(m, FORMATTER, msg, msg_size) && GetTalker(talker_, m.meta_.talker_) && (m.fields_.size() == 7)) { - ok = (GetTime(time, m.fields_[4]) && GetStatusGllRmc(status, m.fields_[5]) && - GetModeGllVtg(mode, m.fields_[6]) && - GetLlh(ll, m.fields_, 0, 2, -1, -1, mode != NmeaModeGllVtg::INVALID)); + ok = (GetTime(time, m.fields_[4]) && GetStatusGllRmc(status, m.fields_[5]) && GetModeGll(mode, m.fields_[6]) && + GetLlh(ll, m.fields_, 0, 2, -1, -1, mode != NmeaModeGll::INVALID)); } NMEA_TRACE("NmeaGllPayload %s", string::ToStr(ok)); valid_ = ok; @@ -1109,7 +1147,7 @@ bool NmeaVtgPayload::SetFromMsg(const uint8_t* msg, const std::size_t msg_size) // Ignore magnetic course fields_[2] and fields_[3] ok = (GetTalker(talker_, m.meta_.talker_) && (m.fields_[1] == "T") && GetFloat(cogt, m.fields_[0], false) && (m.fields_[5] == "N") && GetFloat(sogn, m.fields_[4], false) && (m.fields_[7] == "K") && - GetFloat(sogk, m.fields_[6], false) && GetModeGllVtg(mode, m.fields_[8])); + GetFloat(sogk, m.fields_[6], false) && GetModeVtg(mode, m.fields_[8])); } NMEA_TRACE("NmeaVtgPayload %s", string::ToStr(ok)); valid_ = ok; diff --git a/fpsdk_common/test/parser_fpa_test.cpp b/fpsdk_common/test/parser_fpa_test.cpp index 4716747..f054287 100644 --- a/fpsdk_common/test/parser_fpa_test.cpp +++ b/fpsdk_common/test/parser_fpa_test.cpp @@ -325,7 +325,7 @@ TEST(ParserFpaTest, FpaGnsscorrPayload) EXPECT_EQ(payload.gnss1_nsig_l1.value, 25); EXPECT_TRUE(payload.gnss1_nsig_l2.valid); EXPECT_EQ(payload.gnss1_nsig_l2.value, 18); - EXPECT_EQ(payload.gnss2_fix, FpaGnssFix::PPP); + EXPECT_EQ(payload.gnss2_fix, FpaGnssFix::PPP_FLOAT); EXPECT_TRUE(payload.gnss2_nsig_l1.valid); EXPECT_EQ(payload.gnss2_nsig_l1.value, 25); EXPECT_TRUE(payload.gnss2_nsig_l2.valid); diff --git a/fpsdk_common/test/parser_nmea_test.cpp b/fpsdk_common/test/parser_nmea_test.cpp index f963d4b..0a58989 100644 --- a/fpsdk_common/test/parser_nmea_test.cpp +++ b/fpsdk_common/test/parser_nmea_test.cpp @@ -431,7 +431,7 @@ TEST(ParserNmeaTest, NmeaGllPayload) EXPECT_FALSE(gll.ll.height_valid); EXPECT_NEAR(gll.ll.height, 0.0, 1e-9); EXPECT_EQ(gll.status, NmeaStatusGllRmc::VALID); - EXPECT_EQ(gll.mode, NmeaModeGllVtg::DGNSS); + EXPECT_EQ(gll.mode, NmeaModeGll::DGNSS); } { NmeaGllPayload gll; @@ -450,7 +450,7 @@ TEST(ParserNmeaTest, NmeaGllPayload) EXPECT_FALSE(gll.ll.height_valid); EXPECT_EQ(gll.ll.height, 0.0); EXPECT_EQ(gll.status, NmeaStatusGllRmc::INVALID); - EXPECT_EQ(gll.mode, NmeaModeGllVtg::INVALID); + EXPECT_EQ(gll.mode, NmeaModeGll::INVALID); } } @@ -592,6 +592,7 @@ TEST(ParserNmeaTest, NmeaVtgPayload) EXPECT_NEAR(vtg.sogn.value, 0.015, 1e-6); EXPECT_TRUE(vtg.sogk.valid); EXPECT_NEAR(vtg.sogk.value, 0.027, 1e-6); + EXPECT_EQ(vtg.mode, NmeaModeVtg::INVALID); } { NmeaVtgPayload vtg; @@ -608,6 +609,7 @@ TEST(ParserNmeaTest, NmeaVtgPayload) EXPECT_EQ(vtg.sogn.value, 0.0); EXPECT_FALSE(vtg.sogk.valid); EXPECT_EQ(vtg.sogk.value, 0.0); + EXPECT_EQ(vtg.mode, NmeaModeVtg::INVALID); } } From 975a1c78a78715daa5b417be5134d623a2c555bf Mon Sep 17 00:00:00 2001 From: flipflip Date: Wed, 28 Oct 2026 14:08:44 +0100 Subject: [PATCH 4/4] fix test --- fpsdk_common/test/parser_nmea_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fpsdk_common/test/parser_nmea_test.cpp b/fpsdk_common/test/parser_nmea_test.cpp index 0a58989..fec124c 100644 --- a/fpsdk_common/test/parser_nmea_test.cpp +++ b/fpsdk_common/test/parser_nmea_test.cpp @@ -592,7 +592,7 @@ TEST(ParserNmeaTest, NmeaVtgPayload) EXPECT_NEAR(vtg.sogn.value, 0.015, 1e-6); EXPECT_TRUE(vtg.sogk.valid); EXPECT_NEAR(vtg.sogk.value, 0.027, 1e-6); - EXPECT_EQ(vtg.mode, NmeaModeVtg::INVALID); + EXPECT_EQ(vtg.mode, NmeaModeVtg::DGNSS); } { NmeaVtgPayload vtg;