Merge "SV "in-use" flags are not being set correctly for multiband enabled devices"

This commit is contained in:
qctecmdr 2019-05-04 19:20:02 -07:00 committed by Gerrit - the friendly Code Review server
commit 82c8af81ee
3 changed files with 121 additions and 6 deletions

View file

@ -95,7 +95,10 @@ GnssAdapter::GnssAdapter() :
mAllowFlpNetworkFixes(0),
mGnssEnergyConsumedCb(nullptr),
mPowerStateCb(nullptr),
mIsE911Session(NULL)
mIsE911Session(NULL),
mGnssMbSvIdUsedInPosition{},
mGnssMbSvIdUsedInPosAvail(false),
mGnssSignalType()
{
LOC_LOGD("%s]: Constructor %p", __func__, this);
mLocPositionMode.mode = LOC_POSITION_MODE_INVALID;
@ -3137,10 +3140,18 @@ GnssAdapter::reportPosition(const UlpLocation& ulpLocation,
}
mGnssSvIdUsedInPosAvail = false;
mGnssMbSvIdUsedInPosAvail = false;
if (reportToGnssClient) {
if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_GNSS_SV_USED_DATA) {
mGnssSvIdUsedInPosAvail = true;
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,
@ -3211,27 +3222,103 @@ GnssAdapter::reportSv(GnssSvNotification& svNotify)
switch (svNotify.gnssSvs[i].type) {
case GNSS_SV_TYPE_GPS:
if (mGnssSvIdUsedInPosAvail) {
svUsedIdMask = mGnssSvIdUsedInPosition.gps_sv_used_ids_mask;
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;
}
}
break;
case GNSS_SV_TYPE_GLONASS:
if (mGnssSvIdUsedInPosAvail) {
svUsedIdMask = mGnssSvIdUsedInPosition.glo_sv_used_ids_mask;
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;
}
}
break;
case GNSS_SV_TYPE_BEIDOU:
if (mGnssSvIdUsedInPosAvail) {
svUsedIdMask = mGnssSvIdUsedInPosition.bds_sv_used_ids_mask;
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;
}
}
break;
case GNSS_SV_TYPE_GALILEO:
if (mGnssSvIdUsedInPosAvail) {
svUsedIdMask = mGnssSvIdUsedInPosition.gal_sv_used_ids_mask;
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;
}
}
break;
case GNSS_SV_TYPE_QZSS:
if (mGnssSvIdUsedInPosAvail) {
svUsedIdMask = mGnssSvIdUsedInPosition.qzss_sv_used_ids_mask;
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;
}
}
// QZSS SV id's need to reported as it is to framework, since
// framework expects it as it is. See GnssStatus.java.

View file

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

View file

@ -373,6 +373,8 @@ typedef uint64_t GpsLocationExtendedFlags;
#define GPS_LOCATION_EXTENDED_HAS_TIME_UNC 0x100000000
/** GpsLocationExtended has heading rate **/
#define GPS_LOCATION_EXTENDED_HAS_HEADING_RATE 0x200000000
/** GpsLocationExtended has multiband signals **/
#define GPS_LOCATION_EXTENDED_HAS_MULTIBAND 0x400000000
typedef uint32_t LocNavSolutionMask;
/* Bitmask to specify whether SBAS ionospheric correction is used */
@ -467,6 +469,27 @@ typedef struct {
uint64_t qzss_sv_used_ids_mask;
} 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 */
typedef struct {
/** Contains Body frame LocPosDataMask bits. */
@ -689,6 +712,8 @@ typedef struct {
Gnss_ApTimeStampStructType timeStamp;
/** Gnss sv used in position data */
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 */
LocNavSolutionMask navSolutionMask;
/** Position technology used in computing this fix */