sdm660-common: GPS: Update from LA.UM.11.2.1.r1-02500-sdm660.0

Signed-off-by: pix106 <sbordenave@gmail.com>
This commit is contained in:
Immanuel Raj 2022-11-23 12:31:48 +05:30 committed by pix106
parent aa76e60586
commit cb79a6f914
12 changed files with 471 additions and 45 deletions

View file

@ -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,12 +250,14 @@ BatchingAdapter::handleEngineUpEvent()
mAdapter.broadcastCapabilities(mAdapter.getCapabilities());
mApi.setBatchSize(mAdapter.getBatchSize());
mApi.setTripBatchSize(mAdapter.getTripBatchSize());
if (ENGINE_LOCK_STATE_ENABLED == mApi.getEngineLockState()) {
mAdapter.restartSessions();
for (auto msg: mAdapter.mPendingMsgs) {
mAdapter.sendMsg(msg);
}
mAdapter.mPendingMsgs.clear();
}
}
};
sendMsg(new MsgSSREvent(*this, *mLocApi));
@ -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__);

View file

@ -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 */

View file

@ -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)

View file

@ -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);
};

View file

@ -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)

View file

@ -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 {

View file

@ -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>
@ -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());
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
@ -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]);

View file

@ -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);

View file

@ -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();
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);

View file

@ -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,

View file

@ -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

View file

@ -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 */