From cb79a6f914f48a9a2f2ba9eca4a3eafbd7fc1327 Mon Sep 17 00:00:00 2001 From: Immanuel Raj Date: Wed, 23 Nov 2022 12:31:48 +0530 Subject: [PATCH] sdm660-common: GPS: Update from LA.UM.11.2.1.r1-02500-sdm660.0 Signed-off-by: pix106 --- gps/batching/BatchingAdapter.cpp | 105 ++++++++++++++++++++++++++++--- gps/batching/BatchingAdapter.h | 42 ++++++++++++- gps/core/LocAdapterBase.cpp | 41 ++++++++++++ gps/core/LocAdapterBase.h | 40 ++++++++++++ gps/core/LocApiBase.cpp | 8 ++- gps/core/LocApiBase.h | 10 +++ gps/geofence/GeofenceAdapter.cpp | 105 ++++++++++++++++++++++++++----- gps/geofence/GeofenceAdapter.h | 40 +++++++++++- gps/gnss/GnssAdapter.cpp | 78 ++++++++++++++++++----- gps/gnss/GnssAdapter.h | 39 ++++++++++++ gps/location/LocationDataTypes.h | 1 + gps/utils/gps_extended_c.h | 7 +++ 12 files changed, 471 insertions(+), 45 deletions(-) diff --git a/gps/batching/BatchingAdapter.cpp b/gps/batching/BatchingAdapter.cpp index 4f1a43cb..4fdacda0 100644 --- a/gps/batching/BatchingAdapter.cpp +++ b/gps/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" @@ -162,6 +199,41 @@ BatchingAdapter::updateClientsEventMask() updateEvtMask(mask, LOC_REGISTRATION_MASK_SET); } +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() { @@ -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/gps/batching/BatchingAdapter.h b/gps/batching/BatchingAdapter.h index 66f7c5f1..4580976e 100644 --- a/gps/batching/BatchingAdapter.h +++ b/gps/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/gps/core/LocAdapterBase.cpp b/gps/core/LocAdapterBase.cpp index 69346b86..1e8b24b6 100644 --- a/gps/core/LocAdapterBase.cpp +++ b/gps/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 &featureMap) DEFAULT_IMPL(false) diff --git a/gps/core/LocAdapterBase.h b/gps/core/LocAdapterBase.h index 51b23060..f2ae52eb 100644 --- a/gps/core/LocAdapterBase.h +++ b/gps/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 ClientDataMap; ClientDataMap mClientData; std::vector mPendingMsgs; // For temporal storage of msgs before Open is completed + std::vector 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 &featureMap); }; diff --git a/gps/core/LocApiBase.cpp b/gps/core/LocApiBase.cpp index 860da2e0..b571e362 100644 --- a/gps/core/LocApiBase.cpp +++ b/gps/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/gps/core/LocApiBase.h b/gps/core/LocApiBase.h index cbe5f9f8..6f1b04f5 100644 --- a/gps/core/LocApiBase.h +++ b/gps/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 &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/gps/geofence/GeofenceAdapter.cpp b/gps/geofence/GeofenceAdapter.cpp index c2468d26..102e122c 100644 --- a/gps/geofence/GeofenceAdapter.cpp +++ b/gps/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 @@ -116,26 +153,63 @@ GeofenceAdapter::getGeofenceKeyFromHwId(uint32_t hwId, GeofenceKey& key) return LOCATION_ERROR_ID_UNKNOWN; } +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(*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/gps/geofence/GeofenceAdapter.h b/gps/geofence/GeofenceAdapter.h index 38f48230..83911a90 100644 --- a/gps/geofence/GeofenceAdapter.h +++ b/gps/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/gps/gnss/GnssAdapter.cpp b/gps/gnss/GnssAdapter.cpp index f3ccd99e..0235d2c9 100644 --- a/gps/gnss/GnssAdapter.cpp +++ b/gps/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(); @@ -2564,6 +2563,40 @@ GnssAdapter::updateClientsEventMask() updateEvtMask(mask, LOC_REGISTRATION_MASK_SET); } +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() { @@ -2571,9 +2604,11 @@ GnssAdapter::handleEngineUpEvent() 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/gps/gnss/GnssAdapter.h b/gps/gnss/GnssAdapter.h index d7b42757..a9d04563 100644 --- a/gps/gnss/GnssAdapter.h +++ b/gps/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/gps/location/LocationDataTypes.h b/gps/location/LocationDataTypes.h index b85464a4..ca8281a7 100644 --- a/gps/location/LocationDataTypes.h +++ b/gps/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/gps/utils/gps_extended_c.h b/gps/utils/gps_extended_c.h index f368975a..fc10841b 100644 --- a/gps/utils/gps_extended_c.h +++ b/gps/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 */