SV "in-use" flags are not being set correctly for

multiband enabled devices

Change-Id: I875b535063c6aa6ecb713c7b6abff123d8402d62
CRs-fixed: 2443087
This commit is contained in:
Mike Cailean 2019-04-28 08:16:57 -07:00
parent 4d6bb2da93
commit 76e761da5a
3 changed files with 121 additions and 6 deletions

View file

@ -95,7 +95,10 @@ GnssAdapter::GnssAdapter() :
mAllowFlpNetworkFixes(0), mAllowFlpNetworkFixes(0),
mGnssEnergyConsumedCb(nullptr), mGnssEnergyConsumedCb(nullptr),
mPowerStateCb(nullptr), mPowerStateCb(nullptr),
mIsE911Session(NULL) mIsE911Session(NULL),
mGnssMbSvIdUsedInPosition{},
mGnssMbSvIdUsedInPosAvail(false),
mGnssSignalType()
{ {
LOC_LOGD("%s]: Constructor %p", __func__, this); LOC_LOGD("%s]: Constructor %p", __func__, this);
mLocPositionMode.mode = LOC_POSITION_MODE_INVALID; mLocPositionMode.mode = LOC_POSITION_MODE_INVALID;
@ -3136,10 +3139,18 @@ GnssAdapter::reportPosition(const UlpLocation& ulpLocation,
} }
mGnssSvIdUsedInPosAvail = false; mGnssSvIdUsedInPosAvail = false;
mGnssMbSvIdUsedInPosAvail = false;
if (reportToGnssClient) { if (reportToGnssClient) {
if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_GNSS_SV_USED_DATA) { if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_GNSS_SV_USED_DATA) {
mGnssSvIdUsedInPosAvail = true; mGnssSvIdUsedInPosAvail = true;
mGnssSvIdUsedInPosition = locationExtended.gnss_sv_used_ids; mGnssSvIdUsedInPosition = locationExtended.gnss_sv_used_ids;
if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_MULTIBAND) {
mGnssMbSvIdUsedInPosAvail = true;
mGnssMbSvIdUsedInPosition = locationExtended.gnss_mb_sv_used_ids;
for (int i = 0; i < GNSS_SV_MAX; i++) {
mGnssSignalType[i] = locationExtended.measUsageInfo[i].gnssSignalType;
}
}
} }
// if engine hub is running and the fix is from sensor, e.g.: DRE, // if engine hub is running and the fix is from sensor, e.g.: DRE,
@ -3210,28 +3221,104 @@ GnssAdapter::reportSv(GnssSvNotification& svNotify)
switch (svNotify.gnssSvs[i].type) { switch (svNotify.gnssSvs[i].type) {
case GNSS_SV_TYPE_GPS: case GNSS_SV_TYPE_GPS:
if (mGnssSvIdUsedInPosAvail) { if (mGnssSvIdUsedInPosAvail) {
if (mGnssMbSvIdUsedInPosAvail) {
switch (mGnssSignalType[i]) {
case GNSS_SIGNAL_GPS_L1CA:
svUsedIdMask = mGnssMbSvIdUsedInPosition.gps_l1ca_sv_used_ids_mask;
break;
case GNSS_SIGNAL_GPS_L1C:
svUsedIdMask = mGnssMbSvIdUsedInPosition.gps_l1c_sv_used_ids_mask;
break;
case GNSS_SIGNAL_GPS_L2:
svUsedIdMask = mGnssMbSvIdUsedInPosition.gps_l2_sv_used_ids_mask;
break;
case GNSS_SIGNAL_GPS_L5:
svUsedIdMask = mGnssMbSvIdUsedInPosition.gps_l5_sv_used_ids_mask;
break;
}
} else {
svUsedIdMask = mGnssSvIdUsedInPosition.gps_sv_used_ids_mask; svUsedIdMask = mGnssSvIdUsedInPosition.gps_sv_used_ids_mask;
} }
}
break; break;
case GNSS_SV_TYPE_GLONASS: case GNSS_SV_TYPE_GLONASS:
if (mGnssSvIdUsedInPosAvail) { if (mGnssSvIdUsedInPosAvail) {
if (mGnssMbSvIdUsedInPosAvail) {
switch (mGnssSignalType[i]) {
case GNSS_SIGNAL_GLONASS_G1:
svUsedIdMask = mGnssMbSvIdUsedInPosition.glo_g1_sv_used_ids_mask;
break;
case GNSS_SIGNAL_GLONASS_G2:
svUsedIdMask = mGnssMbSvIdUsedInPosition.glo_g2_sv_used_ids_mask;
break;
}
} else {
svUsedIdMask = mGnssSvIdUsedInPosition.glo_sv_used_ids_mask; svUsedIdMask = mGnssSvIdUsedInPosition.glo_sv_used_ids_mask;
} }
}
break; break;
case GNSS_SV_TYPE_BEIDOU: case GNSS_SV_TYPE_BEIDOU:
if (mGnssSvIdUsedInPosAvail) { if (mGnssSvIdUsedInPosAvail) {
if (mGnssMbSvIdUsedInPosAvail) {
switch (mGnssSignalType[i]) {
case GNSS_SIGNAL_BEIDOU_B1I:
svUsedIdMask = mGnssMbSvIdUsedInPosition.bds_b1i_sv_used_ids_mask;
break;
case GNSS_SIGNAL_BEIDOU_B1C:
svUsedIdMask = mGnssMbSvIdUsedInPosition.bds_b1c_sv_used_ids_mask;
break;
case GNSS_SIGNAL_BEIDOU_B2I:
svUsedIdMask = mGnssMbSvIdUsedInPosition.bds_b2i_sv_used_ids_mask;
break;
case GNSS_SIGNAL_BEIDOU_B2AI:
svUsedIdMask = mGnssMbSvIdUsedInPosition.bds_b2ai_sv_used_ids_mask;
break;
}
} else {
svUsedIdMask = mGnssSvIdUsedInPosition.bds_sv_used_ids_mask; svUsedIdMask = mGnssSvIdUsedInPosition.bds_sv_used_ids_mask;
} }
}
break; break;
case GNSS_SV_TYPE_GALILEO: case GNSS_SV_TYPE_GALILEO:
if (mGnssSvIdUsedInPosAvail) { if (mGnssSvIdUsedInPosAvail) {
if (mGnssMbSvIdUsedInPosAvail) {
switch (mGnssSignalType[i]) {
case GNSS_SIGNAL_GALILEO_E1:
svUsedIdMask = mGnssMbSvIdUsedInPosition.gal_e1_sv_used_ids_mask;
break;
case GNSS_SIGNAL_GALILEO_E5A:
svUsedIdMask = mGnssMbSvIdUsedInPosition.gal_e5a_sv_used_ids_mask;
break;
case GNSS_SIGNAL_GALILEO_E5B:
svUsedIdMask = mGnssMbSvIdUsedInPosition.gal_e5b_sv_used_ids_mask;
break;
}
} else {
svUsedIdMask = mGnssSvIdUsedInPosition.gal_sv_used_ids_mask; svUsedIdMask = mGnssSvIdUsedInPosition.gal_sv_used_ids_mask;
} }
}
break; break;
case GNSS_SV_TYPE_QZSS: case GNSS_SV_TYPE_QZSS:
if (mGnssSvIdUsedInPosAvail) { if (mGnssSvIdUsedInPosAvail) {
if (mGnssMbSvIdUsedInPosAvail) {
switch (mGnssSignalType[i]) {
case GNSS_SIGNAL_QZSS_L1CA:
svUsedIdMask = mGnssMbSvIdUsedInPosition.qzss_l1ca_sv_used_ids_mask;
break;
case GNSS_SIGNAL_QZSS_L1S:
svUsedIdMask = mGnssMbSvIdUsedInPosition.qzss_l1s_sv_used_ids_mask;
break;
case GNSS_SIGNAL_QZSS_L2:
svUsedIdMask = mGnssMbSvIdUsedInPosition.qzss_l2_sv_used_ids_mask;
break;
case GNSS_SIGNAL_QZSS_L5:
svUsedIdMask = mGnssMbSvIdUsedInPosition.qzss_l5_sv_used_ids_mask;
break;
}
} else {
svUsedIdMask = mGnssSvIdUsedInPosition.qzss_sv_used_ids_mask; svUsedIdMask = mGnssSvIdUsedInPosition.qzss_sv_used_ids_mask;
} }
}
// QZSS SV id's need to reported as it is to framework, since // QZSS SV id's need to reported as it is to framework, since
// framework expects it as it is. See GnssStatus.java. // framework expects it as it is. See GnssStatus.java.
// SV id passed to here by LocApi is 1-based. // SV id passed to here by LocApi is 1-based.

View file

@ -145,6 +145,9 @@ class GnssAdapter : public LocAdapterBase {
LocPosMode mLocPositionMode; LocPosMode mLocPositionMode;
GnssSvUsedInPosition mGnssSvIdUsedInPosition; GnssSvUsedInPosition mGnssSvIdUsedInPosition;
bool mGnssSvIdUsedInPosAvail; bool mGnssSvIdUsedInPosAvail;
GnssSvMbUsedInPosition mGnssMbSvIdUsedInPosition;
bool mGnssMbSvIdUsedInPosAvail;
GnssSignalTypeMask mGnssSignalType[GNSS_SV_MAX];
/* ==== CONTROL ======================================================================== */ /* ==== CONTROL ======================================================================== */
LocationControlCallbacks mControlCallbacks; LocationControlCallbacks mControlCallbacks;

View file

@ -373,6 +373,8 @@ typedef uint64_t GpsLocationExtendedFlags;
#define GPS_LOCATION_EXTENDED_HAS_TIME_UNC 0x100000000 #define GPS_LOCATION_EXTENDED_HAS_TIME_UNC 0x100000000
/** GpsLocationExtended has heading rate **/ /** GpsLocationExtended has heading rate **/
#define GPS_LOCATION_EXTENDED_HAS_HEADING_RATE 0x200000000 #define GPS_LOCATION_EXTENDED_HAS_HEADING_RATE 0x200000000
/** GpsLocationExtended has multiband signals **/
#define GPS_LOCATION_EXTENDED_HAS_MULTIBAND 0x400000000
typedef uint32_t LocNavSolutionMask; typedef uint32_t LocNavSolutionMask;
/* Bitmask to specify whether SBAS ionospheric correction is used */ /* Bitmask to specify whether SBAS ionospheric correction is used */
@ -467,6 +469,27 @@ typedef struct {
uint64_t qzss_sv_used_ids_mask; uint64_t qzss_sv_used_ids_mask;
} GnssSvUsedInPosition; } GnssSvUsedInPosition;
typedef struct {
uint64_t gps_l1ca_sv_used_ids_mask; // GPS L1CA
uint64_t gps_l1c_sv_used_ids_mask; // GPS L1C
uint64_t gps_l2_sv_used_ids_mask; // GPS L2
uint64_t gps_l5_sv_used_ids_mask; // GPS L5
uint64_t glo_g1_sv_used_ids_mask; // GLO G1
uint64_t glo_g2_sv_used_ids_mask; // GLO G2
uint64_t gal_e1_sv_used_ids_mask; // GAL E1
uint64_t gal_e5a_sv_used_ids_mask; // GAL E5A
uint64_t gal_e5b_sv_used_ids_mask; // GAL E5B
uint64_t bds_b1i_sv_used_ids_mask; // BDS B1I
uint64_t bds_b1c_sv_used_ids_mask; // BDS B1C
uint64_t bds_b2i_sv_used_ids_mask; // BDS B2I
uint64_t bds_b2ai_sv_used_ids_mask; // BDS B2AI
uint64_t qzss_l1ca_sv_used_ids_mask; // QZSS L1CA
uint64_t qzss_l1s_sv_used_ids_mask; // QZSS L1S
uint64_t qzss_l2_sv_used_ids_mask; // QZSS L2
uint64_t qzss_l5_sv_used_ids_mask; // QZSS L5
uint64_t sbas_l1_sv_used_ids_mask; // SBAS L1
} GnssSvMbUsedInPosition;
/* Body Frame parameters */ /* Body Frame parameters */
typedef struct { typedef struct {
/** Contains Body frame LocPosDataMask bits. */ /** Contains Body frame LocPosDataMask bits. */
@ -689,6 +712,8 @@ typedef struct {
Gnss_ApTimeStampStructType timeStamp; Gnss_ApTimeStampStructType timeStamp;
/** Gnss sv used in position data */ /** Gnss sv used in position data */
GnssSvUsedInPosition gnss_sv_used_ids; GnssSvUsedInPosition gnss_sv_used_ids;
/** Gnss sv used in position data for multiband */
GnssSvMbUsedInPosition gnss_mb_sv_used_ids;
/** Nav solution mask to indicate sbas corrections */ /** Nav solution mask to indicate sbas corrections */
LocNavSolutionMask navSolutionMask; LocNavSolutionMask navSolutionMask;
/** Position technology used in computing this fix */ /** Position technology used in computing this fix */