summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Tang <zhikait@codeaurora.org>2021-01-02 16:43:10 -0800
committerKevin Tang <zhikait@codeaurora.org>2021-01-02 16:51:30 -0800
commit5c0b4cdce579822ba1b9cee31eca8a14e0a0124d (patch)
tree957ce8d24f1effeef0e88fde0c03133dd4eb3915
parent555935f14fe316db3cdbda4c0ba953a539cfad78 (diff)
parent2a11c779e14422583a0a233062d9ba57a5d305bb (diff)
Merge remote-tracking branch 'quic/location.lnx.4.0' into HEAD
Change-Id: I26bfb7e728aa24ea4372d78c3b931dc82cb90f45 CRs-Fixed: 2847145
-rw-r--r--core/LocAdapterBase.h2
-rw-r--r--gnss/GnssAdapter.cpp11
-rw-r--r--gnss/GnssAdapter.h3
-rw-r--r--location/LocationAPI.cpp67
-rw-r--r--location/LocationAPI.h27
-rw-r--r--location/LocationDataTypes.h17
-rw-r--r--utils/gps_extended_c.h14
-rw-r--r--utils/loc_nmea.cpp21
8 files changed, 143 insertions, 19 deletions
diff --git a/core/LocAdapterBase.h b/core/LocAdapterBase.h
index 002dc96..51b2306 100644
--- a/core/LocAdapterBase.h
+++ b/core/LocAdapterBase.h
@@ -156,7 +156,7 @@ public:
return ContextBase::isFeatureSupported(featureVal);
}
- uint32_t generateSessionId();
+ static uint32_t generateSessionId();
inline bool isAdapterMaster() {
return mIsMaster;
diff --git a/gnss/GnssAdapter.cpp b/gnss/GnssAdapter.cpp
index d3792b9..003acbe 100644
--- a/gnss/GnssAdapter.cpp
+++ b/gnss/GnssAdapter.cpp
@@ -356,7 +356,8 @@ uint16_t GnssAdapter::getNumSvUsed(uint64_t svUsedIdsMask,
void
GnssAdapter::convertLocationInfo(GnssLocationInfoNotification& out,
- const GpsLocationExtended& locationExtended)
+ const GpsLocationExtended& locationExtended,
+ enum loc_sess_status status)
{
out.size = sizeof(GnssLocationInfoNotification);
if (GPS_LOCATION_EXTENDED_HAS_ALTITUDE_MEAN_SEA_LEVEL & locationExtended.flags) {
@@ -665,6 +666,9 @@ GnssAdapter::convertLocationInfo(GnssLocationInfoNotification& out,
out.flags |= GNSS_LOCATION_INFO_ALTITUDE_ASSUMED_BIT;
out.altitudeAssumed = locationExtended.altitudeAssumed;
}
+
+ out.flags |= GNSS_LOCATION_INFO_SESSION_STATUS_BIT;
+ out.sessionStatus = status;
}
inline uint32_t
@@ -3954,7 +3958,7 @@ GnssAdapter::reportPosition(const UlpLocation& ulpLocation,
if (reportToGnssClient || reportToFlpClient) {
GnssLocationInfoNotification locationInfo = {};
- convertLocationInfo(locationInfo, locationExtended);
+ convertLocationInfo(locationInfo, locationExtended, status);
convertLocation(locationInfo.location, ulpLocation, locationExtended);
logLatencyInfo();
for (auto it=mClientData.begin(); it != mClientData.end(); ++it) {
@@ -4084,7 +4088,8 @@ GnssAdapter::reportEnginePositions(unsigned int count,
}
if (needReportEnginePositions) {
- convertLocationInfo(locationInfo[i], engLocation->locationExtended);
+ convertLocationInfo(locationInfo[i], engLocation->locationExtended,
+ engLocation->sessionStatus);
convertLocation(locationInfo[i].location,
engLocation->location,
engLocation->locationExtended);
diff --git a/gnss/GnssAdapter.h b/gnss/GnssAdapter.h
index 5e617f7..18b9779 100644
--- a/gnss/GnssAdapter.h
+++ b/gnss/GnssAdapter.h
@@ -290,7 +290,8 @@ class GnssAdapter : public LocAdapterBase {
static void convertLocation(Location& out, const UlpLocation& ulpLocation,
const GpsLocationExtended& locationExtended);
static void convertLocationInfo(GnssLocationInfoNotification& out,
- const GpsLocationExtended& locationExtended);
+ const GpsLocationExtended& locationExtended,
+ loc_sess_status status);
static uint16_t getNumSvUsed(uint64_t svUsedIdsMask,
int totalSvCntInThisConstellation);
diff --git a/location/LocationAPI.cpp b/location/LocationAPI.cpp
index 3659b1c..3a50c46 100644
--- a/location/LocationAPI.cpp
+++ b/location/LocationAPI.cpp
@@ -42,6 +42,13 @@ typedef const BatchingInterface* (getBatchingInterface)();
typedef void (createOSFramework)();
typedef void (destroyOSFramework)();
+// GTP services
+typedef uint32_t (setOptInStatusGetter)(bool userConsent, responseCallback* callback);
+typedef void (enableProviderGetter)();
+typedef void (disableProviderGetter)();
+typedef void (getSingleNetworkLocationGetter)(trackingCallback* callback);
+typedef void (stopNetworkLocationGetter)(trackingCallback* callback);
+
typedef struct {
// bit mask of the adpaters that we need to wait for the removeClientCompleteCallback
// before we invoke the registered locationApiDestroyCompleteCallback
@@ -188,6 +195,7 @@ LocationAPI::createInstance (LocationCallbacks& locationCallbacks)
if (nullptr == locationCallbacks.capabilitiesCb ||
nullptr == locationCallbacks.responseCb ||
nullptr == locationCallbacks.collectiveResponseCb) {
+ LOC_LOGe("missing mandatory callback, return null");
return NULL;
}
@@ -641,6 +649,52 @@ LocationAPI::gnssNiResponse(uint32_t id, GnssNiResponse response)
pthread_mutex_unlock(&gDataMutex);
}
+void LocationAPI::enableNetworkProvider() {
+ void* libHandle = nullptr;
+ enableProviderGetter* setter = (enableProviderGetter*)dlGetSymFromLib(libHandle,
+ "liblocationservice_glue.so", "enableNetworkProvider");
+ if (setter != nullptr) {
+ (*setter)();
+ } else {
+ LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so");
+ }
+}
+
+void LocationAPI::disableNetworkProvider() {
+ void* libHandle = nullptr;
+ disableProviderGetter* setter = (disableProviderGetter*)dlGetSymFromLib(libHandle,
+ "liblocationservice_glue.so", "disableNetworkProvider");
+ if (setter != nullptr) {
+ (*setter)();
+ } else {
+ LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so");
+ }
+}
+
+void LocationAPI::startNetworkLocation(trackingCallback* callback) {
+ void* libHandle = nullptr;
+ getSingleNetworkLocationGetter* setter =
+ (getSingleNetworkLocationGetter*)dlGetSymFromLib(libHandle,
+ "liblocationservice_glue.so", "startNetworkLocation");
+ if (setter != nullptr) {
+ (*setter)(callback);
+ } else {
+ LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so");
+ }
+}
+
+void LocationAPI::stopNetworkLocation(trackingCallback* callback) {
+ void* libHandle = nullptr;
+ stopNetworkLocationGetter* setter = (stopNetworkLocationGetter*)dlGetSymFromLib(libHandle,
+ "liblocationservice_glue.so", "stopNetworkLocation");
+ if (setter != nullptr) {
+ LOC_LOGe("called");
+ (*setter)(callback);
+ } else {
+ LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so");
+ }
+}
+
LocationControlAPI*
LocationControlAPI::createInstance(LocationControlCallbacks& locationControlCallbacks)
{
@@ -907,3 +961,16 @@ uint32_t LocationControlAPI::configEngineRunState(
pthread_mutex_unlock(&gDataMutex);
return id;
}
+
+uint32_t LocationControlAPI::setOptInStatus(bool userConsent) {
+ void* libHandle = nullptr;
+ uint32_t sessionId = 0;
+ setOptInStatusGetter* setter = (setOptInStatusGetter*)dlGetSymFromLib(libHandle,
+ "liblocationservice_glue.so", "setOptInStatus");
+ if (setter != nullptr) {
+ sessionId = (*setter)(userConsent, &gData.controlCallbacks.responseCb);
+ } else {
+ LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so");
+ }
+ return sessionId;
+}
diff --git a/location/LocationAPI.h b/location/LocationAPI.h
index 5ae5eda..7c70506 100644
--- a/location/LocationAPI.h
+++ b/location/LocationAPI.h
@@ -178,6 +178,20 @@ public:
LOCATION_ERROR_INVALID_PARAMETER if any parameters in GnssNiResponse are invalid
LOCATION_ERROR_ID_UNKNOWN if id does not match a gnssNiCallback */
virtual void gnssNiResponse(uint32_t id, GnssNiResponse response) override;
+
+ /* ================================== NETWORK PROVIDER =========================== */
+
+ /* enableNetworkProvider enables Network Provider */
+ virtual void enableNetworkProvider();
+
+ /* disableNetworkProvider disables Network Provider */
+ virtual void disableNetworkProvider();
+
+ /* startNetworkLocation start a single shot network location request */
+ virtual void startNetworkLocation(trackingCallback* callback);
+
+ /* stopNetworkLocation stop any ongoing network location request */
+ virtual void stopNetworkLocation(trackingCallback* callback);
};
typedef struct {
@@ -480,6 +494,19 @@ public:
*/
virtual uint32_t configEngineRunState(PositioningEngineMask engType,
LocEngineRunState engState) override;
+
+ /** @brief
+ Set the EULA opt-in status from system user. This is used as consent to
+ use network-based positioning.
+
+ @param
+ userConsnt: user agrees to use GTP service or not.
+
+ @return
+ A session id that will be returned in responseCallback to
+ match command with response.
+ */
+ virtual uint32_t setOptInStatus(bool userConsent);
};
#endif /* LOCATIONAPI_H */
diff --git a/location/LocationDataTypes.h b/location/LocationDataTypes.h
index ede1f81..eb85d3b 100644
--- a/location/LocationDataTypes.h
+++ b/location/LocationDataTypes.h
@@ -61,7 +61,8 @@ typedef enum {
LOCATION_ERROR_ID_UNKNOWN,
LOCATION_ERROR_ALREADY_STARTED,
LOCATION_ERROR_GEOFENCES_AT_MAX,
- LOCATION_ERROR_NOT_SUPPORTED
+ LOCATION_ERROR_NOT_SUPPORTED,
+ LOCATION_ERROR_TIMEOUT,
} LocationError;
// Flags to indicate which values are valid in a Location
@@ -211,6 +212,7 @@ typedef enum {
GNSS_LOCATION_INFO_ENU_VELOCITY_VRP_BASED_BIT = (1<<30), // VRP-based east/north/up vel
GNSS_LOCATION_INFO_DR_SOLUTION_STATUS_MASK_BIT = (1ULL<<31), // Valid DR solution status
GNSS_LOCATION_INFO_ALTITUDE_ASSUMED_BIT = (1ULL<<32), // Valid altitude assumed
+ GNSS_LOCATION_INFO_SESSION_STATUS_BIT = (1ULL<<33), // session status
} GnssLocationInfoFlagBits;
typedef enum {
@@ -1184,6 +1186,12 @@ typedef struct {
float altitude; // altitude wrt to ellipsoid
} LLAInfo;
+enum loc_sess_status {
+ LOC_SESS_SUCCESS,
+ LOC_SESS_INTERMEDIATE,
+ LOC_SESS_FAILURE
+};
+
typedef struct {
uint32_t size; // set to sizeof(GnssLocationInfo)
Location location; // basic locaiton info, latitude, longitude, and etc
@@ -1243,6 +1251,8 @@ typedef struct {
DrSolutionStatusMask drSolutionStatusMask;
// true: altitude is assumed, false: altitude is calculated
bool altitudeAssumed;
+ // location session status
+ loc_sess_status sessionStatus;
} GnssLocationInfoNotification;
typedef struct {
@@ -1711,6 +1721,11 @@ struct LocationSystemInfo {
LeapSecondSystemInfo leapSecondSysInfo;
};
+// Specify the set of terrestrial technologies
+enum TerrestrialTechMask {
+ TERRESTRIAL_TECH_GTP_WWAN = 1 << 0,
+};
+
// Specify parameters related to lever arm
struct LeverArmParams {
// Offset along the vehicle forward axis
diff --git a/utils/gps_extended_c.h b/utils/gps_extended_c.h
index 8619ef8..39f80f8 100644
--- a/utils/gps_extended_c.h
+++ b/utils/gps_extended_c.h
@@ -879,12 +879,6 @@ typedef struct {
bool altitudeAssumed;
} GpsLocationExtended;
-enum loc_sess_status {
- LOC_SESS_SUCCESS,
- LOC_SESS_INTERMEDIATE,
- LOC_SESS_FAILURE
-};
-
// struct that contains complete position info from engine
typedef struct {
UlpLocation location;
@@ -1555,6 +1549,10 @@ typedef uint64_t GpsSvMeasHeaderFlags;
#define GNSS_SV_MEAS_HEADER_HAS_DGNSS_CORRECTION_SOURCE_ID 0x020000000
#define GNSS_SV_MEAS_HEADER_HAS_DGNSS_REF_STATION_ID 0x040000000
#define GNSS_SV_MEAS_HEADER_HAS_REF_COUNT_TICKS 0x080000000
+#define GNSS_SV_MEAS_HEADER_HAS_GPSL1L2C_TIME_BIAS 0x100000000
+#define GNSS_SV_MEAS_HEADER_HAS_GLOG1G2_TIME_BIAS 0x200000000
+#define GNSS_SV_MEAS_HEADER_HAS_BDSB1IB1C_TIME_BIAS 0x400000000
+#define GNSS_SV_MEAS_HEADER_HAS_GALE1E5B_TIME_BIAS 0x800000000
typedef struct
{
@@ -1581,6 +1579,10 @@ typedef struct
Gnss_InterSystemBiasStructType gpsL1L5TimeBias;
Gnss_InterSystemBiasStructType galE1E5aTimeBias;
Gnss_InterSystemBiasStructType bdsB1iB2aTimeBias;
+ Gnss_InterSystemBiasStructType gpsL1L2cTimeBias;
+ Gnss_InterSystemBiasStructType gloG1G2TimeBias;
+ Gnss_InterSystemBiasStructType bdsB1iB1cTimeBias;
+ Gnss_InterSystemBiasStructType galE1E5bTimeBias;
GnssSystemTimeStructType gpsSystemTime;
GnssSystemTimeStructType galSystemTime;
diff --git a/utils/loc_nmea.cpp b/utils/loc_nmea.cpp
index 307870e..1dcbedd 100644
--- a/utils/loc_nmea.cpp
+++ b/utils/loc_nmea.cpp
@@ -36,6 +36,7 @@
#include <loc_cfg.h>
#define GLONASS_SV_ID_OFFSET 64
+#define SBAS_SV_ID_OFFSET (87)
#define QZSS_SV_ID_OFFSET (192)
#define BDS_SV_ID_OFFSET (200)
#define GALILEO_SV_ID_OFFSET (300)
@@ -114,7 +115,7 @@
typedef struct loc_nmea_sv_meta_s
{
char talker[3];
- LocGnssConstellationType svType;
+ uint32_t svTypeMask;
uint64_t mask;
uint32_t svCount;
uint32_t totalSvUsedCount;
@@ -293,6 +294,7 @@ static uint32_t convert_signalType_to_signalId(GnssSignalTypeMask signalType)
switch (signalType) {
case GNSS_SIGNAL_GPS_L1CA:
+ case GNSS_SIGNAL_SBAS_L1:
signalId = SIGNAL_ID_GPS_L1CA;
break;
case GNSS_SIGNAL_GPS_L2:
@@ -405,7 +407,7 @@ static loc_nmea_sv_meta* loc_nmea_sv_meta_init(loc_nmea_sv_meta& sv_meta,
bool needCombine)
{
memset(&sv_meta, 0, sizeof(sv_meta));
- sv_meta.svType = svType;
+ sv_meta.svTypeMask = (1 << svType);
switch (svType)
{
@@ -414,6 +416,7 @@ static loc_nmea_sv_meta* loc_nmea_sv_meta_init(loc_nmea_sv_meta& sv_meta,
sv_meta.talker[1] = 'P';
sv_meta.mask = sv_cache_info.gps_used_mask;
sv_meta.systemId = SYSTEM_ID_GPS;
+ sv_meta.svTypeMask |= (1 << GNSS_SV_TYPE_SBAS);
switch (signalType) {
case GNSS_SIGNAL_GPS_L1CA:
sv_meta.svCount = sv_cache_info.gps_l1_count;
@@ -643,7 +646,7 @@ static uint32_t loc_nmea_generate_GSA(const GpsLocationExtended &locationExtende
uint32_t svIdOffset = sv_meta_p->svIdOffset;
uint64_t mask = sv_meta_p->mask;
- if(sv_meta_p->svType != GNSS_SV_TYPE_GLONASS) {
+ if (!(sv_meta_p->svTypeMask & (1 << GNSS_SV_TYPE_GLONASS))) {
svIdOffset = 0;
}
@@ -797,7 +800,7 @@ static void loc_nmea_generate_GSV(const GnssSvNotification &svNotify,
return;
}
- if (GNSS_SV_TYPE_GLONASS == sv_meta_p->svType) {
+ if ((1 << GNSS_SV_TYPE_GLONASS) & sv_meta_p->svTypeMask) {
svIdOffset = 0;
}
svNumber = 1;
@@ -855,9 +858,12 @@ static void loc_nmea_generate_GSV(const GnssSvNotification &svNotify,
}
}
- if (sv_meta_p->svType == svNotify.gnssSvs[svNumber - 1].type &&
+ if ((sv_meta_p->svTypeMask & (1 << svNotify.gnssSvs[svNumber - 1].type)) &&
sv_meta_p->signalId == convert_signalType_to_signalId(signalType))
{
+ if (GNSS_SV_TYPE_SBAS == svNotify.gnssSvs[svNumber - 1].type) {
+ svIdOffset = SBAS_SV_ID_OFFSET;
+ }
length = snprintf(pMarker, lengthRemaining,",%02d,%02d,%03d,",
svNotify.gnssSvs[svNumber - 1].svId - svIdOffset,
(int)(0.5 + svNotify.gnssSvs[svNumber - 1].elevation), //float to int
@@ -2137,14 +2143,15 @@ void loc_nmea_generate_sv(const GnssSvNotification &svNotify,
//Count GPS SVs for saparating GPS from GLONASS and throw others
for (uint32_t svOffset = 0; svOffset < svNotify.count; svOffset++) {
- if (GNSS_SV_TYPE_GPS == svNotify.gnssSvs[svOffset].type)
+ if ((GNSS_SV_TYPE_GPS == svNotify.gnssSvs[svOffset].type) ||
+ (GNSS_SV_TYPE_SBAS == svNotify.gnssSvs[svOffset].type))
{
if (GNSS_SIGNAL_GPS_L5 == svNotify.gnssSvs[svOffset].gnssSignalTypeMask) {
sv_cache_info.gps_l5_count++;
} else if (GNSS_SIGNAL_GPS_L2 == svNotify.gnssSvs[svOffset].gnssSignalTypeMask) {
sv_cache_info.gps_l2_count++;
} else {
- // GNSS_SIGNAL_GPS_L1CA or default
+ // GNSS_SIGNAL_GPS_L1CA, GNSS_SIGNAL_SBAS_L1 or default
// If no signal type in report, it means default L1
sv_cache_info.gps_l1_count++;
}