diff --git a/src/u-blox_structs.h b/src/u-blox_structs.h index a749ce4..84872bb 100644 --- a/src/u-blox_structs.h +++ b/src/u-blox_structs.h @@ -753,6 +753,180 @@ typedef struct UBX_NAV_HPPOSLLH_data_t *callbackData; } UBX_NAV_HPPOSLLH_t; +// UBX-NAV-PVAT (0x01 0x17): Navigation position velocity attitude time solution +const uint16_t UBX_NAV_PVAT_LEN = 116; + +typedef struct +{ + uint32_t iTOW; // GPS time of week of the navigation epoch: ms + uint8_t version; // Message version (0x00 for this version) + union + { + uint8_t all; + struct + { + uint8_t validDate : 1; // 1 = valid UTC Date + uint8_t validTime : 1; // 1 = valid UTC time of day + uint8_t fullyResolved : 1; // 1 = UTC time of day has been fully resolved (no seconds uncertainty). + uint8_t validMag : 1; // 1 = valid magnetic declination + } bits; + } valid; + uint16_t year; // Year (UTC) + uint8_t month; // Month, range 1..12 (UTC) + uint8_t day; // Day of month, range 1..31 (UTC) + uint8_t hour; // Hour of day, range 0..23 (UTC) + uint8_t min; // Minute of hour, range 0..59 (UTC) + uint8_t sec; // Seconds of minute, range 0..60 (UTC) + uint8_t reserved0; + uint8_t reserved1[2]; + uint32_t tAcc; // Time accuracy estimate (UTC): ns + int32_t nano; // Fraction of second, range -1e9 .. 1e9 (UTC): ns + uint8_t fixType; // GNSSfix Type: + // 0: no fix + // 1: dead reckoning only + // 2: 2D-fix + // 3: 3D-fix + // 4: GNSS + dead reckoning combined + // 5: time only fix + union + { + uint8_t all; + struct + { + uint8_t gnssFixOK : 1; // 1 = valid fix (i.e within DOP & accuracy masks) + uint8_t diffSoln : 1; // 1 = differential corrections were applied + uint8_t reserved : 1; + uint8_t vehRollValid : 1; // 1 = roll of vehicle is valid, only set if the receiver is in sensor fusion mode + uint8_t vehPitchValid : 1; // 1 = pitch of vehicle is valid, only set if the receiver is in sensor fusion mode + uint8_t vehHeadingValid : 1; // 1 = heading of vehicle is valid, only set if the receiver is in sensor fusion mode + uint8_t carrSoln : 2; // Carrier phase range solution status: + // 0: no carrier phase range solution + // 1: carrier phase range solution with floating ambiguities + // 2: carrier phase range solution with fixed ambiguities + } bits; + } flags; + union + { + uint8_t all; + struct + { + uint8_t reserved : 5; + uint8_t confirmedAvai : 1; // 1 = information about UTC Date and Time of Day validity confirmation is available + uint8_t confirmedDate : 1; // 1 = UTC Date validity could be confirmed + uint8_t confirmedTime : 1; // 1 = UTC Time of Day could be confirmed + } bits; + } flags2; + uint8_t numSV; // Number of satellites used in Nav Solution + int32_t lon; // Longitude: deg * 1e-7 + int32_t lat; // Latitude: deg * 1e-7 + int32_t height; // Height above ellipsoid: mm + int32_t hMSL; // Height above mean sea level: mm + uint32_t hAcc; // Horizontal accuracy estimate: mm + uint32_t vAcc; // Vertical accuracy estimate: mm + int32_t velN; // NED north velocity: mm/s + int32_t velE; // NED east velocity: mm/s + int32_t velD; // NED down velocity: mm/s + int32_t gSpeed; // Ground Speed (2-D): mm/s + uint32_t sAcc; // Speed accuracy estimate: mm/s + int32_t vehRoll; // Vehicle roll: 1e-5 deg + int32_t vehPitch; // Vehicle pitch: 1e-5 deg + int32_t vehHeading; // Vehicle heading: 1e-5 deg + int32_t motHeading; // Motion heading.: 1e-5 deg + uint16_t accRoll; // Vehicle roll accuracy (if null, roll angle is not available): 1e-2 deg + uint16_t accPitch; // Vehicle pitch accuracy (if null, pitch angle is not available): 1e-2 deg + uint16_t accHeading; // Vehicle heading accuracy (if null, heading angle is not available): 1e-2 deg + int16_t magDec; // Magnetic declination: 1e-2 deg + uint16_t magAcc; // Magnetic declination accuracy: 1e-2 deg + uint16_t errEllipseOrient; // Orientation of semi-major axis of error ellipse (degrees from true north): 1e-2 deg + uint32_t errEllipseMajor; // Semi-major axis of error ellipse: mm + uint32_t errEllipseMinor; // Semi-minor axis of error ellipse: mm + uint8_t reserved2[4]; + uint8_t reserved3[4]; +} UBX_NAV_PVAT_data_t; + +typedef struct +{ + union + { + uint32_t all; + struct + { + uint32_t all : 1; + + uint32_t iTOW : 1; + uint32_t version : 1; + + uint32_t validDate : 1; + uint32_t validTime : 1; + uint32_t fullyResolved : 1; + uint32_t validMag : 1; + + uint32_t year : 1; + uint32_t month : 1; + uint32_t day : 1; + uint32_t hour : 1; + uint32_t min : 1; + uint32_t sec : 1; + + uint32_t tAcc : 1; + uint32_t nano : 1; + uint32_t fixType : 1; + + uint32_t gnssFixOK : 1; + uint32_t diffSoln : 1; + uint32_t vehRollValid : 1; + uint32_t vehPitchValid : 1; + uint32_t vehHeadingValid : 1; + uint32_t carrSoln : 1; + + uint32_t confirmedAvai : 1; + uint32_t confirmedDate : 1; + uint32_t confirmedTime : 1; + + uint32_t numSV : 1; + uint32_t lon : 1; + uint32_t lat : 1; + uint32_t height : 1; + uint32_t hMSL : 1; + uint32_t hAcc : 1; + uint32_t vAcc : 1; + } bits; + } moduleQueried1; + union + { + uint32_t all; + struct + { + uint32_t velN : 1; + uint32_t velE : 1; + uint32_t velD : 1; + uint32_t gSpeed : 1; + uint32_t sAcc : 1; + uint32_t vehRoll : 1; + uint32_t vehPitch : 1; + uint32_t vehHeading : 1; + uint32_t motHeading : 1; + uint32_t accRoll : 1; + uint32_t accPitch : 1; + uint32_t accHeading : 1; + uint32_t magDec : 1; + uint32_t magAcc : 1; + uint32_t errEllipseOrient : 1; + uint32_t errEllipseMajor : 1; + uint32_t errEllipseMinor : 1; + } bits; + } moduleQueried2; +} UBX_NAV_PVAT_moduleQueried_t; + +typedef struct +{ + ubxAutomaticFlags automaticFlags; + UBX_NAV_PVAT_data_t data; + UBX_NAV_PVAT_moduleQueried_t moduleQueried; + void (*callbackPointer)(UBX_NAV_PVAT_data_t); + UBX_NAV_PVAT_data_t *callbackData; +} UBX_NAV_PVAT_t; + // UBX-NAV-TIMEUTC (0x01 0x21): UTC time solution const uint16_t UBX_NAV_TIMEUTC_LEN = 20;