From 859532ea4a1aa697da9ecad25d762aac96ef3a6c Mon Sep 17 00:00:00 2001 From: clarencelol Date: Sat, 12 Mar 2022 18:10:39 +0800 Subject: [PATCH] sdm660-common: Update GPS HAL from LA.UM.10.2.1.r1-03400-sdm660.0 Signed-off-by: clarencelol Signed-off-by: pix106 --- gps/Android.bp | 12 -- gps/Android.mk | 5 +- gps/android/1.0/Android.mk | 4 +- gps/android/1.1/Android.mk | 4 +- gps/android/2.0/Android.mk | 4 +- gps/android/2.0/GnssConfiguration.cpp | 2 +- gps/android/2.1/AGnss.cpp | 21 +- gps/android/2.1/AGnss.h | 2 + gps/android/2.1/Android.mk | 3 +- .../2.1/location_api/BatchingAPIClient.cpp | 125 +++++++---- .../2.1/location_api/BatchingAPIClient.h | 6 + gps/android/utils/Android.bp | 2 +- gps/batching/Android.bp | 2 +- gps/batching/BatchingAdapter.cpp | 8 +- gps/core/Android.bp | 2 +- gps/core/ContextBase.cpp | 3 + gps/core/ContextBase.h | 1 + gps/core/LocAdapterBase.cpp | 8 +- gps/core/LocApiBase.cpp | 2 +- gps/core/LocApiBase.h | 1 + gps/core/SystemStatus.cpp | 3 +- gps/core/SystemStatus.h | 6 +- gps/etc/flp.conf | 2 +- gps/etc/gnss_antenna_info.conf | 3 +- gps/etc/gps.conf | 45 ++-- gps/etc/lowi.conf | 2 +- gps/etc/seccomp_policy/gnss@2.0-base.policy | 24 +++ .../gnss@2.0-xtwifi-client.policy | 30 ++- .../gnss@2.0-xtwifi-inet-agent.policy | 10 + gps/geofence/Android.bp | 2 +- gps/geofence/GeofenceAdapter.cpp | 20 +- gps/gnss/Agps.cpp | 4 +- gps/gnss/Agps.h | 2 +- gps/gnss/Android.bp | 2 +- gps/gnss/GnssAdapter.cpp | 113 ++++++++-- gps/gnss/GnssAdapter.h | 5 +- gps/gnss/XtraSystemStatusObserver.cpp | 4 +- gps/gnss/location_gnss.cpp | 2 +- gps/gps_vendor_product.mk | 4 + gps/location/Android.bp | 2 +- gps/location/LocationAPIClientBase.cpp | 4 +- gps/utils/Android.bp | 2 +- gps/utils/LocIpc.h | 2 +- gps/utils/gps_extended_c.h | 1 + gps/utils/loc_nmea.cpp | 204 ++++++++++-------- gps/utils/loc_nmea.h | 3 +- sdm660.mk | 2 + 47 files changed, 479 insertions(+), 241 deletions(-) diff --git a/gps/Android.bp b/gps/Android.bp index ea0d991c..0681f679 100644 --- a/gps/Android.bp +++ b/gps/Android.bp @@ -16,18 +16,6 @@ GNSS_CFLAGS = [ "-Wno-error=date-time", ] -/* Activate the following for regression testing */ -GNSS_SANITIZE = { -/* address: true,*/ - cfi: true, - misc_undefined: [ - "bounds", - "null", - "unreachable", - "integer", - ], -} - /* Activate the following for debug purposes only, comment out for production */ GNSS_SANITIZE_DIAG = { diff --git a/gps/Android.mk b/gps/Android.mk index 77d61c99..88bb0f45 100644 --- a/gps/Android.mk +++ b/gps/Android.mk @@ -36,9 +36,6 @@ endif LOCAL_PATH := $(call my-dir) include $(call all-makefiles-under,$(LOCAL_PATH)) -GNSS_SANITIZE := cfi bounds null unreachable integer -# Activate the following two lines for regression testing -#GNSS_SANITIZE += address -#GNSS_SANITIZE_DIAG := $(GNSS_SANITIZE) +GNSS_SANITIZE_DIAG := cfi bounds null unreachable integer address endif # ifneq ($(BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE),) diff --git a/gps/android/1.0/Android.mk b/gps/android/1.0/Android.mk index 797ecce1..f63a9489 100644 --- a/gps/android/1.0/Android.mk +++ b/gps/android/1.0/Android.mk @@ -2,7 +2,7 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := android.hardware.gnss@1.0-impl-qti -LOCAL_SANITIZE += $(GNSS_SANITIZE) + # activate the following line for debug purposes only, comment out for production #LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG) LOCAL_VENDOR_MODULE := true @@ -58,7 +58,7 @@ include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := android.hardware.gnss@1.0-service-qti -LOCAL_SANITIZE += $(GNSS_SANITIZE) + # activate the following line for debug purposes only, comment out for production #LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG) LOCAL_VINTF_FRAGMENTS := android.hardware.gnss@1.0-service-qti.xml diff --git a/gps/android/1.1/Android.mk b/gps/android/1.1/Android.mk index 66abd064..edf85476 100644 --- a/gps/android/1.1/Android.mk +++ b/gps/android/1.1/Android.mk @@ -2,7 +2,7 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := android.hardware.gnss@1.1-impl-qti -LOCAL_SANITIZE += $(GNSS_SANITIZE) + # activate the following line for debug purposes only, comment out for production #LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG) LOCAL_VENDOR_MODULE := true @@ -59,7 +59,7 @@ include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := android.hardware.gnss@1.1-service-qti -LOCAL_SANITIZE += $(GNSS_SANITIZE) + # activate the following line for debug purposes only, comment out for production #LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG) LOCAL_VINTF_FRAGMENTS := android.hardware.gnss@1.1-service-qti.xml diff --git a/gps/android/2.0/Android.mk b/gps/android/2.0/Android.mk index c0b91aeb..e3422f9c 100644 --- a/gps/android/2.0/Android.mk +++ b/gps/android/2.0/Android.mk @@ -2,7 +2,7 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := android.hardware.gnss@2.0-impl-qti -LOCAL_SANITIZE += $(GNSS_SANITIZE) + # activate the following line for debug purposes only, comment out for production #LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG) LOCAL_VENDOR_MODULE := true @@ -71,7 +71,7 @@ include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := android.hardware.gnss@2.0-service-qti -LOCAL_SANITIZE += $(GNSS_SANITIZE) + # activate the following line for debug purposes only, comment out for production #LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG) LOCAL_VINTF_FRAGMENTS := android.hardware.gnss@2.0-service-qti.xml diff --git a/gps/android/2.0/GnssConfiguration.cpp b/gps/android/2.0/GnssConfiguration.cpp index 55a70dcd..e9152cac 100644 --- a/gps/android/2.0/GnssConfiguration.cpp +++ b/gps/android/2.0/GnssConfiguration.cpp @@ -39,7 +39,7 @@ GnssConfiguration::GnssConfiguration(Gnss* gnss) : mGnss(gnss) { } // Methods from ::android::hardware::gps::V1_0::IGnssConfiguration follow. -Return GnssConfiguration::setSuplEs(bool enabled) { +Return GnssConfiguration::setSuplEs(bool /*enabled*/) { // deprecated function. Must return false to pass VTS return false; } diff --git a/gps/android/2.1/AGnss.cpp b/gps/android/2.1/AGnss.cpp index c759492c..ce7b3aa1 100644 --- a/gps/android/2.1/AGnss.cpp +++ b/gps/android/2.1/AGnss.cpp @@ -32,7 +32,7 @@ namespace implementation { static AGnss* spAGnss = nullptr; -AGnss::AGnss(Gnss* gnss) : mGnss(gnss) { +AGnss::AGnss(Gnss* gnss) : mGnss(gnss), mType(LOC_AGPS_TYPE_INVALID) { spAGnss = this; } @@ -51,6 +51,9 @@ void AGnss::statusCb(AGpsExtType type, LocAGpsStatusValue status) { V2_0::IAGnssCallback::AGnssType aType; IAGnssCallback::AGnssStatusValue aStatus; + // cache the AGps Type + mType = type; + switch (type) { case LOC_AGPS_TYPE_SUPL: aType = IAGnssCallback::AGnssType::SUPL; @@ -138,18 +141,20 @@ Return AGnss::dataConnFailed() { Return AGnss::dataConnOpen(uint64_t /*networkHandle*/, const hidl_string& apn, V2_0::IAGnss::ApnIpType apnIpType) { - if(mGnss == nullptr || mGnss->getGnssInterface() == nullptr){ + if (mGnss == nullptr || mGnss->getGnssInterface() == nullptr){ LOC_LOGE("Null GNSS interface"); return false; } - /* Validate */ - if(apn.empty()){ - LOC_LOGE("Invalid APN"); - return false; + std::string apnString(apn.c_str()); + // During Emergency SUPL, an apn name of "sos" means that no + // apn was found, like in the simless case, so apn is cleared + if (LOC_AGPS_TYPE_SUPL_ES == mType && "sos" == apnString) { + LOC_LOGD("dataConnOpen APN name = [sos] cleared"); + apnString.clear(); } - LOC_LOGD("dataConnOpen APN name = [%s]", apn.c_str()); + LOC_LOGD("dataConnOpen APN name = [%s]", apnString.c_str()); AGpsBearerType bearerType; switch (apnIpType) { @@ -168,7 +173,7 @@ Return AGnss::dataConnOpen(uint64_t /*networkHandle*/, const hidl_string& } mGnss->getGnssInterface()->agpsDataConnOpen( - LOC_AGPS_TYPE_SUPL, apn.c_str(), apn.size(), (int)bearerType); + LOC_AGPS_TYPE_SUPL, apnString.c_str(), apnString.size(), (int)bearerType); return true; } diff --git a/gps/android/2.1/AGnss.h b/gps/android/2.1/AGnss.h index f6ea9971..cf9c8a7d 100644 --- a/gps/android/2.1/AGnss.h +++ b/gps/android/2.1/AGnss.h @@ -67,6 +67,8 @@ struct AGnss : public V2_0::IAGnss { private: Gnss* mGnss = nullptr; sp mAGnssCbIface = nullptr; + + AGpsExtType mType; }; } // namespace implementation diff --git a/gps/android/2.1/Android.mk b/gps/android/2.1/Android.mk index a947e414..4be97a96 100644 --- a/gps/android/2.1/Android.mk +++ b/gps/android/2.1/Android.mk @@ -2,7 +2,6 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := android.hardware.gnss@2.1-impl-qti -LOCAL_SANITIZE += $(GNSS_SANITIZE) # activate the following line for debug purposes only, comment out for production #LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG) LOCAL_VENDOR_MODULE := true @@ -74,7 +73,7 @@ include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := android.hardware.gnss@2.1-service-qti -LOCAL_SANITIZE += $(GNSS_SANITIZE) + # activate the following line for debug purposes only, comment out for production #LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG) LOCAL_VINTF_FRAGMENTS := android.hardware.gnss@2.1-service-qti.xml diff --git a/gps/android/2.1/location_api/BatchingAPIClient.cpp b/gps/android/2.1/location_api/BatchingAPIClient.cpp index 00d2ed90..0c871b77 100644 --- a/gps/android/2.1/location_api/BatchingAPIClient.cpp +++ b/gps/android/2.1/location_api/BatchingAPIClient.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017-2021, 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 @@ -33,7 +33,7 @@ #include #include #include - +#include #include "LocationUtil.h" #include "BatchingAPIClient.h" @@ -82,10 +82,10 @@ BatchingAPIClient::~BatchingAPIClient() LOC_LOGD("%s]: ()", __FUNCTION__); } -int BatchingAPIClient::getBatchSize() -{ - LOC_LOGD("%s]: ()", __FUNCTION__); - return locAPIGetBatchSize(); +int BatchingAPIClient::getBatchSize() { + int batchSize = locAPIGetBatchSize(); + LOC_LOGd("batchSize: %d", batchSize); + return batchSize; } void BatchingAPIClient::setCallbacks() @@ -133,8 +133,10 @@ void BatchingAPIClient::gnssUpdateCallbacks_2_0(const sp(opts.periodNanos), static_cast(opts.flags)); int retVal = -1; @@ -168,10 +170,13 @@ int BatchingAPIClient::updateSessionOptions(const IGnssBatching::Options& opts) return retVal; } -int BatchingAPIClient::stopSession() -{ +int BatchingAPIClient::stopSession() { + mMutex.lock(); + mState = STOPPING; + mMutex.unlock(); LOC_LOGD("%s]: ", __FUNCTION__); int retVal = -1; + locAPIGetBatchedLocations(mDefaultId, SIZE_MAX); if (locAPIStopSession(mDefaultId) == LOCATION_ERROR_SUCCESS) { retVal = 1; } @@ -184,10 +189,15 @@ void BatchingAPIClient::getBatchedLocation(int last_n_locations) locAPIGetBatchedLocations(mDefaultId, last_n_locations); } -void BatchingAPIClient::flushBatchedLocations() -{ +void BatchingAPIClient::flushBatchedLocations() { LOC_LOGD("%s]: ()", __FUNCTION__); - locAPIGetBatchedLocations(mDefaultId, SIZE_MAX); + uint32_t retVal = locAPIGetBatchedLocations(mDefaultId, SIZE_MAX); + // when flush a stopped session or one doesn't exist, just report an empty batch. + if (LOCATION_ERROR_ID_UNKNOWN == retVal) { + BatchingOptions opt = {}; + ::std::thread thd(&BatchingAPIClient::onBatchingCb, this, 0, nullptr, opt); + thd.detach(); + } } void BatchingAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMask) @@ -197,37 +207,68 @@ void BatchingAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMa } void BatchingAPIClient::onBatchingCb(size_t count, Location* location, - BatchingOptions /*batchOptions*/) -{ + BatchingOptions /*batchOptions*/) { + bool processReport = false; + LOC_LOGd("(count: %zu)", count); mMutex.lock(); - auto gnssBatchingCbIface(mGnssBatchingCbIface); - auto gnssBatchingCbIface_2_0(mGnssBatchingCbIface_2_0); - mMutex.unlock(); - - LOC_LOGD("%s]: (count: %zu)", __FUNCTION__, count); - if (gnssBatchingCbIface_2_0 != nullptr && count > 0) { - hidl_vec locationVec; - locationVec.resize(count); - for (size_t i = 0; i < count; i++) { - convertGnssLocation(location[i], locationVec[i]); - } - auto r = gnssBatchingCbIface_2_0->gnssLocationBatchCb(locationVec); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssLocationBatchCb 2_0 description=%s", - __func__, r.description().c_str()); - } - } else if (gnssBatchingCbIface != nullptr && count > 0) { - hidl_vec locationVec; - locationVec.resize(count); - for (size_t i = 0; i < count; i++) { - convertGnssLocation(location[i], locationVec[i]); - } - auto r = gnssBatchingCbIface->gnssLocationBatchCb(locationVec); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssLocationBatchCb 1.0 description=%s", - __func__, r.description().c_str()); - } + // back to back stop() and flush() could bring twice onBatchingCb(). Each one might come first. + // Combine them both (the first goes to cache, the second in location*) before report to FW + switch (mState) { + case STOPPING: + mState = STOPPED; + for (size_t i = 0; i < count; i++) { + mBatchedLocationInCache.push_back(location[i]); + } + break; + case STARTED: + case STOPPED: // flush() always trigger report, even on a stopped session + processReport = true; + break; + default: + break; } + // report location batch when in STARTED state or flush(), combined with cache in last stop() + if (processReport) { + auto gnssBatchingCbIface(mGnssBatchingCbIface); + auto gnssBatchingCbIface_2_0(mGnssBatchingCbIface_2_0); + size_t batchCacheCnt = mBatchedLocationInCache.size(); + LOC_LOGd("(batchCacheCnt: %zu)", batchCacheCnt); + if (gnssBatchingCbIface_2_0 != nullptr) { + hidl_vec locationVec; + if (count+batchCacheCnt > 0) { + locationVec.resize(count+batchCacheCnt); + for (size_t i = 0; i < batchCacheCnt; ++i) { + convertGnssLocation(mBatchedLocationInCache[i], locationVec[i]); + } + for (size_t i = 0; i < count; i++) { + convertGnssLocation(location[i], locationVec[i+batchCacheCnt]); + } + } + auto r = gnssBatchingCbIface_2_0->gnssLocationBatchCb(locationVec); + if (!r.isOk()) { + LOC_LOGE("%s] Error from gnssLocationBatchCb 2_0 description=%s", + __func__, r.description().c_str()); + } + } else if (gnssBatchingCbIface != nullptr) { + hidl_vec locationVec; + if (count+batchCacheCnt > 0) { + locationVec.resize(count+batchCacheCnt); + for (size_t i = 0; i < batchCacheCnt; ++i) { + convertGnssLocation(mBatchedLocationInCache[i], locationVec[i]); + } + for (size_t i = 0; i < count; i++) { + convertGnssLocation(location[i], locationVec[i+batchCacheCnt]); + } + } + auto r = gnssBatchingCbIface->gnssLocationBatchCb(locationVec); + if (!r.isOk()) { + LOC_LOGE("%s] Error from gnssLocationBatchCb 1.0 description=%s", + __func__, r.description().c_str()); + } + } + mBatchedLocationInCache.clear(); + } + mMutex.unlock(); } static void convertBatchOption(const IGnssBatching::Options& in, LocationOptions& out, diff --git a/gps/android/2.1/location_api/BatchingAPIClient.h b/gps/android/2.1/location_api/BatchingAPIClient.h index 08d7d237..2d9ab74d 100755 --- a/gps/android/2.1/location_api/BatchingAPIClient.h +++ b/gps/android/2.1/location_api/BatchingAPIClient.h @@ -43,6 +43,9 @@ namespace gnss { namespace V2_1 { namespace implementation { + +enum BATCHING_STATE { STARTED, STOPPING, STOPPED }; + class BatchingAPIClient : public LocationAPIClientBase { public: @@ -72,6 +75,9 @@ private: uint32_t mDefaultId; LocationCapabilitiesMask mLocationCapabilitiesMask; sp mGnssBatchingCbIface_2_0; + volatile BATCHING_STATE mState = STOPPED; + + std::vector mBatchedLocationInCache; }; } // namespace implementation diff --git a/gps/android/utils/Android.bp b/gps/android/utils/Android.bp index c3dc17ae..20fea88b 100644 --- a/gps/android/utils/Android.bp +++ b/gps/android/utils/Android.bp @@ -3,7 +3,7 @@ cc_library_static { name: "liblocbatterylistener", vendor: true, - sanitize: GNSS_SANITIZE, + cflags: GNSS_CFLAGS + ["-DBATTERY_LISTENER_ENABLED"], local_include_dirs: ["."], diff --git a/gps/batching/Android.bp b/gps/batching/Android.bp index 9182a0a0..ce794d19 100644 --- a/gps/batching/Android.bp +++ b/gps/batching/Android.bp @@ -4,7 +4,7 @@ cc_library_shared { name: "libbatching", vendor: true, - sanitize: GNSS_SANITIZE, + shared_libs: [ "libutils", diff --git a/gps/batching/BatchingAdapter.cpp b/gps/batching/BatchingAdapter.cpp index d9f7945b..4f1a43cb 100644 --- a/gps/batching/BatchingAdapter.cpp +++ b/gps/batching/BatchingAdapter.cpp @@ -37,7 +37,9 @@ using namespace loc_core; BatchingAdapter::BatchingAdapter() : - LocAdapterBase(0, LocContext::getLocContext(LocContext::mLocationHalName)), + LocAdapterBase(0, + LocContext::getLocContext(LocContext::mLocationHalName), + false, nullptr, true), mOngoingTripDistance(0), mOngoingTripTBFInterval(0), mTripWithOngoingTBFDropped(false), @@ -50,6 +52,10 @@ BatchingAdapter::BatchingAdapter() : LOC_LOGD("%s]: Constructor", __func__); readConfigCommand(); setConfigCommand(); + + // at last step, let us inform adapater base that we are done + // with initialization, e.g.: ready to process handleEngineUpEvent + doneInit(); } void diff --git a/gps/core/Android.bp b/gps/core/Android.bp index ee8e8077..fe9f0677 100644 --- a/gps/core/Android.bp +++ b/gps/core/Android.bp @@ -4,7 +4,7 @@ cc_library_shared { name: "libloc_core", vendor: true, - sanitize: GNSS_SANITIZE, + shared_libs: [ "liblog", diff --git a/gps/core/ContextBase.cpp b/gps/core/ContextBase.cpp index d5ce6c1a..87e98dc1 100644 --- a/gps/core/ContextBase.cpp +++ b/gps/core/ContextBase.cpp @@ -93,6 +93,7 @@ const loc_param_s_type ContextBase::mGps_conf_table[] = {"GNSS_DEPLOYMENT", &mGps_conf.GNSS_DEPLOYMENT, NULL, 'n'}, {"CUSTOM_NMEA_GGA_FIX_QUALITY_ENABLED", &mGps_conf.CUSTOM_NMEA_GGA_FIX_QUALITY_ENABLED, NULL, 'n'}, + {"NMEA_TAG_BLOCK_GROUPING_ENABLED", &mGps_conf.NMEA_TAG_BLOCK_GROUPING_ENABLED, NULL, 'n'}, {"NI_SUPL_DENY_ON_NFW_LOCKED", &mGps_conf.NI_SUPL_DENY_ON_NFW_LOCKED, NULL, 'n'}, {"ENABLE_NMEA_PRINT", &mGps_conf.ENABLE_NMEA_PRINT, NULL, 'n'} }; @@ -192,6 +193,8 @@ void ContextBase::readConfig() /* default configuration QTI GNSS H/W */ mGps_conf.GNSS_DEPLOYMENT = 0; mGps_conf.CUSTOM_NMEA_GGA_FIX_QUALITY_ENABLED = 0; + /* default NMEA Tag Block Grouping is disabled */ + mGps_conf.NMEA_TAG_BLOCK_GROUPING_ENABLED = 0; /* default configuration for NI_SUPL_DENY_ON_NFW_LOCKED */ mGps_conf.NI_SUPL_DENY_ON_NFW_LOCKED = 1; /* By default NMEA Printing is disabled */ diff --git a/gps/core/ContextBase.h b/gps/core/ContextBase.h index 9ae3141c..34cad609 100644 --- a/gps/core/ContextBase.h +++ b/gps/core/ContextBase.h @@ -82,6 +82,7 @@ typedef struct loc_gps_cfg_s uint32_t CUSTOM_NMEA_GGA_FIX_QUALITY_ENABLED; uint32_t NI_SUPL_DENY_ON_NFW_LOCKED; uint32_t ENABLE_NMEA_PRINT; + uint32_t NMEA_TAG_BLOCK_GROUPING_ENABLED; } loc_gps_cfg_s_type; /* NOTE: the implementation of the parser casts number diff --git a/gps/core/LocAdapterBase.cpp b/gps/core/LocAdapterBase.cpp index 95f27288..69346b86 100644 --- a/gps/core/LocAdapterBase.cpp +++ b/gps/core/LocAdapterBase.cpp @@ -88,8 +88,8 @@ void LocAdapterBase:: const GpsLocationExtended& locationExtended, enum loc_sess_status status, LocPosTechMask loc_technology_mask, - GnssDataNotification* pDataNotify, - int msInWeek) + GnssDataNotification* /*pDataNotify*/, + int /*msInWeek*/) { if (mLocAdapterProxyBase != NULL) { mLocAdapterProxyBase->reportPositionEvent((UlpLocation&)location, @@ -162,7 +162,7 @@ DEFAULT_IMPL(false) bool LocAdapterBase:: requestNiNotifyEvent(const GnssNiNotification &/*notify*/, const void* /*data*/, - const LocInEmergency emergencyState) + const LocInEmergency /*emergencyState*/) DEFAULT_IMPL(false) void LocAdapterBase:: @@ -344,7 +344,7 @@ LocAdapterBase::updateClientsEventMask() DEFAULT_IMPL() void -LocAdapterBase::stopClientSessions(LocationAPI* client) +LocAdapterBase::stopClientSessions(LocationAPI* /*client*/) DEFAULT_IMPL() void diff --git a/gps/core/LocApiBase.cpp b/gps/core/LocApiBase.cpp index 6a0ff84b..860da2e0 100644 --- a/gps/core/LocApiBase.cpp +++ b/gps/core/LocApiBase.cpp @@ -1034,7 +1034,7 @@ bool ElapsedRealtimeEstimator::getCurrentTime( struct timespec sinceBootTime; struct timespec sinceBootTimeTest; bool clockGetTimeSuccess = false; - const uint32_t MAX_TIME_DELTA_VALUE_NANOS = 10000; + const uint32_t MAX_TIME_DELTA_VALUE_NANOS = 15000; const uint32_t MAX_GET_TIME_COUNT = 20; /* Attempt to get CLOCK_REALTIME and CLOCK_BOOTIME in succession without an interruption or context switch (for up to MAX_GET_TIME_COUNT times) to avoid errors in the calculation */ diff --git a/gps/core/LocApiBase.h b/gps/core/LocApiBase.h index 121f795c..cbe5f9f8 100644 --- a/gps/core/LocApiBase.h +++ b/gps/core/LocApiBase.h @@ -101,6 +101,7 @@ public: inline virtual void* getSibling2() { return NULL; } inline virtual double getGloRfLoss(uint32_t left, uint32_t center, uint32_t right, uint8_t gloFrequency) { return 0.0; } + inline virtual float getGeoidalSeparation(double latitude, double longitude) { return 0.0; } }; class LocApiBase { diff --git a/gps/core/SystemStatus.cpp b/gps/core/SystemStatus.cpp index d792577a..fe11de07 100644 --- a/gps/core/SystemStatus.cpp +++ b/gps/core/SystemStatus.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017-2021, 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 @@ -1586,6 +1586,7 @@ bool SystemStatus::eventDataItemNotify(IDataItemCore* dataitem) break; } pthread_mutex_unlock(&mMutexSystemStatus); + LOC_LOGv("DataItemId: %d, whether to record dateitem in cache: %d", dataitem->getId(), ret); return ret; } diff --git a/gps/core/SystemStatus.h b/gps/core/SystemStatus.h index 097e7ccd..638933ab 100644 --- a/gps/core/SystemStatus.h +++ b/gps/core/SystemStatus.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017-2021, 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 @@ -509,9 +509,11 @@ public: for (uint8_t i = 0; rtv && i < MAX_NETWORK_HANDLES; ++i) { rtv &= (mAllNetworkHandles[i] == peer.mAllNetworkHandles[i]); } - return peer.mApn.compare(mApn); + return rtv && !peer.mApn.compare(mApn); } inline virtual SystemStatusItemBase& collate(SystemStatusItemBase& curInfo) { + LOC_LOGv("NetworkInfo: mAllTypes=%" PRIx64 " connected=%u mType=%x mApn=%s", + mAllTypes, mConnected, mType, mApn.c_str()); uint64_t allTypes = (static_cast(curInfo)).mAllTypes; string& apn = (static_cast(curInfo)).mApn; // Replace current with cached table for now and then update diff --git a/gps/etc/flp.conf b/gps/etc/flp.conf index 65d54d38..19851b5e 100644 --- a/gps/etc/flp.conf +++ b/gps/etc/flp.conf @@ -12,7 +12,7 @@ # of batched locations that can be allocated, # which is limited by memory. The default # batch size defined as 20 as below. -BATCH_SIZE=20 +BATCH_SIZE=40 ################################### # FLP OUTDOOR TRIP BATCH SIZE diff --git a/gps/etc/gnss_antenna_info.conf b/gps/etc/gnss_antenna_info.conf index 79a2aefb..e037daa5 100644 --- a/gps/etc/gnss_antenna_info.conf +++ b/gps/etc/gnss_antenna_info.conf @@ -80,7 +80,8 @@ # NUMBER_OF_ROWS_SGC_ and NUMBER_OF_COLUMNS_SGC_ represent the number of # rows/columns for signal gain corrections -ANTENNA_INFO_VECTOR_SIZE = 2 +# ANTENNA_INFO_VECTOR_SIZE must be non zero if antenna corrections are sent +# ANTENNA_INFO_VECTOR_SIZE = 2 CARRIER_FREQUENCY_0 = 1575.42 diff --git a/gps/etc/gps.conf b/gps/etc/gps.conf index 8d4d7b2f..5f696803 100644 --- a/gps/etc/gps.conf +++ b/gps/etc/gps.conf @@ -4,7 +4,7 @@ ERR_ESTIMATE=0 #NTP server -NTP_SERVER=time.xtracloud.net +NTP_SERVER=1.android.pool.ntp.org NTP_SERVER_2=asia.pool.ntp.org NTP_SERVER_3=0.cn.pool.ntp.org @@ -14,28 +14,28 @@ XTRA_CA_PATH=/usr/lib/ssl-1.1/certs # DEBUG LEVELS: 0 - none, 1 - Error, 2 - Warning, 3 - Info # 4 - Debug, 5 - Verbose # If DEBUG_LEVEL is commented, Android's logging levels will be used -DEBUG_LEVEL = 3 +DEBUG_LEVEL = 2 # Intermediate position report, 1=enable, 0=disable INTERMEDIATE_POS=0 # supl version 1.0 -SUPL_VER=0x20000 +SUPL_VER=0x10000 # Emergency SUPL, 1=enable, 0=disable -SUPL_ES=0 +#SUPL_ES=1 #Choose PDN for Emergency SUPL #1 - Use emergency PDN #0 - Use regular SUPL PDN for Emergency SUPL -USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL=0 +#USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL=0 #SUPL_MODE is a bit mask set in config.xml per carrier by default. #If it is uncommented here, this value will overwrite the value from #config.xml. #MSA=0X2 #MSB=0X1 -SUPL_MODE=3 +#SUPL_MODE= # GPS Capabilities bit mask # SCHEDULING = 0x01 @@ -47,7 +47,7 @@ CAPABILITIES=0x17 # Accuracy threshold for intermediate positions # less accurate positions are ignored, 0 for passing all positions -ACCURACY_THRES=70 +# ACCURACY_THRES=5000 ################################ ##### AGPS server settings ##### @@ -78,10 +78,11 @@ ACCURACY_THRES=70 #################################### # LPP_PROFILE is a bit mask # 0: Enable RRLP on LTE(Default) -# 1: Enable LPP_User_Plane on LTE -# 2: Enable LPP_Control_Plane -# 3: Enable both LPP_User_Plane and LPP_Control_Plane -LPP_PROFILE = 3 +# 0x1: LPP User Plane +# 0x2: LPP Control Plane +# 0x4: LPP User Plane for NR5G +# 0x8: LPP Control Plane for NR5G +LPP_PROFILE = 2 #################################### #Datum Type @@ -96,6 +97,15 @@ DATUM_TYPE = 0 # NMEA provider (1=Modem Processor, 0=Application Processor) NMEA_PROVIDER=0 +################################ +# NMEA TAG BLOCK GROUPING +################################ +# NMEA tag block grouping is only applicable to GSA +# Default is disabled +# 0 - disabled +# 1 - enabled +NMEA_TAG_BLOCK_GROUPING_ENABLED = 0 + # Customized NMEA GGA fix quality that can be used to tell # whether SENSOR contributed to the fix. # @@ -138,7 +148,7 @@ SGLTE_TARGET=0 # 0x1: RRC CPlane # 0x2: RRLP UPlane # 0x4: LLP Uplane -A_GLONASS_POS_PROTOCOL_SELECT = 0xf +A_GLONASS_POS_PROTOCOL_SELECT = 0 ################################################## # Select technology for LPPe Control Plane @@ -291,7 +301,7 @@ MODEM_TYPE = 1 # 1 : enabled # This setting enables GPS engine to estimate clock # bias and drift when the signal from at least 1 -# SV is available and the UE’s position is known by +# SV is available and the UE’s position is known by # other position engines. #POSITION_ASSISTED_CLOCK_ESTIMATOR_ENABLED = 0 @@ -300,7 +310,7 @@ MODEM_TYPE = 1 ##################################### # This is a string that is sent to the framework # in nfwNotifyCb callback -PROXY_APP_PACKAGE_NAME = com.lbe.security.miui +PROXY_APP_PACKAGE_NAME = com.google.android.carrierlocation ##################################### # CP_MTLR_ES @@ -339,13 +349,6 @@ D_LEVEL_MAX_CAPACITY = 300 V_LEVEL_TIME_DEPTH = 200 V_LEVEL_MAX_CAPACITY = 400 -# Xiaomi add for breaking xtra download limitation -XTRA_TEST_ENABLED = 1 -XTRA_THROTTLE_ENABLED = 0 -XTRA_SYSTEM_TIME_INJECT = 1 -# Mechanism to handle the gnss assistance data download -# in very bad network situations -XTRA_SOCK_KEEPALIVE=1 ################################################## # Allow buffer diag log packets when diag memory allocation # fails during boot up time. diff --git a/gps/etc/lowi.conf b/gps/etc/lowi.conf index 482fb423..6d4de750 100644 --- a/gps/etc/lowi.conf +++ b/gps/etc/lowi.conf @@ -22,6 +22,6 @@ # Log level # EL_LOG_OFF = 0, EL_ERROR = 1, EL_WARNING = 2, EL_INFO = 3, EL_DEBUG = 4, EL_VERBOSE = 5, EL_LOG_ALL = 100 -LOWI_LOG_LEVEL = 3 +LOWI_LOG_LEVEL = 2 LOWI_USE_LOWI_LP = 0 diff --git a/gps/etc/seccomp_policy/gnss@2.0-base.policy b/gps/etc/seccomp_policy/gnss@2.0-base.policy index 7b930374..0a2e17b7 100644 --- a/gps/etc/seccomp_policy/gnss@2.0-base.policy +++ b/gps/etc/seccomp_policy/gnss@2.0-base.policy @@ -93,3 +93,27 @@ sendmsg: 1 sendto: 1 recvfrom: 1 +getsockname: 1 +nanosleep: 1 +clone: 1 +setsockopt: 1 +getsockopt: 1 +madvise: 1 + +getitimer: 1 +setitimer: 1 +getpid: 1 +bind: 1 +listen: 1 +getpeername: 1 +socketpair: 1 +wait4: 1 +chown: 1 +fchown: 1 +lchown: 1 +umask: 1 +mmap2: 1 +fstat64: 1 +fstatat64: 1 +_llseek: 1 +geteuid: 1 diff --git a/gps/etc/seccomp_policy/gnss@2.0-xtwifi-client.policy b/gps/etc/seccomp_policy/gnss@2.0-xtwifi-client.policy index 17df31a8..38a41f9e 100644 --- a/gps/etc/seccomp_policy/gnss@2.0-xtwifi-client.policy +++ b/gps/etc/seccomp_policy/gnss@2.0-xtwifi-client.policy @@ -32,7 +32,7 @@ fdatasync: 1 getdents64: 1 gettimeofday: 1 -#ioctl: arg1 == _IOC(_IOC_NONE || arg1 == _IOC(_IOC_READ || arg1 == VSOC_MAYBE_SEND_INTERRUPT_TO_HOST +ioctl: 1 lseek: 1 madvise: 1 mkdirat: 1 @@ -43,3 +43,31 @@ timerfd_settime: 1 epoll_create1: 1 epoll_pwait: 1 epoll_ctl: 1 + +sched_getaffinity: 1 +gettid: 1 +fchown: 1 +fchmod: 1 +fchmodat: 1 +getsockopt: 1 +fchownat: 1 +fstat: 1 +fstatfs: 1 +newfstatat: 1 +sendmsg: 1 +recvmsg: 1 +gettimeofday: 1 +setsockopt: 1 +rt_tgsigqueueinfo: 1 +ioctl: 1 +mmap: 1 +getuid32: 1 +getuid: 1 +fstat64: 1 +fstatat64: 1 +mkdir: 1 +rmdir: 1 +creat: 1 +chmod: 1 +lseek: 1 +geteuid32: 1 diff --git a/gps/etc/seccomp_policy/gnss@2.0-xtwifi-inet-agent.policy b/gps/etc/seccomp_policy/gnss@2.0-xtwifi-inet-agent.policy index 00df6c72..024600af 100644 --- a/gps/etc/seccomp_policy/gnss@2.0-xtwifi-inet-agent.policy +++ b/gps/etc/seccomp_policy/gnss@2.0-xtwifi-inet-agent.policy @@ -31,3 +31,13 @@ unlinkat: 1 sched_getaffinity: 1 +newfstatat: 1 +fchmodat: 1 +madvise: 1 +mmap: 1 +getuid: 1 +getuid32: 1 +fstat64: 1 +fstatat64: 1 +gettimeofday: 1 +getdents64: 1 diff --git a/gps/geofence/Android.bp b/gps/geofence/Android.bp index 4801eb8a..bf8474ff 100644 --- a/gps/geofence/Android.bp +++ b/gps/geofence/Android.bp @@ -5,7 +5,7 @@ cc_library_shared { name: "libgeofencing", vendor: true, - sanitize: GNSS_SANITIZE, + srcs: [ "GeofenceAdapter.cpp", diff --git a/gps/geofence/GeofenceAdapter.cpp b/gps/geofence/GeofenceAdapter.cpp index f024e3f5..c2468d26 100644 --- a/gps/geofence/GeofenceAdapter.cpp +++ b/gps/geofence/GeofenceAdapter.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2020, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2021, 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 @@ -38,9 +38,13 @@ using namespace loc_core; GeofenceAdapter::GeofenceAdapter() : LocAdapterBase(0, LocContext::getLocContext(LocContext::mLocationHalName), - true /*isMaster*/) + true /*isMaster*/, nullptr, true) { LOC_LOGD("%s]: Constructor", __func__); + + // at last step, let us inform adapater base that we are done + // with initialization, e.g.: ready to process handleEngineUpEvent + doneInit(); } void @@ -163,7 +167,7 @@ GeofenceAdapter::restartGeofences() if (LOCATION_ERROR_SUCCESS == err) { if (true == object.paused) { mLocApi->pauseGeofence(data.hwId, object.key.id, - new LocApiResponse(*getContext(), [] (LocationError err ) {})); + new LocApiResponse(*getContext(), [] (LocationError /*err*/) {})); } saveGeofenceItem(object.key.client, object.key.id, data.hwId, options, info); } @@ -241,7 +245,7 @@ GeofenceAdapter::addGeofencesCommand(LocationAPI* client, size_t count, Geofence mApi.addToCallQueue(new LocApiResponse(*mAdapter.getContext(), [&mAdapter = mAdapter, mCount = mCount, mClient = mClient, mOptions = mOptions, mInfos = mInfos, mIds = mIds, &mApi = mApi, - errs, i] (LocationError err ) { + errs, i] (LocationError /*err*/) { mApi.addGeofence(mIds[i], mOptions[i], mInfos[i], new LocApiResponseData(*mAdapter.getContext(), [&mAdapter = mAdapter, mOptions = mOptions, mClient = mClient, @@ -342,7 +346,7 @@ GeofenceAdapter::removeGeofencesCommand(LocationAPI* client, size_t count, uint3 for (size_t i=0; i < mCount; ++i) { mApi.addToCallQueue(new LocApiResponse(*mAdapter.getContext(), [&mAdapter = mAdapter, mCount = mCount, mClient = mClient, mIds = mIds, - &mApi = mApi, errs, i] (LocationError err ) { + &mApi = mApi, errs, i] (LocationError /*err*/) { uint32_t hwId = 0; errs[i] = mAdapter.getHwIdFromClient(mClient, mIds[i], hwId); if (LOCATION_ERROR_SUCCESS == errs[i]) { @@ -418,7 +422,7 @@ GeofenceAdapter::pauseGeofencesCommand(LocationAPI* client, size_t count, uint32 for (size_t i=0; i < mCount; ++i) { mApi.addToCallQueue(new LocApiResponse(*mAdapter.getContext(), [&mAdapter = mAdapter, mCount = mCount, mClient = mClient, mIds = mIds, - &mApi = mApi, errs, i] (LocationError err ) { + &mApi = mApi, errs, i] (LocationError /*err*/) { uint32_t hwId = 0; errs[i] = mAdapter.getHwIdFromClient(mClient, mIds[i], hwId); if (LOCATION_ERROR_SUCCESS == errs[i]) { @@ -493,7 +497,7 @@ GeofenceAdapter::resumeGeofencesCommand(LocationAPI* client, size_t count, uint3 for (size_t i=0; i < mCount; ++i) { mApi.addToCallQueue(new LocApiResponse(*mAdapter.getContext(), [&mAdapter = mAdapter, mCount = mCount, mClient = mClient, mIds = mIds, - &mApi = mApi, errs, i] (LocationError err ) { + &mApi = mApi, errs, i] (LocationError /*err*/) { uint32_t hwId = 0; errs[i] = mAdapter.getHwIdFromClient(mClient, mIds[i], hwId); if (LOCATION_ERROR_SUCCESS == errs[i]) { @@ -576,7 +580,7 @@ GeofenceAdapter::modifyGeofencesCommand(LocationAPI* client, size_t count, uint3 } else { mApi.addToCallQueue(new LocApiResponse(*mAdapter.getContext(), [&mAdapter = mAdapter, mCount = mCount, mClient = mClient, mIds = mIds, - &mApi = mApi, mOptions = mOptions, errs, i] (LocationError err ) { + &mApi = mApi, mOptions = mOptions, errs, i] (LocationError /*err*/) { uint32_t hwId = 0; errs[i] = mAdapter.getHwIdFromClient(mClient, mIds[i], hwId); if (LOCATION_ERROR_SUCCESS == errs[i]) { diff --git a/gps/gnss/Agps.cpp b/gps/gnss/Agps.cpp index 9255f88f..0b95f999 100644 --- a/gps/gnss/Agps.cpp +++ b/gps/gnss/Agps.cpp @@ -448,7 +448,7 @@ void AgpsStateMachine::setAPN(char* apn, unsigned int len){ mAPN = NULL; } - if (NULL == apn || len <= 0 || len > MAX_APN_LEN || strlen(apn) != len) { + if (NULL == apn || len > MAX_APN_LEN || strlen(apn) != len) { LOC_LOGD("Invalid apn len (%d) or null apn", len); mAPN = NULL; mAPNLen = 0; @@ -590,7 +590,7 @@ void AgpsManager::requestATL(int connHandle, AGpsExtType agpsType, sm->setApnTypeMask(apnTypeMask); /* Invoke AGPS SM processing */ - AgpsSubscriber subscriber(connHandle, false, false, apnTypeMask); + AgpsSubscriber subscriber(connHandle, true, false, apnTypeMask); sm->setCurrentSubscriber(&subscriber); /* Send subscriber event */ sm->processAgpsEvent(AGPS_EVENT_SUBSCRIBE); diff --git a/gps/gnss/Agps.h b/gps/gnss/Agps.h index 6b43bf57..8a27cd95 100644 --- a/gps/gnss/Agps.h +++ b/gps/gnss/Agps.h @@ -167,7 +167,7 @@ public: /* Getter/Setter methods */ void setAPN(char* apn, unsigned int len); - inline char* getAPN() const { return (char*)mAPN; } + inline char* getAPN() const { return mAPN; } inline uint32_t getAPNLen() const { return mAPNLen; } inline void setBearer(AGpsBearerType bearer) { mBearer = bearer; } inline LocApnTypeMask getApnTypeMask() const { return mApnTypeMask; } diff --git a/gps/gnss/Android.bp b/gps/gnss/Android.bp index a3e8de97..736ea81d 100644 --- a/gps/gnss/Android.bp +++ b/gps/gnss/Android.bp @@ -5,7 +5,7 @@ cc_library_shared { name: "libgnss", vendor: true, - sanitize: GNSS_SANITIZE, + shared_libs: [ "libutils", diff --git a/gps/gnss/GnssAdapter.cpp b/gps/gnss/GnssAdapter.cpp index 0b198439..f3ccd99e 100644 --- a/gps/gnss/GnssAdapter.cpp +++ b/gps/gnss/GnssAdapter.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2020 The Linux Foundation. All rights reserved. +/* Copyright (c) 2017-2021 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 @@ -77,6 +77,8 @@ static void agpsCloseResultCb (bool isSuccess, AGpsExtType agpsType, void* userD typedef const CdfwInterface* (*getCdfwInterface)(); +typedef void getPdnTypeFromWds(const std::string& apnName, std::function pdnCb); + inline bool GnssReportLoggerUtil::isLogEnabled() { return (mLogLatency != nullptr); } @@ -861,6 +863,9 @@ GnssAdapter::setConfig() uint32_t mask = 0; if (NMEA_PROVIDER_MP == ContextBase::mGps_conf.NMEA_PROVIDER) { mask |= LOC_NMEA_ALL_GENERAL_SUPPORTED_MASK; + if (ContextBase::mGps_conf.NMEA_TAG_BLOCK_GROUPING_ENABLED) { + mask |= LOC_NMEA_MASK_TAGBLOCK_V02; + } } if (ContextBase::isFeatureSupported(LOC_SUPPORTED_FEATURE_DEBUG_NMEA_V02)) { mask |= LOC_NMEA_MASK_DEBUG_V02; @@ -886,6 +891,8 @@ GnssAdapter::setConfig() ContextBase::mGps_conf.MO_SUPL_PORT, LOC_AGPS_MO_SUPL_SERVER); + std::string moServerUrl = getMoServerUrl(); + std::string serverUrl = getServerUrl(); // inject the configurations into modem loc_gps_cfg_s gpsConf = ContextBase::mGps_conf; loc_sap_cfg_s_type sapConf = ContextBase::mSap_conf; @@ -933,13 +940,18 @@ GnssAdapter::setConfig() gnssConfigRequested.blacklistedSvIds.assign(mBlacklistedSvIds.begin(), mBlacklistedSvIds.end()); mLocApi->sendMsg(new LocApiMsg( - [this, gpsConf, sapConf, oldMoServerUrl, gnssConfigRequested] () mutable { - gnssUpdateConfig(oldMoServerUrl, gnssConfigRequested, gnssConfigRequested); + [this, gpsConf, sapConf, oldMoServerUrl, moServerUrl, + serverUrl, gnssConfigRequested] () mutable { + gnssUpdateConfig(oldMoServerUrl, moServerUrl, serverUrl, + gnssConfigRequested, gnssConfigRequested); // set nmea mask type uint32_t mask = 0; if (NMEA_PROVIDER_MP == gpsConf.NMEA_PROVIDER) { mask |= LOC_NMEA_ALL_GENERAL_SUPPORTED_MASK; + if (gpsConf.NMEA_TAG_BLOCK_GROUPING_ENABLED) { + mask |= LOC_NMEA_MASK_TAGBLOCK_V02; + } } if (ContextBase::isFeatureSupported(LOC_SUPPORTED_FEATURE_DEBUG_NMEA_V02)) { mask |= LOC_NMEA_MASK_DEBUG_V02; @@ -1019,6 +1031,7 @@ GnssAdapter::setConfig() } std::vector GnssAdapter::gnssUpdateConfig(const std::string& oldMoServerUrl, + const std::string& moServerUrl, const std::string& serverUrl, GnssConfig& gnssConfigRequested, GnssConfig& gnssConfigNeedEngineUpdate, size_t count) { loc_gps_cfg_s gpsConf = ContextBase::mGps_conf; size_t index = 0; @@ -1028,9 +1041,6 @@ std::vector GnssAdapter::gnssUpdateConfig(const std::string& oldM errsList.insert(errsList.begin(), count, LOCATION_ERROR_SUCCESS); } - std::string serverUrl = getServerUrl(); - std::string moServerUrl = getMoServerUrl(); - int serverUrlLen = serverUrl.length(); int moServerUrlLen = moServerUrl.length(); @@ -1418,10 +1428,14 @@ GnssAdapter::gnssUpdateConfigCommand(const GnssConfig& config) adapter.reportResponse(countOfConfigs, errs.data(), ids.data()); }); + std::string moServerUrl = adapter.getMoServerUrl(); + std::string serverUrl = adapter.getServerUrl(); mApi.sendMsg(new LocApiMsg( [&adapter, gnssConfigRequested, gnssConfigNeedEngineUpdate, - countOfConfigs, configCollectiveResponse, errs] () mutable { + moServerUrl, serverUrl, countOfConfigs, configCollectiveResponse, + errs] () mutable { std::vector errsList = adapter.gnssUpdateConfig("", + moServerUrl, serverUrl, gnssConfigRequested, gnssConfigNeedEngineUpdate, countOfConfigs); configCollectiveResponse->returnToSender(errsList); @@ -4018,10 +4032,12 @@ GnssAdapter::reportPosition(const UlpLocation& ulpLocation, (LOC_RELIABILITY_NOT_SET == locationExtended.horizontal_reliability)); uint8_t generate_nmea = (reportToGnssClient && status != LOC_SESS_FAILURE && !blank_fix); bool custom_nmea_gga = (1 == ContextBase::mGps_conf.CUSTOM_NMEA_GGA_FIX_QUALITY_ENABLED); + bool isTagBlockGroupingEnabled = + (1 == ContextBase::mGps_conf.NMEA_TAG_BLOCK_GROUPING_ENABLED); std::vector nmeaArraystr; int indexOfGGA = -1; - loc_nmea_generate_pos(ulpLocation, locationExtended, mLocSystemInfo, - generate_nmea, custom_nmea_gga, nmeaArraystr, indexOfGGA); + loc_nmea_generate_pos(ulpLocation, locationExtended, mLocSystemInfo, generate_nmea, + custom_nmea_gga, nmeaArraystr, indexOfGGA, isTagBlockGroupingEnabled); stringstream ss; for (auto itor = nmeaArraystr.begin(); itor != nmeaArraystr.end(); ++itor) { ss << *itor; @@ -5206,6 +5222,38 @@ bool GnssAdapter::releaseATL(int connHandle){ return true; } +void GnssAdapter::reportPdnTypeFromWds(int pdnType, AGpsExtType agpsType, std::string apnName, + AGpsBearerType bearerType) { + LOC_LOGd("pdnType from WDS QMI: %d, agpsType: %d, apnName: %s, bearerType: %d", + pdnType, agpsType, apnName.c_str(), bearerType); + + struct MsgReportAtlPdn : public LocMsg { + GnssAdapter& mAdapter; + int mPdnType; + AgpsManager* mAgpsManager; + AGpsExtType mAgpsType; + string mApnName; + AGpsBearerType mBearerType; + + inline MsgReportAtlPdn(GnssAdapter& adapter, int pdnType, + AgpsManager* agpsManager, AGpsExtType agpsType, + const string& apnName, AGpsBearerType bearerType) : + LocMsg(), mAgpsManager(agpsManager), mAgpsType(agpsType), + mApnName(apnName), mBearerType(bearerType), + mAdapter(adapter), mPdnType(pdnType) {} + inline virtual void proc() const { + mAgpsManager->reportAtlOpenSuccess(mAgpsType, + const_cast(mApnName.c_str()), + mApnName.length(), mPdnType<=0? mBearerType:mPdnType); + } + }; + + AGpsBearerType atlPdnType = (pdnType+1) & 3; // convert WDS QMI pdn type to AgpsBearerType + sendMsg(new MsgReportAtlPdn(*this, atlPdnType, &mAgpsManager, + agpsType, apnName, bearerType)); +} + + void GnssAdapter::dataConnOpenCommand( AGpsExtType agpsType, const char* apnName, int apnLen, AGpsBearerType bearerType){ @@ -5213,17 +5261,16 @@ void GnssAdapter::dataConnOpenCommand( LOC_LOGI("GnssAdapter::frameworkDataConnOpen"); struct AgpsMsgAtlOpenSuccess: public LocMsg { - + GnssAdapter& mAdapter; AgpsManager* mAgpsManager; AGpsExtType mAgpsType; char* mApnName; - int mApnLen; AGpsBearerType mBearerType; - inline AgpsMsgAtlOpenSuccess(AgpsManager* agpsManager, AGpsExtType agpsType, - const char* apnName, int apnLen, AGpsBearerType bearerType) : + inline AgpsMsgAtlOpenSuccess(GnssAdapter& adapter, AgpsManager* agpsManager, + AGpsExtType agpsType, const char* apnName, int apnLen, AGpsBearerType bearerType) : LocMsg(), mAgpsManager(agpsManager), mAgpsType(agpsType), mApnName( - new char[apnLen + 1]), mApnLen(apnLen), mBearerType(bearerType) { + new char[apnLen + 1]), mBearerType(bearerType), mAdapter(adapter) { LOC_LOGV("AgpsMsgAtlOpenSuccess"); if (mApnName == nullptr) { @@ -5241,19 +5288,36 @@ void GnssAdapter::dataConnOpenCommand( } inline virtual void proc() const { + LOC_LOGv("AgpsMsgAtlOpenSuccess::proc()"); + string apn(mApnName); + //Use QMI WDS API to query IP Protocol from modem profile + void* libHandle = nullptr; + getPdnTypeFromWds* getPdnTypeFunc = (getPdnTypeFromWds*)dlGetSymFromLib(libHandle, + #ifdef USE_GLIB + "libloc_api_wds.so", "_Z10getPdnTypeRKNSt7__cxx1112basic_string"\ + "IcSt11char_traitsIcESaIcEEESt8functionIFviEE"); + #else + "libloc_api_wds.so", "_Z10getPdnTypeRKNSt3__112basic_stringIcNS_11char_traits"\ + "IcEENS_9allocatorIcEEEENS_8functionIFviEEE"); + #endif - LOC_LOGV("AgpsMsgAtlOpenSuccess::proc()"); - mAgpsManager->reportAtlOpenSuccess(mAgpsType, mApnName, mApnLen, mBearerType); + std::function wdsPdnTypeCb = std::bind(&GnssAdapter::reportPdnTypeFromWds, + &mAdapter, std::placeholders::_1, mAgpsType, apn, mBearerType); + if (getPdnTypeFunc != nullptr) { + LOC_LOGv("dlGetSymFromLib success"); + (*getPdnTypeFunc)(apn, wdsPdnTypeCb); + } else { + mAgpsManager->reportAtlOpenSuccess(mAgpsType, mApnName, apn.length(), mBearerType); + } } }; // Added inital length checks for apnlen check to avoid security issues // In case of failure reporting the same - if (NULL == apnName || apnLen <= 0 || apnLen > MAX_APN_LEN || - (strlen(apnName) != (unsigned)apnLen)) { + if (NULL == apnName || apnLen > MAX_APN_LEN || (strlen(apnName) != apnLen)) { LOC_LOGe("%s]: incorrect apnlen length or incorrect apnName", __func__); mAgpsManager.reportAtlClosed(agpsType); } else { - sendMsg( new AgpsMsgAtlOpenSuccess( + sendMsg( new AgpsMsgAtlOpenSuccess(*this, &mAgpsManager, agpsType, apnName, apnLen, bearerType)); } } @@ -6723,7 +6787,9 @@ GnssAdapter::reportGnssAntennaInformation(const antennaInfoCb antennaInfoCallbac } gnssAntennaInformations.push_back(std::move(gnssAntennaInfo)); } - antennaInfoCallback(gnssAntennaInformations); + if (antennaInfoVectorSize > 0) { + antennaInfoCallback(gnssAntennaInformations); + } } /* ==== DGnss Usable Reporter ========================================================= */ @@ -6760,10 +6826,15 @@ void GnssAdapter::enablePPENtripStreamCommand(const GnssNtripConnectionParams& p bool enableRTKEngine) { (void)enableRTKEngine; //future parameter, not used + if (0 == params.size || params.hostNameOrIp.empty() || params.mountPoint.empty() || + params.username.empty() || params.password.empty()) { + LOC_LOGe("Ntrip parameters are invalid!"); + return; + } struct enableNtripMsg : public LocMsg { GnssAdapter& mAdapter; - const GnssNtripConnectionParams& mParams; + const GnssNtripConnectionParams mParams; inline enableNtripMsg(GnssAdapter& adapter, const GnssNtripConnectionParams& params) : diff --git a/gps/gnss/GnssAdapter.h b/gps/gnss/GnssAdapter.h index 6b8d024b..d7b42757 100644 --- a/gps/gnss/GnssAdapter.h +++ b/gps/gnss/GnssAdapter.h @@ -321,7 +321,6 @@ protected: void logLatencyInfo(); public: - GnssAdapter(); virtual inline ~GnssAdapter() { } @@ -409,6 +408,8 @@ public: void deleteAidingData(const GnssAidingData &data, uint32_t sessionId); void gnssUpdateXtraThrottleCommand(const bool enabled); std::vector gnssUpdateConfig(const std::string& oldMoServerUrl, + const std::string& moServerUrl, + const std::string& serverUrl, GnssConfig& gnssConfigRequested, GnssConfig& gnssConfigNeedEngineUpdate, size_t count = 0); @@ -525,6 +526,8 @@ public: ( const std::unordered_map &featureMap ); + void reportPdnTypeFromWds(int pdnType, AGpsExtType agpsType, std::string apnName, + AGpsBearerType bearerType); /* ======== UTILITIES ================================================================= */ bool needReportForGnssClient(const UlpLocation& ulpLocation, diff --git a/gps/gnss/XtraSystemStatusObserver.cpp b/gps/gnss/XtraSystemStatusObserver.cpp index d65622f0..e35924ca 100644 --- a/gps/gnss/XtraSystemStatusObserver.cpp +++ b/gps/gnss/XtraSystemStatusObserver.cpp @@ -65,8 +65,8 @@ public: inline XtraIpcListener(IOsObserver* observer, const MsgTask* msgTask, XtraSystemStatusObserver& xsso) : mSystemStatusObsrvr(observer), mMsgTask(msgTask), mXSSO(xsso) {} - virtual void onReceive(const char* data, uint32_t length, - const LocIpcRecver* recver) override { + virtual void onReceive(const char* data, uint32_t /*length*/, + const LocIpcRecver* /*recver*/) override { #define STRNCMP(str, constStr) strncmp(str, constStr, sizeof(constStr)-1) if (!STRNCMP(data, "ping")) { LOC_LOGd("ping received"); diff --git a/gps/gnss/location_gnss.cpp b/gps/gnss/location_gnss.cpp index 0454a132..8f67369e 100644 --- a/gps/gnss/location_gnss.cpp +++ b/gps/gnss/location_gnss.cpp @@ -519,7 +519,7 @@ static uint32_t antennaInfoInit(const antennaInfoCb antennaInfoCallback) { static void antennaInfoClose() { if (NULL != gGnssAdapter) { return gGnssAdapter->antennaInfoCloseCommand(); - } + } } static uint32_t configRobustLocation(bool enable, bool enableForE911){ diff --git a/gps/gps_vendor_product.mk b/gps/gps_vendor_product.mk index 0e578e80..cd356841 100644 --- a/gps/gps_vendor_product.mk +++ b/gps/gps_vendor_product.mk @@ -27,6 +27,10 @@ ifneq (,$(filter $(LOC_BOARD_PLATFORM_LIST),$(TARGET_BOARD_PLATFORM))) PRODUCT_PACKAGES += gps.conf PRODUCT_PACKAGES += flp.conf PRODUCT_PACKAGES += gnss_antenna_info.conf +PRODUCT_PACKAGES += gnss@2.0-base.policy +PRODUCT_PACKAGES += gnss@2.0-xtra-daemon.policy +PRODUCT_PACKAGES += gnss@2.0-xtwifi-client.policy +PRODUCT_PACKAGES += gnss@2.0-xtwifi-inet-agent.policy PRODUCT_PACKAGES += libloc_pla_headers PRODUCT_PACKAGES += liblocation_api_headers PRODUCT_PACKAGES += libgps.utils_headers diff --git a/gps/location/Android.bp b/gps/location/Android.bp index 8532a085..fb4af2dc 100644 --- a/gps/location/Android.bp +++ b/gps/location/Android.bp @@ -4,7 +4,7 @@ cc_library_shared { name: "liblocation_api", vendor: true, - sanitize: GNSS_SANITIZE, + shared_libs: [ "libutils", diff --git a/gps/location/LocationAPIClientBase.cpp b/gps/location/LocationAPIClientBase.cpp index 4865a16e..ea15a76d 100644 --- a/gps/location/LocationAPIClientBase.cpp +++ b/gps/location/LocationAPIClientBase.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2017, 2020 The Linux Foundation. All rights reserved. +/* Copyright (c) 2017, 2020-2021 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 @@ -634,7 +634,7 @@ uint32_t LocationAPIClientBase::locAPIGetBatchedLocations(uint32_t id, size_t co } } else { retVal = LOCATION_ERROR_ID_UNKNOWN; - LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__, id); + LOC_LOGd("unknown session id: %d, might flush() a stopped session", id); } } pthread_mutex_unlock(&mMutex); diff --git a/gps/utils/Android.bp b/gps/utils/Android.bp index 7d43d573..33d84401 100644 --- a/gps/utils/Android.bp +++ b/gps/utils/Android.bp @@ -4,7 +4,7 @@ cc_library_shared { name: "libgps.utils", vendor: true, - sanitize: GNSS_SANITIZE, + //# Libs shared_libs: [ diff --git a/gps/utils/LocIpc.h b/gps/utils/LocIpc.h index b2586e61..48e751c9 100644 --- a/gps/utils/LocIpc.h +++ b/gps/utils/LocIpc.h @@ -166,7 +166,7 @@ public: inline bool sendData(const uint8_t data[], uint32_t length, int32_t msgId) const { return isSendable() && (send(data, length, msgId) > 0); } - virtual unique_ptr getRecver(const shared_ptr& listener) { + virtual unique_ptr getRecver(const shared_ptr& /*listener*/) { return nullptr; } inline virtual void copyDestAddrFrom(const LocIpcSender& otherSender) {} diff --git a/gps/utils/gps_extended_c.h b/gps/utils/gps_extended_c.h index 7d2aa080..f368975a 100644 --- a/gps/utils/gps_extended_c.h +++ b/gps/utils/gps_extended_c.h @@ -921,6 +921,7 @@ typedef uint32_t NmeaSentenceTypesMask; #define LOC_NMEA_MASK_GQGSV_V02 ((NmeaSentenceTypesMask)0x10000000) /**< Enable GQGSV type */ #define LOC_NMEA_MASK_GIGSV_V02 ((NmeaSentenceTypesMask)0x20000000) /**< Enable GIGSV type */ #define LOC_NMEA_MASK_GNDTM_V02 ((NmeaSentenceTypesMask)0x40000000) /**< Enable GNDTM type */ +#define LOC_NMEA_MASK_TAGBLOCK_V02 ((NmeaSentenceTypesMask)0x80000000) /**< Enable TAGBLOCK type */ // all bitmasks of general supported NMEA sentenses - debug is not part of this diff --git a/gps/utils/loc_nmea.cpp b/gps/utils/loc_nmea.cpp index 75babde2..6b5e60e7 100644 --- a/gps/utils/loc_nmea.cpp +++ b/gps/utils/loc_nmea.cpp @@ -45,6 +45,7 @@ #define MAX_SATELLITES_IN_USE 12 #define MSEC_IN_ONE_WEEK 604800000ULL #define UTC_GPS_OFFSET_MSECS 315964800000ULL +#define MAX_TAG_BLOCK_GROUP_CODE (99999) // GNSS system id according to NMEA spec #define SYSTEM_ID_GPS 1 @@ -566,23 +567,28 @@ SIDE EFFECTS N/A ===========================================================================*/ -static int loc_nmea_put_checksum(char *pNmea, int maxSize) +static int loc_nmea_put_checksum(char *pNmea, int maxSize, bool isTagBlock) { uint8_t checksum = 0; int length = 0; + int checksumLength = 0; if(NULL == pNmea) return 0; - pNmea++; //skip the $ + pNmea++; //skip the $ or / for Tag Block while (*pNmea != '\0') { checksum ^= *pNmea++; length++; } - // length now contains nmea sentence string length not including $ sign. - int checksumLength = snprintf(pNmea,(maxSize-length-1),"*%02X\r\n", checksum); - + if (isTagBlock) { + // length now contains tag block sentence string length not including / sign. + checksumLength = snprintf(pNmea, (maxSize-length-1), "*%02X\\", checksum); + } else { + // length now contains nmea sentence string length not including $ sign. + checksumLength = snprintf(pNmea, (maxSize-length-1), "*%02X\r\n", checksum); + } // total length of nmea sentence is length of nmea sentence inc $ sign plus // length of checksum (+1 is to cover the $ character in the length). return (length + checksumLength + 1); @@ -613,7 +619,8 @@ static uint32_t loc_nmea_generate_GSA(const GpsLocationExtended &locationExtende char* sentence, int bufSize, loc_nmea_sv_meta* sv_meta_p, - std::vector &nmeaArraystr) + std::vector &nmeaArraystr, + bool isTagBlockGroupingEnabled) { if (!sentence || bufSize <= 0 || !sv_meta_p) { @@ -624,9 +631,14 @@ static uint32_t loc_nmea_generate_GSA(const GpsLocationExtended &locationExtende char* pMarker = sentence; int lengthRemaining = bufSize; int length = 0; + int lengthTagBlock = 0; uint32_t svUsedCount = 0; uint32_t svUsedList[64] = {0}; + uint32_t sentenceCount = 0; + uint32_t sentenceNumber = 1; + size_t svNumber = 1; + static uint32_t code = 1; char fixType = '\0'; @@ -645,77 +657,98 @@ static uint32_t loc_nmea_generate_GSA(const GpsLocationExtended &locationExtende mask = mask >> 1; } - if (svUsedCount == 0) - return 0; - - if (sv_meta_p->totalSvUsedCount == 0) - fixType = '1'; // no fix - else if (sv_meta_p->totalSvUsedCount <= 3) - fixType = '2'; // 2D fix - else - fixType = '3'; // 3D fix - - // Start printing the sentence - // Format: $--GSA,a,x,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,p.p,h.h,v.v,s*cc - // a : Mode : A : Automatic, allowed to automatically switch 2D/3D - // x : Fixtype : 1 (no fix), 2 (2D fix), 3 (3D fix) - // xx : 12 SV ID - // p.p : Position DOP (Dilution of Precision) - // h.h : Horizontal DOP - // v.v : Vertical DOP - // s : GNSS System Id - // cc : Checksum value - length = snprintf(pMarker, lengthRemaining, "$%sGSA,A,%c,", talker, fixType); - - if (length < 0 || length >= lengthRemaining) - { - LOC_LOGE("NMEA Error in string formatting"); + if (svUsedCount == 0) { return 0; + } else { + sentenceNumber = 1; + sentenceCount = svUsedCount / 12 + (svUsedCount % 12 != 0); + svNumber = 1; } - pMarker += length; - lengthRemaining -= length; - - // Add first 12 satellite IDs - for (uint8_t i = 0; i < 12; i++) - { - if (i < svUsedCount) - length = snprintf(pMarker, lengthRemaining, "%02d,", svUsedList[i]); + while (sentenceNumber <= sentenceCount) { + pMarker = sentence; + lengthRemaining = bufSize; + if (svUsedCount > 12 && isTagBlockGroupingEnabled) { + lengthTagBlock = snprintf(pMarker, lengthRemaining, "\\g:%d-%d-%d", sentenceNumber, + sentenceCount, code); + if (MAX_TAG_BLOCK_GROUP_CODE == code) { + code = 1; + } + lengthTagBlock = loc_nmea_put_checksum(sentence, bufSize, true); + pMarker += lengthTagBlock; + lengthRemaining -= lengthTagBlock; + } + if (sv_meta_p->totalSvUsedCount == 0) + fixType = '1'; // no fix + else if (sv_meta_p->totalSvUsedCount <= 3) + fixType = '2'; // 2D fix else - length = snprintf(pMarker, lengthRemaining, ","); + fixType = '3'; // 3D fix - if (length < 0 || length >= lengthRemaining) - { + // Start printing the sentence + // Format: $--GSA,a,x,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,p.p,h.h,v.v,s*cc + // a : Mode : A : Automatic, allowed to automatically switch 2D/3D + // x : Fixtype : 1 (no fix), 2 (2D fix), 3 (3D fix) + // xx : 12 SV ID + // p.p : Position DOP (Dilution of Precision) + // h.h : Horizontal DOP + // v.v : Vertical DOP + // s : GNSS System Id + // cc : Checksum value + length = snprintf(pMarker, lengthRemaining, "$%sGSA,A,%c,", talker, fixType); + if (length < 0 || length >= lengthRemaining) { LOC_LOGE("NMEA Error in string formatting"); return 0; } pMarker += length; lengthRemaining -= length; + + // Add 12 satellite IDs + for (uint8_t i = 0; i < 12; i++, svNumber++) + { + if (svNumber <= svUsedCount) + length = snprintf(pMarker, lengthRemaining, "%02d,", svUsedList[svNumber - 1]); + else + length = snprintf(pMarker, lengthRemaining, ","); + + if (length < 0 || length >= lengthRemaining) { + LOC_LOGE("NMEA Error in string formatting"); + return 0; + } + pMarker += length; + lengthRemaining -= length; + } + + // Add the position/horizontal/vertical DOP values + if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_DOP) + { + length = snprintf(pMarker, lengthRemaining, "%.1f,%.1f,%.1f,", + locationExtended.pdop, + locationExtended.hdop, + locationExtended.vdop); + } + else + { // no dop + length = snprintf(pMarker, lengthRemaining, ",,,"); + } + pMarker += length; + lengthRemaining -= length; + + // system id + length = snprintf(pMarker, lengthRemaining, "%d", sv_meta_p->systemId); + pMarker += length; + lengthRemaining -= length; + + /* Sentence is ready, add checksum and broadcast */ + length = loc_nmea_put_checksum(sentence + lengthTagBlock, bufSize - lengthTagBlock, false); + nmeaArraystr.push_back(sentence); + sentenceNumber++; + if (!isTagBlockGroupingEnabled) { + break; + } } - - // Add the position/horizontal/vertical DOP values - if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_DOP) - { - length = snprintf(pMarker, lengthRemaining, "%.1f,%.1f,%.1f,", - locationExtended.pdop, - locationExtended.hdop, - locationExtended.vdop); + if (svUsedCount > 12 && isTagBlockGroupingEnabled) { + code++; } - else - { // no dop - length = snprintf(pMarker, lengthRemaining, ",,,"); - } - pMarker += length; - lengthRemaining -= length; - - // system id - length = snprintf(pMarker, lengthRemaining, "%d", sv_meta_p->systemId); - pMarker += length; - lengthRemaining -= length; - - /* Sentence is ready, add checksum and broadcast */ - length = loc_nmea_put_checksum(sentence, bufSize); - nmeaArraystr.push_back(sentence); - return svUsedCount; } @@ -874,7 +907,7 @@ static void loc_nmea_generate_GSV(const GnssSvNotification &svNotify, pMarker += length; lengthRemaining -= length; - length = loc_nmea_put_checksum(sentence, bufSize); + length = loc_nmea_put_checksum(sentence, bufSize, false); nmeaArraystr.push_back(sentence); sentenceNumber++; @@ -983,7 +1016,7 @@ static void loc_nmea_generate_DTM(const LocLla &ref_lla, pMarker += length; lengthRemaining -= length; - length = loc_nmea_put_checksum(sentence, bufSize); + length = loc_nmea_put_checksum(sentence, bufSize, false); } /*=========================================================================== @@ -1299,7 +1332,8 @@ void loc_nmea_generate_pos(const UlpLocation &location, unsigned char generate_nmea, bool custom_gga_fix_quality, std::vector &nmeaArraystr, - int& indexOfGGA) + int& indexOfGGA, + bool isTagBlockGroupingEnabled) { ENTRY_LOG(); @@ -1380,7 +1414,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, count = loc_nmea_generate_GSA(locationExtended, sentence, sizeof(sentence), loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_GPS, - GNSS_SIGNAL_GPS_L1CA, true), nmeaArraystr); + GNSS_SIGNAL_GPS_L1CA, true), nmeaArraystr, isTagBlockGroupingEnabled); if (count > 0) { svUsedCount += count; @@ -1394,7 +1428,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, count = loc_nmea_generate_GSA(locationExtended, sentence, sizeof(sentence), loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_GLONASS, - GNSS_SIGNAL_GLONASS_G1, true), nmeaArraystr); + GNSS_SIGNAL_GLONASS_G1, true), nmeaArraystr, isTagBlockGroupingEnabled); if (count > 0) { svUsedCount += count; @@ -1408,7 +1442,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, count = loc_nmea_generate_GSA(locationExtended, sentence, sizeof(sentence), loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_GALILEO, - GNSS_SIGNAL_GALILEO_E1, true), nmeaArraystr); + GNSS_SIGNAL_GALILEO_E1, true), nmeaArraystr, isTagBlockGroupingEnabled); if (count > 0) { svUsedCount += count; @@ -1421,7 +1455,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, // ---------------------------- count = loc_nmea_generate_GSA(locationExtended, sentence, sizeof(sentence), loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_BEIDOU, - GNSS_SIGNAL_BEIDOU_B1I, true), nmeaArraystr); + GNSS_SIGNAL_BEIDOU_B1I, true), nmeaArraystr, isTagBlockGroupingEnabled); if (count > 0) { svUsedCount += count; @@ -1435,7 +1469,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, count = loc_nmea_generate_GSA(locationExtended, sentence, sizeof(sentence), loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_QZSS, - GNSS_SIGNAL_QZSS_L1CA, true), nmeaArraystr); + GNSS_SIGNAL_QZSS_L1CA, true), nmeaArraystr, isTagBlockGroupingEnabled); if (count > 0) { svUsedCount += count; @@ -1447,7 +1481,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, // in this case, generate an empty GSA sentence if (svUsedCount == 0) { strlcpy(sentence, "$GPGSA,A,1,,,,,,,,,,,,,,,,", sizeof(sentence)); - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); + length = loc_nmea_put_checksum(sentence, sizeof(sentence), false); nmeaArraystr.push_back(sentence); } @@ -1514,7 +1548,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, length = snprintf(pMarker, lengthRemaining, "%c", vtgModeIndicator); - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); + length = loc_nmea_put_checksum(sentence, sizeof(sentence), false); nmeaArraystr.push_back(sentence); memset(&ecef_w84, 0, sizeof(ecef_w84)); @@ -1718,7 +1752,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, // hardcode Navigation Status field to 'V' length = snprintf(pMarker, lengthRemaining, ",%c", 'V'); - length = loc_nmea_put_checksum(sentence_RMC, sizeof(sentence_RMC)); + length = loc_nmea_put_checksum(sentence_RMC, sizeof(sentence_RMC), false); // ------------------- // ------$--GNS------- @@ -1880,7 +1914,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, pMarker += length; lengthRemaining -= length; - length = loc_nmea_put_checksum(sentence_GNS, sizeof(sentence_GNS)); + length = loc_nmea_put_checksum(sentence_GNS, sizeof(sentence_GNS), false); // ------------------- // ------$--GGA------- @@ -2037,7 +2071,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, lengthRemaining -= length; } - length = loc_nmea_put_checksum(sentence_GGA, sizeof(sentence_GGA)); + length = loc_nmea_put_checksum(sentence_GGA, sizeof(sentence_GGA), false); // ------$--DTM------- nmeaArraystr.push_back(sentence_DTM); @@ -2060,27 +2094,27 @@ void loc_nmea_generate_pos(const UlpLocation &location, //Send blank NMEA reports for non-final fixes else { strlcpy(sentence, "$GPGSA,A,1,,,,,,,,,,,,,,,,", sizeof(sentence)); - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); + length = loc_nmea_put_checksum(sentence, sizeof(sentence), false); nmeaArraystr.push_back(sentence); strlcpy(sentence, "$GPVTG,,T,,M,,N,,K,N", sizeof(sentence)); - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); + length = loc_nmea_put_checksum(sentence, sizeof(sentence), false); nmeaArraystr.push_back(sentence); strlcpy(sentence, "$GPDTM,,,,,,,,", sizeof(sentence)); - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); + length = loc_nmea_put_checksum(sentence, sizeof(sentence), false); nmeaArraystr.push_back(sentence); strlcpy(sentence, "$GPRMC,,V,,,,,,,,,,N,V", sizeof(sentence)); - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); + length = loc_nmea_put_checksum(sentence, sizeof(sentence), false); nmeaArraystr.push_back(sentence); strlcpy(sentence, "$GPGNS,,,,,,N,,,,,,,V", sizeof(sentence)); - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); + length = loc_nmea_put_checksum(sentence, sizeof(sentence), false); nmeaArraystr.push_back(sentence); strlcpy(sentence, "$GPGGA,,,,,,0,,,,,,,,", sizeof(sentence)); - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); + length = loc_nmea_put_checksum(sentence, sizeof(sentence), false); nmeaArraystr.push_back(sentence); } diff --git a/gps/utils/loc_nmea.h b/gps/utils/loc_nmea.h index ef99e0f1..2d98f428 100644 --- a/gps/utils/loc_nmea.h +++ b/gps/utils/loc_nmea.h @@ -81,7 +81,8 @@ void loc_nmea_generate_pos(const UlpLocation &location, unsigned char generate_nmea, bool custom_gga_fix_quality, std::vector &nmeaArraystr, - int& indexOfGGA); + int& indexOfGGA, + bool isTagBlockGroupingEnabled); #define DEBUG_NMEA_MINSIZE 6 #define DEBUG_NMEA_MAXSIZE 4096 diff --git a/sdm660.mk b/sdm660.mk index a173adc3..1d9a7134 100644 --- a/sdm660.mk +++ b/sdm660.mk @@ -222,6 +222,8 @@ PRODUCT_GMS_CLIENTID_BASE := android-xiaomi PRODUCT_PACKAGES += \ android.hardware.gnss@2.1-impl-qti \ android.hardware.gnss@2.1-service-qti \ + android.hardware.gnss.measurement_corrections@1.1.vendor \ + android.hardware.gnss.visibility_control@1.0.vendor \ libbatching \ libgeofencing \ libgnss \