From 1f3ac891ae0aee10a2415da7539d58e239cacf92 Mon Sep 17 00:00:00 2001 From: Baili Feng Date: Wed, 31 May 2017 16:22:16 +0800 Subject: Make updateConfig functional before gnss is enabled locAPIGnssUpdateConfig and locAPIEnable/Disable will use different request queues Change-Id: I8c5456ebc4c221ff0e536ad488259b21e5607e03 CRs-Fixed: 2054316 --- location/LocationAPIClientBase.cpp | 85 +++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 42 deletions(-) (limited to 'location/LocationAPIClientBase.cpp') diff --git a/location/LocationAPIClientBase.cpp b/location/LocationAPIClientBase.cpp index 58f7fcb..141f5eb 100644 --- a/location/LocationAPIClientBase.cpp +++ b/location/LocationAPIClientBase.cpp @@ -42,7 +42,8 @@ LocationAPIClientBase::LocationAPIClientBase() : mGeofenceBreachCallback(nullptr), mLocationAPI(nullptr), mLocationControlAPI(nullptr), - mBatchSize(-1) + mBatchSize(-1), + mEnabled(false) { // use recursive mutex, in case callback come from the same thread @@ -139,7 +140,7 @@ uint32_t LocationAPIClientBase::locAPIStartTracking(LocationOptions& options) RequestQueue* requests = mRequestQueues[REQUEST_TRACKING]; if (requests) { delete requests; - requests = nullptr; + mRequestQueues[REQUEST_TRACKING] = nullptr; } uint32_t session = mLocationAPI->startTracking(options); LOC_LOGI("%s:%d] start new session: %d", __FUNCTION__, __LINE__, session); @@ -226,7 +227,7 @@ uint32_t LocationAPIClientBase::locAPIStartSession(uint32_t id, uint32_t session RequestQueue* requests = mRequestQueues[REQUEST_TRACKING]; if (requests) { delete requests; - requests = nullptr; + mRequestQueues[REQUEST_TRACKING] = nullptr; } trackingSession = mLocationAPI->startTracking(options); LOC_LOGI("%s:%d] start new session: %d", __FUNCTION__, __LINE__, trackingSession); @@ -237,7 +238,7 @@ uint32_t LocationAPIClientBase::locAPIStartSession(uint32_t id, uint32_t session RequestQueue* requests = mRequestQueues[REQUEST_BATCHING]; if (requests) { delete requests; - requests = nullptr; + mRequestQueues[REQUEST_BATCHING] = nullptr; } batchingSession = mLocationAPI->startBatching(options); LOC_LOGI("%s:%d] start new session: %d", __FUNCTION__, __LINE__, batchingSession); @@ -338,7 +339,7 @@ uint32_t LocationAPIClientBase::locAPIUpdateSessionOptions(uint32_t id, uint32_t RequestQueue* requests = mRequestQueues[REQUEST_TRACKING]; if (requests) { delete requests; - requests = nullptr; + mRequestQueues[REQUEST_TRACKING] = nullptr; } trackingSession = mLocationAPI->startTracking(options); LOC_LOGI("%s:%d] start new session: %d", @@ -364,7 +365,7 @@ uint32_t LocationAPIClientBase::locAPIUpdateSessionOptions(uint32_t id, uint32_t RequestQueue* requests = mRequestQueues[REQUEST_BATCHING]; if (requests) { delete requests; - requests = nullptr; + mRequestQueues[REQUEST_BATCHING] = nullptr; } batchingSession = mLocationAPI->startBatching(options); LOC_LOGI("%s:%d] start new session: %d", @@ -589,7 +590,7 @@ void LocationAPIClientBase::locAPIGnssNiResponse(uint32_t id, GnssNiResponse res RequestQueue* requests = mRequestQueues[REQUEST_NIRESPONSE]; if (requests) { delete requests; - requests = nullptr; + mRequestQueues[REQUEST_NIRESPONSE] = nullptr; } uint32_t session = id; mLocationAPI->gnssNiResponse(id, response); @@ -609,7 +610,7 @@ uint32_t LocationAPIClientBase::locAPIGnssDeleteAidingData(GnssAidingData& data) RequestQueue* requests = mRequestQueues[REQUEST_DELETEAIDINGDATA]; if (requests) { delete requests; - requests = nullptr; + mRequestQueues[REQUEST_DELETEAIDINGDATA] = nullptr; } uint32_t session = mLocationControlAPI->gnssDeleteAidingData(data); LOC_LOGI("%s:%d] start new session: %d", __FUNCTION__, __LINE__, session); @@ -628,19 +629,24 @@ uint32_t LocationAPIClientBase::locAPIEnable(LocationTechnologyType techType) { uint32_t retVal = LOCATION_ERROR_GENERAL_FAILURE; pthread_mutex_lock(&mMutex); - if (mLocationControlAPI) { + if (mEnabled) { + // just return success if already enabled + retVal = LOCATION_ERROR_SUCCESS; + } else if (mLocationControlAPI) { RequestQueue* requests = mRequestQueues[REQUEST_CONTROL]; if (requests) { delete requests; - requests = nullptr; + mRequestQueues[REQUEST_CONTROL] = nullptr; } uint32_t session = mLocationControlAPI->enable(techType); LOC_LOGI("%s:%d] start new session: %d", __FUNCTION__, __LINE__, session); requests = new RequestQueue(session); - requests->push(new EnableRequest(*this)); mRequestQueues[REQUEST_CONTROL] = requests; - - retVal = LOCATION_ERROR_SUCCESS; + if (requests) { + requests->push(new EnableRequest(*this)); + retVal = LOCATION_ERROR_SUCCESS; + mEnabled = true; + } } pthread_mutex_unlock(&mMutex); @@ -650,7 +656,7 @@ uint32_t LocationAPIClientBase::locAPIEnable(LocationTechnologyType techType) void LocationAPIClientBase::locAPIDisable() { pthread_mutex_lock(&mMutex); - if (mLocationControlAPI) { + if (mEnabled && mLocationControlAPI) { uint32_t session = 0; RequestQueue* requests = mRequestQueues[REQUEST_CONTROL]; if (requests) { @@ -658,6 +664,7 @@ void LocationAPIClientBase::locAPIDisable() if (session > 0) { requests->push(new DisableRequest(*this)); mLocationControlAPI->disable(session); + mEnabled = false; } } } @@ -668,7 +675,8 @@ uint32_t LocationAPIClientBase::locAPIGnssUpdateConfig(GnssConfig config) { uint32_t retVal = LOCATION_ERROR_GENERAL_FAILURE; if (memcmp(&mConfig, &config, sizeof(GnssConfig)) == 0) { - LOC_LOGE("%s:%d] GnssConfig is identical to previous call", __FUNCTION__, __LINE__); + LOC_LOGV("%s:%d] GnssConfig is identical to previous call", __FUNCTION__, __LINE__); + retVal = LOCATION_ERROR_SUCCESS; return retVal; } @@ -678,17 +686,17 @@ uint32_t LocationAPIClientBase::locAPIGnssUpdateConfig(GnssConfig config) memcpy(&mConfig, &config, sizeof(GnssConfig)); uint32_t session = 0; - RequestQueue* requests = mRequestQueues[REQUEST_CONTROL]; + RequestQueue* requests = mRequestQueues[REQUEST_CONFIG]; + uint32_t* idArray = mLocationControlAPI->gnssUpdateConfig(config); + LOC_LOGV("%s:%d] gnssUpdateConfig return array: %p", __FUNCTION__, __LINE__, idArray); + if (!requests && idArray != nullptr) { + requests = new RequestQueue(idArray[0]); + mRequestQueues[REQUEST_CONFIG] = requests; + } if (requests) { - session = requests->getSession(); - if (session > 0) { - requests->push(new GnssUpdateConfigRequest(*this)); - uint32_t* idArray = mLocationControlAPI->gnssUpdateConfig(config); - LOC_LOGV("%s:%d] gnssUpdateConfig return array: %p", __FUNCTION__, __LINE__, idArray); - } + requests->push(new GnssUpdateConfigRequest(*this)); + retVal = LOCATION_ERROR_SUCCESS; } - - retVal = LOCATION_ERROR_SUCCESS; } pthread_mutex_unlock(&mMutex); return retVal; @@ -753,10 +761,11 @@ void LocationAPIClientBase::onCollectiveResponseCb( } } LocationAPIRequest* request = nullptr; - if (count > 0 && ids) - request = getRequestBySession(ids[0]); - if (!request) - request = getGeofencesRequest(); + pthread_mutex_lock(&mMutex); + if (mRequestQueues[REQUEST_GEOFENCE] != nullptr) { + request = mRequestQueues[REQUEST_GEOFENCE]->pop(); + } + pthread_mutex_unlock(&mMutex); if (request) { request->onCollectiveResponse(count, errors, ids); delete request; @@ -788,8 +797,11 @@ void LocationAPIClientBase::onCtrlCollectiveResponseCb( } } LocationAPIRequest* request = nullptr; - if (count > 0 && ids) - request = getRequestBySession(ids[0]); + pthread_mutex_lock(&mMutex); + if (mRequestQueues[REQUEST_CONFIG] != nullptr) { + request = mRequestQueues[REQUEST_CONFIG]->pop(); + } + pthread_mutex_unlock(&mMutex); if (request) { request->onCollectiveResponse(count, errors, ids); delete request; @@ -803,6 +815,7 @@ LocationAPIClientBase::getRequestBySession(uint32_t session) LocationAPIRequest* request = nullptr; for (int i = 0; i < REQUEST_MAX; i++) { if (i != REQUEST_GEOFENCE && + i != REQUEST_CONFIG && mRequestQueues[i] && mRequestQueues[i]->getSession() == session) { request = mRequestQueues[i]->pop(); @@ -812,15 +825,3 @@ LocationAPIClientBase::getRequestBySession(uint32_t session) pthread_mutex_unlock(&mMutex); return request; } - -LocationAPIClientBase::LocationAPIRequest* -LocationAPIClientBase::getGeofencesRequest() -{ - pthread_mutex_lock(&mMutex); - LocationAPIRequest* request = nullptr; - if (mRequestQueues[REQUEST_GEOFENCE]) { - request = mRequestQueues[REQUEST_GEOFENCE]->pop(); - } - pthread_mutex_unlock(&mMutex); - return request; -} -- cgit v1.2.3