summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNilesh Gharde <quic_ngharde@quicinc.com>2022-03-11 03:46:00 +0530
committerSaurabh Srivastava <quic_ssrivast@quicinc.com>2022-07-20 12:05:57 +0530
commitcf4eac65570a43c797a00abb68779f4757426499 (patch)
tree786eb8a9cba7c325c44a52706dbe0919282b85d4
parentb721d6e6b88937ab6cdd8486de677a6c91cf4888 (diff)
Enable protected dynamic interface control
Changes to Enable protected dynamic interface control. Added support to 1. Get the engine lock state. 2. Handle engine lock state event. 3. Store all the sessions when the engine is locked. 4. Restore all the sessions when the engine unlock event is received. Change-Id: I70e591a6dca2231fb762ef199d0d34f852198116 CRs-fixed: 3130222
-rw-r--r--batching/BatchingAdapter.cpp105
-rw-r--r--batching/BatchingAdapter.h42
-rw-r--r--core/LocAdapterBase.cpp41
-rw-r--r--core/LocAdapterBase.h40
-rw-r--r--core/LocApiBase.cpp8
-rw-r--r--core/LocApiBase.h10
-rw-r--r--geofence/GeofenceAdapter.cpp105
-rw-r--r--geofence/GeofenceAdapter.h40
-rw-r--r--gnss/GnssAdapter.cpp78
-rw-r--r--gnss/GnssAdapter.h39
-rw-r--r--location/LocationDataTypes.h1
-rw-r--r--utils/gps_extended_c.h7
12 files changed, 471 insertions, 45 deletions
diff --git a/batching/BatchingAdapter.cpp b/batching/BatchingAdapter.cpp
index 4f1a43c..4fdacda 100644
--- a/batching/BatchingAdapter.cpp
+++ b/batching/BatchingAdapter.cpp
@@ -26,6 +26,43 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
+
+/*
+Changes from Qualcomm Innovation Center are provided under the following license:
+
+Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted (subject to the limitations in the
+disclaimer below) 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 Qualcomm Innovation Center, Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER 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_BatchingAdapter"
@@ -163,6 +200,41 @@ BatchingAdapter::updateClientsEventMask()
}
void
+BatchingAdapter::handleEngineLockStatusEvent(EngineLockState engineLockState) {
+
+ LOC_LOGD("%s]: Old Engine state %d, New Engine state : %d,", __func__,
+ mLocApi->getEngineLockState(), engineLockState);
+
+ struct MsgEngineLockStateEvent : public LocMsg {
+ BatchingAdapter& mAdapter;
+ EngineLockState mEngineLockState;
+
+ inline MsgEngineLockStateEvent(BatchingAdapter& adapter, EngineLockState engineLockState) :
+ LocMsg(),
+ mAdapter(adapter),
+ mEngineLockState(engineLockState){}
+
+ virtual void proc() const {
+ mAdapter.handleEngineLockStatus(mEngineLockState);
+ }
+ };
+
+ sendMsg(new MsgEngineLockStateEvent(*this, engineLockState));
+}
+
+void
+BatchingAdapter::handleEngineLockStatus(EngineLockState engineLockState) {
+
+ LOC_LOGd("lock state %d, pending msgs %zu", engineLockState, mPendingGnssEnabledMsgs.size());
+ if (ENGINE_LOCK_STATE_ENABLED == engineLockState) {
+ for (auto msg: mPendingGnssEnabledMsgs) {
+ sendMsg(msg);
+ }
+ mPendingGnssEnabledMsgs.clear();
+ }
+}
+
+void
BatchingAdapter::handleEngineUpEvent()
{
struct MsgSSREvent : public LocMsg {
@@ -178,11 +250,13 @@ BatchingAdapter::handleEngineUpEvent()
mAdapter.broadcastCapabilities(mAdapter.getCapabilities());
mApi.setBatchSize(mAdapter.getBatchSize());
mApi.setTripBatchSize(mAdapter.getTripBatchSize());
- mAdapter.restartSessions();
- for (auto msg: mAdapter.mPendingMsgs) {
- mAdapter.sendMsg(msg);
+ if (ENGINE_LOCK_STATE_ENABLED == mApi.getEngineLockState()) {
+ mAdapter.restartSessions();
+ for (auto msg: mAdapter.mPendingMsgs) {
+ mAdapter.sendMsg(msg);
+ }
+ mAdapter.mPendingMsgs.clear();
}
- mAdapter.mPendingMsgs.clear();
}
};
@@ -354,7 +428,8 @@ BatchingAdapter::startBatchingCommand(
if (LOCATION_ERROR_SUCCESS == err) {
if (mBatchingOptions.batchingMode == BATCHING_MODE_ROUTINE ||
mBatchingOptions.batchingMode == BATCHING_MODE_NO_AUTO_REPORT) {
- mAdapter.startBatching(mClient, mSessionId, mBatchingOptions);
+ mAdapter.startBatching(
+ mClient, mSessionId, mBatchingOptions, new MsgStartBatching(*this));
} else if (mBatchingOptions.batchingMode == BATCHING_MODE_TRIP) {
mAdapter.startTripBatchingMultiplex(mClient, mSessionId, mBatchingOptions);
} else {
@@ -371,7 +446,7 @@ BatchingAdapter::startBatchingCommand(
void
BatchingAdapter::startBatching(LocationAPI* client, uint32_t sessionId,
- const BatchingOptions& batchingOptions)
+ const BatchingOptions& batchingOptions, LocMsg* pendingMsg)
{
if (batchingOptions.batchingMode != BATCHING_MODE_NO_AUTO_REPORT &&
0 == autoReportBatchingSessionsCount()) {
@@ -385,8 +460,9 @@ BatchingAdapter::startBatching(LocationAPI* client, uint32_t sessionId,
saveBatchingSession(client, sessionId, batchingOptions);
mLocApi->startBatching(sessionId, batchingOptions, getBatchingAccuracy(), getBatchingTimeout(),
new LocApiResponse(*getContext(),
- [this, client, sessionId, batchingOptions] (LocationError err) {
- if (LOCATION_ERROR_SUCCESS != err) {
+ [this, client, sessionId, batchingOptions, pendingMsg] (LocationError err) {
+ if (ENGINE_LOCK_STATE_ENABLED == mLocApi->getEngineLockState() &&
+ LOCATION_ERROR_SUCCESS != err) {
eraseBatchingSession(client, sessionId);
}
@@ -399,6 +475,13 @@ BatchingAdapter::startBatching(LocationAPI* client, uint32_t sessionId,
LOC_REGISTRATION_MASK_DISABLED);
}
+ if (LOCATION_ERROR_GNSS_DISABLED == err && pendingMsg != nullptr) {
+ LOC_LOGd("GNSS_DISABLED, add request to pending queue");
+ mPendingGnssEnabledMsgs.push_back(pendingMsg);
+ } else if (pendingMsg != nullptr) {
+ delete pendingMsg;
+ }
+
reportResponse(client, err, sessionId);
}));
}
@@ -509,7 +592,8 @@ BatchingAdapter::stopBatching(LocationAPI* client, uint32_t sessionId, bool rest
new LocApiResponse(*getContext(),
[this, client, sessionId, flpOptions, restartNeeded, batchOptions]
(LocationError err) {
- if (LOCATION_ERROR_SUCCESS != err) {
+ if (ENGINE_LOCK_STATE_ENABLED == mLocApi->getEngineLockState() &&
+ LOCATION_ERROR_SUCCESS != err) {
saveBatchingSession(client, sessionId, batchOptions);
} else {
// if stopBatching is success, unregister for batch full event if this was the last
@@ -766,7 +850,8 @@ BatchingAdapter::startTripBatchingMultiplex(LocationAPI* client, uint32_t sessio
mLocApi->startOutdoorTripBatching(batchingOptions.minDistance,
batchingOptions.minInterval, getBatchingTimeout(), new LocApiResponse(*getContext(),
[this, client, sessionId, batchingOptions] (LocationError err) {
- if (err == LOCATION_ERROR_SUCCESS) {
+ if (ENGINE_LOCK_STATE_DISABLED == mLocApi->getEngineLockState() ||
+ err == LOCATION_ERROR_SUCCESS) {
mOngoingTripDistance = batchingOptions.minDistance;
mOngoingTripTBFInterval = batchingOptions.minInterval;
LOC_LOGD("%s] New Trip started ...", __func__);
diff --git a/batching/BatchingAdapter.h b/batching/BatchingAdapter.h
index 66f7c5f..4580976 100644
--- a/batching/BatchingAdapter.h
+++ b/batching/BatchingAdapter.h
@@ -26,6 +26,43 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
+
+/*
+Changes from Qualcomm Innovation Center are provided under the following license:
+
+Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted (subject to the limitations in the
+disclaimer below) 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 Qualcomm Innovation Center, Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
#ifndef BATCHING_ADAPTER_H
#define BATCHING_ADAPTER_H
@@ -114,7 +151,7 @@ public:
void eraseBatchingSession(LocationAPI* client, uint32_t sessionId);
uint32_t autoReportBatchingSessionsCount();
void startBatching(LocationAPI* client, uint32_t sessionId,
- const BatchingOptions& batchingOptions);
+ const BatchingOptions& batchingOptions, LocMsg* pendingMsg = nullptr);
void stopBatching(LocationAPI* client, uint32_t sessionId, bool restartNeeded,
const BatchingOptions& batchOptions);
void stopBatching(LocationAPI* client, uint32_t sessionId) {
@@ -123,6 +160,8 @@ public:
};
/* ==== REPORTS ======================================================================== */
+ virtual void handleEngineLockStatusEvent(EngineLockState engineLockState);
+ void handleEngineLockStatus(EngineLockState engineLockState);
/* ======== EVENTS ====(Called from QMI Thread)========================================= */
void reportLocationsEvent(const Location* locations, size_t count,
BatchingMode batchingMode);
@@ -146,7 +185,6 @@ public:
uint32_t getBatchingTimeout() { return mBatchingTimeout; }
void setBatchingAccuracy(uint32_t accuracy) { mBatchingAccuracy = accuracy; }
uint32_t getBatchingAccuracy() { return mBatchingAccuracy; }
-
};
#endif /* BATCHING_ADAPTER_H */
diff --git a/core/LocAdapterBase.cpp b/core/LocAdapterBase.cpp
index 95f2728..21975ed 100644
--- a/core/LocAdapterBase.cpp
+++ b/core/LocAdapterBase.cpp
@@ -26,6 +26,43 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
+
+ /*
+Changes from Qualcomm Innovation Center are provided under the following license:
+
+Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted (subject to the limitations in the
+disclaimer below) 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 Qualcomm Innovation Center, Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER 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_LocAdapterBase"
@@ -432,6 +469,10 @@ void
LocAdapterBase::reportLatencyInfoEvent(const GnssLatencyInfo& /*gnssLatencyInfo*/)
DEFAULT_IMPL()
+void
+LocAdapterBase::handleEngineLockStatusEvent(const EngineLockState engineLockState)
+DEFAULT_IMPL()
+
bool LocAdapterBase::
reportQwesCapabilities(const std::unordered_map<LocationQwesFeatureType, bool> &featureMap)
DEFAULT_IMPL(false)
diff --git a/core/LocAdapterBase.h b/core/LocAdapterBase.h
index 51b2306..f2ae52e 100644
--- a/core/LocAdapterBase.h
+++ b/core/LocAdapterBase.h
@@ -26,6 +26,43 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
+
+ /*
+Changes from Qualcomm Innovation Center are provided under the following license:
+
+Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted (subject to the limitations in the
+disclaimer below) 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 Qualcomm Innovation Center, Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
#ifndef LOC_API_ADAPTER_BASE_H
#define LOC_API_ADAPTER_BASE_H
@@ -80,6 +117,8 @@ protected:
typedef std::map<LocationAPI*, LocationCallbacks> ClientDataMap;
ClientDataMap mClientData;
std::vector<LocMsg*> mPendingMsgs; // For temporal storage of msgs before Open is completed
+ std::vector<LocMsg*> mPendingGnssEnabledMsgs; // For temporal storage of msgs failed with
+ // GNSS disabled error
/* ======== UTILITIES ================================================================== */
void saveClient(LocationAPI* client, const LocationCallbacks& callbacks);
void eraseClient(LocationAPI* client);
@@ -237,6 +276,7 @@ public:
void requestCapabilitiesCommand(LocationAPI* client);
virtual void reportLatencyInfoEvent(const GnssLatencyInfo& gnssLatencyInfo);
+ virtual void handleEngineLockStatusEvent(EngineLockState engineLockState);
virtual bool reportQwesCapabilities(
const std::unordered_map<LocationQwesFeatureType, bool> &featureMap);
};
diff --git a/core/LocApiBase.cpp b/core/LocApiBase.cpp
index 860da2e..b571e36 100644
--- a/core/LocApiBase.cpp
+++ b/core/LocApiBase.cpp
@@ -155,7 +155,7 @@ volatile int32_t LocApiBase::mMsgTaskRefCount = 0;
LocApiBase::LocApiBase(LOC_API_ADAPTER_EVENT_MASK_T excludedMask,
ContextBase* context) :
mContext(context),
- mMask(0), mExcludedMask(excludedMask)
+ mMask(0), mExcludedMask(excludedMask), mEngineLockState(ENGINE_LOCK_STATE_ENABLED)
{
memset(mLocAdapters, 0, sizeof(mLocAdapters));
@@ -615,6 +615,12 @@ void LocApiBase::reportLatencyInfo(GnssLatencyInfo& gnssLatencyInfo)
TO_ALL_LOCADAPTERS(mLocAdapters[i]->reportLatencyInfoEvent(gnssLatencyInfo));
}
+void LocApiBase::reportEngineLockStatus(EngineLockState engineLockState)
+{
+ // loop through adapters, and deliver to the All handling adapter.
+ TO_ALL_LOCADAPTERS(mLocAdapters[i]->handleEngineLockStatusEvent(engineLockState));
+}
+
enum loc_api_adapter_err LocApiBase::
open(LOC_API_ADAPTER_EVENT_MASK_T /*mask*/)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
diff --git a/core/LocApiBase.h b/core/LocApiBase.h
index cbe5f9f..6f1b04f 100644
--- a/core/LocApiBase.h
+++ b/core/LocApiBase.h
@@ -137,6 +137,7 @@ protected:
bool isInSession();
const LOC_API_ADAPTER_EVENT_MASK_T mExcludedMask;
bool isMaster();
+ EngineLockState mEngineLockState;
public:
inline void sendMsg(const LocMsg* msg) const {
@@ -203,6 +204,7 @@ public:
void sendNfwNotification(GnssNfwNotification& notification);
void reportGnssConfig(uint32_t sessionId, const GnssConfig& gnssConfig);
void reportLatencyInfo(GnssLatencyInfo& gnssLatencyInfo);
+ void reportEngineLockStatus(EngineLockState engineLockState);
void reportQwesCapabilities
(
const std::unordered_map<LocationQwesFeatureType, bool> &featureMap
@@ -345,6 +347,14 @@ public:
LocApiResponse* adapterResponse=nullptr);
virtual void getConstellationMultiBandConfig(uint32_t sessionId,
LocApiResponse* adapterResponse=nullptr);
+
+ inline EngineLockState getEngineLockState() {
+ return mEngineLockState;
+ }
+
+ inline void setEngineLockState(EngineLockState engineLockState) {
+ mEngineLockState = engineLockState;
+ }
};
class ElapsedRealtimeEstimator {
diff --git a/geofence/GeofenceAdapter.cpp b/geofence/GeofenceAdapter.cpp
index 1aeea0a..3fbe0a9 100644
--- a/geofence/GeofenceAdapter.cpp
+++ b/geofence/GeofenceAdapter.cpp
@@ -26,6 +26,43 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
+
+/*
+Changes from Qualcomm Innovation Center are provided under the following license:
+
+Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted (subject to the limitations in the
+disclaimer below) 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 Qualcomm Innovation Center, Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
#define LOG_TAG "LocSvc_GeofenceAdapter"
#include <GeofenceAdapter.h>
@@ -117,25 +154,62 @@ GeofenceAdapter::getGeofenceKeyFromHwId(uint32_t hwId, GeofenceKey& key)
}
void
+GeofenceAdapter::handleEngineLockStatusEvent(EngineLockState engineLockState) {
+
+ LOC_LOGD("%s]: Old Engine state %d, New Engine state : %d,", __func__,
+ mLocApi->getEngineLockState(), engineLockState);
+
+ struct MsgEngineLockStateEvent : public LocMsg {
+ GeofenceAdapter& mAdapter;
+ EngineLockState mEngineLockState;
+
+ inline MsgEngineLockStateEvent(GeofenceAdapter& adapter, EngineLockState engineLockState) :
+ LocMsg(),
+ mAdapter(adapter),
+ mEngineLockState(engineLockState){}
+
+ virtual void proc() const {
+ mAdapter.handleEngineLockStatus(mEngineLockState);
+ }
+ };
+
+ sendMsg(new MsgEngineLockStateEvent(*this, engineLockState));
+}
+
+void
+GeofenceAdapter::handleEngineLockStatus(EngineLockState engineLockState) {
+
+ if (ENGINE_LOCK_STATE_ENABLED == engineLockState) {
+ for (auto msg: mPendingGnssEnabledMsgs) {
+ sendMsg(msg);
+ }
+ mPendingGnssEnabledMsgs.clear();
+ }
+}
+
+void
GeofenceAdapter::handleEngineUpEvent()
{
struct MsgSSREvent : public LocMsg {
GeofenceAdapter& mAdapter;
- inline MsgSSREvent(GeofenceAdapter& adapter) :
+ LocApiBase& mApi;
+ inline MsgSSREvent(GeofenceAdapter& adapter, LocApiBase& api) :
LocMsg(),
- mAdapter(adapter) {}
+ mAdapter(adapter),
+ mApi(api) {}
virtual void proc() const {
mAdapter.setEngineCapabilitiesKnown(true);
mAdapter.broadcastCapabilities(mAdapter.getCapabilities());
- mAdapter.restartGeofences();
- for (auto msg: mAdapter.mPendingMsgs) {
- mAdapter.sendMsg(msg);
+ if (ENGINE_LOCK_STATE_ENABLED == mApi.getEngineLockState()) {
+ mAdapter.restartGeofences();
+ for (auto msg: mAdapter.mPendingMsgs) {
+ mAdapter.sendMsg(msg);
+ }
}
- mAdapter.mPendingMsgs.clear();
}
};
- sendMsg(new MsgSSREvent(*this));
+ sendMsg(new MsgSSREvent(*this, *mLocApi));
}
void
@@ -231,7 +305,7 @@ GeofenceAdapter::addGeofencesCommand(LocationAPI* client, size_t count, Geofence
mCount(count),
mIds(ids),
mOptions(options),
- mInfos(infos) {}
+ mInfos(infos){}
inline virtual void proc() const {
LocationError* errs = new LocationError[mCount];
if (nullptr == errs) {
@@ -249,9 +323,10 @@ GeofenceAdapter::addGeofencesCommand(LocationAPI* client, size_t count, Geofence
mApi.addGeofence(mIds[i], mOptions[i], mInfos[i],
new LocApiResponseData<LocApiGeofenceData>(*mAdapter.getContext(),
[&mAdapter = mAdapter, mOptions = mOptions, mClient = mClient,
- mCount = mCount, mIds = mIds, mInfos = mInfos, errs, i]
+ mCount = mCount, mIds = mIds, mInfos = mInfos, errs, i, &mApi = mApi]
(LocationError err, LocApiGeofenceData data) {
- if (LOCATION_ERROR_SUCCESS == err) {
+ if (ENGINE_LOCK_STATE_DISABLED == mApi.getEngineLockState() ||
+ LOCATION_ERROR_SUCCESS == err) {
mAdapter.saveGeofenceItem(mClient,
mIds[i],
data.hwId,
@@ -353,8 +428,9 @@ GeofenceAdapter::removeGeofencesCommand(LocationAPI* client, size_t count, uint3
mApi.removeGeofence(hwId, mIds[i],
new LocApiResponse(*mAdapter.getContext(),
[&mAdapter = mAdapter, mCount = mCount, mClient = mClient, mIds = mIds,
- hwId, errs, i] (LocationError err ) {
- if (LOCATION_ERROR_SUCCESS == err) {
+ hwId, errs, i, &mApi = mApi] (LocationError err ) {
+ if (ENGINE_LOCK_STATE_DISABLED == mApi.getEngineLockState() ||
+ LOCATION_ERROR_SUCCESS == err) {
mAdapter.removeGeofenceItem(hwId);
}
errs[i] = err;
@@ -587,9 +663,10 @@ GeofenceAdapter::modifyGeofencesCommand(LocationAPI* client, size_t count, uint3
mApi.modifyGeofence(hwId, mIds[i], mOptions[i],
new LocApiResponse(*mAdapter.getContext(),
[&mAdapter = mAdapter, mCount = mCount, mClient = mClient,
- mIds = mIds, mOptions = mOptions, hwId, errs, i]
+ mIds = mIds, mOptions = mOptions, hwId, errs, i, &mApi = mApi]
(LocationError err ) {
- if (LOCATION_ERROR_SUCCESS == err) {
+ if (ENGINE_LOCK_STATE_DISABLED == mApi.getEngineLockState() ||
+ LOCATION_ERROR_SUCCESS == err) {
errs[i] = err;
mAdapter.modifyGeofenceItem(hwId, mOptions[i]);
diff --git a/geofence/GeofenceAdapter.h b/geofence/GeofenceAdapter.h
index 38f4823..83911a9 100644
--- a/geofence/GeofenceAdapter.h
+++ b/geofence/GeofenceAdapter.h
@@ -26,6 +26,43 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
+
+/*
+Changes from Qualcomm Innovation Center are provided under the following license:
+
+Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted (subject to the limitations in the
+disclaimer below) 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 Qualcomm Innovation Center, Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
#ifndef GEOFENCE_ADAPTER_H
#define GEOFENCE_ADAPTER_H
@@ -121,8 +158,9 @@ public:
LocationError getHwIdFromClient(LocationAPI* client, uint32_t clientId, uint32_t& hwId);
LocationError getGeofenceKeyFromHwId(uint32_t hwId, GeofenceKey& key);
void dump();
-
/* ==== REPORTS ======================================================================== */
+ virtual void handleEngineLockStatusEvent(EngineLockState engineLockState);
+ void handleEngineLockStatus(EngineLockState engineLockState);
/* ======== EVENTS ====(Called from QMI Thread)========================================= */
void geofenceBreachEvent(size_t count, uint32_t* hwIds, Location& location,
GeofenceBreachType breachType, uint64_t timestamp);
diff --git a/gnss/GnssAdapter.cpp b/gnss/GnssAdapter.cpp
index f3ccd99..0235d2c 100644
--- a/gnss/GnssAdapter.cpp
+++ b/gnss/GnssAdapter.cpp
@@ -170,7 +170,6 @@ GnssAdapter::GnssAdapter() :
readConfigCommand();
initDefaultAgpsCommand();
initEngHubProxyCommand();
-
// at last step, let us inform adapater base that we are done
// with initialization, e.g.: ready to process handleEngineUpEvent
doneInit();
@@ -2565,15 +2564,51 @@ GnssAdapter::updateClientsEventMask()
}
void
+GnssAdapter::handleEngineLockStatusEvent(EngineLockState engineLockState) {
+
+ LOC_LOGD("%s]: Old Engine state %d, New Engine state : %d,",
+ __func__, mLocApi->getEngineLockState(), engineLockState);
+
+ struct MsgEngineLockStateEvent : public LocMsg {
+ GnssAdapter& mAdapter;
+ EngineLockState mEngineLockState;
+
+ inline MsgEngineLockStateEvent(GnssAdapter& adapter, EngineLockState engineLockState) :
+ LocMsg(),
+ mAdapter(adapter),
+ mEngineLockState(engineLockState) {}
+
+ virtual void proc() const {
+ mAdapter.handleEngineLockStatus(mEngineLockState);
+ }
+ };
+
+ sendMsg(new MsgEngineLockStateEvent(*this, engineLockState));
+}
+
+void
+GnssAdapter::handleEngineLockStatus(EngineLockState engineLockState) {
+
+ if (ENGINE_LOCK_STATE_ENABLED == engineLockState) {
+ for (auto msg: mPendingGnssEnabledMsgs) {
+ sendMsg(msg);
+ }
+ mPendingGnssEnabledMsgs.clear();
+ }
+}
+
+void
GnssAdapter::handleEngineUpEvent()
{
LOC_LOGD("%s]: ", __func__);
struct MsgHandleEngineUpEvent : public LocMsg {
GnssAdapter& mAdapter;
- inline MsgHandleEngineUpEvent(GnssAdapter& adapter) :
+ LocApiBase& mApi;
+ inline MsgHandleEngineUpEvent(GnssAdapter& adapter, LocApiBase& api) :
LocMsg(),
- mAdapter(adapter) {}
+ mAdapter(adapter),
+ mApi(api) {}
virtual void proc() const {
mAdapter.setEngineCapabilitiesKnown(true);
mAdapter.broadcastCapabilities(mAdapter.getCapabilities());
@@ -2585,17 +2620,19 @@ GnssAdapter::handleEngineUpEvent()
mAdapter.gnssSecondaryBandConfigUpdate();
// start CDFW service
mAdapter.initCDFWService();
- // restart sessions
- mAdapter.restartSessions(true);
- for (auto msg: mAdapter.mPendingMsgs) {
- mAdapter.sendMsg(msg);
+
+ if (ENGINE_LOCK_STATE_ENABLED == mApi.getEngineLockState()) {
+ // restart sessions
+ mAdapter.restartSessions(true);
+ for (auto msg: mAdapter.mPendingMsgs) {
+ mAdapter.sendMsg(msg);
+ }
}
- mAdapter.mPendingMsgs.clear();
}
};
readConfigCommand();
- sendMsg(new MsgHandleEngineUpEvent(*this));
+ sendMsg(new MsgHandleEngineUpEvent(*this, *mLocApi));
}
void
@@ -2972,9 +3009,11 @@ GnssAdapter::startTrackingCommand(LocationAPI* client, TrackingOptions& options)
mAdapter.saveTrackingSession(mClient, mSessionId, mOptions);
mApi.startDistanceBasedTracking(mSessionId, mOptions,
new LocApiResponse(*mAdapter.getContext(),
- [&mAdapter = mAdapter, mSessionId = mSessionId, mClient = mClient]
+ [&mAdapter = mAdapter, mSessionId = mSessionId, mClient = mClient,
+ &mApi = mApi]
(LocationError err) {
- if (LOCATION_ERROR_SUCCESS != err) {
+ if (ENGINE_LOCK_STATE_ENABLED == mApi.getEngineLockState() &&
+ LOCATION_ERROR_SUCCESS != err) {
mAdapter.eraseTrackingSession(mClient, mSessionId);
}
mAdapter.reportResponse(mClient, err, mSessionId);
@@ -3081,7 +3120,8 @@ GnssAdapter::startTimeBasedTracking(LocationAPI* client, uint32_t sessionId,
if (!checkAndSetSPEToRunforNHz(tempOptions)) {
mLocApi->startTimeBasedTracking(tempOptions, new LocApiResponse(*getContext(),
[this, client, sessionId] (LocationError err) {
- if (LOCATION_ERROR_SUCCESS != err) {
+ if (ENGINE_LOCK_STATE_ENABLED == mLocApi->getEngineLockState() &&
+ LOCATION_ERROR_SUCCESS != err) {
eraseTrackingSession(client, sessionId);
} else {
checkUpdateDgnssNtrip(false);
@@ -3116,7 +3156,8 @@ GnssAdapter::updateTracking(LocationAPI* client, uint32_t sessionId,
if(!checkAndSetSPEToRunforNHz(tempOptions)) {
mLocApi->startTimeBasedTracking(tempOptions, new LocApiResponse(*getContext(),
[this, client, sessionId, oldOptions] (LocationError err) {
- if (LOCATION_ERROR_SUCCESS != err) {
+ if (ENGINE_LOCK_STATE_ENABLED == mLocApi->getEngineLockState() &&
+ LOCATION_ERROR_SUCCESS != err) {
// restore the old LocationOptions
saveTrackingSession(client, sessionId, oldOptions);
}
@@ -3231,9 +3272,10 @@ GnssAdapter::updateTrackingOptionsCommand(LocationAPI* client, uint32_t id,
if (LOCATION_ERROR_SUCCESS == err) {
mApi.startDistanceBasedTracking(mSessionId, mOptions,
new LocApiResponse(*mAdapter.getContext(),
- [&mAdapter, mClient, mSessionId, mOptions]
+ [&mAdapter, mClient, mSessionId, mOptions, &mApi = mApi]
(LocationError err) {
- if (LOCATION_ERROR_SUCCESS == err) {
+ if (ENGINE_LOCK_STATE_DISABLED == mApi.getEngineLockState() ||
+ LOCATION_ERROR_SUCCESS == err) {
mAdapter.saveTrackingSession(mClient, mSessionId, mOptions);
}
mAdapter.reportResponse(mClient, err, mSessionId);
@@ -3347,9 +3389,11 @@ GnssAdapter::stopTrackingCommand(LocationAPI* client, uint32_t id)
} else if (isDistanceBased) {
mApi.stopDistanceBasedTracking(mSessionId, new LocApiResponse(
*mAdapter.getContext(),
- [&mAdapter = mAdapter, mSessionId = mSessionId, mClient = mClient]
+ [&mAdapter = mAdapter, mSessionId = mSessionId, mClient = mClient,
+ &mApi = mApi]
(LocationError err) {
- if (LOCATION_ERROR_SUCCESS == err) {
+ if (ENGINE_LOCK_STATE_DISABLED == mApi.getEngineLockState() ||
+ LOCATION_ERROR_SUCCESS == err) {
mAdapter.eraseTrackingSession(mClient, mSessionId);
}
mAdapter.reportResponse(mClient, err, mSessionId);
diff --git a/gnss/GnssAdapter.h b/gnss/GnssAdapter.h
index d7b4275..a9d0456 100644
--- a/gnss/GnssAdapter.h
+++ b/gnss/GnssAdapter.h
@@ -26,6 +26,43 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
+
+/*
+Changes from Qualcomm Innovation Center are provided under the following license:
+
+Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted (subject to the limitations in the
+disclaimer below) 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 Qualcomm Innovation Center, Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
#ifndef GNSS_ADAPTER_H
#define GNSS_ADAPTER_H
@@ -487,6 +524,8 @@ public:
void odcpiTimerExpireEvent();
/* ==== REPORTS ======================================================================== */
+ virtual void handleEngineLockStatusEvent(EngineLockState engineLockState);
+ void handleEngineLockStatus(EngineLockState engineLockState);
/* ======== EVENTS ====(Called from QMI/EngineHub Thread)===================================== */
virtual void reportPositionEvent(const UlpLocation& ulpLocation,
const GpsLocationExtended& locationExtended,
diff --git a/location/LocationDataTypes.h b/location/LocationDataTypes.h
index b85464a..ca8281a 100644
--- a/location/LocationDataTypes.h
+++ b/location/LocationDataTypes.h
@@ -63,6 +63,7 @@ typedef enum {
LOCATION_ERROR_GEOFENCES_AT_MAX,
LOCATION_ERROR_NOT_SUPPORTED,
LOCATION_ERROR_TIMEOUT,
+ LOCATION_ERROR_GNSS_DISABLED,
} LocationError;
// Flags to indicate which values are valid in a Location
diff --git a/utils/gps_extended_c.h b/utils/gps_extended_c.h
index f368975..fc10841 100644
--- a/utils/gps_extended_c.h
+++ b/utils/gps_extended_c.h
@@ -2422,6 +2422,13 @@ typedef uint64_t NetworkHandle;
#define NETWORK_HANDLE_UNKNOWN ~0
#define MAX_NETWORK_HANDLES 10
+typedef enum {
+ ENGINE_LOCK_STATE_INVALID = 0,
+ ENGINE_LOCK_STATE_ENABLED = 1, /**< Location engine is enabled. */
+ ENGINE_LOCK_STATE_DISABLED = 2, /**< location engine is disabled. */
+ ENGINE_LOCK_STATE_MAX,
+}EngineLockState;
+
#ifdef __cplusplus
}
#endif /* __cplusplus */