sm8350-common: gps: Update to LA.UM.9.14.r1-19200.02-LAHAINA.QSSI13.0
Change-Id: I467ece57b82127382f11e48d0dd80e362df0d1c9
This commit is contained in:
parent
3648477f6e
commit
467b1af609
@ -16,18 +16,6 @@ GNSS_CFLAGS = [
|
|||||||
"-Wno-error=date-time",
|
"-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,
|
/* Activate the following for debug purposes only,
|
||||||
comment out for production */
|
comment out for production */
|
||||||
GNSS_SANITIZE_DIAG = {
|
GNSS_SANITIZE_DIAG = {
|
||||||
|
@ -36,9 +36,6 @@ endif
|
|||||||
LOCAL_PATH := $(call my-dir)
|
LOCAL_PATH := $(call my-dir)
|
||||||
include $(call all-makefiles-under,$(LOCAL_PATH))
|
include $(call all-makefiles-under,$(LOCAL_PATH))
|
||||||
|
|
||||||
GNSS_SANITIZE := cfi bounds null unreachable integer
|
GNSS_SANITIZE_DIAG := cfi bounds null unreachable integer address
|
||||||
# Activate the following two lines for regression testing
|
|
||||||
#GNSS_SANITIZE += address
|
|
||||||
#GNSS_SANITIZE_DIAG := $(GNSS_SANITIZE)
|
|
||||||
|
|
||||||
endif # ifneq ($(BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE),)
|
endif # ifneq ($(BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE),)
|
||||||
|
@ -2,7 +2,7 @@ LOCAL_PATH := $(call my-dir)
|
|||||||
|
|
||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
LOCAL_MODULE := android.hardware.gnss@1.0-impl-qti
|
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
|
# activate the following line for debug purposes only, comment out for production
|
||||||
#LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG)
|
#LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG)
|
||||||
LOCAL_VENDOR_MODULE := true
|
LOCAL_VENDOR_MODULE := true
|
||||||
@ -58,7 +58,7 @@ include $(BUILD_SHARED_LIBRARY)
|
|||||||
|
|
||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
LOCAL_MODULE := android.hardware.gnss@1.0-service-qti
|
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
|
# activate the following line for debug purposes only, comment out for production
|
||||||
#LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG)
|
#LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG)
|
||||||
LOCAL_VINTF_FRAGMENTS := android.hardware.gnss@1.0-service-qti.xml
|
LOCAL_VINTF_FRAGMENTS := android.hardware.gnss@1.0-service-qti.xml
|
||||||
|
@ -2,7 +2,7 @@ LOCAL_PATH := $(call my-dir)
|
|||||||
|
|
||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
LOCAL_MODULE := android.hardware.gnss@1.1-impl-qti
|
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
|
# activate the following line for debug purposes only, comment out for production
|
||||||
#LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG)
|
#LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG)
|
||||||
LOCAL_VENDOR_MODULE := true
|
LOCAL_VENDOR_MODULE := true
|
||||||
@ -59,7 +59,7 @@ include $(BUILD_SHARED_LIBRARY)
|
|||||||
|
|
||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
LOCAL_MODULE := android.hardware.gnss@1.1-service-qti
|
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
|
# activate the following line for debug purposes only, comment out for production
|
||||||
#LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG)
|
#LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG)
|
||||||
LOCAL_VINTF_FRAGMENTS := android.hardware.gnss@1.1-service-qti.xml
|
LOCAL_VINTF_FRAGMENTS := android.hardware.gnss@1.1-service-qti.xml
|
||||||
|
@ -2,7 +2,7 @@ LOCAL_PATH := $(call my-dir)
|
|||||||
|
|
||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
LOCAL_MODULE := android.hardware.gnss@2.0-impl-qti
|
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
|
# activate the following line for debug purposes only, comment out for production
|
||||||
#LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG)
|
#LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG)
|
||||||
LOCAL_VENDOR_MODULE := true
|
LOCAL_VENDOR_MODULE := true
|
||||||
@ -71,7 +71,7 @@ include $(BUILD_SHARED_LIBRARY)
|
|||||||
|
|
||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
LOCAL_MODULE := android.hardware.gnss@2.0-service-qti
|
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
|
# activate the following line for debug purposes only, comment out for production
|
||||||
#LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG)
|
#LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG)
|
||||||
LOCAL_VINTF_FRAGMENTS := android.hardware.gnss@2.0-service-qti.xml
|
LOCAL_VINTF_FRAGMENTS := android.hardware.gnss@2.0-service-qti.xml
|
||||||
|
@ -32,7 +32,7 @@ namespace implementation {
|
|||||||
|
|
||||||
static AGnss* spAGnss = nullptr;
|
static AGnss* spAGnss = nullptr;
|
||||||
|
|
||||||
AGnss::AGnss(Gnss* gnss) : mGnss(gnss) {
|
AGnss::AGnss(Gnss* gnss) : mGnss(gnss), mType(LOC_AGPS_TYPE_INVALID) {
|
||||||
spAGnss = this;
|
spAGnss = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,6 +51,9 @@ void AGnss::statusCb(AGpsExtType type, LocAGpsStatusValue status) {
|
|||||||
V2_0::IAGnssCallback::AGnssType aType;
|
V2_0::IAGnssCallback::AGnssType aType;
|
||||||
IAGnssCallback::AGnssStatusValue aStatus;
|
IAGnssCallback::AGnssStatusValue aStatus;
|
||||||
|
|
||||||
|
// cache the AGps Type
|
||||||
|
mType = type;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case LOC_AGPS_TYPE_SUPL:
|
case LOC_AGPS_TYPE_SUPL:
|
||||||
aType = IAGnssCallback::AGnssType::SUPL;
|
aType = IAGnssCallback::AGnssType::SUPL;
|
||||||
@ -138,18 +141,20 @@ Return<bool> AGnss::dataConnFailed() {
|
|||||||
Return<bool> AGnss::dataConnOpen(uint64_t /*networkHandle*/, const hidl_string& apn,
|
Return<bool> AGnss::dataConnOpen(uint64_t /*networkHandle*/, const hidl_string& apn,
|
||||||
V2_0::IAGnss::ApnIpType apnIpType) {
|
V2_0::IAGnss::ApnIpType apnIpType) {
|
||||||
|
|
||||||
if(mGnss == nullptr || mGnss->getGnssInterface() == nullptr){
|
if (mGnss == nullptr || mGnss->getGnssInterface() == nullptr){
|
||||||
LOC_LOGE("Null GNSS interface");
|
LOC_LOGE("Null GNSS interface");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Validate */
|
std::string apnString(apn.c_str());
|
||||||
if(apn.empty()){
|
// During Emergency SUPL, an apn name of "sos" means that no
|
||||||
LOC_LOGE("Invalid APN");
|
// apn was found, like in the simless case, so apn is cleared
|
||||||
return false;
|
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;
|
AGpsBearerType bearerType;
|
||||||
switch (apnIpType) {
|
switch (apnIpType) {
|
||||||
@ -168,7 +173,7 @@ Return<bool> AGnss::dataConnOpen(uint64_t /*networkHandle*/, const hidl_string&
|
|||||||
}
|
}
|
||||||
|
|
||||||
mGnss->getGnssInterface()->agpsDataConnOpen(
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,6 +67,8 @@ struct AGnss : public V2_0::IAGnss {
|
|||||||
private:
|
private:
|
||||||
Gnss* mGnss = nullptr;
|
Gnss* mGnss = nullptr;
|
||||||
sp<V2_0::IAGnssCallback> mAGnssCbIface = nullptr;
|
sp<V2_0::IAGnssCallback> mAGnssCbIface = nullptr;
|
||||||
|
|
||||||
|
AGpsExtType mType;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace implementation
|
} // namespace implementation
|
||||||
|
@ -2,7 +2,6 @@ LOCAL_PATH := $(call my-dir)
|
|||||||
|
|
||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
LOCAL_MODULE := android.hardware.gnss@2.1-impl-qti
|
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
|
# activate the following line for debug purposes only, comment out for production
|
||||||
#LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG)
|
#LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG)
|
||||||
LOCAL_VENDOR_MODULE := true
|
LOCAL_VENDOR_MODULE := true
|
||||||
@ -74,7 +73,7 @@ include $(BUILD_SHARED_LIBRARY)
|
|||||||
|
|
||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
LOCAL_MODULE := android.hardware.gnss@2.1-service-qti
|
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
|
# activate the following line for debug purposes only, comment out for production
|
||||||
#LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG)
|
#LOCAL_SANITIZE_DIAG += $(GNSS_SANITIZE_DIAG)
|
||||||
LOCAL_VINTF_FRAGMENTS := android.hardware.gnss@2.1-service-qti.xml
|
LOCAL_VINTF_FRAGMENTS := android.hardware.gnss@2.1-service-qti.xml
|
||||||
|
@ -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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are
|
* modification, are permitted provided that the following conditions are
|
||||||
@ -33,7 +33,7 @@
|
|||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <log_util.h>
|
#include <log_util.h>
|
||||||
#include <loc_cfg.h>
|
#include <loc_cfg.h>
|
||||||
|
#include <thread>
|
||||||
#include "LocationUtil.h"
|
#include "LocationUtil.h"
|
||||||
#include "BatchingAPIClient.h"
|
#include "BatchingAPIClient.h"
|
||||||
|
|
||||||
@ -82,10 +82,10 @@ BatchingAPIClient::~BatchingAPIClient()
|
|||||||
LOC_LOGD("%s]: ()", __FUNCTION__);
|
LOC_LOGD("%s]: ()", __FUNCTION__);
|
||||||
}
|
}
|
||||||
|
|
||||||
int BatchingAPIClient::getBatchSize()
|
int BatchingAPIClient::getBatchSize() {
|
||||||
{
|
int batchSize = locAPIGetBatchSize();
|
||||||
LOC_LOGD("%s]: ()", __FUNCTION__);
|
LOC_LOGd("batchSize: %d", batchSize);
|
||||||
return locAPIGetBatchSize();
|
return batchSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BatchingAPIClient::setCallbacks()
|
void BatchingAPIClient::setCallbacks()
|
||||||
@ -133,8 +133,10 @@ void BatchingAPIClient::gnssUpdateCallbacks_2_0(const sp<V2_0::IGnssBatchingCall
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int BatchingAPIClient::startSession(const IGnssBatching::Options& opts)
|
int BatchingAPIClient::startSession(const IGnssBatching::Options& opts) {
|
||||||
{
|
mMutex.lock();
|
||||||
|
mState = STARTED;
|
||||||
|
mMutex.unlock();
|
||||||
LOC_LOGD("%s]: (%lld %d)", __FUNCTION__,
|
LOC_LOGD("%s]: (%lld %d)", __FUNCTION__,
|
||||||
static_cast<long long>(opts.periodNanos), static_cast<uint8_t>(opts.flags));
|
static_cast<long long>(opts.periodNanos), static_cast<uint8_t>(opts.flags));
|
||||||
int retVal = -1;
|
int retVal = -1;
|
||||||
@ -168,10 +170,13 @@ int BatchingAPIClient::updateSessionOptions(const IGnssBatching::Options& opts)
|
|||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
int BatchingAPIClient::stopSession()
|
int BatchingAPIClient::stopSession() {
|
||||||
{
|
mMutex.lock();
|
||||||
|
mState = STOPPING;
|
||||||
|
mMutex.unlock();
|
||||||
LOC_LOGD("%s]: ", __FUNCTION__);
|
LOC_LOGD("%s]: ", __FUNCTION__);
|
||||||
int retVal = -1;
|
int retVal = -1;
|
||||||
|
locAPIGetBatchedLocations(mDefaultId, SIZE_MAX);
|
||||||
if (locAPIStopSession(mDefaultId) == LOCATION_ERROR_SUCCESS) {
|
if (locAPIStopSession(mDefaultId) == LOCATION_ERROR_SUCCESS) {
|
||||||
retVal = 1;
|
retVal = 1;
|
||||||
}
|
}
|
||||||
@ -184,10 +189,15 @@ void BatchingAPIClient::getBatchedLocation(int last_n_locations)
|
|||||||
locAPIGetBatchedLocations(mDefaultId, last_n_locations);
|
locAPIGetBatchedLocations(mDefaultId, last_n_locations);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BatchingAPIClient::flushBatchedLocations()
|
void BatchingAPIClient::flushBatchedLocations() {
|
||||||
{
|
|
||||||
LOC_LOGD("%s]: ()", __FUNCTION__);
|
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)
|
void BatchingAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMask)
|
||||||
@ -197,37 +207,68 @@ void BatchingAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMa
|
|||||||
}
|
}
|
||||||
|
|
||||||
void BatchingAPIClient::onBatchingCb(size_t count, Location* location,
|
void BatchingAPIClient::onBatchingCb(size_t count, Location* location,
|
||||||
BatchingOptions /*batchOptions*/)
|
BatchingOptions /*batchOptions*/) {
|
||||||
{
|
bool processReport = false;
|
||||||
|
LOC_LOGd("(count: %zu)", count);
|
||||||
mMutex.lock();
|
mMutex.lock();
|
||||||
auto gnssBatchingCbIface(mGnssBatchingCbIface);
|
// back to back stop() and flush() could bring twice onBatchingCb(). Each one might come first.
|
||||||
auto gnssBatchingCbIface_2_0(mGnssBatchingCbIface_2_0);
|
// Combine them both (the first goes to cache, the second in location*) before report to FW
|
||||||
mMutex.unlock();
|
switch (mState) {
|
||||||
|
case STOPPING:
|
||||||
LOC_LOGD("%s]: (count: %zu)", __FUNCTION__, count);
|
mState = STOPPED;
|
||||||
if (gnssBatchingCbIface_2_0 != nullptr && count > 0) {
|
for (size_t i = 0; i < count; i++) {
|
||||||
hidl_vec<V2_0::GnssLocation> locationVec;
|
mBatchedLocationInCache.push_back(location[i]);
|
||||||
locationVec.resize(count);
|
}
|
||||||
for (size_t i = 0; i < count; i++) {
|
break;
|
||||||
convertGnssLocation(location[i], locationVec[i]);
|
case STARTED:
|
||||||
}
|
case STOPPED: // flush() always trigger report, even on a stopped session
|
||||||
auto r = gnssBatchingCbIface_2_0->gnssLocationBatchCb(locationVec);
|
processReport = true;
|
||||||
if (!r.isOk()) {
|
break;
|
||||||
LOC_LOGE("%s] Error from gnssLocationBatchCb 2_0 description=%s",
|
default:
|
||||||
__func__, r.description().c_str());
|
break;
|
||||||
}
|
|
||||||
} else if (gnssBatchingCbIface != nullptr && count > 0) {
|
|
||||||
hidl_vec<V1_0::GnssLocation> 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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
// 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<V2_0::GnssLocation> 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<V1_0::GnssLocation> 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,
|
static void convertBatchOption(const IGnssBatching::Options& in, LocationOptions& out,
|
||||||
|
@ -43,6 +43,9 @@ namespace gnss {
|
|||||||
namespace V2_1 {
|
namespace V2_1 {
|
||||||
namespace implementation {
|
namespace implementation {
|
||||||
|
|
||||||
|
|
||||||
|
enum BATCHING_STATE { STARTED, STOPPING, STOPPED };
|
||||||
|
|
||||||
class BatchingAPIClient : public LocationAPIClientBase
|
class BatchingAPIClient : public LocationAPIClientBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -72,6 +75,9 @@ private:
|
|||||||
uint32_t mDefaultId;
|
uint32_t mDefaultId;
|
||||||
LocationCapabilitiesMask mLocationCapabilitiesMask;
|
LocationCapabilitiesMask mLocationCapabilitiesMask;
|
||||||
sp<V2_0::IGnssBatchingCallback> mGnssBatchingCbIface_2_0;
|
sp<V2_0::IGnssBatchingCallback> mGnssBatchingCbIface_2_0;
|
||||||
|
volatile BATCHING_STATE mState = STOPPED;
|
||||||
|
|
||||||
|
std::vector<Location> mBatchedLocationInCache;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace implementation
|
} // namespace implementation
|
||||||
|
@ -3,7 +3,7 @@ cc_library_static {
|
|||||||
name: "liblocbatterylistener",
|
name: "liblocbatterylistener",
|
||||||
vendor: true,
|
vendor: true,
|
||||||
|
|
||||||
sanitize: GNSS_SANITIZE,
|
|
||||||
|
|
||||||
cflags: GNSS_CFLAGS + ["-DBATTERY_LISTENER_ENABLED"],
|
cflags: GNSS_CFLAGS + ["-DBATTERY_LISTENER_ENABLED"],
|
||||||
local_include_dirs: ["."],
|
local_include_dirs: ["."],
|
||||||
|
@ -4,7 +4,7 @@ cc_library_shared {
|
|||||||
name: "libbatching",
|
name: "libbatching",
|
||||||
vendor: true,
|
vendor: true,
|
||||||
|
|
||||||
sanitize: GNSS_SANITIZE,
|
|
||||||
|
|
||||||
shared_libs: [
|
shared_libs: [
|
||||||
"libutils",
|
"libutils",
|
||||||
|
@ -37,7 +37,9 @@
|
|||||||
using namespace loc_core;
|
using namespace loc_core;
|
||||||
|
|
||||||
BatchingAdapter::BatchingAdapter() :
|
BatchingAdapter::BatchingAdapter() :
|
||||||
LocAdapterBase(0, LocContext::getLocContext(LocContext::mLocationHalName)),
|
LocAdapterBase(0,
|
||||||
|
LocContext::getLocContext(LocContext::mLocationHalName),
|
||||||
|
false, nullptr, true),
|
||||||
mOngoingTripDistance(0),
|
mOngoingTripDistance(0),
|
||||||
mOngoingTripTBFInterval(0),
|
mOngoingTripTBFInterval(0),
|
||||||
mTripWithOngoingTBFDropped(false),
|
mTripWithOngoingTBFDropped(false),
|
||||||
@ -50,6 +52,10 @@ BatchingAdapter::BatchingAdapter() :
|
|||||||
LOC_LOGD("%s]: Constructor", __func__);
|
LOC_LOGD("%s]: Constructor", __func__);
|
||||||
readConfigCommand();
|
readConfigCommand();
|
||||||
setConfigCommand();
|
setConfigCommand();
|
||||||
|
|
||||||
|
// at last step, let us inform adapater base that we are done
|
||||||
|
// with initialization, e.g.: ready to process handleEngineUpEvent
|
||||||
|
doneInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -4,7 +4,7 @@ cc_library_shared {
|
|||||||
name: "libloc_core",
|
name: "libloc_core",
|
||||||
vendor: true,
|
vendor: true,
|
||||||
|
|
||||||
sanitize: GNSS_SANITIZE,
|
|
||||||
|
|
||||||
shared_libs: [
|
shared_libs: [
|
||||||
"liblog",
|
"liblog",
|
||||||
|
@ -1034,7 +1034,7 @@ bool ElapsedRealtimeEstimator::getCurrentTime(
|
|||||||
struct timespec sinceBootTime;
|
struct timespec sinceBootTime;
|
||||||
struct timespec sinceBootTimeTest;
|
struct timespec sinceBootTimeTest;
|
||||||
bool clockGetTimeSuccess = false;
|
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;
|
const uint32_t MAX_GET_TIME_COUNT = 20;
|
||||||
/* Attempt to get CLOCK_REALTIME and CLOCK_BOOTIME in succession without an interruption
|
/* 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 */
|
or context switch (for up to MAX_GET_TIME_COUNT times) to avoid errors in the calculation */
|
||||||
|
@ -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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are
|
* modification, are permitted provided that the following conditions are
|
||||||
@ -1586,6 +1586,7 @@ bool SystemStatus::eventDataItemNotify(IDataItemCore* dataitem)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&mMutexSystemStatus);
|
pthread_mutex_unlock(&mMutexSystemStatus);
|
||||||
|
LOC_LOGv("DataItemId: %d, whether to record dateitem in cache: %d", dataitem->getId(), ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are
|
* 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) {
|
for (uint8_t i = 0; rtv && i < MAX_NETWORK_HANDLES; ++i) {
|
||||||
rtv &= (mAllNetworkHandles[i] == peer.mAllNetworkHandles[i]);
|
rtv &= (mAllNetworkHandles[i] == peer.mAllNetworkHandles[i]);
|
||||||
}
|
}
|
||||||
return peer.mApn.compare(mApn);
|
return rtv && !peer.mApn.compare(mApn);
|
||||||
}
|
}
|
||||||
inline virtual SystemStatusItemBase& collate(SystemStatusItemBase& curInfo) {
|
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<SystemStatusNetworkInfo&>(curInfo)).mAllTypes;
|
uint64_t allTypes = (static_cast<SystemStatusNetworkInfo&>(curInfo)).mAllTypes;
|
||||||
string& apn = (static_cast<SystemStatusNetworkInfo&>(curInfo)).mApn;
|
string& apn = (static_cast<SystemStatusNetworkInfo&>(curInfo)).mApn;
|
||||||
// Replace current with cached table for now and then update
|
// Replace current with cached table for now and then update
|
||||||
|
@ -80,7 +80,8 @@
|
|||||||
# NUMBER_OF_ROWS_SGC_ and NUMBER_OF_COLUMNS_SGC_ represent the number of
|
# NUMBER_OF_ROWS_SGC_ and NUMBER_OF_COLUMNS_SGC_ represent the number of
|
||||||
# rows/columns for signal gain corrections
|
# 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
|
CARRIER_FREQUENCY_0 = 1575.42
|
||||||
|
|
||||||
|
@ -5,6 +5,8 @@ ERR_ESTIMATE=0
|
|||||||
|
|
||||||
#NTP server
|
#NTP server
|
||||||
NTP_SERVER=time.xtracloud.net
|
NTP_SERVER=time.xtracloud.net
|
||||||
|
NTP_SERVER_2=asia.pool.ntp.org
|
||||||
|
NTP_SERVER_3=0.cn.pool.ntp.org
|
||||||
|
|
||||||
#XTRA CA path
|
#XTRA CA path
|
||||||
XTRA_CA_PATH=/usr/lib/ssl-1.1/certs
|
XTRA_CA_PATH=/usr/lib/ssl-1.1/certs
|
||||||
@ -18,22 +20,22 @@ DEBUG_LEVEL = 2
|
|||||||
INTERMEDIATE_POS=0
|
INTERMEDIATE_POS=0
|
||||||
|
|
||||||
# supl version 1.0
|
# supl version 1.0
|
||||||
SUPL_VER=0x10000
|
SUPL_VER=0x20004
|
||||||
|
|
||||||
# Emergency SUPL, 1=enable, 0=disable
|
# Emergency SUPL, 1=enable, 0=disable
|
||||||
#SUPL_ES=1
|
SUPL_ES=0
|
||||||
|
|
||||||
#Choose PDN for Emergency SUPL
|
#Choose PDN for Emergency SUPL
|
||||||
#1 - Use emergency PDN
|
#1 - Use emergency PDN
|
||||||
#0 - Use regular SUPL PDN for Emergency SUPL
|
#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.
|
#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
|
#If it is uncommented here, this value will overwrite the value from
|
||||||
#config.xml.
|
#config.xml.
|
||||||
#MSA=0X2
|
#MSA=0X2
|
||||||
#MSB=0X1
|
#MSB=0X1
|
||||||
#SUPL_MODE=
|
SUPL_MODE=3
|
||||||
|
|
||||||
# GPS Capabilities bit mask
|
# GPS Capabilities bit mask
|
||||||
# SCHEDULING = 0x01
|
# SCHEDULING = 0x01
|
||||||
@ -45,15 +47,15 @@ CAPABILITIES=0x17
|
|||||||
|
|
||||||
# Accuracy threshold for intermediate positions
|
# Accuracy threshold for intermediate positions
|
||||||
# less accurate positions are ignored, 0 for passing all positions
|
# less accurate positions are ignored, 0 for passing all positions
|
||||||
# ACCURACY_THRES=5000
|
ACCURACY_THRES=70
|
||||||
|
|
||||||
################################
|
################################
|
||||||
##### AGPS server settings #####
|
##### AGPS server settings #####
|
||||||
################################
|
################################
|
||||||
|
|
||||||
# FOR SUPL SUPPORT, set the following
|
# FOR SUPL SUPPORT, set the following
|
||||||
# SUPL_HOST=supl.host.com or IP
|
# SUPL_HOST=supl.qxwz.com
|
||||||
# SUPL_PORT=1234
|
# SUPL_PORT=7275
|
||||||
|
|
||||||
# FOR MO SUPL SUPPORT, set the following
|
# FOR MO SUPL SUPPORT, set the following
|
||||||
# MO_SUPL_HOST=supl.host.com or IP
|
# MO_SUPL_HOST=supl.host.com or IP
|
||||||
@ -80,7 +82,7 @@ CAPABILITIES=0x17
|
|||||||
# 0x2: LPP Control Plane
|
# 0x2: LPP Control Plane
|
||||||
# 0x4: LPP User Plane for NR5G
|
# 0x4: LPP User Plane for NR5G
|
||||||
# 0x8: LPP Control Plane for NR5G
|
# 0x8: LPP Control Plane for NR5G
|
||||||
LPP_PROFILE = 2
|
LPP_PROFILE = 0xf
|
||||||
|
|
||||||
####################################
|
####################################
|
||||||
#Datum Type
|
#Datum Type
|
||||||
@ -146,7 +148,7 @@ SGLTE_TARGET=0
|
|||||||
# 0x1: RRC CPlane
|
# 0x1: RRC CPlane
|
||||||
# 0x2: RRLP UPlane
|
# 0x2: RRLP UPlane
|
||||||
# 0x4: LLP Uplane
|
# 0x4: LLP Uplane
|
||||||
A_GLONASS_POS_PROTOCOL_SELECT = 0
|
A_GLONASS_POS_PROTOCOL_SELECT = 0xf
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
# Select technology for LPPe Control Plane
|
# Select technology for LPPe Control Plane
|
||||||
@ -155,7 +157,7 @@ A_GLONASS_POS_PROTOCOL_SELECT = 0
|
|||||||
# 0x2: WLAN AP Measurements for LPPe CP
|
# 0x2: WLAN AP Measurements for LPPe CP
|
||||||
# 0x4: SRN AP measurement for CP
|
# 0x4: SRN AP measurement for CP
|
||||||
# 0x8: Sensor Barometer Measurement LPPe CP
|
# 0x8: Sensor Barometer Measurement LPPe CP
|
||||||
#LPPE_CP_TECHNOLOGY = 0
|
LPPE_CP_TECHNOLOGY = 0
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
# Select technology for LPPe User Plane
|
# Select technology for LPPe User Plane
|
||||||
@ -164,7 +166,7 @@ A_GLONASS_POS_PROTOCOL_SELECT = 0
|
|||||||
# 0x2: WLAN AP Measurements for LPPe UP
|
# 0x2: WLAN AP Measurements for LPPe UP
|
||||||
# 0x4: SRN AP measurement for UP
|
# 0x4: SRN AP measurement for UP
|
||||||
# 0x8: Sensor Barometer Measurement LPPe UP
|
# 0x8: Sensor Barometer Measurement LPPe UP
|
||||||
#LPPE_UP_TECHNOLOGY = 0
|
LPPE_UP_TECHNOLOGY = 0
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
# AGPS_CONFIG_INJECT
|
# AGPS_CONFIG_INJECT
|
||||||
@ -243,6 +245,10 @@ MISSING_PULSE_TIME_DELTA = 900
|
|||||||
# logic incase of missing PPS pulse
|
# logic incase of missing PPS pulse
|
||||||
PROPAGATION_TIME_UNCERTAINTY = 1
|
PROPAGATION_TIME_UNCERTAINTY = 1
|
||||||
|
|
||||||
|
XTRA_TEST_ENABLED = 1
|
||||||
|
XTRA_THROTTLE_ENABLED = 0
|
||||||
|
XTRA_SYSTEM_TIME_INJECT = 1
|
||||||
|
|
||||||
#######################################
|
#######################################
|
||||||
# APN / IP Type Configuration
|
# APN / IP Type Configuration
|
||||||
# APN and IP Type to use for setting
|
# APN and IP Type to use for setting
|
||||||
@ -308,7 +314,7 @@ MODEM_TYPE = 1
|
|||||||
#####################################
|
#####################################
|
||||||
# This is a string that is sent to the framework
|
# This is a string that is sent to the framework
|
||||||
# in nfwNotifyCb callback
|
# in nfwNotifyCb callback
|
||||||
PROXY_APP_PACKAGE_NAME = com.google.android.carrierlocation
|
PROXY_APP_PACKAGE_NAME = com.lbe.security.miui
|
||||||
|
|
||||||
#####################################
|
#####################################
|
||||||
# CP_MTLR_ES
|
# CP_MTLR_ES
|
||||||
@ -346,6 +352,7 @@ D_LEVEL_TIME_DEPTH = 30
|
|||||||
D_LEVEL_MAX_CAPACITY = 300
|
D_LEVEL_MAX_CAPACITY = 300
|
||||||
V_LEVEL_TIME_DEPTH = 200
|
V_LEVEL_TIME_DEPTH = 200
|
||||||
V_LEVEL_MAX_CAPACITY = 400
|
V_LEVEL_MAX_CAPACITY = 400
|
||||||
|
NI_SUPL_DENY_ON_NFW_LOCKED = 0
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
# Allow buffer diag log packets when diag memory allocation
|
# Allow buffer diag log packets when diag memory allocation
|
||||||
@ -356,7 +363,7 @@ BUFFER_DIAG_LOGGING = 1
|
|||||||
#######################################
|
#######################################
|
||||||
# NTRIP CLIENT LIBRARY NAME
|
# NTRIP CLIENT LIBRARY NAME
|
||||||
#######################################
|
#######################################
|
||||||
# NTRIP_CLIENT_LIB_NAME =
|
NTRIP_CLIENT_LIB_NAME = libxiaomi_eDGNSS_client_wrapper.so
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
# Correction Data Framework settings
|
# Correction Data Framework settings
|
||||||
@ -389,3 +396,7 @@ RF_LOSS_BDS_B2A = 0
|
|||||||
RF_LOSS_GAL = 0
|
RF_LOSS_GAL = 0
|
||||||
RF_LOSS_GAL_E5 = 0
|
RF_LOSS_GAL_E5 = 0
|
||||||
RF_LOSS_NAVIC = 0
|
RF_LOSS_NAVIC = 0
|
||||||
|
|
||||||
|
#print more informatation for correction data debugging
|
||||||
|
#DEBUG_REF_STATION = 1
|
||||||
|
#DEBUG_OBSERVATION = 1
|
||||||
|
@ -22,8 +22,9 @@
|
|||||||
|
|
||||||
# Log level
|
# 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
|
# 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 = 4
|
LOWI_LOG_LEVEL = 3
|
||||||
LOWI_USE_LOWI_LP = 0
|
LOWI_USE_LOWI_LP = 0
|
||||||
LOWI_HE_RTT_SUPPORT = 1
|
LOWI_HE_RTT_SUPPORT = 1
|
||||||
LOWI_USE_NLMSG_FOR_CAPS = 1
|
LOWI_USE_NLMSG_FOR_CAPS = 1
|
||||||
LOWI_RTT_WEIGHTED_MEAN = 1
|
LOWI_RTT_WEIGHTED_MEAN = 1
|
||||||
|
LOWI_USE_6G_CHANNELS = 1
|
||||||
|
@ -93,3 +93,27 @@ sendmsg: 1
|
|||||||
sendto: 1
|
sendto: 1
|
||||||
recvfrom: 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
|
||||||
|
@ -5,7 +5,7 @@ cc_library_shared {
|
|||||||
name: "libgeofencing",
|
name: "libgeofencing",
|
||||||
vendor: true,
|
vendor: true,
|
||||||
|
|
||||||
sanitize: GNSS_SANITIZE,
|
|
||||||
|
|
||||||
srcs: [
|
srcs: [
|
||||||
"GeofenceAdapter.cpp",
|
"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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are
|
* modification, are permitted provided that the following conditions are
|
||||||
@ -38,9 +38,13 @@ using namespace loc_core;
|
|||||||
GeofenceAdapter::GeofenceAdapter() :
|
GeofenceAdapter::GeofenceAdapter() :
|
||||||
LocAdapterBase(0,
|
LocAdapterBase(0,
|
||||||
LocContext::getLocContext(LocContext::mLocationHalName),
|
LocContext::getLocContext(LocContext::mLocationHalName),
|
||||||
true /*isMaster*/)
|
true /*isMaster*/, nullptr, true)
|
||||||
{
|
{
|
||||||
LOC_LOGD("%s]: Constructor", __func__);
|
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
|
void
|
||||||
|
@ -448,7 +448,7 @@ void AgpsStateMachine::setAPN(char* apn, unsigned int len){
|
|||||||
mAPN = NULL;
|
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);
|
LOC_LOGD("Invalid apn len (%d) or null apn", len);
|
||||||
mAPN = NULL;
|
mAPN = NULL;
|
||||||
mAPNLen = 0;
|
mAPNLen = 0;
|
||||||
@ -590,7 +590,7 @@ void AgpsManager::requestATL(int connHandle, AGpsExtType agpsType,
|
|||||||
sm->setApnTypeMask(apnTypeMask);
|
sm->setApnTypeMask(apnTypeMask);
|
||||||
|
|
||||||
/* Invoke AGPS SM processing */
|
/* Invoke AGPS SM processing */
|
||||||
AgpsSubscriber subscriber(connHandle, false, false, apnTypeMask);
|
AgpsSubscriber subscriber(connHandle, true, false, apnTypeMask);
|
||||||
sm->setCurrentSubscriber(&subscriber);
|
sm->setCurrentSubscriber(&subscriber);
|
||||||
/* Send subscriber event */
|
/* Send subscriber event */
|
||||||
sm->processAgpsEvent(AGPS_EVENT_SUBSCRIBE);
|
sm->processAgpsEvent(AGPS_EVENT_SUBSCRIBE);
|
||||||
|
@ -167,7 +167,7 @@ public:
|
|||||||
|
|
||||||
/* Getter/Setter methods */
|
/* Getter/Setter methods */
|
||||||
void setAPN(char* apn, unsigned int len);
|
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 uint32_t getAPNLen() const { return mAPNLen; }
|
||||||
inline void setBearer(AGpsBearerType bearer) { mBearer = bearer; }
|
inline void setBearer(AGpsBearerType bearer) { mBearer = bearer; }
|
||||||
inline LocApnTypeMask getApnTypeMask() const { return mApnTypeMask; }
|
inline LocApnTypeMask getApnTypeMask() const { return mApnTypeMask; }
|
||||||
|
@ -5,7 +5,7 @@ cc_library_shared {
|
|||||||
name: "libgnss",
|
name: "libgnss",
|
||||||
vendor: true,
|
vendor: true,
|
||||||
|
|
||||||
sanitize: GNSS_SANITIZE,
|
|
||||||
|
|
||||||
shared_libs: [
|
shared_libs: [
|
||||||
"libutils",
|
"libutils",
|
||||||
|
@ -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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are
|
* 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 const CdfwInterface* (*getCdfwInterface)();
|
||||||
|
|
||||||
|
typedef void getPdnTypeFromWds(const std::string& apnName, std::function<void(int)> pdnCb);
|
||||||
|
|
||||||
inline bool GnssReportLoggerUtil::isLogEnabled() {
|
inline bool GnssReportLoggerUtil::isLogEnabled() {
|
||||||
return (mLogLatency != nullptr);
|
return (mLogLatency != nullptr);
|
||||||
}
|
}
|
||||||
@ -889,6 +891,8 @@ GnssAdapter::setConfig()
|
|||||||
ContextBase::mGps_conf.MO_SUPL_PORT,
|
ContextBase::mGps_conf.MO_SUPL_PORT,
|
||||||
LOC_AGPS_MO_SUPL_SERVER);
|
LOC_AGPS_MO_SUPL_SERVER);
|
||||||
|
|
||||||
|
std::string moServerUrl = getMoServerUrl();
|
||||||
|
std::string serverUrl = getServerUrl();
|
||||||
// inject the configurations into modem
|
// inject the configurations into modem
|
||||||
loc_gps_cfg_s gpsConf = ContextBase::mGps_conf;
|
loc_gps_cfg_s gpsConf = ContextBase::mGps_conf;
|
||||||
loc_sap_cfg_s_type sapConf = ContextBase::mSap_conf;
|
loc_sap_cfg_s_type sapConf = ContextBase::mSap_conf;
|
||||||
@ -936,8 +940,10 @@ GnssAdapter::setConfig()
|
|||||||
gnssConfigRequested.blacklistedSvIds.assign(mBlacklistedSvIds.begin(),
|
gnssConfigRequested.blacklistedSvIds.assign(mBlacklistedSvIds.begin(),
|
||||||
mBlacklistedSvIds.end());
|
mBlacklistedSvIds.end());
|
||||||
mLocApi->sendMsg(new LocApiMsg(
|
mLocApi->sendMsg(new LocApiMsg(
|
||||||
[this, gpsConf, sapConf, oldMoServerUrl, gnssConfigRequested] () mutable {
|
[this, gpsConf, sapConf, oldMoServerUrl, moServerUrl,
|
||||||
gnssUpdateConfig(oldMoServerUrl, gnssConfigRequested, gnssConfigRequested);
|
serverUrl, gnssConfigRequested] () mutable {
|
||||||
|
gnssUpdateConfig(oldMoServerUrl, moServerUrl, serverUrl,
|
||||||
|
gnssConfigRequested, gnssConfigRequested);
|
||||||
|
|
||||||
// set nmea mask type
|
// set nmea mask type
|
||||||
uint32_t mask = 0;
|
uint32_t mask = 0;
|
||||||
@ -1025,6 +1031,7 @@ GnssAdapter::setConfig()
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<LocationError> GnssAdapter::gnssUpdateConfig(const std::string& oldMoServerUrl,
|
std::vector<LocationError> GnssAdapter::gnssUpdateConfig(const std::string& oldMoServerUrl,
|
||||||
|
const std::string& moServerUrl, const std::string& serverUrl,
|
||||||
GnssConfig& gnssConfigRequested, GnssConfig& gnssConfigNeedEngineUpdate, size_t count) {
|
GnssConfig& gnssConfigRequested, GnssConfig& gnssConfigNeedEngineUpdate, size_t count) {
|
||||||
loc_gps_cfg_s gpsConf = ContextBase::mGps_conf;
|
loc_gps_cfg_s gpsConf = ContextBase::mGps_conf;
|
||||||
size_t index = 0;
|
size_t index = 0;
|
||||||
@ -1034,9 +1041,6 @@ std::vector<LocationError> GnssAdapter::gnssUpdateConfig(const std::string& oldM
|
|||||||
errsList.insert(errsList.begin(), count, LOCATION_ERROR_SUCCESS);
|
errsList.insert(errsList.begin(), count, LOCATION_ERROR_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string serverUrl = getServerUrl();
|
|
||||||
std::string moServerUrl = getMoServerUrl();
|
|
||||||
|
|
||||||
int serverUrlLen = serverUrl.length();
|
int serverUrlLen = serverUrl.length();
|
||||||
int moServerUrlLen = moServerUrl.length();
|
int moServerUrlLen = moServerUrl.length();
|
||||||
|
|
||||||
@ -1424,10 +1428,14 @@ GnssAdapter::gnssUpdateConfigCommand(const GnssConfig& config)
|
|||||||
adapter.reportResponse(countOfConfigs, errs.data(), ids.data());
|
adapter.reportResponse(countOfConfigs, errs.data(), ids.data());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
std::string moServerUrl = adapter.getMoServerUrl();
|
||||||
|
std::string serverUrl = adapter.getServerUrl();
|
||||||
mApi.sendMsg(new LocApiMsg(
|
mApi.sendMsg(new LocApiMsg(
|
||||||
[&adapter, gnssConfigRequested, gnssConfigNeedEngineUpdate,
|
[&adapter, gnssConfigRequested, gnssConfigNeedEngineUpdate,
|
||||||
countOfConfigs, configCollectiveResponse, errs] () mutable {
|
moServerUrl, serverUrl, countOfConfigs, configCollectiveResponse,
|
||||||
|
errs] () mutable {
|
||||||
std::vector<LocationError> errsList = adapter.gnssUpdateConfig("",
|
std::vector<LocationError> errsList = adapter.gnssUpdateConfig("",
|
||||||
|
moServerUrl, serverUrl,
|
||||||
gnssConfigRequested, gnssConfigNeedEngineUpdate, countOfConfigs);
|
gnssConfigRequested, gnssConfigNeedEngineUpdate, countOfConfigs);
|
||||||
|
|
||||||
configCollectiveResponse->returnToSender(errsList);
|
configCollectiveResponse->returnToSender(errsList);
|
||||||
@ -5214,6 +5222,38 @@ bool GnssAdapter::releaseATL(int connHandle){
|
|||||||
return true;
|
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<char*>(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(
|
void GnssAdapter::dataConnOpenCommand(
|
||||||
AGpsExtType agpsType,
|
AGpsExtType agpsType,
|
||||||
const char* apnName, int apnLen, AGpsBearerType bearerType){
|
const char* apnName, int apnLen, AGpsBearerType bearerType){
|
||||||
@ -5221,17 +5261,16 @@ void GnssAdapter::dataConnOpenCommand(
|
|||||||
LOC_LOGI("GnssAdapter::frameworkDataConnOpen");
|
LOC_LOGI("GnssAdapter::frameworkDataConnOpen");
|
||||||
|
|
||||||
struct AgpsMsgAtlOpenSuccess: public LocMsg {
|
struct AgpsMsgAtlOpenSuccess: public LocMsg {
|
||||||
|
GnssAdapter& mAdapter;
|
||||||
AgpsManager* mAgpsManager;
|
AgpsManager* mAgpsManager;
|
||||||
AGpsExtType mAgpsType;
|
AGpsExtType mAgpsType;
|
||||||
char* mApnName;
|
char* mApnName;
|
||||||
int mApnLen;
|
|
||||||
AGpsBearerType mBearerType;
|
AGpsBearerType mBearerType;
|
||||||
|
|
||||||
inline AgpsMsgAtlOpenSuccess(AgpsManager* agpsManager, AGpsExtType agpsType,
|
inline AgpsMsgAtlOpenSuccess(GnssAdapter& adapter, AgpsManager* agpsManager,
|
||||||
const char* apnName, int apnLen, AGpsBearerType bearerType) :
|
AGpsExtType agpsType, const char* apnName, int apnLen, AGpsBearerType bearerType) :
|
||||||
LocMsg(), mAgpsManager(agpsManager), mAgpsType(agpsType), mApnName(
|
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");
|
LOC_LOGV("AgpsMsgAtlOpenSuccess");
|
||||||
if (mApnName == nullptr) {
|
if (mApnName == nullptr) {
|
||||||
@ -5249,19 +5288,36 @@ void GnssAdapter::dataConnOpenCommand(
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline virtual void proc() const {
|
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()");
|
std::function<void(int)> wdsPdnTypeCb = std::bind(&GnssAdapter::reportPdnTypeFromWds,
|
||||||
mAgpsManager->reportAtlOpenSuccess(mAgpsType, mApnName, mApnLen, mBearerType);
|
&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
|
// Added inital length checks for apnlen check to avoid security issues
|
||||||
// In case of failure reporting the same
|
// In case of failure reporting the same
|
||||||
if (NULL == apnName || apnLen <= 0 || apnLen > MAX_APN_LEN ||
|
if (NULL == apnName || apnLen > MAX_APN_LEN || (strlen(apnName) != apnLen)) {
|
||||||
(strlen(apnName) != (unsigned)apnLen)) {
|
|
||||||
LOC_LOGe("%s]: incorrect apnlen length or incorrect apnName", __func__);
|
LOC_LOGe("%s]: incorrect apnlen length or incorrect apnName", __func__);
|
||||||
mAgpsManager.reportAtlClosed(agpsType);
|
mAgpsManager.reportAtlClosed(agpsType);
|
||||||
} else {
|
} else {
|
||||||
sendMsg( new AgpsMsgAtlOpenSuccess(
|
sendMsg( new AgpsMsgAtlOpenSuccess(*this,
|
||||||
&mAgpsManager, agpsType, apnName, apnLen, bearerType));
|
&mAgpsManager, agpsType, apnName, apnLen, bearerType));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6731,7 +6787,9 @@ GnssAdapter::reportGnssAntennaInformation(const antennaInfoCb antennaInfoCallbac
|
|||||||
}
|
}
|
||||||
gnssAntennaInformations.push_back(std::move(gnssAntennaInfo));
|
gnssAntennaInformations.push_back(std::move(gnssAntennaInfo));
|
||||||
}
|
}
|
||||||
antennaInfoCallback(gnssAntennaInformations);
|
if (antennaInfoVectorSize > 0) {
|
||||||
|
antennaInfoCallback(gnssAntennaInformations);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ==== DGnss Usable Reporter ========================================================= */
|
/* ==== DGnss Usable Reporter ========================================================= */
|
||||||
@ -6768,10 +6826,15 @@ void GnssAdapter::enablePPENtripStreamCommand(const GnssNtripConnectionParams& p
|
|||||||
bool enableRTKEngine) {
|
bool enableRTKEngine) {
|
||||||
|
|
||||||
(void)enableRTKEngine; //future parameter, not used
|
(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 {
|
struct enableNtripMsg : public LocMsg {
|
||||||
GnssAdapter& mAdapter;
|
GnssAdapter& mAdapter;
|
||||||
const GnssNtripConnectionParams& mParams;
|
const GnssNtripConnectionParams mParams;
|
||||||
|
|
||||||
inline enableNtripMsg(GnssAdapter& adapter,
|
inline enableNtripMsg(GnssAdapter& adapter,
|
||||||
const GnssNtripConnectionParams& params) :
|
const GnssNtripConnectionParams& params) :
|
||||||
|
@ -321,7 +321,6 @@ protected:
|
|||||||
void logLatencyInfo();
|
void logLatencyInfo();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
GnssAdapter();
|
GnssAdapter();
|
||||||
virtual inline ~GnssAdapter() { }
|
virtual inline ~GnssAdapter() { }
|
||||||
|
|
||||||
@ -409,6 +408,8 @@ public:
|
|||||||
void deleteAidingData(const GnssAidingData &data, uint32_t sessionId);
|
void deleteAidingData(const GnssAidingData &data, uint32_t sessionId);
|
||||||
void gnssUpdateXtraThrottleCommand(const bool enabled);
|
void gnssUpdateXtraThrottleCommand(const bool enabled);
|
||||||
std::vector<LocationError> gnssUpdateConfig(const std::string& oldMoServerUrl,
|
std::vector<LocationError> gnssUpdateConfig(const std::string& oldMoServerUrl,
|
||||||
|
const std::string& moServerUrl,
|
||||||
|
const std::string& serverUrl,
|
||||||
GnssConfig& gnssConfigRequested,
|
GnssConfig& gnssConfigRequested,
|
||||||
GnssConfig& gnssConfigNeedEngineUpdate, size_t count = 0);
|
GnssConfig& gnssConfigNeedEngineUpdate, size_t count = 0);
|
||||||
|
|
||||||
@ -525,6 +526,8 @@ public:
|
|||||||
(
|
(
|
||||||
const std::unordered_map<LocationQwesFeatureType, bool> &featureMap
|
const std::unordered_map<LocationQwesFeatureType, bool> &featureMap
|
||||||
);
|
);
|
||||||
|
void reportPdnTypeFromWds(int pdnType, AGpsExtType agpsType, std::string apnName,
|
||||||
|
AGpsBearerType bearerType);
|
||||||
|
|
||||||
/* ======== UTILITIES ================================================================= */
|
/* ======== UTILITIES ================================================================= */
|
||||||
bool needReportForGnssClient(const UlpLocation& ulpLocation,
|
bool needReportForGnssClient(const UlpLocation& ulpLocation,
|
||||||
|
@ -519,7 +519,7 @@ static uint32_t antennaInfoInit(const antennaInfoCb antennaInfoCallback) {
|
|||||||
static void antennaInfoClose() {
|
static void antennaInfoClose() {
|
||||||
if (NULL != gGnssAdapter) {
|
if (NULL != gGnssAdapter) {
|
||||||
return gGnssAdapter->antennaInfoCloseCommand();
|
return gGnssAdapter->antennaInfoCloseCommand();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t configRobustLocation(bool enable, bool enableForE911){
|
static uint32_t configRobustLocation(bool enable, bool enableForE911){
|
||||||
|
@ -27,6 +27,10 @@ ifneq (,$(filter $(LOC_BOARD_PLATFORM_LIST),$(TARGET_BOARD_PLATFORM)))
|
|||||||
PRODUCT_PACKAGES += gps.conf
|
PRODUCT_PACKAGES += gps.conf
|
||||||
PRODUCT_PACKAGES += flp.conf
|
PRODUCT_PACKAGES += flp.conf
|
||||||
PRODUCT_PACKAGES += gnss_antenna_info.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 += libloc_pla_headers
|
||||||
PRODUCT_PACKAGES += liblocation_api_headers
|
PRODUCT_PACKAGES += liblocation_api_headers
|
||||||
PRODUCT_PACKAGES += libgps.utils_headers
|
PRODUCT_PACKAGES += libgps.utils_headers
|
||||||
|
@ -4,7 +4,7 @@ cc_library_shared {
|
|||||||
name: "liblocation_api",
|
name: "liblocation_api",
|
||||||
vendor: true,
|
vendor: true,
|
||||||
|
|
||||||
sanitize: GNSS_SANITIZE,
|
|
||||||
|
|
||||||
shared_libs: [
|
shared_libs: [
|
||||||
"libutils",
|
"libutils",
|
||||||
|
@ -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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are
|
* modification, are permitted provided that the following conditions are
|
||||||
@ -634,7 +634,7 @@ uint32_t LocationAPIClientBase::locAPIGetBatchedLocations(uint32_t id, size_t co
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
retVal = LOCATION_ERROR_ID_UNKNOWN;
|
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);
|
pthread_mutex_unlock(&mMutex);
|
||||||
|
@ -4,7 +4,7 @@ cc_library_shared {
|
|||||||
name: "libgps.utils",
|
name: "libgps.utils",
|
||||||
vendor: true,
|
vendor: true,
|
||||||
|
|
||||||
sanitize: GNSS_SANITIZE,
|
|
||||||
|
|
||||||
//# Libs
|
//# Libs
|
||||||
shared_libs: [
|
shared_libs: [
|
||||||
|
Loading…
Reference in New Issue
Block a user