Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion fpsdk_common/include/fpsdk_common/gnss.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
};

/**
Expand Down Expand Up @@ -563,14 +567,23 @@ 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
*
* @param[in] mode NMEA GLL/VTG 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
Expand Down
6 changes: 4 additions & 2 deletions fpsdk_common/include/fpsdk_common/parser/fpa.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -528,6 +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_FLOAT = 'b', //!< PPP fix (11 == 0xb)
PPP_FIXED = 'c', //!< PPP fix (12 == 0xc)
}; // clang-format on

/**
Expand Down
48 changes: 37 additions & 11 deletions fpsdk_common/include/fpsdk_common/parser/nmea.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down
21 changes: 13 additions & 8 deletions fpsdk_common/include/fpsdk_common/parser/ubx.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
9 changes: 7 additions & 2 deletions fpsdk_common/include/fpsdk_common/to_json/parser_nmea.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
35 changes: 27 additions & 8 deletions fpsdk_common/src/gnss.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 "?";
}
Expand Down Expand Up @@ -588,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;
}
Expand Down
28 changes: 20 additions & 8 deletions fpsdk_common/src/parser/fpa.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -383,6 +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_FLOAT: return "PPP_FLOAT";
case FpaGnssFix::PPP_FIXED: return "PPP_FIXED";
} // clang-format on
return "?";
}
Expand Down Expand Up @@ -768,10 +770,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;
Expand Down Expand Up @@ -952,7 +954,13 @@ static bool GetGnssFix(FpaGnssFix& fix, const std::string& field)
{
bool ok = false;
fix = FpaGnssFix::UNSPECIFIED;
if (!field.empty()) {
// Two-digits values
if (field.size() == 2) { // clang-format off
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) {
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;
Expand All @@ -962,9 +970,13 @@ 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_FLOAT:
case FpaGnssFix::PPP_FIXED:
case FpaGnssFix::UNSPECIFIED:
break;
}
} else {
ok = true;
}
Expand Down
Loading
Loading