diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2021-01-23 22:06:11 -0800 |
---|---|---|
committer | Linux Build Service Account <lnxbuild@localhost> | 2021-01-23 22:06:11 -0800 |
commit | 3a45bce09376ea4ea86ccc414f65d0c8ef441178 (patch) | |
tree | 27c7cf3780d1f4ff5a2fb9b602288671b7ce737a | |
parent | 67346ca8894725ddd8d5e2f80d702ce05f30d655 (diff) | |
parent | fd1721bc52c2595d6fc143425c1a6e68ca9201d8 (diff) |
Merge fd1721bc52c2595d6fc143425c1a6e68ca9201d8 on remote branch
Change-Id: I20f9ad1b3250e8a4fd2f7a906e223c190cc28bec
27 files changed, 453 insertions, 109 deletions
diff --git a/android/1.0/AGnssRil.cpp b/android/1.0/AGnssRil.cpp index 0437cf1..d7f30eb 100644 --- a/android/1.0/AGnssRil.cpp +++ b/android/1.0/AGnssRil.cpp @@ -54,6 +54,7 @@ Return<bool> AGnssRil::updateNetworkState(bool connected, NetworkType type, bool const int NetworkType_BLUETOOTH = 7; const int NetworkType_ETHERNET = 9; const int NetworkType_PROXY = 16; + std::string apn(""); // for XTRA if (nullptr != mGnss && ( nullptr != mGnss->getGnssInterface() )) { @@ -102,7 +103,7 @@ Return<bool> AGnssRil::updateNetworkState(bool connected, NetworkType type, bool } break; } - mGnss->getGnssInterface()->updateConnectionStatus(connected, false, typeout, 0); + mGnss->getGnssInterface()->updateConnectionStatus(connected, typeout, false, 0, apn); } return true; } diff --git a/android/1.0/location_api/LocationUtil.cpp b/android/1.0/location_api/LocationUtil.cpp index 7bbc064..870a8aa 100644 --- a/android/1.0/location_api/LocationUtil.cpp +++ b/android/1.0/location_api/LocationUtil.cpp @@ -157,7 +157,11 @@ void convertGnssSvid(GnssSv& in, int16_t& out) out = in.svId; break; case GNSS_SV_TYPE_GLONASS: - out = in.svId - GLO_SV_PRN_MIN + 1; + if (!isGloSlotUnknown(in.svId)) { // OSN is known + out = in.svId - GLO_SV_PRN_MIN + 1; + } else { // OSN is not known, report FCN + out = in.gloFrequency + 92; + } break; case GNSS_SV_TYPE_QZSS: out = in.svId; @@ -169,8 +173,6 @@ void convertGnssSvid(GnssSv& in, int16_t& out) out = in.svId - GAL_SV_PRN_MIN + 1; break; case GNSS_SV_TYPE_NAVIC: - /*Android doesn't define Navic svid range yet, use Naviv svid [1, 14] now - will update this once Android give Navic svid definiitons */ out = in.svId - NAVIC_SV_PRN_MIN + 1; break; default: @@ -189,7 +191,7 @@ void convertGnssSvid(GnssMeasurementsData& in, int16_t& out) out = in.svId; break; case GNSS_SV_TYPE_GLONASS: - if (in.svId != 255) { // OSN is known + if (!isGloSlotUnknown(in.svId)) { // OSN is known out = in.svId - GLO_SV_PRN_MIN + 1; } else { // OSN is not known, report FCN out = in.gloFrequency + 92; @@ -205,8 +207,6 @@ void convertGnssSvid(GnssMeasurementsData& in, int16_t& out) out = in.svId - GAL_SV_PRN_MIN + 1; break; case GNSS_SV_TYPE_NAVIC: - /*Android doesn't define Navic svid range yet, use Naviv svid [1, 14] now - will update this once Android give Navic svid definiitons */ out = in.svId - NAVIC_SV_PRN_MIN + 1; break; default: diff --git a/android/1.1/AGnssRil.cpp b/android/1.1/AGnssRil.cpp index 1e774f1..95c8d63 100644 --- a/android/1.1/AGnssRil.cpp +++ b/android/1.1/AGnssRil.cpp @@ -54,6 +54,7 @@ Return<bool> AGnssRil::updateNetworkState(bool connected, NetworkType type, bool const int NetworkType_BLUETOOTH = 7; const int NetworkType_ETHERNET = 9; const int NetworkType_PROXY = 16; + std::string apn(""); // for XTRA if (nullptr != mGnss && ( nullptr != mGnss->getGnssInterface() )) { @@ -102,7 +103,7 @@ Return<bool> AGnssRil::updateNetworkState(bool connected, NetworkType type, bool } break; } - mGnss->getGnssInterface()->updateConnectionStatus(connected, false, typeout, 0); + mGnss->getGnssInterface()->updateConnectionStatus(connected, typeout, false, 0, apn); } return true; } diff --git a/android/1.1/location_api/LocationUtil.cpp b/android/1.1/location_api/LocationUtil.cpp index e0c1849..26fd920 100644 --- a/android/1.1/location_api/LocationUtil.cpp +++ b/android/1.1/location_api/LocationUtil.cpp @@ -157,7 +157,11 @@ void convertGnssSvid(GnssSv& in, int16_t& out) out = in.svId; break; case GNSS_SV_TYPE_GLONASS: - out = in.svId - GLO_SV_PRN_MIN + 1; + if (!isGloSlotUnknown(in.svId)) { // OSN is known + out = in.svId - GLO_SV_PRN_MIN + 1; + } else { //OSN is not known, report FCN + out = in.gloFrequency + 92; + } break; case GNSS_SV_TYPE_QZSS: out = in.svId; @@ -169,8 +173,6 @@ void convertGnssSvid(GnssSv& in, int16_t& out) out = in.svId - GAL_SV_PRN_MIN + 1; break; case GNSS_SV_TYPE_NAVIC: - /*Android doesn't define Navic svid range yet, use Naviv svid [1, 14] now - will update this once Android give Navic svid definiitons */ out = in.svId - NAVIC_SV_PRN_MIN + 1; break; default: @@ -189,7 +191,7 @@ void convertGnssSvid(GnssMeasurementsData& in, int16_t& out) out = in.svId; break; case GNSS_SV_TYPE_GLONASS: - if (in.svId != 255) { // OSN is known + if (!isGloSlotUnknown(in.svId)) { // OSN is known out = in.svId - GLO_SV_PRN_MIN + 1; } else { // OSN is not known, report FCN out = in.gloFrequency + 92; @@ -205,8 +207,6 @@ void convertGnssSvid(GnssMeasurementsData& in, int16_t& out) out = in.svId - GAL_SV_PRN_MIN + 1; break; case GNSS_SV_TYPE_NAVIC: - /*Android doesn't define Navic svid range yet, use Naviv svid [1, 14] now - will update this once Android give Navic svid definiitons */ out = in.svId - NAVIC_SV_PRN_MIN + 1; break; default: diff --git a/android/2.0/AGnssRil.cpp b/android/2.0/AGnssRil.cpp index a477fc2..d8005e4 100644 --- a/android/2.0/AGnssRil.cpp +++ b/android/2.0/AGnssRil.cpp @@ -54,6 +54,7 @@ Return<bool> AGnssRil::updateNetworkState(bool connected, NetworkType type, bool const int NetworkType_BLUETOOTH = 7; const int NetworkType_ETHERNET = 9; const int NetworkType_PROXY = 16; + std::string apn(""); // for XTRA if (nullptr != mGnss && ( nullptr != mGnss->getGnssInterface() )) { @@ -102,13 +103,13 @@ Return<bool> AGnssRil::updateNetworkState(bool connected, NetworkType type, bool } break; } - mGnss->getGnssInterface()->updateConnectionStatus(connected, false, typeout, 0); + mGnss->getGnssInterface()->updateConnectionStatus(connected, typeout, false, 0, apn); } return true; } Return<bool> AGnssRil::updateNetworkState_2_0(const V2_0::IAGnssRil::NetworkAttributes& attributes) { ENTRY_LOG_CALLFLOW(); - + std::string apn = attributes.apn; if (nullptr != mGnss && (nullptr != mGnss->getGnssInterface())) { int8_t typeout = loc_core::TYPE_UNKNOWN; bool roaming = false; @@ -120,8 +121,9 @@ Return<bool> AGnssRil::updateNetworkState_2_0(const V2_0::IAGnssRil::NetworkAttr if (attributes.capabilities & IAGnssRil::NetworkCapability::NOT_ROAMING) { roaming = false; } + LOC_LOGd("apn string received is: %s", apn.c_str()); mGnss->getGnssInterface()->updateConnectionStatus(attributes.isConnected, - typeout, roaming, (NetworkHandle) attributes.networkHandle); + typeout, roaming, (NetworkHandle) attributes.networkHandle, apn); } return true; } diff --git a/android/2.0/location_api/LocationUtil.cpp b/android/2.0/location_api/LocationUtil.cpp index 0742f27..961b7b1 100644 --- a/android/2.0/location_api/LocationUtil.cpp +++ b/android/2.0/location_api/LocationUtil.cpp @@ -217,7 +217,11 @@ void convertGnssSvid(GnssSv& in, int16_t& out) out = in.svId; break; case GNSS_SV_TYPE_GLONASS: - out = in.svId - GLO_SV_PRN_MIN + 1; + if (!isGloSlotUnknown(in.svId)) { // OSN is known + out = in.svId - GLO_SV_PRN_MIN + 1; + } else { // OSN is not known, report FCN + out = in.gloFrequency + 92; + } break; case GNSS_SV_TYPE_QZSS: out = in.svId; @@ -229,8 +233,6 @@ void convertGnssSvid(GnssSv& in, int16_t& out) out = in.svId - GAL_SV_PRN_MIN + 1; break; case GNSS_SV_TYPE_NAVIC: - /*Android doesn't define Navic svid range yet, use Naviv svid [1, 14] now - will update this once Android give Navic svid definiitons */ out = in.svId - NAVIC_SV_PRN_MIN + 1; break; default: @@ -249,7 +251,7 @@ void convertGnssSvid(GnssMeasurementsData& in, int16_t& out) out = in.svId; break; case GNSS_SV_TYPE_GLONASS: - if (in.svId != 255) { // OSN is known + if (!isGloSlotUnknown(in.svId)) { // OSN is known out = in.svId - GLO_SV_PRN_MIN + 1; } else { // OSN is not known, report FCN out = in.gloFrequency + 92; @@ -265,8 +267,6 @@ void convertGnssSvid(GnssMeasurementsData& in, int16_t& out) out = in.svId - GAL_SV_PRN_MIN + 1; break; case GNSS_SV_TYPE_NAVIC: - /*Android doesn't define Navic svid range yet, use Naviv svid [1, 14] now - will update this once Android give Navic svid definiitons */ out = in.svId - NAVIC_SV_PRN_MIN + 1; break; default: diff --git a/android/2.1/AGnssRil.cpp b/android/2.1/AGnssRil.cpp index 65fb300..f413e93 100644 --- a/android/2.1/AGnssRil.cpp +++ b/android/2.1/AGnssRil.cpp @@ -54,6 +54,7 @@ Return<bool> AGnssRil::updateNetworkState(bool connected, NetworkType type, bool const int NetworkType_BLUETOOTH = 7; const int NetworkType_ETHERNET = 9; const int NetworkType_PROXY = 16; + std::string apn(""); // for XTRA if (nullptr != mGnss && ( nullptr != mGnss->getGnssInterface() )) { @@ -102,13 +103,13 @@ Return<bool> AGnssRil::updateNetworkState(bool connected, NetworkType type, bool } break; } - mGnss->getGnssInterface()->updateConnectionStatus(connected, false, typeout, 0); + mGnss->getGnssInterface()->updateConnectionStatus(connected, typeout, false, 0, apn); } return true; } Return<bool> AGnssRil::updateNetworkState_2_0(const V2_0::IAGnssRil::NetworkAttributes& attributes) { ENTRY_LOG_CALLFLOW(); - + std::string apn = attributes.apn; if (nullptr != mGnss && (nullptr != mGnss->getGnssInterface())) { int8_t typeout = loc_core::TYPE_UNKNOWN; bool roaming = false; @@ -120,8 +121,9 @@ Return<bool> AGnssRil::updateNetworkState_2_0(const V2_0::IAGnssRil::NetworkAttr if (attributes.capabilities & IAGnssRil::NetworkCapability::NOT_ROAMING) { roaming = false; } + LOC_LOGd("apn string received is: %s", apn.c_str()); mGnss->getGnssInterface()->updateConnectionStatus(attributes.isConnected, - typeout, roaming, (NetworkHandle) attributes.networkHandle); + typeout, roaming, (NetworkHandle) attributes.networkHandle, apn); } return true; } diff --git a/android/2.1/location_api/LocationUtil.cpp b/android/2.1/location_api/LocationUtil.cpp index e5b49b2..5154e70 100644 --- a/android/2.1/location_api/LocationUtil.cpp +++ b/android/2.1/location_api/LocationUtil.cpp @@ -218,7 +218,11 @@ void convertGnssSvid(GnssSv& in, int16_t& out) out = in.svId; break; case GNSS_SV_TYPE_GLONASS: - out = in.svId - GLO_SV_PRN_MIN + 1; + if (!isGloSlotUnknown(in.svId)) { // OSN is known + out = in.svId - GLO_SV_PRN_MIN + 1; + } else { // OSN is not known, report FCN + out = in.gloFrequency + 92; + } break; case GNSS_SV_TYPE_QZSS: out = in.svId; @@ -230,8 +234,6 @@ void convertGnssSvid(GnssSv& in, int16_t& out) out = in.svId - GAL_SV_PRN_MIN + 1; break; case GNSS_SV_TYPE_NAVIC: - /*Android doesn't define Navic svid range yet, use Naviv svid [1, 14] now - will update this once Android give Navic svid definiitons */ out = in.svId - NAVIC_SV_PRN_MIN + 1; break; default: @@ -250,7 +252,7 @@ void convertGnssSvid(GnssMeasurementsData& in, int16_t& out) out = in.svId; break; case GNSS_SV_TYPE_GLONASS: - if (in.svId != 255) { // OSN is known + if (!isGloSlotUnknown(in.svId)) { // OSN is known out = in.svId - GLO_SV_PRN_MIN + 1; } else { // OSN is not known, report FCN out = in.gloFrequency + 92; @@ -266,8 +268,6 @@ void convertGnssSvid(GnssMeasurementsData& in, int16_t& out) out = in.svId - GAL_SV_PRN_MIN + 1; break; case GNSS_SV_TYPE_NAVIC: - /*Android doesn't define Navic svid range yet, use Naviv svid [1, 14] now - will update this once Android give Navic svid definiitons */ out = in.svId - NAVIC_SV_PRN_MIN + 1; break; default: 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/core/LocApiBase.cpp b/core/LocApiBase.cpp index 2413d05..ebd46d6 100644 --- a/core/LocApiBase.cpp +++ b/core/LocApiBase.cpp @@ -930,7 +930,7 @@ void LocApiBase:: DEFAULT_IMPL() int64_t ElapsedRealtimeEstimator::getElapsedRealtimeEstimateNanos(int64_t curDataTimeNanos, - bool isCurDataTimeTrustable, uint32_t tbf) { + bool isCurDataTimeTrustable, int64_t tbf) { //The algorithm works follow below steps: //When isCurDataTimeTrustable is meet (means Modem timestamp is already stable), //1, Wait for mFixTimeStablizationThreshold fixes; While waiting for modem time diff --git a/core/LocApiBase.h b/core/LocApiBase.h index b58e60d..121f795 100644 --- a/core/LocApiBase.h +++ b/core/LocApiBase.h @@ -359,7 +359,7 @@ public: ElapsedRealtimeEstimator(int64_t travelTimeNanosEstimate): mInitialTravelTime(travelTimeNanosEstimate) {reset();} int64_t getElapsedRealtimeEstimateNanos(int64_t curDataTimeNanos, - bool isCurDataTimeTrustable, uint32_t tbf); + bool isCurDataTimeTrustable, int64_t tbf); inline int64_t getElapsedRealtimeUncNanos() { return 5000000;} void reset(); diff --git a/core/SystemStatus.cpp b/core/SystemStatus.cpp index 891a8e6..d792577 100644 --- a/core/SystemStatus.cpp +++ b/core/SystemStatus.cpp @@ -1291,7 +1291,7 @@ void SystemStatus::resetNetworkInfo() { for (int i=0; i<mCache.mNetworkInfo.size(); ++i) { // Reset all the cached NetworkInfo Items as disconnected eventConnectionStatus(false, mCache.mNetworkInfo[i].mType, mCache.mNetworkInfo[i].mRoaming, - mCache.mNetworkInfo[i].mNetworkHandle); + mCache.mNetworkInfo[i].mNetworkHandle, mCache.mNetworkInfo[i].mApn); } } @@ -1732,11 +1732,12 @@ bool SystemStatus::setDefaultGnssEngineStates(void) @return true when successfully done ******************************************************************************/ bool SystemStatus::eventConnectionStatus(bool connected, int8_t type, - bool roaming, NetworkHandle networkHandle) + bool roaming, NetworkHandle networkHandle, + string& apn) { // send networkinof dataitem to systemstatus observer clients SystemStatusNetworkInfo s(type, "", "", connected, roaming, - (uint64_t) networkHandle); + (uint64_t) networkHandle, apn); mSysStatusObsvr.notify({&s}); return true; diff --git a/core/SystemStatus.h b/core/SystemStatus.h index d7e60dd..097e7cc 100644 --- a/core/SystemStatus.h +++ b/core/SystemStatus.h @@ -482,12 +482,13 @@ class SystemStatusNetworkInfo : public SystemStatusItemBase, NetworkInfoDataItemBase* mSrcObjPtr; public: inline SystemStatusNetworkInfo( - int32_t type=0, - std::string typeName="", - string subTypeName="", - bool connected=false, - bool roaming=false, - uint64_t networkHandle=NETWORK_HANDLE_UNKNOWN) : + int32_t type = 0, + std::string typeName = "", + string subTypeName = "", + bool connected = false, + bool roaming = false, + uint64_t networkHandle = NETWORK_HANDLE_UNKNOWN, + string apn = "") : NetworkInfoDataItemBase( (NetworkType)type, type, @@ -496,7 +497,7 @@ public: connected && (!roaming), connected, roaming, - networkHandle), + networkHandle, apn), mSrcObjPtr(nullptr) {} inline SystemStatusNetworkInfo(const NetworkInfoDataItemBase& itemBase) : NetworkInfoDataItemBase(itemBase), @@ -508,14 +509,19 @@ public: for (uint8_t i = 0; rtv && i < MAX_NETWORK_HANDLES; ++i) { rtv &= (mAllNetworkHandles[i] == peer.mAllNetworkHandles[i]); } - return rtv; + return peer.mApn.compare(mApn); } inline virtual SystemStatusItemBase& collate(SystemStatusItemBase& curInfo) { uint64_t allTypes = (static_cast<SystemStatusNetworkInfo&>(curInfo)).mAllTypes; + string& apn = (static_cast<SystemStatusNetworkInfo&>(curInfo)).mApn; // Replace current with cached table for now and then update memcpy(mAllNetworkHandles, (static_cast<SystemStatusNetworkInfo&>(curInfo)).getNetworkHandle(), sizeof(mAllNetworkHandles)); + // Update the apn for non-mobile type connections. + if (TYPE_MOBILE != mType && apn.compare("") != 0) { + mApn = apn; + } if (mConnected) { mAllTypes |= allTypes; for (uint8_t i = 0; i < MAX_NETWORK_HANDLES; ++i) { @@ -577,8 +583,8 @@ public: return *this; } inline void dump(void) override { - LOC_LOGD("NetworkInfo: mAllTypes=%" PRIx64 " connected=%u mType=%x", - mAllTypes, mConnected, mType); + LOC_LOGD("NetworkInfo: mAllTypes=%" PRIx64 " connected=%u mType=%x mApn=%s", + mAllTypes, mConnected, mType, mApn.c_str()); } }; @@ -907,7 +913,7 @@ public: bool getReport(SystemStatusReports& reports, bool isLatestonly = false) const; bool setDefaultGnssEngineStates(void); bool eventConnectionStatus(bool connected, int8_t type, - bool roaming, NetworkHandle networkHandle); + bool roaming, NetworkHandle networkHandle, string& apn); bool updatePowerConnectState(bool charging); void resetNetworkInfo(); }; diff --git a/core/data-items/DataItemConcreteTypesBase.h b/core/data-items/DataItemConcreteTypesBase.h index c32d65d..11a3cce 100644 --- a/core/data-items/DataItemConcreteTypesBase.h +++ b/core/data-items/DataItemConcreteTypesBase.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2017, 2019, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2017, 2020, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -284,7 +284,7 @@ class NetworkInfoDataItemBase : public IDataItemCore { public: NetworkInfoDataItemBase( NetworkType initialType, int32_t type, string typeName, string subTypeName, - bool available, bool connected, bool roaming, uint64_t networkHandle ): + bool available, bool connected, bool roaming, uint64_t networkHandle, string apn): mAllTypes(typeToAllTypes(initialType)), mType(type), mTypeName(typeName), @@ -293,7 +293,7 @@ public: mConnected(connected), mRoaming(roaming), mNetworkHandle(networkHandle), - mId(NETWORKINFO_DATA_ITEM_ID) { + mId(NETWORKINFO_DATA_ITEM_ID), mApn(apn) { mAllNetworkHandles[0].networkHandle = networkHandle; mAllNetworkHandles[0].networkType = initialType; } @@ -318,6 +318,7 @@ public: bool mRoaming; NetworkInfoType mAllNetworkHandles[MAX_NETWORK_HANDLES]; uint64_t mNetworkHandle; + string mApn; protected: DataItemId mId; inline uint64_t typeToAllTypes(NetworkType type) { diff --git a/gnss/Android.bp b/gnss/Android.bp index af0a208..a3e8de9 100644 --- a/gnss/Android.bp +++ b/gnss/Android.bp @@ -21,6 +21,7 @@ cc_library_shared { "GnssAdapter.cpp", "Agps.cpp", "XtraSystemStatusObserver.cpp", + "NativeAgpsHandler.cpp", ], cflags: ["-fno-short-enums"] + GNSS_CFLAGS, diff --git a/gnss/GnssAdapter.cpp b/gnss/GnssAdapter.cpp index d3792b9..cff0298 100644 --- a/gnss/GnssAdapter.cpp +++ b/gnss/GnssAdapter.cpp @@ -137,7 +137,8 @@ GnssAdapter::GnssAdapter() : mLastDeleteAidingDataTime(0), mDgnssState(0), mSendNmeaConsent(false), - mDgnssLastNmeaBootTimeMilli(0) + mDgnssLastNmeaBootTimeMilli(0), + mNativeAgpsHandler(mSystemStatus->getOsObserver(), *this) { LOC_LOGD("%s]: Constructor %p", __func__, this); mLocPositionMode.mode = LOC_POSITION_MODE_INVALID; @@ -356,7 +357,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 +667,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 @@ -2602,6 +2607,7 @@ GnssAdapter::restartSessions(bool modemSSR) // inform engine hub that GNSS session is about to start mEngHubProxy->gnssSetFixMode(mLocPositionMode); mEngHubProxy->gnssStartFix(); + checkUpdateDgnssNtrip(false); } checkAndRestartSPESession(); @@ -2634,6 +2640,10 @@ GnssAdapter::suspendSessions() // inform engine hub that GNSS session has stopped mEngHubProxy->gnssStopFix(); mLocApi->stopFix(nullptr); + if (isDgnssNmeaRequired()) { + mDgnssState &= ~DGNSS_STATE_NO_NMEA_PENDING; + } + stopDgnssNtrip(); mSPEAlreadyRunningAtHighestInterval = false; } } @@ -2830,7 +2840,6 @@ GnssAdapter::saveTrackingSession(LocationAPI* client, uint32_t sessionId, mTimeBasedTrackingSessions[key] = options; } reportPowerStateIfChanged(); - checkUpdateDgnssNtrip(false); } void @@ -2847,16 +2856,8 @@ GnssAdapter::eraseTrackingSession(LocationAPI* client, uint32_t sessionId) } } reportPowerStateIfChanged(); - - if (mSendNmeaConsent && mStartDgnssNtripParams.ntripParams.requiresNmeaLocation) { - LOC_LOGd("requiresNmeaLocation"); - mDgnssState &= ~DGNSS_STATE_NO_NMEA_PENDING; - mStartDgnssNtripParams.nmea.clear(); - } - stopDgnssNtrip(); } - bool GnssAdapter::setLocPositionMode(const LocPosMode& mode) { if (!mLocPositionMode.equals(mode)) { mLocPositionMode = mode; @@ -3074,6 +3075,8 @@ GnssAdapter::startTimeBasedTracking(LocationAPI* client, uint32_t sessionId, [this, client, sessionId] (LocationError err) { if (LOCATION_ERROR_SUCCESS != err) { eraseTrackingSession(client, sessionId); + } else { + checkUpdateDgnssNtrip(false); } reportResponse(client, err, sessionId); @@ -3415,6 +3418,11 @@ GnssAdapter::stopTracking(LocationAPI* client, uint32_t id) reportResponse(client, err, id); })); + if (isDgnssNmeaRequired()) { + mDgnssState &= ~DGNSS_STATE_NO_NMEA_PENDING; + } + stopDgnssNtrip(); + mSPEAlreadyRunningAtHighestInterval = false; } @@ -3954,7 +3962,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 +4092,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); @@ -5027,23 +5036,20 @@ GnssAdapter::reportGnssEngEnergyConsumedEvent(uint64_t energyConsumedSinceFirstB void GnssAdapter::initDefaultAgps() { LOC_LOGD("%s]: ", __func__); - void *handle = nullptr; - if ((handle = dlopen("libloc_net_iface.so", RTLD_NOW)) == nullptr) { - LOC_LOGD("%s]: libloc_net_iface.so not found !", __func__); - return; - } - LocAgpsGetAgpsCbInfo getAgpsCbInfo = (LocAgpsGetAgpsCbInfo) - dlsym(handle, "LocNetIfaceAgps_getAgpsCbInfo"); - if (getAgpsCbInfo == nullptr) { - LOC_LOGE("%s]: Failed to get method LocNetIfaceAgps_getStatusCb", __func__); - dlclose(handle); - return; + LocAgpsGetAgpsCbInfo getAgpsCbInfo = + (LocAgpsGetAgpsCbInfo)dlGetSymFromLib(handle, "libloc_net_iface.so", + "LocNetIfaceAgps_getAgpsCbInfo"); + // Below step is to make sure we init nativeAgpsHandler + // for Android platforms only + AgpsCbInfo cbInfo = {}; + if (nullptr != getAgpsCbInfo) { + cbInfo = getAgpsCbInfo(agpsOpenResultCb, agpsCloseResultCb, this); + } else { + cbInfo = mNativeAgpsHandler.getAgpsCbInfo(); } - AgpsCbInfo& cbInfo = getAgpsCbInfo(agpsOpenResultCb, agpsCloseResultCb, this); - if (cbInfo.statusV4Cb == nullptr) { LOC_LOGE("%s]: statusV4Cb is nullptr!", __func__); dlclose(handle); @@ -6780,9 +6786,6 @@ void GnssAdapter::enablePPENtripStreamCommand(const GnssNtripConnectionParams& p } void GnssAdapter::handleEnablePPENtrip(const GnssNtripConnectionParams& params) { - - LOC_LOGd("isInSession %d mDgnssState 0x%x", isInSession(), mDgnssState); - LOC_LOGd("%d %s %d %s %s %s %d mSendNmeaConsent %d", params.useSSL, params.hostNameOrIp.data(), params.port, params.mountPoint.data(), params.username.data(), params.password.data(), @@ -6796,7 +6799,8 @@ void GnssAdapter::handleEnablePPENtrip(const GnssNtripConnectionParams& params) 0 == pNtripParams->mountPoint.compare(params.mountPoint) && 0 == pNtripParams->username.compare(params.username) && 0 == pNtripParams->password.compare(params.password) && - params.requiresNmeaLocation == params.requiresNmeaLocation) { + pNtripParams->requiresNmeaLocation == params.requiresNmeaLocation && + mDgnssState & DGNSS_STATE_ENABLE_NTRIP_COMMAND) { LOC_LOGd("received same Ntrip param"); return; } @@ -6831,13 +6835,14 @@ void GnssAdapter::disablePPENtripStreamCommand() { } void GnssAdapter::handleDisablePPENtrip() { - mStartDgnssNtripParams.clear(); mDgnssState &= ~DGNSS_STATE_ENABLE_NTRIP_COMMAND; mDgnssState |= DGNSS_STATE_NO_NMEA_PENDING; stopDgnssNtrip(); } void GnssAdapter::checkUpdateDgnssNtrip(bool isLocationValid) { + LOC_LOGd("isInSession %d mDgnssState 0x%x isLocationValid %d", + isInSession(), mDgnssState, isLocationValid); if (isInSession()) { uint64_t curBootTime = getBootTimeMilliSec(); if (mDgnssState == (DGNSS_STATE_ENABLE_NTRIP_COMMAND | DGNSS_STATE_NO_NMEA_PENDING)) { @@ -6856,12 +6861,11 @@ void GnssAdapter::checkUpdateDgnssNtrip(bool isLocationValid) { } void GnssAdapter::stopDgnssNtrip() { + LOC_LOGd("isInSession %d mDgnssState 0x%x", isInSession(), mDgnssState); + mStartDgnssNtripParams.nmea.clear(); if (mDgnssState & DGNSS_STATE_NTRIP_SESSION_STARTED) { mDgnssState &= ~DGNSS_STATE_NTRIP_SESSION_STARTED; mXtraObserver.stopDgnssSource(); - } else { - LOC_LOGd("isInSession %d mDgnssState 0x%x", - isInSession(), mDgnssState); } } diff --git a/gnss/GnssAdapter.h b/gnss/GnssAdapter.h index 5e617f7..6b8d024 100644 --- a/gnss/GnssAdapter.h +++ b/gnss/GnssAdapter.h @@ -41,6 +41,7 @@ #include <functional> #include <loc_misc_utils.h> #include <queue> +#include <NativeAgpsHandler.h> #define MAX_URL_LEN 256 #define NMEA_SENTENCE_MAX_LENGTH 200 @@ -281,6 +282,9 @@ class GnssAdapter : public LocAdapterBase { GnssReportLoggerUtil mLogger; bool mDreIntEnabled; + /* === NativeAgpsHandler ======================================================== */ + NativeAgpsHandler mNativeAgpsHandler; + /* === Misc callback from QMI LOC API ============================================== */ GnssEnergyConsumedCallback mGnssEnergyConsumedCb; std::function<void(bool)> mPowerStateCb; @@ -290,7 +294,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/gnss/Makefile.am b/gnss/Makefile.am index db20c15..dd313a1 100644 --- a/gnss/Makefile.am +++ b/gnss/Makefile.am @@ -13,7 +13,8 @@ libgnss_la_SOURCES = \ location_gnss.cpp \ GnssAdapter.cpp \ XtraSystemStatusObserver.cpp \ - Agps.cpp + Agps.cpp \ + NativeAgpsHandler.cpp if USE_GLIB libgnss_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@ diff --git a/gnss/NativeAgpsHandler.cpp b/gnss/NativeAgpsHandler.cpp new file mode 100644 index 0000000..ce4c03a --- /dev/null +++ b/gnss/NativeAgpsHandler.cpp @@ -0,0 +1,127 @@ +/* Copyright (c) 2020, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#define LOG_TAG "LocSvc_NativeAgpsHandler" + +#include <LocAdapterBase.h> +#include <SystemStatus.h> +#include <DataItemId.h> +#include <DataItemsFactoryProxy.h> +#include <DataItemConcreteTypesBase.h> +#include <loc_log.h> +#include <NativeAgpsHandler.h> +#include <GnssAdapter.h> + +using namespace loc_core; + +// IDataItemObserver overrides +void NativeAgpsHandler::getName(string& name) { + name = "NativeAgpsHandler"; +} + +void NativeAgpsHandler::notify(const list<IDataItemCore*>& dlist) { + for (auto each : dlist) { + switch (each->getId()) { + case NETWORKINFO_DATA_ITEM_ID: { + NetworkInfoDataItemBase* networkInfo = + static_cast<NetworkInfoDataItemBase*>(each); + uint64_t mobileBit = (uint64_t )1 << loc_core::TYPE_MOBILE; + uint64_t allTypes = networkInfo->mAllTypes; + mConnected = ((networkInfo->mAllTypes & mobileBit) == mobileBit); + /** + * mApn Telephony preferred Access Point Name to use for + * carrier data connection when connected to a cellular network. + * Empty string, otherwise. + */ + mApn = networkInfo->mApn; + LOC_LOGd("updated mConnected:%d, mApn: %s", mConnected, mApn.c_str()); + break; + } + default: + break; + } + } +} + +NativeAgpsHandler* NativeAgpsHandler::sLocalHandle = nullptr; +NativeAgpsHandler::NativeAgpsHandler(IOsObserver* sysStatObs, GnssAdapter& adapter) : + mSystemStatusObsrvr(sysStatObs), mConnected(false), mAdapter(adapter) { + sLocalHandle = this; + list<DataItemId> subItemIdList = {NETWORKINFO_DATA_ITEM_ID}; + mSystemStatusObsrvr->subscribe(subItemIdList, this); +} + +NativeAgpsHandler::~NativeAgpsHandler() { + if (nullptr != mSystemStatusObsrvr) { + LOC_LOGd("Unsubscribe for network info."); + list<DataItemId> subItemIdList = {NETWORKINFO_DATA_ITEM_ID}; + mSystemStatusObsrvr->unsubscribe(subItemIdList, this); + } + sLocalHandle = nullptr; + mSystemStatusObsrvr = nullptr; +} + + +AgpsCbInfo NativeAgpsHandler::getAgpsCbInfo() { + AgpsCbInfo nativeCbInfo = {}; + nativeCbInfo.statusV4Cb = (void*)agnssStatusIpV4Cb; + nativeCbInfo.atlType = AGPS_ATL_TYPE_WWAN; + return nativeCbInfo; +} + +void NativeAgpsHandler::agnssStatusIpV4Cb(AGnssExtStatusIpV4 statusInfo) { + if (nullptr != sLocalHandle) { + sLocalHandle->processATLRequestRelease(statusInfo); + } else { + LOC_LOGe("sLocalHandle is null"); + } +} + +void NativeAgpsHandler::processATLRequestRelease(AGnssExtStatusIpV4 statusInfo) { + if (LOC_AGPS_TYPE_WWAN_ANY == statusInfo.type) { + LOC_LOGd("status.type = %d status.apnTypeMask = 0x%X", statusInfo.type, + statusInfo.apnTypeMask); + switch (statusInfo.status) { + case LOC_GPS_REQUEST_AGPS_DATA_CONN: + if (mConnected) { + mAdapter.dataConnOpenCommand(LOC_AGPS_TYPE_WWAN_ANY, mApn.c_str(), mApn.size(), + AGPS_APN_BEARER_IPV4); + } else { + mAdapter.dataConnFailedCommand(LOC_AGPS_TYPE_WWAN_ANY); + } + break; + case LOC_GPS_RELEASE_AGPS_DATA_CONN: + mAdapter.dataConnClosedCommand(LOC_AGPS_TYPE_WWAN_ANY); + break; + default: + LOC_LOGe("Invalid Request: %d", statusInfo.status); + } + } else { + LOC_LOGe("mAgpsManger is null or invalid request type!"); + } +} diff --git a/gnss/NativeAgpsHandler.h b/gnss/NativeAgpsHandler.h new file mode 100644 index 0000000..fb0b46c --- /dev/null +++ b/gnss/NativeAgpsHandler.h @@ -0,0 +1,64 @@ +/* Copyright (c) 2020, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#ifndef NATIVEAGPSHANDLER_H +#define NATIVEAGPSHANDLER_H + +#include <cinttypes> +#include <string.h> +#include <gps_extended_c.h> +#include <IDataItemObserver.h> +#include <IDataItemCore.h> +#include <IOsObserver.h> + +using namespace std; +using loc_core::IOsObserver; +using loc_core::IDataItemObserver; +using loc_core::IDataItemCore; + +class GnssAdapter; + +class NativeAgpsHandler : public IDataItemObserver { +public: + NativeAgpsHandler(IOsObserver* sysStatObs, GnssAdapter& adapter); + ~NativeAgpsHandler(); + AgpsCbInfo getAgpsCbInfo(); + // IDataItemObserver overrides + virtual void notify(const list<IDataItemCore*>& dlist); + inline virtual void getName(string& name); +private: + static NativeAgpsHandler* sLocalHandle; + static void agnssStatusIpV4Cb(AGnssExtStatusIpV4 statusInfo); + void processATLRequestRelease(AGnssExtStatusIpV4 statusInfo); + IOsObserver* mSystemStatusObsrvr; + bool mConnected; + string mApn; + GnssAdapter& mAdapter; +}; + +#endif // NATIVEAGPSHANDLER_H diff --git a/gnss/location_gnss.cpp b/gnss/location_gnss.cpp index 04a461a..0454a13 100644 --- a/gnss/location_gnss.cpp +++ b/gnss/location_gnss.cpp @@ -66,8 +66,8 @@ static void agpsDataConnOpen(AGpsExtType agpsType, const char* apnName, int apnL static void agpsDataConnClosed(AGpsExtType agpsType); static void agpsDataConnFailed(AGpsExtType agpsType); static void getDebugReport(GnssDebugReport& report); -static void updateConnectionStatus(bool connected, int8_t type, bool roaming = false, - NetworkHandle networkHandle = NETWORK_HANDLE_UNKNOWN); +static void updateConnectionStatus(bool connected, int8_t type, bool roaming, + NetworkHandle networkHandle, string& apn); static void getGnssEnergyConsumed(GnssEnergyConsumedCallback energyConsumedCb); static void enableNfwLocationAccess(bool enable); static void nfwInit(const NfwCbInfo& cbInfo); @@ -371,10 +371,11 @@ static void getDebugReport(GnssDebugReport& report) { } static void updateConnectionStatus(bool connected, int8_t type, - bool roaming, NetworkHandle networkHandle) { + bool roaming, NetworkHandle networkHandle, + string& apn) { if (NULL != gGnssAdapter) { gGnssAdapter->getSystemStatus()->eventConnectionStatus( - connected, type, roaming, networkHandle); + connected, type, roaming, networkHandle, apn); } } 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..b85464a 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 { @@ -1300,6 +1310,7 @@ typedef struct { float carrierFrequencyHz; // carrier frequency of the signal tracked GnssSignalTypeMask gnssSignalTypeMask; // Specifies GNSS signal type double basebandCarrierToNoiseDbHz; // baseband signal strength + uint16_t gloFrequency; // GLONASS Frequency channel number } GnssSv; struct GnssConfigSetAssistanceServer { @@ -1711,6 +1722,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/location/location_interface.h b/location/location_interface.h index 01bbe45..69d4f0c 100644 --- a/location/location_interface.h +++ b/location/location_interface.h @@ -78,7 +78,7 @@ struct GnssInterface { void (*agpsDataConnFailed)(AGpsExtType agpsType); void (*getDebugReport)(GnssDebugReport& report); void (*updateConnectionStatus)(bool connected, int8_t type, bool roaming, - NetworkHandle networkHandle); + NetworkHandle networkHandle, std::string& apn); void (*odcpiInit)(const OdcpiRequestCallback& callback, OdcpiPrioritytype priority); void (*odcpiInject)(const Location& location); void (*blockCPI)(double latitude, double longitude, float accuracy, diff --git a/utils/gps_extended_c.h b/utils/gps_extended_c.h index 8619ef8..f368975 100644 --- a/utils/gps_extended_c.h +++ b/utils/gps_extended_c.h @@ -486,6 +486,7 @@ typedef uint32_t GnssAdditionalSystemInfoMask; #define GAL_SV_PRN_MAX 336 #define NAVIC_SV_PRN_MIN 401 #define NAVIC_SV_PRN_MAX 414 +#define GLO_SV_PRN_SLOT_UNKNOWN 255 /* Checking svIdOneBase can be set to the corresponding bit in mask */ #define svFitsMask(mask, svIdOneBase) \ @@ -495,6 +496,7 @@ typedef uint32_t GnssAdditionalSystemInfoMask; if (svFitsMask(mask, svIdOneBase)) mask |= (1ULL << ((svIdOneBase) - 1)) #define isValInRangeInclusive(val, min, max) ((val) >= (min) && (val) <= (max)) +#define isGloSlotUnknown(val) ((val) == GLO_SV_PRN_SLOT_UNKNOWN) typedef enum { LOC_RELIABILITY_NOT_SET = 0, @@ -879,12 +881,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 +1551,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 +1581,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..6b5e60e 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,14 +858,23 @@ 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)) { - length = snprintf(pMarker, lengthRemaining,",%02d,%02d,%03d,", + if (GNSS_SV_TYPE_SBAS == svNotify.gnssSvs[svNumber - 1].type) { + svIdOffset = SBAS_SV_ID_OFFSET; + } + if (GNSS_SV_TYPE_GLONASS == svNotify.gnssSvs[svNumber - 1].type && + GLO_SV_PRN_SLOT_UNKNOWN == svNotify.gnssSvs[svNumber - 1].svId) { + length = snprintf(pMarker, lengthRemaining, ",,%02d,%03d,", + (int)(0.5 + svNotify.gnssSvs[svNumber - 1].elevation), //float to int + (int)(0.5 + svNotify.gnssSvs[svNumber - 1].azimuth)); //float to int + } else { + length = snprintf(pMarker, lengthRemaining, ",%02d,%02d,%03d,", svNotify.gnssSvs[svNumber - 1].svId - svIdOffset, (int)(0.5 + svNotify.gnssSvs[svNumber - 1].elevation), //float to int (int)(0.5 + svNotify.gnssSvs[svNumber - 1].azimuth)); //float to int - + } if (length < 0 || length >= lengthRemaining) { LOC_LOGE("NMEA Error in string formatting"); @@ -2137,14 +2149,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++; } |