Merge "Location Hal Design Level Change for FLP Requirement"

This commit is contained in:
Linux Build Service Account 2013-08-04 01:16:57 -07:00 committed by Gerrit - the friendly Code Review server
commit 66f58f5b05
40 changed files with 4617 additions and 2987 deletions

49
core/Android.mk Normal file
View file

@ -0,0 +1,49 @@
ifneq ($(BUILD_TINY_ANDROID),true)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libloc_core
LOCAL_MODULE_OWNER := qcom
LOCAL_MODULE_TAGS := optional
LOCAL_SHARED_LIBRARIES := \
libutils \
libcutils \
libgps.utils \
libdl \
libandroid_runtime
LOCAL_SRC_FILES += \
MsgTask.cpp \
LocApiBase.cpp \
LocAdapterBase.cpp \
ContextBase.cpp \
LocDualContext.cpp \
loc_core_log.cpp
LOCAL_CFLAGS += \
-fno-short-enums \
-D_ANDROID_
LOCAL_C_INCLUDES:= \
$(TARGET_OUT_HEADERS)/gps.utils
LOCAL_COPY_HEADERS_TO:= libloc_core/
LOCAL_COPY_HEADERS:= \
MsgTask.h \
LocApiBase.h \
LocAdapterBase.h \
ContextBase.h \
LocDualContext.h \
gps_extended_c.h \
gps_extended.h \
loc_core_log.h
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)
endif # not BUILD_TINY_ANDROID

63
core/ContextBase.cpp Normal file
View file

@ -0,0 +1,63 @@
/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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_NDDEBUG 0
#define LOG_TAG "LocSvc_CtxBase"
#include <dlfcn.h>
#include <cutils/sched_policy.h>
#include <unistd.h>
#include <ContextBase.h>
#include <msg_q.h>
#include <log_util.h>
#include <loc_log.h>
namespace loc_core {
const char* ContextBase::mIzatLibName = "libloc_api_v02.so ";
// we initialized this handle to 1 because it can't possibly
// 1 if it ever gets assigned a value. NULL on the otherhand
// is possilbe.
void* ContextBase::mIzatLibHandle = (void*)1;
void* ContextBase::getIzatLibHandle()
{
if ((void*)1 == mIzatLibHandle) {
mIzatLibHandle = dlopen(mIzatLibName, RTLD_NOW);
}
return mIzatLibHandle;
}
ContextBase::ContextBase(const MsgTask* msgTask,
LOC_API_ADAPTER_EVENT_MASK_T exMask) :
mMsgTask(msgTask),
mLocApi(LocApiBase::create(mMsgTask, exMask, getIzatLibHandle()))
{
}
}

61
core/ContextBase.h Normal file
View file

@ -0,0 +1,61 @@
/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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_CONTEXT_BASE__
#define __LOC_CONTEXT_BASE__
#include <stdbool.h>
#include <ctype.h>
#include <MsgTask.h>
#include <LocApiBase.h>
namespace loc_core {
class LocAdapterBase;
class ContextBase {
static const char* mIzatLibName;
static void* mIzatLibHandle;
protected:
const MsgTask* mMsgTask;
LocApiBase* mLocApi;
protected:
ContextBase(const MsgTask* msgTask,
LOC_API_ADAPTER_EVENT_MASK_T exMask);
inline virtual ~ContextBase() { delete mLocApi; }
public:
static void* getIzatLibHandle();
inline const MsgTask* getMsgTask() { return mMsgTask; }
inline LocApiBase* getLocApi() { return mLocApi; }
};
} // namespace loc_core
#endif //__LOC_CONTEXT_BASE__

147
core/LocAdapterBase.cpp Normal file
View file

@ -0,0 +1,147 @@
/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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_NDDEBUG 0
#define LOG_TAG "LocSvc_LocAdapterBase"
#include <dlfcn.h>
#include <LocAdapterBase.h>
#include <loc_target.h>
#include <log_util.h>
namespace loc_core {
struct LocOpenMsg : public LocMsg {
LocAdapterBase* mLocAdapter;
LocApiBase* mLocApi;
inline LocOpenMsg(LocAdapterBase* locAdapter,
LocApiBase* locApi) :
LocMsg(), mLocAdapter(locAdapter), mLocApi(locApi)
{
locallog();
}
inline virtual void proc() const {
mLocApi->addAdapter(mLocAdapter);
}
inline void locallog() {
LOC_LOGV("LocOpen");
}
inline virtual void log() {
locallog();
}
};
// This is the top level class, so the constructor will
// always gets called. Here we prepare for the default.
// But if getLocApi(targetEnumType target) is overriden,
// the right locApi should get created.
LocAdapterBase::LocAdapterBase(const LOC_API_ADAPTER_EVENT_MASK_T mask,
ContextBase* context) :
mEvtMask(mask), mContext(context),
mLocApi(context->getLocApi()), mMsgTask(context->getMsgTask())
{
sendMsg(new LocOpenMsg(this, mLocApi));
}
// This will be overridden by the individual adapters
// if necessary.
#define DEFAULT_IMPL(rtv) \
{ \
LOC_LOGW("%s: default implementation invoked", __func__); \
return rtv; \
}
void LocAdapterBase::
handleEngineDownEvent()
DEFAULT_IMPL()
void LocAdapterBase::
reportPosition(UlpLocation &location,
GpsLocationExtended &locationExtended,
void* locationExt,
enum loc_sess_status status,
LocPosTechMask loc_technology_mask)
DEFAULT_IMPL()
void LocAdapterBase::
reportSv(GpsSvStatus &svStatus,
GpsLocationExtended &locationExtended,
void* svExt)
DEFAULT_IMPL()
void LocAdapterBase::
reportStatus(GpsStatusValue status)
DEFAULT_IMPL()
void LocAdapterBase::
reportNmea(const char* nmea, int length)
DEFAULT_IMPL()
bool LocAdapterBase::
reportXtraServer(const char* url1, const char* url2,
const char* url3, const int maxlength)
DEFAULT_IMPL(false)
bool LocAdapterBase::
requestXtraData()
DEFAULT_IMPL(false)
bool LocAdapterBase::
requestTime()
DEFAULT_IMPL(false)
bool LocAdapterBase::
requestLocation()
DEFAULT_IMPL(false)
bool LocAdapterBase::
requestATL(int connHandle, AGpsType agps_type)
DEFAULT_IMPL(false)
bool LocAdapterBase::
releaseATL(int connHandle)
DEFAULT_IMPL(false)
bool LocAdapterBase::
requestSuplES(int connHandle)
DEFAULT_IMPL(false)
bool LocAdapterBase::
reportDataCallOpened()
DEFAULT_IMPL(false)
bool LocAdapterBase::
reportDataCallClosed()
DEFAULT_IMPL(false)
bool LocAdapterBase::
requestNiNotify(GpsNiNotification &notify, const void* data)
DEFAULT_IMPL(false)
} // namespace loc_core

97
core/LocAdapterBase.h Normal file
View file

@ -0,0 +1,97 @@
/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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
#include <gps_extended.h>
#include <ContextBase.h>
namespace loc_core {
class LocAdapterBase {
protected:
const LOC_API_ADAPTER_EVENT_MASK_T mEvtMask;
ContextBase* mContext;
LocApiBase* mLocApi;
const MsgTask* mMsgTask;
LocAdapterBase(const LOC_API_ADAPTER_EVENT_MASK_T mask,
ContextBase* context);
inline virtual ~LocAdapterBase() { mLocApi->removeAdapter(this); }
public:
inline LOC_API_ADAPTER_EVENT_MASK_T
checkMask(LOC_API_ADAPTER_EVENT_MASK_T mask) const {
return mEvtMask & mask;
}
inline LOC_API_ADAPTER_EVENT_MASK_T getEvtMask() const {
return mEvtMask;
}
inline void sendMsg(const LocMsg* msg) const {
mMsgTask->sendMsg(msg);
}
inline void sendMsg(const LocMsg* msg) {
mMsgTask->sendMsg(msg);
}
// This will be overridden by the individual adapters
// if necessary.
inline virtual void handleEngineUpEvent() {}
virtual void handleEngineDownEvent() ;
virtual void reportPosition(UlpLocation &location,
GpsLocationExtended &locationExtended,
void* locationExt,
enum loc_sess_status status,
LocPosTechMask loc_technology_mask);
virtual void reportSv(GpsSvStatus &svStatus,
GpsLocationExtended &locationExtended,
void* svExt);
virtual void reportStatus(GpsStatusValue status);
virtual void reportNmea(const char* nmea, int length);
virtual bool reportXtraServer(const char* url1, const char* url2,
const char* url3, const int maxlength);
virtual bool requestXtraData();
virtual bool requestTime();
virtual bool requestLocation();
virtual bool requestATL(int connHandle, AGpsType agps_type);
virtual bool releaseATL(int connHandle);
virtual bool requestSuplES(int connHandle);
virtual bool reportDataCallOpened();
virtual bool reportDataCallClosed();
virtual bool requestNiNotify(GpsNiNotification &notify,
const void* data);
inline virtual bool isInSession() { return false; }
};
} // namespace loc_core
#endif //LOC_API_ADAPTER_BASE_H

475
core/LocApiBase.cpp Normal file
View file

@ -0,0 +1,475 @@
/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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_NDDEBUG 0
#define LOG_TAG "LocSvc_LocApiBase"
#include <dlfcn.h>
#include <LocApiBase.h>
#include <LocAdapterBase.h>
#include <loc_target.h>
#include <log_util.h>
namespace loc_core {
#define TO_ALL_LOCADAPTERS(call) TO_ALL_ADAPTERS(mLocAdapters, (call))
#define TO_1ST_HANDLING_LOCADAPTERS(call) TO_1ST_HANDLING_ADAPTER(mLocAdapters, (call))
int hexcode(char *hexstring, int string_size,
const char *data, int data_size)
{
int i;
for (i = 0; i < data_size; i++)
{
char ch = data[i];
if (i*2 + 3 <= string_size)
{
snprintf(&hexstring[i*2], 3, "%02X", ch);
}
else {
break;
}
}
return i;
}
int decodeAddress(char *addr_string, int string_size,
const char *data, int data_size)
{
const char addr_prefix = 0x91;
int i, idxOutput = 0;
if (!data || !addr_string) { return 0; }
if (data[0] != addr_prefix)
{
LOC_LOGW("decodeAddress: address prefix is not 0x%x but 0x%x", addr_prefix, data[0]);
addr_string[0] = '\0';
return 0; // prefix not correct
}
for (i = 1; i < data_size; i++)
{
unsigned char ch = data[i], low = ch & 0x0F, hi = ch >> 4;
if (low <= 9 && idxOutput < string_size - 1) { addr_string[idxOutput++] = low + '0'; }
if (hi <= 9 && idxOutput < string_size - 1) { addr_string[idxOutput++] = hi + '0'; }
}
addr_string[idxOutput] = '\0'; // Terminates the string
return idxOutput;
}
struct LocSsrMsg : public LocMsg {
LocApiBase* mLocApi;
inline LocSsrMsg(LocApiBase* locApi) :
LocMsg(), mLocApi(locApi)
{
locallog();
}
inline virtual void proc() const {
mLocApi->close();
mLocApi->open(mLocApi->getEvtMask());
}
inline void locallog() {
LOC_LOGV("LocSsrMsg");
}
inline virtual void log() {
locallog();
}
};
LocApiBase* LocApiBase::create(const MsgTask* msgTask,
LOC_API_ADAPTER_EVENT_MASK_T exMask,
void* libHandle)
{
LocApiBase* locApi = NULL;
// first if can not be MPQ
if (TARGET_MPQ != get_target()) {
getLocApi_t* getter = NULL;
// needto check if locaction.so exists
void* handle = ContextBase::getIzatLibHandle();
if (NULL == handle ||
NULL == (getter = (getLocApi_t*)dlsym(handle, "getLocApi")) ||
NULL == (locApi = (*getter)(msgTask, exMask))) {
// only RPC is the option now
handle = dlopen("libloc_api-rpc-qc.so", RTLD_NOW);
if (NULL != handle) {
getter = (getLocApi_t*)dlsym(handle, "getLocApi");
if (NULL != getter) {
locApi = (*getter)(msgTask, exMask);
}
}
}
}
// locApi could still be NULL at this time
// we would then create a dummy one
if (NULL == locApi) {
locApi = new LocApiBase(msgTask, exMask);
}
return locApi;
}
LocApiBase::LocApiBase(const MsgTask* msgTask,
LOC_API_ADAPTER_EVENT_MASK_T excludedMask) :
mExcludedMask(excludedMask), mMsgTask(msgTask), mMask(0)
{
memset(mLocAdapters, 0, sizeof(mLocAdapters));
}
LOC_API_ADAPTER_EVENT_MASK_T LocApiBase::getEvtMask()
{
LOC_API_ADAPTER_EVENT_MASK_T mask = 0;
TO_ALL_LOCADAPTERS(mask |= mLocAdapters[i]->getEvtMask());
return mask & ~mExcludedMask;
}
bool LocApiBase::isInSession()
{
bool inSession = false;
TO_ALL_LOCADAPTERS(inSession = mLocAdapters[i]->isInSession());
return inSession;
}
void LocApiBase::addAdapter(LocAdapterBase* adapter)
{
for (int i = 0; i < MAX_ADAPTERS && mLocAdapters[i] != adapter; i++) {
if (mLocAdapters[i] == NULL) {
mLocAdapters[i] = adapter;
open(mMask | (adapter->getEvtMask() & ~mExcludedMask));
break;
}
}
}
void LocApiBase::removeAdapter(LocAdapterBase* adapter)
{
for (int i = 0;
i < MAX_ADAPTERS && NULL != mLocAdapters[i];
i++) {
if (mLocAdapters[i] == adapter) {
mLocAdapters[i] = NULL;
// shift the rest of the adapters up so that the pointers
// in the array do not have holes. This should be more
// performant, because the array maintenance is much much
// less frequent than event handlings, which need to linear
// search all the adapters
int j = i;
while (++i < MAX_ADAPTERS && mLocAdapters[i] != NULL);
// i would be MAX_ADAPTERS or point to a NULL
i--;
// i now should point to a none NULL adapter within valid
// range although i could be equal to j, but it won't hurt.
// No need to check it, as it gains nothing.
mLocAdapters[j] = mLocAdapters[i];
// this makes sure that we exit the for loop
mLocAdapters[i] = NULL;
// if we have an empty list of adapters
if (0 == i) {
close();
} else {
// else we need to remove the bit
open(getEvtMask() & ~mExcludedMask);
}
}
}
}
void LocApiBase::handleEngineUpEvent()
{
// This will take care of renegotiating the loc handle
mMsgTask->sendMsg(new LocSsrMsg(this));
// loop through adapters, and deliver to all adapters.
TO_ALL_LOCADAPTERS(mLocAdapters[i]->handleEngineUpEvent());
}
void LocApiBase::handleEngineDownEvent()
{
// loop through adapters, and deliver to all adapters.
TO_ALL_LOCADAPTERS(mLocAdapters[i]->handleEngineDownEvent());
}
void LocApiBase::reportPosition(UlpLocation &location,
GpsLocationExtended &locationExtended,
void* locationExt,
enum loc_sess_status status,
LocPosTechMask loc_technology_mask)
{
// loop through adapters, and deliver to all adapters.
TO_ALL_LOCADAPTERS(
mLocAdapters[i]->reportPosition(location,
locationExtended,
locationExt,
status,
loc_technology_mask)
);
}
void LocApiBase::reportSv(GpsSvStatus &svStatus,
GpsLocationExtended &locationExtended,
void* svExt)
{
// loop through adapters, and deliver to all adapters.
TO_ALL_LOCADAPTERS(
mLocAdapters[i]->reportSv(svStatus,
locationExtended,
svExt)
);
}
void LocApiBase::reportStatus(GpsStatusValue status)
{
// loop through adapters, and deliver to all adapters.
TO_ALL_LOCADAPTERS(mLocAdapters[i]->reportStatus(status));
}
void LocApiBase::reportNmea(const char* nmea, int length)
{
// loop through adapters, and deliver to all adapters.
TO_ALL_LOCADAPTERS(mLocAdapters[i]->reportNmea(nmea, length));
}
void LocApiBase::reportXtraServer(const char* url1, const char* url2,
const char* url3, const int maxlength)
{
// loop through adapters, and deliver to the first handling adapter.
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->reportXtraServer(url1, url2, url3, maxlength));
}
void LocApiBase::requestXtraData()
{
// loop through adapters, and deliver to the first handling adapter.
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestXtraData());
}
void LocApiBase::requestTime()
{
// loop through adapters, and deliver to the first handling adapter.
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestTime());
}
void LocApiBase::requestLocation()
{
// loop through adapters, and deliver to the first handling adapter.
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestLocation());
}
void LocApiBase::requestATL(int connHandle, AGpsType agps_type)
{
// loop through adapters, and deliver to the first handling adapter.
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestATL(connHandle, agps_type));
}
void LocApiBase::releaseATL(int connHandle)
{
// loop through adapters, and deliver to the first handling adapter.
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->releaseATL(connHandle));
}
void LocApiBase::requestSuplES(int connHandle)
{
// loop through adapters, and deliver to the first handling adapter.
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestSuplES(connHandle));
}
void LocApiBase::reportDataCallOpened()
{
// loop through adapters, and deliver to the first handling adapter.
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->reportDataCallOpened());
}
void LocApiBase::reportDataCallClosed()
{
// loop through adapters, and deliver to the first handling adapter.
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->reportDataCallClosed());
}
void LocApiBase::requestNiNotify(GpsNiNotification &notify, const void* data)
{
// loop through adapters, and deliver to the first handling adapter.
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestNiNotify(notify, data));
}
// downward calls
// All below functions are to be defined by adapter specific modules:
// RPC, QMI, etc. The default implementation is empty.
#define DEFAULT_IMPL(rtv) \
{ \
LOC_LOGW("%s: default implementation invoked", __func__); \
return rtv; \
}
enum loc_api_adapter_err LocApiBase::
open(LOC_API_ADAPTER_EVENT_MASK_T mask)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
close()
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
startFix(const LocPosMode& posMode)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
stopFix()
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
deleteAidingData(GpsAidingData f)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
enableData(int enable)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
setAPN(char* apn, int len)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
injectPosition(double latitude, double longitude, float accuracy)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
setTime(GpsUtcTime time, int64_t timeReference, int uncertainty)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
setXtraData(char* data, int length)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
requestXtraServer()
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
atlOpenStatus(int handle, int is_succ, char* apn,
AGpsBearerType bear, AGpsType agpsType)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
atlCloseStatus(int handle, int is_succ)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
setPositionMode(const LocPosMode& posMode)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
setServer(const char* url, int len)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
setServer(unsigned int ip, int port,
LocServerType type)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
informNiResponse(GpsUserResponseType userResponse,
const void* passThroughData)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
setSUPLVersion(uint32_t version)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
setLPPConfig(uint32_t profile)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
setSensorControlConfig(int sensorUsage)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
setSensorProperties(bool gyroBiasVarianceRandomWalk_valid,
float gyroBiasVarianceRandomWalk,
bool accelBiasVarianceRandomWalk_valid,
float accelBiasVarianceRandomWalk,
bool angleBiasVarianceRandomWalk_valid,
float angleBiasVarianceRandomWalk,
bool rateBiasVarianceRandomWalk_valid,
float rateBiasVarianceRandomWalk,
bool velocityBiasVarianceRandomWalk_valid,
float velocityBiasVarianceRandomWalk)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
setSensorPerfControlConfig(int controlMode,
int accelSamplesPerBatch,
int accelBatchesPerSec,
int gyroSamplesPerBatch,
int gyroBatchesPerSec,
int accelSamplesPerBatchHigh,
int accelBatchesPerSecHigh,
int gyroSamplesPerBatchHigh,
int gyroBatchesPerSecHigh,
int algorithmConfig)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
setExtPowerConfig(int isBatteryCharging)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
setAGLONASSProtocol(unsigned long aGlonassProtocol)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
int LocApiBase::
initDataServiceClient()
DEFAULT_IMPL(-1)
int LocApiBase::
openAndStartDataCall()
DEFAULT_IMPL(-1)
void LocApiBase::
stopDataCall()
DEFAULT_IMPL()
void LocApiBase::
closeDataCall()
DEFAULT_IMPL()
} // namespace loc_core

254
core/LocApiBase.h Normal file
View file

@ -0,0 +1,254 @@
/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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_BASE_H
#define LOC_API_BASE_H
#include <stddef.h>
#include <ctype.h>
#include <gps_extended.h>
#include <MsgTask.h>
#define smaller_of(a, b) (((a) > (b)) ? (b) : (a))
#define MAX_APN_LEN 100
namespace loc_core {
int hexcode(char *hexstring, int string_size,
const char *data, int data_size);
int decodeAddress(char *addr_string, int string_size,
const char *data, int data_size);
enum loc_api_adapter_err {
LOC_API_ADAPTER_ERR_SUCCESS = 0,
LOC_API_ADAPTER_ERR_GENERAL_FAILURE = 1,
LOC_API_ADAPTER_ERR_UNSUPPORTED = 2,
LOC_API_ADAPTER_ERR_INVALID_HANDLE = 4,
LOC_API_ADAPTER_ERR_INVALID_PARAMETER = 5,
LOC_API_ADAPTER_ERR_ENGINE_BUSY = 6,
LOC_API_ADAPTER_ERR_PHONE_OFFLINE = 7,
LOC_API_ADAPTER_ERR_TIMEOUT = 8,
LOC_API_ADAPTER_ERR_SERVICE_NOT_PRESENT = 9,
LOC_API_ADAPTER_ERR_ENGINE_DOWN = 100,
LOC_API_ADAPTER_ERR_FAILURE,
LOC_API_ADAPTER_ERR_UNKNOWN
};
enum loc_api_adapter_event_index {
LOC_API_ADAPTER_REPORT_POSITION = 0, // Position report comes in loc_parsed_position_s_type
LOC_API_ADAPTER_REPORT_SATELLITE, // Satellite in view report
LOC_API_ADAPTER_REPORT_NMEA_1HZ, // NMEA report at 1HZ rate
LOC_API_ADAPTER_REPORT_NMEA_POSITION, // NMEA report at position report rate
LOC_API_ADAPTER_REQUEST_NI_NOTIFY_VERIFY, // NI notification/verification request
LOC_API_ADAPTER_REQUEST_ASSISTANCE_DATA, // Assistance data, eg: time, predicted orbits request
LOC_API_ADAPTER_REQUEST_LOCATION_SERVER, // Request for location server
LOC_API_ADAPTER_REPORT_IOCTL, // Callback report for loc_ioctl
LOC_API_ADAPTER_REPORT_STATUS, // Misc status report: eg, engine state
LOC_API_ADAPTER_REQUEST_WIFI, //
LOC_API_ADAPTER_SENSOR_STATUS, //
LOC_API_ADAPTER_REQUEST_TIME_SYNC, //
LOC_API_ADAPTER_REPORT_SPI, //
LOC_API_ADAPTER_REPORT_NI_GEOFENCE, //
LOC_API_ADAPTER_GEOFENCE_GEN_ALERT, //
LOC_API_ADAPTER_REPORT_GENFENCE_BREACH, //
LOC_API_ADAPTER_PEDOMETER_CTRL, //
LOC_API_ADAPTER_MOTION_CTRL, //
LOC_API_ADAPTER_EVENT_MAX
};
#define LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT (1<<LOC_API_ADAPTER_REPORT_POSITION)
#define LOC_API_ADAPTER_BIT_SATELLITE_REPORT (1<<LOC_API_ADAPTER_REPORT_SATELLITE)
#define LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT (1<<LOC_API_ADAPTER_REPORT_NMEA_1HZ)
#define LOC_API_ADAPTER_BIT_NMEA_POSITION_REPORT (1<<LOC_API_ADAPTER_REPORT_NMEA_POSITION)
#define LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST (1<<LOC_API_ADAPTER_REQUEST_NI_NOTIFY_VERIFY)
#define LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST (1<<LOC_API_ADAPTER_REQUEST_ASSISTANCE_DATA)
#define LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST (1<<LOC_API_ADAPTER_REQUEST_LOCATION_SERVER)
#define LOC_API_ADAPTER_BIT_IOCTL_REPORT (1<<LOC_API_ADAPTER_REPORT_IOCTL)
#define LOC_API_ADAPTER_BIT_STATUS_REPORT (1<<LOC_API_ADAPTER_REPORT_STATUS)
#define LOC_API_ADAPTER_BIT_REQUEST_WIFI (1<<LOC_API_ADAPTER_REQUEST_WIFI)
#define LOC_API_ADAPTER_BIT_SENSOR_STATUS (1<<LOC_API_ADAPTER_SENSOR_STATUS)
#define LOC_API_ADAPTER_BIT_REQUEST_TIME_SYNC (1<<LOC_API_ADAPTER_REQUEST_TIME_SYNC)
#define LOC_API_ADAPTER_BIT_REPORT_SPI (1<<LOC_API_ADAPTER_REPORT_SPI)
#define LOC_API_ADAPTER_BIT_REPORT_NI_GEOFENCE (1<<LOC_API_ADAPTER_REPORT_NI_GEOFENCE)
#define LOC_API_ADAPTER_BIT_GEOFENCE_GEN_ALERT (1<<LOC_API_ADAPTER_GEOFENCE_GEN_ALERT)
#define LOC_API_ADAPTER_BIT_REPORT_GENFENCE_BREACH (1<<LOC_API_ADAPTER_REPORT_GENFENCE_BREACH)
#define LOC_API_ADAPTER_BIT_PEDOMETER_CTRL (1<<LOC_API_ADAPTER_PEDOMETER_CTRL)
#define LOC_API_ADAPTER_BIT_MOTION_CTRL (1<<LOC_API_ADAPTER_MOTION_CTRL)
typedef unsigned int LOC_API_ADAPTER_EVENT_MASK_T;
#define MAX_ADAPTERS 10
#define TO_ALL_ADAPTERS(adapters, call) \
for (int i = 0; i < MAX_ADAPTERS && NULL != (adapters)[i]; i++) { \
call; \
}
#define TO_1ST_HANDLING_ADAPTER(adapters, call) \
for (int i = 0; i <MAX_ADAPTERS && NULL != (adapters)[i] && !(call); i++);
class LocAdapterBase;
struct LocSsrMsg;
class LocApiBase {
friend struct LocSsrMsg;
friend class ContextBase;
const LOC_API_ADAPTER_EVENT_MASK_T mExcludedMask;
const MsgTask* mMsgTask;
LocAdapterBase* mLocAdapters[MAX_ADAPTERS];
static LocApiBase* create(const MsgTask* msgTask,
LOC_API_ADAPTER_EVENT_MASK_T exMask,
void* libHandle);
virtual enum loc_api_adapter_err
open(LOC_API_ADAPTER_EVENT_MASK_T mask);
virtual enum loc_api_adapter_err
close();
LOC_API_ADAPTER_EVENT_MASK_T getEvtMask();
protected:
LOC_API_ADAPTER_EVENT_MASK_T mMask;
LocApiBase(const MsgTask* msgTask,
LOC_API_ADAPTER_EVENT_MASK_T excludedMask);
inline virtual ~LocApiBase() { close(); }
bool isInSession();
public:
void addAdapter(LocAdapterBase* adapter);
void removeAdapter(LocAdapterBase* adapter);
// upward calls
void handleEngineUpEvent();
void handleEngineDownEvent();
void reportPosition(UlpLocation &location,
GpsLocationExtended &locationExtended,
void* locationExt,
enum loc_sess_status status,
LocPosTechMask loc_technology_mask =
LOC_POS_TECH_MASK_DEFAULT);
void reportSv(GpsSvStatus &svStatus,
GpsLocationExtended &locationExtended,
void* svExt);
void reportStatus(GpsStatusValue status);
void reportNmea(const char* nmea, int length);
void reportXtraServer(const char* url1, const char* url2,
const char* url3, const int maxlength);
void requestXtraData();
void requestTime();
void requestLocation();
void requestATL(int connHandle, AGpsType agps_type);
void releaseATL(int connHandle);
void requestSuplES(int connHandle);
void reportDataCallOpened();
void reportDataCallClosed();
void requestNiNotify(GpsNiNotification &notify, const void* data);
// downward calls
// All below functions are to be defined by adapter specific modules:
// RPC, QMI, etc. The default implementation is empty.
virtual enum loc_api_adapter_err
startFix(const LocPosMode& posMode);
virtual enum loc_api_adapter_err
stopFix();
virtual enum loc_api_adapter_err
deleteAidingData(GpsAidingData f);
virtual enum loc_api_adapter_err
enableData(int enable);
virtual enum loc_api_adapter_err
setAPN(char* apn, int len);
virtual enum loc_api_adapter_err
injectPosition(double latitude, double longitude, float accuracy);
virtual enum loc_api_adapter_err
setTime(GpsUtcTime time, int64_t timeReference, int uncertainty);
virtual enum loc_api_adapter_err
setXtraData(char* data, int length);
virtual enum loc_api_adapter_err
requestXtraServer();
virtual enum loc_api_adapter_err
atlOpenStatus(int handle, int is_succ, char* apn, AGpsBearerType bear, AGpsType agpsType);
virtual enum loc_api_adapter_err
atlCloseStatus(int handle, int is_succ);
virtual enum loc_api_adapter_err
setPositionMode(const LocPosMode& posMode);
virtual enum loc_api_adapter_err
setServer(const char* url, int len);
virtual enum loc_api_adapter_err
setServer(unsigned int ip, int port,
LocServerType type);
virtual enum loc_api_adapter_err
informNiResponse(GpsUserResponseType userResponse, const void* passThroughData);
virtual enum loc_api_adapter_err
setSUPLVersion(uint32_t version);
virtual enum loc_api_adapter_err
setLPPConfig(uint32_t profile);
virtual enum loc_api_adapter_err
setSensorControlConfig(int sensorUsage);
virtual enum loc_api_adapter_err
setSensorProperties(bool gyroBiasVarianceRandomWalk_valid,
float gyroBiasVarianceRandomWalk,
bool accelBiasVarianceRandomWalk_valid,
float accelBiasVarianceRandomWalk,
bool angleBiasVarianceRandomWalk_valid,
float angleBiasVarianceRandomWalk,
bool rateBiasVarianceRandomWalk_valid,
float rateBiasVarianceRandomWalk,
bool velocityBiasVarianceRandomWalk_valid,
float velocityBiasVarianceRandomWalk);
virtual enum loc_api_adapter_err
setSensorPerfControlConfig(int controlMode,
int accelSamplesPerBatch,
int accelBatchesPerSec,
int gyroSamplesPerBatch,
int gyroBatchesPerSec,
int accelSamplesPerBatchHigh,
int accelBatchesPerSecHigh,
int gyroSamplesPerBatchHigh,
int gyroBatchesPerSecHigh,
int algorithmConfig);
virtual enum loc_api_adapter_err
setExtPowerConfig(int isBatteryCharging);
virtual enum loc_api_adapter_err
setAGLONASSProtocol(unsigned long aGlonassProtocol);
virtual int initDataServiceClient();
virtual int openAndStartDataCall();
virtual void stopDataCall();
virtual void closeDataCall();
inline virtual void setInSession(bool inSession) {}
};
typedef LocApiBase* (getLocApi_t)(const MsgTask* msgTask,
LOC_API_ADAPTER_EVENT_MASK_T exMask);
} // namespace loc_core
#endif //LOC_API_BASE_H

117
core/LocDualContext.cpp Normal file
View file

@ -0,0 +1,117 @@
/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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_NDDEBUG 0
#define LOG_TAG "LocSvc_DualCtx"
#include <cutils/sched_policy.h>
#include <unistd.h>
#include <LocDualContext.h>
#include <msg_q.h>
#include <log_util.h>
#include <loc_log.h>
namespace loc_core {
// nothing exclude for foreground
const LOC_API_ADAPTER_EVENT_MASK_T
LocDualContext::mFgExclMask = 0;
// excluded events for background clients
const LOC_API_ADAPTER_EVENT_MASK_T
LocDualContext::mBgExclMask =
(LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT |
LOC_API_ADAPTER_BIT_SATELLITE_REPORT |
LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT |
LOC_API_ADAPTER_BIT_NMEA_POSITION_REPORT |
LOC_API_ADAPTER_BIT_IOCTL_REPORT |
LOC_API_ADAPTER_BIT_STATUS_REPORT |
LOC_API_ADAPTER_BIT_GEOFENCE_GEN_ALERT);
const MsgTask* LocDualContext::mMsgTask = NULL;
ContextBase* LocDualContext::mFgContext = NULL;
ContextBase* LocDualContext::mBgContext = NULL;
char LocDualContext::mHasAgpsExt = 0xff;
// the name must be shorter than 15 chars
const char* LocDualContext::mLocationHalName = "Loc_hal_worker";
const MsgTask* LocDualContext::getMsgTask(MsgTask::tCreate tCreator,
const char* name)
{
if (NULL == mMsgTask) {
mMsgTask = new MsgTask(tCreator, name);
}
return mMsgTask;
}
ContextBase* LocDualContext::getLocFgContext(MsgTask::tCreate tCreator,
const char* name)
{
if (NULL == mFgContext) {
const MsgTask* msgTask = getMsgTask(tCreator, name);
mFgContext = new LocDualContext(msgTask,
mFgExclMask);
}
return mFgContext;
}
ContextBase* LocDualContext::getLocBgContext(MsgTask::tCreate tCreator,
const char* name)
{
if (NULL == mBgContext) {
const MsgTask* msgTask = getMsgTask(tCreator, name);
mBgContext = new LocDualContext(msgTask,
mBgExclMask);
}
return mBgContext;
}
bool LocDualContext::hasAgpsExt()
{
if (0xff == mHasAgpsExt) {
mHasAgpsExt = 0;
void* handle = ContextBase::getIzatLibHandle();
if (NULL != handle) {
bool(*getter)() = (bool(*)())dlsym(handle, "hasAgpsExt");
if (NULL != getter && (*getter)()) {
mHasAgpsExt = 1;
}
}
}
return mHasAgpsExt == 1;
}
LocDualContext::LocDualContext(const MsgTask* msgTask,
LOC_API_ADAPTER_EVENT_MASK_T exMask) :
ContextBase(msgTask, exMask)
{
}
}

68
core/LocDualContext.h Normal file
View file

@ -0,0 +1,68 @@
/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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_ENG_CONTEXT__
#define __LOC_ENG_CONTEXT__
#include <stdbool.h>
#include <ctype.h>
#include <dlfcn.h>
#include <ContextBase.h>
namespace loc_core {
class LocDualContext : public ContextBase {
static const MsgTask* mMsgTask;
static ContextBase* mFgContext;
static ContextBase* mBgContext;
static char mHasAgpsExt;
static const MsgTask* getMsgTask(MsgTask::tCreate tCreator,
const char* name);
protected:
LocDualContext(const MsgTask* msgTask,
LOC_API_ADAPTER_EVENT_MASK_T exMask);
inline virtual ~LocDualContext() {}
public:
static const LOC_API_ADAPTER_EVENT_MASK_T mFgExclMask;
static const LOC_API_ADAPTER_EVENT_MASK_T mBgExclMask;
static const char* mLocationHalName;
static ContextBase* getLocFgContext(MsgTask::tCreate tCreator,
const char* name);
static ContextBase* getLocBgContext(MsgTask::tCreate tCreator,
const char* name);
static bool hasAgpsExt();
};
}
#endif //__LOC_ENG_CONTEXT__

133
core/MsgTask.cpp Normal file
View file

@ -0,0 +1,133 @@
/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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_NDDEBUG 0
#define LOG_TAG "LocSvc_MsgTask"
#include <cutils/sched_policy.h>
#include <unistd.h>
#include <MsgTask.h>
#include <msg_q.h>
#include <log_util.h>
#include <loc_log.h>
#include <android_runtime/AndroidRuntime.h>
namespace loc_core {
#define MAX_TASK_COMM_LEN 15
static void LocMsgDestroy(void* msg) {
delete (LocMsg*)msg;
}
MsgTask::MsgTask(tCreate tCreator, const char* threadName) :
mQ(msg_q_init2()), mAssociator(NULL){
if (tCreator) {
tCreator(threadName, loopMain,
(void*)new MsgTask(mQ, mAssociator));
} else {
createPThread(threadName);
}
}
MsgTask::MsgTask(tAssociate tAssociator, const char* threadName) :
mQ(msg_q_init2()), mAssociator(tAssociator){
createPThread(threadName);
}
inline
MsgTask::MsgTask(const void* q, tAssociate associator) :
mQ(q), mAssociator(associator){
}
MsgTask::~MsgTask() {
msg_q_unblock((void*)mQ);
}
void MsgTask::createPThread(const char* threadName) {
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_t tid;
// create the thread here, then if successful
// and a name is given, we set the thread name
if (!pthread_create(&tid, &attr, loopMain,
(void*)new MsgTask(mQ, mAssociator)) &&
NULL != threadName) {
char lname[MAX_TASK_COMM_LEN+1];
memcpy(lname, threadName, MAX_TASK_COMM_LEN);
lname[MAX_TASK_COMM_LEN] = 0;
pthread_setname_np(tid, lname);
}
}
void MsgTask::sendMsg(const LocMsg* msg) const {
msg_q_snd((void*)mQ, (void*)msg, LocMsgDestroy);
}
void* MsgTask::loopMain(void* arg) {
MsgTask* copy = (MsgTask*)arg;
// make sure we do not run in background scheduling group
set_sched_policy(gettid(), SP_FOREGROUND);
if (NULL != copy->mAssociator) {
copy->mAssociator();
}
LocMsg* msg;
int cnt = 0;
while (1) {
LOC_LOGD("MsgTask::loop() %d listening ...\n", cnt++);
msq_q_err_type result = msg_q_rcv((void*)copy->mQ, (void **)&msg);
if (eMSG_Q_SUCCESS != result) {
LOC_LOGE("%s:%d] fail receiving msg: %s\n", __func__, __LINE__,
loc_get_msg_q_status(result));
// destroy the Q and exit
msg_q_destroy((void**)&(copy->mQ));
delete copy;
return NULL;
}
msg->log();
// there is where each individual msg handling is invoked
msg->proc();
delete msg;
}
delete copy;
return NULL;
}
}

66
core/MsgTask.h Normal file
View file

@ -0,0 +1,66 @@
/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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 __MSG_TASK__
#define __MSG_TASK__
#include <stdbool.h>
#include <ctype.h>
#include <string.h>
#include <pthread.h>
namespace loc_core {
struct LocMsg {
inline LocMsg() {}
inline virtual ~LocMsg() {}
virtual void proc() const = 0;
inline virtual void log() const {}
};
class MsgTask {
public:
typedef void* (*tStart)(void*);
typedef pthread_t (*tCreate)(const char* name, tStart start, void* arg);
typedef int (*tAssociate)();
MsgTask(tCreate tCreator, const char* threadName);
MsgTask(tAssociate tAssociator, const char* threadName);
~MsgTask();
void sendMsg(const LocMsg* msg) const;
private:
const void* mQ;
tAssociate mAssociator;
MsgTask(const void* q, tAssociate associator);
static void* loopMain(void* copy);
void createPThread(const char* name);
};
} // namespace loc_core
#endif //__MSG_TASK__

92
core/gps_extended.h Normal file
View file

@ -0,0 +1,92 @@
/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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 GPS_EXTENDED_H
#define GPS_EXTENDED_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include <gps_extended_c.h>
struct LocPosMode
{
LocPositionMode mode;
GpsPositionRecurrence recurrence;
uint32_t min_interval;
uint32_t preferred_accuracy;
uint32_t preferred_time;
char credentials[14];
char provider[8];
LocPosMode(LocPositionMode m, GpsPositionRecurrence recr,
uint32_t gap, uint32_t accu, uint32_t time,
const char* cred, const char* prov) :
mode(m), recurrence(recr),
min_interval(gap < MIN_POSSIBLE_FIX_INTERVAL ? MIN_POSSIBLE_FIX_INTERVAL : gap),
preferred_accuracy(accu), preferred_time(time) {
memset(credentials, 0, sizeof(credentials));
memset(provider, 0, sizeof(provider));
if (NULL != cred) {
memcpy(credentials, cred, sizeof(credentials)-1);
}
if (NULL != prov) {
memcpy(provider, prov, sizeof(provider)-1);
}
}
inline LocPosMode() :
mode(LOC_POSITION_MODE_MS_BASED),
recurrence(GPS_POSITION_RECURRENCE_PERIODIC),
min_interval(MIN_POSSIBLE_FIX_INTERVAL),
preferred_accuracy(50), preferred_time(120000) {
memset(credentials, 0, sizeof(credentials));
memset(provider, 0, sizeof(provider));
}
inline bool equals(const LocPosMode &anotherMode) const
{
return anotherMode.mode == mode &&
anotherMode.recurrence == recurrence &&
anotherMode.min_interval == min_interval &&
anotherMode.preferred_accuracy == preferred_accuracy &&
anotherMode.preferred_time == preferred_time &&
!strncmp(anotherMode.credentials, credentials, sizeof(credentials)-1) &&
!strncmp(anotherMode.provider, provider, sizeof(provider)-1);
}
void logv() const;
};
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* GPS_EXTENDED_H */

256
core/gps_extended_c.h Normal file
View file

@ -0,0 +1,256 @@
/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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 GPS_EXTENDED_C_H
#define GPS_EXTENDED_C_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include <ctype.h>
#include <stdbool.h>
#include <hardware/gps.h>
/** Location has valid source information. */
#define LOCATION_HAS_SOURCE_INFO 0x0020
/** GpsLocation has valid "is indoor?" flag */
#define GPS_LOCATION_HAS_IS_INDOOR 0x0040
/** GpsLocation has valid floor number */
#define GPS_LOCATION_HAS_FLOOR_NUMBER 0x0080
/** GpsLocation has valid map URL*/
#define GPS_LOCATION_HAS_MAP_URL 0x0100
/** GpsLocation has valid map index */
#define GPS_LOCATION_HAS_MAP_INDEX 0x0200
/** Sizes for indoor fields */
#define GPS_LOCATION_MAP_URL_SIZE 400
#define GPS_LOCATION_MAP_INDEX_SIZE 16
/** Position source is ULP */
#define ULP_LOCATION_IS_FROM_HYBRID 0x0001
/** Position source is GNSS only */
#define ULP_LOCATION_IS_FROM_GNSS 0x0002
#define ULP_MIN_INTERVAL_INVALID 0xffffffff
typedef struct {
/** set to sizeof(UlpLocation) */
size_t size;
GpsLocation gpsLocation;
/* Provider indicator for HYBRID or GPS */
uint16_t position_source;
/*allows HAL to pass additional information related to the location */
int rawDataSize; /* in # of bytes */
void * rawData;
bool is_indoor;
float floor_number;
char map_url[GPS_LOCATION_MAP_URL_SIZE];
unsigned char map_index[GPS_LOCATION_MAP_INDEX_SIZE];
} UlpLocation;
/** AGPS type */
typedef int16_t AGpsExtType;
#define AGPS_TYPE_INVALID -1
#define AGPS_TYPE_ANY 0
#define AGPS_TYPE_SUPL 1
#define AGPS_TYPE_C2K 2
#define AGPS_TYPE_WWAN_ANY 3
#define AGPS_TYPE_WIFI 4
#define AGPS_TYPE_SUPL_ES 5
/** SSID length */
#define SSID_BUF_SIZE (32+1)
typedef int16_t AGpsBearerType;
#define AGPS_APN_BEARER_INVALID -1
#define AGPS_APN_BEARER_IPV4 0
#define AGPS_APN_BEARER_IPV6 1
#define AGPS_APN_BEARER_IPV4V6 2
#define GPS_DELETE_ALMANAC_CORR 0x00001000
#define GPS_DELETE_FREQ_BIAS_EST 0x00002000
#define GPS_DELETE_EPHEMERIS_GLO 0x00004000
#define GPS_DELETE_ALMANAC_GLO 0x00008000
#define GPS_DELETE_SVDIR_GLO 0x00010000
#define GPS_DELETE_SVSTEER_GLO 0x00020000
#define GPS_DELETE_ALMANAC_CORR_GLO 0x00040000
#define GPS_DELETE_TIME_GPS 0x00080000
#define GPS_DELETE_TIME_GLO 0x00100000
/** GPS extended callback structure. */
typedef struct {
/** set to sizeof(GpsCallbacks) */
size_t size;
gps_set_capabilities set_capabilities_cb;
gps_acquire_wakelock acquire_wakelock_cb;
gps_release_wakelock release_wakelock_cb;
gps_create_thread create_thread_cb;
gps_request_utc_time request_utc_time_cb;
} GpsExtCallbacks;
/** Callback to report the xtra server url to the client.
* The client should use this url when downloading xtra unless overwritten
* in the gps.conf file
*/
typedef void (* report_xtra_server)(const char*, const char*, const char*);
/** Callback structure for the XTRA interface. */
typedef struct {
gps_xtra_download_request download_request_cb;
gps_create_thread create_thread_cb;
report_xtra_server report_xtra_server_cb;
} GpsXtraExtCallbacks;
/** Represents the status of AGPS. */
typedef struct {
/** set to sizeof(AGpsExtStatus) */
size_t size;
AGpsExtType type;
AGpsStatusValue status;
uint32_t ipv4_addr;
char ipv6_addr[16];
char ssid[SSID_BUF_SIZE];
char password[SSID_BUF_SIZE];
} AGpsExtStatus;
/** Callback with AGPS status information.
* Can only be called from a thread created by create_thread_cb.
*/
typedef void (* agps_status_extended)(AGpsExtStatus* status);
/** Callback structure for the AGPS interface. */
typedef struct {
agps_status_extended status_cb;
gps_create_thread create_thread_cb;
} AGpsExtCallbacks;
/** GPS NI callback structure. */
typedef struct
{
/**
* Sends the notification request from HAL to GPSLocationProvider.
*/
gps_ni_notify_callback notify_cb;
gps_create_thread create_thread_cb;
} GpsNiExtCallbacks;
typedef enum loc_server_type {
LOC_AGPS_CDMA_PDE_SERVER,
LOC_AGPS_CUSTOM_PDE_SERVER,
LOC_AGPS_MPC_SERVER,
LOC_AGPS_SUPL_SERVER
} LocServerType;
typedef enum loc_position_mode_type {
LOC_POSITION_MODE_STANDALONE,
LOC_POSITION_MODE_MS_BASED,
LOC_POSITION_MODE_MS_ASSISTED,
LOC_POSITION_MODE_RESERVED_1,
LOC_POSITION_MODE_RESERVED_2,
LOC_POSITION_MODE_RESERVED_3,
LOC_POSITION_MODE_RESERVED_4,
LOC_POSITION_MODE_RESERVED_5
} LocPositionMode;
#define MIN_POSSIBLE_FIX_INTERVAL 1000 /* msec */
/** Flags to indicate which values are valid in a GpsLocationExtended. */
typedef uint16_t GpsLocationExtendedFlags;
/** GpsLocationExtended has valid pdop, hdop, vdop. */
#define GPS_LOCATION_EXTENDED_HAS_DOP 0x0001
/** GpsLocationExtended has valid altitude mean sea level. */
#define GPS_LOCATION_EXTENDED_HAS_ALTITUDE_MEAN_SEA_LEVEL 0x0002
/** UlpLocation has valid magnetic deviation. */
#define GPS_LOCATION_EXTENDED_HAS_MAG_DEV 0x0004
/** UlpLocation has valid mode indicator. */
#define GPS_LOCATION_EXTENDED_HAS_MODE_IND 0x0008
/** GpsLocationExtended has valid vertical uncertainty */
#define GPS_LOCATION_EXTENDED_HAS_VERT_UNC 0x0010
/** GpsLocationExtended has valid speed uncertainty */
#define GPS_LOCATION_EXTENDED_HAS_SPEED_UNC 0x0020
/** Represents gps location extended. */
typedef struct {
/** set to sizeof(GpsLocationExtended) */
size_t size;
/** Contains GpsLocationExtendedFlags bits. */
uint16_t flags;
/** Contains the Altitude wrt mean sea level */
float altitudeMeanSeaLevel;
/** Contains Position Dilusion of Precision. */
float pdop;
/** Contains Horizontal Dilusion of Precision. */
float hdop;
/** Contains Vertical Dilusion of Precision. */
float vdop;
/** Contains Magnetic Deviation. */
float magneticDeviation;
/** vertical uncertainty in meters */
float vert_unc;
/** speed uncertainty in m/s */
float speed_unc;
} GpsLocationExtended;
enum loc_sess_status {
LOC_SESS_SUCCESS,
LOC_SESS_INTERMEDIATE,
LOC_SESS_FAILURE
};
typedef uint32_t LocPosTechMask;
#define LOC_POS_TECH_MASK_DEFAULT ((LocPosTechMask)0x00000000)
#define LOC_POS_TECH_MASK_SATELLITE ((LocPosTechMask)0x00000001)
#define LOC_POS_TECH_MASK_CELLID ((LocPosTechMask)0x00000002)
#define LOC_POS_TECH_MASK_WIFI ((LocPosTechMask)0x00000004)
#define LOC_POS_TECH_MASK_SENSORS ((LocPosTechMask)0x00000008)
#define LOC_POS_TECH_MASK_REFERENCE_LOCATION ((LocPosTechMask)0x00000010)
#define LOC_POS_TECH_MASK_INJECTED_COARSE_POSITION ((LocPosTechMask)0x00000020)
#define LOC_POS_TECH_MASK_AFLT ((LocPosTechMask)0x00000040)
#define LOC_POS_TECH_MASK_HYBRID ((LocPosTechMask)0x00000080)
typedef enum {
LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC = 0,
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM,
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU,
LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON,
LOC_ENG_IF_REQUEST_SENDER_ID_MODEM,
LOC_ENG_IF_REQUEST_SENDER_ID_UNKNOWN
} loc_if_req_sender_id_e_type;
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* GPS_EXTENDED_C_H */

250
core/loc_core_log.cpp Normal file
View file

@ -0,0 +1,250 @@
/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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_NDDEBUG 0
#define LOG_TAG "LocSvc_core_log"
#include <loc_log.h>
#include <log_util.h>
#include <loc_core_log.h>
void LocPosMode::logv() const
{
LOC_LOGV ("Position mode: %s\n Position recurrence: %s\n "
"min interval: %d\n preferred accuracy: %d\n "
"preferred time: %d\n credentials: %s provider: %s",
loc_get_position_mode_name(mode),
loc_get_position_recurrence_name(recurrence),
min_interval,
preferred_accuracy,
preferred_time,
credentials,
provider);
}
/* GPS status names */
static loc_name_val_s_type gps_status_name[] =
{
NAME_VAL( GPS_STATUS_NONE ),
NAME_VAL( GPS_STATUS_SESSION_BEGIN ),
NAME_VAL( GPS_STATUS_SESSION_END ),
NAME_VAL( GPS_STATUS_ENGINE_ON ),
NAME_VAL( GPS_STATUS_ENGINE_OFF ),
};
static int gps_status_num = sizeof(gps_status_name) / sizeof(loc_name_val_s_type);
/* Find Android GPS status name */
const char* loc_get_gps_status_name(GpsStatusValue gps_status)
{
return loc_get_name_from_val(gps_status_name, gps_status_num,
(long) gps_status);
}
static loc_name_val_s_type loc_eng_position_modes[] =
{
NAME_VAL( LOC_POSITION_MODE_STANDALONE ),
NAME_VAL( LOC_POSITION_MODE_MS_BASED ),
NAME_VAL( LOC_POSITION_MODE_MS_ASSISTED ),
NAME_VAL( LOC_POSITION_MODE_RESERVED_1 ),
NAME_VAL( LOC_POSITION_MODE_RESERVED_2 ),
NAME_VAL( LOC_POSITION_MODE_RESERVED_3 ),
NAME_VAL( LOC_POSITION_MODE_RESERVED_4 ),
NAME_VAL( LOC_POSITION_MODE_RESERVED_5 )
};
static int loc_eng_position_mode_num = sizeof(loc_eng_position_modes) / sizeof(loc_name_val_s_type);
const char* loc_get_position_mode_name(GpsPositionMode mode)
{
return loc_get_name_from_val(loc_eng_position_modes, loc_eng_position_mode_num, (long) mode);
}
static loc_name_val_s_type loc_eng_position_recurrences[] =
{
NAME_VAL( GPS_POSITION_RECURRENCE_PERIODIC ),
NAME_VAL( GPS_POSITION_RECURRENCE_SINGLE )
};
static int loc_eng_position_recurrence_num = sizeof(loc_eng_position_recurrences) / sizeof(loc_name_val_s_type);
const char* loc_get_position_recurrence_name(GpsPositionRecurrence recur)
{
return loc_get_name_from_val(loc_eng_position_recurrences, loc_eng_position_recurrence_num, (long) recur);
}
static loc_name_val_s_type loc_eng_aiding_data_bits[] =
{
NAME_VAL( GPS_DELETE_EPHEMERIS ),
NAME_VAL( GPS_DELETE_ALMANAC ),
NAME_VAL( GPS_DELETE_POSITION ),
NAME_VAL( GPS_DELETE_TIME ),
NAME_VAL( GPS_DELETE_IONO ),
NAME_VAL( GPS_DELETE_UTC ),
NAME_VAL( GPS_DELETE_HEALTH ),
NAME_VAL( GPS_DELETE_SVDIR ),
NAME_VAL( GPS_DELETE_SVSTEER ),
NAME_VAL( GPS_DELETE_SADATA ),
NAME_VAL( GPS_DELETE_RTI ),
NAME_VAL( GPS_DELETE_CELLDB_INFO ),
NAME_VAL( GPS_DELETE_ALMANAC_CORR ),
NAME_VAL( GPS_DELETE_FREQ_BIAS_EST ),
NAME_VAL( GPS_DELETE_EPHEMERIS_GLO ),
NAME_VAL( GPS_DELETE_ALMANAC_GLO ),
NAME_VAL( GPS_DELETE_SVDIR_GLO ),
NAME_VAL( GPS_DELETE_SVSTEER_GLO ),
NAME_VAL( GPS_DELETE_ALMANAC_CORR_GLO ),
NAME_VAL( GPS_DELETE_TIME_GPS ),
NAME_VAL( GPS_DELETE_TIME_GLO )
};
static int loc_eng_aiding_data_bit_num = sizeof(loc_eng_aiding_data_bits) / sizeof(loc_name_val_s_type);
const char* loc_get_aiding_data_mask_names(GpsAidingData data)
{
return NULL;
}
static loc_name_val_s_type loc_eng_agps_types[] =
{
NAME_VAL( AGPS_TYPE_INVALID ),
NAME_VAL( AGPS_TYPE_ANY ),
NAME_VAL( AGPS_TYPE_SUPL ),
NAME_VAL( AGPS_TYPE_C2K ),
NAME_VAL( AGPS_TYPE_WWAN_ANY )
};
static int loc_eng_agps_type_num = sizeof(loc_eng_agps_types) / sizeof(loc_name_val_s_type);
const char* loc_get_agps_type_name(AGpsType type)
{
return loc_get_name_from_val(loc_eng_agps_types, loc_eng_agps_type_num, (long) type);
}
static loc_name_val_s_type loc_eng_ni_types[] =
{
NAME_VAL( GPS_NI_TYPE_VOICE ),
NAME_VAL( GPS_NI_TYPE_UMTS_SUPL ),
NAME_VAL( GPS_NI_TYPE_UMTS_CTRL_PLANE )
};
static int loc_eng_ni_type_num = sizeof(loc_eng_ni_types) / sizeof(loc_name_val_s_type);
const char* loc_get_ni_type_name(GpsNiType type)
{
return loc_get_name_from_val(loc_eng_ni_types, loc_eng_ni_type_num, (long) type);
}
static loc_name_val_s_type loc_eng_ni_responses[] =
{
NAME_VAL( GPS_NI_RESPONSE_ACCEPT ),
NAME_VAL( GPS_NI_RESPONSE_DENY ),
NAME_VAL( GPS_NI_RESPONSE_DENY )
};
static int loc_eng_ni_reponse_num = sizeof(loc_eng_ni_responses) / sizeof(loc_name_val_s_type);
const char* loc_get_ni_response_name(GpsUserResponseType response)
{
return loc_get_name_from_val(loc_eng_ni_responses, loc_eng_ni_reponse_num, (long) response);
}
static loc_name_val_s_type loc_eng_ni_encodings[] =
{
NAME_VAL( GPS_ENC_NONE ),
NAME_VAL( GPS_ENC_SUPL_GSM_DEFAULT ),
NAME_VAL( GPS_ENC_SUPL_UTF8 ),
NAME_VAL( GPS_ENC_SUPL_UCS2 ),
NAME_VAL( GPS_ENC_UNKNOWN )
};
static int loc_eng_ni_encoding_num = sizeof(loc_eng_ni_encodings) / sizeof(loc_name_val_s_type);
const char* loc_get_ni_encoding_name(GpsNiEncodingType encoding)
{
return loc_get_name_from_val(loc_eng_ni_encodings, loc_eng_ni_encoding_num, (long) encoding);
}
static loc_name_val_s_type loc_eng_agps_bears[] =
{
NAME_VAL( AGPS_APN_BEARER_INVALID ),
NAME_VAL( AGPS_APN_BEARER_IPV4 ),
NAME_VAL( AGPS_APN_BEARER_IPV4 ),
NAME_VAL( AGPS_APN_BEARER_IPV4V6 )
};
static int loc_eng_agps_bears_num = sizeof(loc_eng_agps_bears) / sizeof(loc_name_val_s_type);
const char* loc_get_agps_bear_name(AGpsBearerType bearer)
{
return loc_get_name_from_val(loc_eng_agps_bears, loc_eng_agps_bears_num, (long) bearer);
}
static loc_name_val_s_type loc_eng_server_types[] =
{
NAME_VAL( LOC_AGPS_CDMA_PDE_SERVER ),
NAME_VAL( LOC_AGPS_CUSTOM_PDE_SERVER ),
NAME_VAL( LOC_AGPS_MPC_SERVER ),
NAME_VAL( LOC_AGPS_SUPL_SERVER )
};
static int loc_eng_server_types_num = sizeof(loc_eng_server_types) / sizeof(loc_name_val_s_type);
const char* loc_get_server_type_name(LocServerType type)
{
return loc_get_name_from_val(loc_eng_server_types, loc_eng_server_types_num, (long) type);
}
static loc_name_val_s_type loc_eng_position_sess_status_types[] =
{
NAME_VAL( LOC_SESS_SUCCESS ),
NAME_VAL( LOC_SESS_INTERMEDIATE ),
NAME_VAL( LOC_SESS_FAILURE )
};
static int loc_eng_position_sess_status_num = sizeof(loc_eng_position_sess_status_types) / sizeof(loc_name_val_s_type);
const char* loc_get_position_sess_status_name(enum loc_sess_status status)
{
return loc_get_name_from_val(loc_eng_position_sess_status_types, loc_eng_position_sess_status_num, (long) status);
}
static loc_name_val_s_type loc_eng_agps_status_names[] =
{
NAME_VAL( GPS_REQUEST_AGPS_DATA_CONN ),
NAME_VAL( GPS_RELEASE_AGPS_DATA_CONN ),
NAME_VAL( GPS_AGPS_DATA_CONNECTED ),
NAME_VAL( GPS_AGPS_DATA_CONN_DONE ),
NAME_VAL( GPS_AGPS_DATA_CONN_FAILED )
};
static int loc_eng_agps_status_num = sizeof(loc_eng_agps_status_names) / sizeof(loc_name_val_s_type);
const char* loc_get_agps_status_name(AGpsStatusValue status)
{
return loc_get_name_from_val(loc_eng_agps_status_names, loc_eng_agps_status_num, (long) status);
}

View file

@ -1,4 +1,4 @@
/* Copyright (c) 2013, The Linux Foundation. All rights reserved. /* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@ -27,58 +27,32 @@
* *
*/ */
#ifndef __LOC_ULP_H__ #ifndef LOC_CORE_LOG_H
#define __LOC_ULP_H__ #define LOC_CORE_LOG_H
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C"
#endif /* __cplusplus */ {
#endif
#include <ctype.h> #include <ctype.h>
#include <stdbool.h> #include <gps_extended.h>
#include <hardware/gps.h>
/** Location has valid source information. */
#define LOCATION_HAS_SOURCE_INFO 0x0020
/** GpsLocation has valid "is indoor?" flag */
#define GPS_LOCATION_HAS_IS_INDOOR 0x0040
/** GpsLocation has valid floor number */
#define GPS_LOCATION_HAS_FLOOR_NUMBER 0x0080
/** GpsLocation has valid map URL*/
#define GPS_LOCATION_HAS_MAP_URL 0x0100
/** GpsLocation has valid map index */
#define GPS_LOCATION_HAS_MAP_INDEX 0x0200
/** Sizes for indoor fields */
#define GPS_LOCATION_MAP_URL_SIZE 400
#define GPS_LOCATION_MAP_INDEX_SIZE 16
/** Position source is ULP */
#define ULP_LOCATION_IS_FROM_HYBRID 0x0001
/** Position source is GNSS only */
#define ULP_LOCATION_IS_FROM_GNSS 0x0002
#define ULP_MIN_INTERVAL_INVALID 0xffffffff
typedef struct {
/** set to sizeof(UlpLocation) */
size_t size;
GpsLocation gpsLocation;
/* Provider indicator for HYBRID or GPS */
uint16_t position_source;
/*allows HAL to pass additional information related to the location */
int rawDataSize; /* in # of bytes */
void * rawData;
bool is_indoor;
float floor_number;
char map_url[GPS_LOCATION_MAP_URL_SIZE];
unsigned char map_index[GPS_LOCATION_MAP_INDEX_SIZE];
} UlpLocation;
const char* loc_get_gps_status_name(GpsStatusValue gps_status);
const char* loc_get_position_mode_name(GpsPositionMode mode);
const char* loc_get_position_recurrence_name(GpsPositionRecurrence recur);
const char* loc_get_aiding_data_mask_names(GpsAidingData data);
const char* loc_get_agps_type_name(AGpsType type);
const char* loc_get_ni_type_name(GpsNiType type);
const char* loc_get_ni_response_name(GpsUserResponseType response);
const char* loc_get_ni_encoding_name(GpsNiEncodingType encoding);
const char* loc_get_agps_bear_name(AGpsBearerType bear);
const char* loc_get_server_type_name(LocServerType type);
const char* loc_get_position_sess_status_name(enum loc_sess_status status);
const char* loc_get_agps_status_name(AGpsStatusValue status);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif
#endif //__LOC_ULP_H__ #endif /* LOC_CORE_LOG_H */

View file

@ -6,8 +6,6 @@ LOCAL_PATH := $(call my-dir)
ifneq ($(TARGET_NO_RPC),true) ifneq ($(TARGET_NO_RPC),true)
GPS_DIR_LIST += $(LOCAL_PATH)/libloc_api-rpc-50001/ GPS_DIR_LIST += $(LOCAL_PATH)/libloc_api-rpc-50001/
GPS_DIR_LIST += $(LOCAL_PATH)/libloc_api-rpc/
GPS_DIR_LIST += $(LOCAL_PATH)/libloc_api/
endif #TARGET_NO_RPC endif #TARGET_NO_RPC

View file

@ -9,7 +9,7 @@ source_files:= \
src/loc_apicb_appinit.c \ src/loc_apicb_appinit.c \
src/loc_api_fixup.c \ src/loc_api_fixup.c \
src/loc_api_log.c \ src/loc_api_log.c \
src/LocApiRpcAdapter.cpp src/LocApiRpc.cpp
LOCAL_SRC_FILES:= $(source_files) LOCAL_SRC_FILES:= $(source_files)
@ -26,7 +26,7 @@ LOCAL_SHARED_LIBRARIES:= \
libcutils \ libcutils \
libcommondefs \ libcommondefs \
libgps.utils \ libgps.utils \
libloc_adapter libloc_core
LOCAL_STATIC_LIBRARIES := \ LOCAL_STATIC_LIBRARIES := \
libloc_api_rpcgen libloc_api_rpcgen
@ -37,20 +37,20 @@ LOCAL_C_INCLUDES:= \
$(LOCAL_PATH) \ $(LOCAL_PATH) \
$(LOCAL_PATH)/rpc_inc \ $(LOCAL_PATH)/rpc_inc \
$(TARGET_OUT_HEADERS)/gps.utils \ $(TARGET_OUT_HEADERS)/gps.utils \
$(TARGET_OUT_HEADERS)/libloc_core \
$(TARGET_OUT_HEADERS)/loc_api/rpcgen/inc \ $(TARGET_OUT_HEADERS)/loc_api/rpcgen/inc \
$(TARGET_OUT_HEADERS)/libcommondefs-rpc \
$(TARGET_OUT_HEADERS)/libcommondefs/rpcgen/inc \ $(TARGET_OUT_HEADERS)/libcommondefs/rpcgen/inc \
$(TARGET_OUT_HEADERS)/librpc \ $(TARGET_OUT_HEADERS)/librpc \
$(TARGET_OUT_HEADERS)/libloc-rpc/rpc_inc \ $(TARGET_OUT_HEADERS)/libloc-rpc/rpc_inc \
$(TARGET_OUT_HEADERS)/libloc_eng \ $(TOP)/hardware/msm7k/librpc
hardware/msm7k/librpc
LOCAL_COPY_HEADERS_TO:= libloc_api-rpc-qc/$(RPC_INC) LOCAL_COPY_HEADERS_TO:= libloc_api-rpc-qc/$(RPC_INC)
LOCAL_COPY_HEADERS:= \ LOCAL_COPY_HEADERS:= \
$(RPC_INC)/loc_api_rpc_glue.h \ $(RPC_INC)/loc_api_rpc_glue.h \
$(RPC_INC)/loc_api_fixup.h \ $(RPC_INC)/loc_api_fixup.h \
$(RPC_INC)/loc_api_sync_call.h \ $(RPC_INC)/loc_api_sync_call.h \
$(RPC_INC)/loc_apicb_appinit.h $(RPC_INC)/loc_apicb_appinit.h \
$(RPC_INC)/LocApiRpc.h
LOCAL_MODULE:= libloc_api-rpc-qc LOCAL_MODULE:= libloc_api-rpc-qc
LOCAL_MODULE_OWNER := qcom LOCAL_MODULE_OWNER := qcom

View file

@ -26,24 +26,30 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
#ifndef LOC_API_RPC_ADAPTER_H #ifndef LOC_API_RPC_H
#define LOC_API_RPC_ADAPTER_H #define LOC_API_RPC_H
#include <rpc/rpc.h> #include <rpc/rpc.h>
#include <loc_api_rpcgen_common_rpc.h>
#include <loc_api_rpc_glue.h> #include <loc_api_rpc_glue.h>
#include <LocApiAdapter.h> #include <LocApiBase.h>
#include <loc_log.h>
using namespace loc_core;
class LocApiRpcAdapter : public LocApiAdapter { class LocApiRpc : public LocApiBase {
// RPC communication establishment // RPC communication establishment
rpc_loc_client_handle_type client_handle; rpc_loc_client_handle_type client_handle;
rpc_loc_event_mask_type eMask;
int dataEnableLastSet; int dataEnableLastSet;
char apnLastSet[MAX_APN_LEN]; char apnLastSet[MAX_APN_LEN];
static const LOC_API_ADAPTER_EVENT_MASK_T maskAll;
static const rpc_loc_event_mask_type locBits[]; static const rpc_loc_event_mask_type locBits[];
static rpc_loc_event_mask_type convertMask(LOC_API_ADAPTER_EVENT_MASK_T mask); static rpc_loc_event_mask_type convertMask(LOC_API_ADAPTER_EVENT_MASK_T mask);
static enum loc_api_adapter_err convertErr(int rpcErr); static enum loc_api_adapter_err convertErr(int rpcErr);
static GpsNiEncodingType convertNiEncodingType(int loc_encoding);
static int NIEventFillVerfiyType(GpsNiNotification &notif,
rpc_loc_ni_notify_verify_e_type notif_priv);
void reportPosition(const rpc_loc_parsed_position_s_type *location_report_ptr); void reportPosition(const rpc_loc_parsed_position_s_type *location_report_ptr);
void reportSv(const rpc_loc_gnss_info_s_type *gnss_report_ptr); void reportSv(const rpc_loc_gnss_info_s_type *gnss_report_ptr);
@ -51,13 +57,16 @@ class LocApiRpcAdapter : public LocApiAdapter {
void reportNmea(const rpc_loc_nmea_report_s_type *nmea_report_ptr); void reportNmea(const rpc_loc_nmea_report_s_type *nmea_report_ptr);
void ATLEvent(const rpc_loc_server_request_s_type *server_request_ptr); void ATLEvent(const rpc_loc_server_request_s_type *server_request_ptr);
void NIEvent(const rpc_loc_ni_event_s_type *ni_req_ptr); void NIEvent(const rpc_loc_ni_event_s_type *ni_req_ptr);
int NIEventFillVerfiyType(GpsNiNotification &notif,
rpc_loc_ni_notify_verify_e_type notif_priv); virtual enum loc_api_adapter_err
GpsNiEncodingType convertNiEncodingType(int loc_encoding); open(LOC_API_ADAPTER_EVENT_MASK_T mask);
virtual enum loc_api_adapter_err
close();
public: public:
LocApiRpcAdapter(LocEng &locEng); LocApiRpc(const MsgTask* msgTask,
~LocApiRpcAdapter(); LOC_API_ADAPTER_EVENT_MASK_T exMask);
~LocApiRpc();
int locEventCB(rpc_loc_client_handle_type client_handle, int locEventCB(rpc_loc_client_handle_type client_handle,
rpc_loc_event_mask_type loc_event, rpc_loc_event_mask_type loc_event,
@ -67,13 +76,11 @@ public:
// RPC adapter interface implementations // RPC adapter interface implementations
virtual enum loc_api_adapter_err virtual enum loc_api_adapter_err
reinit(); startFix(const LocPosMode& posMode);
virtual enum loc_api_adapter_err
startFix();
virtual enum loc_api_adapter_err virtual enum loc_api_adapter_err
stopFix(); stopFix();
virtual enum loc_api_adapter_err virtual enum loc_api_adapter_err
setPositionMode(const LocPosMode *mode); setPositionMode(const LocPosMode& mode);
inline virtual enum loc_api_adapter_err inline virtual enum loc_api_adapter_err
enableData(int enable) { return enableData(enable, false); } enableData(int enable) { return enableData(enable, false); }
virtual enum loc_api_adapter_err virtual enum loc_api_adapter_err
@ -108,4 +115,7 @@ public:
virtual void setInSession(bool inSession); virtual void setInSession(bool inSession);
}; };
#endif //LOC_API_RPC_ADAPTER_H extern "C" LocApiBase* getLocApi(const MsgTask* msgTask,
LOC_API_ADAPTER_EVENT_MASK_T exMask);
#endif //LOC_API_RPC_H

View file

@ -27,24 +27,27 @@
* *
*/ */
#define LOG_NDDEBUG 0 #define LOG_NDDEBUG 0
#define LOG_TAG "LocSvc_adapter" #define LOG_TAG "LocSvc_api_rpc"
#include <unistd.h> #include <unistd.h>
#include <math.h> #include <math.h>
#ifndef USE_GLIB #ifndef USE_GLIB
#include <utils/SystemClock.h> #include <utils/SystemClock.h>
#endif /* USE_GLIB */ #endif /* USE_GLIB */
#include "LocApiRpcAdapter.h" #include <LocApiRpc.h>
#include "loc_api_rpcgen_common_rpc.h" #include <LocAdapterBase.h>
#include "log_util.h" #include <loc_api_fixup.h>
#include "loc_log.h" #include <loc_api_rpc_glue.h>
#include "loc_api_log.h" #include <log_util.h>
#include <loc_log.h>
#include <loc_api_log.h>
#ifdef USE_GLIB #ifdef USE_GLIB
#include <glib.h> #include <glib.h>
#endif #endif
#include "librpc.h" #include <librpc.h>
#include "platform_lib_includes.h" #include <platform_lib_includes.h>
using namespace loc_core;
#define LOC_XTRA_INJECT_DEFAULT_TIMEOUT (3100) #define LOC_XTRA_INJECT_DEFAULT_TIMEOUT (3100)
#define XTRA_BLOCK_SIZE (3072) #define XTRA_BLOCK_SIZE (3072)
@ -77,7 +80,7 @@ static int32 loc_event_cb
{ {
MODEM_LOG_CALLFLOW(%s, loc_get_event_name(loc_event)); MODEM_LOG_CALLFLOW(%s, loc_get_event_name(loc_event));
loc_callback_log(loc_event, loc_event_payload); loc_callback_log(loc_event, loc_event_payload);
int32 ret_val = ((LocApiRpcAdapter*)user)->locEventCB(client_handle, loc_event, loc_event_payload); int32 ret_val = ((LocApiRpc*)user)->locEventCB(client_handle, loc_event, loc_event_payload);
EXIT_LOG(%d, ret_val); EXIT_LOG(%d, ret_val);
return ret_val; return ret_val;
} }
@ -101,17 +104,21 @@ SIDE EFFECTS
static void loc_rpc_global_cb(void* user, CLIENT* clnt, enum rpc_reset_event event) static void loc_rpc_global_cb(void* user, CLIENT* clnt, enum rpc_reset_event event)
{ {
MODEM_LOG_CALLFLOW(%s, loc_get_rpc_reset_event_name(event)); MODEM_LOG_CALLFLOW(%s, loc_get_rpc_reset_event_name(event));
((LocApiRpcAdapter*)user)->locRpcGlobalCB(clnt, event); ((LocApiRpc*)user)->locRpcGlobalCB(clnt, event);
EXIT_LOG(%p, VOID_RET); EXIT_LOG(%p, VOID_RET);
} }
const LOC_API_ADAPTER_EVENT_MASK_T LocApiRpc::maskAll =
LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT |
LOC_API_ADAPTER_BIT_SATELLITE_REPORT |
LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST |
LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST |
LOC_API_ADAPTER_BIT_IOCTL_REPORT |
LOC_API_ADAPTER_BIT_STATUS_REPORT |
LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT |
LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST;
LocApiAdapter* getLocApiAdapter(LocEng &locEng) const rpc_loc_event_mask_type LocApiRpc::locBits[] =
{
return new LocApiRpcAdapter(locEng);
}
const rpc_loc_event_mask_type LocApiRpcAdapter::locBits[] =
{ {
RPC_LOC_EVENT_PARSED_POSITION_REPORT, RPC_LOC_EVENT_PARSED_POSITION_REPORT,
RPC_LOC_EVENT_SATELLITE_REPORT, RPC_LOC_EVENT_SATELLITE_REPORT,
@ -124,27 +131,24 @@ const rpc_loc_event_mask_type LocApiRpcAdapter::locBits[] =
RPC_LOC_EVENT_STATUS_REPORT RPC_LOC_EVENT_STATUS_REPORT
}; };
LocApiRpcAdapter::LocApiRpcAdapter(LocEng &locEng) : // constructor
LocApiAdapter(locEng), LocApiRpc::LocApiRpc(const MsgTask* msgTask,
LOC_API_ADAPTER_EVENT_MASK_T exMask) :
LocApiBase(msgTask, exMask),
client_handle(RPC_LOC_CLIENT_HANDLE_INVALID), client_handle(RPC_LOC_CLIENT_HANDLE_INVALID),
eMask(convertMask(locEng.eventMask)),
dataEnableLastSet(-1) dataEnableLastSet(-1)
{ {
memset(apnLastSet, 0, sizeof(apnLastSet)); memset(apnLastSet, 0, sizeof(apnLastSet));
loc_api_glue_init(); loc_api_glue_init();
} }
LocApiRpcAdapter::~LocApiRpcAdapter() LocApiRpc::~LocApiRpc()
{ {
if (RPC_LOC_CLIENT_HANDLE_INVALID != client_handle) { close();
loc_clear(client_handle);
}
loc_close(client_handle);
} }
rpc_loc_event_mask_type rpc_loc_event_mask_type
LocApiRpcAdapter::convertMask(LOC_API_ADAPTER_EVENT_MASK_T mask) LocApiRpc::convertMask(LOC_API_ADAPTER_EVENT_MASK_T mask)
{ {
rpc_loc_event_mask_type newMask = 0; rpc_loc_event_mask_type newMask = 0;
@ -159,7 +163,7 @@ LocApiRpcAdapter::convertMask(LOC_API_ADAPTER_EVENT_MASK_T mask)
} }
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::convertErr(int rpcErr) LocApiRpc::convertErr(int rpcErr)
{ {
switch(rpcErr) switch(rpcErr)
{ {
@ -188,7 +192,7 @@ LocApiRpcAdapter::convertErr(int rpcErr)
} }
} }
void LocApiRpcAdapter::locRpcGlobalCB(CLIENT* clnt, enum rpc_reset_event event) void LocApiRpc::locRpcGlobalCB(CLIENT* clnt, enum rpc_reset_event event)
{ {
static rpc_loc_engine_state_e_type last_state = RPC_LOC_ENGINE_STATE_MAX; static rpc_loc_engine_state_e_type last_state = RPC_LOC_ENGINE_STATE_MAX;
@ -208,12 +212,10 @@ void LocApiRpcAdapter::locRpcGlobalCB(CLIENT* clnt, enum rpc_reset_event event)
} }
} }
int32 LocApiRpcAdapter::locEventCB(rpc_loc_client_handle_type client_handle, int32 LocApiRpc::locEventCB(rpc_loc_client_handle_type client_handle,
rpc_loc_event_mask_type loc_event, rpc_loc_event_mask_type loc_event,
const rpc_loc_event_payload_u_type* loc_event_payload) const rpc_loc_event_payload_u_type* loc_event_payload)
{ {
locEngHandle.acquireWakelock();
// Parsed report // Parsed report
if (loc_event & RPC_LOC_EVENT_PARSED_POSITION_REPORT) if (loc_event & RPC_LOC_EVENT_PARSED_POSITION_REPORT)
{ {
@ -269,60 +271,89 @@ int32 LocApiRpcAdapter::locEventCB(rpc_loc_client_handle_type client_handle,
NIEvent(&loc_event_payload->rpc_loc_event_payload_u_type_u.ni_request); NIEvent(&loc_event_payload->rpc_loc_event_payload_u_type_u.ni_request);
} }
locEngHandle.releaseWakeLock();
return RPC_LOC_API_SUCCESS;//We simply want to return sucess here as we do not want to return RPC_LOC_API_SUCCESS;//We simply want to return sucess here as we do not want to
// cause any issues in RPC thread context // cause any issues in RPC thread context
} }
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::reinit() LocApiRpc::open(LOC_API_ADAPTER_EVENT_MASK_T mask)
{ {
enum loc_api_adapter_err ret_val = LOC_API_ADAPTER_ERR_SUCCESS; enum loc_api_adapter_err ret_val = LOC_API_ADAPTER_ERR_SUCCESS;
// RPC does not dynamically update the event mask. And in the
// case of RPC, all we support are positioning (gps + agps)
// masks anyways, so we simply mask all of them on always.
// After doing so the first time in a power cycle, we know there
// will the following if condition will never be true any more.
mask = maskAll;
if (mask != mMask) {
if (RPC_LOC_CLIENT_HANDLE_INVALID != client_handle) { if (RPC_LOC_CLIENT_HANDLE_INVALID != client_handle) {
loc_clear(client_handle); close();
} }
client_handle = loc_open(eMask, loc_event_cb, loc_rpc_global_cb, this); mMask = mask;
// it is important to cap the mask here, because not all LocApi's
// can enable the same bits, e.g. foreground and bckground.
client_handle = loc_open(convertMask(mask),
loc_event_cb,
loc_rpc_global_cb, this);
if (client_handle < 0) { if (client_handle < 0) {
mMask = 0;
client_handle = RPC_LOC_CLIENT_HANDLE_INVALID;
ret_val = LOC_API_ADAPTER_ERR_INVALID_HANDLE; ret_val = LOC_API_ADAPTER_ERR_INVALID_HANDLE;
} }
}
return ret_val; return ret_val;
} }
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::startFix() { LocApiRpc::close()
LOC_LOGD("LocApiRpcAdapter::startFix() called"); {
if (RPC_LOC_CLIENT_HANDLE_INVALID != client_handle) {
loc_clear(client_handle);
}
loc_close(client_handle);
mMask = 0;
client_handle = RPC_LOC_CLIENT_HANDLE_INVALID;
return LOC_API_ADAPTER_ERR_SUCCESS;
}
enum loc_api_adapter_err
LocApiRpc::startFix(const LocPosMode& posMode) {
LOC_LOGD("LocApiRpc::startFix() called");
return convertErr( return convertErr(
loc_start_fix(client_handle) loc_start_fix(client_handle)
); );
} }
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::stopFix() { LocApiRpc::stopFix() {
LOC_LOGD("LocApiRpcAdapter::stopFix() called"); LOC_LOGD("LocApiRpc::stopFix() called");
return convertErr( return convertErr(
loc_stop_fix(client_handle) loc_stop_fix(client_handle)
); );
} }
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::setPositionMode(const LocPosMode *posMode) LocApiRpc::setPositionMode(const LocPosMode& posMode)
{ {
rpc_loc_ioctl_data_u_type ioctl_data; rpc_loc_ioctl_data_u_type ioctl_data;
rpc_loc_fix_criteria_s_type *fix_criteria_ptr; rpc_loc_fix_criteria_s_type *fix_criteria_ptr =
&ioctl_data.rpc_loc_ioctl_data_u_type_u.fix_criteria;
rpc_loc_ioctl_e_type ioctl_type = RPC_LOC_IOCTL_SET_FIX_CRITERIA; rpc_loc_ioctl_e_type ioctl_type = RPC_LOC_IOCTL_SET_FIX_CRITERIA;
rpc_loc_operation_mode_e_type op_mode; rpc_loc_operation_mode_e_type op_mode;
int ret_val; int ret_val;
const LocPosMode* fixCriteria = &posMode;
if (NULL != posMode)
fixCriteria = *posMode;
ALOGD ("loc_eng_set_position mode, client = %d, interval = %d, mode = %d\n", ALOGD ("loc_eng_set_position mode, client = %d, interval = %d, mode = %d\n",
(int32) client_handle, fixCriteria.min_interval, fixCriteria.mode); (int32) client_handle, fixCriteria->min_interval, fixCriteria->mode);
switch (fixCriteria.mode) switch (fixCriteria->mode)
{ {
case LOC_POSITION_MODE_MS_BASED: case LOC_POSITION_MODE_MS_BASED:
op_mode = RPC_LOC_OPER_MODE_MSB; op_mode = RPC_LOC_OPER_MODE_MSB;
@ -348,25 +379,24 @@ LocApiRpcAdapter::setPositionMode(const LocPosMode *posMode)
op_mode = RPC_LOC_OPER_MODE_STANDALONE; op_mode = RPC_LOC_OPER_MODE_STANDALONE;
} }
fix_criteria_ptr = &ioctl_data.rpc_loc_ioctl_data_u_type_u.fix_criteria;
fix_criteria_ptr->valid_mask = RPC_LOC_FIX_CRIT_VALID_PREFERRED_OPERATION_MODE | fix_criteria_ptr->valid_mask = RPC_LOC_FIX_CRIT_VALID_PREFERRED_OPERATION_MODE |
RPC_LOC_FIX_CRIT_VALID_RECURRENCE_TYPE; RPC_LOC_FIX_CRIT_VALID_RECURRENCE_TYPE;
fix_criteria_ptr->min_interval = fixCriteria.min_interval; fix_criteria_ptr->min_interval = fixCriteria->min_interval;
fix_criteria_ptr->preferred_operation_mode = op_mode; fix_criteria_ptr->preferred_operation_mode = op_mode;
fix_criteria_ptr->min_interval = fixCriteria.min_interval; fix_criteria_ptr->min_interval = fixCriteria->min_interval;
fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_MIN_INTERVAL; fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_MIN_INTERVAL;
if (fixCriteria.preferred_accuracy > 0) { if (fixCriteria->preferred_accuracy > 0) {
fix_criteria_ptr->preferred_accuracy = fixCriteria.preferred_accuracy; fix_criteria_ptr->preferred_accuracy = fixCriteria->preferred_accuracy;
fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_PREFERRED_ACCURACY; fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_PREFERRED_ACCURACY;
} }
if (fixCriteria.preferred_time > 0) { if (fixCriteria->preferred_time > 0) {
fix_criteria_ptr->preferred_response_time = fixCriteria.preferred_time; fix_criteria_ptr->preferred_response_time = fixCriteria->preferred_time;
fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_PREFERRED_RESPONSE_TIME; fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_PREFERRED_RESPONSE_TIME;
} }
switch (fixCriteria.recurrence) { switch (fixCriteria->recurrence) {
case GPS_POSITION_RECURRENCE_SINGLE: case GPS_POSITION_RECURRENCE_SINGLE:
fix_criteria_ptr->recurrence_type = RPC_LOC_SINGLE_FIX; fix_criteria_ptr->recurrence_type = RPC_LOC_SINGLE_FIX;
break; break;
@ -387,7 +417,7 @@ LocApiRpcAdapter::setPositionMode(const LocPosMode *posMode)
} }
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::setTime(GpsUtcTime time, int64_t timeReference, int uncertainty) LocApiRpc::setTime(GpsUtcTime time, int64_t timeReference, int uncertainty)
{ {
rpc_loc_ioctl_data_u_type ioctl_data; rpc_loc_ioctl_data_u_type ioctl_data;
rpc_loc_assist_data_time_s_type *time_info_ptr; rpc_loc_assist_data_time_s_type *time_info_ptr;
@ -413,7 +443,7 @@ LocApiRpcAdapter::setTime(GpsUtcTime time, int64_t timeReference, int uncertaint
} }
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::injectPosition(double latitude, double longitude, float accuracy) LocApiRpc::injectPosition(double latitude, double longitude, float accuracy)
{ {
/* IOCTL data */ /* IOCTL data */
rpc_loc_ioctl_data_u_type ioctl_data; rpc_loc_ioctl_data_u_type ioctl_data;
@ -452,7 +482,7 @@ LocApiRpcAdapter::injectPosition(double latitude, double longitude, float accura
} }
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::informNiResponse(GpsUserResponseType userResponse, LocApiRpc::informNiResponse(GpsUserResponseType userResponse,
const void* passThroughData) const void* passThroughData)
{ {
rpc_loc_ioctl_data_u_type data; rpc_loc_ioctl_data_u_type data;
@ -489,7 +519,7 @@ LocApiRpcAdapter::informNiResponse(GpsUserResponseType userResponse,
} }
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::setAPN(char* apn, int len, boolean force) LocApiRpc::setAPN(char* apn, int len, boolean force)
{ {
enum loc_api_adapter_err rtv = LOC_API_ADAPTER_ERR_SUCCESS; enum loc_api_adapter_err rtv = LOC_API_ADAPTER_ERR_SUCCESS;
int size = sizeof(apnLastSet); int size = sizeof(apnLastSet);
@ -500,7 +530,7 @@ LocApiRpcAdapter::setAPN(char* apn, int len, boolean force)
} }
memcpy(apnLastSet, apn, size); memcpy(apnLastSet, apn, size);
if (false == navigating) { if (!isInSession()) {
rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_LBS_APN_PROFILE, {0}}; rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_LBS_APN_PROFILE, {0}};
ioctl_data.rpc_loc_ioctl_data_u_type_u.apn_profiles[0].srv_system_type = LOC_APN_PROFILE_SRV_SYS_MAX; ioctl_data.rpc_loc_ioctl_data_u_type_u.apn_profiles[0].srv_system_type = LOC_APN_PROFILE_SRV_SYS_MAX;
ioctl_data.rpc_loc_ioctl_data_u_type_u.apn_profiles[0].pdp_type = LOC_APN_PROFILE_PDN_TYPE_IPV4; ioctl_data.rpc_loc_ioctl_data_u_type_u.apn_profiles[0].pdp_type = LOC_APN_PROFILE_PDN_TYPE_IPV4;
@ -518,17 +548,16 @@ LocApiRpcAdapter::setAPN(char* apn, int len, boolean force)
return rtv; return rtv;
} }
void LocApiRpcAdapter::setInSession(bool inSession) void LocApiRpc::setInSession(bool inSession)
{ {
LocApiAdapter::setInSession(inSession); if (!inSession) {
if (false == navigating) {
enableData(dataEnableLastSet, true); enableData(dataEnableLastSet, true);
setAPN(apnLastSet, sizeof(apnLastSet)-1, true); setAPN(apnLastSet, sizeof(apnLastSet)-1, true);
} }
} }
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::setServer(const char* url, int len) LocApiRpc::setServer(const char* url, int len)
{ {
rpc_loc_ioctl_data_u_type ioctl_data; rpc_loc_ioctl_data_u_type ioctl_data;
rpc_loc_server_info_s_type *server_info_ptr; rpc_loc_server_info_s_type *server_info_ptr;
@ -559,7 +588,7 @@ LocApiRpcAdapter::setServer(const char* url, int len)
} }
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::setServer(unsigned int ip, int port, LocServerType type) LocApiRpc::setServer(unsigned int ip, int port, LocServerType type)
{ {
rpc_loc_ioctl_data_u_type ioctl_data; rpc_loc_ioctl_data_u_type ioctl_data;
rpc_loc_server_info_s_type *server_info_ptr; rpc_loc_server_info_s_type *server_info_ptr;
@ -594,13 +623,13 @@ LocApiRpcAdapter::setServer(unsigned int ip, int port, LocServerType type)
} }
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::enableData(int enable, boolean force) LocApiRpc::enableData(int enable, boolean force)
{ {
enum loc_api_adapter_err rtv = LOC_API_ADAPTER_ERR_SUCCESS; enum loc_api_adapter_err rtv = LOC_API_ADAPTER_ERR_SUCCESS;
if (force || dataEnableLastSet != enable) { if (force || dataEnableLastSet != enable) {
dataEnableLastSet = enable; dataEnableLastSet = enable;
if (false == navigating) { if (!isInSession()) {
rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_DATA_ENABLE, {0}}; rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_DATA_ENABLE, {0}};
ioctl_data.rpc_loc_ioctl_data_u_type_u.data_enable = enable; ioctl_data.rpc_loc_ioctl_data_u_type_u.data_enable = enable;
@ -617,7 +646,7 @@ LocApiRpcAdapter::enableData(int enable, boolean force)
} }
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::deleteAidingData(GpsAidingData bits) LocApiRpc::deleteAidingData(GpsAidingData bits)
{ {
rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_DELETE_ASSIST_DATA, {0}}; rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_DELETE_ASSIST_DATA, {0}};
ioctl_data.rpc_loc_ioctl_data_u_type_u.assist_data_delete.type = bits; ioctl_data.rpc_loc_ioctl_data_u_type_u.assist_data_delete.type = bits;
@ -631,7 +660,7 @@ LocApiRpcAdapter::deleteAidingData(GpsAidingData bits)
); );
} }
void LocApiRpcAdapter::reportPosition(const rpc_loc_parsed_position_s_type *location_report_ptr) void LocApiRpc::reportPosition(const rpc_loc_parsed_position_s_type *location_report_ptr)
{ {
LocPosTechMask tech_Mask = LOC_POS_TECH_MASK_DEFAULT; LocPosTechMask tech_Mask = LOC_POS_TECH_MASK_DEFAULT;
@ -723,30 +752,36 @@ void LocApiRpcAdapter::reportPosition(const rpc_loc_parsed_position_s_type *loca
} }
LOC_LOGV("reportPosition: fire callback\n"); LOC_LOGV("reportPosition: fire callback\n");
LocApiAdapter::reportPosition(location, enum loc_sess_status fixStatus =
(location_report_ptr->session_status
== RPC_LOC_SESS_STATUS_IN_PROGESS ?
LOC_SESS_INTERMEDIATE : LOC_SESS_SUCCESS);
LocApiBase::reportPosition(location,
locationExtended, locationExtended,
locEngHandle.extPosInfo((void*)location_report_ptr), (void*)location_report_ptr,
(location_report_ptr->session_status == RPC_LOC_SESS_STATUS_IN_PROGESS ? fixStatus,
LOC_SESS_INTERMEDIATE : LOC_SESS_SUCCESS),
tech_Mask); tech_Mask);
} }
} }
else else
{ {
LocApiAdapter::reportPosition(location, LocApiBase::reportPosition(location,
locationExtended, locationExtended,
NULL, NULL,
LOC_SESS_FAILURE); LOC_SESS_FAILURE);
LOC_LOGV("loc_eng_report_position: ignore position report when session status = %d\n", location_report_ptr->session_status); LOC_LOGV("loc_eng_report_position: ignore position report "
"when session status = %d\n",
location_report_ptr->session_status);
} }
} }
else else
{ {
LOC_LOGV("loc_eng_report_position: ignore position report when session status is not set\n"); LOC_LOGV("loc_eng_report_position: ignore position report "
"when session status is not set\n");
} }
} }
void LocApiRpcAdapter::reportSv(const rpc_loc_gnss_info_s_type *gnss_report_ptr) void LocApiRpc::reportSv(const rpc_loc_gnss_info_s_type *gnss_report_ptr)
{ {
GpsSvStatus SvStatus = {0}; GpsSvStatus SvStatus = {0};
GpsLocationExtended locationExtended = {0}; GpsLocationExtended locationExtended = {0};
@ -846,51 +881,52 @@ void LocApiRpcAdapter::reportSv(const rpc_loc_gnss_info_s_type *gnss_report_ptr)
if (SvStatus.num_svs >= 0) if (SvStatus.num_svs >= 0)
{ {
LocApiAdapter::reportSv(SvStatus, LocApiBase::reportSv(SvStatus,
locationExtended, locationExtended,
locEngHandle.extSvInfo((void*)gnss_report_ptr)); (void*)gnss_report_ptr);
} }
} }
void LocApiRpcAdapter::reportStatus(const rpc_loc_status_event_s_type *status_report_ptr) void LocApiRpc::reportStatus(const rpc_loc_status_event_s_type *status_report_ptr)
{ {
if (status_report_ptr->event == RPC_LOC_STATUS_EVENT_ENGINE_STATE) { if (status_report_ptr->event == RPC_LOC_STATUS_EVENT_ENGINE_STATE) {
if (status_report_ptr->payload.rpc_loc_status_event_payload_u_type_u.engine_state == RPC_LOC_ENGINE_STATE_ON) if (status_report_ptr->payload.rpc_loc_status_event_payload_u_type_u.engine_state == RPC_LOC_ENGINE_STATE_ON)
{ {
LocApiAdapter::reportStatus(GPS_STATUS_ENGINE_ON); LocApiBase::reportStatus(GPS_STATUS_ENGINE_ON);
LocApiAdapter::reportStatus(GPS_STATUS_SESSION_BEGIN); LocApiBase::reportStatus(GPS_STATUS_SESSION_BEGIN);
} }
else if (status_report_ptr->payload.rpc_loc_status_event_payload_u_type_u.engine_state == RPC_LOC_ENGINE_STATE_OFF) else if (status_report_ptr->payload.rpc_loc_status_event_payload_u_type_u.engine_state == RPC_LOC_ENGINE_STATE_OFF)
{ {
LocApiAdapter::reportStatus(GPS_STATUS_SESSION_END); LocApiBase::reportStatus(GPS_STATUS_SESSION_END);
LocApiAdapter::reportStatus(GPS_STATUS_ENGINE_OFF); LocApiBase::reportStatus(GPS_STATUS_ENGINE_OFF);
} }
else else
{ {
LocApiAdapter::reportStatus(GPS_STATUS_NONE); LocApiBase::reportStatus(GPS_STATUS_NONE);
} }
} }
} }
void LocApiRpcAdapter::reportNmea(const rpc_loc_nmea_report_s_type *nmea_report_ptr) void LocApiRpc::reportNmea(const rpc_loc_nmea_report_s_type *nmea_report_ptr)
{ {
#if (AMSS_VERSION==3200) #if (AMSS_VERSION==3200)
LocApiAdapter::reportNmea(nmea_report_ptr->nmea_sentences.nmea_sentences_val, LocApiBase::reportNmea(nmea_report_ptr->nmea_sentences.nmea_sentences_val,
nmea_report_ptr->nmea_sentences.nmea_sentences_len); nmea_report_ptr->nmea_sentences.nmea_sentences_len);
#else #else
LocApiAdapter::reportNmea(nmea_report_ptr->nmea_sentences, LocApiBase::reportNmea(nmea_report_ptr->nmea_sentences,
nmea_report_ptr->length); nmea_report_ptr->length);
LOC_LOGD("loc_eng_report_nmea: $%c%c%c\n", LOC_LOGD("loc_eng_report_nmea: $%c%c%c\n",
nmea_report_ptr->nmea_sentences[3], nmea_report_ptr->nmea_sentences[4], nmea_report_ptr->nmea_sentences[3],
nmea_report_ptr->nmea_sentences[4],
nmea_report_ptr->nmea_sentences[5]); nmea_report_ptr->nmea_sentences[5]);
#endif /* #if (AMSS_VERSION==3200) */ #endif /* #if (AMSS_VERSION==3200) */
} }
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::setXtraData(char* data, int length) LocApiRpc::setXtraData(char* data, int length)
{ {
int rpc_ret_val = RPC_LOC_API_GENERAL_FAILURE; int rpc_ret_val = RPC_LOC_API_GENERAL_FAILURE;
int total_parts; int total_parts;
@ -968,7 +1004,7 @@ LocApiRpcAdapter::setXtraData(char* data, int length)
/* Request the Xtra Server Url from the modem */ /* Request the Xtra Server Url from the modem */
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::requestXtraServer() LocApiRpc::requestXtraServer()
{ {
loc_api_adapter_err err; loc_api_adapter_err err;
rpc_loc_ioctl_data_u_type data; rpc_loc_ioctl_data_u_type data;
@ -1001,16 +1037,19 @@ LocApiRpcAdapter::requestXtraServer()
return LOC_API_ADAPTER_ERR_GENERAL_FAILURE; return LOC_API_ADAPTER_ERR_GENERAL_FAILURE;
} }
LocApiAdapter::reportXtraServer(callback_data.data.rpc_loc_ioctl_callback_data_u_type_u.predicted_orbits_data_source.servers[0], reportXtraServer(callback_data.data.rpc_loc_ioctl_callback_data_u_type_u.
callback_data.data.rpc_loc_ioctl_callback_data_u_type_u.predicted_orbits_data_source.servers[1], predicted_orbits_data_source.servers[0],
callback_data.data.rpc_loc_ioctl_callback_data_u_type_u.predicted_orbits_data_source.servers[2], callback_data.data.rpc_loc_ioctl_callback_data_u_type_u.
predicted_orbits_data_source.servers[1],
callback_data.data.rpc_loc_ioctl_callback_data_u_type_u.
predicted_orbits_data_source.servers[2],
255); 255);
return LOC_API_ADAPTER_ERR_SUCCESS; return LOC_API_ADAPTER_ERR_SUCCESS;
} }
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::atlOpenStatus(int handle, int is_succ, char* apn, AGpsBearerType bearer, AGpsType agpsType) LocApiRpc::atlOpenStatus(int handle, int is_succ, char* apn, AGpsBearerType bearer, AGpsType agpsType)
{ {
rpc_loc_server_open_status_e_type open_status = is_succ ? RPC_LOC_SERVER_OPEN_SUCCESS : RPC_LOC_SERVER_OPEN_FAIL; rpc_loc_server_open_status_e_type open_status = is_succ ? RPC_LOC_SERVER_OPEN_SUCCESS : RPC_LOC_SERVER_OPEN_FAIL;
rpc_loc_ioctl_data_u_type ioctl_data; rpc_loc_ioctl_data_u_type ioctl_data;
@ -1084,7 +1123,7 @@ LocApiRpcAdapter::atlOpenStatus(int handle, int is_succ, char* apn, AGpsBearerTy
} }
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::atlCloseStatus(int handle, int is_succ) LocApiRpc::atlCloseStatus(int handle, int is_succ)
{ {
rpc_loc_ioctl_data_u_type ioctl_data; rpc_loc_ioctl_data_u_type ioctl_data;
ioctl_data.disc = RPC_LOC_IOCTL_INFORM_SERVER_CLOSE_STATUS; ioctl_data.disc = RPC_LOC_IOCTL_INFORM_SERVER_CLOSE_STATUS;
@ -1104,7 +1143,7 @@ LocApiRpcAdapter::atlCloseStatus(int handle, int is_succ)
); );
} }
void LocApiRpcAdapter::ATLEvent(const rpc_loc_server_request_s_type *server_request_ptr) void LocApiRpc::ATLEvent(const rpc_loc_server_request_s_type *server_request_ptr)
{ {
int connHandle; int connHandle;
AGpsType agps_type; AGpsType agps_type;
@ -1140,7 +1179,7 @@ void LocApiRpcAdapter::ATLEvent(const rpc_loc_server_request_s_type *server_requ
} }
} }
void LocApiRpcAdapter::NIEvent(const rpc_loc_ni_event_s_type *ni_req) void LocApiRpc::NIEvent(const rpc_loc_ni_event_s_type *ni_req)
{ {
GpsNiNotification notif = {0}; GpsNiNotification notif = {0};
@ -1203,7 +1242,7 @@ void LocApiRpcAdapter::NIEvent(const rpc_loc_ni_event_s_type *ni_req)
#endif /* #if (AMSS_VERSION==3200) */ #endif /* #if (AMSS_VERSION==3200) */
char lcs_addr[32]; // Decoded LCS address for UMTS CP NI char lcs_addr[32]; // Decoded LCS address for UMTS CP NI
addr_len = LocApiAdapter::decodeAddress(lcs_addr, sizeof lcs_addr, address_source, addr_len = decodeAddress(lcs_addr, sizeof lcs_addr, address_source,
umts_cp_req->ext_client_address_data.ext_client_address_len); umts_cp_req->ext_client_address_data.ext_client_address_len);
// The address is ASCII string // The address is ASCII string
@ -1283,10 +1322,10 @@ void LocApiRpcAdapter::NIEvent(const rpc_loc_ni_event_s_type *ni_req)
// this copy will get freed in loc_eng_ni when loc_ni_respond() is called // this copy will get freed in loc_eng_ni when loc_ni_respond() is called
rpc_loc_ni_event_s_type *copy = (rpc_loc_ni_event_s_type *)malloc(sizeof(*copy)); rpc_loc_ni_event_s_type *copy = (rpc_loc_ni_event_s_type *)malloc(sizeof(*copy));
memcpy(copy, ni_req, sizeof(*copy)); memcpy(copy, ni_req, sizeof(*copy));
LocApiAdapter::requestNiNotify(notif, (const void*)copy); requestNiNotify(notif, (const void*)copy);
} }
int LocApiRpcAdapter::NIEventFillVerfiyType(GpsNiNotification &notif, int LocApiRpc::NIEventFillVerfiyType(GpsNiNotification &notif,
rpc_loc_ni_notify_verify_e_type notif_priv) rpc_loc_ni_notify_verify_e_type notif_priv)
{ {
switch (notif_priv) switch (notif_priv)
@ -1317,7 +1356,7 @@ int LocApiRpcAdapter::NIEventFillVerfiyType(GpsNiNotification &notif,
} }
enum loc_api_adapter_err enum loc_api_adapter_err
LocApiRpcAdapter::setSUPLVersion(uint32_t version) LocApiRpc::setSUPLVersion(uint32_t version)
{ {
rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_SUPL_VERSION, {0}}; rpc_loc_ioctl_data_u_type ioctl_data = {RPC_LOC_IOCTL_SET_SUPL_VERSION, {0}};
ioctl_data.rpc_loc_ioctl_data_u_type_u.supl_version = (int)version; ioctl_data.rpc_loc_ioctl_data_u_type_u.supl_version = (int)version;
@ -1330,7 +1369,7 @@ LocApiRpcAdapter::setSUPLVersion(uint32_t version)
); );
} }
GpsNiEncodingType LocApiRpcAdapter::convertNiEncodingType(int loc_encoding) GpsNiEncodingType LocApiRpc::convertNiEncodingType(int loc_encoding)
{ {
switch (loc_encoding) switch (loc_encoding)
{ {
@ -1346,3 +1385,8 @@ GpsNiEncodingType LocApiRpcAdapter::convertNiEncodingType(int loc_encoding)
return GPS_ENC_UNKNOWN; return GPS_ENC_UNKNOWN;
} }
} }
LocApiBase* getLocApi(const MsgTask* msgTask,
LOC_API_ADAPTER_EVENT_MASK_T exMask) {
return new LocApiRpc(msgTask, exMask);
}

View file

@ -5,7 +5,7 @@ LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := libloc_adapter LOCAL_MODULE := libloc_eng
LOCAL_MODULE_OWNER := qcom LOCAL_MODULE_OWNER := qcom
LOCAL_MODULE_TAGS := optional LOCAL_MODULE_TAGS := optional
@ -13,51 +13,9 @@ LOCAL_MODULE_TAGS := optional
LOCAL_SHARED_LIBRARIES := \ LOCAL_SHARED_LIBRARIES := \
libutils \ libutils \
libcutils \ libcutils \
libdl \
liblog \ liblog \
libgps.utils \ libloc_core \
libdl
LOCAL_SRC_FILES += \
loc_eng_log.cpp \
LocApiAdapter.cpp
LOCAL_CFLAGS += \
-fno-short-enums \
-D_ANDROID_
LOCAL_C_INCLUDES:= \
$(TARGET_OUT_HEADERS)/gps.utils \
hardware/qcom/gps/loc_api/libloc_api_50001
LOCAL_COPY_HEADERS_TO:= libloc_eng/
LOCAL_COPY_HEADERS:= \
LocApiAdapter.h \
loc.h \
gps_extended.h \
loc_eng.h \
loc_eng_xtra.h \
loc_eng_ni.h \
loc_eng_agps.h \
loc_eng_msg.h \
loc_eng_msg_id.h \
loc_eng_log.h \
loc_ulp.h
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libloc_eng
LOCAL_MODULE_TAGS := optional
LOCAL_SHARED_LIBRARIES := \
libutils \
libcutils \
liblog \
libloc_adapter \
libgps.utils libgps.utils
LOCAL_SRC_FILES += \ LOCAL_SRC_FILES += \
@ -66,7 +24,8 @@ LOCAL_SRC_FILES += \
loc_eng_xtra.cpp \ loc_eng_xtra.cpp \
loc_eng_ni.cpp \ loc_eng_ni.cpp \
loc_eng_log.cpp \ loc_eng_log.cpp \
loc_eng_nmea.cpp loc_eng_nmea.cpp \
LocEngAdapter.cpp
LOCAL_SRC_FILES += \ LOCAL_SRC_FILES += \
loc_eng_dmn_conn.cpp \ loc_eng_dmn_conn.cpp \
@ -81,8 +40,22 @@ LOCAL_CFLAGS += \
LOCAL_C_INCLUDES:= \ LOCAL_C_INCLUDES:= \
$(TARGET_OUT_HEADERS)/gps.utils \ $(TARGET_OUT_HEADERS)/gps.utils \
$(TARGET_OUT_HEADERS)/libloc_core \
hardware/qcom/gps/loc_api/libloc_api_50001 \
hardware/qcom/gps/loc_api/ulp/inc hardware/qcom/gps/loc_api/ulp/inc
LOCAL_COPY_HEADERS_TO:= libloc_eng/
LOCAL_COPY_HEADERS:= \
LocEngAdapter.h \
loc.h \
loc_eng.h \
loc_eng_xtra.h \
loc_eng_ni.h \
loc_eng_agps.h \
loc_eng_msg.h \
loc_eng_msg_id.h \
loc_eng_log.h
LOCAL_PRELINK_MODULE := false LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY) include $(BUILD_SHARED_LIBRARY)
@ -90,6 +63,7 @@ include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := gps.$(BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE) LOCAL_MODULE := gps.$(BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE)
LOCAL_MODULE_OWNER := qcom
LOCAL_MODULE_TAGS := optional LOCAL_MODULE_TAGS := optional
@ -100,6 +74,7 @@ LOCAL_SHARED_LIBRARIES := \
libcutils \ libcutils \
liblog \ liblog \
libloc_eng \ libloc_eng \
libloc_core \
libgps.utils \ libgps.utils \
libdl \ libdl \
libandroid_runtime libandroid_runtime
@ -119,6 +94,7 @@ endif
## Includes ## Includes
LOCAL_C_INCLUDES:= \ LOCAL_C_INCLUDES:= \
$(TARGET_OUT_HEADERS)/gps.utils \ $(TARGET_OUT_HEADERS)/gps.utils \
$(TARGET_OUT_HEADERS)/libloc_core \
hardware/qcom/gps/loc_api/ulp/inc hardware/qcom/gps/loc_api/ulp/inc
LOCAL_PRELINK_MODULE := false LOCAL_PRELINK_MODULE := false

View file

@ -1,269 +0,0 @@
/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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_NDDEBUG 0
#define LOG_TAG "LocSvc_adapter"
#include <dlfcn.h>
#include <LocApiAdapter.h>
#include "loc_eng_msg.h"
#include "loc_log.h"
#include "loc_eng_ni.h"
static void* noProc(void* data)
{
return NULL;
}
LocEng::LocEng(void* caller,
LOC_API_ADAPTER_EVENT_MASK_T emask,
gps_acquire_wakelock acqwl,
gps_release_wakelock relwl,
loc_msg_sender msgSender,
loc_msg_sender msgUlpSender,
loc_ext_parser posParser,
loc_ext_parser svParser) :
owner(caller),
eventMask(emask), acquireWakelock(acqwl),
releaseWakeLock(relwl), sendMsge(msgSender),
sendUlpMsg(msgUlpSender),
extPosInfo(NULL == posParser ? noProc : posParser),
extSvInfo(NULL == svParser ? noProc : svParser)
{
LOC_LOGV("LocEng constructor %p, %p", posParser, svParser);
}
LocApiAdapter::LocApiAdapter(LocEng &locEng) :
locEngHandle(locEng), fixCriteria(), navigating(false)
{
LOC_LOGD("LocApiAdapter created");
}
LocApiAdapter::~LocApiAdapter()
{
LOC_LOGV("LocApiAdapter deleted");
}
LocApiAdapter* LocApiAdapter::getLocApiAdapter(LocEng &locEng)
{
void* handle;
LocApiAdapter* adapter = NULL;
handle = dlopen ("libloc_api_v02.so", RTLD_NOW);
if (!handle) {
handle = dlopen ("libloc_api-rpc-qc.so", RTLD_NOW);
}
if (!handle) {
adapter = new LocApiAdapter(locEng);
} else {
getLocApiAdapter_t* getHandle = (getLocApiAdapter_t*)dlsym(handle, "getLocApiAdapter");
adapter = (*getHandle)(locEng);
}
return adapter;
}
int LocApiAdapter::hexcode(char *hexstring, int string_size,
const char *data, int data_size)
{
int i;
for (i = 0; i < data_size; i++)
{
char ch = data[i];
if (i*2 + 3 <= string_size)
{
snprintf(&hexstring[i*2], 3, "%02X", ch);
}
else {
break;
}
}
return i;
}
int LocApiAdapter::decodeAddress(char *addr_string, int string_size,
const char *data, int data_size)
{
const char addr_prefix = 0x91;
int i, idxOutput = 0;
if (!data || !addr_string) { return 0; }
if (data[0] != addr_prefix)
{
LOC_LOGW("decodeAddress: address prefix is not 0x%x but 0x%x", addr_prefix, data[0]);
addr_string[0] = '\0';
return 0; // prefix not correct
}
for (i = 1; i < data_size; i++)
{
unsigned char ch = data[i], low = ch & 0x0F, hi = ch >> 4;
if (low <= 9 && idxOutput < string_size - 1) { addr_string[idxOutput++] = low + '0'; }
if (hi <= 9 && idxOutput < string_size - 1) { addr_string[idxOutput++] = hi + '0'; }
}
addr_string[idxOutput] = '\0'; // Terminates the string
return idxOutput;
}
void LocApiAdapter::reportPosition(UlpLocation &location,
GpsLocationExtended &locationExtended,
void* locationExt,
enum loc_sess_status status,
LocPosTechMask loc_technology_mask )
{
loc_eng_msg_report_position *msg(new loc_eng_msg_report_position(locEngHandle.owner,
location,
locationExtended,
locationExt,
status,
loc_technology_mask));
if (locEngHandle.sendUlpMsg) {
locEngHandle.sendUlpMsg(locEngHandle.owner, msg);
} else {
locEngHandle.sendMsge(locEngHandle.owner, msg);
}
}
void LocApiAdapter::reportSv(GpsSvStatus &svStatus, GpsLocationExtended &locationExtended, void* svExt)
{
loc_eng_msg_report_sv *msg(new loc_eng_msg_report_sv(locEngHandle.owner, svStatus, locationExtended, svExt));
//We want to send SV info to ULP to help it in determining GNSS signal strength
//ULP will forward the SV reports to HAL without any modifications
if (locEngHandle.sendUlpMsg) {
locEngHandle.sendUlpMsg(locEngHandle.owner, msg);
} else {
locEngHandle.sendMsge(locEngHandle.owner, msg);
}
}
void LocApiAdapter::reportStatus(GpsStatusValue status)
{
loc_eng_msg_report_status *msg(new loc_eng_msg_report_status(locEngHandle.owner, status));
locEngHandle.sendMsge(locEngHandle.owner, msg);
}
void LocApiAdapter::reportNmea(const char* nmea, int length)
{
loc_eng_msg_report_nmea *msg(new loc_eng_msg_report_nmea(locEngHandle.owner, nmea, length));
locEngHandle.sendMsge(locEngHandle.owner, msg);
}
void LocApiAdapter::reportXtraServer(const char* url1, const char* url2, const char* url3, const int maxlength)
{
loc_eng_msg_report_xtra_server *msg(new loc_eng_msg_report_xtra_server(locEngHandle.owner, url1, url2, url3, maxlength));
locEngHandle.sendMsge(locEngHandle.owner, msg);
}
void LocApiAdapter::requestATL(int connHandle, AGpsType agps_type)
{
loc_eng_msg_request_atl *msg(new loc_eng_msg_request_atl(locEngHandle.owner, connHandle, agps_type));
locEngHandle.sendMsge(locEngHandle.owner, msg);
}
void LocApiAdapter::requestSuplES(int connHandle)
{
loc_eng_msg_request_supl_es *msg(new loc_eng_msg_request_supl_es(locEngHandle.owner, connHandle));
locEngHandle.sendMsge(locEngHandle.owner, msg);
}
void LocApiAdapter::releaseDataHandle(void)
{
loc_eng_msg_close_data_call *msg(new loc_eng_msg_close_data_call(locEngHandle.owner));
locEngHandle.sendMsge(locEngHandle.owner, msg);
}
void LocApiAdapter::releaseATL(int connHandle)
{
loc_eng_msg_release_atl *msg(new loc_eng_msg_release_atl(locEngHandle.owner, connHandle));
locEngHandle.sendMsge(locEngHandle.owner, msg);
}
void LocApiAdapter::requestXtraData()
{
LOC_LOGD("XTRA download request");
loc_eng_msg *msg(new loc_eng_msg(locEngHandle.owner, LOC_ENG_MSG_REQUEST_XTRA_DATA));
locEngHandle.sendMsge(locEngHandle.owner, msg);
}
void LocApiAdapter::requestTime()
{
LOC_LOGD("loc_event_cb: XTRA time download request");
loc_eng_msg *msg(new loc_eng_msg(locEngHandle.owner, LOC_ENG_MSG_REQUEST_TIME));
locEngHandle.sendMsge(locEngHandle.owner, msg);
}
void LocApiAdapter::requestLocation()
{
LOC_LOGD("loc_event_cb: XTRA time download request... not supported");
// loc_eng_msg *msg(new loc_eng_msg(locEngHandle.owner, LOC_ENG_MSG_REQUEST_POSITION));
// locEngHandle.sendMsge(locEngHandle.owner, msg);
}
void LocApiAdapter::requestNiNotify(GpsNiNotification &notif, const void* data)
{
notif.size = sizeof(notif);
notif.timeout = LOC_NI_NO_RESPONSE_TIME;
loc_eng_msg_request_ni *msg(new loc_eng_msg_request_ni(locEngHandle.owner, notif, data));
locEngHandle.sendMsge(locEngHandle.owner, msg);
}
void LocApiAdapter::handleEngineDownEvent()
{
loc_eng_msg *msg(new loc_eng_msg(locEngHandle.owner, LOC_ENG_MSG_ENGINE_DOWN));
locEngHandle.sendMsge(locEngHandle.owner, msg);
}
void LocApiAdapter::handleEngineUpEvent()
{
loc_eng_msg *msg(new loc_eng_msg(locEngHandle.owner, LOC_ENG_MSG_ENGINE_UP));
locEngHandle.sendMsge(locEngHandle.owner, msg);
}
void LocApiAdapter::reportDataCallOpened()
{
loc_eng_msg_atl_open_success *msg(new loc_eng_msg_atl_open_success(locEngHandle.owner,
AGPS_TYPE_INVALID,
NULL, 0, 0));
locEngHandle.sendMsge(locEngHandle.owner, msg);
}
void LocApiAdapter::reportDataCallClosed()
{
loc_eng_msg_atl_closed *msg(new loc_eng_msg_atl_closed(locEngHandle.owner,
AGPS_TYPE_INVALID));
locEngHandle.sendMsge(locEngHandle.owner, msg);
}

View file

@ -1,250 +0,0 @@
/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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_H
#define LOC_API_ADAPTER_H
#include <ctype.h>
#include <hardware/gps.h>
#include <loc.h>
#include <loc_eng_log.h>
#include <log_util.h>
#include <loc_eng_msg.h>
#include "platform_lib_includes.h"
#define MAX_APN_LEN 100
#define MAX_URL_LEN 256
#define smaller_of(a, b) (((a) > (b)) ? (b) : (a))
enum loc_api_adapter_err {
LOC_API_ADAPTER_ERR_SUCCESS = 0,
LOC_API_ADAPTER_ERR_GENERAL_FAILURE = 1,
LOC_API_ADAPTER_ERR_UNSUPPORTED = 2,
LOC_API_ADAPTER_ERR_INVALID_HANDLE = 4,
LOC_API_ADAPTER_ERR_INVALID_PARAMETER = 5,
LOC_API_ADAPTER_ERR_ENGINE_BUSY = 6,
LOC_API_ADAPTER_ERR_PHONE_OFFLINE = 7,
LOC_API_ADAPTER_ERR_TIMEOUT = 8,
LOC_API_ADAPTER_ERR_SERVICE_NOT_PRESENT = 9,
LOC_API_ADAPTER_ERR_ENGINE_DOWN = 100,
LOC_API_ADAPTER_ERR_FAILURE,
LOC_API_ADAPTER_ERR_UNKNOWN
};
enum loc_api_adapter_event_index {
LOC_API_ADAPTER_REPORT_POSITION = 0, // Position report comes in loc_parsed_position_s_type
LOC_API_ADAPTER_REPORT_SATELLITE, // Satellite in view report
LOC_API_ADAPTER_REPORT_NMEA_1HZ, // NMEA report at 1HZ rate
LOC_API_ADAPTER_REPORT_NMEA_POSITION, // NMEA report at position report rate
LOC_API_ADAPTER_REQUEST_NI_NOTIFY_VERIFY, // NI notification/verification request
LOC_API_ADAPTER_REQUEST_ASSISTANCE_DATA, // Assistance data, eg: time, predicted orbits request
LOC_API_ADAPTER_REQUEST_LOCATION_SERVER, // Request for location server
LOC_API_ADAPTER_REPORT_IOCTL, // Callback report for loc_ioctl
LOC_API_ADAPTER_REPORT_STATUS, // Misc status report: eg, engine state
LOC_API_ADAPTER_EVENT_MAX
};
#define LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT (1<<LOC_API_ADAPTER_REPORT_POSITION)
#define LOC_API_ADAPTER_BIT_SATELLITE_REPORT (1<<LOC_API_ADAPTER_REPORT_SATELLITE)
#define LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT (1<<LOC_API_ADAPTER_REPORT_NMEA_1HZ)
#define LOC_API_ADAPTER_BIT_NMEA_POSITION_REPORT (1<<LOC_API_ADAPTER_REPORT_NMEA_POSITION)
#define LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST (1<<LOC_API_ADAPTER_REQUEST_NI_NOTIFY_VERIFY)
#define LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST (1<<LOC_API_ADAPTER_REQUEST_ASSISTANCE_DATA)
#define LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST (1<<LOC_API_ADAPTER_REQUEST_LOCATION_SERVER)
#define LOC_API_ADAPTER_BIT_IOCTL_REPORT (1<<LOC_API_ADAPTER_REPORT_IOCTL)
#define LOC_API_ADAPTER_BIT_STATUS_REPORT (1<<LOC_API_ADAPTER_REPORT_STATUS)
typedef unsigned int LOC_API_ADAPTER_EVENT_MASK_T;
typedef void (*loc_msg_sender)(void* loc_eng_data_p, void* msgp);
struct LocEng {
void* owner;
LOC_API_ADAPTER_EVENT_MASK_T eventMask;
const gps_acquire_wakelock acquireWakelock;
const gps_release_wakelock releaseWakeLock;
const loc_msg_sender sendMsge;
const loc_msg_sender sendUlpMsg;
const loc_ext_parser extPosInfo;
const loc_ext_parser extSvInfo;
LocEng(void* caller,
LOC_API_ADAPTER_EVENT_MASK_T emask,
gps_acquire_wakelock acqwl,
gps_release_wakelock relwl,
loc_msg_sender msgSender,
loc_msg_sender msgUlpSender,
loc_ext_parser posParser,
loc_ext_parser svParser);
};
class LocApiAdapter {
protected:
const LocEng locEngHandle;
LocPosMode fixCriteria;
bool navigating;
LocApiAdapter(LocEng &locEng);
public:
//LocApiAdapter(int q, reportCb_t[LOC_API_ADAPTER_EVENT_MAX] callbackTable);
virtual ~LocApiAdapter();
static LocApiAdapter* getLocApiAdapter(LocEng &locEng);
static int hexcode(char *hexstring, int string_size,
const char *data, int data_size);
static int decodeAddress(char *addr_string, int string_size,
const char *data, int data_size);
void reportPosition(UlpLocation &location,
GpsLocationExtended &locationExtended,
void* locationExt,
enum loc_sess_status status,
LocPosTechMask loc_technology_mask = LOC_POS_TECH_MASK_DEFAULT);
void reportSv(GpsSvStatus &svStatus,
GpsLocationExtended &locationExtended,
void* svExt);
void reportStatus(GpsStatusValue status);
void reportNmea(const char* nmea, int length);
void reportXtraServer(const char* url1, const char* url2, const char* url3, const int maxlength);
void reportAgpsStatus(AGpsStatus &agpsStatus);
void requestXtraData();
void requestTime();
void requestLocation();
void requestATL(int connHandle, AGpsType agps_type);
void releaseATL(int connHandle);
void requestNiNotify(GpsNiNotification &notify, const void* data);
void handleEngineDownEvent();
void handleEngineUpEvent();
void requestSuplES(int connHandle);
void releaseDataHandle(void);
void reportDataCallOpened(void);
void reportDataCallClosed(void);
// All below functions are to be defined by adapter specific modules:
// RPC, QMI, etc. The default implementation is empty.
inline virtual enum loc_api_adapter_err
reinit()
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
startFix()
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
stopFix()
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
deleteAidingData(GpsAidingData f)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
enableData(int enable)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
setAPN(char* apn, int len)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
injectPosition(double latitude, double longitude, float accuracy)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
setTime(GpsUtcTime time, int64_t timeReference, int uncertainty)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
setXtraData(char* data, int length)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
requestXtraServer()
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
atlOpenStatus(int handle, int is_succ, char* apn, AGpsBearerType bear, AGpsType agpsType)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
atlCloseStatus(int handle, int is_succ)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
setPositionMode(const LocPosMode *posMode)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
setServer(const char* url, int len)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
setServer(unsigned int ip, int port,
LocServerType type)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
informNiResponse(GpsUserResponseType userResponse, const void* passThroughData)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
setSUPLVersion(uint32_t version)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
setLPPConfig(uint32_t profile)
{LOC_LOGW("%s: default implementation invoked", __func__);
return LOC_API_ADAPTER_ERR_SUCCESS; }
inline virtual enum loc_api_adapter_err
setSensorControlConfig(int sensorUsage)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
setSensorProperties(bool gyroBiasVarianceRandomWalk_valid, float gyroBiasVarianceRandomWalk,
bool accelBiasVarianceRandomWalk_valid, float accelBiasVarianceRandomWalk,
bool angleBiasVarianceRandomWalk_valid, float angleBiasVarianceRandomWalk,
bool rateBiasVarianceRandomWalk_valid, float rateBiasVarianceRandomWalk,
bool velocityBiasVarianceRandomWalk_valid, float velocityBiasVarianceRandomWalk)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
setSensorPerfControlConfig(int controlMode, int accelSamplesPerBatch, int accelBatchesPerSec,
int gyroSamplesPerBatch, int gyroBatchesPerSec,
int accelSamplesPerBatchHigh, int accelBatchesPerSecHigh,
int gyroSamplesPerBatchHigh, int gyroBatchesPerSecHigh, int algorithmConfig)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
setExtPowerConfig(int isBatteryCharging)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline virtual enum loc_api_adapter_err
setAGLONASSProtocol(unsigned long aGlonassProtocol)
{LOC_LOGW("%s: default implementation invoked", __func__); return LOC_API_ADAPTER_ERR_SUCCESS;}
inline const LocPosMode& getPositionMode() const {return fixCriteria;}
inline bool isInSession() { return navigating; }
inline virtual void setInSession(bool inSession) { navigating = inSession; }
inline virtual int openAndStartDataCall()
{LOC_LOGW("%s: default implementation invoked", __func__); return -1;}
inline virtual void stopDataCall()
{LOC_LOGW("%s: default implementation invoked", __func__);}
inline virtual void closeDataCall()
{LOC_LOGW("%s: default implementation invoked", __func__);}
inline virtual int initDataServiceClient()
{LOC_LOGW("%s: default implementation invoked", __func__); return -1;}
};
extern "C" LocApiAdapter* getLocApiAdapter(LocEng &locEng);
typedef LocApiAdapter* (getLocApiAdapter_t)(LocEng&);
#endif //LOC_API_RPC_ADAPTER_H

View file

@ -0,0 +1,207 @@
/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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_NDDEBUG 0
#define LOG_TAG "LocSvc_EngAdapter"
#include <LocEngAdapter.h>
#include "loc_eng_msg.h"
#include "loc_log.h"
using namespace loc_core;
LocEngAdapter::LocEngAdapter(LOC_API_ADAPTER_EVENT_MASK_T mask,
void* owner, loc_msg_sender msgSender,
MsgTask::tCreate tCreator) :
LocAdapterBase(mask,
LocDualContext::getLocFgContext(
tCreator,
LocDualContext::mLocationHalName)),
mOwner(owner), mSendUlpMsg(msgSender), mNavigating(false),
mAgpsEnabled(loc_core::LocDualContext::hasAgpsExt())
{
memset(&mFixCriteria, 0, sizeof(mFixCriteria));
LOC_LOGD("LocEngAdapter created");
}
inline
LocEngAdapter::~LocEngAdapter()
{
LOC_LOGV("LocEngAdapter deleted");
}
void LocEngAdapter::reportPosition(UlpLocation &location,
GpsLocationExtended &locationExtended,
void* locationExt,
enum loc_sess_status status,
LocPosTechMask loc_technology_mask )
{
if (mSendUlpMsg) {
loc_eng_msg_report_position *msg(
new loc_eng_msg_report_position(mOwner,
location,
locationExtended,
locationExt,
status,
loc_technology_mask));
mSendUlpMsg(mOwner, msg);
} else {
sendMsg(new LocEngReportPosition(mOwner,
location,
locationExtended,
locationExt,
status,
loc_technology_mask));
}
}
void LocEngAdapter::reportSv(GpsSvStatus &svStatus,
GpsLocationExtended &locationExtended,
void* svExt)
{
// We want to send SV info to ULP to help it in determining GNSS
// signal strength ULP will forward the SV reports to HAL without
// any modifications
if (mSendUlpMsg) {
loc_eng_msg_report_sv *msg(
new loc_eng_msg_report_sv(mOwner, svStatus,
locationExtended, svExt));
mSendUlpMsg(mOwner, msg);
} else {
sendMsg(new LocEngReportSv(mOwner, svStatus,
locationExtended, svExt));
}
}
inline
void LocEngAdapter::reportStatus(GpsStatusValue status)
{
sendMsg(new LocEngReportStatus(mOwner, status));
}
inline
void LocEngAdapter::reportNmea(const char* nmea, int length)
{
sendMsg(new LocEngReportNmea(mOwner, nmea, length));
}
inline
bool LocEngAdapter::reportXtraServer(const char* url1,
const char* url2,
const char* url3,
const int maxlength)
{
if (mAgpsEnabled) {
sendMsg(new LocEngReportXtraServer(mOwner, url1,
url2, url3, maxlength));
}
return mAgpsEnabled;
}
inline
bool LocEngAdapter::requestATL(int connHandle, AGpsType agps_type)
{
if (mAgpsEnabled) {
sendMsg(new LocEngRequestATL(mOwner,
connHandle, agps_type));
}
return mAgpsEnabled;
}
inline
bool LocEngAdapter::releaseATL(int connHandle)
{
if (mAgpsEnabled) {
sendMsg(new LocEngReleaseATL(mOwner, connHandle));
}
return mAgpsEnabled;
}
inline
bool LocEngAdapter::requestXtraData()
{
if (mAgpsEnabled) {
sendMsg(new LocEngRequestXtra(mOwner));
}
return mAgpsEnabled;
}
inline
bool LocEngAdapter::requestTime()
{
if (mAgpsEnabled) {
sendMsg(new LocEngRequestXtra(mOwner));
}
return mAgpsEnabled;
}
inline
bool LocEngAdapter::requestNiNotify(GpsNiNotification &notif, const void* data)
{
if (mAgpsEnabled) {
notif.size = sizeof(notif);
notif.timeout = LOC_NI_NO_RESPONSE_TIME;
sendMsg(new LocEngRequestNi(mOwner, notif, data));
}
return mAgpsEnabled;
}
inline
bool LocEngAdapter::requestSuplES(int connHandle)
{
sendMsg(new LocEngRequestSuplEs(mOwner, connHandle));
return true;
}
inline
bool LocEngAdapter::reportDataCallOpened()
{
sendMsg(new LocEngSuplEsOpened(mOwner));
return true;
}
inline
bool LocEngAdapter::reportDataCallClosed()
{
sendMsg(new LocEngSuplEsClosed(mOwner));
return true;
}
inline
void LocEngAdapter::handleEngineDownEvent()
{
sendMsg(new LocEngDown(mOwner));
}
inline
void LocEngAdapter::handleEngineUpEvent()
{
sendMsg(new LocEngUp(mOwner));
}

View file

@ -0,0 +1,238 @@
/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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_ENG_ADAPTER_H
#define LOC_API_ENG_ADAPTER_H
#include <ctype.h>
#include <hardware/gps.h>
#include <loc.h>
#include <loc_eng_log.h>
#include <log_util.h>
#include <LocAdapterBase.h>
#include <LocDualContext.h>
#include <platform_lib_includes.h>
#define MAX_URL_LEN 256
using namespace loc_core;
typedef void (*loc_msg_sender)(void* loc_eng_data_p, void* msgp);
class LocEngAdapter : public LocAdapterBase {
void* mOwner;
loc_msg_sender mSendUlpMsg;
LocPosMode mFixCriteria;
bool mNavigating;
public:
const bool mAgpsEnabled;
LocEngAdapter(LOC_API_ADAPTER_EVENT_MASK_T mask,
void* owner, loc_msg_sender msgSender,
MsgTask::tCreate tCreator);
virtual ~LocEngAdapter();
inline enum loc_api_adapter_err
startFix()
{
return mLocApi->startFix(mFixCriteria);
}
inline enum loc_api_adapter_err
stopFix()
{
return mLocApi->stopFix();
}
inline enum loc_api_adapter_err
deleteAidingData(GpsAidingData f)
{
return mLocApi->deleteAidingData(f);
}
inline enum loc_api_adapter_err
enableData(int enable)
{
return mLocApi->enableData(enable);
}
inline enum loc_api_adapter_err
setAPN(char* apn, int len)
{
return mLocApi->setAPN(apn, len);
}
inline enum loc_api_adapter_err
injectPosition(double latitude, double longitude, float accuracy)
{
return mLocApi->injectPosition(latitude, longitude, accuracy);
}
inline enum loc_api_adapter_err
setTime(GpsUtcTime time, int64_t timeReference, int uncertainty)
{
return mLocApi->setTime(time, timeReference, uncertainty);
}
inline enum loc_api_adapter_err
setXtraData(char* data, int length)
{
return mLocApi->setXtraData(data, length);
}
inline enum loc_api_adapter_err
requestXtraServer()
{
return mLocApi->requestXtraServer();
}
inline enum loc_api_adapter_err
atlOpenStatus(int handle, int is_succ, char* apn, AGpsBearerType bearer, AGpsType agpsType)
{
return mLocApi->atlOpenStatus(handle, is_succ, apn, bearer, agpsType);
}
inline enum loc_api_adapter_err
atlCloseStatus(int handle, int is_succ)
{
return mLocApi->atlCloseStatus(handle, is_succ);
}
inline enum loc_api_adapter_err
setPositionMode(const LocPosMode *posMode)
{
if (NULL != posMode) {
mFixCriteria = *posMode;
}
return mLocApi->setPositionMode(mFixCriteria);
}
inline enum loc_api_adapter_err
setServer(const char* url, int len)
{
return mLocApi->setServer(url, len);
}
inline enum loc_api_adapter_err
setServer(unsigned int ip, int port,
LocServerType type)
{
return mLocApi->setServer(ip, port, type);
}
inline enum loc_api_adapter_err
informNiResponse(GpsUserResponseType userResponse, const void* passThroughData)
{
return mLocApi->informNiResponse(userResponse, passThroughData);
}
inline enum loc_api_adapter_err
setSUPLVersion(uint32_t version)
{
return mLocApi->setSUPLVersion(version);
}
inline enum loc_api_adapter_err
setLPPConfig(uint32_t profile)
{
return mLocApi->setLPPConfig(profile);
}
inline enum loc_api_adapter_err
setSensorControlConfig(int sensorUsage)
{
return mLocApi->setSensorControlConfig(sensorUsage);
}
inline enum loc_api_adapter_err
setSensorProperties(bool gyroBiasVarianceRandomWalk_valid, float gyroBiasVarianceRandomWalk,
bool accelBiasVarianceRandomWalk_valid, float accelBiasVarianceRandomWalk,
bool angleBiasVarianceRandomWalk_valid, float angleBiasVarianceRandomWalk,
bool rateBiasVarianceRandomWalk_valid, float rateBiasVarianceRandomWalk,
bool velocityBiasVarianceRandomWalk_valid, float velocityBiasVarianceRandomWalk)
{
return mLocApi->setSensorProperties(gyroBiasVarianceRandomWalk_valid, gyroBiasVarianceRandomWalk,
accelBiasVarianceRandomWalk_valid, accelBiasVarianceRandomWalk,
angleBiasVarianceRandomWalk_valid, angleBiasVarianceRandomWalk,
rateBiasVarianceRandomWalk_valid, rateBiasVarianceRandomWalk,
velocityBiasVarianceRandomWalk_valid, velocityBiasVarianceRandomWalk);
}
inline virtual enum loc_api_adapter_err
setSensorPerfControlConfig(int controlMode, int accelSamplesPerBatch, int accelBatchesPerSec,
int gyroSamplesPerBatch, int gyroBatchesPerSec,
int accelSamplesPerBatchHigh, int accelBatchesPerSecHigh,
int gyroSamplesPerBatchHigh, int gyroBatchesPerSecHigh, int algorithmConfig)
{
return mLocApi->setSensorPerfControlConfig(controlMode, accelSamplesPerBatch, accelBatchesPerSec,
gyroSamplesPerBatch, gyroBatchesPerSec,
accelSamplesPerBatchHigh, accelBatchesPerSecHigh,
gyroSamplesPerBatchHigh, gyroBatchesPerSecHigh,
algorithmConfig);
}
inline virtual enum loc_api_adapter_err
setExtPowerConfig(int isBatteryCharging)
{
return mLocApi->setExtPowerConfig(isBatteryCharging);
}
inline virtual enum loc_api_adapter_err
setAGLONASSProtocol(unsigned long aGlonassProtocol)
{
return mLocApi->setAGLONASSProtocol(aGlonassProtocol);
}
inline virtual int initDataServiceClient()
{
return mLocApi->initDataServiceClient();
}
inline virtual int openAndStartDataCall()
{
return mLocApi->openAndStartDataCall();
}
inline virtual void stopDataCall()
{
mLocApi->stopDataCall();
}
inline virtual void closeDataCall()
{
mLocApi->closeDataCall();
}
virtual void handleEngineDownEvent();
virtual void handleEngineUpEvent();
virtual void reportPosition(UlpLocation &location,
GpsLocationExtended &locationExtended,
void* locationExt,
enum loc_sess_status status,
LocPosTechMask loc_technology_mask);
virtual void reportSv(GpsSvStatus &svStatus,
GpsLocationExtended &locationExtended,
void* svExt);
virtual void reportStatus(GpsStatusValue status);
virtual void reportNmea(const char* nmea, int length);
virtual bool reportXtraServer(const char* url1, const char* url2,
const char* url3, const int maxlength);
virtual bool requestXtraData();
virtual bool requestTime();
virtual bool requestATL(int connHandle, AGpsType agps_type);
virtual bool releaseATL(int connHandle);
virtual bool requestNiNotify(GpsNiNotification &notify, const void* data);
virtual bool requestSuplES(int connHandle);
virtual bool reportDataCallOpened();
virtual bool reportDataCallClosed();
inline const LocPosMode& getPositionMode() const
{return mFixCriteria;}
inline virtual bool isInSession()
{ return mNavigating; }
inline void setInSession(bool inSession)
{ mNavigating = inSession; mLocApi->setInSession(inSession); }
};
#endif //LOC_API_ENG_ADAPTER_H

View file

@ -5,7 +5,7 @@ AM_CFLAGS = \
-fno-short-enums \ -fno-short-enums \
-DFEATURE_GNSS_BIT_API -DFEATURE_GNSS_BIT_API
libloc_adapter_so_la_SOURCES = loc_eng_log.cpp LocApiAdapter.cpp libloc_adapter_so_la_SOURCES = loc_eng_log.cpp LocEngAdapter.cpp
if USE_GLIB if USE_GLIB
libloc_adapter_so_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@ libloc_adapter_so_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@
@ -62,7 +62,7 @@ endif
libgps_default_so_la_LIBADD = -lstdc++ -lcutils ../../utils/libgps_utils_so.la -ldl libloc_eng_so.la libgps_default_so_la_LIBADD = -lstdc++ -lcutils ../../utils/libgps_utils_so.la -ldl libloc_eng_so.la
library_include_HEADERS = \ library_include_HEADERS = \
LocApiAdapter.h \ LocEngAdapter.h \
loc.h \ loc.h \
loc_eng.h \ loc_eng.h \
loc_eng_xtra.h \ loc_eng_xtra.h \

View file

@ -1,111 +0,0 @@
/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
*
* Not a Contribution.
*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef GPS_EXTENDED_H
#define GPS_EXTENDED_H
/** AGPS type */
typedef int16_t AGpsExtType;
#define AGPS_TYPE_INVALID -1
#define AGPS_TYPE_ANY 0
#define AGPS_TYPE_SUPL 1
#define AGPS_TYPE_C2K 2
#define AGPS_TYPE_WWAN_ANY 3
#define AGPS_TYPE_WIFI 4
/** SSID length */
#define SSID_BUF_SIZE (32+1)
typedef int16_t AGpsBearerType;
#define AGPS_APN_BEARER_INVALID -1
#define AGPS_APN_BEARER_IPV4 0
#define AGPS_APN_BEARER_IPV6 1
#define AGPS_APN_BEARER_IPV4V6 2
#define GPS_DELETE_ALMANAC_CORR 0x00001000
#define GPS_DELETE_FREQ_BIAS_EST 0x00002000
#define GPS_DELETE_EPHEMERIS_GLO 0x00004000
#define GPS_DELETE_ALMANAC_GLO 0x00008000
#define GPS_DELETE_SVDIR_GLO 0x00010000
#define GPS_DELETE_SVSTEER_GLO 0x00020000
#define GPS_DELETE_ALMANAC_CORR_GLO 0x00040000
#define GPS_DELETE_TIME_GPS 0x00080000
#define GPS_DELETE_TIME_GLO 0x00100000
/** GPS extended callback structure. */
typedef struct {
/** set to sizeof(GpsCallbacks) */
size_t size;
gps_set_capabilities set_capabilities_cb;
gps_acquire_wakelock acquire_wakelock_cb;
gps_release_wakelock release_wakelock_cb;
gps_create_thread create_thread_cb;
gps_request_utc_time request_utc_time_cb;
} GpsExtCallbacks;
/** Callback to report the xtra server url to the client.
* The client should use this url when downloading xtra unless overwritten
* in the gps.conf file
*/
typedef void (* report_xtra_server)(const char*, const char*, const char*);
/** Callback structure for the XTRA interface. */
typedef struct {
gps_xtra_download_request download_request_cb;
gps_create_thread create_thread_cb;
report_xtra_server report_xtra_server_cb;
} GpsXtraExtCallbacks;
/** Represents the status of AGPS. */
typedef struct {
/** set to sizeof(AGpsExtStatus) */
size_t size;
AGpsExtType type;
AGpsStatusValue status;
uint32_t ipv4_addr;
char ipv6_addr[16];
char ssid[SSID_BUF_SIZE];
char password[SSID_BUF_SIZE];
} AGpsExtStatus;
/** Callback with AGPS status information.
* Can only be called from a thread created by create_thread_cb.
*/
typedef void (* agps_status_extended)(AGpsExtStatus* status);
/** Callback structure for the AGPS interface. */
typedef struct {
agps_status_extended status_cb;
gps_create_thread create_thread_cb;
} AGpsExtCallbacks;
/** GPS NI callback structure. */
typedef struct
{
/**
* Sends the notification request from HAL to GPSLocationProvider.
*/
gps_ni_notify_callback notify_cb;
gps_create_thread create_thread_cb;
} GpsNiExtCallbacks;
#endif /* GPS_EXTENDED_H */

View file

@ -31,7 +31,7 @@
#define LOG_TAG "LocSvc_afw" #define LOG_TAG "LocSvc_afw"
#include <hardware/gps.h> #include <hardware/gps.h>
#include <loc_ulp.h> #include <gps_extended.h>
#include <loc_eng.h> #include <loc_eng.h>
#include <loc_target.h> #include <loc_target.h>
#include <loc_log.h> #include <loc_log.h>
@ -43,9 +43,16 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
#include <errno.h> #include <errno.h>
#include <android_runtime/AndroidRuntime.h> #include <LocDualContext.h>
#include <loc_eng_msg.h>
#include <cutils/properties.h> #include <cutils/properties.h>
namespace android {
namespace AndroidRuntime {
void* createJavaThread(const char* name, void (*start)(void *), void* arg);
}
}
//Globals defns //Globals defns
static const ulpInterface * loc_eng_ulp_inf = NULL; static const ulpInterface * loc_eng_ulp_inf = NULL;
static const ulpInterface * loc_eng_get_ulp_inf(void); static const ulpInterface * loc_eng_get_ulp_inf(void);
@ -206,7 +213,7 @@ const GpsInterface* gps_get_hardware_interface ()
extern "C" const GpsInterface* get_gps_interface() extern "C" const GpsInterface* get_gps_interface()
{ {
unsigned int target = TARGET_DEFAULT; unsigned int target = TARGET_DEFAULT;
if (NULL == loc_afw_data.context) { if (NULL == loc_afw_data.adapter) {
loc_eng_read_config(); loc_eng_read_config();
//We load up libulp module at this point itself //We load up libulp module at this point itself
@ -245,8 +252,8 @@ static void loc_free_msg(void* msg)
void loc_ulp_msg_sender(void* loc_eng_data_p, void* msg) void loc_ulp_msg_sender(void* loc_eng_data_p, void* msg)
{ {
LocEngContext* loc_eng_context = (LocEngContext*)((loc_eng_data_s_type*)loc_eng_data_p)->context; loc_eng_data_s_type* loc_eng = (loc_eng_data_s_type*)loc_eng_data_p;
msg_q_snd((void*)loc_eng_context->ulp_q, msg, loc_free_msg); msg_q_snd(loc_eng->ulp_q, msg, loc_free_msg);
} }
/*=========================================================================== /*===========================================================================
@ -270,17 +277,16 @@ static int loc_hal_init(void)
{ {
int retVal = -1; int retVal = -1;
ENTRY_LOG(); ENTRY_LOG();
LOC_API_ADAPTER_EVENT_MASK_T event;
#ifdef TARGET_USES_QCOM_BSP if (loc_core::LocDualContext::hasAgpsExt()) {
LOC_API_ADAPTER_EVENT_MASK_T event = event = LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT |
LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT |
LOC_API_ADAPTER_BIT_SATELLITE_REPORT | LOC_API_ADAPTER_BIT_SATELLITE_REPORT |
LOC_API_ADAPTER_BIT_IOCTL_REPORT | LOC_API_ADAPTER_BIT_IOCTL_REPORT |
LOC_API_ADAPTER_BIT_STATUS_REPORT | LOC_API_ADAPTER_BIT_STATUS_REPORT |
LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT; LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT;
#else } else {
LOC_API_ADAPTER_EVENT_MASK_T event = event = LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT |
LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT |
LOC_API_ADAPTER_BIT_SATELLITE_REPORT | LOC_API_ADAPTER_BIT_SATELLITE_REPORT |
LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST | LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST |
LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST | LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST |
@ -288,7 +294,7 @@ static int loc_hal_init(void)
LOC_API_ADAPTER_BIT_STATUS_REPORT | LOC_API_ADAPTER_BIT_STATUS_REPORT |
LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT | LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT |
LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST; LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST;
#endif }
LocCallbacks clientCallbacks = {local_loc_cb, /* location_cb */ LocCallbacks clientCallbacks = {local_loc_cb, /* location_cb */
local_status_cb, /* status_cb */ local_status_cb, /* status_cb */
local_sv_cb, /* sv_status_cb */ local_sv_cb, /* sv_status_cb */
@ -467,9 +473,9 @@ static int loc_inject_time(GpsUtcTime time, int64_t timeReference, int uncertain
ENTRY_LOG(); ENTRY_LOG();
int ret_val = 0; int ret_val = 0;
#ifndef TARGET_USES_QCOM_BSP if (loc_core::LocDualContext::hasAgpsExt()) {
ret_val = loc_eng_inject_time(loc_afw_data, time, timeReference, uncertainty); ret_val = loc_eng_inject_time(loc_afw_data, time, timeReference, uncertainty);
#endif }
EXIT_LOG(%d, ret_val); EXIT_LOG(%d, ret_val);
return ret_val; return ret_val;
@ -610,21 +616,21 @@ const void* loc_get_extension(const char* name)
LOC_LOGD("%s:%d] For Interface = %s\n",__func__, __LINE__, name); LOC_LOGD("%s:%d] For Interface = %s\n",__func__, __LINE__, name);
if (strcmp(name, GPS_XTRA_INTERFACE) == 0) if (strcmp(name, GPS_XTRA_INTERFACE) == 0)
{ {
#ifndef TARGET_USES_QCOM_BSP if (loc_core::LocDualContext::hasAgpsExt()) {
ret_val = &sLocEngXTRAInterface; ret_val = &sLocEngXTRAInterface;
#endif }
} }
else if (strcmp(name, AGPS_INTERFACE) == 0) else if (strcmp(name, AGPS_INTERFACE) == 0)
{ {
#ifndef TARGET_USES_QCOM_BSP if (loc_core::LocDualContext::hasAgpsExt()) {
ret_val = &sLocEngAGpsInterface; ret_val = &sLocEngAGpsInterface;
#endif }
} }
else if (strcmp(name, GPS_NI_INTERFACE) == 0) else if (strcmp(name, GPS_NI_INTERFACE) == 0)
{ {
#ifndef TARGET_USES_QCOM_BSP if (loc_core::LocDualContext::hasAgpsExt()) {
ret_val = &sLocEngNiInterface; ret_val = &sLocEngNiInterface;
#endif }
} }
else if (strcmp(name, AGPS_RIL_INTERFACE) == 0) else if (strcmp(name, AGPS_RIL_INTERFACE) == 0)
{ {
@ -1022,7 +1028,7 @@ static int loc_init(GpsCallbacks* callbacks)
EXIT_LOG(%d, retVal); EXIT_LOG(%d, retVal);
return retVal; return retVal;
} }
memset(&afw_cb_data, NULL, sizeof (LocCallbacks)); memset(&afw_cb_data, 0, sizeof (afw_cb_data));
gps_loc_cb = callbacks->location_cb; gps_loc_cb = callbacks->location_cb;
afw_cb_data.status_cb = callbacks->status_cb; afw_cb_data.status_cb = callbacks->status_cb;
gps_sv_cb = callbacks->sv_status_cb; gps_sv_cb = callbacks->sv_status_cb;

View file

@ -37,28 +37,7 @@ extern "C" {
#include <ctype.h> #include <ctype.h>
#include <cutils/properties.h> #include <cutils/properties.h>
#include <hardware/gps.h> #include <hardware/gps.h>
#include <loc_ulp.h> #include <gps_extended.h>
#include "gps_extended.h"
#define MIN_POSSIBLE_FIX_INTERVAL 1000 /* msec */
typedef enum loc_server_type {
LOC_AGPS_CDMA_PDE_SERVER,
LOC_AGPS_CUSTOM_PDE_SERVER,
LOC_AGPS_MPC_SERVER,
LOC_AGPS_SUPL_SERVER
} LocServerType;
typedef enum loc_position_mode_type {
LOC_POSITION_MODE_STANDALONE,
LOC_POSITION_MODE_MS_BASED,
LOC_POSITION_MODE_MS_ASSISTED,
LOC_POSITION_MODE_RESERVED_1,
LOC_POSITION_MODE_RESERVED_2,
LOC_POSITION_MODE_RESERVED_3,
LOC_POSITION_MODE_RESERVED_4,
LOC_POSITION_MODE_RESERVED_5
} LocPositionMode;
typedef void (*loc_location_cb_ext) (UlpLocation* location, void* locExt); typedef void (*loc_location_cb_ext) (UlpLocation* location, void* locExt);
typedef void (*loc_sv_status_cb_ext) (GpsSvStatus* sv_status, void* svExt); typedef void (*loc_sv_status_cb_ext) (GpsSvStatus* sv_status, void* svExt);
@ -78,22 +57,6 @@ typedef struct {
gps_request_utc_time request_utc_time_cb; gps_request_utc_time request_utc_time_cb;
} LocCallbacks; } LocCallbacks;
enum loc_sess_status {
LOC_SESS_SUCCESS,
LOC_SESS_INTERMEDIATE,
LOC_SESS_FAILURE
};
typedef uint32_t LocPosTechMask;
#define LOC_POS_TECH_MASK_DEFAULT ((LocPosTechMask)0x00000000)
#define LOC_POS_TECH_MASK_SATELLITE ((LocPosTechMask)0x00000001)
#define LOC_POS_TECH_MASK_CELLID ((LocPosTechMask)0x00000002)
#define LOC_POS_TECH_MASK_WIFI ((LocPosTechMask)0x00000004)
#define LOC_POS_TECH_MASK_SENSORS ((LocPosTechMask)0x00000008)
#define LOC_POS_TECH_MASK_REFERENCE_LOCATION ((LocPosTechMask)0x00000010)
#define LOC_POS_TECH_MASK_INJECTED_COARSE_POSITION ((LocPosTechMask)0x00000020)
#define LOC_POS_TECH_MASK_AFLT ((LocPosTechMask)0x00000040)
#define LOC_POS_TECH_MASK_HYBRID ((LocPosTechMask)0x00000080)
void loc_ulp_msg_sender(void* loc_eng_data_p, void* msg); void loc_ulp_msg_sender(void* loc_eng_data_p, void* msg);
#ifdef __cplusplus #ifdef __cplusplus

File diff suppressed because it is too large Load diff

View file

@ -55,9 +55,8 @@ typedef unsigned char boolean;
#include <loc_cfg.h> #include <loc_cfg.h>
#include <loc_log.h> #include <loc_log.h>
#include <log_util.h> #include <log_util.h>
#include <loc_eng_msg.h>
#include <loc_eng_agps.h> #include <loc_eng_agps.h>
#include <LocApiAdapter.h> #include <LocEngAdapter.h>
// The data connection minimal open time // The data connection minimal open time
#define DATA_OPEN_MIN_TIME 1 /* sec */ #define DATA_OPEN_MIN_TIME 1 /* sec */
@ -79,25 +78,10 @@ enum loc_mute_session_e_type {
LOC_MUTE_SESS_IN_SESSION LOC_MUTE_SESS_IN_SESSION
}; };
struct LocEngContext {
// Data variables used by deferred action thread
const void* deferred_q;
const void* ulp_q;
const pthread_t deferred_action_thread;
static LocEngContext* get(gps_create_thread threadCreator);
void drop();
static pthread_mutex_t lock;
static pthread_cond_t cond;
private:
int counter;
static LocEngContext *me;
LocEngContext(gps_create_thread threadCreator);
};
// Module data // Module data
typedef struct loc_eng_data_s typedef struct loc_eng_data_s
{ {
LocApiAdapter *client_handle; LocEngAdapter *adapter;
loc_location_cb_ext location_cb; loc_location_cb_ext location_cb;
gps_status_callback status_cb; gps_status_callback status_cb;
loc_sv_status_cb_ext sv_status_cb; loc_sv_status_cb_ext sv_status_cb;
@ -109,9 +93,6 @@ typedef struct loc_eng_data_s
gps_request_utc_time request_utc_time_cb; gps_request_utc_time request_utc_time_cb;
boolean intermediateFix; boolean intermediateFix;
AGpsStatusValue agps_status; AGpsStatusValue agps_status;
// used to defer stopping the GPS engine until AGPS data calls are done
boolean agps_request_pending;
boolean stop_request_pending;
loc_eng_xtra_data_s_type xtra_module_data; loc_eng_xtra_data_s_type xtra_module_data;
loc_eng_ni_data_s_type loc_eng_ni_data; loc_eng_ni_data_s_type loc_eng_ni_data;
@ -129,8 +110,6 @@ typedef struct loc_eng_data_s
// Aiding data information to be deleted, aiding data can only be deleted when GPS engine is off // Aiding data information to be deleted, aiding data can only be deleted when GPS engine is off
GpsAidingData aiding_data_for_deletion; GpsAidingData aiding_data_for_deletion;
void* context;
// For muting session broadcast // For muting session broadcast
loc_mute_session_e_type mute_session_state; loc_mute_session_e_type mute_session_state;
@ -151,7 +130,10 @@ typedef struct loc_eng_data_s
int mpc_host_set; int mpc_host_set;
char mpc_host_buf[101]; char mpc_host_buf[101];
int mpc_port_buf; int mpc_port_buf;
bool ulp_initialized; void *ulp_q;
loc_ext_parser location_ext_parser;
loc_ext_parser sv_ext_parser;
} loc_eng_data_s_type; } loc_eng_data_s_type;
#include "ulp.h" #include "ulp.h"
@ -256,6 +238,7 @@ extern void loc_eng_ni_request_handler(loc_eng_data_s_type &loc_eng_data,
const void* passThrough); const void* passThrough);
extern void loc_eng_ni_reset_on_engine_restart(loc_eng_data_s_type &loc_eng_data); extern void loc_eng_ni_reset_on_engine_restart(loc_eng_data_s_type &loc_eng_data);
int loc_eng_read_config(void); int loc_eng_read_config(void);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif /* __cplusplus */

View file

@ -33,7 +33,7 @@
#include <loc_eng_agps.h> #include <loc_eng_agps.h>
#include <loc_eng_log.h> #include <loc_eng_log.h>
#include <log_util.h> #include <log_util.h>
#include "platform_lib_includes.h" #include <platform_lib_includes.h>
#include <loc_eng_dmn_conn_handler.h> #include <loc_eng_dmn_conn_handler.h>
#include <loc_eng_dmn_conn.h> #include <loc_eng_dmn_conn.h>
#include <sys/time.h> #include <sys/time.h>
@ -109,7 +109,7 @@ bool BITSubscriber::equals(const Subscriber *s) const
return (ID == bitS->ID && return (ID == bitS->ID &&
(INADDR_NONE != (unsigned int)ID || (INADDR_NONE != (unsigned int)ID ||
0 == strncmp(ipv6Addr, bitS->ipv6Addr, sizeof(ipv6Addr)))); 0 == strncmp(mIPv6Addr, bitS->mIPv6Addr, sizeof(mIPv6Addr))));
} }
bool BITSubscriber::notifyRsrcStatus(Notification &notification) bool BITSubscriber::notifyRsrcStatus(Notification &notification)
@ -152,13 +152,13 @@ bool ATLSubscriber::notifyRsrcStatus(Notification &notification)
{ {
case RSRC_UNSUBSCRIBE: case RSRC_UNSUBSCRIBE:
case RSRC_RELEASED: case RSRC_RELEASED:
((LocApiAdapter*)mLocAdapter)->atlCloseStatus(ID, 1); ((LocEngAdapter*)mLocAdapter)->atlCloseStatus(ID, 1);
break; break;
case RSRC_DENIED: case RSRC_DENIED:
{ {
AGpsExtType type = mBackwardCompatibleMode ? AGpsExtType type = mBackwardCompatibleMode ?
AGPS_TYPE_INVALID : mStateMachine->getType(); AGPS_TYPE_INVALID : mStateMachine->getType();
((LocApiAdapter*)mLocAdapter)->atlOpenStatus(ID, 0, ((LocEngAdapter*)mLocAdapter)->atlOpenStatus(ID, 0,
(char*)mStateMachine->getAPN(), (char*)mStateMachine->getAPN(),
mStateMachine->getBearer(), mStateMachine->getBearer(),
type); type);
@ -168,7 +168,7 @@ bool ATLSubscriber::notifyRsrcStatus(Notification &notification)
{ {
AGpsExtType type = mBackwardCompatibleMode ? AGpsExtType type = mBackwardCompatibleMode ?
AGPS_TYPE_INVALID : mStateMachine->getType(); AGPS_TYPE_INVALID : mStateMachine->getType();
((LocApiAdapter*)mLocAdapter)->atlOpenStatus(ID, 1, ((LocEngAdapter*)mLocAdapter)->atlOpenStatus(ID, 1,
(char*)mStateMachine->getAPN(), (char*)mStateMachine->getAPN(),
mStateMachine->getBearer(), mStateMachine->getBearer(),
type); type);
@ -627,6 +627,7 @@ AgpsStateMachine::AgpsStateMachine(servicerType servType,
mStatePtr(new AgpsReleasedState(this)),mType(type), mStatePtr(new AgpsReleasedState(this)),mType(type),
mAPN(NULL), mAPN(NULL),
mAPNLen(0), mAPNLen(0),
mBearer(AGPS_APN_BEARER_INVALID),
mEnforceSingleSubscriber(enforceSingleSubscriber), mEnforceSingleSubscriber(enforceSingleSubscriber),
mServicer(Servicer :: getServicer(servType, (void *)cb_func)) mServicer(Servicer :: getServicer(servType, (void *)cb_func))
{ {
@ -826,7 +827,7 @@ err:
} }
DSStateMachine :: DSStateMachine(servicerType type, void *cb_func, DSStateMachine :: DSStateMachine(servicerType type, void *cb_func,
LocApiAdapter* adapterHandle): LocEngAdapter* adapterHandle):
AgpsStateMachine(type, cb_func, AGPS_TYPE_INVALID,false), AgpsStateMachine(type, cb_func, AGPS_TYPE_INVALID,false),
mLocAdapter(adapterHandle) mLocAdapter(adapterHandle)
{ {
@ -947,17 +948,17 @@ void DSStateMachine :: informStatus(AgpsRsrcStatus status, int ID) const
LOC_LOGD("DSStateMachine :: informStatus. Status=%d\n",(int)status); LOC_LOGD("DSStateMachine :: informStatus. Status=%d\n",(int)status);
switch(status) { switch(status) {
case RSRC_UNSUBSCRIBE: case RSRC_UNSUBSCRIBE:
((LocApiAdapter*)mLocAdapter)->atlCloseStatus(ID, 1); mLocAdapter->atlCloseStatus(ID, 1);
break; break;
case RSRC_RELEASED: case RSRC_RELEASED:
((LocApiAdapter*)mLocAdapter)->releaseDataHandle(); mLocAdapter->closeDataCall();
break; break;
case RSRC_DENIED: case RSRC_DENIED:
((DSStateMachine *)this)->mRetries = 0; ((DSStateMachine *)this)->mRetries = 0;
mLocAdapter->requestATL(ID, AGPS_TYPE_SUPL); mLocAdapter->requestATL(ID, AGPS_TYPE_SUPL);
break; break;
case RSRC_GRANTED: case RSRC_GRANTED:
((LocApiAdapter*)mLocAdapter)->atlOpenStatus(ID, 1, mLocAdapter->atlOpenStatus(ID, 1,
NULL, NULL,
AGPS_APN_BEARER_INVALID, AGPS_APN_BEARER_INVALID,
AGPS_TYPE_INVALID); AGPS_TYPE_INVALID);

View file

@ -35,10 +35,11 @@
#include <string.h> #include <string.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <hardware/gps.h> #include <hardware/gps.h>
#include <gps_extended.h>
#include <loc_core_log.h>
#include <linked_list.h> #include <linked_list.h>
#include <LocApiAdapter.h>
#include "loc_eng_msg.h"
#include <loc_timer.h> #include <loc_timer.h>
#include <LocEngAdapter.h>
// forward declaration // forward declaration
class AgpsStateMachine; class AgpsStateMachine;
@ -62,7 +63,7 @@ typedef enum {
//DS Callback struct //DS Callback struct
typedef struct { typedef struct {
LocApiAdapter *mAdapter; LocEngAdapter *mAdapter;
AGpsStatusValue action; AGpsStatusValue action;
}dsCbData; }dsCbData;
@ -249,12 +250,12 @@ public:
class DSStateMachine : public AgpsStateMachine { class DSStateMachine : public AgpsStateMachine {
static const unsigned char MAX_START_DATA_CALL_RETRIES; static const unsigned char MAX_START_DATA_CALL_RETRIES;
static const unsigned int DATA_CALL_RETRY_DELAY_MSEC; static const unsigned int DATA_CALL_RETRY_DELAY_MSEC;
LocApiAdapter* mLocAdapter; LocEngAdapter* mLocAdapter;
unsigned char mRetries; unsigned char mRetries;
public: public:
DSStateMachine(servicerType type, DSStateMachine(servicerType type,
void *cb_func, void *cb_func,
LocApiAdapter* adapterHandle); LocEngAdapter* adapterHandle);
int sendRsrcRequest(AGpsStatusValue action) const; int sendRsrcRequest(AGpsStatusValue action) const;
void onRsrcEvent(AgpsRsrcStatus event); void onRsrcEvent(AgpsRsrcStatus event);
void retryCallback(); void retryCallback();
@ -297,40 +298,40 @@ struct Subscriber {
// BITSubscriber, created with requests from BIT daemon // BITSubscriber, created with requests from BIT daemon
struct BITSubscriber : public Subscriber { struct BITSubscriber : public Subscriber {
char mIPv6Addr[16];
inline BITSubscriber(const AgpsStateMachine* stateMachine, inline BITSubscriber(const AgpsStateMachine* stateMachine,
unsigned int ipv4, char* ipv6) : unsigned int ipv4, char* ipv6) :
Subscriber(ipv4, stateMachine) Subscriber(ipv4, stateMachine)
{ {
if (NULL == ipv6) { if (NULL == ipv6) {
ipv6Addr[0] = NULL; mIPv6Addr[0] = 0;
} else { } else {
memcpy(ipv6Addr, ipv6, sizeof(ipv6Addr)); memcpy(mIPv6Addr, ipv6, sizeof(mIPv6Addr));
} }
} }
virtual bool notifyRsrcStatus(Notification &notification); virtual bool notifyRsrcStatus(Notification &notification);
inline virtual void setIPAddresses(uint32_t &v4, char* v6) inline virtual void setIPAddresses(uint32_t &v4, char* v6)
{ v4 = ID; memcpy(v6, ipv6Addr, sizeof(ipv6Addr)); } { v4 = ID; memcpy(v6, mIPv6Addr, sizeof(mIPv6Addr)); }
virtual Subscriber* clone() virtual Subscriber* clone()
{ {
return new BITSubscriber(mStateMachine, ID, ipv6Addr); return new BITSubscriber(mStateMachine, ID, mIPv6Addr);
} }
virtual bool equals(const Subscriber *s) const; virtual bool equals(const Subscriber *s) const;
inline virtual ~BITSubscriber(){} inline virtual ~BITSubscriber(){}
private:
char ipv6Addr[16];
}; };
// ATLSubscriber, created with requests from ATL // ATLSubscriber, created with requests from ATL
struct ATLSubscriber : public Subscriber { struct ATLSubscriber : public Subscriber {
const LocApiAdapter* mLocAdapter; const LocEngAdapter* mLocAdapter;
const bool mBackwardCompatibleMode; const bool mBackwardCompatibleMode;
inline ATLSubscriber(const int id, inline ATLSubscriber(const int id,
const AgpsStateMachine* stateMachine, const AgpsStateMachine* stateMachine,
const LocApiAdapter* adapter, const LocEngAdapter* adapter,
const bool compatibleMode) : const bool compatibleMode) :
Subscriber(id, stateMachine), mLocAdapter(adapter), Subscriber(id, stateMachine), mLocAdapter(adapter),
mBackwardCompatibleMode(compatibleMode){} mBackwardCompatibleMode(compatibleMode){}

View file

@ -49,24 +49,24 @@ int loc_eng_dmn_conn_loc_api_server_if_request_handler(struct ctrl_msgbuf *pmsg,
} }
if (NULL != loc_api_handle) { if (NULL != loc_api_handle) {
loc_if_req_type_e_type type; AGpsExtType type;
switch (pmsg->cmsg.cmsg_if_request.type) { switch (pmsg->cmsg.cmsg_if_request.type) {
case IF_REQUEST_TYPE_SUPL: case IF_REQUEST_TYPE_SUPL:
{ {
LOC_LOGD("IF_REQUEST_TYPE_SUPL"); LOC_LOGD("IF_REQUEST_TYPE_SUPL");
type = LOC_ENG_IF_REQUEST_TYPE_SUPL; type = AGPS_TYPE_SUPL;
break; break;
} }
case IF_REQUEST_TYPE_WIFI: case IF_REQUEST_TYPE_WIFI:
{ {
LOC_LOGD("IF_REQUEST_TYPE_WIFI"); LOC_LOGD("IF_REQUEST_TYPE_WIFI");
type = LOC_ENG_IF_REQUEST_TYPE_WIFI; type = AGPS_TYPE_WIFI;
break; break;
} }
case IF_REQUEST_TYPE_ANY: case IF_REQUEST_TYPE_ANY:
{ {
LOC_LOGD("IF_REQUEST_TYPE_ANY"); LOC_LOGD("IF_REQUEST_TYPE_ANY");
type = LOC_ENG_IF_REQUEST_TYPE_ANY; type = AGPS_TYPE_ANY;
break; break;
} }
default: default:
@ -79,48 +79,52 @@ int loc_eng_dmn_conn_loc_api_server_if_request_handler(struct ctrl_msgbuf *pmsg,
case IF_REQUEST_SENDER_ID_QUIPC: case IF_REQUEST_SENDER_ID_QUIPC:
{ {
LOC_LOGD("IF_REQUEST_SENDER_ID_QUIPC"); LOC_LOGD("IF_REQUEST_SENDER_ID_QUIPC");
loc_eng_msg_request_wifi *msg( LocEngReqRelWifi* msg =
new loc_eng_msg_request_wifi(loc_api_handle, new LocEngReqRelWifi(loc_api_handle,
type, type,
LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC, LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC,
(char*)pmsg->cmsg.cmsg_if_request.ssid, (char*)pmsg->cmsg.cmsg_if_request.ssid,
(char*)pmsg->cmsg.cmsg_if_request.password)); (char*)pmsg->cmsg.cmsg_if_request.password,
loc_eng_msg_sender(loc_api_handle, msg); true);
msg->send();
break; break;
} }
case IF_REQUEST_SENDER_ID_MSAPM: case IF_REQUEST_SENDER_ID_MSAPM:
{ {
LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPM"); LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPM");
loc_eng_msg_request_wifi *msg( LocEngReqRelWifi* msg =
new loc_eng_msg_request_wifi(loc_api_handle, new LocEngReqRelWifi(loc_api_handle,
type, type,
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM, LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM,
(char*)pmsg->cmsg.cmsg_if_request.ssid, (char*)pmsg->cmsg.cmsg_if_request.ssid,
(char*)pmsg->cmsg.cmsg_if_request.password)); (char*)pmsg->cmsg.cmsg_if_request.password,
loc_eng_msg_sender(loc_api_handle, msg); true);
msg->send();
break; break;
} }
case IF_REQUEST_SENDER_ID_MSAPU: case IF_REQUEST_SENDER_ID_MSAPU:
{ {
LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPU"); LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPU");
loc_eng_msg_request_wifi *msg( LocEngReqRelWifi* msg =
new loc_eng_msg_request_wifi(loc_api_handle, new LocEngReqRelWifi(loc_api_handle,
type, type,
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU, LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU,
(char*)pmsg->cmsg.cmsg_if_request.ssid, (char*)pmsg->cmsg.cmsg_if_request.ssid,
(char*)pmsg->cmsg.cmsg_if_request.password)); (char*)pmsg->cmsg.cmsg_if_request.password,
loc_eng_msg_sender(loc_api_handle, msg); true);
msg->send();
break; break;
} }
case IF_REQUEST_SENDER_ID_GPSONE_DAEMON: case IF_REQUEST_SENDER_ID_GPSONE_DAEMON:
{ {
LOC_LOGD("IF_REQUEST_SENDER_ID_GPSONE_DAEMON"); LOC_LOGD("IF_REQUEST_SENDER_ID_GPSONE_DAEMON");
loc_eng_msg_request_bit *msg( LocEngReqRelBIT* msg =
new loc_eng_msg_request_bit(loc_api_handle, new LocEngReqRelBIT(loc_api_handle,
type, type,
pmsg->cmsg.cmsg_if_request.ipv4_addr, pmsg->cmsg.cmsg_if_request.ipv4_addr,
(char*)pmsg->cmsg.cmsg_if_request.ipv6_addr)); (char*)pmsg->cmsg.cmsg_if_request.ipv6_addr,
loc_eng_msg_sender(loc_api_handle, msg); true);
msg->send();
break; break;
} }
default: default:
@ -141,24 +145,24 @@ int loc_eng_dmn_conn_loc_api_server_if_release_handler(struct ctrl_msgbuf *pmsg,
{ {
LOC_LOGD("%s:%d]\n", __func__, __LINE__); LOC_LOGD("%s:%d]\n", __func__, __LINE__);
#ifndef DEBUG_DMN_LOC_API #ifndef DEBUG_DMN_LOC_API
loc_if_req_type_e_type type; AGpsExtType type;
switch (pmsg->cmsg.cmsg_if_request.type) { switch (pmsg->cmsg.cmsg_if_request.type) {
case IF_REQUEST_TYPE_SUPL: case IF_REQUEST_TYPE_SUPL:
{ {
LOC_LOGD("IF_REQUEST_TYPE_SUPL"); LOC_LOGD("IF_REQUEST_TYPE_SUPL");
type = LOC_ENG_IF_REQUEST_TYPE_SUPL; type = AGPS_TYPE_SUPL;
break; break;
} }
case IF_REQUEST_TYPE_WIFI: case IF_REQUEST_TYPE_WIFI:
{ {
LOC_LOGD("IF_REQUEST_TYPE_WIFI"); LOC_LOGD("IF_REQUEST_TYPE_WIFI");
type = LOC_ENG_IF_REQUEST_TYPE_WIFI; type = AGPS_TYPE_WIFI;
break; break;
} }
case IF_REQUEST_TYPE_ANY: case IF_REQUEST_TYPE_ANY:
{ {
LOC_LOGD("IF_REQUEST_TYPE_ANY"); LOC_LOGD("IF_REQUEST_TYPE_ANY");
type = LOC_ENG_IF_REQUEST_TYPE_ANY; type = AGPS_TYPE_ANY;
break; break;
} }
default: default:
@ -171,48 +175,52 @@ int loc_eng_dmn_conn_loc_api_server_if_release_handler(struct ctrl_msgbuf *pmsg,
case IF_REQUEST_SENDER_ID_QUIPC: case IF_REQUEST_SENDER_ID_QUIPC:
{ {
LOC_LOGD("IF_REQUEST_SENDER_ID_QUIPC"); LOC_LOGD("IF_REQUEST_SENDER_ID_QUIPC");
loc_eng_msg_release_wifi *msg( LocEngReqRelWifi* msg =
new loc_eng_msg_release_wifi(loc_api_handle, new LocEngReqRelWifi(loc_api_handle,
type, type,
LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC, LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC,
(char*)pmsg->cmsg.cmsg_if_request.ssid, (char*)pmsg->cmsg.cmsg_if_request.ssid,
(char*)pmsg->cmsg.cmsg_if_request.password)); (char*)pmsg->cmsg.cmsg_if_request.password,
loc_eng_msg_sender(loc_api_handle, msg); false);
msg->send();
break; break;
} }
case IF_REQUEST_SENDER_ID_MSAPM: case IF_REQUEST_SENDER_ID_MSAPM:
{ {
LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPM"); LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPM");
loc_eng_msg_release_wifi *msg( LocEngReqRelWifi* msg =
new loc_eng_msg_release_wifi(loc_api_handle, new LocEngReqRelWifi(loc_api_handle,
type, type,
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM, LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM,
(char*)pmsg->cmsg.cmsg_if_request.ssid, (char*)pmsg->cmsg.cmsg_if_request.ssid,
(char*)pmsg->cmsg.cmsg_if_request.password)); (char*)pmsg->cmsg.cmsg_if_request.password,
loc_eng_msg_sender(loc_api_handle, msg); false);
msg->send();
break; break;
} }
case IF_REQUEST_SENDER_ID_MSAPU: case IF_REQUEST_SENDER_ID_MSAPU:
{ {
LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPU"); LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPU");
loc_eng_msg_release_wifi *msg( LocEngReqRelWifi* msg =
new loc_eng_msg_release_wifi(loc_api_handle, new LocEngReqRelWifi(loc_api_handle,
type, type,
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU, LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU,
(char*)pmsg->cmsg.cmsg_if_request.ssid, (char*)pmsg->cmsg.cmsg_if_request.ssid,
(char*)pmsg->cmsg.cmsg_if_request.password)); (char*)pmsg->cmsg.cmsg_if_request.password,
loc_eng_msg_sender(loc_api_handle, msg); false);
msg->send();
break; break;
} }
case IF_REQUEST_SENDER_ID_GPSONE_DAEMON: case IF_REQUEST_SENDER_ID_GPSONE_DAEMON:
{ {
LOC_LOGD("IF_REQUEST_SENDER_ID_GPSONE_DAEMON"); LOC_LOGD("IF_REQUEST_SENDER_ID_GPSONE_DAEMON");
loc_eng_msg_release_bit *msg( LocEngReqRelBIT* msg =
new loc_eng_msg_release_bit(loc_api_handle, new LocEngReqRelBIT(loc_api_handle,
type, type,
pmsg->cmsg.cmsg_if_request.ipv4_addr, pmsg->cmsg.cmsg_if_request.ipv4_addr,
(char*)pmsg->cmsg.cmsg_if_request.ipv6_addr)); (char*)pmsg->cmsg.cmsg_if_request.ipv6_addr,
loc_eng_msg_sender(loc_api_handle, msg); false);
msg->send();
break; break;
} }
default: default:

View file

@ -30,31 +30,10 @@
#define LOG_NDDEBUG 0 #define LOG_NDDEBUG 0
#define LOG_TAG "LocSvc_eng" #define LOG_TAG "LocSvc_eng"
#include "hardware/gps.h"
#include "loc_log.h" #include "loc_log.h"
#include "loc_eng_log.h" #include "loc_eng_log.h"
#include "loc_eng_msg_id.h" #include "loc_eng_msg_id.h"
/* GPS status names */
static loc_name_val_s_type gps_status_name[] =
{
NAME_VAL( GPS_STATUS_NONE ),
NAME_VAL( GPS_STATUS_SESSION_BEGIN ),
NAME_VAL( GPS_STATUS_SESSION_END ),
NAME_VAL( GPS_STATUS_ENGINE_ON ),
NAME_VAL( GPS_STATUS_ENGINE_OFF ),
};
static int gps_status_num = sizeof(gps_status_name) / sizeof(loc_name_val_s_type);
/* Find Android GPS status name */
const char* loc_get_gps_status_name(GpsStatusValue gps_status)
{
return loc_get_name_from_val(gps_status_name, gps_status_num,
(long) gps_status);
}
static loc_name_val_s_type loc_eng_msgs[] = static loc_name_val_s_type loc_eng_msgs[] =
{ {
NAME_VAL( LOC_ENG_MSG_QUIT ), NAME_VAL( LOC_ENG_MSG_QUIT ),
@ -111,183 +90,3 @@ const char* loc_get_msg_name(int id)
static loc_name_val_s_type loc_eng_position_modes[] =
{
NAME_VAL( LOC_POSITION_MODE_STANDALONE ),
NAME_VAL( LOC_POSITION_MODE_MS_BASED ),
NAME_VAL( LOC_POSITION_MODE_MS_ASSISTED ),
NAME_VAL( LOC_POSITION_MODE_RESERVED_1 ),
NAME_VAL( LOC_POSITION_MODE_RESERVED_2 ),
NAME_VAL( LOC_POSITION_MODE_RESERVED_3 ),
NAME_VAL( LOC_POSITION_MODE_RESERVED_4 ),
NAME_VAL( LOC_POSITION_MODE_RESERVED_5 )
};
static int loc_eng_position_mode_num = sizeof(loc_eng_position_modes) / sizeof(loc_name_val_s_type);
const char* loc_get_position_mode_name(GpsPositionMode mode)
{
return loc_get_name_from_val(loc_eng_position_modes, loc_eng_position_mode_num, (long) mode);
}
static loc_name_val_s_type loc_eng_position_recurrences[] =
{
NAME_VAL( GPS_POSITION_RECURRENCE_PERIODIC ),
NAME_VAL( GPS_POSITION_RECURRENCE_SINGLE )
};
static int loc_eng_position_recurrence_num = sizeof(loc_eng_position_recurrences) / sizeof(loc_name_val_s_type);
const char* loc_get_position_recurrence_name(GpsPositionRecurrence recur)
{
return loc_get_name_from_val(loc_eng_position_recurrences, loc_eng_position_recurrence_num, (long) recur);
}
static loc_name_val_s_type loc_eng_aiding_data_bits[] =
{
NAME_VAL( GPS_DELETE_EPHEMERIS ),
NAME_VAL( GPS_DELETE_ALMANAC ),
NAME_VAL( GPS_DELETE_POSITION ),
NAME_VAL( GPS_DELETE_TIME ),
NAME_VAL( GPS_DELETE_IONO ),
NAME_VAL( GPS_DELETE_UTC ),
NAME_VAL( GPS_DELETE_HEALTH ),
NAME_VAL( GPS_DELETE_SVDIR ),
NAME_VAL( GPS_DELETE_SVSTEER ),
NAME_VAL( GPS_DELETE_SADATA ),
NAME_VAL( GPS_DELETE_RTI ),
NAME_VAL( GPS_DELETE_CELLDB_INFO ),
NAME_VAL( GPS_DELETE_ALMANAC_CORR ),
NAME_VAL( GPS_DELETE_FREQ_BIAS_EST ),
NAME_VAL( GPS_DELETE_EPHEMERIS_GLO ),
NAME_VAL( GPS_DELETE_ALMANAC_GLO ),
NAME_VAL( GPS_DELETE_SVDIR_GLO ),
NAME_VAL( GPS_DELETE_SVSTEER_GLO ),
NAME_VAL( GPS_DELETE_ALMANAC_CORR_GLO ),
NAME_VAL( GPS_DELETE_TIME_GPS ),
NAME_VAL( GPS_DELETE_TIME_GLO )
};
static int loc_eng_aiding_data_bit_num = sizeof(loc_eng_aiding_data_bits) / sizeof(loc_name_val_s_type);
const char* loc_get_aiding_data_mask_names(GpsAidingData data)
{
return NULL;
}
static loc_name_val_s_type loc_eng_agps_types[] =
{
NAME_VAL( AGPS_TYPE_INVALID ),
NAME_VAL( AGPS_TYPE_ANY ),
NAME_VAL( AGPS_TYPE_SUPL ),
NAME_VAL( AGPS_TYPE_C2K ),
NAME_VAL( AGPS_TYPE_WWAN_ANY )
};
static int loc_eng_agps_type_num = sizeof(loc_eng_agps_types) / sizeof(loc_name_val_s_type);
const char* loc_get_agps_type_name(AGpsType type)
{
return loc_get_name_from_val(loc_eng_agps_types, loc_eng_agps_type_num, (long) type);
}
static loc_name_val_s_type loc_eng_ni_types[] =
{
NAME_VAL( GPS_NI_TYPE_VOICE ),
NAME_VAL( GPS_NI_TYPE_UMTS_SUPL ),
NAME_VAL( GPS_NI_TYPE_UMTS_CTRL_PLANE )
};
static int loc_eng_ni_type_num = sizeof(loc_eng_ni_types) / sizeof(loc_name_val_s_type);
const char* loc_get_ni_type_name(GpsNiType type)
{
return loc_get_name_from_val(loc_eng_ni_types, loc_eng_ni_type_num, (long) type);
}
static loc_name_val_s_type loc_eng_ni_responses[] =
{
NAME_VAL( GPS_NI_RESPONSE_ACCEPT ),
NAME_VAL( GPS_NI_RESPONSE_DENY ),
NAME_VAL( GPS_NI_RESPONSE_DENY )
};
static int loc_eng_ni_reponse_num = sizeof(loc_eng_ni_responses) / sizeof(loc_name_val_s_type);
const char* loc_get_ni_response_name(GpsUserResponseType response)
{
return loc_get_name_from_val(loc_eng_ni_responses, loc_eng_ni_reponse_num, (long) response);
}
static loc_name_val_s_type loc_eng_ni_encodings[] =
{
NAME_VAL( GPS_ENC_NONE ),
NAME_VAL( GPS_ENC_SUPL_GSM_DEFAULT ),
NAME_VAL( GPS_ENC_SUPL_UTF8 ),
NAME_VAL( GPS_ENC_SUPL_UCS2 ),
NAME_VAL( GPS_ENC_UNKNOWN )
};
static int loc_eng_ni_encoding_num = sizeof(loc_eng_ni_encodings) / sizeof(loc_name_val_s_type);
const char* loc_get_ni_encoding_name(GpsNiEncodingType encoding)
{
return loc_get_name_from_val(loc_eng_ni_encodings, loc_eng_ni_encoding_num, (long) encoding);
}
static loc_name_val_s_type loc_eng_agps_bears[] =
{
NAME_VAL( AGPS_APN_BEARER_INVALID ),
NAME_VAL( AGPS_APN_BEARER_IPV4 ),
NAME_VAL( AGPS_APN_BEARER_IPV4 ),
NAME_VAL( AGPS_APN_BEARER_IPV4V6 )
};
static int loc_eng_agps_bears_num = sizeof(loc_eng_agps_bears) / sizeof(loc_name_val_s_type);
const char* loc_get_agps_bear_name(AGpsBearerType bearer)
{
return loc_get_name_from_val(loc_eng_agps_bears, loc_eng_agps_bears_num, (long) bearer);
}
static loc_name_val_s_type loc_eng_server_types[] =
{
NAME_VAL( LOC_AGPS_CDMA_PDE_SERVER ),
NAME_VAL( LOC_AGPS_CUSTOM_PDE_SERVER ),
NAME_VAL( LOC_AGPS_MPC_SERVER ),
NAME_VAL( LOC_AGPS_SUPL_SERVER )
};
static int loc_eng_server_types_num = sizeof(loc_eng_server_types) / sizeof(loc_name_val_s_type);
const char* loc_get_server_type_name(LocServerType type)
{
return loc_get_name_from_val(loc_eng_server_types, loc_eng_server_types_num, (long) type);
}
static loc_name_val_s_type loc_eng_position_sess_status_types[] =
{
NAME_VAL( LOC_SESS_SUCCESS ),
NAME_VAL( LOC_SESS_INTERMEDIATE ),
NAME_VAL( LOC_SESS_FAILURE )
};
static int loc_eng_position_sess_status_num = sizeof(loc_eng_position_sess_status_types) / sizeof(loc_name_val_s_type);
const char* loc_get_position_sess_status_name(enum loc_sess_status status)
{
return loc_get_name_from_val(loc_eng_position_sess_status_types, loc_eng_position_sess_status_num, (long) status);
}
static loc_name_val_s_type loc_eng_agps_status_names[] =
{
NAME_VAL( GPS_REQUEST_AGPS_DATA_CONN ),
NAME_VAL( GPS_RELEASE_AGPS_DATA_CONN ),
NAME_VAL( GPS_AGPS_DATA_CONNECTED ),
NAME_VAL( GPS_AGPS_DATA_CONN_DONE ),
NAME_VAL( GPS_AGPS_DATA_CONN_FAILED )
};
static int loc_eng_agps_status_num = sizeof(loc_eng_agps_status_names) / sizeof(loc_name_val_s_type);
const char* loc_get_agps_status_name(AGpsStatusValue status)
{
return loc_get_name_from_val(loc_eng_agps_status_names, loc_eng_agps_status_num, (long) status);
}

View file

@ -36,22 +36,8 @@ extern "C"
#endif #endif
#include <ctype.h> #include <ctype.h>
#include <hardware/gps.h>
#include <loc.h>
const char* loc_get_gps_status_name(GpsStatusValue gps_status);
const char* loc_get_msg_name(int id); const char* loc_get_msg_name(int id);
const char* loc_get_position_mode_name(GpsPositionMode mode);
const char* loc_get_position_recurrence_name(GpsPositionRecurrence recur);
const char* loc_get_aiding_data_mask_names(GpsAidingData data);
const char* loc_get_agps_type_name(AGpsType type);
const char* loc_get_ni_type_name(GpsNiType type);
const char* loc_get_ni_response_name(GpsUserResponseType response);
const char* loc_get_ni_encoding_name(GpsNiEncodingType encoding);
const char* loc_get_agps_bear_name(AGpsBearerType bear);
const char* loc_get_server_type_name(LocServerType type);
const char* loc_get_position_sess_status_name(enum loc_sess_status status);
const char* loc_get_agps_status_name(AGpsStatusValue status);
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -1,133 +0,0 @@
/* Copyright (c) 2011, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted 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 The Linux Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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.
*
*/
#include <fcntl.h>
#include "loc_eng_msg.h"
#include "loc_eng_dmn_conn_glue_msg.h"
#ifdef _ANDROID_
#define LOC_ENG_MSG_REQ_Q_PATH "/data/misc/gpsone_d/loc_eng_msg_req_q"
#else
#define LOC_ENG_MSG_REQ_Q_PATH "/tmp/loc_eng_msg_req_q"
#endif
int loc_eng_msgget(int * p_req_msgq)
{
* p_req_msgq = loc_eng_dmn_conn_glue_msgget(LOC_ENG_MSG_REQ_Q_PATH, O_RDWR);
return 0;
}
int loc_eng_msgremove(int req_msgq)
{
loc_eng_dmn_conn_glue_piperemove(LOC_ENG_MSG_REQ_Q_PATH, req_msgq);
return 0;
}
int loc_eng_msgsnd(int msgqid, void * msgp)
{
int ret = loc_eng_dmn_conn_glue_pipewrite(msgqid, msgp, sizeof(void*));
return ret;
}
int loc_eng_msgsnd_raw(int msgqid, void * msgp, unsigned int msgsz)
{
int result;
struct msgbuf * pmsg = (struct msgbuf *) msgp;
if (msgsz < sizeof(struct msgbuf)) {
LOC_LOGE("%s:%d] msgbuf is too small %d\n", __func__, __LINE__, msgsz);
return -1;
}
pmsg->msgsz = msgsz;
result = loc_eng_dmn_conn_glue_pipewrite(msgqid, msgp, msgsz);
if (result != (int) msgsz) {
LOC_LOGE("%s:%d] pipe broken %d, msgsz = %d\n", __func__, __LINE__, result, (int) msgsz);
return -1;
}
return result;
}
int loc_eng_msgrcv(int msgqid, void ** msgp)
{
int ret = loc_eng_dmn_conn_glue_piperead(msgqid, msgp, sizeof(void*));
return ret;
}
int loc_eng_msgrcv_raw(int msgqid, void *msgp, unsigned int msgsz)
{
int result;
struct msgbuf * pmsg = (struct msgbuf *) msgp;
if (msgsz < sizeof(struct msgbuf)) {
LOC_LOGE("%s:%d] msgbuf is too small %d\n", __func__, __LINE__, msgsz);
return -1;
}
result = loc_eng_dmn_conn_glue_piperead(msgqid, msgp, sizeof(struct msgbuf));
if (result != sizeof(struct msgbuf)) {
LOC_LOGE("%s:%d] pipe broken %d\n", __func__, __LINE__, result);
return -1;
}
if (msgsz < pmsg->msgsz) {
LOC_LOGE("%s:%d] msgbuf is too small %d < %d\n", __func__, __LINE__, (int) msgsz, (int) pmsg->msgsz);
return -1;
}
if (pmsg->msgsz > sizeof(struct msgbuf)) {
/* there is msg body */
msgp += sizeof(struct msgbuf);
result = loc_eng_dmn_conn_glue_piperead(msgqid, msgp, pmsg->msgsz - sizeof(struct msgbuf));
if (result != (int) (pmsg->msgsz - sizeof(struct msgbuf))) {
LOC_LOGE("%s:%d] pipe broken %d, msgid = %p, msgsz = %d\n", __func__, __LINE__, result,
(pmsg->msgid), (int) pmsg->msgsz);
return -1;
}
}
return pmsg->msgsz;
}
int loc_eng_msgflush(int msgqid)
{
return loc_eng_dmn_conn_glue_msgflush(msgqid);
}
int loc_eng_msgunblock(int msgqid)
{
return loc_eng_dmn_conn_glue_pipeunblock(msgqid);
}

View file

@ -31,13 +31,15 @@
#include <hardware/gps.h> #include <hardware/gps.h>
#include <loc_ulp.h> #include <gps_extended.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "log_util.h" #include <log_util.h>
#include "loc.h"
#include <loc_eng_log.h> #include <loc_eng_log.h>
#include "loc_eng_msg_id.h" #include <loc_eng.h>
#include <loc_eng_msg_id.h>
#include <MsgTask.h>
#include <LocEngAdapter.h>
#ifndef SSID_BUF_SIZE #ifndef SSID_BUF_SIZE
#define SSID_BUF_SIZE (32+1) #define SSID_BUF_SIZE (32+1)
@ -53,113 +55,7 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
struct LocPosMode using namespace loc_core;
{
LocPositionMode mode;
GpsPositionRecurrence recurrence;
uint32_t min_interval;
uint32_t preferred_accuracy;
uint32_t preferred_time;
char credentials[14];
char provider[8];
LocPosMode(LocPositionMode m, GpsPositionRecurrence recr,
uint32_t gap, uint32_t accu, uint32_t time,
const char* cred, const char* prov) :
mode(m), recurrence(recr),
min_interval(gap < MIN_POSSIBLE_FIX_INTERVAL ? MIN_POSSIBLE_FIX_INTERVAL : gap),
preferred_accuracy(accu), preferred_time(time) {
memset(credentials, 0, sizeof(credentials));
memset(provider, 0, sizeof(provider));
if (NULL != cred) {
memcpy(credentials, cred, sizeof(credentials)-1);
}
if (NULL != prov) {
memcpy(provider, prov, sizeof(provider)-1);
}
}
LocPosMode() :
mode(LOC_POSITION_MODE_MS_BASED), recurrence(GPS_POSITION_RECURRENCE_PERIODIC),
min_interval(MIN_POSSIBLE_FIX_INTERVAL), preferred_accuracy(50), preferred_time(120000) {
memset(credentials, 0, sizeof(credentials));
memset(provider, 0, sizeof(provider));
}
inline bool equals(const LocPosMode &anotherMode) const
{
return anotherMode.mode == mode &&
anotherMode.recurrence == recurrence &&
anotherMode.min_interval == min_interval &&
anotherMode.preferred_accuracy == preferred_accuracy &&
anotherMode.preferred_time == preferred_time &&
!strncmp(anotherMode.credentials, credentials, sizeof(credentials)-1) &&
!strncmp(anotherMode.provider, provider, sizeof(provider)-1);
}
inline void logv() const
{
LOC_LOGV ("Position mode: %s\n Position recurrence: %s\n min interval: %d\n preferred accuracy: %d\n preferred time: %d\n credentials: %s provider: %s",
loc_get_position_mode_name(mode),
loc_get_position_recurrence_name(recurrence),
min_interval,
preferred_accuracy,
preferred_time,
credentials,
provider);
}
};
/** Flags to indicate which values are valid in a GpsLocationExtended. */
typedef uint16_t GpsLocationExtendedFlags;
/** GpsLocationExtended has valid pdop, hdop, vdop. */
#define GPS_LOCATION_EXTENDED_HAS_DOP 0x0001
/** GpsLocationExtended has valid altitude mean sea level. */
#define GPS_LOCATION_EXTENDED_HAS_ALTITUDE_MEAN_SEA_LEVEL 0x0002
/** UlpLocation has valid magnetic deviation. */
#define GPS_LOCATION_EXTENDED_HAS_MAG_DEV 0x0004
/** UlpLocation has valid mode indicator. */
#define GPS_LOCATION_EXTENDED_HAS_MODE_IND 0x0008
/** GpsLocationExtended has valid vertical uncertainty */
#define GPS_LOCATION_EXTENDED_HAS_VERT_UNC 0x0010
/** GpsLocationExtended has valid speed uncertainty */
#define GPS_LOCATION_EXTENDED_HAS_SPEED_UNC 0x0020
/** Represents gps location extended. */
typedef struct {
/** set to sizeof(GpsLocationExtended) */
size_t size;
/** Contains GpsLocationExtendedFlags bits. */
uint16_t flags;
/** Contains the Altitude wrt mean sea level */
float altitudeMeanSeaLevel;
/** Contains Position Dilusion of Precision. */
float pdop;
/** Contains Horizontal Dilusion of Precision. */
float hdop;
/** Contains Vertical Dilusion of Precision. */
float vdop;
/** Contains Magnetic Deviation. */
float magneticDeviation;
/** vertical uncertainty in meters */
float vert_unc;
/** speed uncertainty in m/s */
float speed_unc;
} GpsLocationExtended;
typedef enum {
LOC_ENG_IF_REQUEST_TYPE_SUPL = 0,
LOC_ENG_IF_REQUEST_TYPE_WIFI,
LOC_ENG_IF_REQUEST_TYPE_ANY
} loc_if_req_type_e_type;
typedef enum {
LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC = 0,
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM,
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU,
LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON,
LOC_ENG_IF_REQUEST_SENDER_ID_MODEM,
LOC_ENG_IF_REQUEST_SENDER_ID_UNKNOWN
} loc_if_req_sender_id_e_type;
struct loc_eng_msg { struct loc_eng_msg {
const void* owner; const void* owner;
@ -176,153 +72,6 @@ struct loc_eng_msg {
} }
}; };
struct loc_eng_msg_a_glonass_protocol : public loc_eng_msg {
const unsigned long a_glonass_protocol;
inline loc_eng_msg_a_glonass_protocol(void* instance, unsigned long protocol) :
loc_eng_msg(instance, LOC_ENG_MSG_A_GLONASS_PROTOCOL),
a_glonass_protocol(protocol)
{
LOC_LOGV("A-GLONASS protocol: 0x%lx", protocol);
}
};
struct loc_eng_msg_suple_version : public loc_eng_msg {
const int supl_version;
inline loc_eng_msg_suple_version(void* instance, int version) :
loc_eng_msg(instance, LOC_ENG_MSG_SUPL_VERSION),
supl_version(version)
{
LOC_LOGV("SUPL Version: %d", version);
}
};
struct loc_eng_msg_lpp_config : public loc_eng_msg {
const int lpp_config;
inline loc_eng_msg_lpp_config(void *instance, int profile) :
loc_eng_msg(instance, LOC_ENG_MSG_LPP_CONFIG),
lpp_config(profile)
{
LOC_LOGV("lpp profile: %d", profile);
}
};
struct loc_eng_msg_ext_power_config : public loc_eng_msg {
const int isBatteryCharging;
inline loc_eng_msg_ext_power_config(void* instance, int isBattCharging) :
loc_eng_msg(instance, LOC_ENG_MSG_EXT_POWER_CONFIG),
isBatteryCharging(isBattCharging)
{
LOC_LOGV("isBatteryCharging: %d", isBatteryCharging);
}
};
struct loc_eng_msg_sensor_control_config : public loc_eng_msg {
const int sensorsDisabled;
inline loc_eng_msg_sensor_control_config(void* instance, int disabled) :
loc_eng_msg(instance, LOC_ENG_MSG_SET_SENSOR_CONTROL_CONFIG),
sensorsDisabled(disabled)
{
LOC_LOGV("Sensors Disabled: %d", disabled);
}
};
struct loc_eng_msg_sensor_properties : public loc_eng_msg {
const bool gyroBiasVarianceRandomWalk_valid;
const float gyroBiasVarianceRandomWalk;
const bool accelRandomWalk_valid;
const float accelRandomWalk;
const bool angleRandomWalk_valid;
const float angleRandomWalk;
const bool rateRandomWalk_valid;
const float rateRandomWalk;
const bool velocityRandomWalk_valid;
const float velocityRandomWalk;
inline loc_eng_msg_sensor_properties(void* instance, bool gyroBiasRandomWalk_valid, float gyroBiasRandomWalk,
bool accelRandomWalk_valid, float accelRandomWalk,
bool angleRandomWalk_valid, float angleRandomWalk,
bool rateRandomWalk_valid, float rateRandomWalk,
bool velocityRandomWalk_valid, float velocityRandomWalk) :
loc_eng_msg(instance, LOC_ENG_MSG_SET_SENSOR_PROPERTIES),
gyroBiasVarianceRandomWalk_valid(gyroBiasRandomWalk_valid),
gyroBiasVarianceRandomWalk(gyroBiasRandomWalk),
accelRandomWalk_valid(accelRandomWalk_valid),
accelRandomWalk(accelRandomWalk),
angleRandomWalk_valid(angleRandomWalk_valid),
angleRandomWalk(angleRandomWalk),
rateRandomWalk_valid(rateRandomWalk_valid),
rateRandomWalk(rateRandomWalk),
velocityRandomWalk_valid(velocityRandomWalk_valid),
velocityRandomWalk(velocityRandomWalk)
{
LOC_LOGV("Sensor properties validity, Gyro Random walk: %d Accel Random Walk: %d "
"Angle Random Walk: %d Rate Random Walk: %d "
"Velocity Random Walk: %d",
gyroBiasRandomWalk_valid,
accelRandomWalk_valid,
angleRandomWalk_valid,
rateRandomWalk_valid,
velocityRandomWalk_valid
);
LOC_LOGV("Sensor properties, Gyro Random walk: %f Accel Random Walk: %f "
"Angle Random Walk: %f Rate Random Walk: %f "
"Velocity Random Walk: %f",
gyroBiasRandomWalk,
accelRandomWalk,
angleRandomWalk,
rateRandomWalk,
velocityRandomWalk
);
}
};
struct loc_eng_msg_sensor_perf_control_config : public loc_eng_msg {
const int controlMode;
const int accelSamplesPerBatch;
const int accelBatchesPerSec;
const int gyroSamplesPerBatch;
const int gyroBatchesPerSec;
const int accelSamplesPerBatchHigh;
const int accelBatchesPerSecHigh;
const int gyroSamplesPerBatchHigh;
const int gyroBatchesPerSecHigh;
const int algorithmConfig;
inline loc_eng_msg_sensor_perf_control_config(void* instance, int controlMode,
int accelSamplesPerBatch, int accelBatchesPerSec,
int gyroSamplesPerBatch, int gyroBatchesPerSec,
int accelSamplesPerBatchHigh, int accelBatchesPerSecHigh,
int gyroSamplesPerBatchHigh, int gyroBatchesPerSecHigh,
int algorithmConfig) :
loc_eng_msg(instance, LOC_ENG_MSG_SET_SENSOR_PERF_CONTROL_CONFIG),
controlMode(controlMode),
accelSamplesPerBatch(accelSamplesPerBatch),
accelBatchesPerSec(accelBatchesPerSec),
gyroSamplesPerBatch(gyroSamplesPerBatch),
gyroBatchesPerSec(gyroBatchesPerSec),
accelSamplesPerBatchHigh(accelSamplesPerBatchHigh),
accelBatchesPerSecHigh(accelBatchesPerSecHigh),
gyroSamplesPerBatchHigh(gyroSamplesPerBatchHigh),
gyroBatchesPerSecHigh(gyroBatchesPerSecHigh),
algorithmConfig(algorithmConfig)
{
LOC_LOGV("Sensor Perf Control Config (performanceControlMode)(%u) "
"accel(#smp,#batches) (%u,%u) gyro(#smp,#batches) (%u,%u), "
"accel_high(#smp,#batches) (%u,%u) gyro_high(#smp,#batches) (%u,%u), "
"algorithmConfig(%u)\n",
controlMode,
accelSamplesPerBatch,
accelBatchesPerSec,
gyroSamplesPerBatch,
gyroBatchesPerSec,
accelSamplesPerBatchHigh,
accelBatchesPerSecHigh,
gyroSamplesPerBatchHigh,
gyroBatchesPerSecHigh,
algorithmConfig
);
}
};
struct loc_eng_msg_position_mode : public loc_eng_msg { struct loc_eng_msg_position_mode : public loc_eng_msg {
const LocPosMode pMode; const LocPosMode pMode;
inline loc_eng_msg_position_mode(void* instance, inline loc_eng_msg_position_mode(void* instance,
@ -334,45 +83,6 @@ struct loc_eng_msg_position_mode : public loc_eng_msg {
} }
}; };
struct loc_eng_msg_set_time : public loc_eng_msg {
const GpsUtcTime time;
const int64_t timeReference;
const int uncertainty;
inline loc_eng_msg_set_time(void* instance,
GpsUtcTime t,
int64_t tf,
int unc) :
loc_eng_msg(instance, LOC_ENG_MSG_SET_TIME),
time(t), timeReference(tf), uncertainty(unc)
{
LOC_LOGV("time: %lld\n timeReference: %lld\n uncertainty: %d",
time, timeReference, uncertainty);
}
};
struct loc_eng_msg_inject_location : public loc_eng_msg {
const double latitude;
const double longitude;
const float accuracy;
inline loc_eng_msg_inject_location(void* instance, double lat,
double longi, float accur) :
loc_eng_msg(instance, LOC_ENG_MSG_INJECT_LOCATION),
latitude(lat), longitude(longi), accuracy(accur)
{
LOC_LOGV("latitude: %f\n longitude: %f\n accuracy: %f",
latitude, longitude, accuracy);
}
};
struct loc_eng_msg_delete_aiding_data : public loc_eng_msg {
const GpsAidingData type;
inline loc_eng_msg_delete_aiding_data(void* instance, GpsAidingData data) :
loc_eng_msg(instance, LOC_ENG_MSG_DELETE_AIDING_DATA), type(data)
{
LOC_LOGV("aiding data msak %d", type);
}
};
struct loc_eng_msg_report_position : public loc_eng_msg { struct loc_eng_msg_report_position : public loc_eng_msg {
const UlpLocation location; const UlpLocation location;
const GpsLocationExtended locationExtended; const GpsLocationExtended locationExtended;
@ -427,438 +137,232 @@ struct loc_eng_msg_report_sv : public loc_eng_msg {
} }
}; };
struct loc_eng_msg_report_status : public loc_eng_msg {
const GpsStatusValue status; struct LocEngPositionMode : public LocMsg {
inline loc_eng_msg_report_status(void* instance, GpsStatusValue engineStatus) : LocEngAdapter* mAdapter;
loc_eng_msg(instance, LOC_ENG_MSG_REPORT_STATUS), status(engineStatus) const LocPosMode mPosMode;
{ LocEngPositionMode(LocEngAdapter* adapter,
LOC_LOGV("status: %s", loc_get_gps_status_name(status)); LocPosMode &mode);
} virtual void proc() const;
virtual void log() const;
void send() const;
}; };
struct loc_eng_msg_report_nmea : public loc_eng_msg {
char* const nmea; struct LocEngStartFix : public LocMsg {
const int length; loc_eng_data_s_type* mLocEng;
inline loc_eng_msg_report_nmea(void* instance, LocEngStartFix(loc_eng_data_s_type* locEng);
const char* data, virtual void proc() const;
int len) : void locallog() const;
loc_eng_msg(instance, LOC_ENG_MSG_REPORT_NMEA), virtual void log() const;
nmea(new char[len]), length(len) void send() const;
{
memcpy((void*)nmea, (void*)data, len);
LOC_LOGV("length: %d\n nmea: %p - %c%c%c",
length, nmea, nmea[3], nmea[4], nmea[5]);
}
inline ~loc_eng_msg_report_nmea()
{
delete[] nmea;
}
}; };
struct loc_eng_msg_report_xtra_server : public loc_eng_msg { struct LocEngStopFix : public LocMsg {
char *server1; loc_eng_data_s_type* mLocEng;
char *server2; LocEngStopFix(loc_eng_data_s_type* locEng);
char *server3; virtual void proc() const;
inline loc_eng_msg_report_xtra_server(void *instance, void locallog() const;
const char *url1, virtual void log() const;
const char *url2, void send() const;
const char *url3,
const int maxlength) :
loc_eng_msg(instance, LOC_ENG_MSG_REPORT_XTRA_SERVER),
server1(new char[maxlength+1]), server2(new char[maxlength+1]), server3(new char[maxlength+1])
{
strlcpy(server1, url1, maxlength);
strlcpy(server2, url2, maxlength);
strlcpy(server3, url3, maxlength);
LOC_LOGV("maxlength: %d\n server1: %s\n server2: %s\n server3: %s\n",
maxlength, server1, server2, server3);
}
inline ~loc_eng_msg_report_xtra_server()
{
delete[] server1;
delete[] server2;
delete[] server3;
}
}; };
struct loc_eng_msg_request_bit : public loc_eng_msg { struct LocEngReportPosition : public LocMsg {
const loc_if_req_type_e_type ifType; void* mLocEng;
const int ipv4Addr; const UlpLocation mLocation;
char* const ipv6Addr; const GpsLocationExtended mLocationExtended;
inline loc_eng_msg_request_bit(void* instance, const void* mLocationExt;
loc_if_req_type_e_type type, const enum loc_sess_status mStatus;
int ipv4, const LocPosTechMask mTechMask;
char* ipv6) : LocEngReportPosition(void* locEng,
loc_eng_msg(instance, LOC_ENG_MSG_REQUEST_BIT), UlpLocation &loc,
ifType(type), ipv4Addr(ipv4), GpsLocationExtended &locExtended,
ipv6Addr(NULL == ipv6 ? NULL : new char[16]) void* locExt,
{ enum loc_sess_status st,
if (NULL != ipv6Addr) LocPosTechMask technology);
memcpy(ipv6Addr, ipv6, 16); virtual void proc() const;
LOC_LOGV("ifType: %d, ipv4: %d.%d.%d.%d, ipv6: %s", ifType, void locallog() const;
(unsigned char)(ipv4>>24), virtual void log() const;
(unsigned char)(ipv4>>16), void send() const;
(unsigned char)(ipv4>>8),
(unsigned char)ipv4,
NULL != ipv6Addr ? ipv6Addr : "");
}
inline ~loc_eng_msg_request_bit()
{
if (NULL != ipv6Addr) {
delete[] ipv6Addr;
}
}
}; };
struct loc_eng_msg_request_wifi : public loc_eng_msg { struct LocEngReportSv : public LocMsg {
const loc_if_req_type_e_type ifType; void* mLocEng;
const loc_if_req_sender_id_e_type senderId; const GpsSvStatus mSvStatus;
char* const ssid; const GpsLocationExtended mLocationExtended;
char* const password; const void* mSvExt;
inline loc_eng_msg_request_wifi(void* instance, LocEngReportSv(void* locEng,
loc_if_req_type_e_type type, GpsSvStatus &sv,
GpsLocationExtended &locExtended,
void* svExtended);
virtual void proc() const;
void locallog() const;
virtual void log() const;
void send() const;
};
struct LocEngReportStatus : public LocMsg {
void* mLocEng;
const GpsStatusValue mStatus;
LocEngReportStatus(void* locEng,
GpsStatusValue engineStatus);
virtual void proc() const;
void locallog() const;
virtual void log() const;
};
struct LocEngReportNmea : public LocMsg {
void* mLocEng;
char* const mNmea;
const int mLen;
LocEngReportNmea(void* locEng,
const char* data, int len);
inline virtual ~LocEngReportNmea()
{
delete[] mNmea;
}
virtual void proc() const;
void locallog() const;
virtual void log() const;
};
struct LocEngReportXtraServer : public LocMsg {
void* mLocEng;
int mMaxLen;
char *mServers;
LocEngReportXtraServer(void* locEng,
const char *url1, const char *url2,
const char *url3, const int maxlength);
inline virtual ~LocEngReportXtraServer()
{
delete[] mServers;
}
virtual void proc() const;
void locallog() const;
virtual void log() const;
};
struct LocEngSuplEsOpened : public LocMsg {
void* mLocEng;
LocEngSuplEsOpened(void* locEng);
virtual void proc() const;
void locallog() const;
virtual void log() const;
};
struct LocEngSuplEsClosed : public LocMsg {
void* mLocEng;
LocEngSuplEsClosed(void* locEng);
virtual void proc() const;
void locallog() const;
virtual void log() const;
};
struct LocEngRequestSuplEs : public LocMsg {
void* mLocEng;
const int mID;
LocEngRequestSuplEs(void* locEng, int id);
virtual void proc() const;
void locallog() const;
virtual void log() const;
};
struct LocEngRequestATL : public LocMsg {
void* mLocEng;
const int mID;
const AGpsExtType mType;
LocEngRequestATL(void* locEng, int id,
AGpsExtType agps_type);
virtual void proc() const;
void locallog() const;
virtual void log() const;
};
struct LocEngReleaseATL : public LocMsg {
void* mLocEng;
const int mID;
LocEngReleaseATL(void* locEng, int id);
virtual void proc() const;
void locallog() const;
virtual void log() const;
};
struct LocEngReqRelBIT : public LocMsg {
void* mLocEng;
const AGpsExtType mType;
const int mIPv4Addr;
char* const mIPv6Addr;
const bool mIsReq;
LocEngReqRelBIT(void* instance, AGpsExtType type,
int ipv4, char* ipv6, bool isReq);
virtual ~LocEngReqRelBIT();
virtual void proc() const;
void locallog() const;
virtual void log() const;
void send() const;
};
struct LocEngReqRelWifi : public LocMsg {
void* mLocEng;
const AGpsExtType mType;
const loc_if_req_sender_id_e_type mSenderId;
char* const mSSID;
char* const mPassword;
const bool mIsReq;
LocEngReqRelWifi(void* locEng, AGpsExtType type,
loc_if_req_sender_id_e_type sender_id, loc_if_req_sender_id_e_type sender_id,
char* s, char* s, char* p, bool isReq);
char* p) : virtual ~LocEngReqRelWifi();
loc_eng_msg(instance, LOC_ENG_MSG_REQUEST_WIFI), virtual void proc() const;
ifType(type), senderId(sender_id), void locallog() const;
ssid(NULL == s ? NULL : new char[SSID_BUF_SIZE]), virtual void log() const;
password(NULL == p ? NULL : new char[SSID_BUF_SIZE]) void send() const;
{
if (NULL != ssid)
strlcpy(ssid, s, SSID_BUF_SIZE);
if (NULL != password)
strlcpy(password, p, SSID_BUF_SIZE);
LOC_LOGV("ifType: %d, senderId: %d, ssid: %s, password: %s",
ifType,
senderId,
NULL != ssid ? ssid : "",
NULL != password ? password : "");
}
inline ~loc_eng_msg_request_wifi()
{
if (NULL != ssid) {
delete[] ssid;
}
if (NULL != password) {
delete[] password;
}
}
}; };
struct loc_eng_msg_release_bit : public loc_eng_msg { struct LocEngRequestXtra : public LocMsg {
const loc_if_req_type_e_type ifType; void* mLocEng;
const int ipv4Addr; LocEngRequestXtra(void* locEng);
char* const ipv6Addr; virtual void proc() const;
inline loc_eng_msg_release_bit(void* instance, void locallog() const;
loc_if_req_type_e_type type, virtual void log() const;
int ipv4,
char* ipv6) :
loc_eng_msg(instance, LOC_ENG_MSG_RELEASE_BIT),
ifType(type), ipv4Addr(ipv4),
ipv6Addr(NULL == ipv6 ? NULL : new char[16])
{
if (NULL != ipv6Addr)
memcpy(ipv6Addr, ipv6, 16);
LOC_LOGV("ifType: %d, ipv4: %d.%d.%d.%d, ipv6: %s", ifType,
(unsigned char)(ipv4>>24),
(unsigned char)(ipv4>>16),
(unsigned char)(ipv4>>8),
(unsigned char)ipv4,
NULL != ipv6Addr ? ipv6Addr : "");
}
inline ~loc_eng_msg_release_bit()
{
if (NULL != ipv6Addr) {
delete[] ipv6Addr;
}
}
}; };
struct loc_eng_msg_release_wifi : public loc_eng_msg { struct LocEngRequestTime : public LocMsg {
const loc_if_req_type_e_type ifType; void* mLocEng;
const loc_if_req_sender_id_e_type senderId; LocEngRequestTime(void* locEng);
char* const ssid; virtual void proc() const;
char* const password; void locallog() const;
inline loc_eng_msg_release_wifi(void* instance, virtual void log() const;
loc_if_req_type_e_type type,
loc_if_req_sender_id_e_type sender_id,
char* s,
char* p) :
loc_eng_msg(instance, LOC_ENG_MSG_RELEASE_WIFI),
ifType(type), senderId(sender_id),
ssid(NULL == s ? NULL : new char[SSID_BUF_SIZE]),
password(NULL == p ? NULL : new char[SSID_BUF_SIZE])
{
if (NULL != s)
strlcpy(ssid, s, SSID_BUF_SIZE);
if (NULL != p)
strlcpy(password, p, SSID_BUF_SIZE);
LOC_LOGV("ifType: %d, senderId: %d, ssid: %s, password: %s",
ifType,
senderId,
NULL != ssid ? ssid : "",
NULL != password ? password : "");
}
inline ~loc_eng_msg_release_wifi()
{
if (NULL != ssid) {
delete[] ssid;
}
if (NULL != password) {
delete[] password;
}
}
}; };
struct loc_eng_msg_request_atl : public loc_eng_msg { struct LocEngRequestNi : public LocMsg {
const int handle; void* mLocEng;
const AGpsType type; const GpsNiNotification mNotify;
inline loc_eng_msg_request_atl(void* instance, int hndl, const void *mPayload;
AGpsType agps_type) : LocEngRequestNi(void* locEng,
loc_eng_msg(instance, LOC_ENG_MSG_REQUEST_ATL), GpsNiNotification &notif,
handle(hndl), type(agps_type) const void* data);
{ virtual void proc() const;
LOC_LOGV("handle: %d\n agps type: %s", void locallog() const;
handle, virtual void log() const;
loc_get_agps_type_name(type));
}
}; };
struct loc_eng_msg_request_supl_es : public loc_eng_msg { struct LocEngDown : public LocMsg {
const int handle; void* mLocEng;
inline loc_eng_msg_request_supl_es(void* instance, int hndl) : LocEngDown(void* locEng);
loc_eng_msg(instance, LOC_ENG_MSG_REQUEST_SUPL_ES), virtual void proc() const;
handle(hndl) void locallog() const;
{ virtual void log() const;
LOC_LOGV("handle: %d\n", handle);
}
}; };
struct loc_eng_msg_close_data_call: public loc_eng_msg { struct LocEngUp : public LocMsg {
inline loc_eng_msg_close_data_call(void *instance) : void* mLocEng;
loc_eng_msg(instance, LOC_ENG_MSG_CLOSE_DATA_CALL) LocEngUp(void* locEng);
{ virtual void proc() const;
LOC_LOGV("%s:%d]Close data call: ", __func__, __LINE__); void locallog() const;
} virtual void log() const;
};
struct loc_eng_msg_release_atl : public loc_eng_msg {
const int handle;
inline loc_eng_msg_release_atl(void* instance, int hndl) :
loc_eng_msg(instance, LOC_ENG_MSG_RELEASE_ATL), handle(hndl)
{
LOC_LOGV("handle: %d", handle);
}
}; };
struct loc_eng_msg_request_ni : public loc_eng_msg {
const GpsNiNotification notify;
const void *passThroughData;
inline loc_eng_msg_request_ni(void* instance,
GpsNiNotification &notif, const void* data) :
loc_eng_msg(instance, LOC_ENG_MSG_REQUEST_NI),
notify(notif), passThroughData(data)
{
LOC_LOGV("id: %d\n type: %s\n flags: %d\n time out: %d\n default response: %s\n requestor id encoding: %s\n text encoding: %s\n passThroughData: %p",
notify.notification_id,
loc_get_ni_type_name(notify.ni_type),
notify.notify_flags,
notify.timeout,
loc_get_ni_response_name(notify.default_response),
loc_get_ni_encoding_name(notify.requestor_id_encoding),
loc_get_ni_encoding_name(notify.text_encoding),
passThroughData);
}
};
struct loc_eng_msg_inform_ni_response : public loc_eng_msg {
const GpsUserResponseType response;
const void *passThroughData;
inline loc_eng_msg_inform_ni_response(void* instance,
GpsUserResponseType resp,
const void* data) :
loc_eng_msg(instance, LOC_ENG_MSG_INFORM_NI_RESPONSE),
response(resp), passThroughData(data)
{
LOC_LOGV("response: %s\n passThroughData: %p",
loc_get_ni_response_name(response),
passThroughData);
}
inline ~loc_eng_msg_inform_ni_response()
{
// this is a bit weird since passThroughData is not
// allocated by this class. But there is no better way.
// passThroughData actually won't be NULL here.
// But better safer than sorry.
if (NULL != passThroughData) {
free((void*)passThroughData);
}
}
};
struct loc_eng_msg_set_apn : public loc_eng_msg {
char* const apn;
inline loc_eng_msg_set_apn(void* instance, const char* name, int len) :
loc_eng_msg(instance, LOC_ENG_MSG_SET_APN),
apn(new char[len+1])
{
memcpy((void*)apn, (void*)name, len);
apn[len] = 0;
LOC_LOGV("apn: %s", apn);
}
inline ~loc_eng_msg_set_apn()
{
delete[] apn;
}
};
struct loc_eng_msg_set_server_ipv4 : public loc_eng_msg {
const unsigned int nl_addr;
const int port;
const LocServerType serverType;
inline loc_eng_msg_set_server_ipv4(void* instance,
unsigned int ip,
int p,
LocServerType type) :
loc_eng_msg(instance, LOC_ENG_MSG_SET_SERVER_IPV4),
nl_addr(ip), port(p), serverType(type)
{
LOC_LOGV("addr: %x\n , port: %d\n type: %s", nl_addr, port, loc_get_server_type_name(serverType));
}
};
struct loc_eng_msg_set_server_url : public loc_eng_msg {
const int len;
char* const url;
inline loc_eng_msg_set_server_url(void* instance,
const char* urlString,
int url_len) :
loc_eng_msg(instance, LOC_ENG_MSG_SET_SERVER_URL),
len(url_len), url(new char[len+1])
{
memcpy((void*)url, (void*)urlString, url_len);
url[len] = 0;
LOC_LOGV("url: %s", url);
}
inline ~loc_eng_msg_set_server_url()
{
delete[] url;
}
};
struct loc_eng_msg_inject_xtra_data : public loc_eng_msg {
char* const data;
const int length;
inline loc_eng_msg_inject_xtra_data(void* instance, char* d, int l) :
loc_eng_msg(instance, LOC_ENG_MSG_INJECT_XTRA_DATA),
data(new char[l]), length(l)
{
memcpy((void*)data, (void*)d, l);
LOC_LOGV("length: %d\n data: %p", length, data);
}
inline ~loc_eng_msg_inject_xtra_data()
{
delete[] data;
}
};
struct loc_eng_msg_request_xtra_server : public loc_eng_msg {
inline loc_eng_msg_request_xtra_server(void *instance) :
loc_eng_msg(instance, LOC_ENG_MSG_REQUEST_XTRA_SERVER)
{
}
};
struct loc_eng_msg_atl_open_success : public loc_eng_msg {
const AGpsType agpsType;
const int length;
char* const apn;
const AGpsBearerType bearerType;
inline loc_eng_msg_atl_open_success(void* instance,
AGpsType atype,
const char* name,
int len,
AGpsBearerType btype) :
loc_eng_msg(instance, LOC_ENG_MSG_ATL_OPEN_SUCCESS),
agpsType(atype), length(len),
apn(new char[len+1]), bearerType(btype)
{
memcpy((void*)apn, (void*)name, len);
apn[len] = 0;
LOC_LOGV("agps type: %s\n apn: %s\n bearer type: %s",
loc_get_agps_type_name(agpsType),
apn,
loc_get_agps_bear_name(bearerType));
}
inline ~loc_eng_msg_atl_open_success()
{
delete[] apn;
}
};
struct loc_eng_msg_atl_open_failed : public loc_eng_msg {
const AGpsStatusValue agpsType;
inline loc_eng_msg_atl_open_failed(void* instance,
AGpsStatusValue atype) :
loc_eng_msg(instance, LOC_ENG_MSG_ATL_OPEN_FAILED),
agpsType(atype)
{
LOC_LOGV("agps type %s",
loc_get_agps_type_name(agpsType));
}
};
struct loc_eng_msg_atl_closed : public loc_eng_msg {
const AGpsType agpsType;
inline loc_eng_msg_atl_closed(void* instance,
AGpsType atype) :
loc_eng_msg(instance, LOC_ENG_MSG_ATL_CLOSED),
agpsType(atype)
{
LOC_LOGV("agps type %s",
loc_get_agps_type_name(agpsType));
}
};
struct loc_eng_msg_set_data_enable : public loc_eng_msg {
const int enable;
char* const apn;
const int length;
inline loc_eng_msg_set_data_enable(void* instance,
const char* name,
int len,
int yes) :
loc_eng_msg(instance, LOC_ENG_MSG_ENABLE_DATA),
enable(yes), apn(new char[len+1]), length(len)
{
memcpy((void*)apn, (void*)name, len);
apn[len] = 0;
LOC_LOGV("apn: %s\n enable: %d", apn, enable);
}
inline ~loc_eng_msg_set_data_enable()
{
delete[] apn;
}
};
void loc_eng_msg_sender(void* loc_eng_data_p, void* msg);
int loc_eng_msgget(int * p_req_msgq);
int loc_eng_msgremove(int req_msgq);
int loc_eng_msgsnd(int msgqid, void * msgp);
int loc_eng_msgrcv(int msgqid, void ** msgp);
int loc_eng_msgsnd_raw(int msgqid, void * msgp, unsigned int msgsz);
int loc_eng_msgrcv_raw(int msgqid, void *msgp, unsigned int msgsz);
int loc_eng_msgflush(int msgqid);
int loc_eng_msgunblock(int msgqid);
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -39,11 +39,15 @@
#include <ctype.h> #include <ctype.h>
#include <unistd.h> #include <unistd.h>
#include <time.h> #include <time.h>
#include <MsgTask.h>
#include <loc_eng.h> #include <loc_eng.h>
#include "log_util.h" #include "log_util.h"
#include "platform_lib_includes.h" #include "platform_lib_includes.h"
using namespace loc_core;
/*============================================================================= /*=============================================================================
* *
* DATA DECLARATION * DATA DECLARATION
@ -57,6 +61,42 @@
*============================================================================*/ *============================================================================*/
static void* ni_thread_proc(void *args); static void* ni_thread_proc(void *args);
struct LocEngInformNiResponse : public LocMsg {
LocEngAdapter* mAdapter;
const GpsUserResponseType mResponse;
const void *mPayload;
inline LocEngInformNiResponse(LocEngAdapter* adapter,
GpsUserResponseType resp,
const void* data) :
LocMsg(), mAdapter(adapter),
mResponse(resp), mPayload(data)
{
locallog();
}
inline ~LocEngInformNiResponse()
{
// this is a bit weird since mPayload is not
// allocated by this class. But there is no better way.
// mPayload actually won't be NULL here.
free((void*)mPayload);
}
inline virtual void proc() const
{
mAdapter->informNiResponse(mResponse, mPayload);
}
inline void locallog() const
{
LOC_LOGV("LocEngInformNiResponse - "
"response: %s\n mPayload: %p",
loc_get_ni_response_name(mResponse),
mPayload);
}
inline virtual void log() const
{
locallog();
}
};
/*=========================================================================== /*===========================================================================
FUNCTION loc_eng_ni_request_handler FUNCTION loc_eng_ni_request_handler
@ -179,13 +219,13 @@ static void* ni_thread_proc(void *args)
loc_eng_ni_data_p->respRecvd = FALSE; /* Reset the user response flag for the next session*/ loc_eng_ni_data_p->respRecvd = FALSE; /* Reset the user response flag for the next session*/
// adding this check to support modem restart, in which case, we need the thread // adding this check to support modem restart, in which case, we need the thread
// to exit without calling sending data to loc_eng_msg_q. We made sure that // to exit without calling sending data. We made sure that rawRequest is NULL in
// rawRequest is NULL in loc_eng_ni_reset_on_engine_restart() // loc_eng_ni_reset_on_engine_restart()
loc_eng_msg_inform_ni_response *msg = NULL; LocEngAdapter* adapter = loc_eng_data_p->adapter;
LocEngInformNiResponse *msg = NULL;
if (NULL != loc_eng_ni_data_p->rawRequest) { if (NULL != loc_eng_ni_data_p->rawRequest) {
loc_eng_data_s_type *loc_eng_data_p = (loc_eng_data_s_type*)args; msg = new LocEngInformNiResponse(adapter,
msg = new loc_eng_msg_inform_ni_response(loc_eng_data_p,
loc_eng_ni_data_p->resp, loc_eng_ni_data_p->resp,
loc_eng_ni_data_p->rawRequest); loc_eng_ni_data_p->rawRequest);
loc_eng_ni_data_p->rawRequest = NULL; loc_eng_ni_data_p->rawRequest = NULL;
@ -196,7 +236,7 @@ static void* ni_thread_proc(void *args)
loc_eng_ni_data_p->reqID++; loc_eng_ni_data_p->reqID++;
if (NULL != msg) { if (NULL != msg) {
loc_eng_msg_sender(loc_eng_data_p, msg); adapter->sendMsg(msg);
} }
EXIT_LOG(%s, VOID_RET); EXIT_LOG(%s, VOID_RET);

View file

@ -259,7 +259,7 @@ void loc_eng_nmea_generate_pos(loc_eng_data_s_type *loc_eng_data_p,
if (!(location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG)) if (!(location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG))
length = snprintf(pMarker, lengthRemaining, "%c", 'N'); // N means no fix length = snprintf(pMarker, lengthRemaining, "%c", 'N'); // N means no fix
else if (LOC_POSITION_MODE_STANDALONE == loc_eng_data_p->client_handle->getPositionMode().mode) else if (LOC_POSITION_MODE_STANDALONE == loc_eng_data_p->adapter->getPositionMode().mode)
length = snprintf(pMarker, lengthRemaining, "%c", 'A'); // A means autonomous length = snprintf(pMarker, lengthRemaining, "%c", 'A'); // A means autonomous
else else
length = snprintf(pMarker, lengthRemaining, "%c", 'D'); // D means differential length = snprintf(pMarker, lengthRemaining, "%c", 'D'); // D means differential
@ -412,7 +412,7 @@ void loc_eng_nmea_generate_pos(loc_eng_data_s_type *loc_eng_data_p,
if (!(location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG)) if (!(location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG))
length = snprintf(pMarker, lengthRemaining, "%c", 'N'); // N means no fix length = snprintf(pMarker, lengthRemaining, "%c", 'N'); // N means no fix
else if (LOC_POSITION_MODE_STANDALONE == loc_eng_data_p->client_handle->getPositionMode().mode) else if (LOC_POSITION_MODE_STANDALONE == loc_eng_data_p->adapter->getPositionMode().mode)
length = snprintf(pMarker, lengthRemaining, "%c", 'A'); // A means autonomous length = snprintf(pMarker, lengthRemaining, "%c", 'A'); // A means autonomous
else else
length = snprintf(pMarker, lengthRemaining, "%c", 'D'); // D means differential length = snprintf(pMarker, lengthRemaining, "%c", 'D'); // D means differential
@ -490,7 +490,7 @@ void loc_eng_nmea_generate_pos(loc_eng_data_s_type *loc_eng_data_p,
char gpsQuality; char gpsQuality;
if (!(location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG)) if (!(location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG))
gpsQuality = '0'; // 0 means no fix gpsQuality = '0'; // 0 means no fix
else if (LOC_POSITION_MODE_STANDALONE == loc_eng_data_p->client_handle->getPositionMode().mode) else if (LOC_POSITION_MODE_STANDALONE == loc_eng_data_p->adapter->getPositionMode().mode)
gpsQuality = '1'; // 1 means GPS fix gpsQuality = '1'; // 1 means GPS fix
else else
gpsQuality = '2'; // 2 means DGPS fix gpsQuality = '2'; // 2 means DGPS fix

View file

@ -31,10 +31,57 @@
#define LOG_TAG "LocSvc_eng" #define LOG_TAG "LocSvc_eng"
#include <loc_eng.h> #include <loc_eng.h>
#include <loc_eng_msg.h> #include <MsgTask.h>
#include "log_util.h" #include "log_util.h"
#include "platform_lib_includes.h" #include "platform_lib_includes.h"
using namespace loc_core;
struct LocEngRequestXtraServer : public LocMsg {
LocEngAdapter* mAdapter;
inline LocEngRequestXtraServer(LocEngAdapter* adapter) :
LocMsg(), mAdapter(adapter)
{
locallog();
}
inline virtual void proc() const {
mAdapter->requestXtraServer();
}
inline void locallog() const {
LOC_LOGV("LocEngRequestXtraServer");
}
inline virtual void log() const {
locallog();
}
};
struct LocEngInjectXtraData : public LocMsg {
LocEngAdapter* mAdapter;
char* mData;
const int mLen;
inline LocEngInjectXtraData(LocEngAdapter* adapter,
char* data, int len):
LocMsg(), mAdapter(adapter),
mData(new char[len]), mLen(len)
{
memcpy((void*)mData, (void*)data, len);
locallog();
}
inline ~LocEngInjectXtraData()
{
delete[] mData;
}
inline virtual void proc() const {
mAdapter->setXtraData(mData, mLen);
}
inline void locallog() const {
LOC_LOGV("length: %d\n data: %p", mLen, mData);
}
inline virtual void log() const {
locallog();
}
};
/*=========================================================================== /*===========================================================================
FUNCTION loc_eng_xtra_init FUNCTION loc_eng_xtra_init
@ -89,9 +136,8 @@ SIDE EFFECTS
int loc_eng_xtra_inject_data(loc_eng_data_s_type &loc_eng_data, int loc_eng_xtra_inject_data(loc_eng_data_s_type &loc_eng_data,
char* data, int length) char* data, int length)
{ {
loc_eng_msg_inject_xtra_data *msg(new loc_eng_msg_inject_xtra_data(&loc_eng_data, LocEngAdapter* adapter = loc_eng_data.adapter;
data, length)); adapter->sendMsg(new LocEngInjectXtraData(adapter, data, length));
loc_eng_msg_sender(&loc_eng_data, msg);
return 0; return 0;
} }
@ -113,12 +159,8 @@ SIDE EFFECTS
===========================================================================*/ ===========================================================================*/
int loc_eng_xtra_request_server(loc_eng_data_s_type &loc_eng_data) int loc_eng_xtra_request_server(loc_eng_data_s_type &loc_eng_data)
{ {
loc_eng_msg_request_xtra_server *msg(new loc_eng_msg_request_xtra_server(&loc_eng_data)); LocEngAdapter* adapter = loc_eng_data.adapter;
adapter->sendMsg(new LocEngRequestXtraServer(adapter));
if (NULL == msg)
return -1;
loc_eng_msg_sender(&loc_eng_data, msg);
return 0; return 0;