123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986 |
- /* 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
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #define LOG_NDEBUG 0
- #define LOG_TAG "LocSvc_LocationAPI"
- #include <location_interface.h>
- #include <dlfcn.h>
- #include <loc_pla.h>
- #include <log_util.h>
- #include <pthread.h>
- #include <map>
- #include <loc_misc_utils.h>
- typedef const GnssInterface* (getGnssInterface)();
- typedef const GeofenceInterface* (getGeofenceInterface)();
- typedef const BatchingInterface* (getBatchingInterface)();
- // GTP services
- typedef void (enableProviderGetter)();
- typedef void (disableProviderGetter)();
- typedef void (getSingleNetworkLocationGetter)(trackingCallback* callback);
- typedef void (stopNetworkLocationGetter)(trackingCallback* callback);
- typedef struct {
- // bit mask of the adpaters that we need to wait for the removeClientCompleteCallback
- // before we invoke the registered locationApiDestroyCompleteCallback
- LocationAdapterTypeMask waitAdapterMask;
- locationApiDestroyCompleteCallback destroyCompleteCb;
- } LocationAPIDestroyCbData;
- // This is the map for the client that has requested destroy with
- // destroy callback provided.
- typedef std::map<LocationAPI*, LocationAPIDestroyCbData>
- LocationClientDestroyCbMap;
- typedef std::map<LocationAPI*, LocationCallbacks> LocationClientMap;
- typedef struct {
- LocationClientMap clientData;
- LocationClientDestroyCbMap destroyClientData;
- LocationControlAPI* controlAPI;
- LocationControlCallbacks controlCallbacks;
- GnssInterface* gnssInterface;
- GeofenceInterface* geofenceInterface;
- BatchingInterface* batchingInterface;
- } LocationAPIData;
- static LocationAPIData gData = {};
- static pthread_mutex_t gDataMutex = PTHREAD_MUTEX_INITIALIZER;
- static bool gGnssLoadFailed = false;
- static bool gBatchingLoadFailed = false;
- static bool gGeofenceLoadFailed = false;
- template <typename T1, typename T2>
- static const T1* loadLocationInterface(const char* library, const char* name) {
- void* libhandle = nullptr;
- T2* getter = (T2*)dlGetSymFromLib(libhandle, library, name);
- if (nullptr == getter) {
- return (const T1*) getter;
- }else {
- return (*getter)();
- }
- }
- static void loadLibGnss() {
- if (NULL == gData.gnssInterface && !gGnssLoadFailed) {
- gData.gnssInterface =
- (GnssInterface*)loadLocationInterface<GnssInterface,
- getGnssInterface>("libgnss.so", "getGnssInterface");
- if (NULL == gData.gnssInterface) {
- gGnssLoadFailed = true;
- LOC_LOGW("%s:%d]: No gnss interface available", __func__, __LINE__);
- } else {
- gData.gnssInterface->initialize();
- }
- }
- }
- static void loadLibBatching() {
- if (NULL == gData.batchingInterface && !gBatchingLoadFailed) {
- gData.batchingInterface =
- (BatchingInterface*)loadLocationInterface<BatchingInterface,
- getBatchingInterface>("libbatching.so", "getBatchingInterface");
- if (NULL == gData.batchingInterface) {
- gBatchingLoadFailed = true;
- LOC_LOGW("%s:%d]: No batching interface available", __func__, __LINE__);
- } else {
- gData.batchingInterface->initialize();
- }
- }
- }
- static void loadLibGeofencing() {
- if (NULL == gData.geofenceInterface && !gGeofenceLoadFailed) {
- gData.geofenceInterface =
- (GeofenceInterface*)loadLocationInterface<GeofenceInterface,
- getGeofenceInterface>("libgeofencing.so", "getGeofenceInterface");
- if (NULL == gData.geofenceInterface) {
- gGeofenceLoadFailed = true;
- LOC_LOGW("%s:%d]: No geofence interface available", __func__, __LINE__);
- } else {
- gData.geofenceInterface->initialize();
- }
- }
- }
- static bool isGnssClient(LocationCallbacks& locationCallbacks)
- {
- return (locationCallbacks.gnssNiCb != nullptr ||
- locationCallbacks.trackingCb != nullptr ||
- locationCallbacks.gnssLocationInfoCb != nullptr ||
- locationCallbacks.engineLocationsInfoCb != nullptr ||
- locationCallbacks.gnssSvCb != nullptr ||
- locationCallbacks.gnssNmeaCb != nullptr ||
- locationCallbacks.gnssDataCb != nullptr ||
- locationCallbacks.gnssMeasurementsCb != nullptr ||
- locationCallbacks.gnssNHzMeasurementsCb != nullptr ||
- locationCallbacks.locationSystemInfoCb != nullptr);
- }
- static bool isBatchingClient(LocationCallbacks& locationCallbacks)
- {
- return (locationCallbacks.batchingCb != nullptr);
- }
- static bool isGeofenceClient(LocationCallbacks& locationCallbacks)
- {
- return (locationCallbacks.geofenceBreachCb != nullptr ||
- locationCallbacks.geofenceStatusCb != nullptr);
- }
- void LocationAPI::onRemoveClientCompleteCb (LocationAdapterTypeMask adapterType)
- {
- bool invokeCallback = false;
- locationApiDestroyCompleteCallback destroyCompleteCb;
- LOC_LOGd("adatper type %x", adapterType);
- pthread_mutex_lock(&gDataMutex);
- auto it = gData.destroyClientData.find(this);
- if (it != gData.destroyClientData.end()) {
- it->second.waitAdapterMask &= ~adapterType;
- if (it->second.waitAdapterMask == 0) {
- invokeCallback = true;
- destroyCompleteCb = it->second.destroyCompleteCb;
- gData.destroyClientData.erase(it);
- }
- }
- pthread_mutex_unlock(&gDataMutex);
- if (invokeCallback) {
- LOC_LOGd("invoke client destroy cb");
- if (!destroyCompleteCb) {
- (destroyCompleteCb) ();
- }
- delete this;
- }
- }
- void onGnssRemoveClientCompleteCb (LocationAPI* client)
- {
- client->onRemoveClientCompleteCb (LOCATION_ADAPTER_GNSS_TYPE_BIT);
- }
- void onBatchingRemoveClientCompleteCb (LocationAPI* client)
- {
- client->onRemoveClientCompleteCb (LOCATION_ADAPTER_BATCHING_TYPE_BIT);
- }
- void onGeofenceRemoveClientCompleteCb (LocationAPI* client)
- {
- client->onRemoveClientCompleteCb (LOCATION_ADAPTER_GEOFENCE_TYPE_BIT);
- }
- LocationAPI*
- LocationAPI::createInstance (LocationCallbacks& locationCallbacks)
- {
- if (nullptr == locationCallbacks.capabilitiesCb ||
- nullptr == locationCallbacks.responseCb ||
- nullptr == locationCallbacks.collectiveResponseCb) {
- LOC_LOGe("missing mandatory callback, return null");
- return NULL;
- }
- LocationAPI* newLocationAPI = new LocationAPI();
- bool requestedCapabilities = false;
- pthread_mutex_lock(&gDataMutex);
- if (isGnssClient(locationCallbacks)) {
- loadLibGnss();
- if (NULL != gData.gnssInterface) {
- gData.gnssInterface->addClient(newLocationAPI, locationCallbacks);
- if (!requestedCapabilities) {
- gData.gnssInterface->requestCapabilities(newLocationAPI);
- requestedCapabilities = true;
- }
- }
- }
- if (isBatchingClient(locationCallbacks)) {
- loadLibBatching();
- if (NULL != gData.batchingInterface) {
- gData.batchingInterface->addClient(newLocationAPI, locationCallbacks);
- if (!requestedCapabilities) {
- gData.batchingInterface->requestCapabilities(newLocationAPI);
- requestedCapabilities = true;
- }
- }
- }
- if (isGeofenceClient(locationCallbacks)) {
- loadLibGeofencing();
- if (NULL != gData.geofenceInterface) {
- gData.geofenceInterface->addClient(newLocationAPI, locationCallbacks);
- if (!requestedCapabilities) {
- gData.geofenceInterface->requestCapabilities(newLocationAPI);
- requestedCapabilities = true;
- }
- }
- }
- if (!requestedCapabilities && locationCallbacks.capabilitiesCb != nullptr) {
- loadLibGnss();
- if (NULL != gData.gnssInterface) {
- gData.gnssInterface->addClient(newLocationAPI, locationCallbacks);
- gData.gnssInterface->requestCapabilities(newLocationAPI);
- requestedCapabilities = true;
- }
- }
- gData.clientData[newLocationAPI] = locationCallbacks;
- pthread_mutex_unlock(&gDataMutex);
- return newLocationAPI;
- }
- void
- LocationAPI::destroy(locationApiDestroyCompleteCallback destroyCompleteCb)
- {
- bool invokeDestroyCb = false;
- pthread_mutex_lock(&gDataMutex);
- auto it = gData.clientData.find(this);
- if (it != gData.clientData.end()) {
- bool removeFromGnssInf = (NULL != gData.gnssInterface);
- bool removeFromBatchingInf = (NULL != gData.batchingInterface);
- bool removeFromGeofenceInf = (NULL != gData.geofenceInterface);
- bool needToWait = (removeFromGnssInf || removeFromBatchingInf || removeFromGeofenceInf);
- LOC_LOGe("removeFromGnssInf: %d, removeFromBatchingInf: %d, removeFromGeofenceInf: %d,"
- "needToWait: %d", removeFromGnssInf, removeFromBatchingInf, removeFromGeofenceInf,
- needToWait);
- if ((NULL != destroyCompleteCb) && (true == needToWait)) {
- LocationAPIDestroyCbData destroyCbData = {};
- destroyCbData.destroyCompleteCb = destroyCompleteCb;
- // record down from which adapter we need to wait for the destroy complete callback
- // only when we have received all the needed callbacks from all the associated stacks,
- // we shall notify the client.
- destroyCbData.waitAdapterMask =
- (removeFromGnssInf ? LOCATION_ADAPTER_GNSS_TYPE_BIT : 0);
- destroyCbData.waitAdapterMask |=
- (removeFromBatchingInf ? LOCATION_ADAPTER_BATCHING_TYPE_BIT : 0);
- destroyCbData.waitAdapterMask |=
- (removeFromGeofenceInf ? LOCATION_ADAPTER_GEOFENCE_TYPE_BIT : 0);
- gData.destroyClientData[this] = destroyCbData;
- LOC_LOGi("destroy data stored in the map: 0x%x", destroyCbData.waitAdapterMask);
- }
- if (removeFromGnssInf) {
- gData.gnssInterface->removeClient(it->first,
- onGnssRemoveClientCompleteCb);
- }
- if (removeFromBatchingInf) {
- gData.batchingInterface->removeClient(it->first,
- onBatchingRemoveClientCompleteCb);
- }
- if (removeFromGeofenceInf) {
- gData.geofenceInterface->removeClient(it->first,
- onGeofenceRemoveClientCompleteCb);
- }
- gData.clientData.erase(it);
- if (!needToWait) {
- invokeDestroyCb = true;
- }
- } else {
- LOC_LOGE("%s:%d]: Location API client %p not found in client data",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- if (invokeDestroyCb) {
- if (!destroyCompleteCb) {
- (destroyCompleteCb) ();
- }
- delete this;
- }
- }
- LocationAPI::LocationAPI()
- {
- LOC_LOGD("LOCATION API CONSTRUCTOR");
- }
- // private destructor
- LocationAPI::~LocationAPI()
- {
- LOC_LOGD("LOCATION API DESTRUCTOR");
- }
- void
- LocationAPI::updateCallbacks(LocationCallbacks& locationCallbacks)
- {
- if (nullptr == locationCallbacks.capabilitiesCb ||
- nullptr == locationCallbacks.responseCb ||
- nullptr == locationCallbacks.collectiveResponseCb) {
- return;
- }
- pthread_mutex_lock(&gDataMutex);
- LocationCallbacks currentCallbacks = {};
- auto it = gData.clientData.find(this);
- if (it != gData.clientData.end()) {
- currentCallbacks = gData.clientData[this];
- }
- if (isGnssClient(locationCallbacks)) {
- loadLibGnss();
- if (NULL != gData.gnssInterface) {
- // either adds new Client or updates existing Client
- gData.gnssInterface->addClient(this, locationCallbacks);
- }
- } else if (NULL != gData.gnssInterface && isGnssClient(currentCallbacks)) {
- gData.gnssInterface->removeClient(this, nullptr);
- }
- if (isBatchingClient(locationCallbacks)) {
- loadLibBatching();
- if (NULL != gData.batchingInterface) {
- // either adds new Client or updates existing Client
- gData.batchingInterface->addClient(this, locationCallbacks);
- }
- } else if (NULL != gData.batchingInterface && isBatchingClient(currentCallbacks)) {
- gData.batchingInterface->removeClient(this, nullptr);
- }
- if (isGeofenceClient(locationCallbacks)) {
- loadLibGeofencing();
- if (NULL != gData.geofenceInterface) {
- // either adds new Client or updates existing Client
- gData.geofenceInterface->addClient(this, locationCallbacks);
- }
- } else if (NULL != gData.geofenceInterface && isGeofenceClient(currentCallbacks)) {
- gData.geofenceInterface->removeClient(this, nullptr);
- }
- gData.clientData[this] = locationCallbacks;
- pthread_mutex_unlock(&gDataMutex);
- }
- uint32_t
- LocationAPI::startTracking(TrackingOptions& trackingOptions)
- {
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
- auto it = gData.clientData.find(this);
- if (it != gData.clientData.end()) {
- if (NULL != gData.gnssInterface) {
- id = gData.gnssInterface->startTracking(this, trackingOptions);
- } else {
- LOC_LOGE("%s:%d]: No gnss interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
- } else {
- LOC_LOGE("%s:%d]: Location API client %p not found in client data",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- return id;
- }
- void
- LocationAPI::stopTracking(uint32_t id)
- {
- pthread_mutex_lock(&gDataMutex);
- auto it = gData.clientData.find(this);
- if (it != gData.clientData.end()) {
- if (gData.gnssInterface != NULL) {
- gData.gnssInterface->stopTracking(this, id);
- } else {
- LOC_LOGE("%s:%d]: No gnss interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
- } else {
- LOC_LOGE("%s:%d]: Location API client %p not found in client data",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- }
- void
- LocationAPI::updateTrackingOptions(
- uint32_t id, TrackingOptions& trackingOptions)
- {
- pthread_mutex_lock(&gDataMutex);
- auto it = gData.clientData.find(this);
- if (it != gData.clientData.end()) {
- if (gData.gnssInterface != NULL) {
- gData.gnssInterface->updateTrackingOptions(this, id, trackingOptions);
- } else {
- LOC_LOGE("%s:%d]: No gnss interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
- } else {
- LOC_LOGE("%s:%d]: Location API client %p not found in client data",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- }
- uint32_t
- LocationAPI::startBatching(BatchingOptions &batchingOptions)
- {
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
- if (NULL != gData.batchingInterface) {
- id = gData.batchingInterface->startBatching(this, batchingOptions);
- } else {
- LOC_LOGE("%s:%d]: No batching interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- return id;
- }
- void
- LocationAPI::stopBatching(uint32_t id)
- {
- pthread_mutex_lock(&gDataMutex);
- if (NULL != gData.batchingInterface) {
- gData.batchingInterface->stopBatching(this, id);
- } else {
- LOC_LOGE("%s:%d]: No batching interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- }
- void
- LocationAPI::updateBatchingOptions(uint32_t id, BatchingOptions& batchOptions)
- {
- pthread_mutex_lock(&gDataMutex);
- if (NULL != gData.batchingInterface) {
- gData.batchingInterface->updateBatchingOptions(this, id, batchOptions);
- } else {
- LOC_LOGE("%s:%d]: No batching interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- }
- void
- LocationAPI::getBatchedLocations(uint32_t id, size_t count)
- {
- pthread_mutex_lock(&gDataMutex);
- if (gData.batchingInterface != NULL) {
- gData.batchingInterface->getBatchedLocations(this, id, count);
- } else {
- LOC_LOGE("%s:%d]: No batching interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- }
- uint32_t*
- LocationAPI::addGeofences(size_t count, GeofenceOption* options, GeofenceInfo* info)
- {
- uint32_t* ids = NULL;
- pthread_mutex_lock(&gDataMutex);
- if (gData.geofenceInterface != NULL) {
- ids = gData.geofenceInterface->addGeofences(this, count, options, info);
- } else {
- LOC_LOGE("%s:%d]: No geofence interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- return ids;
- }
- void
- LocationAPI::removeGeofences(size_t count, uint32_t* ids)
- {
- pthread_mutex_lock(&gDataMutex);
- if (gData.geofenceInterface != NULL) {
- gData.geofenceInterface->removeGeofences(this, count, ids);
- } else {
- LOC_LOGE("%s:%d]: No geofence interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- }
- void
- LocationAPI::modifyGeofences(size_t count, uint32_t* ids, GeofenceOption* options)
- {
- pthread_mutex_lock(&gDataMutex);
- if (gData.geofenceInterface != NULL) {
- gData.geofenceInterface->modifyGeofences(this, count, ids, options);
- } else {
- LOC_LOGE("%s:%d]: No geofence interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- }
- void
- LocationAPI::pauseGeofences(size_t count, uint32_t* ids)
- {
- pthread_mutex_lock(&gDataMutex);
- if (gData.geofenceInterface != NULL) {
- gData.geofenceInterface->pauseGeofences(this, count, ids);
- } else {
- LOC_LOGE("%s:%d]: No geofence interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- }
- void
- LocationAPI::resumeGeofences(size_t count, uint32_t* ids)
- {
- pthread_mutex_lock(&gDataMutex);
- if (gData.geofenceInterface != NULL) {
- gData.geofenceInterface->resumeGeofences(this, count, ids);
- } else {
- LOC_LOGE("%s:%d]: No geofence interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- }
- void
- LocationAPI::gnssNiResponse(uint32_t id, GnssNiResponse response)
- {
- pthread_mutex_lock(&gDataMutex);
- if (gData.gnssInterface != NULL) {
- gData.gnssInterface->gnssNiResponse(this, id, response);
- } else {
- LOC_LOGE("%s:%d]: No gnss interface available for Location API client %p ",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- }
- void LocationAPI::enableNetworkProvider() {
- void* libHandle = nullptr;
- enableProviderGetter* setter = (enableProviderGetter*)dlGetSymFromLib(libHandle,
- "liblocationservice_glue.so", "enableNetworkProvider");
- if (setter != nullptr) {
- (*setter)();
- } else {
- LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so");
- }
- }
- void LocationAPI::disableNetworkProvider() {
- void* libHandle = nullptr;
- disableProviderGetter* setter = (disableProviderGetter*)dlGetSymFromLib(libHandle,
- "liblocationservice_glue.so", "disableNetworkProvider");
- if (setter != nullptr) {
- (*setter)();
- } else {
- LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so");
- }
- }
- void LocationAPI::startNetworkLocation(trackingCallback* callback) {
- void* libHandle = nullptr;
- getSingleNetworkLocationGetter* setter =
- (getSingleNetworkLocationGetter*)dlGetSymFromLib(libHandle,
- "liblocationservice_glue.so", "startNetworkLocation");
- if (setter != nullptr) {
- (*setter)(callback);
- } else {
- LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so");
- }
- }
- void LocationAPI::stopNetworkLocation(trackingCallback* callback) {
- void* libHandle = nullptr;
- stopNetworkLocationGetter* setter = (stopNetworkLocationGetter*)dlGetSymFromLib(libHandle,
- "liblocationservice_glue.so", "stopNetworkLocation");
- if (setter != nullptr) {
- LOC_LOGe("called");
- (*setter)(callback);
- } else {
- LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so");
- }
- }
- LocationControlAPI*
- LocationControlAPI::createInstance(LocationControlCallbacks& locationControlCallbacks)
- {
- LocationControlAPI* controlAPI = NULL;
- pthread_mutex_lock(&gDataMutex);
- if (NULL != gData.controlAPI) {
- controlAPI = gData.controlAPI;
- } else {
- if (nullptr != locationControlCallbacks.responseCb && NULL == gData.controlAPI) {
- loadLibGnss();
- if (NULL != gData.gnssInterface) {
- gData.controlAPI = new LocationControlAPI();
- gData.controlCallbacks = locationControlCallbacks;
- gData.gnssInterface->setControlCallbacks(locationControlCallbacks);
- controlAPI = gData.controlAPI;
- }
- }
- }
- pthread_mutex_unlock(&gDataMutex);
- return controlAPI;
- }
- LocationControlAPI*
- LocationControlAPI::getInstance()
- {
- LocationControlAPI* controlAPI = NULL;
- pthread_mutex_lock(&gDataMutex);
- controlAPI = gData.controlAPI;
- pthread_mutex_unlock(&gDataMutex);
- return controlAPI;
- }
- void
- LocationControlAPI::destroy()
- {
- delete this;
- }
- LocationControlAPI::LocationControlAPI()
- {
- LOC_LOGD("LOCATION CONTROL API CONSTRUCTOR");
- }
- LocationControlAPI::~LocationControlAPI()
- {
- LOC_LOGD("LOCATION CONTROL API DESTRUCTOR");
- pthread_mutex_lock(&gDataMutex);
- gData.controlAPI = NULL;
- pthread_mutex_unlock(&gDataMutex);
- }
- uint32_t
- LocationControlAPI::enable(LocationTechnologyType techType)
- {
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
- if (gData.gnssInterface != NULL) {
- id = gData.gnssInterface->enable(techType);
- } else {
- LOC_LOGE("%s:%d]: No gnss interface available for Location Control API client %p ",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- return id;
- }
- void
- LocationControlAPI::disable(uint32_t id)
- {
- pthread_mutex_lock(&gDataMutex);
- if (gData.gnssInterface != NULL) {
- gData.gnssInterface->disable(id);
- } else {
- LOC_LOGE("%s:%d]: No gnss interface available for Location Control API client %p ",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- }
- uint32_t*
- LocationControlAPI::gnssUpdateConfig(const GnssConfig& config)
- {
- uint32_t* ids = NULL;
- pthread_mutex_lock(&gDataMutex);
- if (gData.gnssInterface != NULL) {
- ids = gData.gnssInterface->gnssUpdateConfig(config);
- } else {
- LOC_LOGE("%s:%d]: No gnss interface available for Location Control API client %p ",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- return ids;
- }
- uint32_t* LocationControlAPI::gnssGetConfig(GnssConfigFlagsMask mask) {
- uint32_t* ids = NULL;
- pthread_mutex_lock(&gDataMutex);
- if (NULL != gData.gnssInterface) {
- ids = gData.gnssInterface->gnssGetConfig(mask);
- } else {
- LOC_LOGe("No gnss interface available for Control API client %p", this);
- }
- pthread_mutex_unlock(&gDataMutex);
- return ids;
- }
- uint32_t
- LocationControlAPI::gnssDeleteAidingData(GnssAidingData& data)
- {
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
- if (gData.gnssInterface != NULL) {
- id = gData.gnssInterface->gnssDeleteAidingData(data);
- } else {
- LOC_LOGE("%s:%d]: No gnss interface available for Location Control API client %p ",
- __func__, __LINE__, this);
- }
- pthread_mutex_unlock(&gDataMutex);
- return id;
- }
- uint32_t LocationControlAPI::configConstellations(
- const GnssSvTypeConfig& constellationEnablementConfig,
- const GnssSvIdConfig& blacklistSvConfig) {
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
- if (gData.gnssInterface != NULL) {
- id = gData.gnssInterface->gnssUpdateSvConfig(
- constellationEnablementConfig, blacklistSvConfig);
- } else {
- LOC_LOGe("No gnss interface available for Location Control API");
- }
- pthread_mutex_unlock(&gDataMutex);
- return id;
- }
- uint32_t LocationControlAPI::configConstellationSecondaryBand(
- const GnssSvTypeConfig& secondaryBandConfig) {
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
- if (gData.gnssInterface != NULL) {
- id = gData.gnssInterface->gnssUpdateSecondaryBandConfig(secondaryBandConfig);
- } else {
- LOC_LOGe("No gnss interface available for Location Control API");
- }
- pthread_mutex_unlock(&gDataMutex);
- return id;
- }
- uint32_t LocationControlAPI::configConstrainedTimeUncertainty(
- bool enable, float tuncThreshold, uint32_t energyBudget) {
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
- if (gData.gnssInterface != NULL) {
- id = gData.gnssInterface->setConstrainedTunc(enable,
- tuncThreshold,
- energyBudget);
- } else {
- LOC_LOGe("No gnss interface available for Location Control API");
- }
- pthread_mutex_unlock(&gDataMutex);
- return id;
- }
- uint32_t LocationControlAPI::configPositionAssistedClockEstimator(bool enable) {
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
- if (gData.gnssInterface != NULL) {
- id = gData.gnssInterface->setPositionAssistedClockEstimator(enable);
- } else {
- LOC_LOGe("No gnss interface available for Location Control API");
- }
- pthread_mutex_unlock(&gDataMutex);
- return id;
- }
- uint32_t LocationControlAPI::configLeverArm(const LeverArmConfigInfo& configInfo) {
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
- if (gData.gnssInterface != NULL) {
- id = gData.gnssInterface->configLeverArm(configInfo);
- } else {
- LOC_LOGe("No gnss interface available for Location Control API");
- }
- pthread_mutex_unlock(&gDataMutex);
- return id;
- }
- uint32_t LocationControlAPI::configRobustLocation(bool enable, bool enableForE911) {
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
- if (gData.gnssInterface != NULL) {
- id = gData.gnssInterface->configRobustLocation(enable, enableForE911);
- } else {
- LOC_LOGe("No gnss interface available for Location Control API");
- }
- pthread_mutex_unlock(&gDataMutex);
- return id;
- }
- uint32_t LocationControlAPI::configMinGpsWeek(uint16_t minGpsWeek) {
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
- if (gData.gnssInterface != NULL) {
- id = gData.gnssInterface->configMinGpsWeek(minGpsWeek);
- } else {
- LOC_LOGe("No gnss interface available for Location Control API");
- }
- pthread_mutex_unlock(&gDataMutex);
- return id;
- }
- uint32_t LocationControlAPI::configDeadReckoningEngineParams(
- const DeadReckoningEngineConfig& dreConfig) {
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
- if (gData.gnssInterface != NULL) {
- id = gData.gnssInterface->configDeadReckoningEngineParams(dreConfig);
- } else {
- LOC_LOGe("No gnss interface available for Location Control API");
- }
- pthread_mutex_unlock(&gDataMutex);
- return id;
- }
- uint32_t LocationControlAPI::configEngineRunState(
- PositioningEngineMask engType, LocEngineRunState engState) {
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
- if (gData.gnssInterface != NULL) {
- id = gData.gnssInterface->configEngineRunState(engType, engState);
- } else {
- LOC_LOGe("No gnss interface available for Location Control API");
- }
- pthread_mutex_unlock(&gDataMutex);
- return id;
- }
- uint32_t LocationControlAPI::setOptInStatus(bool userConsent) {
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
- if (gData.gnssInterface != NULL) {
- id = gData.gnssInterface->setOptInStatus(userConsent);
- } else {
- LOC_LOGe("No gnss interface available for Location Control API");
- }
- pthread_mutex_unlock(&gDataMutex);
- return id;
- }
- uint32_t LocationControlAPI::configOutputNmeaTypes(
- GnssNmeaTypesMask enabledNmeaTypes) {
- uint32_t id = 0;
- pthread_mutex_lock(&gDataMutex);
- if (gData.gnssInterface != NULL) {
- id = gData.gnssInterface->configOutputNmeaTypes(enabledNmeaTypes);
- } else {
- LOC_LOGe("No gnss interface available for Location Control API");
- }
- pthread_mutex_unlock(&gDataMutex);
- return id;
- }
- void LocationControlAPI::powerStateEvent(PowerStateType powerState) {
- pthread_mutex_lock(&gDataMutex);
- LOC_LOGv("--> entry, powerState: %d", powerState);
- if (NULL != gData.gnssInterface) {
- gData.gnssInterface->updateSystemPowerState(powerState);
- } else {
- LOC_LOGv("No gnss interface available.");
- }
- if (NULL != gData.geofenceInterface) {
- gData.geofenceInterface->updateSystemPowerState(powerState);
- } else {
- LOC_LOGv("No geofence interface available.");
- }
- if (NULL != gData.batchingInterface) {
- gData.batchingInterface->updateSystemPowerState(powerState);
- } else {
- LOC_LOGv("No batching interface available.");
- }
- pthread_mutex_unlock(&gDataMutex);
- }
|