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
191 changes: 191 additions & 0 deletions fpsdk_common/include/fpsdk_common/parser/ubx.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1114,6 +1114,150 @@ static constexpr uint8_t UBX_ESF_STATUS_V2_FAULTS_MISSINGMEAS
static constexpr uint8_t UBX_ESF_STATUS_V2_FAULTS_NOISYMEAS = 0x08; //!< @todo documentation
// clang-format on

///@}
// ---------------------------------------------------------------------------------------------------------------------
/**
* @name UBX-MGA-GAL-OSNMA_PUBKEY message
* @{
*/

//! UBX-MGA-GAL-OSNMA_PUBKEY (version 0, input) payload
struct UBX_MGA_GAL_OSNMA_PUBKEY_V0_GROUP0 // clang-format off
{
uint8_t type; //!< @todo documentation
uint8_t version; //!< @todo documentation
uint8_t bitfield0; //!< @todo documentation
uint8_t reserved0; //!< @todo documentation
uint8_t pubKeyPoint[67]; //!< @todo documentation
uint8_t reserved1; //!< @todo documentation
}; // clang-format on

static_assert(sizeof(UBX_MGA_GAL_OSNMA_PUBKEY_V0_GROUP0) == 72, "");

// clang-format off
static constexpr uint8_t UBX_MGA_GAL_OSNMA_PUBKEY_TYPE = 0x07; //!< @todo documentation
static constexpr const char* UBX_MGA_GAL_OSNMA_PUBKEY_STRID = "UBX-MGA-GAL-OSNMA_PUBKEY"; //!< @todo documentation
static constexpr uint8_t UBX_MGA_GAL_OSNMA_PUBKEY_V0_VERSION = 0x00; //!< @todo documentation
static constexpr std::size_t UBX_MGA_GAL_OSNMA_PUBKEY_V0_SIZE = sizeof(UBX_MGA_GAL_OSNMA_PUBKEY_V0_GROUP0) + UBX_FRAME_SIZE; //!< @todo documentation
static constexpr uint8_t UBX_MGA_GAL_OSNMA_PUBKEY_V0_BITFIELD0_PUBKEYID(const uint8_t bitfield0) { return bitfield0 & 0x0f; } //!< @todo documentation
static constexpr uint8_t UBX_MGA_GAL_OSNMA_PUBKEY_V0_BITFIELD0_PUBKEYTYPE(const uint8_t bitfield0) { return (bitfield0 >> 4) & 0x0f; } //!< @todo documentation
static constexpr uint8_t UBX_MGA_GAL_OSNMA_PUBKEY_V0_BITFIELD0_PUBKEYTYPE_ECDSAP256 = 1; //!< @todo documentation
static constexpr uint8_t UBX_MGA_GAL_OSNMA_PUBKEY_V0_BITFIELD0_PUBKEYTYPE_ECDSAP521 = 3; //!< @todo documentation
// clang-format on

///@}
// ---------------------------------------------------------------------------------------------------------------------
/**
* @name UBX-MGA-GAL-OSNMA_MERKLE message
* @{
*/

//! UBX-MGA-GAL-OSNMA_MERKLE (version 0, input) payload
struct UBX_MGA_GAL_OSNMA_MERKLE_V0_GROUP0 // clang-format off
{
uint8_t type; //!< @todo documentation
uint8_t version; //!< @todo documentation
uint8_t bitfield0; //!< @todo documentation
uint8_t reserved0; //!< @todo documentation
uint8_t treeNode[32]; //!< @todo documentation
}; // clang-format on

static_assert(sizeof(UBX_MGA_GAL_OSNMA_MERKLE_V0_GROUP0) == 36, "");

// clang-format off
static constexpr uint8_t UBX_MGA_GAL_OSNMA_MERKLE_TYPE = 0x08; //!< @todo documentation
static constexpr const char* UBX_MGA_GAL_OSNMA_MERKLE_STRID = "UBX-MGA-GAL-OSNMA_MERKLE"; //!< @todo documentation
static constexpr uint8_t UBX_MGA_GAL_OSNMA_MERKLE_V0_VERSION = 0x00; //!< @todo documentation
static constexpr std::size_t UBX_MGA_GAL_OSNMA_MERKLE_V0_SIZE = sizeof(UBX_MGA_GAL_OSNMA_MERKLE_V0_GROUP0) + UBX_FRAME_SIZE; //!< @todo documentation
static constexpr uint8_t UBX_MGA_GAL_OSNMA_MERKLE_V0_BITFIELD0_APPLICABILITYTIME(const uint8_t bitfield0) { return bitfield0 & 0x01; } //!< @todo documentation
static constexpr uint8_t UBX_MGA_GAL_OSNMA_MERKLE_V0_BITFIELD0_APPLICABILITYTIME_CURRENT = 0; //!< @todo documentation
static constexpr uint8_t UBX_MGA_GAL_OSNMA_MERKLE_V0_BITFIELD0_APPLICABILITYTIME_FUTURE = 1; //!< @todo documentation
// clang-format on

///@}
// ---------------------------------------------------------------------------------------------------------------------
/**
* @name UBX-MGA-INI-TIME_UTC message
* @{
*/

//! UBX-MGA-INI-TIME_UTC (version 0, input) payload
struct UBX_MGA_INI_TIME_UTC_V0_GROUP0 // clang-format off
{
uint8_t type; //!< @todo documentation
uint8_t version; //!< @todo documentation
uint8_t ref; //!< @todo documentation
int8_t leapSecs; //!< @todo documentation
uint16_t year; //!< @todo documentation
uint8_t month; //!< @todo documentation
uint8_t day; //!< @todo documentation
uint8_t hour; //!< @todo documentation
uint8_t minute; //!< @todo documentation
uint8_t second; //!< @todo documentation
uint8_t bitfield0; //!< @todo documentation
uint32_t ns; //!< @todo documentation
uint16_t tAccS; //!< @todo documentation
uint8_t reserved0[2]; //!< @todo documentation
uint32_t tAccNs; //!< @todo documentation
}; // clang-format on

static_assert(sizeof(UBX_MGA_INI_TIME_UTC_V0_GROUP0) == 24, "");

// clang-format off
static constexpr uint8_t UBX_MGA_INI_TIME_UTC_TYPE = 0x10; //!< @todo documentation
static constexpr const char* UBX_MGA_INI_TIME_UTC_STRID = "UBX-MGA-INI-TIME_UTC"; //!< @todo documentation
static constexpr uint8_t UBX_MGA_INI_TIME_UTC_V0_VERSION = 0x00; //!< @todo documentation
static constexpr std::size_t UBX_MGA_INI_TIME_UTC_V0_SIZE = sizeof(UBX_MGA_INI_TIME_UTC_V0_GROUP0) + UBX_FRAME_SIZE; //!< @todo documentation
static constexpr uint8_t UBX_MGA_INI_TIME_UTC_V0_REF_SOURCE(const uint8_t ref) { return ref & 0x0f; } //!< @todo documentation
static constexpr uint8_t UBX_MGA_INI_TIME_UTC_V0_REF_SOURCE_NONE = 0; //!< @todo documentation
static constexpr uint8_t UBX_MGA_INI_TIME_UTC_V0_REF_SOURCE_EXTINT0 = 1; //!< @todo documentation
static constexpr uint8_t UBX_MGA_INI_TIME_UTC_V0_REF_SOURCE_EXTINT1 = 2; //!< @todo documentation
static constexpr bool UBX_MGA_INI_TIME_UTC_V0_REF_FALL(const uint8_t ref) { return (ref & 0x10) == 0x10; } //!< @todo documentation
static constexpr bool UBX_MGA_INI_TIME_UTC_V0_REF_LAST(const uint8_t ref) { return (ref & 0x20) == 0x20; } //!< @todo documentation
static constexpr int8_t UBX_MGA_INI_TIME_UTC_V0_LEAPSECS_UNKNOWN = -128; //!< @todo documentation
static constexpr bool UBX_MGA_INI_TIME_UTC_V0_BITFIELD0_TRUSTEDSOURCE(const uint8_t bitfield0) { return (bitfield0 & 0x01) == 0x01; } //!< @todo documentation
// clang-format on

///@}
// ---------------------------------------------------------------------------------------------------------------------
/**
* @name UBX-MGA-INI-TIME_GNSS message
* @{
*/

//! UBX-MGA-INI-TIME_GNSS (version 0, input) payload
struct UBX_MGA_INI_TIME_GNSS_V0_GROUP0 // clang-format off
{
uint8_t type; //!< @todo documentation
uint8_t version; //!< @todo documentation
uint8_t ref; //!< @todo documentation
uint8_t gnssId; //!< @todo documentation
uint8_t bitfield0; //!< @todo documentation
uint8_t reserved0; //!< @todo documentation
uint16_t week; //!< @todo documentation
uint32_t tow; //!< @todo documentation
uint32_t ns; //!< @todo documentation
uint16_t tAccS; //!< @todo documentation
uint8_t reserved1[2]; //!< @todo documentation
uint32_t tAccNs; //!< @todo documentation
}; // clang-format on

static_assert(sizeof(UBX_MGA_INI_TIME_GNSS_V0_GROUP0) == 24, "");

// clang-format off
static constexpr uint8_t UBX_MGA_INI_TIME_GNSS_TYPE = 0x11; //!< @todo documentation
static constexpr const char* UBX_MGA_INI_TIME_GNSS_STRID = "UBX-MGA-INI-TIME_GNSS"; //!< @todo documentation
static constexpr uint8_t UBX_MGA_INI_TIME_GNSS_V0_VERSION = 0x00; //!< @todo documentation
static constexpr std::size_t UBX_MGA_INI_TIME_GNSS_V0_SIZE = sizeof(UBX_MGA_INI_TIME_GNSS_V0_GROUP0) + UBX_FRAME_SIZE; //!< @todo documentation
static constexpr uint8_t UBX_MGA_INI_TIME_GNSS_V0_REF_SOURCE(const uint8_t ref) { return ref & 0x0f; } //!< @todo documentation
static constexpr uint8_t UBX_MGA_INI_TIME_GNSS_V0_REF_SOURCE_NONE = 0; //!< @todo documentation
static constexpr uint8_t UBX_MGA_INI_TIME_GNSS_V0_REF_SOURCE_EXTINT0 = 1; //!< @todo documentation
static constexpr uint8_t UBX_MGA_INI_TIME_GNSS_V0_REF_SOURCE_EXTINT1 = 2; //!< @todo documentation
static constexpr bool UBX_MGA_INI_TIME_GNSS_V0_REF_FALL(const uint8_t ref) { return (ref & 0x10) == 0x10; } //!< @todo documentation
static constexpr bool UBX_MGA_INI_TIME_GNSS_V0_REF_LAST(const uint8_t ref) { return (ref & 0x20) == 0x20; } //!< @todo documentation
static constexpr bool UBX_MGA_INI_TIME_GNSS_V0_BITFIELD0_TRUSTEDSOURCE(const uint8_t bitfield0) { return (bitfield0 & 0x01) == 0x01; } //!< @todo documentation
// clang-format on

///@}
// ---------------------------------------------------------------------------------------------------------------------
/**
Expand Down Expand Up @@ -2113,6 +2257,53 @@ static constexpr uint8_t UBX_NAV_SIG_V0_CORRSOURCE_SPARTN
static constexpr double UBX_NAV_SIG_V0_PRRES_SCALE = 1e-1; //!< @todo documentation
// clang-format on

///@}
// ---------------------------------------------------------------------------------------------------------------------
/**
* @name UBX-NAV-TIMETRUSTED message
* @{
*/

//! UBX-NAV-TIMETRUSTED (version 1, output) payload
struct UBX_NAV_TIMETRUSTED_V1_GROUP0 // clang-format off
{
uint8_t version; //!< @todo documentation
uint8_t refSys; //!< @todo documentation
uint8_t valid; //!< @todo documentation
uint8_t reserved0; //!< @todo documentation
uint32_t iTOW; //!< @todo documentation
uint16_t iniWno; //!< @todo documentation
uint16_t propWno; //!< @todo documentation
uint32_t iniTow; //!< @todo documentation
uint32_t propTow; //!< @todo documentation
uint32_t iniTAcc; //!< @todo documentation
uint32_t propTAcc; //!< @todo documentation
int32_t deltaS; //!< @todo documentation
int32_t deltaMs; //!< @todo documentation
uint8_t reserved1[4]; //!< @todo documentation
}; // clang-format on

static_assert(sizeof(UBX_NAV_TIMETRUSTED_V1_GROUP0) == 40, "");

// clang-format off
static constexpr uint8_t UBX_NAV_TIMETRUSTED_VERSION(const uint8_t* msg) { return msg[UBX_HEAD_SIZE]; } //!< @todo documentation
static constexpr uint8_t UBX_NAV_TIMETRUSTED_V1_VERSION = 0x01; //!< @todo documentation
static constexpr std::size_t UBX_NAV_TIMETRUSTED_V1_SIZE = sizeof(UBX_NAV_TIMETRUSTED_V1_GROUP0) + UBX_FRAME_SIZE; //!< @todo documentation
static constexpr uint8_t UBX_NAV_TIMETRUSTED_V1_REFSYS_NONE = 0; //!< @todo documentation
static constexpr uint8_t UBX_NAV_TIMETRUSTED_V1_REFSYS_GPS = 1; //!< @todo documentation
static constexpr uint8_t UBX_NAV_TIMETRUSTED_V1_REFSYS_GAL = 2; //!< @todo documentation
static constexpr uint8_t UBX_NAV_TIMETRUSTED_V1_REFSYS_BDS = 3; //!< @todo documentation
static constexpr uint8_t UBX_NAV_TIMETRUSTED_V1_REFSYS_NAVIC = 15; //!< @todo documentation
static constexpr bool UBX_NAV_TIMETRUSTED_V1_VALID_TRUSTEDTIMEVALID(const uint8_t valid) { return (valid & 0x01) == 0x01; } //!< @todo documentation
static constexpr bool UBX_NAV_TIMETRUSTED_V1_VALID_DELTATIMEVALID(const uint8_t valid) { return (valid & 0x02) == 0x02; } //!< @todo documentation
static constexpr double UBX_NAV_TIMETRUSTED_V1_ITOW_SCALE = 1e-3; //!< @todo documentation
static constexpr double UBX_NAV_TIMETRUSTED_V1_INITOW_SCALE = 1e-3; //!< @todo documentation
static constexpr double UBX_NAV_TIMETRUSTED_V1_PROPTOW_SCALE = 1e-3; //!< @todo documentation
static constexpr double UBX_NAV_TIMETRUSTED_V1_INITACC_SCALE = 1e-3; //!< @todo documentation
static constexpr double UBX_NAV_TIMETRUSTED_V1_PROPTACC_SCALE = 1e-3; //!< @todo documentation
static constexpr double UBX_NAV_TIMETRUSTED_V1_DELTAMS_SCALE = 1e-3; //!< @todo documentation
// clang-format on

///@}
// ---------------------------------------------------------------------------------------------------------------------
/**
Expand Down
26 changes: 26 additions & 0 deletions fpsdk_common/src/parser/ubx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -852,6 +852,31 @@ static std::size_t StrUbxNavSat(char* info, const std::size_t size, const uint8_
return std::snprintf(info, size, "%010.3f %d", (double)head.iTOW * 1e-3, head.numSvs);
}

static std::size_t StrUbxNavTimetrusted(
char* info, const std::size_t size, const uint8_t* msg, const std::size_t msg_size)
{
if ((msg_size != UBX_NAV_TIMETRUSTED_V1_SIZE) ||
(UBX_NAV_TIMETRUSTED_VERSION(msg) != UBX_NAV_TIMETRUSTED_V1_VERSION)) {
return 0;
}
UBX_NAV_TIMETRUSTED_V1_GROUP0 tt;
std::memcpy(&tt, &msg[UBX_HEAD_SIZE], sizeof(tt));
constexpr std::array<const char*, 4> refSysStrs = { { "none", "GPS", "GAL", "BDS" } }; // clang-format off
const char* refSysStr = (tt.refSys == UBX_NAV_TIMETRUSTED_V1_REFSYS_NAVIC ? "NavIC"
: (tt.refSys < refSysStrs.size() ? refSysStrs[tt.refSys] : "?")); // clang-format on

return std::snprintf(info, size,
"%010.3f refSys=%s trusted=%c ini=%u:%.3f iniTAcc=%.3f prop=%u:%.3f propTAcc=%.3f delta=%c %+.3f",
(double)tt.iTOW * UBX_NAV_TIMETRUSTED_V1_ITOW_SCALE, refSysStr,
UBX_NAV_TIMETRUSTED_V1_VALID_TRUSTEDTIMEVALID(tt.valid) ? 'Y' : 'N', tt.iniWno,
(double)tt.iniTow * UBX_NAV_TIMETRUSTED_V1_INITOW_SCALE,
(double)tt.iniTAcc * UBX_NAV_TIMETRUSTED_V1_INITACC_SCALE, tt.propWno,
(double)tt.propTow * UBX_NAV_TIMETRUSTED_V1_PROPTOW_SCALE,
(double)tt.propTAcc * UBX_NAV_TIMETRUSTED_V1_PROPTACC_SCALE,
UBX_NAV_TIMETRUSTED_V1_VALID_DELTATIMEVALID(tt.valid) ? 'Y' : 'N',
(double)tt.deltaS + (double)tt.deltaMs * UBX_NAV_TIMETRUSTED_V1_DELTAMS_SCALE);
}

static std::size_t StrUbxSecOsnma(char* info, const std::size_t size, const uint8_t* msg, const std::size_t msg_size)
{
if ((msg_size < UBX_SEC_OSNMA_V3_MIN_SIZE) || (UBX_SEC_OSNMA_VERSION(msg) != UBX_SEC_OSNMA_V3_VERSION)) {
Expand Down Expand Up @@ -1267,6 +1292,7 @@ bool UbxGetMessageInfo(char* info, const std::size_t size, const uint8_t* msg, c
case UBX_NAV_TIMEBDS_MSGID: len = StrUbxNavTimebds(info, size, msg, msg_size); break;
case UBX_NAV_TIMEGLO_MSGID: len = StrUbxNavTimeglo(info, size, msg, msg_size); break;
case UBX_NAV_TIMEUTC_MSGID: len = StrUbxNavTimeutc(info, size, msg, msg_size); break;
case UBX_NAV_TIMETRUSTED_MSGID: len = StrUbxNavTimetrusted(info, size, msg, msg_size); break;
case UBX_NAV_ORB_MSGID: /* FALLTHROUGH */
case UBX_NAV_CLOCK_MSGID: /* FALLTHROUGH */
case UBX_NAV_DOP_MSGID: /* FALLTHROUGH */
Expand Down
Loading