Merge commit 'e60e51f520c9958a9c364ae194d07b02052365fd' into HEAD
Change-Id: I42010222f317616ec78f28a2a9d817022e7bc4d5
This commit is contained in:
commit
488817b706
18 changed files with 298 additions and 105 deletions
|
@ -105,7 +105,7 @@ Return<void> AGnss::setCallback(const sp<IAGnssCallback>& callback) {
|
||||||
|
|
||||||
AgpsCbInfo cbInfo = {};
|
AgpsCbInfo cbInfo = {};
|
||||||
cbInfo.statusV4Cb = (void*)agnssStatusIpV4Cb;
|
cbInfo.statusV4Cb = (void*)agnssStatusIpV4Cb;
|
||||||
cbInfo.cbPriority = AGPS_CB_PRIORITY_LOW;
|
cbInfo.atlType = AGPS_ATL_TYPE_SUPL | AGPS_ATL_TYPE_SUPL_ES;
|
||||||
|
|
||||||
mGnss->getGnssInterface()->agpsInit(cbInfo);
|
mGnss->getGnssInterface()->agpsInit(cbInfo);
|
||||||
return Void();
|
return Void();
|
||||||
|
|
|
@ -105,7 +105,7 @@ Return<void> AGnss::setCallback(const sp<IAGnssCallback>& callback) {
|
||||||
|
|
||||||
AgpsCbInfo cbInfo = {};
|
AgpsCbInfo cbInfo = {};
|
||||||
cbInfo.statusV4Cb = (void*)agnssStatusIpV4Cb;
|
cbInfo.statusV4Cb = (void*)agnssStatusIpV4Cb;
|
||||||
cbInfo.cbPriority = AGPS_CB_PRIORITY_LOW;
|
cbInfo.atlType = AGPS_ATL_TYPE_SUPL | AGPS_ATL_TYPE_SUPL_ES;
|
||||||
|
|
||||||
mGnss->getGnssInterface()->agpsInit(cbInfo);
|
mGnss->getGnssInterface()->agpsInit(cbInfo);
|
||||||
return Void();
|
return Void();
|
||||||
|
|
|
@ -107,7 +107,7 @@ Return<void> AGnss::setCallback(const sp<V2_0::IAGnssCallback>& callback) {
|
||||||
|
|
||||||
AgpsCbInfo cbInfo = {};
|
AgpsCbInfo cbInfo = {};
|
||||||
cbInfo.statusV4Cb = (void*)agnssStatusIpV4Cb;
|
cbInfo.statusV4Cb = (void*)agnssStatusIpV4Cb;
|
||||||
cbInfo.cbPriority = AGPS_CB_PRIORITY_HIGH;
|
cbInfo.atlType = AGPS_ATL_TYPE_SUPL | AGPS_ATL_TYPE_SUPL_ES;
|
||||||
|
|
||||||
mGnss->getGnssInterface()->agpsInit(cbInfo);
|
mGnss->getGnssInterface()->agpsInit(cbInfo);
|
||||||
return Void();
|
return Void();
|
||||||
|
|
|
@ -103,12 +103,8 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::function<void(const UlpLocation& ulpLocation,
|
typedef std::function<void(int count, EngineLocationInfo* locationArr)>
|
||||||
const GpsLocationExtended& locationExtended,
|
GnssAdapterReportEnginePositionsEventCb;
|
||||||
enum loc_sess_status status,
|
|
||||||
LocPosTechMask techMask,
|
|
||||||
bool fromEngineHub)>
|
|
||||||
GnssAdapterReportPositionEventCb;
|
|
||||||
|
|
||||||
typedef std::function<void(const GnssSvNotification& svNotify,
|
typedef std::function<void(const GnssSvNotification& svNotify,
|
||||||
bool fromEngineHub)>
|
bool fromEngineHub)>
|
||||||
|
@ -119,9 +115,10 @@ typedef std::function<void(const GnssAidingDataSvMask& svDataMask)>
|
||||||
|
|
||||||
// potential parameters: message queue: MsgTask * msgTask;
|
// potential parameters: message queue: MsgTask * msgTask;
|
||||||
// callback function to report back dr and ppe position and sv report
|
// callback function to report back dr and ppe position and sv report
|
||||||
typedef EngineHubProxyBase* (getEngHubProxyFn)(const MsgTask * msgTask,
|
typedef EngineHubProxyBase* (getEngHubProxyFn)(
|
||||||
|
const MsgTask * msgTask,
|
||||||
IOsObserver* osObserver,
|
IOsObserver* osObserver,
|
||||||
GnssAdapterReportPositionEventCb positionEventCb,
|
GnssAdapterReportEnginePositionsEventCb positionEventCb,
|
||||||
GnssAdapterReportSvEventCb svEventCb,
|
GnssAdapterReportSvEventCb svEventCb,
|
||||||
GnssAdapterReqAidingDataCb reqAidingDataCb);
|
GnssAdapterReqAidingDataCb reqAidingDataCb);
|
||||||
|
|
||||||
|
|
|
@ -81,7 +81,6 @@ void LocAdapterBase::
|
||||||
const GpsLocationExtended& locationExtended,
|
const GpsLocationExtended& locationExtended,
|
||||||
enum loc_sess_status status,
|
enum loc_sess_status status,
|
||||||
LocPosTechMask loc_technology_mask,
|
LocPosTechMask loc_technology_mask,
|
||||||
bool /*fromEngineHub*/,
|
|
||||||
GnssDataNotification* pDataNotify,
|
GnssDataNotification* pDataNotify,
|
||||||
int msInWeek)
|
int msInWeek)
|
||||||
{
|
{
|
||||||
|
|
|
@ -151,9 +151,13 @@ public:
|
||||||
const GpsLocationExtended& locationExtended,
|
const GpsLocationExtended& locationExtended,
|
||||||
enum loc_sess_status status,
|
enum loc_sess_status status,
|
||||||
LocPosTechMask loc_technology_mask,
|
LocPosTechMask loc_technology_mask,
|
||||||
bool fromEngineHub = false,
|
|
||||||
GnssDataNotification* pDataNotify = nullptr,
|
GnssDataNotification* pDataNotify = nullptr,
|
||||||
int msInWeek = -1);
|
int msInWeek = -1);
|
||||||
|
virtual void reportEnginePositionsEvent(unsigned int count,
|
||||||
|
EngineLocationInfo* locationArr) {
|
||||||
|
(void)count;
|
||||||
|
(void)locationArr;
|
||||||
|
}
|
||||||
virtual void reportSvEvent(const GnssSvNotification& svNotify,
|
virtual void reportSvEvent(const GnssSvNotification& svNotify,
|
||||||
bool fromEngineHub=false);
|
bool fromEngineHub=false);
|
||||||
virtual void reportDataEvent(const GnssDataNotification& dataNotify, int msInWeek);
|
virtual void reportDataEvent(const GnssDataNotification& dataNotify, int msInWeek);
|
||||||
|
|
|
@ -148,7 +148,8 @@ struct LocCloseMsg : public LocMsg {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
MsgTask* LocApiBase::mMsgTask;
|
MsgTask* LocApiBase::mMsgTask = nullptr;
|
||||||
|
volatile int32_t LocApiBase::mMsgTaskRefCount = 0;
|
||||||
|
|
||||||
LocApiBase::LocApiBase(LOC_API_ADAPTER_EVENT_MASK_T excludedMask,
|
LocApiBase::LocApiBase(LOC_API_ADAPTER_EVENT_MASK_T excludedMask,
|
||||||
ContextBase* context) :
|
ContextBase* context) :
|
||||||
|
@ -157,6 +158,7 @@ LocApiBase::LocApiBase(LOC_API_ADAPTER_EVENT_MASK_T excludedMask,
|
||||||
{
|
{
|
||||||
memset(mLocAdapters, 0, sizeof(mLocAdapters));
|
memset(mLocAdapters, 0, sizeof(mLocAdapters));
|
||||||
|
|
||||||
|
android_atomic_inc(&mMsgTaskRefCount);
|
||||||
if (nullptr == mMsgTask) {
|
if (nullptr == mMsgTask) {
|
||||||
mMsgTask = new MsgTask("LocApiMsgTask", false);
|
mMsgTask = new MsgTask("LocApiMsgTask", false);
|
||||||
}
|
}
|
||||||
|
@ -230,7 +232,7 @@ void LocApiBase::addAdapter(LocAdapterBase* adapter)
|
||||||
for (int i = 0; i < MAX_ADAPTERS && mLocAdapters[i] != adapter; i++) {
|
for (int i = 0; i < MAX_ADAPTERS && mLocAdapters[i] != adapter; i++) {
|
||||||
if (mLocAdapters[i] == NULL) {
|
if (mLocAdapters[i] == NULL) {
|
||||||
mLocAdapters[i] = adapter;
|
mLocAdapters[i] = adapter;
|
||||||
mMsgTask->sendMsg(new LocOpenMsg(this, adapter));
|
sendMsg(new LocOpenMsg(this, adapter));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -263,10 +265,10 @@ void LocApiBase::removeAdapter(LocAdapterBase* adapter)
|
||||||
|
|
||||||
// if we have an empty list of adapters
|
// if we have an empty list of adapters
|
||||||
if (0 == i) {
|
if (0 == i) {
|
||||||
mMsgTask->sendMsg(new LocCloseMsg(this));
|
sendMsg(new LocCloseMsg(this));
|
||||||
} else {
|
} else {
|
||||||
// else we need to remove the bit
|
// else we need to remove the bit
|
||||||
mMsgTask->sendMsg(new LocOpenMsg(this));
|
sendMsg(new LocOpenMsg(this));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -274,7 +276,7 @@ void LocApiBase::removeAdapter(LocAdapterBase* adapter)
|
||||||
|
|
||||||
void LocApiBase::updateEvtMask()
|
void LocApiBase::updateEvtMask()
|
||||||
{
|
{
|
||||||
mMsgTask->sendMsg(new LocOpenMsg(this));
|
sendMsg(new LocOpenMsg(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocApiBase::updateNmeaMask(uint32_t mask)
|
void LocApiBase::updateNmeaMask(uint32_t mask)
|
||||||
|
@ -298,7 +300,7 @@ void LocApiBase::updateNmeaMask(uint32_t mask)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
mMsgTask->sendMsg(new LocSetNmeaMsg(this, mask));
|
sendMsg(new LocSetNmeaMsg(this, mask));
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocApiBase::handleEngineUpEvent()
|
void LocApiBase::handleEngineUpEvent()
|
||||||
|
@ -343,7 +345,6 @@ void LocApiBase::reportPosition(UlpLocation& location,
|
||||||
TO_ALL_LOCADAPTERS(
|
TO_ALL_LOCADAPTERS(
|
||||||
mLocAdapters[i]->reportPositionEvent(location, locationExtended,
|
mLocAdapters[i]->reportPositionEvent(location, locationExtended,
|
||||||
status, loc_technology_mask,
|
status, loc_technology_mask,
|
||||||
false,
|
|
||||||
pDataNotify, msInWeek)
|
pDataNotify, msInWeek)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include <gps_extended.h>
|
#include <gps_extended.h>
|
||||||
#include <LocationAPI.h>
|
#include <LocationAPI.h>
|
||||||
#include <MsgTask.h>
|
#include <MsgTask.h>
|
||||||
|
#include <LocSharedLock.h>
|
||||||
#include <log_util.h>
|
#include <log_util.h>
|
||||||
|
|
||||||
namespace loc_core {
|
namespace loc_core {
|
||||||
|
@ -107,6 +108,7 @@ class LocApiBase {
|
||||||
friend struct LocKillMsg;
|
friend struct LocKillMsg;
|
||||||
friend class ContextBase;
|
friend class ContextBase;
|
||||||
static MsgTask* mMsgTask;
|
static MsgTask* mMsgTask;
|
||||||
|
static volatile int32_t mMsgTaskRefCount;
|
||||||
LocAdapterBase* mLocAdapters[MAX_ADAPTERS];
|
LocAdapterBase* mLocAdapters[MAX_ADAPTERS];
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -121,7 +123,8 @@ protected:
|
||||||
LocApiBase(LOC_API_ADAPTER_EVENT_MASK_T excludedMask,
|
LocApiBase(LOC_API_ADAPTER_EVENT_MASK_T excludedMask,
|
||||||
ContextBase* context = NULL);
|
ContextBase* context = NULL);
|
||||||
inline virtual ~LocApiBase() {
|
inline virtual ~LocApiBase() {
|
||||||
if (nullptr != mMsgTask) {
|
android_atomic_dec(&mMsgTaskRefCount);
|
||||||
|
if (nullptr != mMsgTask && 0 == mMsgTaskRefCount) {
|
||||||
mMsgTask->destroy();
|
mMsgTask->destroy();
|
||||||
mMsgTask = nullptr;
|
mMsgTask = nullptr;
|
||||||
}
|
}
|
||||||
|
@ -132,8 +135,10 @@ protected:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
inline void sendMsg(const LocMsg* msg) const {
|
inline void sendMsg(const LocMsg* msg) const {
|
||||||
|
if (nullptr != mMsgTask) {
|
||||||
mMsgTask->sendMsg(msg);
|
mMsgTask->sendMsg(msg);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
inline void destroy() {
|
inline void destroy() {
|
||||||
close();
|
close();
|
||||||
struct LocKillMsg : public LocMsg {
|
struct LocKillMsg : public LocMsg {
|
||||||
|
|
11
etc/gps.conf
11
etc/gps.conf
|
@ -24,13 +24,6 @@ DEBUG_LEVEL = 3
|
||||||
# Intermediate position report, 1=enable, 0=disable
|
# Intermediate position report, 1=enable, 0=disable
|
||||||
INTERMEDIATE_POS=0
|
INTERMEDIATE_POS=0
|
||||||
|
|
||||||
# Below bit mask configures how GPS functionalities
|
|
||||||
# should be locked when user turns off GPS on Settings
|
|
||||||
# Set bit 0x1 if MO GPS functionalities are to be locked
|
|
||||||
# Set bit 0x2 if NI GPS functionalities are to be locked
|
|
||||||
# default – both MO and NI locked for maximal privacy
|
|
||||||
#GPS_LOCK = 3
|
|
||||||
|
|
||||||
# supl version 1.0
|
# supl version 1.0
|
||||||
SUPL_VER=0x10000
|
SUPL_VER=0x10000
|
||||||
|
|
||||||
|
@ -124,7 +117,7 @@ A_GLONASS_POS_PROTOCOL_SELECT = 0
|
||||||
# 0x2: WLAN AP Measurements for LPPe CP
|
# 0x2: WLAN AP Measurements for LPPe CP
|
||||||
# 0x4: SRN AP measurement for CP
|
# 0x4: SRN AP measurement for CP
|
||||||
# 0x8: Sensor Barometer Measurement LPPe CP
|
# 0x8: Sensor Barometer Measurement LPPe CP
|
||||||
LPPE_CP_TECHNOLOGY = 0
|
#LPPE_CP_TECHNOLOGY = 0
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
# Select technology for LPPe User Plane
|
# Select technology for LPPe User Plane
|
||||||
|
@ -133,7 +126,7 @@ LPPE_CP_TECHNOLOGY = 0
|
||||||
# 0x2: WLAN AP Measurements for LPPe UP
|
# 0x2: WLAN AP Measurements for LPPe UP
|
||||||
# 0x4: SRN AP measurement for UP
|
# 0x4: SRN AP measurement for UP
|
||||||
# 0x8: Sensor Barometer Measurement LPPe UP
|
# 0x8: Sensor Barometer Measurement LPPe UP
|
||||||
LPPE_UP_TECHNOLOGY = 0
|
#LPPE_UP_TECHNOLOGY = 0
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
# AGPS_CONFIG_INJECT
|
# AGPS_CONFIG_INJECT
|
||||||
|
|
|
@ -304,7 +304,7 @@ void AgpsStateMachine::requestOrReleaseDataConn(bool request){
|
||||||
nifRequest.status = LOC_GPS_RELEASE_AGPS_DATA_CONN;
|
nifRequest.status = LOC_GPS_RELEASE_AGPS_DATA_CONN;
|
||||||
}
|
}
|
||||||
|
|
||||||
mAgpsManager->mFrameworkStatusV4Cb(nifRequest);
|
mFrameworkStatusV4Cb(nifRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AgpsStateMachine::notifyAllSubscribers(
|
void AgpsStateMachine::notifyAllSubscribers(
|
||||||
|
@ -511,7 +511,7 @@ void AgpsStateMachine::dropAllSubscribers(){
|
||||||
|
|
||||||
/* CREATE AGPS STATE MACHINES
|
/* CREATE AGPS STATE MACHINES
|
||||||
* Must be invoked in Msg Handler context */
|
* Must be invoked in Msg Handler context */
|
||||||
void AgpsManager::createAgpsStateMachines() {
|
void AgpsManager::createAgpsStateMachines(const AgpsCbInfo& cbInfo) {
|
||||||
|
|
||||||
LOC_LOGD("AgpsManager::createAgpsStateMachines");
|
LOC_LOGD("AgpsManager::createAgpsStateMachines");
|
||||||
|
|
||||||
|
@ -519,13 +519,16 @@ void AgpsManager::createAgpsStateMachines() {
|
||||||
((loc_core::ContextBase::mGps_conf.CAPABILITIES & LOC_GPS_CAPABILITY_MSA) ||
|
((loc_core::ContextBase::mGps_conf.CAPABILITIES & LOC_GPS_CAPABILITY_MSA) ||
|
||||||
(loc_core::ContextBase::mGps_conf.CAPABILITIES & LOC_GPS_CAPABILITY_MSB));
|
(loc_core::ContextBase::mGps_conf.CAPABILITIES & LOC_GPS_CAPABILITY_MSB));
|
||||||
|
|
||||||
if (NULL == mInternetNif) {
|
if (NULL == mInternetNif && (cbInfo.atlType & AGPS_ATL_TYPE_WWAN)) {
|
||||||
mInternetNif = new AgpsStateMachine(this, LOC_AGPS_TYPE_WWAN_ANY);
|
mInternetNif = new AgpsStateMachine(this, LOC_AGPS_TYPE_WWAN_ANY);
|
||||||
|
mInternetNif->registerFrameworkStatusCallback((AgnssStatusIpV4Cb)cbInfo.statusV4Cb);
|
||||||
LOC_LOGD("Internet NIF: %p", mInternetNif);
|
LOC_LOGD("Internet NIF: %p", mInternetNif);
|
||||||
}
|
}
|
||||||
if (agpsCapable) {
|
if (agpsCapable) {
|
||||||
if (NULL == mAgnssNif) {
|
if (NULL == mAgnssNif && (cbInfo.atlType & AGPS_ATL_TYPE_SUPL) &&
|
||||||
|
(cbInfo.atlType & AGPS_ATL_TYPE_SUPL_ES)) {
|
||||||
mAgnssNif = new AgpsStateMachine(this, LOC_AGPS_TYPE_SUPL);
|
mAgnssNif = new AgpsStateMachine(this, LOC_AGPS_TYPE_SUPL);
|
||||||
|
mAgnssNif->registerFrameworkStatusCallback((AgnssStatusIpV4Cb)cbInfo.statusV4Cb);
|
||||||
LOC_LOGD("AGNSS NIF: %p", mAgnssNif);
|
LOC_LOGD("AGNSS NIF: %p", mAgnssNif);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -544,6 +547,11 @@ AgpsStateMachine* AgpsManager::getAgpsStateMachine(AGpsExtType agpsType) {
|
||||||
LOC_LOGE("NULL AGNSS NIF !");
|
LOC_LOGE("NULL AGNSS NIF !");
|
||||||
}
|
}
|
||||||
return mAgnssNif;
|
return mAgnssNif;
|
||||||
|
case LOC_AGPS_TYPE_WWAN_ANY:
|
||||||
|
if (mInternetNif == NULL) {
|
||||||
|
LOC_LOGE("NULL Internet NIF !");
|
||||||
|
}
|
||||||
|
return mInternetNif;
|
||||||
default:
|
default:
|
||||||
return mInternetNif;
|
return mInternetNif;
|
||||||
}
|
}
|
||||||
|
|
15
gnss/Agps.h
15
gnss/Agps.h
|
@ -137,6 +137,7 @@ protected:
|
||||||
/* Current state for this state machine */
|
/* Current state for this state machine */
|
||||||
AgpsState mState;
|
AgpsState mState;
|
||||||
|
|
||||||
|
AgnssStatusIpV4Cb mFrameworkStatusV4Cb;
|
||||||
private:
|
private:
|
||||||
/* AGPS Type for this state machine
|
/* AGPS Type for this state machine
|
||||||
LOC_AGPS_TYPE_ANY 0
|
LOC_AGPS_TYPE_ANY 0
|
||||||
|
@ -154,6 +155,7 @@ private:
|
||||||
public:
|
public:
|
||||||
/* CONSTRUCTOR */
|
/* CONSTRUCTOR */
|
||||||
AgpsStateMachine(AgpsManager* agpsManager, AGpsExtType agpsType):
|
AgpsStateMachine(AgpsManager* agpsManager, AGpsExtType agpsType):
|
||||||
|
mFrameworkStatusV4Cb(NULL),
|
||||||
mAgpsManager(agpsManager), mSubscriberList(),
|
mAgpsManager(agpsManager), mSubscriberList(),
|
||||||
mCurrentSubscriber(NULL), mState(AGPS_STATE_RELEASED),
|
mCurrentSubscriber(NULL), mState(AGPS_STATE_RELEASED),
|
||||||
mAgpsType(agpsType), mAPN(NULL), mAPNLen(0),
|
mAgpsType(agpsType), mAPN(NULL), mAPNLen(0),
|
||||||
|
@ -175,6 +177,10 @@ public:
|
||||||
inline void setCurrentSubscriber(AgpsSubscriber* subscriber)
|
inline void setCurrentSubscriber(AgpsSubscriber* subscriber)
|
||||||
{ mCurrentSubscriber = subscriber; }
|
{ mCurrentSubscriber = subscriber; }
|
||||||
|
|
||||||
|
inline void registerFrameworkStatusCallback(AgnssStatusIpV4Cb frameworkStatusV4Cb) {
|
||||||
|
mFrameworkStatusV4Cb = frameworkStatusV4Cb;
|
||||||
|
}
|
||||||
|
|
||||||
/* Fetch subscriber with specified handle */
|
/* Fetch subscriber with specified handle */
|
||||||
AgpsSubscriber* getSubscriber(int connHandle);
|
AgpsSubscriber* getSubscriber(int connHandle);
|
||||||
|
|
||||||
|
@ -234,7 +240,6 @@ class AgpsManager {
|
||||||
public:
|
public:
|
||||||
/* CONSTRUCTOR */
|
/* CONSTRUCTOR */
|
||||||
AgpsManager():
|
AgpsManager():
|
||||||
mFrameworkStatusV4Cb(NULL),
|
|
||||||
mAtlOpenStatusCb(), mAtlCloseStatusCb(),
|
mAtlOpenStatusCb(), mAtlCloseStatusCb(),
|
||||||
mAgnssNif(NULL), mInternetNif(NULL)/*, mDsNif(NULL)*/ {}
|
mAgnssNif(NULL), mInternetNif(NULL)/*, mDsNif(NULL)*/ {}
|
||||||
|
|
||||||
|
@ -246,12 +251,11 @@ public:
|
||||||
mAtlCloseStatusCb = atlCloseStatusCb;
|
mAtlCloseStatusCb = atlCloseStatusCb;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void registerFrameworkStatusCallback(AgnssStatusIpV4Cb frameworkStatusV4Cb) {
|
/* Check if AGPS client is registered */
|
||||||
mFrameworkStatusV4Cb = frameworkStatusV4Cb;
|
inline bool isRegistered() { return nullptr != mAgnssNif || nullptr != mInternetNif; }
|
||||||
}
|
|
||||||
|
|
||||||
/* Create all AGPS state machines */
|
/* Create all AGPS state machines */
|
||||||
void createAgpsStateMachines();
|
void createAgpsStateMachines(const AgpsCbInfo& cbInfo);
|
||||||
|
|
||||||
/* Process incoming ATL requests */
|
/* Process incoming ATL requests */
|
||||||
void requestATL(int connHandle, AGpsExtType agpsType, LocApnTypeMask apnTypeMask);
|
void requestATL(int connHandle, AGpsExtType agpsType, LocApnTypeMask apnTypeMask);
|
||||||
|
@ -266,7 +270,6 @@ public:
|
||||||
void handleModemSSR();
|
void handleModemSSR();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
AgnssStatusIpV4Cb mFrameworkStatusV4Cb;
|
|
||||||
|
|
||||||
AgpsAtlOpenStatusCb mAtlOpenStatusCb;
|
AgpsAtlOpenStatusCb mAtlOpenStatusCb;
|
||||||
AgpsAtlCloseStatusCb mAtlCloseStatusCb;
|
AgpsAtlCloseStatusCb mAtlCloseStatusCb;
|
||||||
|
|
|
@ -80,7 +80,6 @@ GnssAdapter::GnssAdapter() :
|
||||||
mGnssSvTypeConfigCb(nullptr),
|
mGnssSvTypeConfigCb(nullptr),
|
||||||
mNiData(),
|
mNiData(),
|
||||||
mAgpsManager(),
|
mAgpsManager(),
|
||||||
mAgpsCbInfo(),
|
|
||||||
mOdcpiRequestCb(nullptr),
|
mOdcpiRequestCb(nullptr),
|
||||||
mOdcpiRequestActive(false),
|
mOdcpiRequestActive(false),
|
||||||
mOdcpiTimer(this),
|
mOdcpiTimer(this),
|
||||||
|
@ -485,6 +484,16 @@ GnssAdapter::convertLocationInfo(GnssLocationInfoNotification& out,
|
||||||
out.flags |= GNSS_LOCATION_INFO_CALIBRATION_STATUS_BIT;
|
out.flags |= GNSS_LOCATION_INFO_CALIBRATION_STATUS_BIT;
|
||||||
out.calibrationStatus = locationExtended.calibrationStatus;
|
out.calibrationStatus = locationExtended.calibrationStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (GPS_LOCATION_EXTENDED_HAS_OUTPUT_ENG_TYPE & locationExtended.flags) {
|
||||||
|
out.flags |= GNSS_LOCATION_INFO_OUTPUT_ENG_TYPE_BIT;
|
||||||
|
out.locOutputEngType = locationExtended.locOutputEngType;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GPS_LOCATION_EXTENDED_HAS_OUTPUT_ENG_MASK & locationExtended.flags) {
|
||||||
|
out.flags |= GNSS_LOCATION_INFO_OUTPUT_ENG_MASK_BIT;
|
||||||
|
out.locOutputEngMask = locationExtended.locOutputEngMask;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -722,8 +731,6 @@ GnssAdapter::setConfig()
|
||||||
//cache the injected configuration with GnssConfigRequested struct
|
//cache the injected configuration with GnssConfigRequested struct
|
||||||
GnssConfig gnssConfigRequested = {};
|
GnssConfig gnssConfigRequested = {};
|
||||||
gnssConfigRequested.flags |= GNSS_CONFIG_FLAGS_GPS_LOCK_VALID_BIT |
|
gnssConfigRequested.flags |= GNSS_CONFIG_FLAGS_GPS_LOCK_VALID_BIT |
|
||||||
GNSS_CONFIG_FLAGS_LPPE_CONTROL_PLANE_VALID_BIT |
|
|
||||||
GNSS_CONFIG_FLAGS_LPPE_USER_PLANE_VALID_BIT |
|
|
||||||
GNSS_CONFIG_FLAGS_BLACKLISTED_SV_IDS_BIT;
|
GNSS_CONFIG_FLAGS_BLACKLISTED_SV_IDS_BIT;
|
||||||
/* Here we process an SSR. We need to set the GPS_LOCK to the proper values, as follows:
|
/* Here we process an SSR. We need to set the GPS_LOCK to the proper values, as follows:
|
||||||
1. Q behavior. This is identified by mSupportNfwControl being 1. In this case
|
1. Q behavior. This is identified by mSupportNfwControl being 1. In this case
|
||||||
|
@ -756,10 +763,17 @@ GnssAdapter::setConfig()
|
||||||
gnssConfigRequested.aGlonassPositionProtocolMask =
|
gnssConfigRequested.aGlonassPositionProtocolMask =
|
||||||
gpsConf.A_GLONASS_POS_PROTOCOL_SELECT;
|
gpsConf.A_GLONASS_POS_PROTOCOL_SELECT;
|
||||||
}
|
}
|
||||||
|
if (gpsConf.LPPE_CP_TECHNOLOGY) {
|
||||||
|
gnssConfigRequested.flags |= GNSS_CONFIG_FLAGS_LPPE_CONTROL_PLANE_VALID_BIT;
|
||||||
gnssConfigRequested.lppeControlPlaneMask =
|
gnssConfigRequested.lppeControlPlaneMask =
|
||||||
mLocApi->convertLppeCp(gpsConf.LPPE_CP_TECHNOLOGY);
|
mLocApi->convertLppeCp(gpsConf.LPPE_CP_TECHNOLOGY);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gpsConf.LPPE_UP_TECHNOLOGY) {
|
||||||
|
gnssConfigRequested.flags |= GNSS_CONFIG_FLAGS_LPPE_USER_PLANE_VALID_BIT;
|
||||||
gnssConfigRequested.lppeUserPlaneMask =
|
gnssConfigRequested.lppeUserPlaneMask =
|
||||||
mLocApi->convertLppeUp(gpsConf.LPPE_UP_TECHNOLOGY);
|
mLocApi->convertLppeUp(gpsConf.LPPE_UP_TECHNOLOGY);
|
||||||
|
}
|
||||||
gnssConfigRequested.blacklistedSvIds.assign(mBlacklistedSvIds.begin(),
|
gnssConfigRequested.blacklistedSvIds.assign(mBlacklistedSvIds.begin(),
|
||||||
mBlacklistedSvIds.end());
|
mBlacklistedSvIds.end());
|
||||||
mLocApi->sendMsg(new LocApiMsg(
|
mLocApi->sendMsg(new LocApiMsg(
|
||||||
|
@ -2078,10 +2092,9 @@ GnssAdapter::updateClientsEventMask()
|
||||||
mask);
|
mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mAgpsCbInfo.statusV4Cb != NULL) {
|
if (mAgpsManager.isRegistered()) {
|
||||||
mask |= LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST;
|
mask |= LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add ODCPI handling
|
// Add ODCPI handling
|
||||||
if (nullptr != mOdcpiRequestCb) {
|
if (nullptr != mOdcpiRequestCb) {
|
||||||
mask |= LOC_API_ADAPTER_BIT_REQUEST_WIFI;
|
mask |= LOC_API_ADAPTER_BIT_REQUEST_WIFI;
|
||||||
|
@ -3051,32 +3064,23 @@ GnssAdapter::reportPositionEvent(const UlpLocation& ulpLocation,
|
||||||
const GpsLocationExtended& locationExtended,
|
const GpsLocationExtended& locationExtended,
|
||||||
enum loc_sess_status status,
|
enum loc_sess_status status,
|
||||||
LocPosTechMask techMask,
|
LocPosTechMask techMask,
|
||||||
bool fromEngineHub,
|
|
||||||
GnssDataNotification* pDataNotify,
|
GnssDataNotification* pDataNotify,
|
||||||
int msInWeek)
|
int msInWeek)
|
||||||
{
|
{
|
||||||
// if this event is called from QMI LOC API, then send report to engine hub
|
// this position is from QMI LOC API, then send report to engine hub
|
||||||
// if sending is successful, we return as we will wait for final report from engine hub
|
// if sending is successful, we return as we will wait for final report from engine hub
|
||||||
// if the position is called from engine hub, then send it out directly
|
// if the position is called from engine hub, then send it out directly
|
||||||
if (!fromEngineHub) {
|
|
||||||
// report QMI position (both propagated and unpropagated) to engine hub,
|
if (true == initEngHubProxy()){
|
||||||
// and engine hub will be distributing it to the registered plugins
|
|
||||||
mEngHubProxy->gnssReportPosition(ulpLocation, locationExtended, status);
|
mEngHubProxy->gnssReportPosition(ulpLocation, locationExtended, status);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (true == ulpLocation.unpropagatedPosition) {
|
if (true == ulpLocation.unpropagatedPosition) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// engine hub is loaded, do not report qmi position to client as
|
// Fix is from QMI, and it is not an
|
||||||
// final position report should come from engine hub
|
|
||||||
if (true == initEngHubProxy()){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// for all other cases:
|
|
||||||
// case 1: fix is from engine hub, queue the msg
|
|
||||||
// case 2: fix is not from engine hub, e.g. from QMI, and it is not an
|
|
||||||
// unpropagated position and engine hub is not loaded, queue the msg
|
// unpropagated position and engine hub is not loaded, queue the msg
|
||||||
// when message is queued, the position can be dispatched to requesting client
|
// when message is queued, the position can be dispatched to requesting client
|
||||||
struct MsgReportPosition : public LocMsg {
|
struct MsgReportPosition : public LocMsg {
|
||||||
|
@ -3133,6 +3137,35 @@ GnssAdapter::reportPositionEvent(const UlpLocation& ulpLocation,
|
||||||
pDataNotify, msInWeek));
|
pDataNotify, msInWeek));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GnssAdapter::reportEnginePositionsEvent(unsigned int count,
|
||||||
|
EngineLocationInfo* locationArr)
|
||||||
|
{
|
||||||
|
struct MsgReportEnginePositions : public LocMsg {
|
||||||
|
GnssAdapter& mAdapter;
|
||||||
|
unsigned int mCount;
|
||||||
|
EngineLocationInfo mEngLocInfo[LOC_OUTPUT_ENGINE_COUNT];
|
||||||
|
inline MsgReportEnginePositions(GnssAdapter& adapter,
|
||||||
|
unsigned int count,
|
||||||
|
EngineLocationInfo* locationArr) :
|
||||||
|
LocMsg(),
|
||||||
|
mAdapter(adapter),
|
||||||
|
mCount(count) {
|
||||||
|
if (mCount > LOC_OUTPUT_ENGINE_COUNT) {
|
||||||
|
mCount = LOC_OUTPUT_ENGINE_COUNT;
|
||||||
|
}
|
||||||
|
if (mCount > 0) {
|
||||||
|
memcpy(mEngLocInfo, locationArr, sizeof(EngineLocationInfo)*mCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inline virtual void proc() const {
|
||||||
|
mAdapter.reportEnginePositions(mCount, mEngLocInfo);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
sendMsg(new MsgReportEnginePositions(*this, count, locationArr));
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
GnssAdapter::needReportForGnssClient(const UlpLocation& ulpLocation,
|
GnssAdapter::needReportForGnssClient(const UlpLocation& ulpLocation,
|
||||||
enum loc_sess_status status,
|
enum loc_sess_status status,
|
||||||
|
@ -3190,6 +3223,17 @@ GnssAdapter::reportPosition(const UlpLocation& ulpLocation,
|
||||||
(reportToGnssClient && !isFlpClient(it->second))) {
|
(reportToGnssClient && !isFlpClient(it->second))) {
|
||||||
if (nullptr != it->second.gnssLocationInfoCb) {
|
if (nullptr != it->second.gnssLocationInfoCb) {
|
||||||
it->second.gnssLocationInfoCb(locationInfo);
|
it->second.gnssLocationInfoCb(locationInfo);
|
||||||
|
} else if ((nullptr != it->second.engineLocationsInfoCb) &&
|
||||||
|
(false == initEngHubProxy())) {
|
||||||
|
// if engine hub is disabled, this is SPE fix from modem
|
||||||
|
// we need to mark one copy marked as fused and one copy marked as PPE
|
||||||
|
// and dispatch it to the engineLocationsInfoCb
|
||||||
|
GnssLocationInfoNotification engLocationsInfo[2];
|
||||||
|
engLocationsInfo[0] = locationInfo;
|
||||||
|
engLocationsInfo[0].locOutputEngType = LOC_OUTPUT_ENGINE_FUSED;
|
||||||
|
engLocationsInfo[0].flags |= GNSS_LOCATION_INFO_OUTPUT_ENG_TYPE_BIT;
|
||||||
|
engLocationsInfo[1] = locationInfo;
|
||||||
|
it->second.engineLocationsInfoCb(2, engLocationsInfo);
|
||||||
} else if (nullptr != it->second.trackingCb) {
|
} else if (nullptr != it->second.trackingCb) {
|
||||||
it->second.trackingCb(locationInfo.location);
|
it->second.trackingCb(locationInfo.location);
|
||||||
}
|
}
|
||||||
|
@ -3237,6 +3281,48 @@ GnssAdapter::reportPosition(const UlpLocation& ulpLocation,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GnssAdapter::reportEnginePositions(unsigned int count,
|
||||||
|
const EngineLocationInfo* locationArr)
|
||||||
|
{
|
||||||
|
bool needReportEnginePositions = false;
|
||||||
|
for (auto it=mClientData.begin(); it != mClientData.end(); ++it) {
|
||||||
|
if (nullptr != it->second.engineLocationsInfoCb) {
|
||||||
|
needReportEnginePositions = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GnssLocationInfoNotification locationInfo[LOC_OUTPUT_ENGINE_COUNT] = {};
|
||||||
|
for (unsigned int i = 0; i < count; i++) {
|
||||||
|
const EngineLocationInfo* engLocation = (locationArr+i);
|
||||||
|
// if it is fused/default location, call reportPosition maintain legacy behavior
|
||||||
|
if ((GPS_LOCATION_EXTENDED_HAS_OUTPUT_ENG_TYPE & engLocation->locationExtended.flags) &&
|
||||||
|
(LOC_OUTPUT_ENGINE_FUSED == engLocation->locationExtended.locOutputEngType)) {
|
||||||
|
reportPosition(engLocation->location,
|
||||||
|
engLocation->locationExtended,
|
||||||
|
engLocation->sessionStatus,
|
||||||
|
engLocation->location.tech_mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needReportEnginePositions) {
|
||||||
|
convertLocationInfo(locationInfo[i], engLocation->locationExtended);
|
||||||
|
convertLocation(locationInfo[i].location,
|
||||||
|
engLocation->location,
|
||||||
|
engLocation->locationExtended,
|
||||||
|
engLocation->location.tech_mask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needReportEnginePositions) {
|
||||||
|
for (auto it=mClientData.begin(); it != mClientData.end(); ++it) {
|
||||||
|
if (nullptr != it->second.engineLocationsInfoCb) {
|
||||||
|
it->second.engineLocationsInfoCb(count, locationInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
GnssAdapter::reportSvEvent(const GnssSvNotification& svNotify,
|
GnssAdapter::reportSvEvent(const GnssSvNotification& svNotify,
|
||||||
bool fromEngineHub)
|
bool fromEngineHub)
|
||||||
|
@ -4111,27 +4197,17 @@ void GnssAdapter::initDefaultAgpsCommand() {
|
||||||
/* INIT LOC AGPS MANAGER */
|
/* INIT LOC AGPS MANAGER */
|
||||||
|
|
||||||
void GnssAdapter::initAgps(const AgpsCbInfo& cbInfo) {
|
void GnssAdapter::initAgps(const AgpsCbInfo& cbInfo) {
|
||||||
LOC_LOGD("%s]: mAgpsCbInfo.cbPriority - %d; cbInfo.cbPriority - %d",
|
LOC_LOGD("%s]:cbInfo.atlType - %d", __func__, cbInfo.atlType);
|
||||||
__func__, mAgpsCbInfo.cbPriority, cbInfo.cbPriority)
|
|
||||||
|
|
||||||
if (!((ContextBase::mGps_conf.CAPABILITIES & LOC_GPS_CAPABILITY_MSB) ||
|
if (!((ContextBase::mGps_conf.CAPABILITIES & LOC_GPS_CAPABILITY_MSB) ||
|
||||||
(ContextBase::mGps_conf.CAPABILITIES & LOC_GPS_CAPABILITY_MSA))) {
|
(ContextBase::mGps_conf.CAPABILITIES & LOC_GPS_CAPABILITY_MSA))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mAgpsCbInfo.cbPriority > cbInfo.cbPriority) {
|
mAgpsManager.createAgpsStateMachines(cbInfo);
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
mAgpsCbInfo = cbInfo;
|
|
||||||
|
|
||||||
mAgpsManager.registerFrameworkStatusCallback((AgnssStatusIpV4Cb)cbInfo.statusV4Cb);
|
|
||||||
|
|
||||||
mAgpsManager.createAgpsStateMachines();
|
|
||||||
|
|
||||||
/* Register for AGPS event mask */
|
/* Register for AGPS event mask */
|
||||||
updateEvtMask(LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST,
|
updateEvtMask(LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST,
|
||||||
LOC_REGISTRATION_MASK_ENABLED);
|
LOC_REGISTRATION_MASK_ENABLED);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GnssAdapter::initAgpsCommand(const AgpsCbInfo& cbInfo){
|
void GnssAdapter::initAgpsCommand(const AgpsCbInfo& cbInfo){
|
||||||
|
@ -4920,15 +4996,10 @@ GnssAdapter::initEngHubProxy() {
|
||||||
|
|
||||||
// prepare the callback functions
|
// prepare the callback functions
|
||||||
// callback function for engine hub to report back position event
|
// callback function for engine hub to report back position event
|
||||||
GnssAdapterReportPositionEventCb reportPositionEventCb =
|
GnssAdapterReportEnginePositionsEventCb reportPositionEventCb =
|
||||||
[this](const UlpLocation& ulpLocation,
|
[this](int count, EngineLocationInfo* locationArr) {
|
||||||
const GpsLocationExtended& locationExtended,
|
|
||||||
enum loc_sess_status status,
|
|
||||||
LocPosTechMask techMask,
|
|
||||||
bool fromEngineHub) {
|
|
||||||
// report from engine hub on behalf of PPE will be treated as fromUlp
|
// report from engine hub on behalf of PPE will be treated as fromUlp
|
||||||
reportPositionEvent(ulpLocation, locationExtended, status,
|
reportEnginePositionsEvent(count, locationArr);
|
||||||
techMask, fromEngineHub);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// callback function for engine hub to report back sv event
|
// callback function for engine hub to report back sv event
|
||||||
|
|
|
@ -163,7 +163,6 @@ class GnssAdapter : public LocAdapterBase {
|
||||||
/* ==== AGPS =========================================================================== */
|
/* ==== AGPS =========================================================================== */
|
||||||
// This must be initialized via initAgps()
|
// This must be initialized via initAgps()
|
||||||
AgpsManager mAgpsManager;
|
AgpsManager mAgpsManager;
|
||||||
AgpsCbInfo mAgpsCbInfo;
|
|
||||||
void initAgps(const AgpsCbInfo& cbInfo);
|
void initAgps(const AgpsCbInfo& cbInfo);
|
||||||
|
|
||||||
/* ==== NFW =========================================================================== */
|
/* ==== NFW =========================================================================== */
|
||||||
|
@ -351,9 +350,11 @@ public:
|
||||||
const GpsLocationExtended& locationExtended,
|
const GpsLocationExtended& locationExtended,
|
||||||
enum loc_sess_status status,
|
enum loc_sess_status status,
|
||||||
LocPosTechMask techMask,
|
LocPosTechMask techMask,
|
||||||
bool fromEngineHub = false,
|
|
||||||
GnssDataNotification* pDataNotify = nullptr,
|
GnssDataNotification* pDataNotify = nullptr,
|
||||||
int msInWeek = -1);
|
int msInWeek = -1);
|
||||||
|
virtual void reportEnginePositionsEvent(unsigned int count,
|
||||||
|
EngineLocationInfo* locationArr);
|
||||||
|
|
||||||
virtual void reportSvEvent(const GnssSvNotification& svNotify,
|
virtual void reportSvEvent(const GnssSvNotification& svNotify,
|
||||||
bool fromEngineHub=false);
|
bool fromEngineHub=false);
|
||||||
virtual void reportNmeaEvent(const char* nmea, size_t length);
|
virtual void reportNmeaEvent(const char* nmea, size_t length);
|
||||||
|
@ -386,6 +387,8 @@ public:
|
||||||
const GpsLocationExtended &locationExtended,
|
const GpsLocationExtended &locationExtended,
|
||||||
enum loc_sess_status status,
|
enum loc_sess_status status,
|
||||||
LocPosTechMask techMask);
|
LocPosTechMask techMask);
|
||||||
|
void reportEnginePositions(unsigned int count,
|
||||||
|
const EngineLocationInfo* locationArr);
|
||||||
void reportSv(GnssSvNotification& svNotify);
|
void reportSv(GnssSvNotification& svNotify);
|
||||||
void reportNmea(const char* nmea, size_t length);
|
void reportNmea(const char* nmea, size_t length);
|
||||||
void reportData(GnssDataNotification& dataNotify);
|
void reportData(GnssDataNotification& dataNotify);
|
||||||
|
|
|
@ -85,6 +85,7 @@ static bool isGnssClient(LocationCallbacks& locationCallbacks)
|
||||||
return (locationCallbacks.gnssNiCb != nullptr ||
|
return (locationCallbacks.gnssNiCb != nullptr ||
|
||||||
locationCallbacks.trackingCb != nullptr ||
|
locationCallbacks.trackingCb != nullptr ||
|
||||||
locationCallbacks.gnssLocationInfoCb != nullptr ||
|
locationCallbacks.gnssLocationInfoCb != nullptr ||
|
||||||
|
locationCallbacks.engineLocationsInfoCb != nullptr ||
|
||||||
locationCallbacks.gnssMeasurementsCb != nullptr);
|
locationCallbacks.gnssMeasurementsCb != nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -175,6 +175,8 @@ typedef enum {
|
||||||
GNSS_LOCATION_INFO_NUM_SV_USED_IN_POSITION_BIT = (1<<24), // number of SV used in position
|
GNSS_LOCATION_INFO_NUM_SV_USED_IN_POSITION_BIT = (1<<24), // number of SV used in position
|
||||||
GNSS_LOCATION_INFO_CALIBRATION_CONFIDENCE_BIT = (1<<25), // valid sensor cal confidence
|
GNSS_LOCATION_INFO_CALIBRATION_CONFIDENCE_BIT = (1<<25), // valid sensor cal confidence
|
||||||
GNSS_LOCATION_INFO_CALIBRATION_STATUS_BIT = (1<<26), // valid sensor cal status
|
GNSS_LOCATION_INFO_CALIBRATION_STATUS_BIT = (1<<26), // valid sensor cal status
|
||||||
|
GNSS_LOCATION_INFO_OUTPUT_ENG_TYPE_BIT = (1<<27), // valid output engine type
|
||||||
|
GNSS_LOCATION_INFO_OUTPUT_ENG_MASK_BIT = (1<<28), // valid output engine mask
|
||||||
} GnssLocationInfoFlagBits;
|
} GnssLocationInfoFlagBits;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -646,6 +648,13 @@ typedef enum {
|
||||||
GNSS_LOC_MAX_NUMBER_OF_SIGNAL_TYPES = 20 /**< Maximum number of signal types */
|
GNSS_LOC_MAX_NUMBER_OF_SIGNAL_TYPES = 20 /**< Maximum number of signal types */
|
||||||
} Gnss_LocSignalEnumType;
|
} Gnss_LocSignalEnumType;
|
||||||
|
|
||||||
|
typedef uint32_t PositioningEngineMask;
|
||||||
|
typedef enum {
|
||||||
|
STANDARD_POSITIONING_ENGINE = (1 << 0),
|
||||||
|
DEAD_RECKONING_ENGINE = (1 << 1),
|
||||||
|
PRECISE_POSITIONING_ENGINE = (1 << 2)
|
||||||
|
} PositioningEngineBits;
|
||||||
|
|
||||||
typedef uint64_t GnssDataMask;
|
typedef uint64_t GnssDataMask;
|
||||||
typedef enum {
|
typedef enum {
|
||||||
// Jammer Indicator is available
|
// Jammer Indicator is available
|
||||||
|
@ -731,15 +740,35 @@ typedef struct {
|
||||||
LocationSpoofMask spoofMask;
|
LocationSpoofMask spoofMask;
|
||||||
} Location;
|
} Location;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LOC_REQ_ENGINE_FUSED_BIT = (1<<0),
|
||||||
|
LOC_REQ_ENGINE_SPE_BIT = (1<<1),
|
||||||
|
LOC_REQ_ENGINE_PPE_BIT = (1<<2),
|
||||||
|
} LocReqEngineTypeMask;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LOC_OUTPUT_ENGINE_FUSED = 0,
|
||||||
|
/** This is the GNSS fix from modem */
|
||||||
|
LOC_OUTPUT_ENGINE_SPE = 1,
|
||||||
|
/** This is the GNSS fix with correction PPP/RTK correction */
|
||||||
|
LOC_OUTPUT_ENGINE_PPE = 2,
|
||||||
|
LOC_OUTPUT_ENGINE_COUNT,
|
||||||
|
} LocOutputEngineType;
|
||||||
|
|
||||||
struct LocationOptions {
|
struct LocationOptions {
|
||||||
uint32_t size; // set to sizeof(LocationOptions)
|
uint32_t size; // set to sizeof(LocationOptions)
|
||||||
uint32_t minInterval; // in milliseconds
|
uint32_t minInterval; // in milliseconds
|
||||||
uint32_t minDistance; // in meters. if minDistance > 0, gnssSvCallback/gnssNmeaCallback/
|
uint32_t minDistance; // in meters. if minDistance > 0, gnssSvCallback/gnssNmeaCallback/
|
||||||
// gnssMeasurementsCallback may not be called
|
// gnssMeasurementsCallback may not be called
|
||||||
GnssSuplMode mode; // Standalone/MS-Based/MS-Assisted
|
GnssSuplMode mode; // Standalone/MS-Based/MS-Assisted
|
||||||
|
// behavior when this field is 0:
|
||||||
|
// if engine hub is running, this will be fused fix,
|
||||||
|
// if engine hub is not running, this will be SPE fix
|
||||||
|
LocReqEngineTypeMask locReqEngTypeMask;
|
||||||
|
|
||||||
inline LocationOptions() :
|
inline LocationOptions() :
|
||||||
size(0), minInterval(0), minDistance(0), mode(GNSS_SUPL_MODE_STANDALONE) {}
|
size(0), minInterval(0), minDistance(0), mode(GNSS_SUPL_MODE_STANDALONE),
|
||||||
|
locReqEngTypeMask((LocReqEngineTypeMask)0) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -764,9 +793,11 @@ struct TrackingOptions : LocationOptions {
|
||||||
inline TrackingOptions(const LocationOptions& options) :
|
inline TrackingOptions(const LocationOptions& options) :
|
||||||
LocationOptions(options), powerMode(GNSS_POWER_MODE_INVALID), tbm(0) {}
|
LocationOptions(options), powerMode(GNSS_POWER_MODE_INVALID), tbm(0) {}
|
||||||
inline void setLocationOptions(const LocationOptions& options) {
|
inline void setLocationOptions(const LocationOptions& options) {
|
||||||
|
size = sizeof(TrackingOptions);
|
||||||
minInterval = options.minInterval;
|
minInterval = options.minInterval;
|
||||||
minDistance = options.minDistance;
|
minDistance = options.minDistance;
|
||||||
mode = options.mode;
|
mode = options.mode;
|
||||||
|
locReqEngTypeMask = options.locReqEngTypeMask;
|
||||||
}
|
}
|
||||||
inline LocationOptions getLocationOptions() {
|
inline LocationOptions getLocationOptions() {
|
||||||
LocationOptions locOption;
|
LocationOptions locOption;
|
||||||
|
@ -774,6 +805,7 @@ struct TrackingOptions : LocationOptions {
|
||||||
locOption.minDistance = minDistance;
|
locOption.minDistance = minDistance;
|
||||||
locOption.minInterval = minInterval;
|
locOption.minInterval = minInterval;
|
||||||
locOption.mode = mode;
|
locOption.mode = mode;
|
||||||
|
locOption.locReqEngTypeMask = locReqEngTypeMask;
|
||||||
return locOption;
|
return locOption;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -997,6 +1029,16 @@ typedef struct {
|
||||||
uint8_t calibrationConfidence; // Sensor calibration confidence percent,
|
uint8_t calibrationConfidence; // Sensor calibration confidence percent,
|
||||||
// in range of [0, 100]
|
// in range of [0, 100]
|
||||||
DrCalibrationStatusMask calibrationStatus; // Sensor calibration status
|
DrCalibrationStatusMask calibrationStatus; // Sensor calibration status
|
||||||
|
// location engine type. When the fix. when the type is set to
|
||||||
|
// LOC_ENGINE_SRC_FUSED, the fix is the propagated/aggregated
|
||||||
|
// reports from all engines running on the system (e.g.:
|
||||||
|
// DR/SPE/PPE) based proprietary algorithm. To check which
|
||||||
|
// location engine contributes to the fused output, check for
|
||||||
|
// locOutputEngMask.
|
||||||
|
LocOutputEngineType locOutputEngType;
|
||||||
|
// when loc output eng type is set to fused, this field
|
||||||
|
// indicates the set of engines contribute to the fix.
|
||||||
|
PositioningEngineMask locOutputEngMask;
|
||||||
} GnssLocationInfoNotification;
|
} GnssLocationInfoNotification;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -1317,6 +1359,20 @@ typedef std::function<void(
|
||||||
GnssLocationInfoNotification gnssLocationInfoNotification
|
GnssLocationInfoNotification gnssLocationInfoNotification
|
||||||
)> gnssLocationInfoCallback;
|
)> gnssLocationInfoCallback;
|
||||||
|
|
||||||
|
/* Gives default combined location information from all engines and
|
||||||
|
location information individually from selected engines.
|
||||||
|
This callback is only used when there are multiple engines
|
||||||
|
running in the system.
|
||||||
|
|
||||||
|
optional can be NULL
|
||||||
|
|
||||||
|
engineLocationsInfoCallback is called only during a tracking session
|
||||||
|
broadcasted to all clients, no matter if a session has started by client */
|
||||||
|
typedef std::function<void(
|
||||||
|
uint32_t count,
|
||||||
|
GnssLocationInfoNotification* engineLocationInfoNotification
|
||||||
|
)> engineLocationsInfoCallback;
|
||||||
|
|
||||||
/* Used for addGeofences API, optional can be NULL
|
/* Used for addGeofences API, optional can be NULL
|
||||||
geofenceBreachCallback is called when any number of geofences have a state change */
|
geofenceBreachCallback is called when any number of geofences have a state change */
|
||||||
typedef std::function<void(
|
typedef std::function<void(
|
||||||
|
@ -1403,6 +1459,7 @@ typedef struct {
|
||||||
gnssMeasurementsCallback gnssMeasurementsCb; // optional
|
gnssMeasurementsCallback gnssMeasurementsCb; // optional
|
||||||
batchingStatusCallback batchingStatusCb; // optional
|
batchingStatusCallback batchingStatusCb; // optional
|
||||||
locationSystemInfoCallback locationSystemInfoCb; // optional
|
locationSystemInfoCallback locationSystemInfoCb; // optional
|
||||||
|
engineLocationsInfoCallback engineLocationsInfoCb; // optional
|
||||||
} LocationCallbacks;
|
} LocationCallbacks;
|
||||||
|
|
||||||
#endif /* LOCATIONDATATYPES_H */
|
#endif /* LOCATIONDATATYPES_H */
|
||||||
|
|
|
@ -29,6 +29,7 @@ libgps_utils_la_h_sources = \
|
||||||
gps_extended.h \
|
gps_extended.h \
|
||||||
loc_gps.h \
|
loc_gps.h \
|
||||||
log_util.h \
|
log_util.h \
|
||||||
|
LocSharedLock.h \
|
||||||
LocUnorderedSetMap.h
|
LocUnorderedSetMap.h
|
||||||
|
|
||||||
libgps_utils_la_c_sources = \
|
libgps_utils_la_c_sources = \
|
||||||
|
|
|
@ -194,15 +194,14 @@ typedef uint32_t LocApnTypeMask;
|
||||||
/**< Denotes APN type for emergency */
|
/**< Denotes APN type for emergency */
|
||||||
#define LOC_APN_TYPE_MASK_EMERGENCY ((LocApnTypeMask)0x00000200)
|
#define LOC_APN_TYPE_MASK_EMERGENCY ((LocApnTypeMask)0x00000200)
|
||||||
|
|
||||||
typedef enum {
|
typedef uint32_t AGpsTypeMask;
|
||||||
AGPS_CB_PRIORITY_LOW = 1,
|
#define AGPS_ATL_TYPE_SUPL ((AGpsTypeMask)0x00000001)
|
||||||
AGPS_CB_PRIORITY_MED = 2,
|
#define AGPS_ATL_TYPE_SUPL_ES ((AGpsTypeMask)0x00000002)
|
||||||
AGPS_CB_PRIORITY_HIGH = 3
|
#define AGPS_ATL_TYPE_WWAN ((AGpsTypeMask)0x00000004)
|
||||||
} AgpsCbPriority;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
void* statusV4Cb;
|
void* statusV4Cb;
|
||||||
AgpsCbPriority cbPriority;
|
AGpsTypeMask atlType;
|
||||||
} AgpsCbInfo;
|
} AgpsCbInfo;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -385,6 +384,13 @@ typedef uint64_t GpsLocationExtendedFlags;
|
||||||
#define GPS_LOCATION_EXTENDED_HAS_CALIBRATION_CONFIDENCE 0x800000000
|
#define GPS_LOCATION_EXTENDED_HAS_CALIBRATION_CONFIDENCE 0x800000000
|
||||||
/** GpsLocationExtended has sensor calibration status */
|
/** GpsLocationExtended has sensor calibration status */
|
||||||
#define GPS_LOCATION_EXTENDED_HAS_CALIBRATION_STATUS 0x1000000000
|
#define GPS_LOCATION_EXTENDED_HAS_CALIBRATION_STATUS 0x1000000000
|
||||||
|
/** GpsLocationExtended has the engine type that produced this
|
||||||
|
* position, the bit mask will only be set when there are two
|
||||||
|
* or more position engines running in the system */
|
||||||
|
#define GPS_LOCATION_EXTENDED_HAS_OUTPUT_ENG_TYPE 0x2000000000
|
||||||
|
/** GpsLocationExtended has the engine mask that indicates the
|
||||||
|
* set of engines contribute to the fix. */
|
||||||
|
#define GPS_LOCATION_EXTENDED_HAS_OUTPUT_ENG_MASK 0x4000000000
|
||||||
|
|
||||||
typedef uint32_t LocNavSolutionMask;
|
typedef uint32_t LocNavSolutionMask;
|
||||||
/* Bitmask to specify whether SBAS ionospheric correction is used */
|
/* Bitmask to specify whether SBAS ionospheric correction is used */
|
||||||
|
@ -798,6 +804,16 @@ typedef struct {
|
||||||
/** Sensor calibration confidence percent. Range: 0 - 100 */
|
/** Sensor calibration confidence percent. Range: 0 - 100 */
|
||||||
uint8_t calibrationConfidence;
|
uint8_t calibrationConfidence;
|
||||||
DrCalibrationStatusMask calibrationStatus;
|
DrCalibrationStatusMask calibrationStatus;
|
||||||
|
/* location engine type. When the fix. when the type is set to
|
||||||
|
LOC_ENGINE_SRC_FUSED, the fix is the propagated/aggregated
|
||||||
|
reports from all engines running on the system (e.g.:
|
||||||
|
DR/SPE/PPE) based proprietary algorithm. To check which
|
||||||
|
location engine contributes to the fused output, check for
|
||||||
|
locOutputEngMask. */
|
||||||
|
LocOutputEngineType locOutputEngType;
|
||||||
|
/* when loc output eng type is set to fused, this field
|
||||||
|
indicates the set of engines contribute to the fix. */
|
||||||
|
PositioningEngineMask locOutputEngMask;
|
||||||
} GpsLocationExtended;
|
} GpsLocationExtended;
|
||||||
|
|
||||||
enum loc_sess_status {
|
enum loc_sess_status {
|
||||||
|
@ -806,6 +822,13 @@ enum loc_sess_status {
|
||||||
LOC_SESS_FAILURE
|
LOC_SESS_FAILURE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// struct that contains complete position info from engine
|
||||||
|
typedef struct {
|
||||||
|
UlpLocation location;
|
||||||
|
GpsLocationExtended locationExtended;
|
||||||
|
enum loc_sess_status sessionStatus;
|
||||||
|
} EngineLocationInfo;
|
||||||
|
|
||||||
// Nmea sentence types mask
|
// Nmea sentence types mask
|
||||||
typedef uint32_t NmeaSentenceTypesMask;
|
typedef uint32_t NmeaSentenceTypesMask;
|
||||||
#define LOC_NMEA_MASK_GGA_V02 ((NmeaSentenceTypesMask)0x00000001) /**< Enable GGA type */
|
#define LOC_NMEA_MASK_GGA_V02 ((NmeaSentenceTypesMask)0x00000001) /**< Enable GGA type */
|
||||||
|
@ -826,6 +849,20 @@ typedef uint32_t NmeaSentenceTypesMask;
|
||||||
#define LOC_NMEA_MASK_PQGSA_V02 ((NmeaSentenceTypesMask)0x00008000) /**< Enable PQGSA type */
|
#define LOC_NMEA_MASK_PQGSA_V02 ((NmeaSentenceTypesMask)0x00008000) /**< Enable PQGSA type */
|
||||||
#define LOC_NMEA_MASK_PQGSV_V02 ((NmeaSentenceTypesMask)0x00010000) /**< Enable PQGSV type */
|
#define LOC_NMEA_MASK_PQGSV_V02 ((NmeaSentenceTypesMask)0x00010000) /**< Enable PQGSV type */
|
||||||
#define LOC_NMEA_MASK_DEBUG_V02 ((NmeaSentenceTypesMask)0x00020000) /**< Enable DEBUG type */
|
#define LOC_NMEA_MASK_DEBUG_V02 ((NmeaSentenceTypesMask)0x00020000) /**< Enable DEBUG type */
|
||||||
|
#define LOC_NMEA_MASK_GPDTM_V02 ((NmeaSentenceTypesMask)0x00040000) /**< Enable GPDTM type */
|
||||||
|
#define LOC_NMEA_MASK_GNGGA_V02 ((NmeaSentenceTypesMask)0x00080000) /**< Enable GNGGA type */
|
||||||
|
#define LOC_NMEA_MASK_GNRMC_V02 ((NmeaSentenceTypesMask)0x00100000) /**< Enable GNRMC type */
|
||||||
|
#define LOC_NMEA_MASK_GNVTG_V02 ((NmeaSentenceTypesMask)0x00200000) /**< Enable GNVTG type */
|
||||||
|
#define LOC_NMEA_MASK_GAGNS_V02 ((NmeaSentenceTypesMask)0x00400000) /**< Enable GAGNS type */
|
||||||
|
#define LOC_NMEA_MASK_GBGGA_V02 ((NmeaSentenceTypesMask)0x00800000) /**< Enable GBGGA type */
|
||||||
|
#define LOC_NMEA_MASK_GBGSA_V02 ((NmeaSentenceTypesMask)0x01000000) /**< Enable GBGSA type */
|
||||||
|
#define LOC_NMEA_MASK_GBGSV_V02 ((NmeaSentenceTypesMask)0x02000000) /**< Enable GBGSV type */
|
||||||
|
#define LOC_NMEA_MASK_GBRMC_V02 ((NmeaSentenceTypesMask)0x04000000) /**< Enable GBRMC type */
|
||||||
|
#define LOC_NMEA_MASK_GBVTG_V02 ((NmeaSentenceTypesMask)0x08000000) /**< Enable GBVTG type */
|
||||||
|
#define LOC_NMEA_MASK_GQGSV_V02 ((NmeaSentenceTypesMask)0x10000000) /**< Enable GQGSV type */
|
||||||
|
#define LOC_NMEA_MASK_GIGSV_V02 ((NmeaSentenceTypesMask)0x20000000) /**< Enable GIGSV type */
|
||||||
|
#define LOC_NMEA_MASK_GNDTM_V02 ((NmeaSentenceTypesMask)0x40000000) /**< Enable GNDTM type */
|
||||||
|
|
||||||
|
|
||||||
// all bitmasks of general supported NMEA sentenses - debug is not part of this
|
// all bitmasks of general supported NMEA sentenses - debug is not part of this
|
||||||
#define LOC_NMEA_ALL_GENERAL_SUPPORTED_MASK (LOC_NMEA_MASK_GGA_V02 | LOC_NMEA_MASK_RMC_V02 | \
|
#define LOC_NMEA_ALL_GENERAL_SUPPORTED_MASK (LOC_NMEA_MASK_GGA_V02 | LOC_NMEA_MASK_RMC_V02 | \
|
||||||
|
@ -833,7 +870,12 @@ typedef uint32_t NmeaSentenceTypesMask;
|
||||||
LOC_NMEA_MASK_PQXFI_V02 | LOC_NMEA_MASK_PSTIS_V02 | LOC_NMEA_MASK_GLGSV_V02 | \
|
LOC_NMEA_MASK_PQXFI_V02 | LOC_NMEA_MASK_PSTIS_V02 | LOC_NMEA_MASK_GLGSV_V02 | \
|
||||||
LOC_NMEA_MASK_GNGSA_V02 | LOC_NMEA_MASK_GNGNS_V02 | LOC_NMEA_MASK_GARMC_V02 | \
|
LOC_NMEA_MASK_GNGSA_V02 | LOC_NMEA_MASK_GNGNS_V02 | LOC_NMEA_MASK_GARMC_V02 | \
|
||||||
LOC_NMEA_MASK_GAGSV_V02 | LOC_NMEA_MASK_GAGSA_V02 | LOC_NMEA_MASK_GAVTG_V02 | \
|
LOC_NMEA_MASK_GAGSV_V02 | LOC_NMEA_MASK_GAGSA_V02 | LOC_NMEA_MASK_GAVTG_V02 | \
|
||||||
LOC_NMEA_MASK_GAGGA_V02 | LOC_NMEA_MASK_PQGSA_V02 | LOC_NMEA_MASK_PQGSV_V02)
|
LOC_NMEA_MASK_GAGGA_V02 | LOC_NMEA_MASK_PQGSA_V02 | LOC_NMEA_MASK_PQGSV_V02 | \
|
||||||
|
LOC_NMEA_MASK_GPDTM_V02 | LOC_NMEA_MASK_GNGGA_V02 | LOC_NMEA_MASK_GNRMC_V02 | \
|
||||||
|
LOC_NMEA_MASK_GNVTG_V02 | LOC_NMEA_MASK_GAGNS_V02 | LOC_NMEA_MASK_GBGGA_V02 | \
|
||||||
|
LOC_NMEA_MASK_GBGSA_V02 | LOC_NMEA_MASK_GBGSV_V02 | LOC_NMEA_MASK_GBRMC_V02 | \
|
||||||
|
LOC_NMEA_MASK_GBVTG_V02 | LOC_NMEA_MASK_GQGSV_V02 | LOC_NMEA_MASK_GIGSV_V02 | \
|
||||||
|
LOC_NMEA_MASK_GNDTM_V02)
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC = 0,
|
LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC = 0,
|
||||||
|
|
|
@ -2076,5 +2076,13 @@ void loc_nmea_generate_sv(const GnssSvNotification &svNotify,
|
||||||
loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_BEIDOU,
|
loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_BEIDOU,
|
||||||
GNSS_SIGNAL_BEIDOU_B2AI,false), nmeaArraystr);
|
GNSS_SIGNAL_BEIDOU_B2AI,false), nmeaArraystr);
|
||||||
|
|
||||||
|
// -----------------------------
|
||||||
|
// ------$GIGSV (NAVIC:L5)------
|
||||||
|
// -----------------------------
|
||||||
|
|
||||||
|
loc_nmea_generate_GSV(svNotify, sentence, sizeof(sentence),
|
||||||
|
loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_NAVIC,
|
||||||
|
GNSS_SIGNAL_NAVIC_L5,false), nmeaArraystr);
|
||||||
|
|
||||||
EXIT_LOG(%d, 0);
|
EXIT_LOG(%d, 0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue