Adding NAVIC support

NAVIC constellation support added.

Change-Id: I30a61f53089177d4e02b617dc9b785c13e2ef6ee
CRs-Fixed: 2399619
This commit is contained in:
Saurabh Srivastava 2019-04-24 22:34:24 +05:30 committed by Gerrit - the friendly Code Review server
parent c08365ad60
commit 331c6d9893
7 changed files with 177 additions and 57 deletions

View file

@ -209,6 +209,9 @@ void convertGnssConstellationType(GnssSvType& in, V2_0::GnssConstellationType& o
case GNSS_SV_TYPE_GALILEO:
out = V2_0::GnssConstellationType::GALILEO;
break;
case GNSS_SV_TYPE_NAVIC:
out = V2_0::GnssConstellationType::IRNSS;
break;
case GNSS_SV_TYPE_UNKNOWN:
default:
out = V2_0::GnssConstellationType::UNKNOWN;

View file

@ -382,16 +382,19 @@ public:
uint32_t mBdsXtraAge;
uint32_t mGalXtraAge;
uint32_t mQzssXtraAge;
uint32_t mNavicXtraAge;
uint32_t mGpsXtraValid;
uint32_t mGloXtraValid;
uint64_t mBdsXtraValid;
uint64_t mGalXtraValid;
uint8_t mQzssXtraValid;
uint32_t mNavicXtraValid;
};
class SystemStatusPQWP3parser : public SystemStatusNmeaBase
{
private:
// todo: update for navic once available
enum
{
eTalker = 0,
@ -418,11 +421,13 @@ public:
inline uint32_t getBdsXtraAge() { return mP3.mBdsXtraAge; }
inline uint32_t getGalXtraAge() { return mP3.mGalXtraAge; }
inline uint32_t getQzssXtraAge() { return mP3.mQzssXtraAge; }
inline uint32_t getNavicXtraAge() { return mP3.mNavicXtraAge; }
inline uint32_t getGpsXtraValid() { return mP3.mGpsXtraValid; }
inline uint32_t getGloXtraValid() { return mP3.mGloXtraValid; }
inline uint64_t getBdsXtraValid() { return mP3.mBdsXtraValid; }
inline uint64_t getGalXtraValid() { return mP3.mGalXtraValid; }
inline uint8_t getQzssXtraValid() { return mP3.mQzssXtraValid; }
inline uint32_t getNavicXtraValid() { return mP3.mNavicXtraValid; }
SystemStatusPQWP3parser(const char *str_in, uint32_t len_in)
: SystemStatusNmeaBase(str_in, len_in)
@ -431,6 +436,7 @@ public:
return;
}
memset(&mP3, 0, sizeof(mP3));
// todo: update for navic once available
mP3.mXtraValidMask = strtol(mField[eXtraValidMask].c_str(), NULL, 16);
mP3.mGpsXtraAge = atoi(mField[eGpsXtraAge].c_str());
mP3.mGloXtraAge = atoi(mField[eGloXtraAge].c_str());
@ -511,21 +517,25 @@ public:
uint64_t mBdsUnknownMask;
uint64_t mGalUnknownMask;
uint8_t mQzssUnknownMask;
uint32_t mNavicUnknownMask;
uint32_t mGpsGoodMask;
uint32_t mGloGoodMask;
uint64_t mBdsGoodMask;
uint64_t mGalGoodMask;
uint8_t mQzssGoodMask;
uint32_t mNavicGoodMask;
uint32_t mGpsBadMask;
uint32_t mGloBadMask;
uint64_t mBdsBadMask;
uint64_t mGalBadMask;
uint8_t mQzssBadMask;
uint32_t mNavicBadMask;
};
class SystemStatusPQWP5parser : public SystemStatusNmeaBase
{
private:
// todo: update for navic once available
enum
{
eTalker = 0,
@ -555,16 +565,19 @@ public:
inline uint64_t getBdsUnknownMask() { return mP5.mBdsUnknownMask; }
inline uint64_t getGalUnknownMask() { return mP5.mGalUnknownMask; }
inline uint8_t getQzssUnknownMask() { return mP5.mQzssUnknownMask; }
inline uint32_t getNavicUnknownMask() { return mP5.mNavicUnknownMask; }
inline uint32_t getGpsGoodMask() { return mP5.mGpsGoodMask; }
inline uint32_t getGloGoodMask() { return mP5.mGloGoodMask; }
inline uint64_t getBdsGoodMask() { return mP5.mBdsGoodMask; }
inline uint64_t getGalGoodMask() { return mP5.mGalGoodMask; }
inline uint8_t getQzssGoodMask() { return mP5.mQzssGoodMask; }
inline uint32_t getNavicGoodMask() { return mP5.mNavicGoodMask; }
inline uint32_t getGpsBadMask() { return mP5.mGpsBadMask; }
inline uint32_t getGloBadMask() { return mP5.mGloBadMask; }
inline uint64_t getBdsBadMask() { return mP5.mBdsBadMask; }
inline uint64_t getGalBadMask() { return mP5.mGalBadMask; }
inline uint8_t getQzssBadMask() { return mP5.mQzssBadMask; }
inline uint32_t getNavicBadMask() { return mP5.mNavicBadMask; }
SystemStatusPQWP5parser(const char *str_in, uint32_t len_in)
: SystemStatusNmeaBase(str_in, len_in)
@ -573,6 +586,7 @@ public:
return;
}
memset(&mP5, 0, sizeof(mP5));
// todo: update for navic once available
mP5.mGpsUnknownMask = strtol(mField[eGpsUnknownMask].c_str(), NULL, 16);
mP5.mGloUnknownMask = strtol(mField[eGloUnknownMask].c_str(), NULL, 16);
mP5.mBdsUnknownMask = strtol(mField[eBdsUnknownMask].c_str(), NULL, 16);
@ -971,11 +985,13 @@ SystemStatusXtra::SystemStatusXtra(const SystemStatusPQWP3& nmea) :
mBdsXtraAge(nmea.mBdsXtraAge),
mGalXtraAge(nmea.mGalXtraAge),
mQzssXtraAge(nmea.mQzssXtraAge),
mNavicXtraAge(nmea.mNavicXtraAge),
mGpsXtraValid(nmea.mGpsXtraValid),
mGloXtraValid(nmea.mGloXtraValid),
mBdsXtraValid(nmea.mBdsXtraValid),
mGalXtraValid(nmea.mGalXtraValid),
mQzssXtraValid(nmea.mQzssXtraValid)
mQzssXtraValid(nmea.mQzssXtraValid),
mNavicXtraValid(nmea.mNavicXtraValid)
{
}
@ -987,11 +1003,13 @@ bool SystemStatusXtra::equals(const SystemStatusXtra& peer)
(mBdsXtraAge != peer.mBdsXtraAge) ||
(mGalXtraAge != peer.mGalXtraAge) ||
(mQzssXtraAge != peer.mQzssXtraAge) ||
(mNavicXtraAge != peer.mNavicXtraAge) ||
(mGpsXtraValid != peer.mGpsXtraValid) ||
(mGloXtraValid != peer.mGloXtraValid) ||
(mBdsXtraValid != peer.mBdsXtraValid) ||
(mGalXtraValid != peer.mGalXtraValid) ||
(mQzssXtraValid != peer.mQzssXtraValid)) {
(mQzssXtraValid != peer.mQzssXtraValid) ||
(mNavicXtraValid != peer.mNavicXtraValid)) {
return false;
}
return true;
@ -1060,16 +1078,19 @@ SystemStatusSvHealth::SystemStatusSvHealth(const SystemStatusPQWP5& nmea) :
mBdsUnknownMask(nmea.mBdsUnknownMask),
mGalUnknownMask(nmea.mGalUnknownMask),
mQzssUnknownMask(nmea.mQzssUnknownMask),
mNavicUnknownMask(nmea.mNavicUnknownMask),
mGpsGoodMask(nmea.mGpsGoodMask),
mGloGoodMask(nmea.mGloGoodMask),
mBdsGoodMask(nmea.mBdsGoodMask),
mGalGoodMask(nmea.mGalGoodMask),
mQzssGoodMask(nmea.mQzssGoodMask),
mNavicGoodMask(nmea.mNavicGoodMask),
mGpsBadMask(nmea.mGpsBadMask),
mGloBadMask(nmea.mGloBadMask),
mBdsBadMask(nmea.mBdsBadMask),
mGalBadMask(nmea.mGalBadMask),
mQzssBadMask(nmea.mQzssBadMask)
mQzssBadMask(nmea.mQzssBadMask),
mNavicBadMask(nmea.mNavicBadMask)
{
}

View file

@ -44,20 +44,22 @@
#include <gps_extended_c.h>
#define GPS_MIN (1) //1-32
#define SBAS_MIN (33)
#define GLO_MIN (65) //65-88
#define QZSS_MIN (193) //193-197
#define BDS_MIN (201) //201-237
#define GAL_MIN (301) //301-336
#define GPS_MIN (1) //1-32
#define SBAS_MIN (33)
#define GLO_MIN (65) //65-88
#define QZSS_MIN (193) //193-197
#define BDS_MIN (201) //201-237
#define GAL_MIN (301) //301-336
#define NAVIC_MIN (401) //401-414
#define GPS_NUM (32)
#define SBAS_NUM (32)
#define GLO_NUM (24)
#define QZSS_NUM (5)
#define BDS_NUM (37)
#define GAL_NUM (36)
#define SV_ALL_NUM (GPS_NUM+GLO_NUM+QZSS_NUM+BDS_NUM+GAL_NUM) //=134
#define GPS_NUM (32)
#define SBAS_NUM (32)
#define GLO_NUM (24)
#define QZSS_NUM (5)
#define BDS_NUM (37)
#define GAL_NUM (36)
#define NAVIC_NUM (14)
#define SV_ALL_NUM (GPS_NUM+GLO_NUM+QZSS_NUM+BDS_NUM+GAL_NUM+NAVIC_NUM) //=148
namespace loc_core
{
@ -258,11 +260,13 @@ public:
uint32_t mBdsXtraAge;
uint32_t mGalXtraAge;
uint32_t mQzssXtraAge;
uint32_t mNavicXtraAge;
uint32_t mGpsXtraValid;
uint32_t mGloXtraValid;
uint64_t mBdsXtraValid;
uint64_t mGalXtraValid;
uint8_t mQzssXtraValid;
uint32_t mNavicXtraValid;
inline SystemStatusXtra() :
mXtraValidMask(0),
mGpsXtraAge(0),
@ -270,11 +274,13 @@ public:
mBdsXtraAge(0),
mGalXtraAge(0),
mQzssXtraAge(0),
mNavicXtraAge(0),
mGpsXtraValid(0),
mGloXtraValid(0),
mBdsXtraValid(0ULL),
mGalXtraValid(0ULL),
mQzssXtraValid(0) {}
mQzssXtraValid(0),
mNavicXtraValid(0) {}
inline SystemStatusXtra(const SystemStatusPQWP3& nmea);
bool equals(const SystemStatusXtra& peer);
void dump(void);
@ -309,32 +315,38 @@ public:
uint64_t mBdsUnknownMask;
uint64_t mGalUnknownMask;
uint8_t mQzssUnknownMask;
uint32_t mNavicUnknownMask;
uint32_t mGpsGoodMask;
uint32_t mGloGoodMask;
uint64_t mBdsGoodMask;
uint64_t mGalGoodMask;
uint8_t mQzssGoodMask;
uint32_t mNavicGoodMask;
uint32_t mGpsBadMask;
uint32_t mGloBadMask;
uint64_t mBdsBadMask;
uint64_t mGalBadMask;
uint8_t mQzssBadMask;
uint32_t mNavicBadMask;
inline SystemStatusSvHealth() :
mGpsUnknownMask(0),
mGloUnknownMask(0),
mBdsUnknownMask(0ULL),
mGalUnknownMask(0ULL),
mQzssUnknownMask(0),
mNavicUnknownMask(0),
mGpsGoodMask(0),
mGloGoodMask(0),
mBdsGoodMask(0ULL),
mGalGoodMask(0ULL),
mQzssGoodMask(0),
mNavicGoodMask(0),
mGpsBadMask(0),
mGloBadMask(0),
mBdsBadMask(0ULL),
mGalBadMask(0ULL),
mQzssBadMask(0) {}
mQzssBadMask(0),
mNavicBadMask(0) {}
inline SystemStatusSvHealth(const SystemStatusPQWP5& nmea);
bool equals(const SystemStatusSvHealth& peer);
void dump(void);

View file

@ -3364,6 +3364,11 @@ GnssAdapter::reportSv(GnssSvNotification& svNotify)
// SV id passed to here by LocApi is 1-based.
svNotify.gnssSvs[i].svId += (QZSS_SV_PRN_MIN - 1);
break;
case GNSS_SV_TYPE_NAVIC:
if (mGnssSvIdUsedInPosAvail) {
svUsedIdMask = mGnssSvIdUsedInPosition.navic_sv_used_ids_mask;
}
break;
default:
svUsedIdMask = 0;
break;
@ -4384,6 +4389,19 @@ void GnssAdapter::convertSatelliteInfo(std::vector<GnssDebugSatelliteInfo>& out,
server_perdiction_age = (float)(in.mXtra.back().mGalXtraAge);
}
break;
case GNSS_SV_TYPE_NAVIC:
svid_min = GNSS_BUGREPORT_NAVIC_MIN;
svid_num = NAVIC_NUM;
svid_idx = GPS_NUM+GLO_NUM+QZSS_NUM+BDS_NUM+GAL_NUM;
if (!in.mSvHealth.empty()) {
eph_health_good_mask = in.mSvHealth.back().mNavicGoodMask;
eph_health_bad_mask = in.mSvHealth.back().mNavicBadMask;
}
if (!in.mXtra.empty()) {
server_perdiction_available_mask = in.mXtra.back().mNavicXtraValid;
server_perdiction_age = (float)(in.mXtra.back().mNavicXtraAge);
}
break;
default:
return;
}
@ -4541,6 +4559,7 @@ bool GnssAdapter::getDebugReport(GnssDebugReport& r)
convertSatelliteInfo(r.mSatelliteInfo, GNSS_SV_TYPE_QZSS, reports);
convertSatelliteInfo(r.mSatelliteInfo, GNSS_SV_TYPE_BEIDOU, reports);
convertSatelliteInfo(r.mSatelliteInfo, GNSS_SV_TYPE_GALILEO, reports);
convertSatelliteInfo(r.mSatelliteInfo, GNSS_SV_TYPE_NAVIC, reports);
LOC_LOGV("getDebugReport - satellite=%zu", r.mSatelliteInfo.size());
return true;

View file

@ -41,12 +41,13 @@
#define GNSS_MEASUREMENTS_MAX (128)
#define GNSS_UTC_TIME_OFFSET (3657)
#define GNSS_BUGREPORT_GPS_MIN (1)
#define GNSS_BUGREPORT_SBAS_MIN (120)
#define GNSS_BUGREPORT_GLO_MIN (1)
#define GNSS_BUGREPORT_QZSS_MIN (193)
#define GNSS_BUGREPORT_BDS_MIN (1)
#define GNSS_BUGREPORT_GAL_MIN (1)
#define GNSS_BUGREPORT_GPS_MIN (1)
#define GNSS_BUGREPORT_SBAS_MIN (120)
#define GNSS_BUGREPORT_GLO_MIN (1)
#define GNSS_BUGREPORT_QZSS_MIN (193)
#define GNSS_BUGREPORT_BDS_MIN (1)
#define GNSS_BUGREPORT_GAL_MIN (1)
#define GNSS_BUGREPORT_NAVIC_MIN (1)
#define GNSS_MAX_NAME_LENGTH (8)
@ -349,6 +350,7 @@ typedef enum {
GNSS_SV_TYPE_QZSS,
GNSS_SV_TYPE_BEIDOU,
GNSS_SV_TYPE_GALILEO,
GNSS_SV_TYPE_NAVIC,
} GnssSvType;
typedef enum {
@ -518,6 +520,7 @@ typedef enum {
GNSS_AIDING_DATA_SV_TYPE_QZSS_BIT = (1<<2),
GNSS_AIDING_DATA_SV_TYPE_BEIDOU_BIT = (1<<3),
GNSS_AIDING_DATA_SV_TYPE_GALILEO_BIT = (1<<4),
GNSS_AIDING_DATA_SV_TYPE_NAVIC_BIT = (1<<5),
} GnssAidingDataSvTypeBits;
/* Gnss constellation type mask */
@ -528,13 +531,15 @@ typedef enum {
GNSS_CONSTELLATION_TYPE_QZSS_BIT = (1<<2),
GNSS_CONSTELLATION_TYPE_BEIDOU_BIT = (1<<3),
GNSS_CONSTELLATION_TYPE_GALILEO_BIT = (1<<4),
GNSS_CONSTELLATION_TYPE_SBAS_BIT = (1<<5)
GNSS_CONSTELLATION_TYPE_SBAS_BIT = (1<<5),
GNSS_CONSTELLATION_TYPE_NAVIC_BIT = (1<<6)
} GnssConstellationTypeBits;
#define GNSS_CONSTELLATION_TYPE_MASK_ALL\
(GNSS_CONSTELLATION_TYPE_GPS_BIT | GNSS_CONSTELLATION_TYPE_GLONASS_BIT |\
GNSS_CONSTELLATION_TYPE_QZSS_BIT | GNSS_CONSTELLATION_TYPE_BEIDOU_BIT |\
GNSS_CONSTELLATION_TYPE_GALILEO_BIT | GNSS_CONSTELLATION_TYPE_SBAS_BIT)
GNSS_CONSTELLATION_TYPE_GALILEO_BIT | GNSS_CONSTELLATION_TYPE_SBAS_BIT |\
GNSS_CONSTELLATION_TYPE_NAVIC_BIT)
/** GNSS Signal Type and RF Band */
typedef uint32_t GnssSignalTypeMask;
@ -574,7 +579,9 @@ typedef enum {
/** QZSS L5 RF Band */
GNSS_SIGNAL_QZSS_L5 = (1<<16),
/** SBAS L1 RF Band */
GNSS_SIGNAL_SBAS_L1 = (1<<17)
GNSS_SIGNAL_SBAS_L1 = (1<<17),
/** NAVIC L5 RF Band */
GNSS_SIGNAL_NAVIC_L5 = (1<<18)
} GnssSignalTypeBits;
#define GNSS_SIGNAL_TYPE_MASK_ALL\
@ -583,7 +590,8 @@ typedef enum {
GNSS_SIGNAL_GALILEO_E1 | GNSS_SIGNAL_GALILEO_E5A | GNSS_SIGNAL_GALILEO_E5B |\
GNSS_SIGNAL_BEIDOU_B1I | GNSS_SIGNAL_BEIDOU_B1C | GNSS_SIGNAL_BEIDOU_B2I|\
GNSS_SIGNAL_BEIDOU_B2AI | GNSS_SIGNAL_QZSS_L1CA | GNSS_SIGNAL_QZSS_L1S |\
GNSS_SIGNAL_QZSS_L2| GNSS_SIGNAL_QZSS_L5 | GNSS_SIGNAL_SBAS_L1)
GNSS_SIGNAL_QZSS_L2| GNSS_SIGNAL_QZSS_L5 | GNSS_SIGNAL_SBAS_L1 |\
GNSS_SIGNAL_NAVIC_L5)
typedef enum
{
@ -599,7 +607,9 @@ typedef enum
/**< GLONASS satellite. */
GNSS_LOC_SV_SYSTEM_BDS = 5,
/**< BDS satellite. */
GNSS_LOC_SV_SYSTEM_QZSS = 6
GNSS_LOC_SV_SYSTEM_QZSS = 6,
/**< QZSS satellite. */
GNSS_LOC_SV_SYSTEM_NAVIC = 7
/**< QZSS satellite. */
} Gnss_LocSvSystemEnumType;
@ -622,7 +632,8 @@ typedef enum {
GNSS_LOC_SIGNAL_TYPE_QZSS_L2C_L = 15, /**< QZSS L2C_L RF Band */
GNSS_LOC_SIGNAL_TYPE_QZSS_L5_Q = 16, /**< QZSS L5_Q RF Band */
GNSS_LOC_SIGNAL_TYPE_SBAS_L1_CA = 17, /**< SBAS L1_CA RF Band */
GNSS_LOC_MAX_NUMBER_OF_SIGNAL_TYPES = 18 /**< Maximum number of signal types */
GNSS_LOC_SIGNAL_TYPE_NAVIC_L5 = 18, /**< NAVIC L5 RF Band */
GNSS_LOC_MAX_NUMBER_OF_SIGNAL_TYPES = 19 /**< Maximum number of signal types */
} Gnss_LocSignalEnumType;
typedef uint64_t GnssDataMask;
@ -799,6 +810,7 @@ typedef struct {
uint64_t galSvUsedIdsMask;
uint64_t bdsSvUsedIdsMask;
uint64_t qzssSvUsedIdsMask;
uint64_t navicSvUsedIdsMask;
} GnssLocationSvUsedInPosition;
typedef struct {
@ -812,7 +824,8 @@ typedef struct {
For SBAS: 120 to 151
For QZSS-L1CA:193 to 197
For BDS: 201 to 237
For GAL: 301 to 336 */
For GAL: 301 to 336
For NAVIC: 401 to 414 */
uint16_t gnssSvId;
} GnssMeasUsageInfo;
@ -907,7 +920,8 @@ typedef union {
GnssSystemTimeStructType galSystemTime;
GnssSystemTimeStructType bdsSystemTime;
GnssSystemTimeStructType qzssSystemTime;
GnssGloTimeStructType gloSystemTime;
GnssGloTimeStructType gloSystemTime;
GnssSystemTimeStructType navicSystemTime;
} SystemTimeStructUnion;
/** Time applicability of PVT report */
typedef struct {

View file

@ -434,6 +434,8 @@ typedef uint32_t GnssAdditionalSystemInfoMask;
#define BDS_SV_PRN_MAX 235
#define GAL_SV_PRN_MIN 301
#define GAL_SV_PRN_MAX 336
#define NAVIC_SV_PRN_MIN 401
#define NAVIC_SV_PRN_MAX 414
typedef uint32_t LocPosTechMask;
#define LOC_POS_TECH_MASK_DEFAULT ((LocPosTechMask)0x00000000)
@ -467,6 +469,7 @@ typedef struct {
uint64_t gal_sv_used_ids_mask;
uint64_t bds_sv_used_ids_mask;
uint64_t qzss_sv_used_ids_mask;
uint64_t navic_sv_used_ids_mask;
} GnssSvUsedInPosition;
typedef struct {
@ -594,6 +597,8 @@ typedef uint32_t GnssSignalTypeMask;
#define GNSS_SIGNAL_QZSS_L5 ((GnssSignalTypeMask)0x00010000ul)
/** SBAS L1 RF Band */
#define GNSS_SIGNAL_SBAS_L1 ((GnssSignalTypeMask)0x00020000ul)
/** NAVIC L5 RF Band */
#define GNSS_SIGNAL_NAVIC_L5 ((GnssSignalTypeMask)0x00040000ul)
typedef uint16_t GnssMeasUsageStatusBitMask;
/** Used in fix */
@ -1352,26 +1357,32 @@ typedef struct
typedef uint64_t GpsSvMeasHeaderFlags;
#define GNSS_SV_MEAS_HEADER_HAS_LEAP_SECOND 0x00000001
#define GNSS_SV_MEAS_HEADER_HAS_CLOCK_FREQ 0x00000002
#define GNSS_SV_MEAS_HEADER_HAS_AP_TIMESTAMP 0x00000004
#define GNSS_SV_MEAS_HEADER_HAS_GPS_GLO_INTER_SYSTEM_BIAS 0x00000008
#define GNSS_SV_MEAS_HEADER_HAS_GPS_BDS_INTER_SYSTEM_BIAS 0x00000010
#define GNSS_SV_MEAS_HEADER_HAS_GPS_GAL_INTER_SYSTEM_BIAS 0x00000020
#define GNSS_SV_MEAS_HEADER_HAS_BDS_GLO_INTER_SYSTEM_BIAS 0x00000040
#define GNSS_SV_MEAS_HEADER_HAS_GAL_GLO_INTER_SYSTEM_BIAS 0x00000080
#define GNSS_SV_MEAS_HEADER_HAS_GAL_BDS_INTER_SYSTEM_BIAS 0x00000100
#define GNSS_SV_MEAS_HEADER_HAS_GPS_SYSTEM_TIME 0x00000200
#define GNSS_SV_MEAS_HEADER_HAS_GAL_SYSTEM_TIME 0x00000400
#define GNSS_SV_MEAS_HEADER_HAS_BDS_SYSTEM_TIME 0x00000800
#define GNSS_SV_MEAS_HEADER_HAS_QZSS_SYSTEM_TIME 0x00001000
#define GNSS_SV_MEAS_HEADER_HAS_GLO_SYSTEM_TIME 0x00002000
#define GNSS_SV_MEAS_HEADER_HAS_GPS_SYSTEM_TIME_EXT 0x00004000
#define GNSS_SV_MEAS_HEADER_HAS_GAL_SYSTEM_TIME_EXT 0x00008000
#define GNSS_SV_MEAS_HEADER_HAS_BDS_SYSTEM_TIME_EXT 0x00010000
#define GNSS_SV_MEAS_HEADER_HAS_QZSS_SYSTEM_TIME_EXT 0x00020000
#define GNSS_SV_MEAS_HEADER_HAS_GPSL1L5_TIME_BIAS 0x00040000
#define GNSS_SV_MEAS_HEADER_HAS_GALE1E5A_TIME_BIAS 0x00080000
#define GNSS_SV_MEAS_HEADER_HAS_LEAP_SECOND 0x00000001
#define GNSS_SV_MEAS_HEADER_HAS_CLOCK_FREQ 0x00000002
#define GNSS_SV_MEAS_HEADER_HAS_AP_TIMESTAMP 0x00000004
#define GNSS_SV_MEAS_HEADER_HAS_GPS_GLO_INTER_SYSTEM_BIAS 0x00000008
#define GNSS_SV_MEAS_HEADER_HAS_GPS_BDS_INTER_SYSTEM_BIAS 0x00000010
#define GNSS_SV_MEAS_HEADER_HAS_GPS_GAL_INTER_SYSTEM_BIAS 0x00000020
#define GNSS_SV_MEAS_HEADER_HAS_BDS_GLO_INTER_SYSTEM_BIAS 0x00000040
#define GNSS_SV_MEAS_HEADER_HAS_GAL_GLO_INTER_SYSTEM_BIAS 0x00000080
#define GNSS_SV_MEAS_HEADER_HAS_GAL_BDS_INTER_SYSTEM_BIAS 0x00000100
#define GNSS_SV_MEAS_HEADER_HAS_GPS_SYSTEM_TIME 0x00000200
#define GNSS_SV_MEAS_HEADER_HAS_GAL_SYSTEM_TIME 0x00000400
#define GNSS_SV_MEAS_HEADER_HAS_BDS_SYSTEM_TIME 0x00000800
#define GNSS_SV_MEAS_HEADER_HAS_QZSS_SYSTEM_TIME 0x00001000
#define GNSS_SV_MEAS_HEADER_HAS_GLO_SYSTEM_TIME 0x00002000
#define GNSS_SV_MEAS_HEADER_HAS_GPS_SYSTEM_TIME_EXT 0x00004000
#define GNSS_SV_MEAS_HEADER_HAS_GAL_SYSTEM_TIME_EXT 0x00008000
#define GNSS_SV_MEAS_HEADER_HAS_BDS_SYSTEM_TIME_EXT 0x00010000
#define GNSS_SV_MEAS_HEADER_HAS_QZSS_SYSTEM_TIME_EXT 0x00020000
#define GNSS_SV_MEAS_HEADER_HAS_GPSL1L5_TIME_BIAS 0x00040000
#define GNSS_SV_MEAS_HEADER_HAS_GALE1E5A_TIME_BIAS 0x00080000
#define GNSS_SV_MEAS_HEADER_HAS_GPS_NAVIC_INTER_SYSTEM_BIAS 0x00100000
#define GNSS_SV_MEAS_HEADER_HAS_GAL_NAVIC_INTER_SYSTEM_BIAS 0x00200000
#define GNSS_SV_MEAS_HEADER_HAS_GLO_NAVIC_INTER_SYSTEM_BIAS 0x00400000
#define GNSS_SV_MEAS_HEADER_HAS_BDS_NAVIC_INTER_SYSTEM_BIAS 0x00800000
#define GNSS_SV_MEAS_HEADER_HAS_NAVIC_SYSTEM_TIME 0x01000000
#define GNSS_SV_MEAS_HEADER_HAS_NAVIC_SYSTEM_TIME_EXT 0x02000000
@ -1393,6 +1404,10 @@ typedef struct
Gnss_InterSystemBiasStructType bdsGloInterSystemBias;
Gnss_InterSystemBiasStructType galGloInterSystemBias;
Gnss_InterSystemBiasStructType galBdsInterSystemBias;
Gnss_InterSystemBiasStructType gpsNavicInterSystemBias;
Gnss_InterSystemBiasStructType galNavicInterSystemBias;
Gnss_InterSystemBiasStructType gloNavicInterSystemBias;
Gnss_InterSystemBiasStructType bdsNavicInterSystemBias;
Gnss_InterSystemBiasStructType gpsL1L5TimeBias;
Gnss_InterSystemBiasStructType galE1E5aTimeBias;
@ -1400,6 +1415,7 @@ typedef struct
GnssSystemTimeStructType galSystemTime;
GnssSystemTimeStructType bdsSystemTime;
GnssSystemTimeStructType qzssSystemTime;
GnssSystemTimeStructType navicSystemTime;
GnssGloTimeStructType gloSystemTime;
/** GPS system RTC time information. */
@ -1410,6 +1426,8 @@ typedef struct
Gnss_LocGnssTimeExtStructType bdsSystemTimeExt;
/** QZSS system RTC time information. */
Gnss_LocGnssTimeExtStructType qzssSystemTimeExt;
/** NAVIC system RTC time information. */
Gnss_LocGnssTimeExtStructType navicSystemTimeExt;
} GnssSvMeasurementHeader;
@ -2025,10 +2043,11 @@ typedef struct
/* Mask indicating enabled or disabled constellations */
typedef uint64_t GnssSvTypesMask;
typedef enum {
GNSS_SV_TYPES_MASK_GLO_BIT = (1<<0),
GNSS_SV_TYPES_MASK_BDS_BIT = (1<<1),
GNSS_SV_TYPES_MASK_QZSS_BIT = (1<<2),
GNSS_SV_TYPES_MASK_GAL_BIT = (1<<3),
GNSS_SV_TYPES_MASK_GLO_BIT = (1<<0),
GNSS_SV_TYPES_MASK_BDS_BIT = (1<<1),
GNSS_SV_TYPES_MASK_QZSS_BIT = (1<<2),
GNSS_SV_TYPES_MASK_GAL_BIT = (1<<3),
GNSS_SV_TYPES_MASK_NAVIC_BIT = (1<<4),
} GnssSvTypesMaskBits;
/* This SV Type config is injected directly to GNSS Adapter

View file

@ -123,6 +123,7 @@ typedef struct loc_sv_cache_info_s
uint32_t gal_used_mask;
uint32_t qzss_used_mask;
uint32_t bds_used_mask;
uint32_t navic_used_mask;
uint32_t gps_l1_count;
uint32_t gps_l5_count;
uint32_t glo_g1_count;
@ -133,6 +134,7 @@ typedef struct loc_sv_cache_info_s
uint32_t qzss_l5_count;
uint32_t bds_b1_count;
uint32_t bds_b2_count;
uint32_t navic_l5_count;
float hdop;
float pdop;
float vdop;
@ -324,6 +326,9 @@ static uint32_t convert_signalType_to_signalId(GnssSignalTypeMask signalType)
case GNSS_SIGNAL_BEIDOU_B2AI:
signalId = SIGNAL_ID_BDS_B2A;
break;
case GNSS_SIGNAL_NAVIC_L5:
signalId = SIGNAL_ID_NAVIC_L5SPS;
break;
default:
signalId = SIGNAL_ID_ALL_SIGNALS;
}
@ -418,6 +423,16 @@ static loc_nmea_sv_meta* loc_nmea_sv_meta_init(loc_nmea_sv_meta& sv_meta,
sv_meta.svCount = sv_cache_info.bds_b2_count;
}
break;
case GNSS_SV_TYPE_NAVIC:
sv_meta.talker[0] = 'G';
sv_meta.talker[1] = 'I';
sv_meta.mask = sv_cache_info.navic_used_mask;
// NAVIC SV ids are from 401-414. So keep svIdOffset 0
sv_meta.systemId = SYSTEM_ID_NAVIC;
if (GNSS_SIGNAL_NAVIC_L5 == signalType) {
sv_meta.svCount = sv_cache_info.navic_l5_count;
}
break;
default:
LOC_LOGE("NMEA Error unknow constellation type: %d", svType);
return NULL;
@ -428,7 +443,8 @@ static loc_nmea_sv_meta* loc_nmea_sv_meta_init(loc_nmea_sv_meta& sv_meta,
(sv_cache_info.glo_used_mask ? 1 : 0) +
(sv_cache_info.gal_used_mask ? 1 : 0) +
(sv_cache_info.qzss_used_mask ? 1 : 0) +
(sv_cache_info.bds_used_mask ? 1 : 0) > 1)
(sv_cache_info.bds_used_mask ? 1 : 0) +
(sv_cache_info.navic_used_mask ? 1 : 0) > 1)
{
// If GPS, GLONASS, Galileo, QZSS, BDS etc. are combined
// to obtain the reported position solution,
@ -701,6 +717,9 @@ static void loc_nmea_generate_GSV(const GnssSvNotification &svNotify,
case GNSS_SV_TYPE_SBAS:
signalType = GNSS_SIGNAL_SBAS_L1;
break;
case GNSS_SV_TYPE_NAVIC:
signalType = GNSS_SIGNAL_NAVIC_L5;
break;
default:
LOC_LOGE("NMEA Error unknow constellation type: %d",
svNotify.gnssSvs[svNumber - 1].type);
@ -1815,6 +1834,19 @@ void loc_nmea_generate_sv(const GnssSvNotification &svNotify,
sv_cache_info.bds_b1_count++;
}
}
else if (GNSS_SV_TYPE_NAVIC == svNotify.gnssSvs[svNumber - 1].type)
{
// cache the used in fix mask, as it will be needed to send $PQGSA
// during the position report
if (GNSS_SV_OPTIONS_USED_IN_FIX_BIT ==
(svNotify.gnssSvs[svNumber - 1].gnssSvOptionsMask &
GNSS_SV_OPTIONS_USED_IN_FIX_BIT))
{
sv_cache_info.navic_used_mask |= (1 << (svNotify.gnssSvs[svNumber - 1].svId - 1));
}
// GNSS_SIGNAL_NAVIC_L5 is the only signal type for NAVIC
sv_cache_info.navic_l5_count++;
}
}
loc_nmea_sv_meta sv_meta;