msm8974-common: gps: Import CAF HAL
* https://source.codeaurora.org/quic/la/platform/hardware/qcom/gps * Tag: LA.BF.1.1.3_rb1.13 Change-Id: Ied5197b459ccc51c8b7c8288a8b1d4a6839685e4
This commit is contained in:
parent
472c04c4d1
commit
9433f7ab16
50
gps/CleanSpec.mk
Normal file
50
gps/CleanSpec.mk
Normal file
@ -0,0 +1,50 @@
|
||||
# Copyright (C) 2007 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.
|
||||
#
|
||||
|
||||
# If you don't need to do a full clean build but would like to touch
|
||||
# a file or delete some intermediate files, add a clean step to the end
|
||||
# of the list. These steps will only be run once, if they haven't been
|
||||
# run before.
|
||||
#
|
||||
# E.g.:
|
||||
# $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
|
||||
# $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
|
||||
#
|
||||
# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
|
||||
# files that are missing or have been moved.
|
||||
#
|
||||
# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
|
||||
# Use $(OUT_DIR) to refer to the "out" directory.
|
||||
#
|
||||
# If you need to re-do something that's already mentioned, just copy
|
||||
# the command and add it to the bottom of the list. E.g., if a change
|
||||
# that you made last week required touching a file and a change you
|
||||
# made today requires touching the same file, just copy the old
|
||||
# touch step and add it to the end of the list.
|
||||
#
|
||||
# ************************************************
|
||||
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
|
||||
# ************************************************
|
||||
|
||||
# For example:
|
||||
#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
|
||||
#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
|
||||
#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
|
||||
#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
|
||||
|
||||
# ************************************************
|
||||
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
|
||||
# ************************************************
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libloc_api*)
|
10
gps/Makefile.am
Normal file
10
gps/Makefile.am
Normal file
@ -0,0 +1,10 @@
|
||||
# Makefile.am - Automake script for gps loc_api
|
||||
#
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
SUBDIRS = utils loc_api/libloc_api_50001 loc_api/loc_api_v02
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = loc-api.pc
|
||||
EXTRA_DIST = $(pkgconfig_DATA)
|
85
gps/configure.ac
Normal file
85
gps/configure.ac
Normal file
@ -0,0 +1,85 @@
|
||||
# configure.ac -- Autoconf script for gps loc_api
|
||||
#
|
||||
# Process this file with autoconf to produce a configure script
|
||||
|
||||
# Requires autoconf tool later than 2.61
|
||||
AC_PREREQ(2.61)
|
||||
# Initialize the gps loc_api package version 1.0.0
|
||||
AC_INIT([loc-api],1.0.0)
|
||||
# Does not strictly follow GNU Coding standards
|
||||
AM_INIT_AUTOMAKE([foreign])
|
||||
# Disables auto rebuilding of configure, Makefile.ins
|
||||
AM_MAINTAINER_MODE
|
||||
# Verifies the --srcdir is correct by checking for the path
|
||||
AC_CONFIG_SRCDIR([utils/loc_cfg.cpp])
|
||||
# defines some macros variable to be included by source
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
||||
# Checks for programs.
|
||||
AC_PROG_LIBTOOL
|
||||
AC_PROG_CXX
|
||||
AC_PROG_CC
|
||||
AM_PROG_CC_C_O
|
||||
AC_PROG_AWK
|
||||
AC_PROG_CPP
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_LN_S
|
||||
AC_PROG_MAKE_SET
|
||||
PKG_PROG_PKG_CONFIG
|
||||
|
||||
# Checks for libraries.
|
||||
PKG_CHECK_MODULES([QMIF], [qmi-framework])
|
||||
AC_SUBST([QMIF_CFLAGS])
|
||||
AC_SUBST([QMIF_LIBS])
|
||||
|
||||
AC_ARG_WITH([libhardware_includes],
|
||||
AC_HELP_STRING([--with-libhardware-includes=@<:@dir@:>@],
|
||||
[Specify the location of the libhardware headers]),
|
||||
[libhardware_incdir=$withval],
|
||||
with_libhardware_includes=no)
|
||||
|
||||
if test "x$with_libhardware_includes" != "xno"; then
|
||||
CPPFLAGS="${CPPFLAGS} -I${libhardware_incdir}"
|
||||
fi
|
||||
|
||||
AC_ARG_WITH([core_includes],
|
||||
AC_HELP_STRING([--with-core-includes=@<:@dir@:>@],
|
||||
[Specify the location of the core headers]),
|
||||
[core_incdir=$withval],
|
||||
with_core_includes=no)
|
||||
|
||||
if test "x$with_core_includes" != "xno"; then
|
||||
CPPFLAGS="${CPPFLAGS} -I${core_incdir}"
|
||||
fi
|
||||
|
||||
AC_SUBST([CPPFLAGS])
|
||||
|
||||
AC_ARG_WITH([glib],
|
||||
AC_HELP_STRING([--with-glib],
|
||||
[enable glib, building HLOS systems which use glib]))
|
||||
|
||||
if (test "x${with_glib}" = "xyes"); then
|
||||
AC_DEFINE(ENABLE_USEGLIB, 1, [Define if HLOS systems uses glib])
|
||||
PKG_CHECK_MODULES(GTHREAD, gthread-2.0 >= 2.16, dummy=yes,
|
||||
AC_MSG_ERROR(GThread >= 2.16 is required))
|
||||
PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.16, dummy=yes,
|
||||
AC_MSG_ERROR(GLib >= 2.16 is required))
|
||||
GLIB_CFLAGS="$GLIB_CFLAGS $GTHREAD_CFLAGS"
|
||||
GLIB_LIBS="$GLIB_LIBS $GTHREAD_LIBS"
|
||||
|
||||
AC_SUBST(GLIB_CFLAGS)
|
||||
AC_SUBST(GLIB_LIBS)
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(USE_GLIB, test "x${with_glib}" = "xyes")
|
||||
|
||||
AC_CONFIG_FILES([ \
|
||||
Makefile \
|
||||
utils/Makefile \
|
||||
loc_api/libloc_api_50001/Makefile \
|
||||
loc_api/loc_api_v02/Makefile \
|
||||
loc-api.pc \
|
||||
])
|
||||
|
||||
AC_OUTPUT
|
58
gps/core/Android.mk
Normal file
58
gps/core/Android.mk
Normal file
@ -0,0 +1,58 @@
|
||||
ifneq ($(BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE),)
|
||||
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
|
||||
|
||||
ifeq ($(TARGET_DEVICE),apq8026_lw)
|
||||
LOCAL_CFLAGS += -DPDK_FEATURE_SET
|
||||
else ifeq ($(BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET),true)
|
||||
LOCAL_CFLAGS += -DPDK_FEATURE_SET
|
||||
endif
|
||||
|
||||
LOCAL_SHARED_LIBRARIES := \
|
||||
libutils \
|
||||
libcutils \
|
||||
libgps.utils \
|
||||
libdl
|
||||
|
||||
LOCAL_SRC_FILES += \
|
||||
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 \
|
||||
$(TARGET_OUT_HEADERS)/libflp
|
||||
|
||||
LOCAL_COPY_HEADERS_TO:= libloc_core/
|
||||
LOCAL_COPY_HEADERS:= \
|
||||
LocApiBase.h \
|
||||
LocAdapterBase.h \
|
||||
ContextBase.h \
|
||||
LocDualContext.h \
|
||||
LBSProxyBase.h \
|
||||
UlpProxyBase.h \
|
||||
gps_extended_c.h \
|
||||
gps_extended.h \
|
||||
loc_core_log.h \
|
||||
LocAdapterProxyBase.h
|
||||
|
||||
LOCAL_PRELINK_MODULE := false
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
|
||||
endif # not BUILD_TINY_ANDROID
|
||||
endif # BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE
|
114
gps/core/ContextBase.cpp
Normal file
114
gps/core/ContextBase.cpp
Normal file
@ -0,0 +1,114 @@
|
||||
/* Copyright (c) 2011-2014, 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 <loc_target.h>
|
||||
#include <log_util.h>
|
||||
#include <loc_log.h>
|
||||
|
||||
namespace loc_core {
|
||||
|
||||
LBSProxyBase* ContextBase::getLBSProxy(const char* libName)
|
||||
{
|
||||
LBSProxyBase* proxy = NULL;
|
||||
LOC_LOGD("%s:%d]: getLBSProxy libname: %s\n", __func__, __LINE__, libName);
|
||||
void* lib = dlopen(libName, RTLD_NOW);
|
||||
|
||||
if ((void*)NULL != lib) {
|
||||
getLBSProxy_t* getter = (getLBSProxy_t*)dlsym(lib, "getLBSProxy");
|
||||
if (NULL != getter) {
|
||||
proxy = (*getter)();
|
||||
}
|
||||
}
|
||||
if (NULL == proxy) {
|
||||
proxy = new LBSProxyBase();
|
||||
}
|
||||
LOC_LOGD("%s:%d]: Exiting\n", __func__, __LINE__);
|
||||
return proxy;
|
||||
}
|
||||
|
||||
LocApiBase* ContextBase::createLocApi(LOC_API_ADAPTER_EVENT_MASK_T exMask)
|
||||
{
|
||||
LocApiBase* locApi = NULL;
|
||||
|
||||
// first if can not be MPQ
|
||||
if (TARGET_MPQ != loc_get_target()) {
|
||||
if (NULL == (locApi = mLBSProxy->getLocApi(mMsgTask, exMask, this))) {
|
||||
void *handle = NULL;
|
||||
//try to see if LocApiV02 is present
|
||||
if((handle = dlopen("libloc_api_v02.so", RTLD_NOW)) != NULL) {
|
||||
LOC_LOGD("%s:%d]: libloc_api_v02.so is present", __func__, __LINE__);
|
||||
getLocApi_t* getter = (getLocApi_t*)dlsym(handle, "getLocApi");
|
||||
if(getter != NULL) {
|
||||
LOC_LOGD("%s:%d]: getter is not NULL for LocApiV02", __func__, __LINE__);
|
||||
locApi = (*getter)(mMsgTask, exMask, this);
|
||||
}
|
||||
}
|
||||
// only RPC is the option now
|
||||
else {
|
||||
LOC_LOGD("%s:%d]: libloc_api_v02.so is NOT present. Trying RPC",
|
||||
__func__, __LINE__);
|
||||
handle = dlopen("libloc_api-rpc-qc.so", RTLD_NOW);
|
||||
if (NULL != handle) {
|
||||
getLocApi_t* getter = (getLocApi_t*)dlsym(handle, "getLocApi");
|
||||
if (NULL != getter) {
|
||||
LOC_LOGD("%s:%d]: getter is not NULL in RPC", __func__, __LINE__);
|
||||
locApi = (*getter)(mMsgTask, exMask, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// locApi could still be NULL at this time
|
||||
// we would then create a dummy one
|
||||
if (NULL == locApi) {
|
||||
locApi = new LocApiBase(mMsgTask, exMask, this);
|
||||
}
|
||||
|
||||
return locApi;
|
||||
}
|
||||
|
||||
ContextBase::ContextBase(const MsgTask* msgTask,
|
||||
LOC_API_ADAPTER_EVENT_MASK_T exMask,
|
||||
const char* libName) :
|
||||
mLBSProxy(getLBSProxy(libName)),
|
||||
mMsgTask(msgTask),
|
||||
mLocApi(createLocApi(exMask)),
|
||||
mLocApiProxy(mLocApi->getLocApiProxy())
|
||||
{
|
||||
}
|
||||
|
||||
}
|
74
gps/core/ContextBase.h
Normal file
74
gps/core/ContextBase.h
Normal file
@ -0,0 +1,74 @@
|
||||
/* Copyright (c) 2011-2015, 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>
|
||||
#include <LBSProxyBase.h>
|
||||
|
||||
namespace loc_core {
|
||||
|
||||
class LocAdapterBase;
|
||||
|
||||
class ContextBase {
|
||||
static LBSProxyBase* getLBSProxy(const char* libName);
|
||||
LocApiBase* createLocApi(LOC_API_ADAPTER_EVENT_MASK_T excludedMask);
|
||||
protected:
|
||||
const LBSProxyBase* mLBSProxy;
|
||||
const MsgTask* mMsgTask;
|
||||
LocApiBase* mLocApi;
|
||||
LocApiProxyBase *mLocApiProxy;
|
||||
public:
|
||||
ContextBase(const MsgTask* msgTask,
|
||||
LOC_API_ADAPTER_EVENT_MASK_T exMask,
|
||||
const char* libName);
|
||||
inline virtual ~ContextBase() { delete mLocApi; delete mLBSProxy; }
|
||||
|
||||
inline const MsgTask* getMsgTask() { return mMsgTask; }
|
||||
inline LocApiBase* getLocApi() { return mLocApi; }
|
||||
inline LocApiProxyBase* getLocApiProxy() { return mLocApiProxy; }
|
||||
inline bool hasAgpsExtendedCapabilities() { return mLBSProxy->hasAgpsExtendedCapabilities(); }
|
||||
inline bool hasCPIExtendedCapabilities() { return mLBSProxy->hasCPIExtendedCapabilities(); }
|
||||
inline void modemPowerVote(bool power) const { return mLBSProxy->modemPowerVote(power); }
|
||||
inline void requestUlp(LocAdapterBase* adapter,
|
||||
unsigned long capabilities) {
|
||||
mLBSProxy->requestUlp(adapter, capabilities);
|
||||
}
|
||||
inline IzatDevId_t getIzatDevId() const {
|
||||
return mLBSProxy->getIzatDevId();
|
||||
}
|
||||
inline void sendMsg(const LocMsg *msg) { getMsgTask()->sendMsg(msg); }
|
||||
};
|
||||
|
||||
} // namespace loc_core
|
||||
|
||||
#endif //__LOC_CONTEXT_BASE__
|
65
gps/core/LBSProxyBase.h
Normal file
65
gps/core/LBSProxyBase.h
Normal file
@ -0,0 +1,65 @@
|
||||
/* Copyright (c) 2013-2015, 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 IZAT_PROXY_BASE_H
|
||||
#define IZAT_PROXY_BASE_H
|
||||
#include <gps_extended.h>
|
||||
#include <MsgTask.h>
|
||||
|
||||
namespace loc_core {
|
||||
|
||||
class LocApiBase;
|
||||
class LocAdapterBase;
|
||||
class ContextBase;
|
||||
|
||||
class LBSProxyBase {
|
||||
friend class ContextBase;
|
||||
inline virtual LocApiBase*
|
||||
getLocApi(const MsgTask* msgTask,
|
||||
LOC_API_ADAPTER_EVENT_MASK_T exMask,
|
||||
ContextBase* context) const {
|
||||
return NULL;
|
||||
}
|
||||
protected:
|
||||
inline LBSProxyBase() {}
|
||||
public:
|
||||
inline virtual ~LBSProxyBase() {}
|
||||
inline virtual void requestUlp(LocAdapterBase* adapter,
|
||||
unsigned long capabilities) const {}
|
||||
inline virtual bool hasAgpsExtendedCapabilities() const { return false; }
|
||||
inline virtual bool hasCPIExtendedCapabilities() const { return false; }
|
||||
inline virtual void modemPowerVote(bool power) const {}
|
||||
virtual void injectFeatureConfig(ContextBase* context) const {}
|
||||
inline virtual IzatDevId_t getIzatDevId() const { return 0; }
|
||||
};
|
||||
|
||||
typedef LBSProxyBase* (getLBSProxy_t)();
|
||||
|
||||
} // namespace loc_core
|
||||
|
||||
#endif // IZAT_PROXY_BASE_H
|
142
gps/core/LocAdapterBase.cpp
Normal file
142
gps/core/LocAdapterBase.cpp
Normal file
@ -0,0 +1,142 @@
|
||||
/* Copyright (c) 2011-2014, 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>
|
||||
#include <LocAdapterProxyBase.h>
|
||||
|
||||
namespace loc_core {
|
||||
|
||||
// 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, LocAdapterProxyBase *adapterProxyBase) :
|
||||
mEvtMask(mask), mContext(context),
|
||||
mLocApi(context->getLocApi()), mLocAdapterProxyBase(adapterProxyBase),
|
||||
mMsgTask(context->getMsgTask())
|
||||
{
|
||||
mLocApi->addAdapter(this);
|
||||
}
|
||||
|
||||
void LocAdapterBase::handleEngineUpEvent()
|
||||
{
|
||||
if (mLocAdapterProxyBase) {
|
||||
mLocAdapterProxyBase->handleEngineUpEvent();
|
||||
}
|
||||
}
|
||||
|
||||
void LocAdapterBase::handleEngineDownEvent()
|
||||
{
|
||||
if (mLocAdapterProxyBase) {
|
||||
mLocAdapterProxyBase->handleEngineDownEvent();
|
||||
}
|
||||
}
|
||||
|
||||
void LocAdapterBase::
|
||||
reportPosition(UlpLocation &location,
|
||||
GpsLocationExtended &locationExtended,
|
||||
void* locationExt,
|
||||
enum loc_sess_status status,
|
||||
LocPosTechMask loc_technology_mask) {
|
||||
if (mLocAdapterProxyBase == NULL ||
|
||||
!mLocAdapterProxyBase->reportPosition(location,
|
||||
locationExtended,
|
||||
status,
|
||||
loc_technology_mask)) {
|
||||
DEFAULT_IMPL()
|
||||
}
|
||||
}
|
||||
|
||||
void LocAdapterBase::
|
||||
reportSv(GnssSvStatus &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 ¬ify, const void* data)
|
||||
DEFAULT_IMPL(false)
|
||||
|
||||
void LocAdapterBase::
|
||||
reportGpsMeasurementData(GpsData &gpsMeasurementData)
|
||||
DEFAULT_IMPL()
|
||||
} // namespace loc_core
|
119
gps/core/LocAdapterBase.h
Normal file
119
gps/core/LocAdapterBase.h
Normal file
@ -0,0 +1,119 @@
|
||||
/* Copyright (c) 2011-2014, 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 <UlpProxyBase.h>
|
||||
#include <ContextBase.h>
|
||||
|
||||
namespace loc_core {
|
||||
|
||||
class LocAdapterProxyBase;
|
||||
|
||||
class LocAdapterBase {
|
||||
protected:
|
||||
LOC_API_ADAPTER_EVENT_MASK_T mEvtMask;
|
||||
ContextBase* mContext;
|
||||
LocApiBase* mLocApi;
|
||||
LocAdapterProxyBase* mLocAdapterProxyBase;
|
||||
const MsgTask* mMsgTask;
|
||||
|
||||
inline LocAdapterBase(const MsgTask* msgTask) :
|
||||
mEvtMask(0), mContext(NULL), mLocApi(NULL),
|
||||
mLocAdapterProxyBase(NULL), mMsgTask(msgTask) {}
|
||||
public:
|
||||
inline virtual ~LocAdapterBase() { mLocApi->removeAdapter(this); }
|
||||
LocAdapterBase(const LOC_API_ADAPTER_EVENT_MASK_T mask,
|
||||
ContextBase* context, LocAdapterProxyBase *adapterProxyBase = NULL);
|
||||
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);
|
||||
}
|
||||
|
||||
inline void updateEvtMask(LOC_API_ADAPTER_EVENT_MASK_T event,
|
||||
loc_registration_mask_status isEnabled)
|
||||
{
|
||||
mEvtMask =
|
||||
isEnabled == LOC_REGISTRATION_MASK_ENABLED ? (mEvtMask|event):(mEvtMask&~event);
|
||||
|
||||
mLocApi->updateEvtMask();
|
||||
}
|
||||
|
||||
// This will be overridden by the individual adapters
|
||||
// if necessary.
|
||||
inline virtual void setUlpProxy(UlpProxyBase* ulp) {}
|
||||
virtual void handleEngineUpEvent();
|
||||
virtual void handleEngineDownEvent();
|
||||
inline virtual void setPositionModeInt(LocPosMode& posMode) {}
|
||||
virtual void startFixInt() {}
|
||||
virtual void stopFixInt() {}
|
||||
virtual void getZppInt() {}
|
||||
virtual void reportPosition(UlpLocation &location,
|
||||
GpsLocationExtended &locationExtended,
|
||||
void* locationExt,
|
||||
enum loc_sess_status status,
|
||||
LocPosTechMask loc_technology_mask);
|
||||
virtual void reportSv(GnssSvStatus &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 ¬ify,
|
||||
const void* data);
|
||||
inline virtual bool isInSession() { return false; }
|
||||
ContextBase* getContext() const { return mContext; }
|
||||
virtual void reportGpsMeasurementData(GpsData &gpsMeasurementData);
|
||||
};
|
||||
|
||||
} // namespace loc_core
|
||||
|
||||
#endif //LOC_API_ADAPTER_BASE_H
|
70
gps/core/LocAdapterProxyBase.h
Normal file
70
gps/core/LocAdapterProxyBase.h
Normal file
@ -0,0 +1,70 @@
|
||||
/* Copyright (c) 2014 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_ADAPTER_PROXY_BASE_H
|
||||
#define LOC_ADAPTER_PROXY_BASE_H
|
||||
|
||||
#include <ContextBase.h>
|
||||
#include <gps_extended.h>
|
||||
|
||||
namespace loc_core {
|
||||
|
||||
class LocAdapterProxyBase {
|
||||
private:
|
||||
LocAdapterBase *mLocAdapterBase;
|
||||
protected:
|
||||
inline LocAdapterProxyBase(const LOC_API_ADAPTER_EVENT_MASK_T mask,
|
||||
ContextBase* context):
|
||||
mLocAdapterBase(new LocAdapterBase(mask, context, this)) {
|
||||
}
|
||||
inline virtual ~LocAdapterProxyBase() {
|
||||
delete mLocAdapterBase;
|
||||
}
|
||||
ContextBase* getContext() const {
|
||||
return mLocAdapterBase->getContext();
|
||||
}
|
||||
inline void updateEvtMask(LOC_API_ADAPTER_EVENT_MASK_T event,
|
||||
loc_registration_mask_status isEnabled) {
|
||||
mLocAdapterBase->updateEvtMask(event,isEnabled);
|
||||
}
|
||||
|
||||
public:
|
||||
inline virtual void handleEngineUpEvent() {};
|
||||
inline virtual void handleEngineDownEvent() {};
|
||||
inline virtual bool reportPosition(UlpLocation &location,
|
||||
GpsLocationExtended &locationExtended,
|
||||
enum loc_sess_status status,
|
||||
LocPosTechMask loc_technology_mask) {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace loc_core
|
||||
|
||||
#endif //LOC_ADAPTER_PROXY_BASE_H
|
553
gps/core/LocApiBase.cpp
Normal file
553
gps/core/LocApiBase.cpp
Normal file
@ -0,0 +1,553 @@
|
||||
/* Copyright (c) 2011-2014, 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 <log_util.h>
|
||||
#include <LocDualContext.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();
|
||||
}
|
||||
};
|
||||
|
||||
struct LocOpenMsg : public LocMsg {
|
||||
LocApiBase* mLocApi;
|
||||
LOC_API_ADAPTER_EVENT_MASK_T mMask;
|
||||
inline LocOpenMsg(LocApiBase* locApi,
|
||||
LOC_API_ADAPTER_EVENT_MASK_T mask) :
|
||||
LocMsg(), mLocApi(locApi), mMask(mask)
|
||||
{
|
||||
locallog();
|
||||
}
|
||||
inline virtual void proc() const {
|
||||
mLocApi->open(mMask);
|
||||
}
|
||||
inline void locallog() {
|
||||
LOC_LOGV("%s:%d]: LocOpen Mask: %x\n",
|
||||
__func__, __LINE__, mMask);
|
||||
}
|
||||
inline virtual void log() {
|
||||
locallog();
|
||||
}
|
||||
};
|
||||
|
||||
LocApiBase::LocApiBase(const MsgTask* msgTask,
|
||||
LOC_API_ADAPTER_EVENT_MASK_T excludedMask,
|
||||
ContextBase* context) :
|
||||
mExcludedMask(excludedMask), mMsgTask(msgTask),
|
||||
mMask(0), mSupportedMsg(0), mContext(context)
|
||||
{
|
||||
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;
|
||||
|
||||
for (int i = 0;
|
||||
!inSession && i < MAX_ADAPTERS && NULL != mLocAdapters[i];
|
||||
i++) {
|
||||
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;
|
||||
mMsgTask->sendMsg(new LocOpenMsg(this,
|
||||
(adapter->getEvtMask())));
|
||||
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
|
||||
mMsgTask->sendMsg(new LocOpenMsg(this, getEvtMask()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LocApiBase::updateEvtMask()
|
||||
{
|
||||
mMsgTask->sendMsg(new LocOpenMsg(this, getEvtMask()));
|
||||
}
|
||||
|
||||
void LocApiBase::handleEngineUpEvent()
|
||||
{
|
||||
// This will take care of renegotiating the loc handle
|
||||
mMsgTask->sendMsg(new LocSsrMsg(this));
|
||||
|
||||
LocDualContext::injectFeatureConfig(mContext);
|
||||
|
||||
// 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)
|
||||
{
|
||||
// print the location info before delivering
|
||||
LOC_LOGV("flags: %d\n source: %d\n latitude: %f\n longitude: %f\n "
|
||||
"altitude: %f\n speed: %f\n bearing: %f\n accuracy: %f\n "
|
||||
"timestamp: %lld\n rawDataSize: %d\n rawData: %p\n "
|
||||
"Session status: %d\n Technology mask: %u",
|
||||
location.gpsLocation.flags, location.position_source,
|
||||
location.gpsLocation.latitude, location.gpsLocation.longitude,
|
||||
location.gpsLocation.altitude, location.gpsLocation.speed,
|
||||
location.gpsLocation.bearing, location.gpsLocation.accuracy,
|
||||
location.gpsLocation.timestamp, location.rawDataSize,
|
||||
location.rawData, status, 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(GnssSvStatus &svStatus,
|
||||
GpsLocationExtended &locationExtended,
|
||||
void* svExt)
|
||||
{
|
||||
// print the SV info before delivering
|
||||
LOC_LOGV("num sv: %d\n ephemeris mask: %dxn almanac mask: %x\n gps/glo/bds in use"
|
||||
" mask: %x/%x/%x\n sv: prn snr elevation azimuth",
|
||||
svStatus.num_svs, svStatus.ephemeris_mask,
|
||||
svStatus.almanac_mask, svStatus.gps_used_in_fix_mask,
|
||||
svStatus.glo_used_in_fix_mask, svStatus.bds_used_in_fix_mask);
|
||||
for (int i = 0; i < svStatus.num_svs && i < GPS_MAX_SVS; i++) {
|
||||
LOC_LOGV(" %d: %d %f %f %f",
|
||||
i,
|
||||
svStatus.sv_list[i].prn,
|
||||
svStatus.sv_list[i].snr,
|
||||
svStatus.sv_list[i].elevation,
|
||||
svStatus.sv_list[i].azimuth);
|
||||
}
|
||||
// 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 ¬ify, const void* data)
|
||||
{
|
||||
// loop through adapters, and deliver to the first handling adapter.
|
||||
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestNiNotify(notify, data));
|
||||
}
|
||||
|
||||
void LocApiBase::saveSupportedMsgList(uint64_t supportedMsgList)
|
||||
{
|
||||
mSupportedMsg = supportedMsgList;
|
||||
}
|
||||
|
||||
void* LocApiBase :: getSibling()
|
||||
DEFAULT_IMPL(NULL)
|
||||
|
||||
LocApiProxyBase* LocApiBase :: getLocApiProxy()
|
||||
DEFAULT_IMPL(NULL)
|
||||
|
||||
void LocApiBase::reportGpsMeasurementData(GpsData &gpsMeasurementData)
|
||||
{
|
||||
// loop through adapters, and deliver to all adapters.
|
||||
TO_ALL_LOCADAPTERS(mLocAdapters[i]->reportGpsMeasurementData(gpsMeasurementData));
|
||||
}
|
||||
|
||||
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,
|
||||
int sensorProvider)
|
||||
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)
|
||||
|
||||
enum loc_api_adapter_err LocApiBase::
|
||||
getWwanZppFix(GpsLocation& zppLoc)
|
||||
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||
|
||||
enum loc_api_adapter_err LocApiBase::
|
||||
getBestAvailableZppFix(GpsLocation& zppLoc)
|
||||
{
|
||||
memset(&zppLoc, 0, sizeof(zppLoc));
|
||||
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||
}
|
||||
|
||||
enum loc_api_adapter_err LocApiBase::
|
||||
getBestAvailableZppFix(GpsLocation & zppLoc, LocPosTechMask & tech_mask)
|
||||
{
|
||||
memset(&zppLoc, 0, sizeof(zppLoc));
|
||||
memset(&tech_mask, 0, sizeof(tech_mask));
|
||||
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()
|
||||
|
||||
int LocApiBase::
|
||||
setGpsLock(LOC_GPS_LOCK_MASK lock)
|
||||
DEFAULT_IMPL(-1)
|
||||
|
||||
void LocApiBase::
|
||||
installAGpsCert(const DerEncodedCertificate* pData,
|
||||
size_t length,
|
||||
uint32_t slotBitMask)
|
||||
DEFAULT_IMPL()
|
||||
|
||||
int LocApiBase::
|
||||
getGpsLock()
|
||||
DEFAULT_IMPL(-1)
|
||||
|
||||
enum loc_api_adapter_err LocApiBase::
|
||||
setXtraVersionCheck(enum xtra_version_check check)
|
||||
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||
|
||||
int LocApiBase::
|
||||
updateRegistrationMask(LOC_API_ADAPTER_EVENT_MASK_T event,
|
||||
loc_registration_mask_status isEnabled)
|
||||
DEFAULT_IMPL(-1)
|
||||
|
||||
bool LocApiBase::
|
||||
gnssConstellationConfig()
|
||||
DEFAULT_IMPL(false)
|
||||
|
||||
} // namespace loc_core
|
261
gps/core/LocApiBase.h
Normal file
261
gps/core/LocApiBase.h
Normal file
@ -0,0 +1,261 @@
|
||||
/* Copyright (c) 2011-2014, 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>
|
||||
#include <log_util.h>
|
||||
|
||||
namespace loc_core {
|
||||
class ContextBase;
|
||||
|
||||
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);
|
||||
|
||||
#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++);
|
||||
|
||||
enum xtra_version_check {
|
||||
DISABLED,
|
||||
AUTO,
|
||||
XTRA2,
|
||||
XTRA3
|
||||
};
|
||||
|
||||
class LocAdapterBase;
|
||||
struct LocSsrMsg;
|
||||
struct LocOpenMsg;
|
||||
|
||||
class LocApiProxyBase {
|
||||
public:
|
||||
inline LocApiProxyBase() {}
|
||||
inline virtual ~LocApiProxyBase() {}
|
||||
inline virtual void* getSibling2() { return NULL; }
|
||||
};
|
||||
|
||||
class LocApiBase {
|
||||
friend struct LocSsrMsg;
|
||||
//LocOpenMsg calls open() which makes it necessary to declare
|
||||
//it as a friend
|
||||
friend struct LocOpenMsg;
|
||||
friend class ContextBase;
|
||||
const MsgTask* mMsgTask;
|
||||
ContextBase *mContext;
|
||||
LocAdapterBase* mLocAdapters[MAX_ADAPTERS];
|
||||
uint64_t mSupportedMsg;
|
||||
|
||||
protected:
|
||||
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();
|
||||
LOC_API_ADAPTER_EVENT_MASK_T mMask;
|
||||
LocApiBase(const MsgTask* msgTask,
|
||||
LOC_API_ADAPTER_EVENT_MASK_T excludedMask,
|
||||
ContextBase* context = NULL);
|
||||
inline virtual ~LocApiBase() { close(); }
|
||||
bool isInSession();
|
||||
const LOC_API_ADAPTER_EVENT_MASK_T mExcludedMask;
|
||||
|
||||
public:
|
||||
inline void sendMsg(const LocMsg* msg) const {
|
||||
mMsgTask->sendMsg(msg);
|
||||
}
|
||||
|
||||
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(GnssSvStatus &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 ¬ify, const void* data);
|
||||
void saveSupportedMsgList(uint64_t supportedMsgList);
|
||||
void reportGpsMeasurementData(GpsData &gpsMeasurementData);
|
||||
|
||||
// downward calls
|
||||
// All below functions are to be defined by adapter specific modules:
|
||||
// RPC, QMI, etc. The default implementation is empty.
|
||||
|
||||
virtual void* getSibling();
|
||||
virtual LocApiProxyBase* getLocApiProxy();
|
||||
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, int sensorProvider);
|
||||
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 enum loc_api_adapter_err
|
||||
getWwanZppFix(GpsLocation & zppLoc);
|
||||
virtual enum loc_api_adapter_err
|
||||
getBestAvailableZppFix(GpsLocation & zppLoc);
|
||||
virtual enum loc_api_adapter_err
|
||||
getBestAvailableZppFix(GpsLocation & zppLoc, LocPosTechMask & tech_mask);
|
||||
virtual int initDataServiceClient();
|
||||
virtual int openAndStartDataCall();
|
||||
virtual void stopDataCall();
|
||||
virtual void closeDataCall();
|
||||
virtual void installAGpsCert(const DerEncodedCertificate* pData,
|
||||
size_t length,
|
||||
uint32_t slotBitMask);
|
||||
inline virtual void setInSession(bool inSession) {}
|
||||
inline bool isMessageSupported (LocCheckingMessagesID msgID) const {
|
||||
if (msgID > (sizeof(mSupportedMsg) << 3)) {
|
||||
return false;
|
||||
} else {
|
||||
uint32_t messageChecker = 1 << msgID;
|
||||
return (messageChecker & mSupportedMsg) == messageChecker;
|
||||
}
|
||||
}
|
||||
void updateEvtMask();
|
||||
|
||||
/*Values for lock
|
||||
1 = Do not lock any position sessions
|
||||
2 = Lock MI position sessions
|
||||
3 = Lock MT position sessions
|
||||
4 = Lock all position sessions
|
||||
*/
|
||||
virtual int setGpsLock(LOC_GPS_LOCK_MASK lock);
|
||||
/*
|
||||
Returns
|
||||
Current value of GPS Lock on success
|
||||
-1 on failure
|
||||
*/
|
||||
virtual int getGpsLock(void);
|
||||
|
||||
virtual enum loc_api_adapter_err setXtraVersionCheck(enum xtra_version_check check);
|
||||
|
||||
/*
|
||||
Update gps reporting events
|
||||
*/
|
||||
virtual int updateRegistrationMask(LOC_API_ADAPTER_EVENT_MASK_T event,
|
||||
loc_registration_mask_status isEnabled);
|
||||
/*
|
||||
Check if the modem support the service
|
||||
*/
|
||||
virtual bool gnssConstellationConfig();
|
||||
};
|
||||
|
||||
typedef LocApiBase* (getLocApi_t)(const MsgTask* msgTask,
|
||||
LOC_API_ADAPTER_EVENT_MASK_T exMask,
|
||||
ContextBase *context);
|
||||
|
||||
} // namespace loc_core
|
||||
|
||||
#endif //LOC_API_BASE_H
|
147
gps/core/LocDualContext.cpp
Normal file
147
gps/core/LocDualContext.cpp
Normal file
@ -0,0 +1,147 @@
|
||||
/* Copyright (c) 2011-2014, 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 |
|
||||
LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT);
|
||||
|
||||
const MsgTask* LocDualContext::mMsgTask = NULL;
|
||||
ContextBase* LocDualContext::mFgContext = NULL;
|
||||
ContextBase* LocDualContext::mBgContext = NULL;
|
||||
ContextBase* LocDualContext::mInjectContext = NULL;
|
||||
// the name must be shorter than 15 chars
|
||||
const char* LocDualContext::mLocationHalName = "Loc_hal_worker";
|
||||
const char* LocDualContext::mLBSLibName = "liblbs_core.so";
|
||||
|
||||
pthread_mutex_t LocDualContext::mGetLocContextMutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
const MsgTask* LocDualContext::getMsgTask(LocThread::tCreate tCreator,
|
||||
const char* name, bool joinable)
|
||||
{
|
||||
if (NULL == mMsgTask) {
|
||||
mMsgTask = new MsgTask(tCreator, name, joinable);
|
||||
}
|
||||
return mMsgTask;
|
||||
}
|
||||
|
||||
inline
|
||||
const MsgTask* LocDualContext::getMsgTask(const char* name, bool joinable) {
|
||||
return getMsgTask((LocThread::tCreate)NULL, name, joinable);
|
||||
}
|
||||
|
||||
ContextBase* LocDualContext::getLocFgContext(LocThread::tCreate tCreator,
|
||||
LocMsg* firstMsg, const char* name, bool joinable)
|
||||
{
|
||||
pthread_mutex_lock(&LocDualContext::mGetLocContextMutex);
|
||||
LOC_LOGD("%s:%d]: querying ContextBase with tCreator", __func__, __LINE__);
|
||||
if (NULL == mFgContext) {
|
||||
LOC_LOGD("%s:%d]: creating msgTask with tCreator", __func__, __LINE__);
|
||||
const MsgTask* msgTask = getMsgTask(tCreator, name, joinable);
|
||||
mFgContext = new LocDualContext(msgTask,
|
||||
mFgExclMask);
|
||||
}
|
||||
if(NULL == mInjectContext) {
|
||||
LOC_LOGD("%s:%d]: mInjectContext is FgContext", __func__, __LINE__);
|
||||
mInjectContext = mFgContext;
|
||||
injectFeatureConfig(mInjectContext);
|
||||
}
|
||||
pthread_mutex_unlock(&LocDualContext::mGetLocContextMutex);
|
||||
|
||||
if (firstMsg) {
|
||||
mFgContext->sendMsg(firstMsg);
|
||||
}
|
||||
|
||||
return mFgContext;
|
||||
}
|
||||
|
||||
ContextBase* LocDualContext::getLocBgContext(LocThread::tCreate tCreator,
|
||||
LocMsg* firstMsg, const char* name, bool joinable)
|
||||
{
|
||||
pthread_mutex_lock(&LocDualContext::mGetLocContextMutex);
|
||||
LOC_LOGD("%s:%d]: querying ContextBase with tCreator", __func__, __LINE__);
|
||||
if (NULL == mBgContext) {
|
||||
LOC_LOGD("%s:%d]: creating msgTask with tCreator", __func__, __LINE__);
|
||||
const MsgTask* msgTask = getMsgTask(tCreator, name, joinable);
|
||||
mBgContext = new LocDualContext(msgTask,
|
||||
mBgExclMask);
|
||||
}
|
||||
if(NULL == mInjectContext) {
|
||||
LOC_LOGD("%s:%d]: mInjectContext is BgContext", __func__, __LINE__);
|
||||
mInjectContext = mBgContext;
|
||||
injectFeatureConfig(mInjectContext);
|
||||
}
|
||||
pthread_mutex_unlock(&LocDualContext::mGetLocContextMutex);
|
||||
|
||||
if (firstMsg) {
|
||||
mBgContext->sendMsg(firstMsg);
|
||||
}
|
||||
|
||||
return mBgContext;
|
||||
}
|
||||
|
||||
void LocDualContext :: injectFeatureConfig(ContextBase *curContext)
|
||||
{
|
||||
LOC_LOGD("%s:%d]: Enter", __func__, __LINE__);
|
||||
if(curContext == mInjectContext) {
|
||||
LOC_LOGD("%s:%d]: Calling LBSProxy (%p) to inject feature config",
|
||||
__func__, __LINE__, ((LocDualContext *)mInjectContext)->mLBSProxy);
|
||||
((LocDualContext *)mInjectContext)->mLBSProxy->injectFeatureConfig(curContext);
|
||||
}
|
||||
LOC_LOGD("%s:%d]: Exit", __func__, __LINE__);
|
||||
}
|
||||
|
||||
LocDualContext::LocDualContext(const MsgTask* msgTask,
|
||||
LOC_API_ADAPTER_EVENT_MASK_T exMask) :
|
||||
ContextBase(msgTask, exMask, mLBSLibName)
|
||||
{
|
||||
}
|
||||
|
||||
}
|
76
gps/core/LocDualContext.h
Normal file
76
gps/core/LocDualContext.h
Normal file
@ -0,0 +1,76 @@
|
||||
/* Copyright (c) 2011-2014, 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 ContextBase* mInjectContext;
|
||||
static const MsgTask* getMsgTask(LocThread::tCreate tCreator,
|
||||
const char* name, bool joinable = true);
|
||||
static const MsgTask* getMsgTask(const char* name, bool joinable = true);
|
||||
static pthread_mutex_t mGetLocContextMutex;
|
||||
|
||||
protected:
|
||||
LocDualContext(const MsgTask* msgTask,
|
||||
LOC_API_ADAPTER_EVENT_MASK_T exMask);
|
||||
inline virtual ~LocDualContext() {}
|
||||
|
||||
public:
|
||||
static const char* mLBSLibName;
|
||||
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(LocThread::tCreate tCreator, LocMsg* firstMsg,
|
||||
const char* name, bool joinable = true);
|
||||
inline static ContextBase* getLocFgContext(const char* name, bool joinable = true) {
|
||||
return getLocFgContext(NULL, NULL, name, joinable);
|
||||
}
|
||||
static ContextBase* getLocBgContext(LocThread::tCreate tCreator, LocMsg* firstMsg,
|
||||
const char* name, bool joinable = true);
|
||||
inline static ContextBase* getLocBgContext(const char* name, bool joinable = true) {
|
||||
return getLocBgContext(NULL, NULL, name, joinable);
|
||||
}
|
||||
|
||||
static void injectFeatureConfig(ContextBase *context);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif //__LOC_ENG_CONTEXT__
|
84
gps/core/UlpProxyBase.h
Normal file
84
gps/core/UlpProxyBase.h
Normal file
@ -0,0 +1,84 @@
|
||||
/* Copyright (c) 2013-2015, 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 ULP_PROXY_BASE_H
|
||||
#define ULP_PROXY_BASE_H
|
||||
|
||||
#include <gps_extended.h>
|
||||
#include "fused_location_extended.h"
|
||||
|
||||
namespace loc_core {
|
||||
|
||||
class LocAdapterBase;
|
||||
|
||||
class UlpProxyBase {
|
||||
public:
|
||||
LocPosMode mPosMode;
|
||||
bool mFixSet;
|
||||
inline UlpProxyBase() {
|
||||
mPosMode.mode = LOC_POSITION_MODE_INVALID;
|
||||
mFixSet = false;
|
||||
}
|
||||
inline virtual ~UlpProxyBase() {}
|
||||
inline virtual bool sendStartFix() { mFixSet = true; return false; }
|
||||
inline virtual bool sendStopFix() { mFixSet = false; return false; }
|
||||
inline virtual bool sendFixMode(LocPosMode ¶ms) {
|
||||
mPosMode = params;
|
||||
return false;
|
||||
}
|
||||
|
||||
inline virtual bool reportPosition(UlpLocation &location,
|
||||
GpsLocationExtended &locationExtended,
|
||||
void* locationExt,
|
||||
enum loc_sess_status status,
|
||||
LocPosTechMask loc_technology_mask) {
|
||||
return false;
|
||||
}
|
||||
inline virtual bool reportSv(GnssSvStatus &svStatus,
|
||||
GpsLocationExtended &locationExtended,
|
||||
void* svExt) {
|
||||
return false;
|
||||
}
|
||||
inline virtual bool reportStatus(GpsStatusValue status) {
|
||||
return false;
|
||||
}
|
||||
inline virtual void setAdapter(LocAdapterBase* adapter) {}
|
||||
inline virtual void setCapabilities(unsigned long capabilities) {}
|
||||
inline virtual bool reportBatchingSession(FlpExtBatchOptions &options,
|
||||
bool active) {
|
||||
return false;
|
||||
}
|
||||
inline virtual bool reportPositions(const FlpExtLocation* locations,
|
||||
int32_t number_of_locations) {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace loc_core
|
||||
|
||||
#endif // ULP_PROXY_BASE_H
|
92
gps/core/gps_extended.h
Normal file
92
gps/core/gps_extended.h
Normal 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 */
|
||||
|
438
gps/core/gps_extended_c.h
Normal file
438
gps/core/gps_extended_c.h
Normal file
@ -0,0 +1,438 @@
|
||||
/* Copyright (c) 2013-2015, 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 <stdlib.h>
|
||||
#include <string.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
|
||||
/** Position source is ZPP only */
|
||||
#define ULP_LOCATION_IS_FROM_ZPP 0x0004
|
||||
/** Position is from a Geofence Breach Event */
|
||||
#define ULP_LOCATION_IS_FROM_GEOFENCE 0X0008
|
||||
/** Position is from Hardware FLP */
|
||||
#define ULP_LOCATION_IS_FROM_HW_FLP 0x0010
|
||||
/** Position is from NLP */
|
||||
#define ULP_LOCATION_IS_FROM_NLP 0x0020
|
||||
/** Position is from PIP */
|
||||
#define ULP_LOCATION_IS_FROM_PIP 0x0040
|
||||
|
||||
#define ULP_MIN_INTERVAL_INVALID 0xffffffff
|
||||
|
||||
/*Emergency SUPL*/
|
||||
#define GPS_NI_TYPE_EMERGENCY_SUPL 4
|
||||
|
||||
#define AGPS_CERTIFICATE_MAX_LENGTH 2000
|
||||
#define AGPS_CERTIFICATE_MAX_SLOTS 10
|
||||
|
||||
enum loc_registration_mask_status {
|
||||
LOC_REGISTRATION_MASK_ENABLED,
|
||||
LOC_REGISTRATION_MASK_DISABLED
|
||||
};
|
||||
|
||||
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
|
||||
|
||||
/** 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;
|
||||
struct sockaddr_storage addr;
|
||||
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_INVALID = -1,
|
||||
LOC_POSITION_MODE_STANDALONE = 0,
|
||||
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
|
||||
/** GpsLocationExtended has valid heading uncertainty */
|
||||
#define GPS_LOCATION_EXTENDED_HAS_BEARING_UNC 0x0040
|
||||
/** GpsLocationExtended has valid horizontal reliability */
|
||||
#define GPS_LOCATION_EXTENDED_HAS_HOR_RELIABILITY 0x0080
|
||||
/** GpsLocationExtended has valid vertical reliability */
|
||||
#define GPS_LOCATION_EXTENDED_HAS_VERT_RELIABILITY 0x0100
|
||||
|
||||
typedef enum {
|
||||
LOC_RELIABILITY_NOT_SET = 0,
|
||||
LOC_RELIABILITY_VERY_LOW = 1,
|
||||
LOC_RELIABILITY_LOW = 2,
|
||||
LOC_RELIABILITY_MEDIUM = 3,
|
||||
LOC_RELIABILITY_HIGH = 4
|
||||
}LocReliability;
|
||||
|
||||
/** 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;
|
||||
/** heading uncertainty in degrees (0 to 359.999) */
|
||||
float bearing_unc;
|
||||
/** horizontal reliability. */
|
||||
LocReliability horizontal_reliability;
|
||||
/** vertical reliability. */
|
||||
LocReliability vertical_reliability;
|
||||
} GpsLocationExtended;
|
||||
|
||||
/** Represents SV status. */
|
||||
typedef struct {
|
||||
/** set to sizeof(GnssSvStatus) */
|
||||
size_t size;
|
||||
|
||||
/** Number of SVs currently visible. */
|
||||
int num_svs;
|
||||
|
||||
/** Contains an array of SV information. */
|
||||
GpsSvInfo sv_list[GPS_MAX_SVS];
|
||||
|
||||
/** Represents a bit mask indicating which SVs
|
||||
* have ephemeris data.
|
||||
*/
|
||||
uint32_t ephemeris_mask;
|
||||
|
||||
/** Represents a bit mask indicating which SVs
|
||||
* have almanac data.
|
||||
*/
|
||||
uint32_t almanac_mask;
|
||||
|
||||
/**
|
||||
* Represents a bit mask indicating which GPS SVs
|
||||
* were used for computing the most recent position fix.
|
||||
*/
|
||||
uint32_t gps_used_in_fix_mask;
|
||||
|
||||
/**
|
||||
* Represents a bit mask indicating which GLONASS SVs
|
||||
* were used for computing the most recent position fix.
|
||||
*/
|
||||
uint32_t glo_used_in_fix_mask;
|
||||
|
||||
/**
|
||||
* Represents a bit mask indicating which BDS SVs
|
||||
* were used for computing the most recent position fix.
|
||||
*/
|
||||
uint64_t bds_used_in_fix_mask;
|
||||
|
||||
} GnssSvStatus;
|
||||
|
||||
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;
|
||||
|
||||
|
||||
#define smaller_of(a, b) (((a) > (b)) ? (b) : (a))
|
||||
#define MAX_APN_LEN 100
|
||||
|
||||
// This will be overridden by the individual adapters
|
||||
// if necessary.
|
||||
#define DEFAULT_IMPL(rtv) \
|
||||
{ \
|
||||
LOC_LOGD("%s: default implementation invoked", __func__); \
|
||||
return rtv; \
|
||||
}
|
||||
|
||||
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_INTERNAL = 10,
|
||||
|
||||
/* equating engine down to phone offline, as they are the same errror */
|
||||
LOC_API_ADAPTER_ERR_ENGINE_DOWN = LOC_API_ADAPTER_ERR_PHONE_OFFLINE,
|
||||
LOC_API_ADAPTER_ERR_FAILURE = 101,
|
||||
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_REQUEST_WIFI_AP_DATA, // Wifi ap data
|
||||
LOC_API_ADAPTER_BATCH_FULL, // Batching on full
|
||||
LOC_API_ADAPTER_BATCHED_POSITION_REPORT, // Batching on fix
|
||||
LOC_API_ADAPTER_BATCHED_GENFENCE_BREACH_REPORT, //
|
||||
LOC_API_ADAPTER_GDT_UPLOAD_BEGIN_REQ, // GDT upload start request
|
||||
LOC_API_ADAPTER_GDT_UPLOAD_END_REQ, // GDT upload end request
|
||||
LOC_API_ADAPTER_GNSS_MEASUREMENT, // GNSS Measurement report
|
||||
LOC_API_ADAPTER_REQUEST_TIMEZONE, // Timezone injection request
|
||||
LOC_API_ADAPTER_REPORT_GENFENCE_DWELL_REPORT, // Geofence dwell report
|
||||
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_BATCHED_GENFENCE_BREACH_REPORT (1<<LOC_API_ADAPTER_BATCHED_GENFENCE_BREACH_REPORT)
|
||||
#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)
|
||||
#define LOC_API_ADAPTER_BIT_REQUEST_WIFI_AP_DATA (1<<LOC_API_ADAPTER_REQUEST_WIFI_AP_DATA)
|
||||
#define LOC_API_ADAPTER_BIT_BATCH_FULL (1<<LOC_API_ADAPTER_BATCH_FULL)
|
||||
#define LOC_API_ADAPTER_BIT_BATCHED_POSITION_REPORT (1<<LOC_API_ADAPTER_BATCHED_POSITION_REPORT)
|
||||
#define LOC_API_ADAPTER_BIT_GDT_UPLOAD_BEGIN_REQ (1<<LOC_API_ADAPTER_GDT_UPLOAD_BEGIN_REQ)
|
||||
#define LOC_API_ADAPTER_BIT_GDT_UPLOAD_END_REQ (1<<LOC_API_ADAPTER_GDT_UPLOAD_END_REQ)
|
||||
#define LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT (1<<LOC_API_ADAPTER_GNSS_MEASUREMENT)
|
||||
#define LOC_API_ADAPTER_BIT_REQUEST_TIMEZONE (1<<LOC_API_ADAPTER_REQUEST_TIMEZONE)
|
||||
#define LOC_API_ADAPTER_BIT_REPORT_GENFENCE_DWELL (1<<LOC_API_ADAPTER_REPORT_GENFENCE_DWELL_REPORT)
|
||||
|
||||
typedef unsigned int LOC_API_ADAPTER_EVENT_MASK_T;
|
||||
|
||||
typedef enum loc_api_adapter_msg_to_check_supported {
|
||||
LOC_API_ADAPTER_MESSAGE_LOCATION_BATCHING, // Batching 1.0
|
||||
LOC_API_ADAPTER_MESSAGE_BATCHED_GENFENCE_BREACH, // Geofence Batched Breach
|
||||
LOC_API_ADAPTER_MESSAGE_DISTANCE_BASE_TRACKING, // DBT 2.0
|
||||
LOC_API_ADAPTER_MESSAGE_ADAPTIVE_LOCATION_BATCHING, // Batching 1.5
|
||||
LOC_API_ADAPTER_MESSAGE_DISTANCE_BASE_LOCATION_BATCHING, // Batching 2.0
|
||||
LOC_API_ADAPTER_MESSAGE_UPDATE_TBF_ON_THE_FLY, // Updating Tracking TBF On The Fly
|
||||
|
||||
LOC_API_ADAPTER_MESSAGE_MAX
|
||||
} LocCheckingMessagesID;
|
||||
|
||||
typedef int IzatDevId_t;
|
||||
|
||||
typedef uint32_t LOC_GPS_LOCK_MASK;
|
||||
#define isGpsLockNone(lock) ((lock) == 0)
|
||||
#define isGpsLockMO(lock) ((lock) & ((LOC_GPS_LOCK_MASK)1))
|
||||
#define isGpsLockMT(lock) ((lock) & ((LOC_GPS_LOCK_MASK)2))
|
||||
#define isGpsLockAll(lock) (((lock) & ((LOC_GPS_LOCK_MASK)3)) == 3)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* GPS_EXTENDED_C_H */
|
243
gps/core/loc_core_log.cpp
Normal file
243
gps/core/loc_core_log.cpp
Normal file
@ -0,0 +1,243 @@
|
||||
/* Copyright (c) 2011-2015, 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 const 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 const 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 const 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 const 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 const loc_name_val_s_type loc_eng_position_recurrences[] =
|
||||
{
|
||||
NAME_VAL( GPS_POSITION_RECURRENCE_PERIODIC ),
|
||||
NAME_VAL( GPS_POSITION_RECURRENCE_SINGLE )
|
||||
};
|
||||
static const 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 const 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_ALL)
|
||||
};
|
||||
static const 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 const 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 const 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 const 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 ),
|
||||
NAME_VAL( GPS_NI_TYPE_EMERGENCY_SUPL )
|
||||
};
|
||||
static const 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 const 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 const 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 const 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 const 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 const 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_IPV6 ),
|
||||
NAME_VAL( AGPS_APN_BEARER_IPV4V6 )
|
||||
};
|
||||
static const 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 const 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 const 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 const 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 const 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 const 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 const 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);
|
||||
}
|
58
gps/core/loc_core_log.h
Normal file
58
gps/core/loc_core_log.h
Normal file
@ -0,0 +1,58 @@
|
||||
/* 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_CORE_LOG_H
|
||||
#define LOC_CORE_LOG_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <gps_extended.h>
|
||||
|
||||
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
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LOC_CORE_LOG_H */
|
12
gps/etc/Android.mk
Normal file
12
gps/etc/Android.mk
Normal file
@ -0,0 +1,12 @@
|
||||
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE := gps.conf
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
LOCAL_MODULE_CLASS := ETC
|
||||
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/
|
||||
LOCAL_SRC_FILES := gps.conf
|
||||
|
||||
include $(BUILD_PREBUILT)
|
||||
|
117
gps/etc/gps.conf
Normal file
117
gps/etc/gps.conf
Normal file
@ -0,0 +1,117 @@
|
||||
#Uncommenting these urls would only enable
|
||||
#the power up auto injection and force injection(test case).
|
||||
#XTRA_SERVER_1=http://xtrapath1.izatcloud.net/xtra2.bin
|
||||
#XTRA_SERVER_2=http://xtrapath2.izatcloud.net/xtra2.bin
|
||||
#XTRA_SERVER_3=http://xtrapath3.izatcloud.net/xtra2.bin
|
||||
|
||||
#Version check for XTRA
|
||||
#DISABLE = 0
|
||||
#AUTO = 1
|
||||
#XTRA2 = 2
|
||||
#XTRA3 = 3
|
||||
XTRA_VERSION_CHECK=0
|
||||
|
||||
# Error Estimate
|
||||
# _SET = 1
|
||||
# _CLEAR = 0
|
||||
ERR_ESTIMATE=0
|
||||
|
||||
#Test
|
||||
NTP_SERVER=time.gpsonextra.net
|
||||
#Asia
|
||||
# NTP_SERVER=asia.pool.ntp.org
|
||||
#Europe
|
||||
# NTP_SERVER=europe.pool.ntp.org
|
||||
#North America
|
||||
# NTP_SERVER=north-america.pool.ntp.org
|
||||
|
||||
# DEBUG LEVELS: 0 - none, 1 - Error, 2 - Warning, 3 - Info
|
||||
# 4 - Debug, 5 - Verbose
|
||||
# If DEBUG_LEVEL is commented, Android's logging levels will be used
|
||||
DEBUG_LEVEL = 3
|
||||
|
||||
# Intermediate position report, 1=enable, 0=disable
|
||||
INTERMEDIATE_POS=0
|
||||
|
||||
# Below bit mask configures how GPS functionalities
|
||||
# should be locked when user turns off GPS on Settings
|
||||
# Set bit 0x1 if MO GPS functionalities are to be locked
|
||||
# Set bit 0x2 if NI GPS functionalities are to be locked
|
||||
# default - non is locked for backward compatibility
|
||||
#GPS_LOCK = 0
|
||||
|
||||
# supl version 1.0
|
||||
SUPL_VER=0x10000
|
||||
|
||||
# Emergency SUPL, 1=enable, 0=disable
|
||||
SUPL_ES=0
|
||||
|
||||
#Choose PDN for Emergency SUPL
|
||||
#1 - Use emergency PDN
|
||||
#0 - Use regular SUPL PDN for Emergency SUPL
|
||||
USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL=1
|
||||
|
||||
#SUPL_MODE is a bit mask set in config.xml per carrier by default.
|
||||
#If it is uncommented here, this value will overwrite the value from
|
||||
#config.xml.
|
||||
#MSA=0X2
|
||||
#MSB=0X1
|
||||
#SUPL_MODE=
|
||||
|
||||
# GPS Capabilities bit mask
|
||||
# SCHEDULING = 0x01
|
||||
# MSB = 0x02
|
||||
# MSA = 0x04
|
||||
# ON_DEMAND_TIME = 0x10
|
||||
# GEOFENCE = 0x20
|
||||
# default = ON_DEMAND_TIME | MSA | MSB | SCHEDULING | GEOFENCE
|
||||
CAPABILITIES=0x37
|
||||
|
||||
# Accuracy threshold for intermediate positions
|
||||
# less accurate positions are ignored, 0 for passing all positions
|
||||
# ACCURACY_THRES=5000
|
||||
|
||||
################################
|
||||
##### AGPS server settings #####
|
||||
################################
|
||||
|
||||
# FOR SUPL SUPPORT, set the following
|
||||
# SUPL_HOST=supl.host.com or IP
|
||||
# SUPL_PORT=1234
|
||||
|
||||
# FOR C2K PDE SUPPORT, set the following
|
||||
# C2K_HOST=c2k.pde.com or IP
|
||||
# C2K_PORT=1234
|
||||
|
||||
# Bitmask of slots that are available
|
||||
# for write/install to, where 1s indicate writable,
|
||||
# and the default value is 0 where no slots
|
||||
# are writable. For example, AGPS_CERT_WRITABLE_MASK
|
||||
# of b1000001010 makes 3 slots available
|
||||
# and the remaining 7 slots unwritable.
|
||||
#AGPS_CERT_WRITABLE_MASK=0
|
||||
|
||||
####################################
|
||||
# LTE Positioning Profile Settings
|
||||
####################################
|
||||
# 0: Enable RRLP on LTE(Default)
|
||||
# 1: Enable LPP_User_Plane on LTE
|
||||
# 2: Enable LPP_Control_Plane
|
||||
# 3: Enable both LPP_User_Plane and LPP_Control_Plane
|
||||
LPP_PROFILE = 2
|
||||
|
||||
################################
|
||||
# EXTRA SETTINGS
|
||||
################################
|
||||
# NMEA provider (1=Modem Processor, 0=Application Processor)
|
||||
NMEA_PROVIDER=0
|
||||
# Mark if it is a SGLTE target (1=SGLTE, 0=nonSGLTE)
|
||||
SGLTE_TARGET=0
|
||||
|
||||
##################################################
|
||||
# Select Positioning Protocol on A-GLONASS system
|
||||
##################################################
|
||||
# 0x1: RRC CPlane
|
||||
# 0x2: RRLP UPlane
|
||||
# 0x4: LLP Uplane
|
||||
A_GLONASS_POS_PROTOCOL_SELECT = 0
|
10
gps/loc-api.pc.in
Normal file
10
gps/loc-api.pc.in
Normal file
@ -0,0 +1,10 @@
|
||||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@
|
||||
includedir=@includedir@
|
||||
|
||||
Name: loc-api
|
||||
Description: Qualcomm GPS Location API
|
||||
Version: @VERSION@
|
||||
Libs: -L${libdir} -lgps_utils_so -lloc_adapter_so -lloc_eng_so -lgps_default_so -lloc_api
|
||||
Cflags: -I${includedir}/loc-api/libloc_api_50001 -I${includedir}/loc-api/utils -I${includedir}/ -I${includedir}/loc-api
|
17
gps/loc_api/Android.mk
Normal file
17
gps/loc_api/Android.mk
Normal file
@ -0,0 +1,17 @@
|
||||
ifneq ($(BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE),)
|
||||
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
# add RPC dirs if RPC is available
|
||||
ifneq ($(TARGET_NO_RPC),true)
|
||||
|
||||
GPS_DIR_LIST += $(LOCAL_PATH)/libloc_api-rpc-50001/
|
||||
|
||||
endif #TARGET_NO_RPC
|
||||
|
||||
GPS_DIR_LIST += $(LOCAL_PATH)/libloc_api_50001/
|
||||
|
||||
#call the subfolders
|
||||
include $(addsuffix Android.mk, $(GPS_DIR_LIST))
|
||||
|
||||
endif#BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE
|
3
gps/loc_api/libloc_api-rpc-50001/Android.mk
Normal file
3
gps/loc_api/libloc_api-rpc-50001/Android.mk
Normal file
@ -0,0 +1,3 @@
|
||||
ifeq ($(BOARD_VENDOR_QCOM_GPS_LOC_API_AMSS_VERSION),50001)
|
||||
include $(call all-subdir-makefiles)
|
||||
endif
|
@ -0,0 +1,60 @@
|
||||
LOCAL_PATH:= $(call my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
RPC_INC:=rpc_inc
|
||||
|
||||
source_files:= \
|
||||
src/loc_api_rpc_glue.c \
|
||||
src/loc_api_sync_call.c \
|
||||
src/loc_apicb_appinit.c \
|
||||
src/loc_api_fixup.c \
|
||||
src/loc_api_log.c \
|
||||
src/LocApiRpc.cpp
|
||||
|
||||
LOCAL_SRC_FILES:= $(source_files)
|
||||
|
||||
LOCAL_CFLAGS:=-fno-short-enums
|
||||
LOCAL_CFLAGS+=-DDEBUG -DUSE_QCOM_AUTO_RPC -DUSE_QCOM_AUTO_RPC
|
||||
LOCAL_CFLAGS+=$(GPS_FEATURES)
|
||||
|
||||
# for loc_api_fixup.c
|
||||
LOCAL_CFLAGS+=-DADD_XDR_FLOAT -DADD_XDR_BOOL
|
||||
|
||||
LOCAL_SHARED_LIBRARIES:= \
|
||||
librpc \
|
||||
libutils \
|
||||
libcutils \
|
||||
libcommondefs \
|
||||
libgps.utils \
|
||||
libloc_core
|
||||
|
||||
LOCAL_STATIC_LIBRARIES := \
|
||||
libloc_api_rpcgen
|
||||
|
||||
LOCAL_PRELINK_MODULE:= false
|
||||
|
||||
LOCAL_C_INCLUDES:= \
|
||||
$(LOCAL_PATH) \
|
||||
$(LOCAL_PATH)/rpc_inc \
|
||||
$(TARGET_OUT_HEADERS)/gps.utils \
|
||||
$(TARGET_OUT_HEADERS)/libloc_core \
|
||||
$(TARGET_OUT_HEADERS)/loc_api/rpcgen/inc \
|
||||
$(TARGET_OUT_HEADERS)/libcommondefs/rpcgen/inc \
|
||||
$(TARGET_OUT_HEADERS)/librpc \
|
||||
$(TARGET_OUT_HEADERS)/libloc-rpc/rpc_inc \
|
||||
$(TOP)/hardware/msm7k/librpc
|
||||
|
||||
LOCAL_COPY_HEADERS_TO:= libloc_api-rpc-qc/$(RPC_INC)
|
||||
LOCAL_COPY_HEADERS:= \
|
||||
$(RPC_INC)/loc_api_rpc_glue.h \
|
||||
$(RPC_INC)/loc_api_fixup.h \
|
||||
$(RPC_INC)/loc_api_sync_call.h \
|
||||
$(RPC_INC)/loc_apicb_appinit.h \
|
||||
$(RPC_INC)/LocApiRpc.h
|
||||
|
||||
LOCAL_MODULE:= libloc_api-rpc-qc
|
||||
LOCAL_MODULE_OWNER := qcom
|
||||
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
@ -0,0 +1,46 @@
|
||||
AM_CFLAGS = \
|
||||
-I../../../utils \
|
||||
-I../../../platform_lib_abstractions \
|
||||
-I./rpc_inc \
|
||||
-I../libloc_api-rpc-stub/inc \
|
||||
-I../../libloc_api_50001 \
|
||||
$(MSM7K_CFLAGS) \
|
||||
-DUSE_QCOM_AUTO_RPC
|
||||
|
||||
requiredlibs = \
|
||||
../../../utils/libgps_utils_so.la \
|
||||
$(MSM7K_LIBS)
|
||||
|
||||
h_sources = \
|
||||
rpc_inc/loc_api_rpc_glue.h \
|
||||
rpc_inc/loc_api_fixup.h \
|
||||
rpc_inc/loc_api_sync_call.h \
|
||||
rpc_inc/loc_apicb_appinit.h \
|
||||
|
||||
c_sources = \
|
||||
src/loc_api_rpc_glue.c \
|
||||
src/loc_api_sync_call.c \
|
||||
src/loc_apicb_appinit.c \
|
||||
src/loc_api_fixup.c \
|
||||
src/loc_api_log.c \
|
||||
src/LocApiRpcAdapter.cpp \
|
||||
|
||||
|
||||
library_includedir = $(pkgincludedir)/libloc_api-rpc-50001/libloc_api-rpc-glue/rpc_inc
|
||||
library_include_HEADERS = $(h_sources)
|
||||
libloc_api_rpc_qc_la_SOURCES = $(c_sources) $(h_sources)
|
||||
|
||||
if USE_GLIB
|
||||
libloc_api_rpc_qc_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@
|
||||
libloc_api_rpc_qc_la_LDFLAGS = -lstdc++ -lpthread @GLIB_LIBS@ -shared -version-info 1:0:0
|
||||
libloc_api_rpc_qc_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@
|
||||
else
|
||||
libloc_api_rpc_qc_la_CFLAGS = $(AM_CFLAGS)
|
||||
libloc_api_rpc_qc_la_LDFLAGS = -lpthread -shared -version-info 1:0:0
|
||||
libloc_api_rpc_qc_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS)
|
||||
endif
|
||||
|
||||
libloc_api_rpc_qc_la_LIBADD = $(requiredlibs) -lstdc++
|
||||
|
||||
#Create and Install Libraries
|
||||
lib_LTLIBRARIES = libloc_api_rpc_qc.la
|
@ -0,0 +1,140 @@
|
||||
/* Copyright (c) 2011,2014, 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_RPC_H
|
||||
#define LOC_API_RPC_H
|
||||
|
||||
#include <rpc/rpc.h>
|
||||
#include <loc_api_rpcgen_common_rpc.h>
|
||||
#include <loc_api_rpc_glue.h>
|
||||
#include <LocApiBase.h>
|
||||
#include <loc_log.h>
|
||||
|
||||
using namespace loc_core;
|
||||
|
||||
class LocApiRpc : public LocApiBase {
|
||||
protected:
|
||||
// RPC communication establishment
|
||||
rpc_loc_client_handle_type client_handle;
|
||||
|
||||
private:
|
||||
int dataEnableLastSet;
|
||||
char apnLastSet[MAX_APN_LEN];
|
||||
|
||||
static const LOC_API_ADAPTER_EVENT_MASK_T maskAll;
|
||||
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_lock_e_type convertGpsLockMask(LOC_GPS_LOCK_MASK lockMask);
|
||||
static enum loc_api_adapter_err convertErr(int rpcErr);
|
||||
static GpsNiEncodingType convertNiEncodingType(int loc_encoding);
|
||||
static int NIEventFillVerfiyType(GpsNiNotification ¬if,
|
||||
rpc_loc_ni_notify_verify_e_type notif_priv);
|
||||
|
||||
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 reportStatus(const rpc_loc_status_event_s_type *status_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 NIEvent(const rpc_loc_ni_event_s_type *ni_req_ptr);
|
||||
|
||||
protected:
|
||||
virtual enum loc_api_adapter_err
|
||||
open(LOC_API_ADAPTER_EVENT_MASK_T mask);
|
||||
virtual enum loc_api_adapter_err
|
||||
close();
|
||||
|
||||
public:
|
||||
LocApiRpc(const MsgTask* msgTask,
|
||||
LOC_API_ADAPTER_EVENT_MASK_T exMask);
|
||||
~LocApiRpc();
|
||||
|
||||
virtual int locEventCB(rpc_loc_client_handle_type client_handle,
|
||||
rpc_loc_event_mask_type loc_event,
|
||||
const rpc_loc_event_payload_u_type* loc_event_payload);
|
||||
|
||||
void locRpcGlobalCB(CLIENT* clnt, enum rpc_reset_event event);
|
||||
|
||||
// RPC adapter interface implementations
|
||||
virtual enum loc_api_adapter_err
|
||||
startFix(const LocPosMode& posMode);
|
||||
virtual enum loc_api_adapter_err
|
||||
stopFix();
|
||||
virtual enum loc_api_adapter_err
|
||||
setPositionMode(const LocPosMode& mode);
|
||||
inline virtual enum loc_api_adapter_err
|
||||
enableData(int enable) { return enableData(enable, false); }
|
||||
virtual enum loc_api_adapter_err
|
||||
enableData(int enable, boolean force);
|
||||
virtual enum loc_api_adapter_err
|
||||
setTime(GpsUtcTime time, int64_t timeReference, int uncertainty);
|
||||
virtual enum loc_api_adapter_err
|
||||
injectPosition(double latitude, double longitude, float accuracy);
|
||||
virtual enum loc_api_adapter_err
|
||||
deleteAidingData(GpsAidingData f);
|
||||
virtual enum loc_api_adapter_err
|
||||
informNiResponse(GpsUserResponseType userResponse, const void* passThroughData);
|
||||
inline virtual enum loc_api_adapter_err
|
||||
setAPN(char* apn, int len) { return setAPN(apn, len, false); }
|
||||
virtual enum loc_api_adapter_err
|
||||
setAPN(char* apn, int len, boolean force);
|
||||
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
|
||||
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
|
||||
setSUPLVersion(uint32_t version);
|
||||
virtual void setInSession(bool inSession);
|
||||
|
||||
/*Values for lock
|
||||
1 = Do not lock any position sessions
|
||||
2 = Lock MI position sessions
|
||||
3 = Lock MT position sessions
|
||||
4 = Lock all position sessions
|
||||
*/
|
||||
virtual int setGpsLock(LOC_GPS_LOCK_MASK lock);
|
||||
/*
|
||||
Returns
|
||||
Current value of GPS Lock on success
|
||||
-1 on failure
|
||||
*/
|
||||
virtual int getGpsLock(void);
|
||||
};
|
||||
|
||||
extern "C" LocApiBase* getLocApi(const MsgTask* msgTask,
|
||||
LOC_API_ADAPTER_EVENT_MASK_T exMask,
|
||||
ContextBase *context);
|
||||
|
||||
#endif //LOC_API_RPC_H
|
@ -0,0 +1,69 @@
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef DEBUG_H
|
||||
#define DEBUG_H
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#define LOG_TAG "LocSvc_rpc"
|
||||
#include <utils/Log.h>
|
||||
|
||||
#define PRINT(x...) do { \
|
||||
fprintf(stdout, "%s(%d) ", __FUNCTION__, __LINE__); \
|
||||
fprintf(stdout, ##x); \
|
||||
ALOGD(x); \
|
||||
} while(0)
|
||||
|
||||
#ifdef DEBUG
|
||||
#define D PRINT
|
||||
#else
|
||||
#define D(x...) do { } while(0)
|
||||
#endif
|
||||
|
||||
#ifdef VERBOSE
|
||||
#define V PRINT
|
||||
#else
|
||||
#define V(x...) do { } while(0)
|
||||
#endif
|
||||
|
||||
#define E(x...) do { \
|
||||
fprintf(stderr, "%s(%d) ", __FUNCTION__, __LINE__); \
|
||||
fprintf(stderr, ##x); \
|
||||
ALOGE(x); \
|
||||
} while(0)
|
||||
|
||||
#define FAILIF(cond, msg...) do { \
|
||||
if (__builtin_expect (cond, 0)) { \
|
||||
fprintf(stderr, "%s:%s:(%d): ", __FILE__, __FUNCTION__, __LINE__); \
|
||||
fprintf(stderr, ##msg); \
|
||||
ALOGE(##msg); \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#endif/*DEBUG_H*/
|
@ -0,0 +1,226 @@
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef LOC_API_FIXUP_H
|
||||
#define LOC_API_FIXUP_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#ifndef NULLPROC
|
||||
#define NULLPROC 0
|
||||
#endif /* NULLPROC */
|
||||
|
||||
#ifdef ADD_XDR_FLOAT
|
||||
|
||||
extern bool_t xdr_float (XDR *__xdrs, float *__fp);
|
||||
extern bool_t xdr_double (XDR *__xdrs, double *__dp);
|
||||
|
||||
#endif /* ADD_XDR_FLOAT */
|
||||
|
||||
#ifdef ADD_XDR_BOOL
|
||||
extern bool_t xdr_bool(XDR *__xdrs, int *__bp);
|
||||
#endif /* ADD_XDR_BOOL */
|
||||
|
||||
#define RPC_LOC_API_MAJOR_VERSION_NUMBER 1
|
||||
#define RPC_LOC_API_MINOR_VERSION_NUMBER 0
|
||||
|
||||
// Return value for loc_open in case of failure.
|
||||
#define RPC_LOC_CLIENT_HANDLE_INVALID -1
|
||||
|
||||
// Return value of loc api calls for loc_close, loc_start_fix, loc_stop_fix and loc_ioctl
|
||||
// These are also the status for the ioctl callback
|
||||
#define RPC_LOC_API_SUCCESS 0
|
||||
#define RPC_LOC_API_GENERAL_FAILURE 1
|
||||
#define RPC_LOC_API_UNSUPPORTED 2
|
||||
#define RPC_LOC_API_INVALID_HANDLE 4
|
||||
#define RPC_LOC_API_INVALID_PARAMETER 5
|
||||
#define RPC_LOC_API_ENGINE_BUSY 6
|
||||
#define RPC_LOC_API_PHONE_OFFLINE 7
|
||||
#define RPC_LOC_API_TIMEOUT 8
|
||||
|
||||
// Special return value for loc api calls in case of RPC failure
|
||||
#define RPC_LOC_API_RPC_FAILURE (-1234)
|
||||
// Special return value for modem restart incurred RPC failure
|
||||
#define RPC_LOC_API_RPC_MODEM_RESTART (-1235)
|
||||
|
||||
#define RPC_LOC_API_MAX_SV_COUNT 80
|
||||
#define RPC_LOC_API_MAX_NMEA_STRING_LENGTH 1200
|
||||
|
||||
// Maximum server address that will be used in location API
|
||||
#define RPC_LOC_API_MAX_SERVER_ADDR_LENGTH 256
|
||||
#define RPC_LOC_API_MAX_NUM_PREDICTED_ORBITS_SERVERS 3
|
||||
#define RPC_LOC_API_MAX_NUM_NTP_SERVERS 3
|
||||
|
||||
#define RPC_LOC_EVENT_PARSED_POSITION_REPORT 0x00000001 // Position report comes in loc_parsed_position_s_type
|
||||
#define RPC_LOC_EVENT_SATELLITE_REPORT 0x00000002 // Satellite in view report
|
||||
#define RPC_LOC_EVENT_NMEA_1HZ_REPORT 0x00000004 // NMEA report at 1HZ rate
|
||||
#define RPC_LOC_EVENT_NMEA_POSITION_REPORT 0x00000008 // NMEA report at position report rate
|
||||
#define RPC_LOC_EVENT_NI_NOTIFY_VERIFY_REQUEST 0x00000010 // NI notification/verification request
|
||||
#define RPC_LOC_EVENT_ASSISTANCE_DATA_REQUEST 0x00000020 // Assistance data, eg: time, predicted orbits request
|
||||
#define RPC_LOC_EVENT_LOCATION_SERVER_REQUEST 0x00000040 // Request for location server
|
||||
#define RPC_LOC_EVENT_IOCTL_REPORT 0x00000080 // Callback report for loc_ioctl
|
||||
#define RPC_LOC_EVENT_STATUS_REPORT 0x00000100 // Misc status report: eg, engine state
|
||||
|
||||
#define RPC_LOC_POS_VALID_SESSION_STATUS 0x00000001
|
||||
#define RPC_LOC_POS_VALID_TIMESTAMP_CALENDAR 0x00000002
|
||||
#define RPC_LOC_POS_VALID_TIMESTAMP_UTC 0x00000004
|
||||
#define RPC_LOC_POS_VALID_LEAP_SECONDS 0x00000008
|
||||
#define RPC_LOC_POS_VALID_TIME_UNC 0x00000010
|
||||
#define RPC_LOC_POS_VALID_LATITUDE 0x00000020
|
||||
#define RPC_LOC_POS_VALID_LONGITUDE 0x00000040
|
||||
#define RPC_LOC_POS_VALID_ALTITUDE_WRT_ELLIPSOID 0x00000080
|
||||
#define RPC_LOC_POS_VALID_ALTITUDE_WRT_MEAN_SEA_LEVEL 0x00000100
|
||||
#define RPC_LOC_POS_VALID_SPEED_HORIZONTAL 0x00000200
|
||||
#define RPC_LOC_POS_VALID_SPEED_VERTICAL 0x00000400
|
||||
#define RPC_LOC_POS_VALID_HEADING 0x00000800
|
||||
#define RPC_LOC_POS_VALID_HOR_UNC_CIRCULAR 0x00001000
|
||||
#define RPC_LOC_POS_VALID_HOR_UNC_ELLI_SEMI_MAJ 0x00002000
|
||||
#define RPC_LOC_POS_VALID_HOR_UNC_ELLI_SEMI_MIN 0x00004000
|
||||
#define RPC_LOC_POS_VALID_HOR_UNC_ELLI_ORIENT_AZIMUTH 0x00008000
|
||||
#define RPC_LOC_POS_VALID_VERTICAL_UNC 0x00010000
|
||||
#define RPC_LOC_POS_VALID_SPEED_UNC 0x00020000
|
||||
#define RPC_LOC_POS_VALID_HEADING_UNC 0x00040000
|
||||
#define RPC_LOC_POS_VALID_CONFIDENCE_HORIZONTAL 0x00080000
|
||||
#define RPC_LOC_POS_VALID_CONFIDENCE_VERTICAL 0x00100000
|
||||
#define RPC_LOC_POS_VALID_MAGNETIC_VARIATION 0x00200000
|
||||
#define RPC_LOC_POS_VALID_TECHNOLOGY_MASK 0x00400000
|
||||
|
||||
#define RPC_LOC_POS_TECH_SATELLITE 0x00000001
|
||||
#define RPC_LOC_POS_TECH_CELLID 0x00000002
|
||||
#define RPC_LOC_POS_TECH_WIFI 0x00000004
|
||||
|
||||
#define RPC_LOC_SV_INFO_VALID_SYSTEM 0x00000001
|
||||
#define RPC_LOC_SV_INFO_VALID_PRN 0x00000002
|
||||
#define RPC_LOC_SV_INFO_VALID_HEALTH_STATUS 0x00000004
|
||||
#define RPC_LOC_SV_INFO_VALID_PROCESS_STATUS 0x00000008
|
||||
#define RPC_LOC_SV_INFO_VALID_HAS_EPH 0x00000010
|
||||
#define RPC_LOC_SV_INFO_VALID_HAS_ALM 0x00000020
|
||||
#define RPC_LOC_SV_INFO_VALID_ELEVATION 0x00000040
|
||||
#define RPC_LOC_SV_INFO_VALID_AZIMUTH 0x00000080
|
||||
#define RPC_LOC_SV_INFO_VALID_SNR 0x00000100
|
||||
|
||||
#define RPC_LOC_GNSS_INFO_VALID_POS_DOP 0x00000001
|
||||
#define RPC_LOC_GNSS_INFO_VALID_HOR_DOP 0x00000002
|
||||
#define RPC_LOC_GNSS_INFO_VALID_VERT_DOP 0x00000004
|
||||
#define RPC_LOC_GNSS_INFO_VALID_ALTITUDE_ASSUMED 0x00000008
|
||||
#define RPC_LOC_GNSS_INFO_VALID_SV_COUNT 0x00000010
|
||||
#define RPC_LOC_GNSS_INFO_VALID_SV_LIST 0x00000020
|
||||
|
||||
#define RPC_LOC_NI_MAX_REQUESTOR_ID_LENGTH 200
|
||||
#define RPC_LOC_NI_SUPL_HASH_LENGTH 8
|
||||
#define RPC_LOC_NI_SUPL_SLP_SESSION_ID_BYTE_LENGTH 4
|
||||
#define RPC_LOC_NI_MAX_CLIENT_NAME_LENGTH 64
|
||||
#define RPC_LOC_NI_MAX_EXT_CLIENT_ADDRESS 20
|
||||
#define RPC_LOC_NI_CODEWORD_LENGTH 20
|
||||
|
||||
#define RPC_LOC_NI_SUPL_QOP_VALID 0x01
|
||||
#define RPC_LOC_NI_SUPL_QOP_VERACC_VALID 0x02
|
||||
#define RPC_LOC_NI_SUPL_QOP_MAXAGE_VALID 0x04
|
||||
#define RPC_LOC_NI_SUPL_QOP_DELAY_VALID 0x08
|
||||
|
||||
#define RPC_LOC_FIX_CRIT_VALID_RECURRENCE_TYPE 0x00000001
|
||||
#define RPC_LOC_FIX_CRIT_VALID_PREFERRED_OPERATION_MODE 0x00000002
|
||||
#define RPC_LOC_FIX_CRIT_VALID_PREFERRED_ACCURACY 0x00000004
|
||||
#define RPC_LOC_FIX_CRIT_VALID_PREFERRED_RESPONSE_TIME 0x00000008
|
||||
#define RPC_LOC_FIX_CRIT_VALID_INTERMEDIATE_POS_REPORT_ENABLED 0x00000010
|
||||
#define RPC_LOC_FIX_CRIT_VALID_NOTIFY_TYPE 0x00000020
|
||||
#define RPC_LOC_FIX_CRIT_VALID_MIN_INTERVAL 0x00000040
|
||||
#define RPC_LOC_FIX_CRIT_VALID_MIN_DISTANCE 0x00000080
|
||||
#define RPC_LOC_FIX_CRIT_VALID_MIN_DIST_SAMPLE_INTERVAL 0x00000100
|
||||
|
||||
#define RPC_LOC_ASSIST_POS_VALID_TIMESTAMP_UTC 0x00000001
|
||||
#define RPC_LOC_ASSIST_POS_VALID_LATITUDE 0x00000002
|
||||
#define RPC_LOC_ASSIST_POS_VALID_LONGITUDE 0x00000004
|
||||
#define RPC_LOC_ASSIST_POS_VALID_ALTITUDE_WRT_ELLIPSOID 0x00000008
|
||||
#define RPC_LOC_ASSIST_POS_VALID_ALTITUDE_WRT_MEAN_SEA_LEVEL 0x00000010
|
||||
#define RPC_LOC_ASSIST_POS_VALID_HOR_UNC_CIRCULAR 0x00000020
|
||||
#define RPC_LOC_ASSIST_POS_VALID_VERT_UNC 0x00000040
|
||||
#define RPC_LOC_ASSIST_POS_VALID_CONFIDENCE_HORIZONTAL 0x00000080
|
||||
#define RPC_LOC_ASSIST_POS_VALID_CONFIDENCE_VERTICAL 0x00000100
|
||||
#define RPC_LOC_ASSIST_POS_VALID_TIMESTAMP_AGE 0x00000200
|
||||
|
||||
#define RPC_LOC_ASSIST_DATA_ALL 0xFFFFFFFF
|
||||
|
||||
#define RPC_LOC_NMEA_MASK_ALL 0xffff
|
||||
#define RPC_LOC_NMEA_MASK_GGA 0x0001
|
||||
#define RPC_LOC_NMEA_MASK_RMC 0x0002
|
||||
#define RPC_LOC_NMEA_MASK_GSV 0x0004
|
||||
#define RPC_LOC_NMEA_MASK_GSA 0x0008
|
||||
#define RPC_LOC_NMEA_MASK_VTG 0x0010
|
||||
|
||||
/* EFS data access */
|
||||
#define RPC_LOC_EFS_MAX_PATH_LEN_BYTES 64 /* Max file name length in bytes that can be written*/
|
||||
#define RPC_LOC_EFS_MAX_FILE_LEN_BYTES 2000 /* Max file size in bytes that can be written */
|
||||
|
||||
/* WIPER valid information flag in log report */
|
||||
#define RPC_LOC_WIPER_LOG_TIME_VALID 0x01
|
||||
#define RPC_LOC_WIPER_LOG_POS_VALID 0x02
|
||||
#define RPC_LOC_WIPER_LOG_AP_SET_VALID 0x04
|
||||
|
||||
/* General WIPER defines */
|
||||
#define RPC_LOC_WIPER_MAC_ADDR_LENGTH 6 // Do not change this number since it affects RPC and log packet sizes
|
||||
#define RPC_LOC_WIPER_MAX_REPORTED_APS_PER_LOG_MSG 50 // Do not change this number since it affects RPC and log packet sizes
|
||||
|
||||
/* WIPER AP Qualifier */
|
||||
#define RPC_LOC_WIPER_AP_QUALIFIER_BEING_USED 0x1 /* AP is being used by WPS */
|
||||
#define RPC_LOC_WIPER_AP_QUALIFIER_HIDDEN_SSID 0x2 /* AP does not broadcast SSID */
|
||||
#define RPC_LOC_WIPER_AP_QUALIFIER_PRIVATE 0x4 /* AP has encryption turned on */
|
||||
#define RPC_LOC_WIPER_AP_QUALIFIER_INFRASTRUCTURE_MODE 0x8 /* AP is in infrastructure mode and not in ad-hoc/unknown mode */
|
||||
|
||||
/* flags for notification */
|
||||
#define RPC_LOC_NI_CLIENT_NAME_PRESENT 0x0001
|
||||
#define RPC_LOC_NI_CLIENT_EXTADDR_PRESENT 0x0002
|
||||
#define RPC_LOC_NI_DEF_LOCATION_TYPE_PRESENT 0x0010
|
||||
#define RPC_LOC_NI_REQUESTOR_ID_PRESENT 0x0020
|
||||
#define RPC_LOC_NI_CODEWORD_PRESENT 0x0040
|
||||
#define RPC_LOC_NI_SERVICE_TYPE_ID_PRESENT 0x0080
|
||||
#define RPC_LOC_NI_ENCODING_TYPE_PRESENT 0x0100
|
||||
|
||||
/* below are for RPC_LOC_IOCTL_SET_LBS_APN_PROFILE data */
|
||||
/* values for apn_profiles[0].srv_system_type */
|
||||
#define LOC_APN_PROFILE_SRV_SYS_CDMA 0x01
|
||||
#define LOC_APN_PROFILE_SRV_SYS_HDR 0x02
|
||||
#define LOC_APN_PROFILE_SRV_SYS_GSM 0x04
|
||||
#define LOC_APN_PROFILE_SRV_SYS_WCDMA 0x08
|
||||
#define LOC_APN_PROFILE_SRV_SYS_LTE 0x10
|
||||
#define LOC_APN_PROFILE_SRV_SYS_MAX 0x1F
|
||||
/* values for apn_profiles[0].pdp_type */
|
||||
#define LOC_APN_PROFILE_PDN_TYPE_IPV4 0x01
|
||||
#define LOC_APN_PROFILE_PDN_TYPE_IPV6 0x02
|
||||
#define LOC_APN_PROFILE_PDN_TYPE_IPV4V6 0x03
|
||||
#define LOC_APN_PROFILE_PDN_TYPE_PPP 0x04
|
||||
#define LOC_APN_PROFILE_PDN_TYPE_MAX 0x04
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LOC_API_FIXUP_H */
|
@ -0,0 +1,59 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LOC_API_LOG_H
|
||||
#define LOC_API_LOG_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include "loc_api_rpcgen_common_rpc.h"
|
||||
|
||||
extern int loc_callback_log(
|
||||
rpc_loc_event_mask_type loc_event, /* event mask */
|
||||
const rpc_loc_event_payload_u_type* loc_event_payload /* payload */
|
||||
);
|
||||
|
||||
extern const char* loc_get_event_atl_open_name(rpc_loc_server_request_e_type loc_event_atl_open);
|
||||
extern const char* loc_get_event_name(rpc_loc_event_mask_type loc_event_mask);
|
||||
extern const char* loc_get_ioctl_type_name(rpc_loc_ioctl_e_type ioctl_type);
|
||||
extern const char* loc_get_ioctl_status_name(uint32 status);
|
||||
extern const char* loc_get_sess_status_name(rpc_loc_session_status_e_type status);
|
||||
extern const char* loc_get_engine_state_name(rpc_loc_engine_state_e_type state);
|
||||
extern const char* loc_get_fix_session_state_name(rpc_loc_fix_session_state_e_type state);
|
||||
extern const char* loc_get_rpc_reset_event_name(enum rpc_reset_event event);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LOC_API_LOG_H */
|
@ -0,0 +1,123 @@
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef LOC_API_RPC_GLUE_H
|
||||
#define LOC_API_RPC_GLUE_H
|
||||
|
||||
/* Include RPC headers */
|
||||
#ifdef USE_LOCAL_RPC
|
||||
#include "rpc_inc/loc_api_common.h"
|
||||
#include "rpc_inc/loc_api.h"
|
||||
#include "rpc_inc/loc_api_cb.h"
|
||||
#endif
|
||||
|
||||
#ifdef USE_QCOM_AUTO_RPC
|
||||
#include "loc_api_rpcgen_rpc.h"
|
||||
#include "loc_api_rpcgen_common_rpc.h"
|
||||
#include "loc_api_rpcgen_cb_rpc.h"
|
||||
#endif
|
||||
|
||||
/* Boolean */
|
||||
/* Other data types in comdef.h are defined in rpc stubs, so fix it here */
|
||||
typedef unsigned char boolean;
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
|
||||
#include "loc_api_fixup.h"
|
||||
#include "loc_api_sync_call.h"
|
||||
#include <rpc/clnt.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
extern int loc_api_glue_init(void);
|
||||
extern int loc_api_null(void);
|
||||
|
||||
typedef int32 (loc_event_cb_f_type)(
|
||||
void* userData,
|
||||
rpc_loc_client_handle_type loc_handle, /* handle of the client */
|
||||
rpc_loc_event_mask_type loc_event, /* event mask */
|
||||
const rpc_loc_event_payload_u_type* loc_event_payload /* payload */
|
||||
);
|
||||
|
||||
typedef void (loc_reset_notif_cb_f_type)(
|
||||
void* userData,
|
||||
CLIENT* clnt,
|
||||
enum rpc_reset_event event
|
||||
);
|
||||
|
||||
extern rpc_loc_client_handle_type loc_open(
|
||||
rpc_loc_event_mask_type event_reg_mask,
|
||||
loc_event_cb_f_type *event_callback,
|
||||
loc_reset_notif_cb_f_type *rpc_global_cb,
|
||||
void* userData
|
||||
);
|
||||
|
||||
extern int32 loc_close
|
||||
(
|
||||
rpc_loc_client_handle_type handle
|
||||
);
|
||||
|
||||
extern void loc_clear
|
||||
(
|
||||
rpc_loc_client_handle_type handle
|
||||
);
|
||||
|
||||
extern int32 loc_start_fix
|
||||
(
|
||||
rpc_loc_client_handle_type handle
|
||||
);
|
||||
|
||||
extern int32 loc_stop_fix
|
||||
(
|
||||
rpc_loc_client_handle_type handle
|
||||
);
|
||||
|
||||
extern int32 loc_ioctl
|
||||
(
|
||||
rpc_loc_client_handle_type handle,
|
||||
rpc_loc_ioctl_e_type ioctl_type,
|
||||
rpc_loc_ioctl_data_u_type* ioctl_data
|
||||
);
|
||||
|
||||
extern int loc_eng_ioctl
|
||||
(
|
||||
rpc_loc_client_handle_type handle,
|
||||
rpc_loc_ioctl_e_type ioctl_type,
|
||||
rpc_loc_ioctl_data_u_type* ioctl_data_ptr,
|
||||
uint32 timeout_msec,
|
||||
rpc_loc_ioctl_callback_s_type *cb_data_ptr
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LOC_API_RPC_GLUE_H */
|
@ -0,0 +1,90 @@
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef LOC_API_CB_SYNC_H
|
||||
#define LOC_API_CB_SYNC_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
#include "loc_api_rpc_glue.h"
|
||||
#define LOC_SYNC_CALL_SLOTS_MAX 8
|
||||
|
||||
typedef struct {
|
||||
pthread_mutex_t lock;
|
||||
|
||||
/* Client ID */
|
||||
rpc_loc_client_handle_type loc_handle;
|
||||
|
||||
/* Callback waiting conditional variable */
|
||||
pthread_cond_t loc_cb_arrived_cond;
|
||||
|
||||
/* Callback waiting data block, protected by loc_cb_data_mutex */
|
||||
boolean in_use;
|
||||
boolean signal_sent;
|
||||
boolean not_available;
|
||||
rpc_loc_event_mask_type loc_cb_wait_event_mask; /* event to wait for */
|
||||
rpc_loc_ioctl_e_type ioctl_type; /* ioctl to wait for */
|
||||
rpc_loc_event_payload_u_type loc_cb_received_payload; /* received payload */
|
||||
rpc_loc_event_mask_type loc_cb_received_event_mask; /* received event */
|
||||
} loc_sync_call_slot_s_type;
|
||||
|
||||
typedef struct {
|
||||
int num_of_slots;
|
||||
loc_sync_call_slot_s_type slots[LOC_SYNC_CALL_SLOTS_MAX];
|
||||
} loc_sync_call_slot_array_s_type;
|
||||
|
||||
/* Init function */
|
||||
void loc_api_sync_call_init();
|
||||
|
||||
/* Destroy function */
|
||||
void loc_api_sync_call_destroy();
|
||||
|
||||
/* Process Loc API callbacks to wake up blocked user threads */
|
||||
void loc_api_callback_process_sync_call(
|
||||
rpc_loc_client_handle_type loc_handle, /* handle of the client */
|
||||
rpc_loc_event_mask_type loc_event, /* event mask */
|
||||
const rpc_loc_event_payload_u_type* loc_event_payload /* payload */
|
||||
);
|
||||
|
||||
/* Reentrant synchronous IOCTL call, using Loc API return code */
|
||||
int loc_api_sync_ioctl
|
||||
(
|
||||
rpc_loc_client_handle_type handle,
|
||||
rpc_loc_ioctl_e_type ioctl_type,
|
||||
rpc_loc_ioctl_data_u_type* ioctl_data_ptr,
|
||||
uint32 timeout_msec,
|
||||
rpc_loc_ioctl_callback_s_type *cb_data_ptr
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LOC_API_CB_SYNC_H */
|
@ -0,0 +1,45 @@
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef LOC_APICB_APPINIT_H
|
||||
#define LOC_APICB_APPINIT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/* Initialization function for callbacks */
|
||||
extern int loc_apicb_app_init();
|
||||
extern void loc_apicb_app_deinit();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LOC_APICB_APPINIT_H */
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,52 @@
|
||||
/* 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 <rpc/rpc.h>
|
||||
|
||||
#include "loc_api_fixup.h"
|
||||
|
||||
#ifdef ADD_XDR_FLOAT
|
||||
|
||||
int
|
||||
xdr_float(xdrp, fp)
|
||||
XDR *xdrp;
|
||||
float *fp;
|
||||
{
|
||||
return xdr_long(xdrp, (long*)fp);
|
||||
}
|
||||
|
||||
int
|
||||
xdr_double(xdrp, dp)
|
||||
XDR *xdrp;
|
||||
double *dp;
|
||||
{
|
||||
return xdr_long(xdrp, (long*)dp + 1)
|
||||
&& xdr_long(xdrp, (long*)dp);
|
||||
}
|
||||
|
||||
#endif /* ADD_XDR_FLOAT */
|
@ -0,0 +1,345 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#define LOG_NDDEBUG 0
|
||||
#define LOG_TAG "LocSvc_api_rpc_glue"
|
||||
|
||||
#include "loc_api_log.h"
|
||||
#include "loc_log.h"
|
||||
#include "log_util.h"
|
||||
#include "platform_lib_includes.h"
|
||||
#include "rpc/rpc.h"
|
||||
#include "loc_api_fixup.h"
|
||||
|
||||
/* Event names */
|
||||
loc_name_val_s_type loc_event_name[] =
|
||||
{
|
||||
NAME_VAL( RPC_LOC_EVENT_PARSED_POSITION_REPORT ),
|
||||
NAME_VAL( RPC_LOC_EVENT_SATELLITE_REPORT ),
|
||||
NAME_VAL( RPC_LOC_EVENT_NMEA_1HZ_REPORT ),
|
||||
NAME_VAL( RPC_LOC_EVENT_NMEA_POSITION_REPORT ),
|
||||
NAME_VAL( RPC_LOC_EVENT_NI_NOTIFY_VERIFY_REQUEST ),
|
||||
NAME_VAL( RPC_LOC_EVENT_ASSISTANCE_DATA_REQUEST ),
|
||||
NAME_VAL( RPC_LOC_EVENT_LOCATION_SERVER_REQUEST ),
|
||||
NAME_VAL( RPC_LOC_EVENT_IOCTL_REPORT ),
|
||||
NAME_VAL( RPC_LOC_EVENT_STATUS_REPORT ),
|
||||
NAME_VAL( RPC_LOC_EVENT_WPS_NEEDED_REQUEST ),
|
||||
};
|
||||
int loc_event_num = sizeof loc_event_name / sizeof(loc_name_val_s_type);
|
||||
|
||||
/* Event names */
|
||||
loc_name_val_s_type loc_event_atl_open_name[] =
|
||||
{
|
||||
NAME_VAL( RPC_LOC_SERVER_REQUEST_OPEN ),
|
||||
NAME_VAL( RPC_LOC_SERVER_REQUEST_CLOSE ),
|
||||
NAME_VAL( RPC_LOC_SERVER_REQUEST_MULTI_OPEN )
|
||||
};
|
||||
int loc_event_atl_open_num = sizeof loc_event_atl_open_name / sizeof(loc_name_val_s_type);
|
||||
|
||||
/* Finds the first event found in the mask */
|
||||
const char* loc_get_event_atl_open_name(rpc_loc_server_request_e_type loc_event_atl_open)
|
||||
{
|
||||
return loc_get_name_from_val(loc_event_atl_open_name, loc_event_atl_open_num,
|
||||
(long) loc_event_atl_open);
|
||||
}
|
||||
|
||||
/* IOCTL Type names */
|
||||
loc_name_val_s_type loc_ioctl_type_name[] =
|
||||
{
|
||||
NAME_VAL( RPC_LOC_IOCTL_GET_API_VERSION ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_SET_FIX_CRITERIA ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_GET_FIX_CRITERIA ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_INFORM_NI_USER_RESPONSE ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_VALIDITY ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_SET_PREDICTED_ORBITS_DATA_AUTO_DOWNLOAD ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_INJECT_UTC_TIME ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_INJECT_RTC_VALUE ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_INJECT_POSITION ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_QUERY_ENGINE_STATE ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_ERROR_ESTIMATE_CONFIG),
|
||||
NAME_VAL( RPC_LOC_IOCTL_INFORM_SERVER_MULTI_OPEN_STATUS ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_INFORM_SERVER_CLOSE_STATUS ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_SEND_WIPER_POSITION_REPORT ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_NOTIFY_WIPER_STATUS ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_SET_ENGINE_LOCK ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_GET_ENGINE_LOCK ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_SET_SBAS_CONFIG ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_GET_SBAS_CONFIG ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_SET_NMEA_TYPES ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_GET_NMEA_TYPES ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_SET_CDMA_PDE_SERVER_ADDR ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_GET_CDMA_PDE_SERVER_ADDR ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_SET_CDMA_MPC_SERVER_ADDR ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_GET_CDMA_MPC_SERVER_ADDR ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_SET_UMTS_SLP_SERVER_ADDR ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_GET_UMTS_SLP_SERVER_ADDR ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_SET_ON_DEMAND_LPM ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_GET_ON_DEMAND_LPM ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_SET_XTRA_T_SESSION_CONTROL ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_GET_XTRA_T_SESSION_CONTROL ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_SET_LBS_APN_PROFILE ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_GET_LBS_APN_PROFILE ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_SET_XTRA_APN_PROFILE ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_GET_XTRA_APN_PROFILE ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_SET_DATA_ENABLE ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_SET_SUPL_VERSION ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_GET_SUPL_VERSION ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_DELETE_ASSIST_DATA ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_SET_CUSTOM_PDE_SERVER_ADDR ),
|
||||
NAME_VAL( RPC_LOC_IOCTL_GET_CUSTOM_PDE_SERVER_ADDR ),
|
||||
};
|
||||
int loc_ioctl_type_num = sizeof loc_ioctl_type_name / sizeof(loc_name_val_s_type);
|
||||
|
||||
/* IOCTL Status names */
|
||||
loc_name_val_s_type loc_ioctl_status_name[] =
|
||||
{
|
||||
NAME_VAL( RPC_LOC_API_SUCCESS ),
|
||||
NAME_VAL( RPC_LOC_API_GENERAL_FAILURE ),
|
||||
NAME_VAL( RPC_LOC_API_UNSUPPORTED ),
|
||||
NAME_VAL( RPC_LOC_API_INVALID_HANDLE ),
|
||||
NAME_VAL( RPC_LOC_API_INVALID_PARAMETER ),
|
||||
NAME_VAL( RPC_LOC_API_ENGINE_BUSY ),
|
||||
NAME_VAL( RPC_LOC_API_PHONE_OFFLINE ),
|
||||
NAME_VAL( RPC_LOC_API_TIMEOUT ),
|
||||
NAME_VAL( RPC_LOC_API_RPC_FAILURE ),
|
||||
NAME_VAL( RPC_LOC_API_RPC_MODEM_RESTART )
|
||||
};
|
||||
int loc_ioctl_status_num = sizeof loc_ioctl_status_name / sizeof(loc_name_val_s_type);
|
||||
|
||||
/* Fix session status names */
|
||||
loc_name_val_s_type loc_sess_status_name[] =
|
||||
{
|
||||
NAME_VAL( RPC_LOC_SESS_STATUS_SUCCESS ),
|
||||
NAME_VAL( RPC_LOC_SESS_STATUS_IN_PROGESS ),
|
||||
NAME_VAL( RPC_LOC_SESS_STATUS_GENERAL_FAILURE ),
|
||||
NAME_VAL( RPC_LOC_SESS_STATUS_TIMEOUT ),
|
||||
NAME_VAL( RPC_LOC_SESS_STATUS_USER_END ),
|
||||
NAME_VAL( RPC_LOC_SESS_STATUS_BAD_PARAMETER ),
|
||||
NAME_VAL( RPC_LOC_SESS_STATUS_PHONE_OFFLINE ),
|
||||
NAME_VAL( RPC_LOC_SESS_STATUS_USER_END ),
|
||||
NAME_VAL( RPC_LOC_SESS_STATUS_ENGINE_LOCKED )
|
||||
};
|
||||
int loc_sess_status_num = sizeof loc_sess_status_name / sizeof(loc_name_val_s_type);
|
||||
|
||||
/* Engine state names */
|
||||
loc_name_val_s_type loc_engine_state_name[] =
|
||||
{
|
||||
NAME_VAL( RPC_LOC_ENGINE_STATE_ON ),
|
||||
NAME_VAL( RPC_LOC_ENGINE_STATE_OFF )
|
||||
};
|
||||
int loc_engine_state_num = sizeof loc_engine_state_name / sizeof(loc_name_val_s_type);
|
||||
|
||||
/* Fix session state names */
|
||||
loc_name_val_s_type loc_fix_session_state_name[] =
|
||||
{
|
||||
NAME_VAL( RPC_LOC_FIX_SESSION_STATE_BEGIN ),
|
||||
NAME_VAL( RPC_LOC_FIX_SESSION_STATE_END )
|
||||
};
|
||||
int loc_fix_session_state_num = sizeof loc_fix_session_state_name / sizeof(loc_name_val_s_type);
|
||||
|
||||
|
||||
static const char* log_final_interm_string(int is_final)
|
||||
{
|
||||
return is_final ? "final" : "intermediate";
|
||||
}
|
||||
|
||||
/* Logs parsed report */
|
||||
static void log_parsed_report(const rpc_loc_parsed_position_s_type *parsed_report)
|
||||
{
|
||||
rpc_loc_session_status_e_type status = parsed_report->session_status;
|
||||
LOC_LOGD("Session status: %s Valid mask: 0x%X\n",
|
||||
loc_get_sess_status_name(status),
|
||||
(uint) parsed_report->valid_mask);
|
||||
LOC_LOGD("Latitude: %.7f (%s)\n", parsed_report->latitude,
|
||||
log_final_interm_string(
|
||||
(parsed_report->valid_mask & RPC_LOC_POS_VALID_LATITUDE) &&
|
||||
parsed_report->session_status == RPC_LOC_SESS_STATUS_SUCCESS));
|
||||
LOC_LOGD("Longitude: %.7f\n", parsed_report->longitude);
|
||||
LOC_LOGD("Accuracy: %.7f\n", parsed_report->hor_unc_circular);
|
||||
}
|
||||
|
||||
/* Logs status report */
|
||||
static void log_status_report(const rpc_loc_status_event_s_type *status_event)
|
||||
{
|
||||
rpc_loc_status_event_e_type event = status_event->event;
|
||||
switch (event) {
|
||||
case RPC_LOC_STATUS_EVENT_ENGINE_STATE:
|
||||
LOC_LOGD("Engine state: %s\n",
|
||||
loc_get_engine_state_name(
|
||||
status_event->payload.rpc_loc_status_event_payload_u_type_u.engine_state));
|
||||
break;
|
||||
case RPC_LOC_STATUS_EVENT_FIX_SESSION_STATE:
|
||||
LOC_LOGD("Fix session state: %s\n",
|
||||
loc_get_fix_session_state_name(
|
||||
status_event->payload.rpc_loc_status_event_payload_u_type_u.fix_session_state));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Logs valid fields in the GNSS SV constellation report */
|
||||
static void log_satellite_report(const rpc_loc_gnss_info_s_type *gnss)
|
||||
{
|
||||
if (gnss->valid_mask & RPC_LOC_GNSS_INFO_VALID_POS_DOP)
|
||||
{
|
||||
LOC_LOGV("position dop: %.3f\n", (float) gnss->position_dop);
|
||||
}
|
||||
if (gnss->valid_mask & RPC_LOC_GNSS_INFO_VALID_HOR_DOP)
|
||||
{
|
||||
LOC_LOGV("horizontal dop: %.3f\n", (float) gnss->horizontal_dop);
|
||||
}
|
||||
if (gnss->valid_mask & RPC_LOC_GNSS_INFO_VALID_VERT_DOP)
|
||||
{
|
||||
LOC_LOGV("vertical dop: %.3f\n", (float) gnss->vertical_dop);
|
||||
}
|
||||
if (gnss->valid_mask & RPC_LOC_GNSS_INFO_VALID_ALTITUDE_ASSUMED)
|
||||
{
|
||||
LOC_LOGV("altitude assumed: %d\n", (int) gnss->altitude_assumed);
|
||||
}
|
||||
if (gnss->valid_mask & RPC_LOC_GNSS_INFO_VALID_SV_COUNT)
|
||||
{
|
||||
LOC_LOGD("sv count: %d\n", (int) gnss->sv_count);
|
||||
}
|
||||
if (gnss->valid_mask & RPC_LOC_GNSS_INFO_VALID_SV_LIST)
|
||||
{
|
||||
LOC_LOGV("sv list: ");
|
||||
|
||||
if (gnss->sv_count)
|
||||
{
|
||||
LOC_LOGV("\n\tsys\tprn\thlth\tproc\teph\talm\telev\tazi\tsnr\n");
|
||||
}
|
||||
else {
|
||||
LOC_LOGV("empty\n");
|
||||
}
|
||||
|
||||
int i;
|
||||
for (i = 0; i < gnss->sv_count; i++)
|
||||
{
|
||||
const rpc_loc_sv_info_s_type *sv = &gnss->sv_list.sv_list_val[i];
|
||||
rpc_loc_sv_info_valid_mask_type mask = sv->valid_mask;
|
||||
LOC_LOGV(" %d: \t%d\t%d\t%d\t%d\t%d\t%d\t%.3f\t%.3f\t%.3f\n", i,
|
||||
CHECK_MASK(int, sv->system, mask, RPC_LOC_SV_INFO_VALID_SYSTEM),
|
||||
CHECK_MASK(int, sv->prn, mask, RPC_LOC_SV_INFO_VALID_PRN),
|
||||
CHECK_MASK(int, sv->health_status, mask, RPC_LOC_SV_INFO_VALID_HEALTH_STATUS),
|
||||
CHECK_MASK(int, sv->process_status, mask, RPC_LOC_SV_INFO_VALID_PROCESS_STATUS),
|
||||
CHECK_MASK(int, sv->has_eph, mask, RPC_LOC_SV_INFO_VALID_HAS_EPH),
|
||||
CHECK_MASK(int, sv->has_alm, mask, RPC_LOC_SV_INFO_VALID_HAS_ALM),
|
||||
CHECK_MASK(float, sv->elevation, mask, RPC_LOC_SV_INFO_VALID_ELEVATION),
|
||||
CHECK_MASK(float, sv->azimuth, mask, RPC_LOC_SV_INFO_VALID_AZIMUTH),
|
||||
CHECK_MASK(float, sv->snr, mask, RPC_LOC_SV_INFO_VALID_SNR)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Logs a callback event */
|
||||
int loc_callback_log(
|
||||
rpc_loc_event_mask_type loc_event, /* event mask */
|
||||
const rpc_loc_event_payload_u_type* loc_event_payload /* payload */
|
||||
)
|
||||
{
|
||||
switch (loc_event)
|
||||
{
|
||||
case RPC_LOC_EVENT_SATELLITE_REPORT:
|
||||
log_satellite_report(&loc_event_payload->
|
||||
rpc_loc_event_payload_u_type_u.gnss_report);
|
||||
break;
|
||||
case RPC_LOC_EVENT_STATUS_REPORT:
|
||||
log_status_report(&loc_event_payload->
|
||||
rpc_loc_event_payload_u_type_u.status_report);
|
||||
break;
|
||||
case RPC_LOC_EVENT_PARSED_POSITION_REPORT:
|
||||
log_parsed_report(&loc_event_payload->
|
||||
rpc_loc_event_payload_u_type_u.parsed_location_report);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Finds the first event found in the mask */
|
||||
const char* loc_get_event_name(rpc_loc_event_mask_type loc_event_mask)
|
||||
{
|
||||
return loc_get_name_from_mask(loc_event_name, loc_event_num,
|
||||
(long) loc_event_mask);
|
||||
}
|
||||
|
||||
/* Finds IOCTL type name */
|
||||
const char* loc_get_ioctl_type_name(rpc_loc_ioctl_e_type ioctl_type)
|
||||
{
|
||||
return loc_get_name_from_val(loc_ioctl_type_name, loc_ioctl_type_num,
|
||||
(long) ioctl_type);
|
||||
}
|
||||
|
||||
/* Finds IOCTL status name */
|
||||
const char* loc_get_ioctl_status_name(uint32 status)
|
||||
{
|
||||
return loc_get_name_from_val(loc_ioctl_status_name, loc_ioctl_status_num,
|
||||
(long) status);
|
||||
}
|
||||
|
||||
/* Finds session status name */
|
||||
const char* loc_get_sess_status_name(rpc_loc_session_status_e_type status)
|
||||
{
|
||||
return loc_get_name_from_val(loc_sess_status_name, loc_sess_status_num,
|
||||
(long) status);
|
||||
}
|
||||
|
||||
/* Find engine state name */
|
||||
const char* loc_get_engine_state_name(rpc_loc_engine_state_e_type state)
|
||||
{
|
||||
return loc_get_name_from_val(loc_engine_state_name, loc_engine_state_num,
|
||||
(long) state);
|
||||
}
|
||||
|
||||
/* Find engine state name */
|
||||
const char* loc_get_fix_session_state_name(rpc_loc_fix_session_state_e_type state)
|
||||
{
|
||||
return loc_get_name_from_val(loc_fix_session_state_name, loc_fix_session_state_num,
|
||||
(long) state);
|
||||
}
|
||||
|
||||
/* Event names */
|
||||
loc_name_val_s_type rpc_reset_event_name[] =
|
||||
{
|
||||
NAME_VAL( RPC_SUBSYSTEM_RESTART_BEGIN ),
|
||||
NAME_VAL( RPC_SUBSYSTEM_RESTART_END )
|
||||
};
|
||||
int rpc_reset_event_num = sizeof rpc_reset_event_name / sizeof(loc_name_val_s_type);
|
||||
|
||||
const char* loc_get_rpc_reset_event_name(enum rpc_reset_event event)
|
||||
{
|
||||
return loc_get_name_from_val(rpc_reset_event_name, rpc_reset_event_num, event);
|
||||
}
|
@ -0,0 +1,636 @@
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
/*=====================================================================
|
||||
|
||||
INCLUDE FILES FOR MODULE
|
||||
|
||||
======================================================================*/
|
||||
#include <stdio.h>
|
||||
#include <pthread.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <loc_api_log.h>
|
||||
|
||||
#include <rpc/rpc.h>
|
||||
|
||||
/* Include RPC headers */
|
||||
#include "rpc_inc/loc_api_rpc_glue.h"
|
||||
|
||||
/* Callback init */
|
||||
#include "rpc_inc/loc_apicb_appinit.h"
|
||||
|
||||
/* Logging */
|
||||
#define LOG_TAG "LocSvc_api_rpc_glue"
|
||||
#define LOG_NDDEBUG 0
|
||||
#ifndef USE_GLIB
|
||||
#include <utils/Log.h>
|
||||
#endif /* USE_GLIB */
|
||||
|
||||
/* Logging Improvement */
|
||||
#include "log_util.h"
|
||||
#include "platform_lib_includes.h"
|
||||
/*Maximum number of Modem init*/
|
||||
#define RPC_TRY_NUM 10
|
||||
|
||||
/*Maximum number of Modem init*/
|
||||
#define RPC_TRY_NUM 10
|
||||
|
||||
/* Uncomment to force ALOGD messages */
|
||||
// #define ALOGD ALOGI
|
||||
|
||||
/*=====================================================================
|
||||
External declarations
|
||||
======================================================================*/
|
||||
|
||||
CLIENT* loc_api_clnt = NULL;
|
||||
|
||||
/* Callback ID and pointer */
|
||||
#define LOC_API_CB_MAX_CLIENTS 16
|
||||
typedef struct
|
||||
{
|
||||
uint32 cb_id; /* same as rpc/types.h */
|
||||
loc_event_cb_f_type *cb_func; /* callback func */
|
||||
loc_reset_notif_cb_f_type *rpc_cb; /* callback from RPC */
|
||||
rpc_loc_client_handle_type handle; /* stores handle for client closing */
|
||||
void* user; /* user's own data handle */
|
||||
} loc_glue_cb_entry_s_type;
|
||||
|
||||
loc_glue_cb_entry_s_type loc_glue_callback_table[LOC_API_CB_MAX_CLIENTS];
|
||||
|
||||
#define RPC_FUNC_VERSION_BASE(a,b) a ## b
|
||||
#define RPC_FUNC_VERSION(a,b) RPC_FUNC_VERSION_BASE(a,b)
|
||||
|
||||
#define RPC_CALLBACK_FUNC_VERSION_BASE(a,v,b) a ## v ## b
|
||||
#define RPC_CALLBACK_FUNC_VERSION(a,v,b) RPC_CALLBACK_FUNC_VERSION_BASE(a,v,b)
|
||||
|
||||
#define LOC_GLUE_CHECK_INIT(ret_type) \
|
||||
if (loc_api_clnt == NULL) { EXIT_LOG_CALLFLOW(%d, RPC_LOC_API_RPC_FAILURE); return (ret_type) RPC_LOC_API_RPC_FAILURE; }
|
||||
|
||||
#define LOC_GLUE_CHECK_RESULT(stat, ret_type) \
|
||||
if (stat != RPC_SUCCESS) { \
|
||||
LOC_LOGE("%s:%d] failure code %d", __func__, __LINE__, stat); \
|
||||
return (ret_type)((stat == RPC_SUBSYSTEM_RESTART) ? \
|
||||
RPC_LOC_API_RPC_MODEM_RESTART : RPC_LOC_API_RPC_FAILURE); \
|
||||
}
|
||||
|
||||
/* Callback functions */
|
||||
/* Returns 1 if successful */
|
||||
bool_t rpc_loc_event_cb_f_type_svc(
|
||||
rpc_loc_event_cb_f_type_args *argp,
|
||||
rpc_loc_event_cb_f_type_rets *ret,
|
||||
struct svc_req *req)
|
||||
{
|
||||
// The lower word of cd_id is the index
|
||||
int index = argp->cb_id & 0xFFFF;
|
||||
|
||||
/* Callback not registered, or unexpected ID (shouldn't happen) */
|
||||
if (index >= LOC_API_CB_MAX_CLIENTS || loc_glue_callback_table[index].cb_func == NULL)
|
||||
{
|
||||
LOC_LOGE("Warning: No callback handler %d.\n", index);
|
||||
ret->loc_event_cb_f_type_result = 0;
|
||||
return 1; /* simply return */
|
||||
}
|
||||
|
||||
LOC_LOGV("proc: %x prog: %x vers: %x\n",
|
||||
(int) req->rq_proc,
|
||||
(int) req->rq_prog,
|
||||
(int) req->rq_vers);
|
||||
|
||||
LOC_LOGV("Callback received: %x (cb_id=%p handle=%d ret_ptr=%d)\n",
|
||||
(int) argp->loc_event,
|
||||
argp->cb_id,
|
||||
(int) argp->loc_handle,
|
||||
(int) ret);
|
||||
|
||||
/* Forward callback to real callback procedure */
|
||||
rpc_loc_client_handle_type loc_handle = argp->loc_handle;
|
||||
rpc_loc_event_mask_type loc_event = argp->loc_event;
|
||||
const rpc_loc_event_payload_u_type* loc_event_payload =
|
||||
(const rpc_loc_event_payload_u_type*) argp->loc_event_payload;
|
||||
|
||||
/* Gives control to synchronous call handler */
|
||||
loc_api_callback_process_sync_call(loc_handle, loc_event, loc_event_payload);
|
||||
|
||||
int32 rc = (loc_glue_callback_table[index].cb_func)(loc_glue_callback_table[index].user,
|
||||
loc_handle, loc_event, loc_event_payload);
|
||||
|
||||
LOC_LOGV("cb_func=%p", loc_glue_callback_table[index].cb_func);
|
||||
|
||||
ret->loc_event_cb_f_type_result = rc;
|
||||
|
||||
return 1; /* ok */
|
||||
}
|
||||
|
||||
int loc_apicbprog_freeresult (SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result)
|
||||
{
|
||||
xdr_free (xdr_result, result);
|
||||
|
||||
/*
|
||||
* Insert additional freeing code here, if needed
|
||||
*/
|
||||
// LOC_LOGD("***** loc_apicbprog_freeresult\n");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION rpc_loc_event_cb_f_type_<version>_svc (MACRO)
|
||||
|
||||
DESCRIPTION
|
||||
Callback function for Loc API
|
||||
|
||||
RETURN VALUE
|
||||
1 for success
|
||||
0 for failure
|
||||
|
||||
===========================================================================*/
|
||||
bool_t RPC_CALLBACK_FUNC_VERSION(rpc_loc_event_cb_f_type_, RPC_LOC_EVENT_CB_F_TYPE_VERSION, _svc) (
|
||||
rpc_loc_event_cb_f_type_args *argp,
|
||||
rpc_loc_event_cb_f_type_rets *ret,
|
||||
struct svc_req *req)
|
||||
{
|
||||
return rpc_loc_event_cb_f_type_svc(argp, ret, req);
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_apicbprog_<version>_freeresult (MACRO)
|
||||
|
||||
DESCRIPTION
|
||||
Free up RPC data structure
|
||||
|
||||
RETURN VALUE
|
||||
1 for success
|
||||
0 for failure
|
||||
|
||||
===========================================================================*/
|
||||
#define VERSION_CONCAT(MAJOR,MINOR) MAJOR##MINOR
|
||||
#define loc_apicb_prog_VER_freeresult(M,N) \
|
||||
int RPC_CALLBACK_FUNC_VERSION(loc_apicbprog_, VERSION_CONCAT(M,N), _freeresult) \
|
||||
(SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result) \
|
||||
{ \
|
||||
return loc_apicbprog_freeresult(transp, xdr_result, result); \
|
||||
}
|
||||
|
||||
/* Define all of the possible minors */
|
||||
loc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0001);
|
||||
loc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0002);
|
||||
loc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0003);
|
||||
loc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0004);
|
||||
loc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0005);
|
||||
loc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0006);
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION rpc_loc_api_cb_null_<version>_svc (MACRO) [Patch for wrong RPCGEN stubs]
|
||||
|
||||
DESCRIPTION
|
||||
Null callback function for Loc API
|
||||
|
||||
RETURN VALUE
|
||||
1 for success
|
||||
|
||||
===========================================================================*/
|
||||
#define rpc_loc_api_cb_null_VER_svc(M,N) \
|
||||
bool_t RPC_CALLBACK_FUNC_VERSION(rpc_loc_api_cb_null_, VERSION_CONCAT(M,N), _svc) ( \
|
||||
void *a, int *b, struct svc_req *req) \
|
||||
{ \
|
||||
return 1; \
|
||||
}
|
||||
|
||||
/* Define all of the possible minors */
|
||||
rpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0001);
|
||||
rpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0002);
|
||||
rpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0003);
|
||||
rpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0004);
|
||||
rpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0005);
|
||||
rpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0006);
|
||||
|
||||
static void loc_api_glue_rpc_cb(CLIENT* client, enum rpc_reset_event event)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++) {
|
||||
if (NULL != loc_glue_callback_table[i].rpc_cb) {
|
||||
loc_glue_callback_table[i].rpc_cb(loc_glue_callback_table[i].user, client, event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_api_glue_init
|
||||
|
||||
DESCRIPTION
|
||||
Initiates the RPC client
|
||||
|
||||
RETURN VALUE
|
||||
1 for success
|
||||
0 for failure
|
||||
|
||||
===========================================================================*/
|
||||
int loc_api_glue_init(void)
|
||||
{
|
||||
if (loc_api_clnt == NULL)
|
||||
{
|
||||
/* Initialize data */
|
||||
int i;
|
||||
int pid = getpid();
|
||||
for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++)
|
||||
{
|
||||
loc_glue_callback_table[i].cb_id = i | (pid << 16);
|
||||
loc_glue_callback_table[i].cb_func = NULL;
|
||||
loc_glue_callback_table[i].handle = -1;
|
||||
loc_glue_callback_table[i].rpc_cb = NULL;
|
||||
loc_glue_callback_table[i].user = NULL;
|
||||
}
|
||||
|
||||
/* Print msg */
|
||||
LOC_LOGV("Trying to create RPC client...\n");
|
||||
loc_api_clnt = clnt_create(NULL, LOC_APIPROG, LOC_APIVERS, NULL);
|
||||
LOC_LOGV("Created loc_api_clnt ---- %x\n", (unsigned int)loc_api_clnt);
|
||||
|
||||
if (loc_api_clnt == NULL)
|
||||
{
|
||||
LOC_LOGE("Error: cannot create RPC client.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Init RPC callbacks */
|
||||
loc_api_sync_call_init();
|
||||
|
||||
int rc = loc_apicb_app_init();
|
||||
if (rc >= 0)
|
||||
{
|
||||
LOC_LOGD("Loc API RPC client initialized.\n");
|
||||
clnt_register_reset_notification_cb(loc_api_clnt, loc_api_glue_rpc_cb);
|
||||
}
|
||||
else {
|
||||
LOC_LOGE("Loc API callback initialization failed.\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
rpc_loc_client_handle_type loc_open (
|
||||
rpc_loc_event_mask_type event_reg_mask,
|
||||
loc_event_cb_f_type *event_callback,
|
||||
loc_reset_notif_cb_f_type *rpc_cb,
|
||||
void* userData
|
||||
)
|
||||
{
|
||||
int try_num = RPC_TRY_NUM;
|
||||
ENTRY_LOG();
|
||||
LOC_GLUE_CHECK_INIT(rpc_loc_client_handle_type);
|
||||
|
||||
rpc_loc_client_handle_type ret_val;
|
||||
|
||||
rpc_loc_open_args args;
|
||||
args.event_reg_mask = event_reg_mask;
|
||||
|
||||
int i, j = LOC_API_CB_MAX_CLIENTS;
|
||||
for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++)
|
||||
{
|
||||
if (loc_glue_callback_table[i].user == userData)
|
||||
{
|
||||
LOC_LOGW("Client already opened service (callback=%p)...\n",
|
||||
event_callback);
|
||||
break;
|
||||
} else if (j == LOC_API_CB_MAX_CLIENTS &&
|
||||
loc_glue_callback_table[i].user == NULL) {
|
||||
j = i;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == LOC_API_CB_MAX_CLIENTS)
|
||||
{
|
||||
i = j;
|
||||
}
|
||||
|
||||
if (i == LOC_API_CB_MAX_CLIENTS)
|
||||
{
|
||||
LOC_LOGE("Too many clients opened at once...\n");
|
||||
return RPC_LOC_CLIENT_HANDLE_INVALID;
|
||||
}
|
||||
|
||||
loc_glue_callback_table[i].cb_func = event_callback;
|
||||
loc_glue_callback_table[i].rpc_cb = rpc_cb;
|
||||
loc_glue_callback_table[i].user = userData;
|
||||
|
||||
args.event_callback = loc_glue_callback_table[i].cb_id;
|
||||
LOC_LOGV("cb_id=%d, func=0x%x", i, (unsigned int) event_callback);
|
||||
|
||||
rpc_loc_open_rets rets;
|
||||
enum clnt_stat stat = RPC_SUCCESS;
|
||||
|
||||
EXIT_LOG_CALLFLOW(%s, "loc client open");
|
||||
|
||||
/*try more for rpc_loc_open_xx()*/
|
||||
|
||||
do
|
||||
{
|
||||
stat = RPC_FUNC_VERSION(rpc_loc_open_, RPC_LOC_OPEN_VERSION)(&args, &rets, loc_api_clnt);
|
||||
ret_val = (rpc_loc_client_handle_type) rets.loc_open_result;
|
||||
try_num--;
|
||||
|
||||
}while( (RPC_SUCCESS != stat||0 > ret_val) && 0 != try_num );
|
||||
|
||||
LOC_GLUE_CHECK_RESULT(stat, int32);
|
||||
|
||||
/* save the handle in the table */
|
||||
loc_glue_callback_table[i].handle = (rpc_loc_client_handle_type) rets.loc_open_result;
|
||||
|
||||
return ret_val;
|
||||
|
||||
}
|
||||
|
||||
int32 loc_close
|
||||
(
|
||||
rpc_loc_client_handle_type handle
|
||||
)
|
||||
{
|
||||
ENTRY_LOG();
|
||||
LOC_GLUE_CHECK_INIT(int32);
|
||||
|
||||
int32 ret_val;
|
||||
|
||||
rpc_loc_close_args args;
|
||||
args.handle = handle;
|
||||
|
||||
rpc_loc_close_rets rets;
|
||||
enum clnt_stat stat = RPC_SUCCESS;
|
||||
|
||||
EXIT_LOG_CALLFLOW(%s, "loc client close");
|
||||
stat = RPC_FUNC_VERSION(rpc_loc_close_, RPC_LOC_CLOSE_VERSION)(&args, &rets, loc_api_clnt);
|
||||
|
||||
loc_clear(handle);
|
||||
|
||||
LOC_GLUE_CHECK_RESULT(stat, int32);
|
||||
ret_val = (int32) rets.loc_close_result;
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
void loc_clear(rpc_loc_client_handle_type handle) {
|
||||
/* Clean the client's callback function in callback table */
|
||||
int i;
|
||||
for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++)
|
||||
{
|
||||
if (loc_glue_callback_table[i].handle == handle)
|
||||
{
|
||||
/* Found the client */
|
||||
loc_glue_callback_table[i].cb_func = NULL;
|
||||
loc_glue_callback_table[i].rpc_cb = NULL;
|
||||
loc_glue_callback_table[i].handle = -1;
|
||||
loc_glue_callback_table[i].user = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == LOC_API_CB_MAX_CLIENTS)
|
||||
{
|
||||
LOC_LOGW("Handle not found (handle=%d)...\n", (int) handle);
|
||||
}
|
||||
}
|
||||
|
||||
int32 loc_start_fix
|
||||
(
|
||||
rpc_loc_client_handle_type handle
|
||||
)
|
||||
{
|
||||
ENTRY_LOG();
|
||||
LOC_GLUE_CHECK_INIT(int32);
|
||||
|
||||
int32 ret_val;
|
||||
|
||||
rpc_loc_start_fix_args args;
|
||||
args.handle = handle;
|
||||
|
||||
rpc_loc_start_fix_rets rets;
|
||||
enum clnt_stat stat = RPC_SUCCESS;
|
||||
|
||||
EXIT_LOG_CALLFLOW(%s, "loc start fix");
|
||||
stat = RPC_FUNC_VERSION(rpc_loc_start_fix_, RPC_LOC_START_FIX_VERSION)(&args, &rets, loc_api_clnt);
|
||||
LOC_GLUE_CHECK_RESULT(stat, int32);
|
||||
|
||||
ret_val = (int32) rets.loc_start_fix_result;
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
int32 loc_stop_fix
|
||||
(
|
||||
rpc_loc_client_handle_type handle
|
||||
)
|
||||
{
|
||||
ENTRY_LOG();
|
||||
LOC_GLUE_CHECK_INIT(int32);
|
||||
|
||||
int32 ret_val;
|
||||
|
||||
rpc_loc_stop_fix_args args;
|
||||
args.handle = handle;
|
||||
|
||||
rpc_loc_stop_fix_rets rets;
|
||||
enum clnt_stat stat = RPC_SUCCESS;
|
||||
|
||||
EXIT_LOG_CALLFLOW(%s, "loc stop fix");
|
||||
stat = RPC_FUNC_VERSION(rpc_loc_stop_fix_, RPC_LOC_STOP_FIX_VERSION)(&args, &rets, loc_api_clnt);
|
||||
LOC_GLUE_CHECK_RESULT(stat, int32);
|
||||
|
||||
ret_val = (int32) rets.loc_stop_fix_result;
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
int32 loc_ioctl
|
||||
(
|
||||
rpc_loc_client_handle_type handle,
|
||||
rpc_loc_ioctl_e_type ioctl_type,
|
||||
rpc_loc_ioctl_data_u_type* ioctl_data
|
||||
)
|
||||
{
|
||||
ENTRY_LOG();
|
||||
LOC_GLUE_CHECK_INIT(int32);
|
||||
|
||||
int32 ret_val;
|
||||
|
||||
rpc_loc_ioctl_args args;
|
||||
args.handle = handle;
|
||||
args.ioctl_data = ioctl_data;
|
||||
args.ioctl_type = ioctl_type;
|
||||
if (ioctl_data != NULL)
|
||||
{
|
||||
/* Assign ioctl union discriminator */
|
||||
ioctl_data->disc = ioctl_type;
|
||||
|
||||
/* In case the user hasn't filled in other disc fields,
|
||||
automatically fill them in here */
|
||||
switch (ioctl_type)
|
||||
{
|
||||
case RPC_LOC_IOCTL_GET_API_VERSION:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_SET_FIX_CRITERIA:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_GET_FIX_CRITERIA:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_INFORM_NI_USER_RESPONSE:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_VALIDITY:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_SET_PREDICTED_ORBITS_DATA_AUTO_DOWNLOAD:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_INJECT_UTC_TIME:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_INJECT_RTC_VALUE:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_INJECT_POSITION:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_QUERY_ENGINE_STATE:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_INFORM_SERVER_CLOSE_STATUS:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_SET_ENGINE_LOCK:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_GET_ENGINE_LOCK:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_SET_SBAS_CONFIG:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_GET_SBAS_CONFIG:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_SET_NMEA_TYPES:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_GET_NMEA_TYPES:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_SET_CDMA_PDE_SERVER_ADDR:
|
||||
case RPC_LOC_IOCTL_SET_CDMA_MPC_SERVER_ADDR:
|
||||
case RPC_LOC_IOCTL_SET_UMTS_SLP_SERVER_ADDR:
|
||||
case RPC_LOC_IOCTL_SET_CUSTOM_PDE_SERVER_ADDR:
|
||||
args.ioctl_data->rpc_loc_ioctl_data_u_type_u.server_addr.addr_info.disc =
|
||||
args.ioctl_data->rpc_loc_ioctl_data_u_type_u.server_addr.addr_type;
|
||||
break;
|
||||
case RPC_LOC_IOCTL_GET_CDMA_PDE_SERVER_ADDR:
|
||||
case RPC_LOC_IOCTL_GET_CDMA_MPC_SERVER_ADDR:
|
||||
case RPC_LOC_IOCTL_GET_UMTS_SLP_SERVER_ADDR:
|
||||
case RPC_LOC_IOCTL_GET_CUSTOM_PDE_SERVER_ADDR:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_SET_ON_DEMAND_LPM:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_GET_ON_DEMAND_LPM:
|
||||
break;
|
||||
case RPC_LOC_IOCTL_DELETE_ASSIST_DATA:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
} /* switch */
|
||||
} /* ioctl_data != NULL */
|
||||
|
||||
rpc_loc_ioctl_rets rets;
|
||||
enum clnt_stat stat = RPC_SUCCESS;
|
||||
|
||||
EXIT_LOG_CALLFLOW(%s, loc_get_ioctl_type_name(ioctl_type));
|
||||
stat = RPC_FUNC_VERSION(rpc_loc_ioctl_, RPC_LOC_IOCTL_VERSION)(&args, &rets, loc_api_clnt);
|
||||
LOC_GLUE_CHECK_RESULT(stat, int32);
|
||||
|
||||
ret_val = (int32) rets.loc_ioctl_result;
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/* Returns 0 if error */
|
||||
int32 loc_api_null(void)
|
||||
{
|
||||
LOC_GLUE_CHECK_INIT(int32);
|
||||
|
||||
int32 rets;
|
||||
enum clnt_stat stat = RPC_SUCCESS;
|
||||
|
||||
clnt_unregister_reset_notification_cb(loc_api_clnt);
|
||||
stat = RPC_FUNC_VERSION(rpc_loc_api_null_, RPC_LOC_API_NULL_VERSION)(NULL, &rets, loc_api_clnt);
|
||||
LOC_GLUE_CHECK_RESULT(stat, int32);
|
||||
|
||||
return (int32) rets;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_eng_ioctl
|
||||
|
||||
DESCRIPTION
|
||||
This function calls loc_ioctl and waits for the callback result before
|
||||
returning back to the user.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
TRUE if successful
|
||||
FALSE if failed
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_ioctl
|
||||
(
|
||||
rpc_loc_client_handle_type handle,
|
||||
rpc_loc_ioctl_e_type ioctl_type,
|
||||
rpc_loc_ioctl_data_u_type* ioctl_data_ptr,
|
||||
uint32 timeout_msec,
|
||||
rpc_loc_ioctl_callback_s_type *cb_data_ptr
|
||||
)
|
||||
{
|
||||
int ret_val = RPC_LOC_API_SUCCESS;
|
||||
|
||||
ret_val = loc_api_sync_ioctl(handle, ioctl_type, ioctl_data_ptr, timeout_msec, cb_data_ptr);
|
||||
|
||||
LOC_LOGD("loc_eng_ioctl result: client = %d, ioctl_type = %s, returt %s\n",
|
||||
(int32) handle,
|
||||
loc_get_ioctl_type_name(ioctl_type),
|
||||
loc_get_ioctl_status_name(ret_val) );
|
||||
|
||||
return ret_val;
|
||||
}
|
@ -0,0 +1,565 @@
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <sys/time.h>
|
||||
#include <string.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include <rpc/rpc.h>
|
||||
#include <loc_api_rpc_glue.h>
|
||||
#include "loc_api_sync_call.h"
|
||||
|
||||
/* Logging */
|
||||
#define LOG_TAG "LocSvc_api_rpc_glue"
|
||||
// #define LOG_NDDEBUG 0
|
||||
#ifndef USE_GLIB
|
||||
#include <utils/Log.h>
|
||||
#endif /* USE_GLIB */
|
||||
|
||||
/***************************************************************************
|
||||
* DATA FOR ASYNCHRONOUS RPC PROCESSING
|
||||
**************************************************************************/
|
||||
loc_sync_call_slot_array_s_type loc_sync_data;
|
||||
|
||||
pthread_mutex_t loc_sync_call_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
boolean loc_sync_call_inited = 0;
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_api_sync_call_init
|
||||
|
||||
DESCRIPTION
|
||||
Initialize this module
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
none
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
void loc_api_sync_call_init()
|
||||
{
|
||||
pthread_mutex_lock(&loc_sync_call_mutex);
|
||||
if (loc_sync_call_inited == 1) {
|
||||
pthread_mutex_unlock(&loc_sync_call_mutex);
|
||||
return;
|
||||
}
|
||||
loc_sync_call_inited = 1;
|
||||
|
||||
loc_sync_data.num_of_slots = LOC_SYNC_CALL_SLOTS_MAX;
|
||||
|
||||
int i;
|
||||
for (i = 0; i < loc_sync_data.num_of_slots; i++)
|
||||
{
|
||||
loc_sync_call_slot_s_type *slot = &loc_sync_data.slots[i];
|
||||
|
||||
pthread_mutex_init(&slot->lock, NULL);
|
||||
pthread_cond_init(&slot->loc_cb_arrived_cond, NULL);
|
||||
|
||||
slot->not_available = 0;
|
||||
slot->in_use = 0;
|
||||
slot->loc_handle = -1;
|
||||
slot->loc_cb_wait_event_mask = 0; /* event to wait */
|
||||
slot->loc_cb_received_event_mask = 0; /* received event */
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&loc_sync_call_mutex);
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_api_sync_call_destroy
|
||||
|
||||
DESCRIPTION
|
||||
Initialize this module
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
none
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
void loc_api_sync_call_destroy()
|
||||
{
|
||||
int i;
|
||||
|
||||
pthread_mutex_lock(&loc_sync_call_mutex);
|
||||
if (loc_sync_call_inited == 0) {
|
||||
pthread_mutex_unlock(&loc_sync_call_mutex);
|
||||
return;
|
||||
}
|
||||
loc_sync_call_inited = 0;
|
||||
|
||||
for (i = 0; i < loc_sync_data.num_of_slots; i++)
|
||||
{
|
||||
loc_sync_call_slot_s_type *slot = &loc_sync_data.slots[i];
|
||||
|
||||
pthread_mutex_lock(&slot->lock);
|
||||
|
||||
slot->not_available = 1;
|
||||
|
||||
pthread_mutex_unlock(&slot->lock);
|
||||
|
||||
pthread_cond_destroy(&slot->loc_cb_arrived_cond);
|
||||
pthread_mutex_destroy(&slot->lock);
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&loc_sync_call_mutex);
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_match_callback
|
||||
|
||||
DESCRIPTION
|
||||
Checks if an awaited event has arrived
|
||||
|
||||
RETURN VALUE
|
||||
TRUE arrived
|
||||
FALSE not matching
|
||||
|
||||
===========================================================================*/
|
||||
static boolean loc_match_callback(
|
||||
rpc_loc_event_mask_type wait_mask,
|
||||
rpc_loc_ioctl_e_type wait_ioctl,
|
||||
rpc_loc_event_mask_type event_mask,
|
||||
const rpc_loc_event_payload_u_type *callback_payload
|
||||
)
|
||||
{
|
||||
if ((event_mask & wait_mask) == 0) return FALSE;
|
||||
|
||||
if (event_mask != RPC_LOC_EVENT_IOCTL_REPORT || wait_ioctl == 0 ||
|
||||
( (callback_payload != NULL) &&
|
||||
callback_payload->rpc_loc_event_payload_u_type_u.ioctl_report.type == wait_ioctl) )
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_api_callback_process_sync_call
|
||||
|
||||
DESCRIPTION
|
||||
Wakes up blocked API calls to check if the needed callback has arrived
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
none
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
void loc_api_callback_process_sync_call(
|
||||
rpc_loc_client_handle_type loc_handle, /* handle of the client */
|
||||
rpc_loc_event_mask_type loc_event, /* event mask */
|
||||
const rpc_loc_event_payload_u_type* loc_event_payload /* payload */
|
||||
)
|
||||
{
|
||||
int i;
|
||||
|
||||
ALOGV("loc_handle = 0x%lx, loc_event = 0x%lx", loc_handle, loc_event);
|
||||
for (i = 0; i < loc_sync_data.num_of_slots; i++)
|
||||
{
|
||||
loc_sync_call_slot_s_type *slot = &loc_sync_data.slots[i];
|
||||
|
||||
pthread_mutex_lock(&slot->lock);
|
||||
|
||||
if (slot->in_use &&
|
||||
slot->signal_sent == 0 &&
|
||||
slot->loc_handle == loc_handle &&
|
||||
loc_match_callback(slot->loc_cb_wait_event_mask, slot->ioctl_type, loc_event, loc_event_payload))
|
||||
{
|
||||
memcpy(&slot->loc_cb_received_payload, loc_event_payload, sizeof (rpc_loc_event_payload_u_type));
|
||||
|
||||
slot->loc_cb_received_event_mask = loc_event;
|
||||
|
||||
ALOGV("signal slot %d in_use %d, loc_handle 0x%lx, event_mask 0x%1x, ioctl_type %d", i, slot->in_use, slot->loc_handle, (int) slot->loc_cb_wait_event_mask, (int) slot->ioctl_type);
|
||||
pthread_cond_signal(&slot->loc_cb_arrived_cond);
|
||||
slot->signal_sent = 1;
|
||||
|
||||
pthread_mutex_unlock(&slot->lock);
|
||||
break;
|
||||
} else {
|
||||
/* do nothing */
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&slot->lock);
|
||||
}
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_lock_a_slot
|
||||
|
||||
DESCRIPTION
|
||||
Allocates a buffer slot for the synchronous API call
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Select ID (>=0) : successful
|
||||
-1 : buffer full
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
static int loc_lock_a_slot()
|
||||
{
|
||||
int i, select_id = -1; /* no free buffer */
|
||||
|
||||
for (i = 0; i < loc_sync_data.num_of_slots; i++)
|
||||
{
|
||||
loc_sync_call_slot_s_type *slot = &loc_sync_data.slots[i];
|
||||
if (pthread_mutex_trylock(&slot->lock) == EBUSY)
|
||||
{
|
||||
ALOGV("trylock EBUSY : %d", i);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!slot->in_use && !slot->not_available)
|
||||
{
|
||||
select_id = i;
|
||||
/* Return from here and leave the mutex locked.
|
||||
* will unlock it in loc_unlock_slot()
|
||||
*/
|
||||
break;
|
||||
}
|
||||
/* ALOGV("slot %d in_use = %d, not_available = %d : %d", i, slot->in_use, slot->not_available, i); */
|
||||
pthread_mutex_unlock(&slot->lock);
|
||||
}
|
||||
|
||||
return select_id;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_unlock_slot
|
||||
|
||||
DESCRIPTION
|
||||
Unlocks a buffer slot
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
None
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
static void loc_unlock_slot(int select_id)
|
||||
{
|
||||
pthread_mutex_unlock(&loc_sync_data.slots[select_id].lock);
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_lock_slot
|
||||
|
||||
DESCRIPTION
|
||||
Locks a specific slot that was previously locked from loc_lock_a_slot
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
None
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
static void loc_lock_slot(int select_id)
|
||||
{
|
||||
pthread_mutex_lock(&loc_sync_data.slots[select_id].lock);
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_set_slot_in_use
|
||||
|
||||
DESCRIPTION
|
||||
Sets the in_use flag of slot to true or false.
|
||||
Should be called only after the slot is locked
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
None
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
static void loc_set_slot_in_use(int select_id, boolean in_use)
|
||||
{
|
||||
loc_sync_data.slots[select_id].in_use = in_use;
|
||||
if (in_use == 1)
|
||||
loc_sync_data.slots[select_id].signal_sent = 0;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_api_save_callback
|
||||
|
||||
DESCRIPTION
|
||||
Selects which callback or IOCTL event to wait for.
|
||||
|
||||
The event_mask specifies the event(s). If it is RPC_LOC_EVENT_IOCTL_REPORT,
|
||||
then ioctl_type specifies the IOCTL event.
|
||||
|
||||
If ioctl_type is non-zero, RPC_LOC_EVENT_IOCTL_REPORT is automatically added.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Select ID (>=0) : successful
|
||||
-1 : out of buffer
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
static void loc_api_save_callback(
|
||||
int select_id, /* Selected slot */
|
||||
rpc_loc_client_handle_type loc_handle, /* Client handle */
|
||||
rpc_loc_event_mask_type event_mask, /* Event mask to wait for */
|
||||
rpc_loc_ioctl_e_type ioctl_type /* IOCTL type to wait for */
|
||||
)
|
||||
{
|
||||
loc_sync_call_slot_s_type *slot = &loc_sync_data.slots[select_id];
|
||||
|
||||
slot->loc_handle = loc_handle;
|
||||
|
||||
slot->loc_cb_wait_event_mask = event_mask;
|
||||
slot->ioctl_type = ioctl_type;
|
||||
if (ioctl_type) slot->loc_cb_wait_event_mask |= RPC_LOC_EVENT_IOCTL_REPORT;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_save_user_payload
|
||||
|
||||
DESCRIPTION
|
||||
Saves received payload into user data structures
|
||||
|
||||
RETURN VALUE
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
static void loc_save_user_payload(
|
||||
rpc_loc_event_payload_u_type *user_cb_payload,
|
||||
rpc_loc_ioctl_callback_s_type *user_ioctl_buffer,
|
||||
const rpc_loc_event_payload_u_type *received_cb_payload
|
||||
)
|
||||
{
|
||||
if (user_cb_payload)
|
||||
{
|
||||
memcpy(user_cb_payload, received_cb_payload,
|
||||
sizeof (rpc_loc_event_payload_u_type));
|
||||
}
|
||||
if (user_ioctl_buffer)
|
||||
{
|
||||
memcpy(user_ioctl_buffer,
|
||||
&received_cb_payload->rpc_loc_event_payload_u_type_u.ioctl_report,
|
||||
sizeof *user_ioctl_buffer);
|
||||
}
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_api_wait_callback
|
||||
|
||||
DESCRIPTION
|
||||
Waits for a selected callback. The wait expires in timeout_seconds seconds.
|
||||
|
||||
If the function is called before an existing wait has finished, it will
|
||||
immediately return EBUSY.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
RPC_LOC_API_SUCCESS if successful (0)
|
||||
RPC_LOC_API_TIMEOUT if timed out
|
||||
RPC_LOC_API_ENGINE_BUSY if already in a wait
|
||||
RPC_LOC_API_INVALID_PARAMETER if callback is not yet selected
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
static int loc_api_wait_callback(
|
||||
int select_id, /* ID from loc_select_callback() */
|
||||
int timeout_seconds, /* Timeout in this number of seconds */
|
||||
rpc_loc_event_payload_u_type *callback_payload, /* Pointer to callback payload buffer, can be NULL */
|
||||
rpc_loc_ioctl_callback_s_type *ioctl_payload /* Pointer to IOCTL payload, can be NULL */
|
||||
)
|
||||
{
|
||||
int ret_val = RPC_LOC_API_SUCCESS; /* the return value of this function: 0 = no error */
|
||||
int rc = 0; /* return code from pthread calls */
|
||||
|
||||
struct timespec expire_time;
|
||||
|
||||
loc_sync_call_slot_s_type *slot = &loc_sync_data.slots[select_id];
|
||||
|
||||
clock_gettime(CLOCK_REALTIME, &expire_time);
|
||||
expire_time.tv_sec += timeout_seconds;
|
||||
|
||||
/* Waiting */
|
||||
while (slot->signal_sent == 0 && rc != ETIMEDOUT) {
|
||||
rc = pthread_cond_timedwait(&slot->loc_cb_arrived_cond,
|
||||
&slot->lock, &expire_time);
|
||||
}
|
||||
|
||||
if (rc == ETIMEDOUT)
|
||||
{
|
||||
ret_val = RPC_LOC_API_TIMEOUT; /* Timed out */
|
||||
ALOGE("TIMEOUT: %d", select_id);
|
||||
}
|
||||
else {
|
||||
/* Obtained the first awaited callback */
|
||||
ret_val = RPC_LOC_API_SUCCESS; /* Successful */
|
||||
loc_save_user_payload(callback_payload, ioctl_payload, &slot->loc_cb_received_payload);
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_api_sync_ioctl
|
||||
|
||||
DESCRIPTION
|
||||
Synchronous IOCTL call (reentrant version)
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Loc API error code (0 = success)
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_api_sync_ioctl
|
||||
(
|
||||
rpc_loc_client_handle_type handle,
|
||||
rpc_loc_ioctl_e_type ioctl_type,
|
||||
rpc_loc_ioctl_data_u_type* ioctl_data_ptr,
|
||||
uint32 timeout_msec,
|
||||
rpc_loc_ioctl_callback_s_type *cb_data_ptr
|
||||
)
|
||||
{
|
||||
int rc = -1;
|
||||
int select_id;
|
||||
rpc_loc_ioctl_callback_s_type callback_data;
|
||||
|
||||
select_id = loc_lock_a_slot();
|
||||
|
||||
if (select_id < 0 || select_id >= loc_sync_data.num_of_slots)
|
||||
{
|
||||
ALOGE("slot not available ioctl_type = %s",
|
||||
loc_get_ioctl_type_name(ioctl_type));
|
||||
return rc;
|
||||
}
|
||||
|
||||
loc_set_slot_in_use(select_id, 1); // set slot in use to true
|
||||
|
||||
// Select the callback we are waiting for
|
||||
loc_api_save_callback(select_id, handle, 0, ioctl_type);
|
||||
|
||||
loc_unlock_slot(select_id); // slot is unlocked, but in_use is still true
|
||||
|
||||
// we want to avoid keeping the slot locked during the loc_ioctl because the rpc
|
||||
// framework will also lock a different mutex during this call, and typically
|
||||
// locking two different mutexes at the same time can lead to deadlock.
|
||||
rc = loc_ioctl(handle, ioctl_type, ioctl_data_ptr);
|
||||
|
||||
loc_lock_slot(select_id);
|
||||
|
||||
if (rc != RPC_LOC_API_SUCCESS)
|
||||
{
|
||||
ALOGE("loc_ioctl failed select_id = %d, ioctl_type %s, returned %s",
|
||||
select_id, loc_get_ioctl_type_name(ioctl_type), loc_get_ioctl_status_name(rc));
|
||||
}
|
||||
else {
|
||||
ALOGV("select_id = %d, ioctl_type %d, returned RPC_LOC_API_SUCCESS",
|
||||
select_id, ioctl_type);
|
||||
// Wait for the callback of loc_ioctl
|
||||
if ((rc = loc_api_wait_callback(select_id, timeout_msec / 1000, NULL, &callback_data)) != 0)
|
||||
{
|
||||
// Callback waiting failed
|
||||
ALOGE("callback wait failed select_id = %d, ioctl_type %s, returned %s",
|
||||
select_id, loc_get_ioctl_type_name(ioctl_type), loc_get_ioctl_status_name(rc));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cb_data_ptr) memcpy(cb_data_ptr, &callback_data, sizeof *cb_data_ptr);
|
||||
if (callback_data.status != RPC_LOC_API_SUCCESS)
|
||||
{
|
||||
rc = callback_data.status;
|
||||
ALOGE("callback status failed select_id = %d, ioctl_type %s, returned %s",
|
||||
select_id, loc_get_ioctl_type_name(ioctl_type), loc_get_ioctl_status_name(rc));
|
||||
} else {
|
||||
ALOGV("callback status success select_id = %d, ioctl_type %d, returned %d",
|
||||
select_id, ioctl_type, rc);
|
||||
}
|
||||
} /* wait callback */
|
||||
} /* loc_ioctl */
|
||||
|
||||
loc_set_slot_in_use(select_id, 0); // set slot in use to false
|
||||
loc_unlock_slot(select_id);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,86 @@
|
||||
/* 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 "rpc/rpc.h"
|
||||
|
||||
/* Include RPC headers */
|
||||
#ifdef USE_LOCAL_RPC
|
||||
#include "rpc_inc/loc_api_common.h"
|
||||
#include "rpc_inc/loc_api.h"
|
||||
#include "rpc_inc/loc_api_cb.h"
|
||||
#endif
|
||||
|
||||
#ifdef USE_QCOM_AUTO_RPC
|
||||
#include "loc_api_rpcgen_rpc.h"
|
||||
#include "loc_api_rpcgen_common_rpc.h"
|
||||
#include "loc_api_rpcgen_cb_rpc.h"
|
||||
#endif
|
||||
|
||||
#include "rpc_inc/loc_api_fixup.h"
|
||||
#include "loc_apicb_appinit.h"
|
||||
|
||||
#define RPC_FUNC_VERSION_BASE(a,b) a ## b
|
||||
#define RPC_CB_FUNC_VERS(a,b) RPC_FUNC_VERSION_BASE(a,b)
|
||||
|
||||
static SVCXPRT* svrPort = NULL;
|
||||
|
||||
extern void RPC_CB_FUNC_VERS(loc_apicbprog_,LOC_APICBVERS_0001)(struct svc_req *rqstp, register SVCXPRT *transp);
|
||||
|
||||
int loc_apicb_app_init(void)
|
||||
{
|
||||
|
||||
/* Register a callback server to use the loc_apicbprog_* function */
|
||||
if (svrPort == NULL) {
|
||||
svrPort = svcrtr_create();
|
||||
}
|
||||
if (!svrPort) return -1;
|
||||
|
||||
xprt_register(svrPort);
|
||||
if(svc_register(svrPort, LOC_APICBPROG, LOC_APICBVERS_0001, RPC_CB_FUNC_VERS(loc_apicbprog_,LOC_APICBVERS_0001),0))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
void loc_apicb_app_deinit(void)
|
||||
{
|
||||
if (svrPort == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
svc_unregister(svrPort, LOC_APICBPROG, LOC_APICBVERS_0001);
|
||||
xprt_unregister(svrPort);
|
||||
svc_destroy(svrPort);
|
||||
svrPort = NULL;
|
||||
}
|
||||
|
@ -0,0 +1,36 @@
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
# functions
|
||||
LOC_RPCGEN_APIS_PATH := $(TARGET_OUT_INTERMEDIATES)/loc_api/libloc_api_rpcgen_intermediates
|
||||
LOC_RPCGEN_APIS_PATH_FL := ../../../../../$(TARGET_OUT_INTERMEDIATES)/loc_api/libloc_api_rpcgen_intermediates
|
||||
|
||||
LOCAL_MODULE := libloc_api_rpcgen
|
||||
LOCAL_MODULE_OWNER := qcom
|
||||
|
||||
LOCAL_SHARED_LIBRARIES := \
|
||||
librpc \
|
||||
libcommondefs
|
||||
|
||||
LOCAL_SRC_FILES += \
|
||||
src/loc_api_rpcgen_cb_xdr.c \
|
||||
src/loc_api_rpcgen_common_xdr.c \
|
||||
src/loc_api_rpcgen_cb_svc.c \
|
||||
src/loc_api_rpcgen_clnt.c \
|
||||
src/loc_api_rpcgen_xdr.c
|
||||
|
||||
LOCAL_C_INCLUDES += hardware/msm7k/librpc
|
||||
LOCAL_C_INCLUDES += $(LOC_RPCGEN_APIS_PATH)/../../SHARED_LIBRARIES/libcommondefs_intermediates/inc
|
||||
LOCAL_C_INCLUDES += $(LOCAL_PATH)/inc
|
||||
LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/libcommondefs/rpcgen/inc
|
||||
|
||||
LOCAL_COPY_HEADERS_TO := loc_api/rpcgen/inc
|
||||
LOCAL_COPY_HEADERS := inc/loc_api_rpcgen_rpc.h
|
||||
LOCAL_COPY_HEADERS += inc/loc_api_rpcgen_common_rpc.h
|
||||
LOCAL_COPY_HEADERS += inc/loc_api_rpcgen_cb_rpc.h
|
||||
LOCAL_COPY_HEADERS += inc/loc_apicb_appinit.h
|
||||
|
||||
LOCAL_LDLIBS += -lpthread
|
||||
LOCAL_PRELINK_MODULE := false
|
||||
include $(BUILD_STATIC_LIBRARY)
|
@ -0,0 +1,42 @@
|
||||
AM_CFLAGS = \
|
||||
-I../../../utils \
|
||||
-I./inc \
|
||||
$(MSM7K_CFLAGS)
|
||||
|
||||
requiredlibs = \
|
||||
../../../utils/libgps_utils_so.la \
|
||||
$(MSM7K_LIBS)
|
||||
|
||||
h_sources = \
|
||||
inc/loc_api_rpcgen_rpc.h \
|
||||
inc/loc_api_rpcgen_common_rpc.h \
|
||||
inc/loc_api_rpcgen_cb_rpc.h \
|
||||
inc/loc_apicb_appinit.h
|
||||
|
||||
c_sources = \
|
||||
src/loc_api_rpcgen_cb_xdr.c \
|
||||
src/loc_api_rpcgen_common_xdr.c \
|
||||
src/loc_api_rpcgen_cb_svc.c \
|
||||
src/loc_api_rpcgen_clnt.c \
|
||||
src/loc_api_rpcgen_xdr.c
|
||||
|
||||
|
||||
|
||||
library_includedir = $(pkgincludedir)/libloc_api-rpc-50001/libloc_api-rpc-stub/inc
|
||||
library_include_HEADERS = $(h_sources)
|
||||
libloc_api_rpcgen_la_SOURCES = $(c_sources) $(h_sources)
|
||||
|
||||
if USE_GLIB
|
||||
libloc_api_rpcgen_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@
|
||||
libloc_api_rpcgen_la_LDFLAGS = -lstdc++ -lpthread @GLIB_LIBS@ -shared -version-info 1:0:0
|
||||
libloc_api_rpcgen_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@
|
||||
else
|
||||
libloc_api_rpcgen_la_CFLAGS = $(AM_CFLAGS)
|
||||
libloc_api_rpcgen_la_LDFLAGS = -lpthread -shared -version-info 1:0:0
|
||||
libloc_api_rpcgen_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS)
|
||||
endif
|
||||
|
||||
libloc_api_rpcgen_la_LIBADD = $(requiredlibs) -lstdc++
|
||||
|
||||
#Create and Install Libraries
|
||||
lib_LTLIBRARIES = libloc_api_rpcgen.la
|
@ -0,0 +1,156 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* Please do not edit this file.
|
||||
* It was generated using rpcgen.
|
||||
*/
|
||||
|
||||
#ifndef _LOC_API_CB_RPC_H_RPCGEN
|
||||
#define _LOC_API_CB_RPC_H_RPCGEN
|
||||
|
||||
#include "librpc.h"
|
||||
#include "commondefs_rpcgen_rpc.h"
|
||||
#include "loc_api_rpcgen_common_rpc.h"
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
struct rpc_loc_event_cb_f_type_args {
|
||||
rpc_uint32 cb_id;
|
||||
rpc_loc_client_handle_type loc_handle;
|
||||
rpc_loc_event_mask_type loc_event;
|
||||
rpc_loc_event_payload_u_type *loc_event_payload;
|
||||
};
|
||||
typedef struct rpc_loc_event_cb_f_type_args rpc_loc_event_cb_f_type_args;
|
||||
|
||||
struct rpc_loc_event_cb_f_type_rets {
|
||||
rpc_int32 loc_event_cb_f_type_result;
|
||||
};
|
||||
typedef struct rpc_loc_event_cb_f_type_rets rpc_loc_event_cb_f_type_rets;
|
||||
#define LOC_APICBVERS 0x00050006
|
||||
|
||||
#define LOC_APICBPROG 0x3100008C
|
||||
#define LOC_APICBVERS_0001 0x00050001
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
#define rpc_loc_event_cb_f_type 1
|
||||
extern enum clnt_stat rpc_loc_event_cb_f_type_0x00050001(rpc_loc_event_cb_f_type_args *, rpc_loc_event_cb_f_type_rets *, CLIENT *);
|
||||
extern bool_t rpc_loc_event_cb_f_type_0x00050001_svc(rpc_loc_event_cb_f_type_args *, rpc_loc_event_cb_f_type_rets *, struct svc_req *);
|
||||
extern int loc_apicbprog_0x00050001_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
#define rpc_loc_event_cb_f_type 1
|
||||
extern enum clnt_stat rpc_loc_event_cb_f_type_0x00050001();
|
||||
extern bool_t rpc_loc_event_cb_f_type_0x00050001_svc();
|
||||
extern int loc_apicbprog_0x00050001_freeresult ();
|
||||
#endif /* K&R C */
|
||||
#define LOC_APICBVERS_0002 0x00050002
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
#define rpc_loc_api_cb_null 0xffffff00
|
||||
extern enum clnt_stat rpc_loc_api_cb_null_0x00050002(void *, int *, CLIENT *);
|
||||
extern bool_t rpc_loc_api_cb_null_0x00050002_svc(void *, int *, struct svc_req *);
|
||||
extern int loc_apicbprog_0x00050002_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
#define rpc_loc_api_cb_null 0xffffff00
|
||||
extern enum clnt_stat rpc_loc_api_cb_null_0x00050002();
|
||||
extern bool_t rpc_loc_api_cb_null_0x00050002_svc();
|
||||
extern int loc_apicbprog_0x00050002_freeresult ();
|
||||
#endif /* K&R C */
|
||||
#define LOC_APICBVERS_0003 0x00050003
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
extern enum clnt_stat rpc_loc_api_cb_null_0x00050003(void *, int *, CLIENT *);
|
||||
extern bool_t rpc_loc_api_cb_null_0x00050003_svc(void *, int *, struct svc_req *);
|
||||
extern int loc_apicbprog_0x00050003_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
extern enum clnt_stat rpc_loc_api_cb_null_0x00050003();
|
||||
extern bool_t rpc_loc_api_cb_null_0x00050003_svc();
|
||||
extern int loc_apicbprog_0x00050003_freeresult ();
|
||||
#endif /* K&R C */
|
||||
#define LOC_APICBVERS_0004 0x00050004
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
extern enum clnt_stat rpc_loc_api_cb_null_0x00050004(void *, int *, CLIENT *);
|
||||
extern bool_t rpc_loc_api_cb_null_0x00050004_svc(void *, int *, struct svc_req *);
|
||||
extern int loc_apicbprog_0x00050004_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
extern enum clnt_stat rpc_loc_api_cb_null_0x00050004();
|
||||
extern bool_t rpc_loc_api_cb_null_0x00050004_svc();
|
||||
extern int loc_apicbprog_0x00050004_freeresult ();
|
||||
#endif /* K&R C */
|
||||
#define LOC_APICBVERS_0005 0x00050005
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
extern enum clnt_stat rpc_loc_api_cb_null_0x00050005(void *, int *, CLIENT *);
|
||||
extern bool_t rpc_loc_api_cb_null_0x00050005_svc(void *, int *, struct svc_req *);
|
||||
extern int loc_apicbprog_0x00050005_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
extern enum clnt_stat rpc_loc_api_cb_null_0x00050005();
|
||||
extern bool_t rpc_loc_api_cb_null_0x00050005_svc();
|
||||
extern int loc_apicbprog_0x00050005_freeresult ();
|
||||
#endif /* K&R C */
|
||||
#define LOC_APICBVERS_0006 0x00050006
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
extern enum clnt_stat rpc_loc_api_cb_null_0x00050006(void *, int *, CLIENT *);
|
||||
extern bool_t rpc_loc_api_cb_null_0x00050006_svc(void *, int *, struct svc_req *);
|
||||
extern int loc_apicbprog_0x00050006_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
extern enum clnt_stat rpc_loc_api_cb_null_0x00050006();
|
||||
extern bool_t rpc_loc_api_cb_null_0x00050006_svc();
|
||||
extern int loc_apicbprog_0x00050006_freeresult ();
|
||||
#endif /* K&R C */
|
||||
|
||||
/* the xdr functions */
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
extern bool_t xdr_rpc_loc_event_cb_f_type_args (XDR *, rpc_loc_event_cb_f_type_args*);
|
||||
extern bool_t xdr_rpc_loc_event_cb_f_type_rets (XDR *, rpc_loc_event_cb_f_type_rets*);
|
||||
|
||||
#else /* K&R C */
|
||||
extern bool_t xdr_rpc_loc_event_cb_f_type_args ();
|
||||
extern bool_t xdr_rpc_loc_event_cb_f_type_rets ();
|
||||
|
||||
#endif /* K&R C */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !_LOC_API_CB_RPC_H_RPCGEN */
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,288 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* Please do not edit this file.
|
||||
* It was generated using rpcgen.
|
||||
*/
|
||||
|
||||
#ifndef _LOC_API_RPC_H_RPCGEN
|
||||
#define _LOC_API_RPC_H_RPCGEN
|
||||
|
||||
#include "librpc.h"
|
||||
#include "commondefs_rpcgen_rpc.h"
|
||||
#include "loc_api_rpcgen_common_rpc.h"
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct {
|
||||
u_int rpc_loc_api_api_versions_return_type_len;
|
||||
rpc_uint32 *rpc_loc_api_api_versions_return_type_val;
|
||||
} rpc_loc_api_api_versions_return_type;
|
||||
|
||||
typedef rpc_uint32 rpc_loc_event_cb_f_type;
|
||||
|
||||
struct rpc_loc_open_args {
|
||||
rpc_loc_event_mask_type event_reg_mask;
|
||||
rpc_loc_event_cb_f_type event_callback;
|
||||
};
|
||||
typedef struct rpc_loc_open_args rpc_loc_open_args;
|
||||
|
||||
struct rpc_loc_close_args {
|
||||
rpc_loc_client_handle_type handle;
|
||||
};
|
||||
typedef struct rpc_loc_close_args rpc_loc_close_args;
|
||||
|
||||
struct rpc_loc_start_fix_args {
|
||||
rpc_loc_client_handle_type handle;
|
||||
};
|
||||
typedef struct rpc_loc_start_fix_args rpc_loc_start_fix_args;
|
||||
|
||||
struct rpc_loc_stop_fix_args {
|
||||
rpc_loc_client_handle_type handle;
|
||||
};
|
||||
typedef struct rpc_loc_stop_fix_args rpc_loc_stop_fix_args;
|
||||
|
||||
struct rpc_loc_ioctl_args {
|
||||
rpc_loc_client_handle_type handle;
|
||||
rpc_loc_ioctl_e_type ioctl_type;
|
||||
rpc_loc_ioctl_data_u_type *ioctl_data;
|
||||
};
|
||||
typedef struct rpc_loc_ioctl_args rpc_loc_ioctl_args;
|
||||
|
||||
struct rpc_loc_api_api_version_s_args {
|
||||
rpc_boolean len_not_null;
|
||||
};
|
||||
typedef struct rpc_loc_api_api_version_s_args rpc_loc_api_api_version_s_args;
|
||||
|
||||
struct rpc_loc_api_rpc_glue_code_info_remote_rets {
|
||||
rpc_uint32 toolvers;
|
||||
rpc_uint32 features;
|
||||
rpc_uint32 proghash;
|
||||
rpc_uint32 cbproghash;
|
||||
};
|
||||
typedef struct rpc_loc_api_rpc_glue_code_info_remote_rets rpc_loc_api_rpc_glue_code_info_remote_rets;
|
||||
|
||||
struct rpc_loc_open_rets {
|
||||
rpc_loc_client_handle_type loc_open_result;
|
||||
};
|
||||
typedef struct rpc_loc_open_rets rpc_loc_open_rets;
|
||||
|
||||
struct rpc_loc_close_rets {
|
||||
rpc_int32 loc_close_result;
|
||||
};
|
||||
typedef struct rpc_loc_close_rets rpc_loc_close_rets;
|
||||
|
||||
struct rpc_loc_start_fix_rets {
|
||||
rpc_int32 loc_start_fix_result;
|
||||
};
|
||||
typedef struct rpc_loc_start_fix_rets rpc_loc_start_fix_rets;
|
||||
|
||||
struct rpc_loc_stop_fix_rets {
|
||||
rpc_int32 loc_stop_fix_result;
|
||||
};
|
||||
typedef struct rpc_loc_stop_fix_rets rpc_loc_stop_fix_rets;
|
||||
|
||||
struct rpc_loc_ioctl_rets {
|
||||
rpc_int32 loc_ioctl_result;
|
||||
};
|
||||
typedef struct rpc_loc_ioctl_rets rpc_loc_ioctl_rets;
|
||||
|
||||
struct rpc_loc_api_api_versions_rets {
|
||||
rpc_loc_api_api_versions_return_type loc_api_api_versions_result;
|
||||
rpc_uint32 *len;
|
||||
};
|
||||
typedef struct rpc_loc_api_api_versions_rets rpc_loc_api_api_versions_rets;
|
||||
#define LOC_APIVERS 0x00050006
|
||||
|
||||
#define LOC_APIPROG 0x3000008C
|
||||
#define LOC_APIVERS_0001 0x00050001
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
#define rpc_loc_api_null 0
|
||||
extern enum clnt_stat rpc_loc_api_null_0x00050001(void *, void *, CLIENT *);
|
||||
extern bool_t rpc_loc_api_null_0x00050001_svc(void *, void *, struct svc_req *);
|
||||
#define rpc_loc_api_rpc_glue_code_info_remote 1
|
||||
extern enum clnt_stat rpc_loc_api_rpc_glue_code_info_remote_0x00050001(void *, rpc_loc_api_rpc_glue_code_info_remote_rets *, CLIENT *);
|
||||
extern bool_t rpc_loc_api_rpc_glue_code_info_remote_0x00050001_svc(void *, rpc_loc_api_rpc_glue_code_info_remote_rets *, struct svc_req *);
|
||||
#define rpc_loc_open 2
|
||||
extern enum clnt_stat rpc_loc_open_0x00050001(rpc_loc_open_args *, rpc_loc_open_rets *, CLIENT *);
|
||||
extern bool_t rpc_loc_open_0x00050001_svc(rpc_loc_open_args *, rpc_loc_open_rets *, struct svc_req *);
|
||||
#define rpc_loc_close 3
|
||||
extern enum clnt_stat rpc_loc_close_0x00050001(rpc_loc_close_args *, rpc_loc_close_rets *, CLIENT *);
|
||||
extern bool_t rpc_loc_close_0x00050001_svc(rpc_loc_close_args *, rpc_loc_close_rets *, struct svc_req *);
|
||||
#define rpc_loc_start_fix 4
|
||||
extern enum clnt_stat rpc_loc_start_fix_0x00050001(rpc_loc_start_fix_args *, rpc_loc_start_fix_rets *, CLIENT *);
|
||||
extern bool_t rpc_loc_start_fix_0x00050001_svc(rpc_loc_start_fix_args *, rpc_loc_start_fix_rets *, struct svc_req *);
|
||||
#define rpc_loc_stop_fix 5
|
||||
extern enum clnt_stat rpc_loc_stop_fix_0x00050001(rpc_loc_stop_fix_args *, rpc_loc_stop_fix_rets *, CLIENT *);
|
||||
extern bool_t rpc_loc_stop_fix_0x00050001_svc(rpc_loc_stop_fix_args *, rpc_loc_stop_fix_rets *, struct svc_req *);
|
||||
#define rpc_loc_ioctl 6
|
||||
extern enum clnt_stat rpc_loc_ioctl_0x00050001(rpc_loc_ioctl_args *, rpc_loc_ioctl_rets *, CLIENT *);
|
||||
extern bool_t rpc_loc_ioctl_0x00050001_svc(rpc_loc_ioctl_args *, rpc_loc_ioctl_rets *, struct svc_req *);
|
||||
#define rpc_loc_api_api_versions 0xFFFFFFFF
|
||||
extern enum clnt_stat rpc_loc_api_api_versions_0x00050001(void *, rpc_loc_api_api_versions_rets *, CLIENT *);
|
||||
extern bool_t rpc_loc_api_api_versions_0x00050001_svc(void *, rpc_loc_api_api_versions_rets *, struct svc_req *);
|
||||
extern int loc_apiprog_0x00050001_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
#define rpc_loc_api_null 0
|
||||
extern enum clnt_stat rpc_loc_api_null_0x00050001();
|
||||
extern bool_t rpc_loc_api_null_0x00050001_svc();
|
||||
#define rpc_loc_api_rpc_glue_code_info_remote 1
|
||||
extern enum clnt_stat rpc_loc_api_rpc_glue_code_info_remote_0x00050001();
|
||||
extern bool_t rpc_loc_api_rpc_glue_code_info_remote_0x00050001_svc();
|
||||
#define rpc_loc_open 2
|
||||
extern enum clnt_stat rpc_loc_open_0x00050001();
|
||||
extern bool_t rpc_loc_open_0x00050001_svc();
|
||||
#define rpc_loc_close 3
|
||||
extern enum clnt_stat rpc_loc_close_0x00050001();
|
||||
extern bool_t rpc_loc_close_0x00050001_svc();
|
||||
#define rpc_loc_start_fix 4
|
||||
extern enum clnt_stat rpc_loc_start_fix_0x00050001();
|
||||
extern bool_t rpc_loc_start_fix_0x00050001_svc();
|
||||
#define rpc_loc_stop_fix 5
|
||||
extern enum clnt_stat rpc_loc_stop_fix_0x00050001();
|
||||
extern bool_t rpc_loc_stop_fix_0x00050001_svc();
|
||||
#define rpc_loc_ioctl 6
|
||||
extern enum clnt_stat rpc_loc_ioctl_0x00050001();
|
||||
extern bool_t rpc_loc_ioctl_0x00050001_svc();
|
||||
#define rpc_loc_api_api_versions 0xFFFFFFFF
|
||||
extern enum clnt_stat rpc_loc_api_api_versions_0x00050001();
|
||||
extern bool_t rpc_loc_api_api_versions_0x00050001_svc();
|
||||
extern int loc_apiprog_0x00050001_freeresult ();
|
||||
#endif /* K&R C */
|
||||
#define LOC_APIVERS_0002 0x00050002
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
extern enum clnt_stat rpc_loc_api_null_0x00050002(void *, void *, CLIENT *);
|
||||
extern bool_t rpc_loc_api_null_0x00050002_svc(void *, void *, struct svc_req *);
|
||||
extern int loc_apiprog_0x00050002_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
extern enum clnt_stat rpc_loc_api_null_0x00050002();
|
||||
extern bool_t rpc_loc_api_null_0x00050002_svc();
|
||||
extern int loc_apiprog_0x00050002_freeresult ();
|
||||
#endif /* K&R C */
|
||||
#define LOC_APIVERS_0003 0x00050003
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
extern enum clnt_stat rpc_loc_api_null_0x00050003(void *, void *, CLIENT *);
|
||||
extern bool_t rpc_loc_api_null_0x00050003_svc(void *, void *, struct svc_req *);
|
||||
extern int loc_apiprog_0x00050003_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
extern enum clnt_stat rpc_loc_api_null_0x00050003();
|
||||
extern bool_t rpc_loc_api_null_0x00050003_svc();
|
||||
extern int loc_apiprog_0x00050003_freeresult ();
|
||||
#endif /* K&R C */
|
||||
#define LOC_APIVERS_0004 0x00050004
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
extern enum clnt_stat rpc_loc_api_null_0x00050004(void *, void *, CLIENT *);
|
||||
extern bool_t rpc_loc_api_null_0x00050004_svc(void *, void *, struct svc_req *);
|
||||
extern int loc_apiprog_0x00050004_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
extern enum clnt_stat rpc_loc_api_null_0x00050004();
|
||||
extern bool_t rpc_loc_api_null_0x00050004_svc();
|
||||
extern int loc_apiprog_0x00050004_freeresult ();
|
||||
#endif /* K&R C */
|
||||
#define LOC_APIVERS_0005 0x00050005
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
extern enum clnt_stat rpc_loc_api_null_0x00050005(void *, void *, CLIENT *);
|
||||
extern bool_t rpc_loc_api_null_0x00050005_svc(void *, void *, struct svc_req *);
|
||||
extern int loc_apiprog_0x00050005_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
extern enum clnt_stat rpc_loc_api_null_0x00050005();
|
||||
extern bool_t rpc_loc_api_null_0x00050005_svc();
|
||||
extern int loc_apiprog_0x00050005_freeresult ();
|
||||
#endif /* K&R C */
|
||||
#define LOC_APIVERS_0006 0x00050006
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
extern enum clnt_stat rpc_loc_api_null_0x00050006(void *, void *, CLIENT *);
|
||||
extern bool_t rpc_loc_api_null_0x00050006_svc(void *, void *, struct svc_req *);
|
||||
extern int loc_apiprog_0x00050006_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
extern enum clnt_stat rpc_loc_api_null_0x00050006();
|
||||
extern bool_t rpc_loc_api_null_0x00050006_svc();
|
||||
extern int loc_apiprog_0x00050006_freeresult ();
|
||||
#endif /* K&R C */
|
||||
|
||||
/* the xdr functions */
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
extern bool_t xdr_rpc_loc_api_api_versions_return_type (XDR *, rpc_loc_api_api_versions_return_type*);
|
||||
extern bool_t xdr_rpc_loc_event_cb_f_type (XDR *, rpc_loc_event_cb_f_type*);
|
||||
extern bool_t xdr_rpc_loc_open_args (XDR *, rpc_loc_open_args*);
|
||||
extern bool_t xdr_rpc_loc_close_args (XDR *, rpc_loc_close_args*);
|
||||
extern bool_t xdr_rpc_loc_start_fix_args (XDR *, rpc_loc_start_fix_args*);
|
||||
extern bool_t xdr_rpc_loc_stop_fix_args (XDR *, rpc_loc_stop_fix_args*);
|
||||
extern bool_t xdr_rpc_loc_ioctl_args (XDR *, rpc_loc_ioctl_args*);
|
||||
extern bool_t xdr_rpc_loc_api_api_version_s_args (XDR *, rpc_loc_api_api_version_s_args*);
|
||||
extern bool_t xdr_rpc_loc_api_rpc_glue_code_info_remote_rets (XDR *, rpc_loc_api_rpc_glue_code_info_remote_rets*);
|
||||
extern bool_t xdr_rpc_loc_open_rets (XDR *, rpc_loc_open_rets*);
|
||||
extern bool_t xdr_rpc_loc_close_rets (XDR *, rpc_loc_close_rets*);
|
||||
extern bool_t xdr_rpc_loc_start_fix_rets (XDR *, rpc_loc_start_fix_rets*);
|
||||
extern bool_t xdr_rpc_loc_stop_fix_rets (XDR *, rpc_loc_stop_fix_rets*);
|
||||
extern bool_t xdr_rpc_loc_ioctl_rets (XDR *, rpc_loc_ioctl_rets*);
|
||||
extern bool_t xdr_rpc_loc_api_api_versions_rets (XDR *, rpc_loc_api_api_versions_rets*);
|
||||
|
||||
#else /* K&R C */
|
||||
extern bool_t xdr_rpc_loc_api_api_versions_return_type ();
|
||||
extern bool_t xdr_rpc_loc_event_cb_f_type ();
|
||||
extern bool_t xdr_rpc_loc_open_args ();
|
||||
extern bool_t xdr_rpc_loc_close_args ();
|
||||
extern bool_t xdr_rpc_loc_start_fix_args ();
|
||||
extern bool_t xdr_rpc_loc_stop_fix_args ();
|
||||
extern bool_t xdr_rpc_loc_ioctl_args ();
|
||||
extern bool_t xdr_rpc_loc_api_api_version_s_args ();
|
||||
extern bool_t xdr_rpc_loc_api_rpc_glue_code_info_remote_rets ();
|
||||
extern bool_t xdr_rpc_loc_open_rets ();
|
||||
extern bool_t xdr_rpc_loc_close_rets ();
|
||||
extern bool_t xdr_rpc_loc_start_fix_rets ();
|
||||
extern bool_t xdr_rpc_loc_stop_fix_rets ();
|
||||
extern bool_t xdr_rpc_loc_ioctl_rets ();
|
||||
extern bool_t xdr_rpc_loc_api_api_versions_rets ();
|
||||
|
||||
#endif /* K&R C */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !_LOC_API_RPC_H_RPCGEN */
|
@ -0,0 +1,34 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
/* Initialization function for callbacks */
|
||||
int loc_apicb_app_init();
|
||||
|
||||
void loc_apicb_app_deinit();
|
||||
|
@ -0,0 +1,327 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* Please do not edit this file.
|
||||
* It was generated using rpcgen.
|
||||
*/
|
||||
|
||||
#include "loc_api_rpcgen_cb_rpc.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <rpc/pmap_clnt.h>
|
||||
#include <string.h>
|
||||
#include <memory.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#ifndef SIG_PF
|
||||
#define SIG_PF void(*)(int)
|
||||
#endif
|
||||
|
||||
void
|
||||
loc_apicbprog_0x00050001(struct svc_req *rqstp, register SVCXPRT *transp)
|
||||
{
|
||||
union {
|
||||
rpc_loc_event_cb_f_type_args rpc_loc_event_cb_f_type_0x00050001_arg;
|
||||
} argument;
|
||||
union {
|
||||
rpc_loc_event_cb_f_type_rets rpc_loc_event_cb_f_type_0x00050001_res;
|
||||
} result;
|
||||
bool_t retval;
|
||||
xdrproc_t _xdr_argument, _xdr_result;
|
||||
bool_t (*local)(char *, void *, struct svc_req *);
|
||||
|
||||
switch (rqstp->rq_proc) {
|
||||
case NULLPROC:
|
||||
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);
|
||||
return;
|
||||
|
||||
case rpc_loc_event_cb_f_type:
|
||||
_xdr_argument = (xdrproc_t) xdr_rpc_loc_event_cb_f_type_args;
|
||||
_xdr_result = (xdrproc_t) xdr_rpc_loc_event_cb_f_type_rets;
|
||||
local = (bool_t (*) (char *, void *, struct svc_req *))rpc_loc_event_cb_f_type_0x00050001_svc;
|
||||
break;
|
||||
|
||||
default:
|
||||
svcerr_noproc (transp);
|
||||
return;
|
||||
}
|
||||
memset ((char *)&argument, 0, sizeof (argument));
|
||||
if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
|
||||
svcerr_decode (transp);
|
||||
return;
|
||||
}
|
||||
retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
|
||||
if (retval > 0 && !svc_sendreply(transp, (xdrproc_t) _xdr_result, (char *)&result)) {
|
||||
svcerr_systemerr (transp);
|
||||
}
|
||||
if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
|
||||
fprintf (stderr, "%s", "unable to free arguments");
|
||||
exit (1);
|
||||
}
|
||||
if (!loc_apicbprog_0x00050001_freeresult (transp, _xdr_result, (caddr_t) &result))
|
||||
fprintf (stderr, "%s", "unable to free results");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
loc_apicbprog_0x00050002(struct svc_req *rqstp, register SVCXPRT *transp)
|
||||
{
|
||||
union {
|
||||
int fill;
|
||||
} argument;
|
||||
union {
|
||||
int rpc_loc_api_cb_null_0x00050002_res;
|
||||
} result;
|
||||
bool_t retval;
|
||||
xdrproc_t _xdr_argument, _xdr_result;
|
||||
bool_t (*local)(char *, void *, struct svc_req *);
|
||||
|
||||
switch (rqstp->rq_proc) {
|
||||
case NULLPROC:
|
||||
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);
|
||||
return;
|
||||
|
||||
case rpc_loc_api_cb_null:
|
||||
_xdr_argument = (xdrproc_t) xdr_void;
|
||||
_xdr_result = (xdrproc_t) xdr_int;
|
||||
local = (bool_t (*) (char *, void *, struct svc_req *))rpc_loc_api_cb_null_0x00050002_svc;
|
||||
break;
|
||||
|
||||
default:
|
||||
svcerr_noproc (transp);
|
||||
return;
|
||||
}
|
||||
memset ((char *)&argument, 0, sizeof (argument));
|
||||
if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
|
||||
svcerr_decode (transp);
|
||||
return;
|
||||
}
|
||||
retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
|
||||
if (retval > 0 && !svc_sendreply(transp, (xdrproc_t) _xdr_result, (char *)&result)) {
|
||||
svcerr_systemerr (transp);
|
||||
}
|
||||
if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
|
||||
fprintf (stderr, "%s", "unable to free arguments");
|
||||
exit (1);
|
||||
}
|
||||
if (!loc_apicbprog_0x00050002_freeresult (transp, _xdr_result, (caddr_t) &result))
|
||||
fprintf (stderr, "%s", "unable to free results");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
loc_apicbprog_0x00050003(struct svc_req *rqstp, register SVCXPRT *transp)
|
||||
{
|
||||
union {
|
||||
int fill;
|
||||
} argument;
|
||||
union {
|
||||
int rpc_loc_api_cb_null_0x00050003_res;
|
||||
} result;
|
||||
bool_t retval;
|
||||
xdrproc_t _xdr_argument, _xdr_result;
|
||||
bool_t (*local)(char *, void *, struct svc_req *);
|
||||
|
||||
switch (rqstp->rq_proc) {
|
||||
case NULLPROC:
|
||||
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);
|
||||
return;
|
||||
|
||||
case rpc_loc_api_cb_null:
|
||||
_xdr_argument = (xdrproc_t) xdr_void;
|
||||
_xdr_result = (xdrproc_t) xdr_int;
|
||||
local = (bool_t (*) (char *, void *, struct svc_req *))rpc_loc_api_cb_null_0x00050003_svc;
|
||||
break;
|
||||
|
||||
default:
|
||||
svcerr_noproc (transp);
|
||||
return;
|
||||
}
|
||||
memset ((char *)&argument, 0, sizeof (argument));
|
||||
if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
|
||||
svcerr_decode (transp);
|
||||
return;
|
||||
}
|
||||
retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
|
||||
if (retval > 0 && !svc_sendreply(transp, (xdrproc_t) _xdr_result, (char *)&result)) {
|
||||
svcerr_systemerr (transp);
|
||||
}
|
||||
if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
|
||||
fprintf (stderr, "%s", "unable to free arguments");
|
||||
exit (1);
|
||||
}
|
||||
if (!loc_apicbprog_0x00050003_freeresult (transp, _xdr_result, (caddr_t) &result))
|
||||
fprintf (stderr, "%s", "unable to free results");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
loc_apicbprog_0x00050004(struct svc_req *rqstp, register SVCXPRT *transp)
|
||||
{
|
||||
union {
|
||||
int fill;
|
||||
} argument;
|
||||
union {
|
||||
int rpc_loc_api_cb_null_0x00050004_res;
|
||||
} result;
|
||||
bool_t retval;
|
||||
xdrproc_t _xdr_argument, _xdr_result;
|
||||
bool_t (*local)(char *, void *, struct svc_req *);
|
||||
|
||||
switch (rqstp->rq_proc) {
|
||||
case NULLPROC:
|
||||
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);
|
||||
return;
|
||||
|
||||
case rpc_loc_api_cb_null:
|
||||
_xdr_argument = (xdrproc_t) xdr_void;
|
||||
_xdr_result = (xdrproc_t) xdr_int;
|
||||
local = (bool_t (*) (char *, void *, struct svc_req *))rpc_loc_api_cb_null_0x00050004_svc;
|
||||
break;
|
||||
|
||||
default:
|
||||
svcerr_noproc (transp);
|
||||
return;
|
||||
}
|
||||
memset ((char *)&argument, 0, sizeof (argument));
|
||||
if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
|
||||
svcerr_decode (transp);
|
||||
return;
|
||||
}
|
||||
retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
|
||||
if (retval > 0 && !svc_sendreply(transp, (xdrproc_t) _xdr_result, (char *)&result)) {
|
||||
svcerr_systemerr (transp);
|
||||
}
|
||||
if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
|
||||
fprintf (stderr, "%s", "unable to free arguments");
|
||||
exit (1);
|
||||
}
|
||||
if (!loc_apicbprog_0x00050004_freeresult (transp, _xdr_result, (caddr_t) &result))
|
||||
fprintf (stderr, "%s", "unable to free results");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
loc_apicbprog_0x00050005(struct svc_req *rqstp, register SVCXPRT *transp)
|
||||
{
|
||||
union {
|
||||
int fill;
|
||||
} argument;
|
||||
union {
|
||||
int rpc_loc_api_cb_null_0x00050005_res;
|
||||
} result;
|
||||
bool_t retval;
|
||||
xdrproc_t _xdr_argument, _xdr_result;
|
||||
bool_t (*local)(char *, void *, struct svc_req *);
|
||||
|
||||
switch (rqstp->rq_proc) {
|
||||
case NULLPROC:
|
||||
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);
|
||||
return;
|
||||
|
||||
case rpc_loc_api_cb_null:
|
||||
_xdr_argument = (xdrproc_t) xdr_void;
|
||||
_xdr_result = (xdrproc_t) xdr_int;
|
||||
local = (bool_t (*) (char *, void *, struct svc_req *))rpc_loc_api_cb_null_0x00050005_svc;
|
||||
break;
|
||||
|
||||
default:
|
||||
svcerr_noproc (transp);
|
||||
return;
|
||||
}
|
||||
memset ((char *)&argument, 0, sizeof (argument));
|
||||
if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
|
||||
svcerr_decode (transp);
|
||||
return;
|
||||
}
|
||||
retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
|
||||
if (retval > 0 && !svc_sendreply(transp, (xdrproc_t) _xdr_result, (char *)&result)) {
|
||||
svcerr_systemerr (transp);
|
||||
}
|
||||
if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
|
||||
fprintf (stderr, "%s", "unable to free arguments");
|
||||
exit (1);
|
||||
}
|
||||
if (!loc_apicbprog_0x00050005_freeresult (transp, _xdr_result, (caddr_t) &result))
|
||||
fprintf (stderr, "%s", "unable to free results");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
loc_apicbprog_0x00050006(struct svc_req *rqstp, register SVCXPRT *transp)
|
||||
{
|
||||
union {
|
||||
int fill;
|
||||
} argument;
|
||||
union {
|
||||
int rpc_loc_api_cb_null_0x00050006_res;
|
||||
} result;
|
||||
bool_t retval;
|
||||
xdrproc_t _xdr_argument, _xdr_result;
|
||||
bool_t (*local)(char *, void *, struct svc_req *);
|
||||
|
||||
switch (rqstp->rq_proc) {
|
||||
case NULLPROC:
|
||||
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);
|
||||
return;
|
||||
|
||||
case rpc_loc_api_cb_null:
|
||||
_xdr_argument = (xdrproc_t) xdr_void;
|
||||
_xdr_result = (xdrproc_t) xdr_int;
|
||||
local = (bool_t (*) (char *, void *, struct svc_req *))rpc_loc_api_cb_null_0x00050006_svc;
|
||||
break;
|
||||
|
||||
default:
|
||||
svcerr_noproc (transp);
|
||||
return;
|
||||
}
|
||||
memset ((char *)&argument, 0, sizeof (argument));
|
||||
if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
|
||||
svcerr_decode (transp);
|
||||
return;
|
||||
}
|
||||
retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
|
||||
if (retval > 0 && !svc_sendreply(transp, (xdrproc_t) _xdr_result, (char *)&result)) {
|
||||
svcerr_systemerr (transp);
|
||||
}
|
||||
if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
|
||||
fprintf (stderr, "%s", "unable to free arguments");
|
||||
exit (1);
|
||||
}
|
||||
if (!loc_apicbprog_0x00050006_freeresult (transp, _xdr_result, (caddr_t) &result))
|
||||
fprintf (stderr, "%s", "unable to free results");
|
||||
|
||||
return;
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* Please do not edit this file.
|
||||
* It was generated using rpcgen.
|
||||
*/
|
||||
|
||||
#include "loc_api_rpcgen_cb_rpc.h"
|
||||
|
||||
bool_t
|
||||
xdr_rpc_loc_event_cb_f_type_args (XDR *xdrs, rpc_loc_event_cb_f_type_args *objp)
|
||||
{
|
||||
;
|
||||
|
||||
if (!xdr_rpc_uint32 (xdrs, &objp->cb_id))
|
||||
return FALSE;
|
||||
if (!xdr_rpc_loc_client_handle_type (xdrs, &objp->loc_handle))
|
||||
return FALSE;
|
||||
if (!xdr_rpc_loc_event_mask_type (xdrs, &objp->loc_event))
|
||||
return FALSE;
|
||||
if (!xdr_pointer (xdrs, (char **)&objp->loc_event_payload, sizeof (rpc_loc_event_payload_u_type), (xdrproc_t) xdr_rpc_loc_event_payload_u_type))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_rpc_loc_event_cb_f_type_rets (XDR *xdrs, rpc_loc_event_cb_f_type_rets *objp)
|
||||
{
|
||||
;
|
||||
|
||||
if (!xdr_rpc_int32 (xdrs, &objp->loc_event_cb_f_type_result))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
@ -0,0 +1,155 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* Please do not edit this file.
|
||||
* It was generated using rpcgen.
|
||||
*/
|
||||
|
||||
#include <memory.h> /* for memset */
|
||||
#include "loc_api_rpcgen_rpc.h"
|
||||
|
||||
/* Default timeout can be changed using clnt_control() */
|
||||
static struct timeval TIMEOUT = { 25, 0 };
|
||||
|
||||
enum clnt_stat
|
||||
rpc_loc_api_null_0x00050001(void *argp, void *clnt_res, CLIENT *clnt)
|
||||
{
|
||||
return (clnt_call(clnt, rpc_loc_api_null,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) clnt_res,
|
||||
TIMEOUT));
|
||||
}
|
||||
|
||||
enum clnt_stat
|
||||
rpc_loc_api_rpc_glue_code_info_remote_0x00050001(void *argp, rpc_loc_api_rpc_glue_code_info_remote_rets *clnt_res, CLIENT *clnt)
|
||||
{
|
||||
return (clnt_call(clnt, rpc_loc_api_rpc_glue_code_info_remote,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_rpc_loc_api_rpc_glue_code_info_remote_rets, (caddr_t) clnt_res,
|
||||
TIMEOUT));
|
||||
}
|
||||
|
||||
enum clnt_stat
|
||||
rpc_loc_open_0x00050001(rpc_loc_open_args *argp, rpc_loc_open_rets *clnt_res, CLIENT *clnt)
|
||||
{
|
||||
return (clnt_call(clnt, rpc_loc_open,
|
||||
(xdrproc_t) xdr_rpc_loc_open_args, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_rpc_loc_open_rets, (caddr_t) clnt_res,
|
||||
TIMEOUT));
|
||||
}
|
||||
|
||||
enum clnt_stat
|
||||
rpc_loc_close_0x00050001(rpc_loc_close_args *argp, rpc_loc_close_rets *clnt_res, CLIENT *clnt)
|
||||
{
|
||||
return (clnt_call(clnt, rpc_loc_close,
|
||||
(xdrproc_t) xdr_rpc_loc_close_args, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_rpc_loc_close_rets, (caddr_t) clnt_res,
|
||||
TIMEOUT));
|
||||
}
|
||||
|
||||
enum clnt_stat
|
||||
rpc_loc_start_fix_0x00050001(rpc_loc_start_fix_args *argp, rpc_loc_start_fix_rets *clnt_res, CLIENT *clnt)
|
||||
{
|
||||
return (clnt_call(clnt, rpc_loc_start_fix,
|
||||
(xdrproc_t) xdr_rpc_loc_start_fix_args, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_rpc_loc_start_fix_rets, (caddr_t) clnt_res,
|
||||
TIMEOUT));
|
||||
}
|
||||
|
||||
enum clnt_stat
|
||||
rpc_loc_stop_fix_0x00050001(rpc_loc_stop_fix_args *argp, rpc_loc_stop_fix_rets *clnt_res, CLIENT *clnt)
|
||||
{
|
||||
return (clnt_call(clnt, rpc_loc_stop_fix,
|
||||
(xdrproc_t) xdr_rpc_loc_stop_fix_args, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_rpc_loc_stop_fix_rets, (caddr_t) clnt_res,
|
||||
TIMEOUT));
|
||||
}
|
||||
|
||||
enum clnt_stat
|
||||
rpc_loc_ioctl_0x00050001(rpc_loc_ioctl_args *argp, rpc_loc_ioctl_rets *clnt_res, CLIENT *clnt)
|
||||
{
|
||||
return (clnt_call(clnt, rpc_loc_ioctl,
|
||||
(xdrproc_t) xdr_rpc_loc_ioctl_args, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_rpc_loc_ioctl_rets, (caddr_t) clnt_res,
|
||||
TIMEOUT));
|
||||
}
|
||||
|
||||
enum clnt_stat
|
||||
rpc_loc_api_api_versions_0x00050001(void *argp, rpc_loc_api_api_versions_rets *clnt_res, CLIENT *clnt)
|
||||
{
|
||||
return (clnt_call(clnt, rpc_loc_api_api_versions,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_rpc_loc_api_api_versions_rets, (caddr_t) clnt_res,
|
||||
TIMEOUT));
|
||||
}
|
||||
|
||||
enum clnt_stat
|
||||
rpc_loc_api_null_0x00050002(void *argp, void *clnt_res, CLIENT *clnt)
|
||||
{
|
||||
return (clnt_call(clnt, rpc_loc_api_null,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) clnt_res,
|
||||
TIMEOUT));
|
||||
}
|
||||
|
||||
enum clnt_stat
|
||||
rpc_loc_api_null_0x00050003(void *argp, void *clnt_res, CLIENT *clnt)
|
||||
{
|
||||
return (clnt_call(clnt, rpc_loc_api_null,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) clnt_res,
|
||||
TIMEOUT));
|
||||
}
|
||||
|
||||
enum clnt_stat
|
||||
rpc_loc_api_null_0x00050004(void *argp, void *clnt_res, CLIENT *clnt)
|
||||
{
|
||||
return (clnt_call(clnt, rpc_loc_api_null,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) clnt_res,
|
||||
TIMEOUT));
|
||||
}
|
||||
|
||||
enum clnt_stat
|
||||
rpc_loc_api_null_0x00050005(void *argp, void *clnt_res, CLIENT *clnt)
|
||||
{
|
||||
return (clnt_call(clnt, rpc_loc_api_null,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) clnt_res,
|
||||
TIMEOUT));
|
||||
}
|
||||
|
||||
enum clnt_stat
|
||||
rpc_loc_api_null_0x00050006(void *argp, void *clnt_res, CLIENT *clnt)
|
||||
{
|
||||
return (clnt_call(clnt, rpc_loc_api_null,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) clnt_res,
|
||||
TIMEOUT));
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,199 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* Please do not edit this file.
|
||||
* It was generated using rpcgen.
|
||||
*/
|
||||
|
||||
#include "loc_api_rpcgen_rpc.h"
|
||||
|
||||
bool_t
|
||||
xdr_rpc_loc_api_api_versions_return_type (XDR *xdrs, rpc_loc_api_api_versions_return_type *objp)
|
||||
{
|
||||
;
|
||||
|
||||
if (!xdr_array (xdrs, (char **)&objp->rpc_loc_api_api_versions_return_type_val, (u_int *) &objp->rpc_loc_api_api_versions_return_type_len, ~0,
|
||||
sizeof (rpc_uint32), (xdrproc_t) xdr_rpc_uint32))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_rpc_loc_event_cb_f_type (XDR *xdrs, rpc_loc_event_cb_f_type *objp)
|
||||
{
|
||||
;
|
||||
|
||||
if (!xdr_rpc_uint32 (xdrs, objp))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_rpc_loc_open_args (XDR *xdrs, rpc_loc_open_args *objp)
|
||||
{
|
||||
;
|
||||
|
||||
if (!xdr_rpc_loc_event_mask_type (xdrs, &objp->event_reg_mask))
|
||||
return FALSE;
|
||||
if (!xdr_rpc_loc_event_cb_f_type (xdrs, &objp->event_callback))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_rpc_loc_close_args (XDR *xdrs, rpc_loc_close_args *objp)
|
||||
{
|
||||
;
|
||||
|
||||
if (!xdr_rpc_loc_client_handle_type (xdrs, &objp->handle))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_rpc_loc_start_fix_args (XDR *xdrs, rpc_loc_start_fix_args *objp)
|
||||
{
|
||||
;
|
||||
|
||||
if (!xdr_rpc_loc_client_handle_type (xdrs, &objp->handle))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_rpc_loc_stop_fix_args (XDR *xdrs, rpc_loc_stop_fix_args *objp)
|
||||
{
|
||||
;
|
||||
|
||||
if (!xdr_rpc_loc_client_handle_type (xdrs, &objp->handle))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_rpc_loc_ioctl_args (XDR *xdrs, rpc_loc_ioctl_args *objp)
|
||||
{
|
||||
;
|
||||
|
||||
if (!xdr_rpc_loc_client_handle_type (xdrs, &objp->handle))
|
||||
return FALSE;
|
||||
if (!xdr_rpc_loc_ioctl_e_type (xdrs, &objp->ioctl_type))
|
||||
return FALSE;
|
||||
if (!xdr_pointer (xdrs, (char **)&objp->ioctl_data, sizeof (rpc_loc_ioctl_data_u_type), (xdrproc_t) xdr_rpc_loc_ioctl_data_u_type))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_rpc_loc_api_api_version_s_args (XDR *xdrs, rpc_loc_api_api_version_s_args *objp)
|
||||
{
|
||||
;
|
||||
|
||||
if (!xdr_rpc_boolean (xdrs, &objp->len_not_null))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_rpc_loc_api_rpc_glue_code_info_remote_rets (XDR *xdrs, rpc_loc_api_rpc_glue_code_info_remote_rets *objp)
|
||||
{
|
||||
;
|
||||
|
||||
if (!xdr_rpc_uint32 (xdrs, &objp->toolvers))
|
||||
return FALSE;
|
||||
if (!xdr_rpc_uint32 (xdrs, &objp->features))
|
||||
return FALSE;
|
||||
if (!xdr_rpc_uint32 (xdrs, &objp->proghash))
|
||||
return FALSE;
|
||||
if (!xdr_rpc_uint32 (xdrs, &objp->cbproghash))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_rpc_loc_open_rets (XDR *xdrs, rpc_loc_open_rets *objp)
|
||||
{
|
||||
;
|
||||
|
||||
if (!xdr_rpc_loc_client_handle_type (xdrs, &objp->loc_open_result))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_rpc_loc_close_rets (XDR *xdrs, rpc_loc_close_rets *objp)
|
||||
{
|
||||
;
|
||||
|
||||
if (!xdr_rpc_int32 (xdrs, &objp->loc_close_result))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_rpc_loc_start_fix_rets (XDR *xdrs, rpc_loc_start_fix_rets *objp)
|
||||
{
|
||||
;
|
||||
|
||||
if (!xdr_rpc_int32 (xdrs, &objp->loc_start_fix_result))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_rpc_loc_stop_fix_rets (XDR *xdrs, rpc_loc_stop_fix_rets *objp)
|
||||
{
|
||||
;
|
||||
|
||||
if (!xdr_rpc_int32 (xdrs, &objp->loc_stop_fix_result))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_rpc_loc_ioctl_rets (XDR *xdrs, rpc_loc_ioctl_rets *objp)
|
||||
{
|
||||
;
|
||||
|
||||
if (!xdr_rpc_int32 (xdrs, &objp->loc_ioctl_result))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_rpc_loc_api_api_versions_rets (XDR *xdrs, rpc_loc_api_api_versions_rets *objp)
|
||||
{
|
||||
;
|
||||
|
||||
if (!xdr_rpc_loc_api_api_versions_return_type (xdrs, &objp->loc_api_api_versions_result))
|
||||
return FALSE;
|
||||
if (!xdr_pointer (xdrs, (char **)&objp->len, sizeof (rpc_uint32), (xdrproc_t) xdr_rpc_uint32))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
@ -0,0 +1,74 @@
|
||||
/* 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 "librpc.h"
|
||||
#include "loc_api_rpcgen_rpc.h"
|
||||
#include "loc_api_rpcgen_cb_rpc.h"
|
||||
|
||||
|
||||
#define RPC_FUNC_VERSION_BASE(a,b) a ## b
|
||||
#define RPC_CB_FUNC_VERS(a,b) RPC_FUNC_VERSION_BASE(a,b)
|
||||
|
||||
|
||||
static SVCXPRT* svrPort = NULL;
|
||||
|
||||
extern void RPC_CB_FUNC_VERS(loc_apicbprog_,LOC_APICBVERS_0001)(struct svc_req *rqstp, register SVCXPRT *transp);
|
||||
|
||||
int loc_apicb_app_init(void)
|
||||
{
|
||||
|
||||
/* Register a callback server to use the loc_apicbprog_0x00010001 */
|
||||
if (svrPort == NULL) {
|
||||
svrPort = svcrtr_create();
|
||||
}
|
||||
if (!svrPort) return -1;
|
||||
|
||||
xprt_register(svrPort);
|
||||
|
||||
|
||||
|
||||
if(svc_register(svrPort, LOC_APICBPROG,LOC_APICBVERS_0001, RPC_CB_FUNC_VERS(loc_apicbprog_,LOC_APICBVERS_0001),0))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
void loc_apicb_app_deinit(void)
|
||||
{
|
||||
|
||||
if (svrPort == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
svc_unregister(svrPort, LOC_APICBPROG,LOC_APICBVERS_0001);
|
||||
}
|
@ -0,0 +1,261 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
/* LOC_API TOOL VERSION: 4.48 */
|
||||
/* GENERATED: TUE JUN 14 2011 */
|
||||
/*=============================================================================
|
||||
L O C _ A P I . X D R
|
||||
|
||||
GENERAL DESCRIPTION
|
||||
This is an AUTO GENERATED file that provides an xdr compatible definition of
|
||||
the loc_api API.
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
=============================================================================*/
|
||||
|
||||
/*=============================================================================
|
||||
|
||||
Edit History
|
||||
|
||||
AUTO GENERATED
|
||||
|
||||
Generated by following versions of Htorpc modules:
|
||||
Id: //source/qcom/qct/core/mproc/tools/rel/2h09/htorpc/htorpc.pl#1
|
||||
Id: //source/qcom/qct/core/mproc/tools/rel/2h09/htorpc/lib/Htorpc/Start.pm#1
|
||||
Id: //source/qcom/qct/core/mproc/tools/rel/2h09/htorpc/lib/Htorpc/Htoxdr.pm#1
|
||||
Id: //source/qcom/qct/core/mproc/tools/rel/2h09/htorpc/lib/Htorpc/XDR.pm#3
|
||||
Id: //source/qcom/qct/core/mproc/tools/rel/2h09/htorpc/lib/Htorpc/Output.pm#5
|
||||
Id: //source/qcom/qct/core/mproc/tools/rel/2h09/htorpc/lib/Htorpc/Parser.pm#1
|
||||
Id: //source/qcom/qct/core/mproc/tools/rel/2h09/htorpc/lib/Htorpc/Metacomments.pm#1
|
||||
Id: //source/qcom/qct/core/mproc/tools/rel/2h09/htorpc/lib/Htorpc/SymbolTable.pm#1
|
||||
|
||||
loc_api Definition File(s):
|
||||
Id: //source/qcom/qct/modem/api/gps/main/latest/loc_api.h#24
|
||||
=============================================================================*/
|
||||
/*=============================================================================
|
||||
$Header$
|
||||
=============================================================================*/
|
||||
|
||||
|
||||
|
||||
typedef rpc_uint32 rpc_loc_api_api_versions_return_type<>;
|
||||
|
||||
/*
|
||||
* Declare an rpc_uint32 type for each callback type in the API
|
||||
*/
|
||||
typedef rpc_uint32 rpc_loc_event_cb_f_type;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* These are struct declarations for the function arguments
|
||||
*/
|
||||
|
||||
struct rpc_loc_open_args {
|
||||
rpc_loc_event_mask_type event_reg_mask;
|
||||
rpc_loc_event_cb_f_type event_callback;
|
||||
};
|
||||
|
||||
struct rpc_loc_close_args {
|
||||
rpc_loc_client_handle_type handle;
|
||||
};
|
||||
|
||||
struct rpc_loc_start_fix_args {
|
||||
rpc_loc_client_handle_type handle;
|
||||
};
|
||||
|
||||
struct rpc_loc_stop_fix_args {
|
||||
rpc_loc_client_handle_type handle;
|
||||
};
|
||||
|
||||
struct rpc_loc_ioctl_args {
|
||||
rpc_loc_client_handle_type handle;
|
||||
rpc_loc_ioctl_e_type ioctl_type;
|
||||
rpc_loc_ioctl_data_u_type *ioctl_data;
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct rpc_loc_api_api_version_s_args {
|
||||
rpc_boolean len_not_null;
|
||||
};
|
||||
|
||||
/*
|
||||
* These are struct declarations for the function results
|
||||
*/
|
||||
|
||||
struct rpc_loc_api_rpc_glue_code_info_remote_rets {
|
||||
rpc_uint32 toolvers; /* Tool version */
|
||||
rpc_uint32 features; /* Features turned on in the code.
|
||||
* 0x00000001 ONCRPC Server Cleanup Support
|
||||
*/
|
||||
rpc_uint32 proghash; /* Unique hash value for the API XDR definition */
|
||||
rpc_uint32 cbproghash; /* Unique hash value for the Callbacks' XDR definition */
|
||||
};
|
||||
|
||||
struct rpc_loc_open_rets {
|
||||
rpc_loc_client_handle_type loc_open_result;
|
||||
};
|
||||
|
||||
struct rpc_loc_close_rets {
|
||||
rpc_int32 loc_close_result;
|
||||
};
|
||||
|
||||
struct rpc_loc_start_fix_rets {
|
||||
rpc_int32 loc_start_fix_result;
|
||||
};
|
||||
|
||||
struct rpc_loc_stop_fix_rets {
|
||||
rpc_int32 loc_stop_fix_result;
|
||||
};
|
||||
|
||||
struct rpc_loc_ioctl_rets {
|
||||
rpc_int32 loc_ioctl_result;
|
||||
};
|
||||
|
||||
struct rpc_loc_api_api_versions_rets {
|
||||
rpc_loc_api_api_versions_return_type loc_api_api_versions_result;
|
||||
rpc_uint32 *len;
|
||||
};
|
||||
|
||||
/*
|
||||
* XDR definition of the LOC_API program ( vers. 0x00050006 )
|
||||
*/
|
||||
|
||||
program LOC_APIPROG {
|
||||
version LOC_APIVERS_0001 {
|
||||
|
||||
void
|
||||
rpc_loc_api_null( void ) = 0;
|
||||
|
||||
rpc_loc_api_rpc_glue_code_info_remote_rets
|
||||
rpc_loc_api_rpc_glue_code_info_remote( void ) = 1;
|
||||
|
||||
rpc_loc_open_rets
|
||||
rpc_loc_open( rpc_loc_open_args ) = 2;
|
||||
|
||||
rpc_loc_close_rets
|
||||
rpc_loc_close( rpc_loc_close_args ) = 3;
|
||||
|
||||
rpc_loc_start_fix_rets
|
||||
rpc_loc_start_fix( rpc_loc_start_fix_args ) = 4;
|
||||
|
||||
rpc_loc_stop_fix_rets
|
||||
rpc_loc_stop_fix( rpc_loc_stop_fix_args ) = 5;
|
||||
|
||||
rpc_loc_ioctl_rets
|
||||
rpc_loc_ioctl( rpc_loc_ioctl_args ) = 6;
|
||||
|
||||
rpc_loc_api_api_versions_rets
|
||||
rpc_loc_api_api_versions( void ) = 0xFFFFFFFF;
|
||||
|
||||
|
||||
|
||||
|
||||
} = 0x00050001;
|
||||
|
||||
version LOC_APIVERS_0002 {
|
||||
|
||||
/* Following elements added in enum rpc_loc_assist_data_request_e_type in 0x00050002
|
||||
RPC_LOC_ASSIST_DATA_POSITION_INJECTION_REQ
|
||||
*/
|
||||
/* Following elements added in enum rpc_loc_ioctl_e_type in 0x00050002
|
||||
RPC_LOC_IOCTL_GET_XTRA_T_SESSION_CONTROL
|
||||
RPC_LOC_IOCTL_RESERVED_CMD
|
||||
RPC_LOC_IOCTL_SET_XTRA_T_SESSION_CONTROL
|
||||
*/
|
||||
|
||||
void
|
||||
rpc_loc_api_null( void ) = 0;
|
||||
|
||||
} = 0x00050002;
|
||||
|
||||
version LOC_APIVERS_0003 {
|
||||
|
||||
/* Following elements added in enum rpc_loc_ioctl_e_type in 0x00050003
|
||||
RPC_LOC_IOCTL_SET_DATA_ENABLE
|
||||
RPC_LOC_IOCTL_SET_LBS_APN_PROFILE
|
||||
RPC_LOC_IOCTL_GET_XTRA_APN_PROFILE
|
||||
RPC_LOC_IOCTL_GET_LBS_APN_PROFILE
|
||||
RPC_LOC_IOCTL_SET_XTRA_APN_PROFILE
|
||||
*/
|
||||
|
||||
void
|
||||
rpc_loc_api_null( void ) = 0;
|
||||
|
||||
} = 0x00050003;
|
||||
|
||||
version LOC_APIVERS_0004 {
|
||||
|
||||
/* Following elements added in enum rpc_loc_ioctl_e_type in 0x00050004
|
||||
RPC_LOC_IOCTL_GET_SUPL_VERSION
|
||||
RPC_LOC_IOCTL_SET_SUPL_VERSION
|
||||
*/
|
||||
|
||||
void
|
||||
rpc_loc_api_null( void ) = 0;
|
||||
|
||||
} = 0x00050004;
|
||||
|
||||
version LOC_APIVERS_0005 {
|
||||
|
||||
/* Following elements added in enum rpc_loc_server_addr_e_type in 0x00050005
|
||||
RPC_LOC_SERVER_ADDR_IPV6
|
||||
*/
|
||||
/* Following elements added in enum rpc_loc_ioctl_e_type in 0x00050005
|
||||
RPC_LOC_IOCTL_ERROR_ESTIMATE_CONFIG
|
||||
*/
|
||||
|
||||
void
|
||||
rpc_loc_api_null( void ) = 0;
|
||||
|
||||
} = 0x00050005;
|
||||
|
||||
|
||||
|
||||
version LOC_APIVERS_0006 {
|
||||
|
||||
/* Following elements added in enum rpc_loc_ioctl_e_type in 0x00050006
|
||||
RPC_LOC_IOCTL_INFORM_SERVER_MULTI_OPEN_STATUS
|
||||
*/
|
||||
/* Following elements added in enum rpc_loc_server_request_e_type in 0x00050006
|
||||
RPC_LOC_SERVER_REQUEST_MULTI_OPEN
|
||||
*/
|
||||
|
||||
void
|
||||
rpc_loc_api_null( void ) = 0;
|
||||
|
||||
} = 0x00050006;
|
||||
|
||||
|
||||
} = 0x3000008C;
|
||||
|
||||
const LOC_APIVERS = 0x00050006;
|
@ -0,0 +1,187 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
/* LOC_API TOOL VERSION: 4.48 */
|
||||
/* GENERATED: TUE JUN 14 2011 */
|
||||
/*=============================================================================
|
||||
L O C _ A P I _ C B . X D R
|
||||
|
||||
GENERAL DESCRIPTION
|
||||
This is an AUTO GENERATED file that provides an xdr compatible definition of
|
||||
an api that represents the grouping of the different callback functions the
|
||||
loc_api API supports.
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
=============================================================================*/
|
||||
|
||||
/*=============================================================================
|
||||
|
||||
Edit History
|
||||
|
||||
AUTO GENERATED
|
||||
|
||||
Generated by following versions of Htorpc modules:
|
||||
Id: //source/qcom/qct/core/mproc/tools/rel/2h09/htorpc/htorpc.pl#1
|
||||
Id: //source/qcom/qct/core/mproc/tools/rel/2h09/htorpc/lib/Htorpc/Start.pm#1
|
||||
Id: //source/qcom/qct/core/mproc/tools/rel/2h09/htorpc/lib/Htorpc/Htoxdr.pm#1
|
||||
Id: //source/qcom/qct/core/mproc/tools/rel/2h09/htorpc/lib/Htorpc/XDR.pm#3
|
||||
Id: //source/qcom/qct/core/mproc/tools/rel/2h09/htorpc/lib/Htorpc/Output.pm#5
|
||||
Id: //source/qcom/qct/core/mproc/tools/rel/2h09/htorpc/lib/Htorpc/Parser.pm#1
|
||||
Id: //source/qcom/qct/core/mproc/tools/rel/2h09/htorpc/lib/Htorpc/Metacomments.pm#1
|
||||
Id: //source/qcom/qct/core/mproc/tools/rel/2h09/htorpc/lib/Htorpc/SymbolTable.pm#1
|
||||
|
||||
loc_api Definition File(s):
|
||||
Id: //source/qcom/qct/modem/api/gps/main/latest/loc_api.h#24
|
||||
=============================================================================*/
|
||||
/*=============================================================================
|
||||
$Header$
|
||||
=============================================================================*/
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* These are struct declarations for the function arguments
|
||||
*/
|
||||
|
||||
struct rpc_loc_event_cb_f_type_args {
|
||||
rpc_uint32 cb_id;
|
||||
rpc_loc_client_handle_type loc_handle;
|
||||
rpc_loc_event_mask_type loc_event;
|
||||
rpc_loc_event_payload_u_type *loc_event_payload;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* These are struct declaratios for the function results
|
||||
*/
|
||||
|
||||
struct rpc_loc_event_cb_f_type_rets {
|
||||
rpc_int32 loc_event_cb_f_type_result;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* XDR definition of the LOC_API callback program ( vers. 0x00050006 )
|
||||
*/
|
||||
|
||||
program LOC_APICBPROG {
|
||||
version LOC_APICBVERS_0001 {
|
||||
|
||||
rpc_loc_event_cb_f_type_rets
|
||||
rpc_loc_event_cb_f_type( rpc_loc_event_cb_f_type_args ) = 1;
|
||||
|
||||
|
||||
|
||||
|
||||
} = 0x00050001;
|
||||
|
||||
version LOC_APICBVERS_0002 {
|
||||
|
||||
/* Following elements added in enum rpc_loc_assist_data_request_e_type in 0x00050002
|
||||
RPC_LOC_ASSIST_DATA_POSITION_INJECTION_REQ
|
||||
*/
|
||||
/* Following elements added in enum rpc_loc_ioctl_e_type in 0x00050002
|
||||
RPC_LOC_IOCTL_GET_XTRA_T_SESSION_CONTROL
|
||||
RPC_LOC_IOCTL_RESERVED_CMD
|
||||
RPC_LOC_IOCTL_SET_XTRA_T_SESSION_CONTROL
|
||||
*/
|
||||
|
||||
int
|
||||
rpc_loc_api_cb_null( void ) = 0xffffff00;
|
||||
|
||||
} = 0x00050002;
|
||||
|
||||
version LOC_APICBVERS_0003 {
|
||||
|
||||
/* Following elements added in enum rpc_loc_ioctl_e_type in 0x00050003
|
||||
RPC_LOC_IOCTL_SET_DATA_ENABLE
|
||||
RPC_LOC_IOCTL_SET_LBS_APN_PROFILE
|
||||
RPC_LOC_IOCTL_GET_XTRA_APN_PROFILE
|
||||
RPC_LOC_IOCTL_GET_LBS_APN_PROFILE
|
||||
RPC_LOC_IOCTL_SET_XTRA_APN_PROFILE
|
||||
*/
|
||||
|
||||
int
|
||||
rpc_loc_api_cb_null( void ) = 0xffffff00;
|
||||
|
||||
} = 0x00050003;
|
||||
|
||||
version LOC_APICBVERS_0004 {
|
||||
|
||||
/* Following elements added in enum rpc_loc_ioctl_e_type in 0x00050004
|
||||
RPC_LOC_IOCTL_GET_SUPL_VERSION
|
||||
RPC_LOC_IOCTL_SET_SUPL_VERSION
|
||||
*/
|
||||
|
||||
int
|
||||
rpc_loc_api_cb_null( void ) = 0xffffff00;
|
||||
|
||||
} = 0x00050004;
|
||||
|
||||
version LOC_APICBVERS_0005 {
|
||||
|
||||
/* Following elements added in enum rpc_loc_server_addr_e_type in 0x00050005
|
||||
RPC_LOC_SERVER_ADDR_IPV6
|
||||
*/
|
||||
/* Following elements added in enum rpc_loc_ioctl_e_type in 0x00050005
|
||||
RPC_LOC_IOCTL_ERROR_ESTIMATE_CONFIG
|
||||
*/
|
||||
|
||||
int
|
||||
rpc_loc_api_cb_null( void ) = 0xffffff00;
|
||||
|
||||
} = 0x00050005;
|
||||
|
||||
|
||||
|
||||
version LOC_APICBVERS_0006 {
|
||||
|
||||
/* Following elements added in enum rpc_loc_ioctl_e_type in 0x00050006
|
||||
RPC_LOC_IOCTL_INFORM_SERVER_MULTI_OPEN_STATUS
|
||||
*/
|
||||
/* Following elements added in enum rpc_loc_server_request_e_type in 0x00050006
|
||||
RPC_LOC_SERVER_REQUEST_MULTI_OPEN
|
||||
*/
|
||||
|
||||
int
|
||||
rpc_loc_api_cb_null( void ) = 0xffffff00;
|
||||
|
||||
} = 0x00050006;
|
||||
|
||||
|
||||
} = 0x3100008C;
|
||||
|
||||
const LOC_APICBVERS = 0x00050006;
|
File diff suppressed because it is too large
Load Diff
106
gps/loc_api/libloc_api_50001/Android.mk
Normal file
106
gps/loc_api/libloc_api_50001/Android.mk
Normal file
@ -0,0 +1,106 @@
|
||||
ifneq ($(BUILD_TINY_ANDROID),true)
|
||||
#Compile this library only for builds with the latest modem image
|
||||
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE := libloc_eng
|
||||
LOCAL_MODULE_OWNER := qcom
|
||||
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
|
||||
LOCAL_SHARED_LIBRARIES := \
|
||||
libutils \
|
||||
libcutils \
|
||||
libdl \
|
||||
liblog \
|
||||
libloc_core \
|
||||
libgps.utils
|
||||
|
||||
LOCAL_SRC_FILES += \
|
||||
loc_eng.cpp \
|
||||
loc_eng_agps.cpp \
|
||||
loc_eng_xtra.cpp \
|
||||
loc_eng_ni.cpp \
|
||||
loc_eng_log.cpp \
|
||||
loc_eng_nmea.cpp \
|
||||
LocEngAdapter.cpp
|
||||
|
||||
LOCAL_SRC_FILES += \
|
||||
loc_eng_dmn_conn.cpp \
|
||||
loc_eng_dmn_conn_handler.cpp \
|
||||
loc_eng_dmn_conn_thread_helper.c \
|
||||
loc_eng_dmn_conn_glue_msg.c \
|
||||
loc_eng_dmn_conn_glue_pipe.c
|
||||
|
||||
LOCAL_CFLAGS += \
|
||||
-fno-short-enums \
|
||||
-D_ANDROID_
|
||||
|
||||
LOCAL_C_INCLUDES:= \
|
||||
$(TARGET_OUT_HEADERS)/gps.utils \
|
||||
$(TARGET_OUT_HEADERS)/libloc_core \
|
||||
hardware/qcom/gps/loc_api/libloc_api_50001 \
|
||||
$(TARGET_OUT_HEADERS)/libflp
|
||||
|
||||
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_log.h
|
||||
|
||||
LOCAL_PRELINK_MODULE := false
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE := gps.$(BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE)
|
||||
LOCAL_MODULE_OWNER := qcom
|
||||
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
|
||||
## Libs
|
||||
|
||||
LOCAL_SHARED_LIBRARIES := \
|
||||
libutils \
|
||||
libcutils \
|
||||
liblog \
|
||||
libloc_eng \
|
||||
libloc_core \
|
||||
libgps.utils \
|
||||
libdl
|
||||
|
||||
ifneq ($(filter $(TARGET_DEVICE), apq8084 msm8960), false)
|
||||
endif
|
||||
|
||||
LOCAL_SRC_FILES += \
|
||||
loc.cpp \
|
||||
gps.c
|
||||
|
||||
LOCAL_CFLAGS += \
|
||||
-fno-short-enums \
|
||||
-D_ANDROID_ \
|
||||
|
||||
ifeq ($(TARGET_USES_QCOM_BSP), true)
|
||||
LOCAL_CFLAGS += -DTARGET_USES_QCOM_BSP
|
||||
endif
|
||||
|
||||
## Includes
|
||||
LOCAL_C_INCLUDES:= \
|
||||
$(TARGET_OUT_HEADERS)/gps.utils \
|
||||
$(TARGET_OUT_HEADERS)/libloc_core \
|
||||
$(TARGET_OUT_HEADERS)/libflp
|
||||
|
||||
LOCAL_PRELINK_MODULE := false
|
||||
LOCAL_MODULE_RELATIVE_PATH := hw
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
|
||||
endif # not BUILD_TINY_ANDROID
|
598
gps/loc_api/libloc_api_50001/LocEngAdapter.cpp
Normal file
598
gps/loc_api/libloc_api_50001/LocEngAdapter.cpp
Normal file
@ -0,0 +1,598 @@
|
||||
/* Copyright (c) 2011-2015, 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 <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#include <ctype.h>
|
||||
#include <cutils/properties.h>
|
||||
#include <LocEngAdapter.h>
|
||||
#include "loc_eng_msg.h"
|
||||
#include "loc_log.h"
|
||||
|
||||
#define CHIPSET_SERIAL_NUMBER_MAX_LEN 16
|
||||
#define USER_AGENT_MAX_LEN 512
|
||||
|
||||
using namespace loc_core;
|
||||
|
||||
LocInternalAdapter::LocInternalAdapter(LocEngAdapter* adapter) :
|
||||
LocAdapterBase(adapter->getMsgTask()),
|
||||
mLocEngAdapter(adapter)
|
||||
{
|
||||
}
|
||||
void LocInternalAdapter::setPositionModeInt(LocPosMode& posMode) {
|
||||
sendMsg(new LocEngPositionMode(mLocEngAdapter, posMode));
|
||||
}
|
||||
void LocInternalAdapter::startFixInt() {
|
||||
sendMsg(new LocEngStartFix(mLocEngAdapter));
|
||||
}
|
||||
void LocInternalAdapter::stopFixInt() {
|
||||
sendMsg(new LocEngStopFix(mLocEngAdapter));
|
||||
}
|
||||
void LocInternalAdapter::getZppInt() {
|
||||
sendMsg(new LocEngGetZpp(mLocEngAdapter));
|
||||
}
|
||||
|
||||
LocEngAdapter::LocEngAdapter(LOC_API_ADAPTER_EVENT_MASK_T mask,
|
||||
void* owner, ContextBase* context,
|
||||
LocThread::tCreate tCreator) :
|
||||
LocAdapterBase(mask,
|
||||
//Get the AFW context if VzW context has not already been intialized in
|
||||
//loc_ext
|
||||
context == NULL?
|
||||
LocDualContext::getLocFgContext(tCreator,
|
||||
NULL,
|
||||
LocDualContext::mLocationHalName,
|
||||
false)
|
||||
:context),
|
||||
mOwner(owner), mInternalAdapter(new LocInternalAdapter(this)),
|
||||
mUlp(new UlpProxyBase()), mNavigating(false),
|
||||
mSupportsAgpsRequests(false),
|
||||
mSupportsPositionInjection(false),
|
||||
mSupportsTimeInjection(false),
|
||||
mPowerVote(0)
|
||||
{
|
||||
memset(&mFixCriteria, 0, sizeof(mFixCriteria));
|
||||
mFixCriteria.mode = LOC_POSITION_MODE_INVALID;
|
||||
LOC_LOGD("LocEngAdapter created");
|
||||
}
|
||||
|
||||
inline
|
||||
LocEngAdapter::~LocEngAdapter()
|
||||
{
|
||||
delete mInternalAdapter;
|
||||
LOC_LOGV("LocEngAdapter deleted");
|
||||
}
|
||||
|
||||
void LocEngAdapter::setXtraUserAgent() {
|
||||
struct LocSetXtraUserAgent : public LocMsg {
|
||||
const ContextBase* const mContext;
|
||||
inline LocSetXtraUserAgent(ContextBase* context) :
|
||||
LocMsg(), mContext(context) {
|
||||
}
|
||||
virtual void proc() const {
|
||||
char release[PROPERTY_VALUE_MAX];
|
||||
char manufacture[PROPERTY_VALUE_MAX];
|
||||
char model[PROPERTY_VALUE_MAX];
|
||||
char board[PROPERTY_VALUE_MAX];
|
||||
char brand[PROPERTY_VALUE_MAX];
|
||||
char chipsetsn[CHIPSET_SERIAL_NUMBER_MAX_LEN];
|
||||
char userAgent[USER_AGENT_MAX_LEN];
|
||||
const char defVal[] = "-";
|
||||
|
||||
property_get("ro.build.version.release", release, defVal);
|
||||
property_get("ro.product.manufacturer", manufacture, defVal);
|
||||
property_get("ro.product.model", model, defVal);
|
||||
property_get("ro.product.board", board, defVal);
|
||||
property_get("ro.product.brand", brand, defVal);
|
||||
getChipsetSerialNo(chipsetsn, sizeof(chipsetsn), defVal);
|
||||
|
||||
encodeInPlace(release, PROPERTY_VALUE_MAX);
|
||||
encodeInPlace(manufacture, PROPERTY_VALUE_MAX);
|
||||
encodeInPlace(model, PROPERTY_VALUE_MAX);
|
||||
encodeInPlace(board, PROPERTY_VALUE_MAX);
|
||||
encodeInPlace(brand, PROPERTY_VALUE_MAX);
|
||||
|
||||
snprintf(userAgent, sizeof(userAgent), "A/%s/%s/%s/%s/-/QCX3/s%u/-/%s/-/%s/-/-/-",
|
||||
release, manufacture, model, board,
|
||||
mContext->getIzatDevId(), chipsetsn, brand);
|
||||
|
||||
for (int i = 0; i < sizeof(userAgent) && userAgent[i]; i++) {
|
||||
if (' ' == userAgent[i]) userAgent[i] = '#';
|
||||
}
|
||||
|
||||
saveUserAgentString(userAgent, strlen(userAgent));
|
||||
LOC_LOGV("%s] UserAgent %s", __func__, userAgent);
|
||||
}
|
||||
|
||||
void saveUserAgentString(const char* data, const int len) const {
|
||||
const char XTRA_FOLDER[] = "/data/misc/location/xtra";
|
||||
const char USER_AGENT_FILE[] = "/data/misc/location/xtra/useragent.txt";
|
||||
|
||||
if (data == NULL || len < 1) {
|
||||
LOC_LOGE("%s:%d]: invalid input data = %p len = %d", __func__, __LINE__, data, len);
|
||||
return;
|
||||
}
|
||||
|
||||
struct stat s;
|
||||
int err = stat(XTRA_FOLDER, &s);
|
||||
if (err < 0) {
|
||||
if (ENOENT == errno) {
|
||||
if (mkdir(XTRA_FOLDER, 0700) < 0) {
|
||||
LOC_LOGE("%s:%d]: make XTRA_FOLDER failed", __func__, __LINE__);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
LOC_LOGE("%s:%d]: XTRA_FOLDER invalid", __func__, __LINE__);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
FILE* file = fopen(USER_AGENT_FILE, "wt");
|
||||
if (file == NULL) {
|
||||
LOC_LOGE("%s:%d]: open USER_AGENT_FILE failed", __func__, __LINE__);
|
||||
return;
|
||||
}
|
||||
|
||||
size_t written = fwrite(data, 1, len, file);
|
||||
fclose(file);
|
||||
file = NULL;
|
||||
|
||||
// set file permission
|
||||
chmod(USER_AGENT_FILE, 0600);
|
||||
|
||||
if (written != len) {
|
||||
LOC_LOGE("%s:%d]: write USER_AGENT_FILE failed", __func__, __LINE__);
|
||||
}
|
||||
}
|
||||
|
||||
void getChipsetSerialNo(char buf[], int buflen, const char def[]) const {
|
||||
const char SOC_SERIAL_NUMBER[] = "/sys/devices/soc0/serial_number";
|
||||
|
||||
FILE* file = fopen(SOC_SERIAL_NUMBER, "rt");
|
||||
if (file == NULL) {
|
||||
// use default upon unreadable file
|
||||
strlcpy(buf, def, buflen);
|
||||
|
||||
} else {
|
||||
size_t size = fread(buf, 1, buflen - 1, file);
|
||||
if (size == 0) {
|
||||
// use default upon empty file
|
||||
strlcpy(buf, def, buflen);
|
||||
|
||||
} else {
|
||||
buf[size] = '\0';
|
||||
}
|
||||
|
||||
fclose(file);
|
||||
|
||||
// remove trailing spaces
|
||||
size_t len = strlen(buf);
|
||||
while (--len >= 0 && isspace(buf[len])) {
|
||||
buf[len] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* encode the given string value such that all separator characters ('/','+','|','%')
|
||||
* in the string are repaced by their corresponding encodings (%2F","%2B","%7C", "%25")
|
||||
*/
|
||||
static void encodeInPlace(char value[], const int size) {
|
||||
char buffer[size];
|
||||
|
||||
struct ENCODE {
|
||||
const char ch;
|
||||
const char *code;
|
||||
};
|
||||
|
||||
const ENCODE encodings[] = { {'/', "%2F"}, {'+', "%2B"}, {'|', "%7C",}, {'%', "%25"} };
|
||||
const int nencodings = (int)sizeof(encodings) / sizeof(encodings[0]);
|
||||
|
||||
int inpos = 0, outpos = 0;
|
||||
while(value[inpos] != '\0' && outpos < size - 1) {
|
||||
// check if escaped character
|
||||
int escchar = 0;
|
||||
while(escchar < nencodings && encodings[escchar].ch != value[inpos]) {
|
||||
escchar++;
|
||||
}
|
||||
|
||||
if (escchar == nencodings) {
|
||||
// non escaped character
|
||||
buffer[outpos++] = value[inpos++];
|
||||
continue;
|
||||
}
|
||||
|
||||
// escaped character
|
||||
int codepos = 0;
|
||||
#define NUM_CHARS_IN_CODE 3
|
||||
|
||||
if (outpos + NUM_CHARS_IN_CODE >= size) {
|
||||
// skip last character if there is insufficient space
|
||||
break;
|
||||
}
|
||||
|
||||
while(outpos < size - 1 && codepos < NUM_CHARS_IN_CODE) {
|
||||
buffer[outpos++] = encodings[escchar].code[codepos++];
|
||||
}
|
||||
inpos++;
|
||||
}
|
||||
|
||||
// copy to ouput
|
||||
value[outpos] = '\0';
|
||||
while(--outpos >= 0) {
|
||||
value[outpos] = buffer[outpos];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
sendMsg(new LocSetXtraUserAgent(mContext));
|
||||
}
|
||||
|
||||
void LocInternalAdapter::setUlpProxy(UlpProxyBase* ulp) {
|
||||
struct LocSetUlpProxy : public LocMsg {
|
||||
LocAdapterBase* mAdapter;
|
||||
UlpProxyBase* mUlp;
|
||||
inline LocSetUlpProxy(LocAdapterBase* adapter, UlpProxyBase* ulp) :
|
||||
LocMsg(), mAdapter(adapter), mUlp(ulp) {
|
||||
}
|
||||
virtual void proc() const {
|
||||
LOC_LOGV("%s] ulp %p adapter %p", __func__,
|
||||
mUlp, mAdapter);
|
||||
mAdapter->setUlpProxy(mUlp);
|
||||
}
|
||||
};
|
||||
|
||||
sendMsg(new LocSetUlpProxy(mLocEngAdapter, ulp));
|
||||
}
|
||||
|
||||
void LocEngAdapter::setUlpProxy(UlpProxyBase* ulp)
|
||||
{
|
||||
if (ulp == mUlp) {
|
||||
//This takes care of the case when double initalization happens
|
||||
//and we get the same object back for UlpProxyBase . Do nothing
|
||||
return;
|
||||
}
|
||||
|
||||
LOC_LOGV("%s] %p", __func__, ulp);
|
||||
if (NULL == ulp) {
|
||||
LOC_LOGE("%s:%d]: ulp pointer is NULL", __func__, __LINE__);
|
||||
ulp = new UlpProxyBase();
|
||||
}
|
||||
|
||||
if (LOC_POSITION_MODE_INVALID != mUlp->mPosMode.mode) {
|
||||
// need to send this mode and start msg to ULP
|
||||
ulp->sendFixMode(mUlp->mPosMode);
|
||||
}
|
||||
|
||||
if(mUlp->mFixSet) {
|
||||
ulp->sendStartFix();
|
||||
}
|
||||
|
||||
delete mUlp;
|
||||
mUlp = ulp;
|
||||
}
|
||||
|
||||
int LocEngAdapter::setGpsLockMsg(LOC_GPS_LOCK_MASK lockMask)
|
||||
{
|
||||
struct LocEngAdapterGpsLock : public LocMsg {
|
||||
LocEngAdapter* mAdapter;
|
||||
LOC_GPS_LOCK_MASK mLockMask;
|
||||
inline LocEngAdapterGpsLock(LocEngAdapter* adapter, LOC_GPS_LOCK_MASK lockMask) :
|
||||
LocMsg(), mAdapter(adapter), mLockMask(lockMask)
|
||||
{
|
||||
locallog();
|
||||
}
|
||||
inline virtual void proc() const {
|
||||
mAdapter->setGpsLock(mLockMask);
|
||||
}
|
||||
inline void locallog() const {
|
||||
LOC_LOGV("LocEngAdapterGpsLock - mLockMask: %x", mLockMask);
|
||||
}
|
||||
inline virtual void log() const {
|
||||
locallog();
|
||||
}
|
||||
};
|
||||
sendMsg(new LocEngAdapterGpsLock(this, lockMask));
|
||||
return 0;
|
||||
}
|
||||
|
||||
void LocEngAdapter::requestPowerVote()
|
||||
{
|
||||
if (getPowerVoteRight()) {
|
||||
/* Power voting without engine lock:
|
||||
* 101: vote down, 102-104 - vote up
|
||||
* These codes are used not to confuse with actual engine lock
|
||||
* functionality, that can't be used in SSR scenario, as it
|
||||
* conflicts with initialization sequence.
|
||||
*/
|
||||
bool powerUp = getPowerVote();
|
||||
LOC_LOGV("LocEngAdapterVotePower - Vote Power: %d", (int)powerUp);
|
||||
setGpsLock(powerUp ? 103 : 101);
|
||||
}
|
||||
}
|
||||
|
||||
void LocInternalAdapter::reportPosition(UlpLocation &location,
|
||||
GpsLocationExtended &locationExtended,
|
||||
void* locationExt,
|
||||
enum loc_sess_status status,
|
||||
LocPosTechMask loc_technology_mask)
|
||||
{
|
||||
sendMsg(new LocEngReportPosition(mLocEngAdapter,
|
||||
location,
|
||||
locationExtended,
|
||||
locationExt,
|
||||
status,
|
||||
loc_technology_mask));
|
||||
}
|
||||
|
||||
|
||||
void LocEngAdapter::reportPosition(UlpLocation &location,
|
||||
GpsLocationExtended &locationExtended,
|
||||
void* locationExt,
|
||||
enum loc_sess_status status,
|
||||
LocPosTechMask loc_technology_mask)
|
||||
{
|
||||
if (! mUlp->reportPosition(location,
|
||||
locationExtended,
|
||||
locationExt,
|
||||
status,
|
||||
loc_technology_mask )) {
|
||||
mInternalAdapter->reportPosition(location,
|
||||
locationExtended,
|
||||
locationExt,
|
||||
status,
|
||||
loc_technology_mask);
|
||||
}
|
||||
}
|
||||
|
||||
void LocInternalAdapter::reportSv(GnssSvStatus &svStatus,
|
||||
GpsLocationExtended &locationExtended,
|
||||
void* svExt){
|
||||
sendMsg(new LocEngReportSv(mLocEngAdapter, svStatus,
|
||||
locationExtended, svExt));
|
||||
}
|
||||
|
||||
void LocEngAdapter::reportSv(GnssSvStatus &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 (! mUlp->reportSv(svStatus, locationExtended, svExt)) {
|
||||
mInternalAdapter->reportSv(svStatus, locationExtended, svExt);
|
||||
}
|
||||
}
|
||||
|
||||
void LocEngAdapter::setInSession(bool inSession)
|
||||
{
|
||||
mNavigating = inSession;
|
||||
mLocApi->setInSession(inSession);
|
||||
if (!mNavigating) {
|
||||
mFixCriteria.mode = LOC_POSITION_MODE_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
void LocInternalAdapter::reportStatus(GpsStatusValue status)
|
||||
{
|
||||
sendMsg(new LocEngReportStatus(mLocEngAdapter, status));
|
||||
}
|
||||
|
||||
void LocEngAdapter::reportStatus(GpsStatusValue status)
|
||||
{
|
||||
if (!mUlp->reportStatus(status)) {
|
||||
mInternalAdapter->reportStatus(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 (mSupportsAgpsRequests) {
|
||||
sendMsg(new LocEngReportXtraServer(mOwner, url1,
|
||||
url2, url3, maxlength));
|
||||
}
|
||||
return mSupportsAgpsRequests;
|
||||
}
|
||||
|
||||
inline
|
||||
bool LocEngAdapter::requestATL(int connHandle, AGpsType agps_type)
|
||||
{
|
||||
if (mSupportsAgpsRequests) {
|
||||
sendMsg(new LocEngRequestATL(mOwner,
|
||||
connHandle, agps_type));
|
||||
}
|
||||
return mSupportsAgpsRequests;
|
||||
}
|
||||
|
||||
inline
|
||||
bool LocEngAdapter::releaseATL(int connHandle)
|
||||
{
|
||||
if (mSupportsAgpsRequests) {
|
||||
sendMsg(new LocEngReleaseATL(mOwner, connHandle));
|
||||
}
|
||||
return mSupportsAgpsRequests;
|
||||
}
|
||||
|
||||
inline
|
||||
bool LocEngAdapter::requestXtraData()
|
||||
{
|
||||
if (mSupportsAgpsRequests) {
|
||||
sendMsg(new LocEngRequestXtra(mOwner));
|
||||
}
|
||||
return mSupportsAgpsRequests;
|
||||
}
|
||||
|
||||
inline
|
||||
bool LocEngAdapter::requestTime()
|
||||
{
|
||||
if (mSupportsAgpsRequests) {
|
||||
sendMsg(new LocEngRequestTime(mOwner));
|
||||
}
|
||||
return mSupportsAgpsRequests;
|
||||
}
|
||||
|
||||
inline
|
||||
bool LocEngAdapter::requestNiNotify(GpsNiNotification ¬if, const void* data)
|
||||
{
|
||||
if (mSupportsAgpsRequests) {
|
||||
notif.size = sizeof(notif);
|
||||
notif.timeout = LOC_NI_NO_RESPONSE_TIME;
|
||||
|
||||
sendMsg(new LocEngRequestNi(mOwner, notif, data));
|
||||
}
|
||||
return mSupportsAgpsRequests;
|
||||
}
|
||||
|
||||
inline
|
||||
bool LocEngAdapter::requestSuplES(int connHandle)
|
||||
{
|
||||
if (mSupportsAgpsRequests)
|
||||
sendMsg(new LocEngRequestSuplEs(mOwner, connHandle));
|
||||
return mSupportsAgpsRequests;
|
||||
}
|
||||
|
||||
inline
|
||||
bool LocEngAdapter::reportDataCallOpened()
|
||||
{
|
||||
if(mSupportsAgpsRequests)
|
||||
sendMsg(new LocEngSuplEsOpened(mOwner));
|
||||
return mSupportsAgpsRequests;
|
||||
}
|
||||
|
||||
inline
|
||||
bool LocEngAdapter::reportDataCallClosed()
|
||||
{
|
||||
if(mSupportsAgpsRequests)
|
||||
sendMsg(new LocEngSuplEsClosed(mOwner));
|
||||
return mSupportsAgpsRequests;
|
||||
}
|
||||
|
||||
inline
|
||||
void LocEngAdapter::handleEngineDownEvent()
|
||||
{
|
||||
sendMsg(new LocEngDown(mOwner));
|
||||
}
|
||||
|
||||
inline
|
||||
void LocEngAdapter::handleEngineUpEvent()
|
||||
{
|
||||
sendMsg(new LocEngUp(mOwner));
|
||||
}
|
||||
|
||||
enum loc_api_adapter_err LocEngAdapter::setTime(GpsUtcTime time,
|
||||
int64_t timeReference,
|
||||
int uncertainty)
|
||||
{
|
||||
loc_api_adapter_err result = LOC_API_ADAPTER_ERR_SUCCESS;
|
||||
|
||||
LOC_LOGD("%s:%d]: mSupportsTimeInjection is %d",
|
||||
__func__, __LINE__, mSupportsTimeInjection);
|
||||
|
||||
if (mSupportsTimeInjection) {
|
||||
LOC_LOGD("%s:%d]: Injecting time", __func__, __LINE__);
|
||||
result = mLocApi->setTime(time, timeReference, uncertainty);
|
||||
} else {
|
||||
mSupportsTimeInjection = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
enum loc_api_adapter_err LocEngAdapter::setXtraVersionCheck(int check)
|
||||
{
|
||||
enum loc_api_adapter_err ret;
|
||||
ENTRY_LOG();
|
||||
enum xtra_version_check eCheck;
|
||||
switch (check) {
|
||||
case 0:
|
||||
eCheck = DISABLED;
|
||||
break;
|
||||
case 1:
|
||||
eCheck = AUTO;
|
||||
break;
|
||||
case 2:
|
||||
eCheck = XTRA2;
|
||||
break;
|
||||
case 3:
|
||||
eCheck = XTRA3;
|
||||
break;
|
||||
default:
|
||||
eCheck = DISABLED;
|
||||
}
|
||||
ret = mLocApi->setXtraVersionCheck(eCheck);
|
||||
EXIT_LOG(%d, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void LocEngAdapter::reportGpsMeasurementData(GpsData &gpsMeasurementData)
|
||||
{
|
||||
sendMsg(new LocEngReportGpsMeasurement(mOwner,
|
||||
gpsMeasurementData));
|
||||
}
|
||||
|
||||
/*
|
||||
Update Registration Mask
|
||||
*/
|
||||
void LocEngAdapter::updateRegistrationMask(LOC_API_ADAPTER_EVENT_MASK_T event,
|
||||
loc_registration_mask_status isEnabled)
|
||||
{
|
||||
LOC_LOGD("entering %s", __func__);
|
||||
int result = LOC_API_ADAPTER_ERR_FAILURE;
|
||||
result = mLocApi->updateRegistrationMask(event, isEnabled);
|
||||
if (result == LOC_API_ADAPTER_ERR_SUCCESS) {
|
||||
LOC_LOGD("%s] update registration mask succeed.", __func__);
|
||||
} else {
|
||||
LOC_LOGE("%s] update registration mask failed.", __func__);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Set Gnss Constellation Config
|
||||
*/
|
||||
bool LocEngAdapter::gnssConstellationConfig()
|
||||
{
|
||||
LOC_LOGD("entering %s", __func__);
|
||||
bool result = false;
|
||||
result = mLocApi->gnssConstellationConfig();
|
||||
return result;
|
||||
}
|
351
gps/loc_api/libloc_api_50001/LocEngAdapter.h
Normal file
351
gps/loc_api/libloc_api_50001/LocEngAdapter.h
Normal file
@ -0,0 +1,351 @@
|
||||
/* Copyright (c) 2011-2015, 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 <UlpProxyBase.h>
|
||||
#include <platform_lib_includes.h>
|
||||
|
||||
#define MAX_URL_LEN 256
|
||||
|
||||
using namespace loc_core;
|
||||
|
||||
class LocEngAdapter;
|
||||
|
||||
class LocInternalAdapter : public LocAdapterBase {
|
||||
LocEngAdapter* mLocEngAdapter;
|
||||
public:
|
||||
LocInternalAdapter(LocEngAdapter* adapter);
|
||||
|
||||
virtual void reportPosition(UlpLocation &location,
|
||||
GpsLocationExtended &locationExtended,
|
||||
void* locationExt,
|
||||
enum loc_sess_status status,
|
||||
LocPosTechMask loc_technology_mask);
|
||||
virtual void reportSv(GnssSvStatus &svStatus,
|
||||
GpsLocationExtended &locationExtended,
|
||||
void* svExt);
|
||||
virtual void reportStatus(GpsStatusValue status);
|
||||
virtual void setPositionModeInt(LocPosMode& posMode);
|
||||
virtual void startFixInt();
|
||||
virtual void stopFixInt();
|
||||
virtual void getZppInt();
|
||||
virtual void setUlpProxy(UlpProxyBase* ulp);
|
||||
};
|
||||
|
||||
typedef void (*loc_msg_sender)(void* loc_eng_data_p, void* msgp);
|
||||
|
||||
class LocEngAdapter : public LocAdapterBase {
|
||||
void* mOwner;
|
||||
LocInternalAdapter* mInternalAdapter;
|
||||
UlpProxyBase* mUlp;
|
||||
LocPosMode mFixCriteria;
|
||||
bool mNavigating;
|
||||
// mPowerVote is encoded as
|
||||
// mPowerVote & 0x20 -- powerVoteRight
|
||||
// mPowerVote & 0x10 -- power On / Off
|
||||
unsigned int mPowerVote;
|
||||
static const unsigned int POWER_VOTE_RIGHT = 0x20;
|
||||
static const unsigned int POWER_VOTE_VALUE = 0x10;
|
||||
|
||||
public:
|
||||
bool mSupportsAgpsRequests;
|
||||
bool mSupportsPositionInjection;
|
||||
bool mSupportsTimeInjection;
|
||||
|
||||
LocEngAdapter(LOC_API_ADAPTER_EVENT_MASK_T mask,
|
||||
void* owner, ContextBase* context,
|
||||
LocThread::tCreate tCreator);
|
||||
virtual ~LocEngAdapter();
|
||||
|
||||
virtual void setUlpProxy(UlpProxyBase* ulp);
|
||||
void setXtraUserAgent();
|
||||
inline void requestUlp(unsigned long capabilities) {
|
||||
mContext->requestUlp(mInternalAdapter, capabilities);
|
||||
}
|
||||
inline LocInternalAdapter* getInternalAdapter() { return mInternalAdapter; }
|
||||
inline UlpProxyBase* getUlpProxy() { return mUlp; }
|
||||
inline void* getOwner() { return mOwner; }
|
||||
inline bool hasAgpsExtendedCapabilities() {
|
||||
return mContext->hasAgpsExtendedCapabilities();
|
||||
}
|
||||
inline bool hasCPIExtendedCapabilities() {
|
||||
return mContext->hasCPIExtendedCapabilities();
|
||||
}
|
||||
inline const MsgTask* getMsgTask() { return mMsgTask; }
|
||||
|
||||
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
|
||||
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, int sensorProvider)
|
||||
{
|
||||
return mLocApi->setSensorControlConfig(sensorUsage, sensorProvider);
|
||||
}
|
||||
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();
|
||||
}
|
||||
inline enum loc_api_adapter_err
|
||||
getZpp(GpsLocation &zppLoc, LocPosTechMask &tech_mask)
|
||||
{
|
||||
return mLocApi->getBestAvailableZppFix(zppLoc, tech_mask);
|
||||
}
|
||||
enum loc_api_adapter_err setTime(GpsUtcTime time,
|
||||
int64_t timeReference,
|
||||
int uncertainty);
|
||||
enum loc_api_adapter_err setXtraVersionCheck(int check);
|
||||
inline virtual void installAGpsCert(const DerEncodedCertificate* pData,
|
||||
size_t length,
|
||||
uint32_t slotBitMask)
|
||||
{
|
||||
mLocApi->installAGpsCert(pData, length, slotBitMask);
|
||||
}
|
||||
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(GnssSvStatus &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 ¬ify, const void* data);
|
||||
virtual bool requestSuplES(int connHandle);
|
||||
virtual bool reportDataCallOpened();
|
||||
virtual bool reportDataCallClosed();
|
||||
virtual void reportGpsMeasurementData(GpsData &gpsMeasurementData);
|
||||
|
||||
inline const LocPosMode& getPositionMode() const
|
||||
{return mFixCriteria;}
|
||||
inline virtual bool isInSession()
|
||||
{ return mNavigating; }
|
||||
void setInSession(bool inSession);
|
||||
|
||||
// Permit/prohibit power voting
|
||||
inline void setPowerVoteRight(bool powerVoteRight) {
|
||||
mPowerVote = powerVoteRight ? (mPowerVote | POWER_VOTE_RIGHT) :
|
||||
(mPowerVote & ~POWER_VOTE_RIGHT);
|
||||
}
|
||||
inline bool getPowerVoteRight() const {
|
||||
return (mPowerVote & POWER_VOTE_RIGHT) != 0 ;
|
||||
}
|
||||
// Set the power voting up/down and do actual operation if permitted
|
||||
inline void setPowerVote(bool powerOn) {
|
||||
mPowerVote = powerOn ? (mPowerVote | POWER_VOTE_VALUE) :
|
||||
(mPowerVote & ~POWER_VOTE_VALUE);
|
||||
requestPowerVote();
|
||||
mContext->modemPowerVote(powerOn);
|
||||
}
|
||||
inline bool getPowerVote() const {
|
||||
return (mPowerVote & POWER_VOTE_VALUE) != 0 ;
|
||||
}
|
||||
// Do power voting according to last settings if permitted
|
||||
void requestPowerVote();
|
||||
|
||||
/*Values for lock
|
||||
1 = Do not lock any position sessions
|
||||
2 = Lock MI position sessions
|
||||
3 = Lock MT position sessions
|
||||
4 = Lock all position sessions
|
||||
*/
|
||||
inline int setGpsLock(LOC_GPS_LOCK_MASK lock)
|
||||
{
|
||||
return mLocApi->setGpsLock(lock);
|
||||
}
|
||||
|
||||
int setGpsLockMsg(LOC_GPS_LOCK_MASK lock);
|
||||
|
||||
/*
|
||||
Returns
|
||||
Current value of GPS lock on success
|
||||
-1 on failure
|
||||
*/
|
||||
inline int getGpsLock()
|
||||
{
|
||||
return mLocApi->getGpsLock();
|
||||
}
|
||||
|
||||
/*
|
||||
Update Registration Mask
|
||||
*/
|
||||
void updateRegistrationMask(LOC_API_ADAPTER_EVENT_MASK_T event,
|
||||
loc_registration_mask_status isEnabled);
|
||||
|
||||
/*
|
||||
Set Gnss Constellation Config
|
||||
*/
|
||||
bool gnssConstellationConfig();
|
||||
};
|
||||
|
||||
#endif //LOC_API_ENG_ADAPTER_H
|
76
gps/loc_api/libloc_api_50001/Makefile.am
Normal file
76
gps/loc_api/libloc_api_50001/Makefile.am
Normal file
@ -0,0 +1,76 @@
|
||||
AM_CFLAGS = \
|
||||
-I../../utils \
|
||||
-I../../platform_lib_abstractions \
|
||||
-fno-short-enums \
|
||||
-DFEATURE_GNSS_BIT_API
|
||||
|
||||
libloc_adapter_so_la_SOURCES = loc_eng_log.cpp LocEngAdapter.cpp
|
||||
|
||||
if USE_GLIB
|
||||
libloc_adapter_so_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@
|
||||
libloc_adapter_so_la_LDFLAGS = -lstdc++ -lpthread @GLIB_LIBS@ -shared -version-info 1:0:0
|
||||
libloc_adapter_so_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@
|
||||
else
|
||||
libloc_adapter_so_la_CFLAGS = $(AM_CFLAGS)
|
||||
libloc_adapter_so_la_LDFLAGS = -lpthread -shared -version-info 1:0:0
|
||||
libloc_adapter_so_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS)
|
||||
endif
|
||||
libloc_adapter_so_la_LIBADD = -lstdc++ -lcutils ../../utils/libgps_utils_so.la
|
||||
|
||||
|
||||
libloc_eng_so_la_SOURCES = \
|
||||
loc_eng.cpp \
|
||||
loc_eng_agps.cpp \
|
||||
loc_eng_xtra.cpp \
|
||||
loc_eng_ni.cpp \
|
||||
loc_eng_log.cpp \
|
||||
loc_eng_dmn_conn.cpp \
|
||||
loc_eng_dmn_conn_handler.cpp \
|
||||
loc_eng_dmn_conn_thread_helper.c \
|
||||
loc_eng_dmn_conn_glue_msg.c \
|
||||
loc_eng_dmn_conn_glue_pipe.c
|
||||
|
||||
|
||||
if USE_GLIB
|
||||
libloc_eng_so_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@
|
||||
libloc_eng_so_la_LDFLAGS = -lstdc++ -lpthread @GLIB_LIBS@ -shared -version-info 1:0:0
|
||||
libloc_eng_so_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@
|
||||
else
|
||||
libloc_eng_so_la_CFLAGS = $(AM_CFLAGS)
|
||||
libloc_eng_so_la_LDFLAGS = -lpthread -shared -version-info 1:0:0
|
||||
libloc_eng_so_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS)
|
||||
endif
|
||||
|
||||
libloc_eng_so_la_LIBADD = -lstdc++ -lcutils -ldl ../../utils/libgps_utils_so.la libloc_adapter_so.la
|
||||
|
||||
|
||||
libgps_default_so_la_SOURCES = \
|
||||
loc.cpp \
|
||||
gps.c
|
||||
|
||||
if USE_GLIB
|
||||
libgps_default_so_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@
|
||||
libgps_default_so_la_LDFLAGS = -lstdc++ -lpthread @GLIB_LIBS@ -shared -version-info 1:0:0
|
||||
libgps_default_so_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@
|
||||
else
|
||||
libgps_default_so_la_CFLAGS = $(AM_CFLAGS)
|
||||
libgps_default_so_la_LDFLAGS = -lpthread -shared -version-info 1:0:0
|
||||
libgps_default_so_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS)
|
||||
endif
|
||||
|
||||
libgps_default_so_la_LIBADD = -lstdc++ -lcutils ../../utils/libgps_utils_so.la -ldl libloc_eng_so.la
|
||||
|
||||
library_include_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_log.h
|
||||
|
||||
library_includedir = $(pkgincludedir)/libloc_api_50001
|
||||
|
||||
#Create and Install libraries
|
||||
lib_LTLIBRARIES = libloc_adapter_so.la libloc_eng_so.la libgps_default_so.la
|
73
gps/loc_api/libloc_api_50001/gps.c
Normal file
73
gps/loc_api/libloc_api_50001/gps.c
Normal file
@ -0,0 +1,73 @@
|
||||
/* Copyright (c) 2011,2015 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 <hardware/gps.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
extern const GpsInterface* get_gps_interface();
|
||||
|
||||
const GpsInterface* gps__get_gps_interface(struct gps_device_t* dev)
|
||||
{
|
||||
return get_gps_interface();
|
||||
}
|
||||
|
||||
static int open_gps(const struct hw_module_t* module, char const* name,
|
||||
struct hw_device_t** device)
|
||||
{
|
||||
struct gps_device_t *dev = (struct gps_device_t *) malloc(sizeof(struct gps_device_t));
|
||||
|
||||
if(dev == NULL)
|
||||
return -1;
|
||||
|
||||
memset(dev, 0, sizeof(*dev));
|
||||
|
||||
dev->common.tag = HARDWARE_DEVICE_TAG;
|
||||
dev->common.version = 0;
|
||||
dev->common.module = (struct hw_module_t*)module;
|
||||
dev->get_gps_interface = gps__get_gps_interface;
|
||||
|
||||
*device = (struct hw_device_t*)dev;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct hw_module_methods_t gps_module_methods = {
|
||||
.open = open_gps
|
||||
};
|
||||
|
||||
struct hw_module_t HAL_MODULE_INFO_SYM = {
|
||||
.tag = HARDWARE_MODULE_TAG,
|
||||
.module_api_version = 1,
|
||||
.hal_api_version = 0,
|
||||
.id = GPS_HARDWARE_MODULE_ID,
|
||||
.name = "loc_api GPS Module",
|
||||
.author = "Qualcomm USA, Inc.",
|
||||
.methods = &gps_module_methods,
|
||||
};
|
1077
gps/loc_api/libloc_api_50001/loc.cpp
Normal file
1077
gps/loc_api/libloc_api_50001/loc.cpp
Normal file
File diff suppressed because it is too large
Load Diff
66
gps/loc_api/libloc_api_50001/loc.h
Normal file
66
gps/loc_api/libloc_api_50001/loc.h
Normal file
@ -0,0 +1,66 @@
|
||||
/* Copyright (c) 2011,2014 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_H__
|
||||
#define __LOC_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#include <ctype.h>
|
||||
#include <cutils/properties.h>
|
||||
#include <hardware/gps.h>
|
||||
#include <gps_extended.h>
|
||||
|
||||
#define XTRA_DATA_MAX_SIZE 100000 /*bytes*/
|
||||
|
||||
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_ext_parser)(void* data);
|
||||
|
||||
typedef struct {
|
||||
loc_location_cb_ext location_cb;
|
||||
gps_status_callback status_cb;
|
||||
loc_sv_status_cb_ext sv_status_cb;
|
||||
gps_nmea_callback nmea_cb;
|
||||
gps_set_capabilities set_capabilities_cb;
|
||||
gps_acquire_wakelock acquire_wakelock_cb;
|
||||
gps_release_wakelock release_wakelock_cb;
|
||||
gps_create_thread create_thread_cb;
|
||||
loc_ext_parser location_ext_parser;
|
||||
loc_ext_parser sv_ext_parser;
|
||||
gps_request_utc_time request_utc_time_cb;
|
||||
} LocCallbacks;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif //__LOC_H__
|
2999
gps/loc_api/libloc_api_50001/loc_eng.cpp
Normal file
2999
gps/loc_api/libloc_api_50001/loc_eng.cpp
Normal file
File diff suppressed because it is too large
Load Diff
270
gps/loc_api/libloc_api_50001/loc_eng.h
Normal file
270
gps/loc_api/libloc_api_50001/loc_eng.h
Normal file
@ -0,0 +1,270 @@
|
||||
/* Copyright (c) 2009-2014, 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_H
|
||||
#define LOC_ENG_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
// Uncomment to keep all LOG messages (LOGD, LOGI, LOGV, etc.)
|
||||
#define MAX_NUM_ATL_CONNECTIONS 2
|
||||
|
||||
// Define boolean type to be used by libgps on loc api module
|
||||
typedef unsigned char boolean;
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
#include <loc.h>
|
||||
#include <loc_eng_xtra.h>
|
||||
#include <loc_eng_ni.h>
|
||||
#include <loc_eng_agps.h>
|
||||
#include <loc_cfg.h>
|
||||
#include <loc_log.h>
|
||||
#include <log_util.h>
|
||||
#include <loc_eng_agps.h>
|
||||
#include <LocEngAdapter.h>
|
||||
|
||||
// The data connection minimal open time
|
||||
#define DATA_OPEN_MIN_TIME 1 /* sec */
|
||||
|
||||
// The system sees GPS engine turns off after inactive for this period of time
|
||||
#define GPS_AUTO_OFF_TIME 2 /* secs */
|
||||
#define SUCCESS TRUE
|
||||
#define FAILURE FALSE
|
||||
#define INVALID_ATL_CONNECTION_HANDLE -1
|
||||
|
||||
#define MAX_XTRA_SERVER_URL_LENGTH 256
|
||||
|
||||
enum loc_nmea_provider_e_type {
|
||||
NMEA_PROVIDER_AP = 0, // Application Processor Provider of NMEA
|
||||
NMEA_PROVIDER_MP // Modem Processor Provider of NMEA
|
||||
};
|
||||
|
||||
enum loc_mute_session_e_type {
|
||||
LOC_MUTE_SESS_NONE = 0,
|
||||
LOC_MUTE_SESS_WAIT,
|
||||
LOC_MUTE_SESS_IN_SESSION
|
||||
};
|
||||
|
||||
// Module data
|
||||
typedef struct loc_eng_data_s
|
||||
{
|
||||
LocEngAdapter *adapter;
|
||||
loc_location_cb_ext location_cb;
|
||||
gps_status_callback status_cb;
|
||||
loc_sv_status_cb_ext sv_status_cb;
|
||||
agps_status_extended agps_status_cb;
|
||||
gps_nmea_callback nmea_cb;
|
||||
gps_ni_notify_callback ni_notify_cb;
|
||||
gps_set_capabilities set_capabilities_cb;
|
||||
gps_acquire_wakelock acquire_wakelock_cb;
|
||||
gps_release_wakelock release_wakelock_cb;
|
||||
gps_request_utc_time request_utc_time_cb;
|
||||
gps_measurement_callback gps_measurement_cb;
|
||||
boolean intermediateFix;
|
||||
AGpsStatusValue agps_status;
|
||||
loc_eng_xtra_data_s_type xtra_module_data;
|
||||
loc_eng_ni_data_s_type loc_eng_ni_data;
|
||||
|
||||
// AGPS state machines
|
||||
AgpsStateMachine* agnss_nif;
|
||||
AgpsStateMachine* internet_nif;
|
||||
AgpsStateMachine* wifi_nif;
|
||||
//State machine for Data Services
|
||||
AgpsStateMachine* ds_nif;
|
||||
|
||||
// GPS engine status
|
||||
GpsStatusValue engine_status;
|
||||
GpsStatusValue fix_session_status;
|
||||
|
||||
// Aiding data information to be deleted, aiding data can only be deleted when GPS engine is off
|
||||
GpsAidingData aiding_data_for_deletion;
|
||||
|
||||
// For muting session broadcast
|
||||
loc_mute_session_e_type mute_session_state;
|
||||
|
||||
// For nmea generation
|
||||
boolean generateNmea;
|
||||
uint32_t sv_used_mask;
|
||||
float hdop;
|
||||
float pdop;
|
||||
float vdop;
|
||||
|
||||
// Address buffers, for addressing setting before init
|
||||
int supl_host_set;
|
||||
char supl_host_buf[101];
|
||||
int supl_port_buf;
|
||||
int c2k_host_set;
|
||||
char c2k_host_buf[101];
|
||||
int c2k_port_buf;
|
||||
int mpc_host_set;
|
||||
char mpc_host_buf[101];
|
||||
int mpc_port_buf;
|
||||
|
||||
loc_ext_parser location_ext_parser;
|
||||
loc_ext_parser sv_ext_parser;
|
||||
} loc_eng_data_s_type;
|
||||
|
||||
/* GPS.conf support */
|
||||
/* NOTE: the implementaiton of the parser casts number
|
||||
fields to 32 bit. To ensure all 'n' fields working,
|
||||
they must all be 32 bit fields. */
|
||||
typedef struct loc_gps_cfg_s
|
||||
{
|
||||
uint32_t INTERMEDIATE_POS;
|
||||
uint32_t ACCURACY_THRES;
|
||||
uint32_t SUPL_VER;
|
||||
uint32_t SUPL_MODE;
|
||||
uint32_t CAPABILITIES;
|
||||
uint32_t LPP_PROFILE;
|
||||
uint32_t XTRA_VERSION_CHECK;
|
||||
char XTRA_SERVER_1[MAX_XTRA_SERVER_URL_LENGTH];
|
||||
char XTRA_SERVER_2[MAX_XTRA_SERVER_URL_LENGTH];
|
||||
char XTRA_SERVER_3[MAX_XTRA_SERVER_URL_LENGTH];
|
||||
uint32_t USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL;
|
||||
uint32_t NMEA_PROVIDER;
|
||||
uint32_t GPS_LOCK;
|
||||
uint32_t A_GLONASS_POS_PROTOCOL_SELECT;
|
||||
uint32_t AGPS_CERT_WRITABLE_MASK;
|
||||
} loc_gps_cfg_s_type;
|
||||
|
||||
/* NOTE: the implementaiton of the parser casts number
|
||||
fields to 32 bit. To ensure all 'n' fields working,
|
||||
they must all be 32 bit fields. */
|
||||
/* Meanwhile, *_valid fields are 8 bit fields, and 'f'
|
||||
fields are double. Rigid as they are, it is the
|
||||
the status quo, until the parsing mechanism is
|
||||
change, that is. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t GYRO_BIAS_RANDOM_WALK_VALID;
|
||||
double GYRO_BIAS_RANDOM_WALK;
|
||||
uint32_t SENSOR_ACCEL_BATCHES_PER_SEC;
|
||||
uint32_t SENSOR_ACCEL_SAMPLES_PER_BATCH;
|
||||
uint32_t SENSOR_GYRO_BATCHES_PER_SEC;
|
||||
uint32_t SENSOR_GYRO_SAMPLES_PER_BATCH;
|
||||
uint32_t SENSOR_ACCEL_BATCHES_PER_SEC_HIGH;
|
||||
uint32_t SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH;
|
||||
uint32_t SENSOR_GYRO_BATCHES_PER_SEC_HIGH;
|
||||
uint32_t SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH;
|
||||
uint32_t SENSOR_CONTROL_MODE;
|
||||
uint32_t SENSOR_USAGE;
|
||||
uint32_t SENSOR_ALGORITHM_CONFIG_MASK;
|
||||
uint8_t ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID;
|
||||
double ACCEL_RANDOM_WALK_SPECTRAL_DENSITY;
|
||||
uint8_t ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID;
|
||||
double ANGLE_RANDOM_WALK_SPECTRAL_DENSITY;
|
||||
uint8_t RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID;
|
||||
double RATE_RANDOM_WALK_SPECTRAL_DENSITY;
|
||||
uint8_t VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID;
|
||||
double VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY;
|
||||
uint32_t SENSOR_PROVIDER;
|
||||
} loc_sap_cfg_s_type;
|
||||
|
||||
extern loc_gps_cfg_s_type gps_conf;
|
||||
extern loc_sap_cfg_s_type sap_conf;
|
||||
|
||||
|
||||
uint32_t getCarrierCapabilities();
|
||||
|
||||
//loc_eng functions
|
||||
int loc_eng_init(loc_eng_data_s_type &loc_eng_data,
|
||||
LocCallbacks* callbacks,
|
||||
LOC_API_ADAPTER_EVENT_MASK_T event,
|
||||
ContextBase* context);
|
||||
int loc_eng_start(loc_eng_data_s_type &loc_eng_data);
|
||||
int loc_eng_stop(loc_eng_data_s_type &loc_eng_data);
|
||||
void loc_eng_cleanup(loc_eng_data_s_type &loc_eng_data);
|
||||
int loc_eng_inject_time(loc_eng_data_s_type &loc_eng_data,
|
||||
GpsUtcTime time, int64_t timeReference,
|
||||
int uncertainty);
|
||||
int loc_eng_inject_location(loc_eng_data_s_type &loc_eng_data,
|
||||
double latitude, double longitude,
|
||||
float accuracy);
|
||||
void loc_eng_delete_aiding_data(loc_eng_data_s_type &loc_eng_data,
|
||||
GpsAidingData f);
|
||||
int loc_eng_set_position_mode(loc_eng_data_s_type &loc_eng_data,
|
||||
LocPosMode ¶ms);
|
||||
const void* loc_eng_get_extension(loc_eng_data_s_type &loc_eng_data,
|
||||
const char* name);
|
||||
int loc_eng_set_server_proxy(loc_eng_data_s_type &loc_eng_data,
|
||||
LocServerType type, const char *hostname, int port);
|
||||
void loc_eng_mute_one_session(loc_eng_data_s_type &loc_eng_data);
|
||||
int loc_eng_read_config(void);
|
||||
|
||||
//loc_eng_agps functions
|
||||
void loc_eng_agps_init(loc_eng_data_s_type &loc_eng_data,
|
||||
AGpsExtCallbacks* callbacks);
|
||||
int loc_eng_agps_open(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType,
|
||||
const char* apn, AGpsBearerType bearerType);
|
||||
int loc_eng_agps_closed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType);
|
||||
int loc_eng_agps_open_failed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType);
|
||||
void loc_eng_agps_ril_update_network_availability(loc_eng_data_s_type &loc_eng_data,
|
||||
int avaiable, const char* apn);
|
||||
int loc_eng_agps_install_certificates(loc_eng_data_s_type &loc_eng_data,
|
||||
const DerEncodedCertificate* certificates,
|
||||
size_t length);
|
||||
|
||||
//loc_eng_xtra functions
|
||||
int loc_eng_xtra_init (loc_eng_data_s_type &loc_eng_data,
|
||||
GpsXtraExtCallbacks* callbacks);
|
||||
int loc_eng_xtra_inject_data(loc_eng_data_s_type &loc_eng_data,
|
||||
char* data, int length);
|
||||
int loc_eng_xtra_request_server(loc_eng_data_s_type &loc_eng_data);
|
||||
void loc_eng_xtra_version_check(loc_eng_data_s_type &loc_eng_data, int check);
|
||||
|
||||
//loc_eng_ni functions
|
||||
extern void loc_eng_ni_init(loc_eng_data_s_type &loc_eng_data,
|
||||
GpsNiExtCallbacks *callbacks);
|
||||
extern void loc_eng_ni_respond(loc_eng_data_s_type &loc_eng_data,
|
||||
int notif_id, GpsUserResponseType user_response);
|
||||
extern void loc_eng_ni_request_handler(loc_eng_data_s_type &loc_eng_data,
|
||||
const GpsNiNotification *notif,
|
||||
const void* passThrough);
|
||||
extern void loc_eng_ni_reset_on_engine_restart(loc_eng_data_s_type &loc_eng_data);
|
||||
|
||||
void loc_eng_configuration_update (loc_eng_data_s_type &loc_eng_data,
|
||||
const char* config_data, int32_t length);
|
||||
int loc_eng_gps_measurement_init(loc_eng_data_s_type &loc_eng_data,
|
||||
GpsMeasurementCallbacks* callbacks);
|
||||
void loc_eng_gps_measurement_close(loc_eng_data_s_type &loc_eng_data);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif // LOC_ENG_H
|
970
gps/loc_api/libloc_api_50001/loc_eng_agps.cpp
Normal file
970
gps/loc_api/libloc_api_50001/loc_eng_agps.cpp
Normal file
@ -0,0 +1,970 @@
|
||||
/* 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_eng"
|
||||
|
||||
#include <loc_eng_agps.h>
|
||||
#include <loc_eng_log.h>
|
||||
#include <log_util.h>
|
||||
#include <platform_lib_includes.h>
|
||||
#include <loc_eng_dmn_conn_handler.h>
|
||||
#include <loc_eng_dmn_conn.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
//======================================================================
|
||||
// C callbacks
|
||||
//======================================================================
|
||||
|
||||
// This is given to linked_list_add as the dealloc callback
|
||||
// data -- an instance of Subscriber
|
||||
static void deleteObj(void* data)
|
||||
{
|
||||
delete (Subscriber*)data;
|
||||
}
|
||||
|
||||
// This is given to linked_list_search() as the comparison callback
|
||||
// when the state manchine needs to process for particular subscriber
|
||||
// fromCaller -- caller provides this obj
|
||||
// fromList -- linked_list_search() function take this one from list
|
||||
static bool hasSubscriber(void* fromCaller, void* fromList)
|
||||
{
|
||||
Notification* notification = (Notification*)fromCaller;
|
||||
Subscriber* s1 = (Subscriber*)fromList;
|
||||
|
||||
return s1->forMe(*notification);
|
||||
}
|
||||
|
||||
// This is gvien to linked_list_search() to notify subscriber objs
|
||||
// when the state machine needs to inform all subscribers of resource
|
||||
// status changes, e.g. when resource is GRANTED.
|
||||
// fromCaller -- caller provides this ptr to a Notification obj.
|
||||
// fromList -- linked_list_search() function take this one from list
|
||||
static bool notifySubscriber(void* fromCaller, void* fromList)
|
||||
{
|
||||
Notification* notification = (Notification*)fromCaller;
|
||||
Subscriber* s1 = (Subscriber*)fromList;
|
||||
|
||||
// we notify every subscriber indiscriminatively
|
||||
// each subscriber decides if this notification is interesting.
|
||||
return s1->notifyRsrcStatus(*notification) &&
|
||||
// if we do not want to delete the subscriber from the
|
||||
// the list, we must set this to false so this function
|
||||
// returns false
|
||||
notification->postNotifyDelete;
|
||||
}
|
||||
|
||||
//======================================================================
|
||||
// Notification
|
||||
//======================================================================
|
||||
const int Notification::BROADCAST_ALL = 0x80000000;
|
||||
const int Notification::BROADCAST_ACTIVE = 0x80000001;
|
||||
const int Notification::BROADCAST_INACTIVE = 0x80000002;
|
||||
const unsigned char DSStateMachine::MAX_START_DATA_CALL_RETRIES = 4;
|
||||
const unsigned int DSStateMachine::DATA_CALL_RETRY_DELAY_MSEC = 500;
|
||||
//======================================================================
|
||||
// Subscriber: BITSubscriber / ATLSubscriber / WIFISubscriber
|
||||
//======================================================================
|
||||
bool Subscriber::forMe(Notification ¬ification)
|
||||
{
|
||||
if (NULL != notification.rcver) {
|
||||
return equals(notification.rcver);
|
||||
} else {
|
||||
return Notification::BROADCAST_ALL == notification.groupID ||
|
||||
(Notification::BROADCAST_ACTIVE == notification.groupID &&
|
||||
!isInactive()) ||
|
||||
(Notification::BROADCAST_INACTIVE == notification.groupID &&
|
||||
isInactive());
|
||||
}
|
||||
}
|
||||
bool BITSubscriber::equals(const Subscriber *s) const
|
||||
{
|
||||
BITSubscriber* bitS = (BITSubscriber*)s;
|
||||
|
||||
return (ID == bitS->ID &&
|
||||
(INADDR_NONE != (unsigned int)ID ||
|
||||
0 == strncmp(mIPv6Addr, bitS->mIPv6Addr, sizeof(mIPv6Addr))));
|
||||
}
|
||||
|
||||
bool BITSubscriber::notifyRsrcStatus(Notification ¬ification)
|
||||
{
|
||||
bool notify = forMe(notification);
|
||||
|
||||
if (notify) {
|
||||
switch(notification.rsrcStatus)
|
||||
{
|
||||
case RSRC_UNSUBSCRIBE:
|
||||
case RSRC_RELEASED:
|
||||
loc_eng_dmn_conn_loc_api_server_data_conn(
|
||||
LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON,
|
||||
GPSONE_LOC_API_IF_RELEASE_SUCCESS);
|
||||
break;
|
||||
case RSRC_DENIED:
|
||||
loc_eng_dmn_conn_loc_api_server_data_conn(
|
||||
LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON,
|
||||
GPSONE_LOC_API_IF_FAILURE);
|
||||
break;
|
||||
case RSRC_GRANTED:
|
||||
loc_eng_dmn_conn_loc_api_server_data_conn(
|
||||
LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON,
|
||||
GPSONE_LOC_API_IF_REQUEST_SUCCESS);
|
||||
break;
|
||||
default:
|
||||
notify = false;
|
||||
}
|
||||
}
|
||||
|
||||
return notify;
|
||||
}
|
||||
|
||||
bool ATLSubscriber::notifyRsrcStatus(Notification ¬ification)
|
||||
{
|
||||
bool notify = forMe(notification);
|
||||
|
||||
if (notify) {
|
||||
switch(notification.rsrcStatus)
|
||||
{
|
||||
case RSRC_UNSUBSCRIBE:
|
||||
case RSRC_RELEASED:
|
||||
((LocEngAdapter*)mLocAdapter)->atlCloseStatus(ID, 1);
|
||||
break;
|
||||
case RSRC_DENIED:
|
||||
{
|
||||
AGpsExtType type = mBackwardCompatibleMode ?
|
||||
AGPS_TYPE_INVALID : mStateMachine->getType();
|
||||
((LocEngAdapter*)mLocAdapter)->atlOpenStatus(ID, 0,
|
||||
(char*)mStateMachine->getAPN(),
|
||||
mStateMachine->getBearer(),
|
||||
type);
|
||||
}
|
||||
break;
|
||||
case RSRC_GRANTED:
|
||||
{
|
||||
AGpsExtType type = mBackwardCompatibleMode ?
|
||||
AGPS_TYPE_INVALID : mStateMachine->getType();
|
||||
((LocEngAdapter*)mLocAdapter)->atlOpenStatus(ID, 1,
|
||||
(char*)mStateMachine->getAPN(),
|
||||
mStateMachine->getBearer(),
|
||||
type);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
notify = false;
|
||||
}
|
||||
}
|
||||
|
||||
return notify;
|
||||
}
|
||||
|
||||
bool WIFISubscriber::notifyRsrcStatus(Notification ¬ification)
|
||||
{
|
||||
bool notify = forMe(notification);
|
||||
|
||||
if (notify) {
|
||||
switch(notification.rsrcStatus)
|
||||
{
|
||||
case RSRC_UNSUBSCRIBE:
|
||||
break;
|
||||
case RSRC_RELEASED:
|
||||
loc_eng_dmn_conn_loc_api_server_data_conn(
|
||||
senderId,
|
||||
GPSONE_LOC_API_IF_RELEASE_SUCCESS);
|
||||
break;
|
||||
case RSRC_DENIED:
|
||||
loc_eng_dmn_conn_loc_api_server_data_conn(
|
||||
senderId,
|
||||
GPSONE_LOC_API_IF_FAILURE);
|
||||
break;
|
||||
case RSRC_GRANTED:
|
||||
loc_eng_dmn_conn_loc_api_server_data_conn(
|
||||
senderId,
|
||||
GPSONE_LOC_API_IF_REQUEST_SUCCESS);
|
||||
break;
|
||||
default:
|
||||
notify = false;
|
||||
}
|
||||
}
|
||||
|
||||
return notify;
|
||||
}
|
||||
bool DSSubscriber::notifyRsrcStatus(Notification ¬ification)
|
||||
{
|
||||
bool notify = forMe(notification);
|
||||
LOC_LOGD("DSSubscriber::notifyRsrcStatus. notify:%d \n",(int)(notify));
|
||||
if(notify) {
|
||||
switch(notification.rsrcStatus) {
|
||||
case RSRC_UNSUBSCRIBE:
|
||||
case RSRC_RELEASED:
|
||||
case RSRC_DENIED:
|
||||
case RSRC_GRANTED:
|
||||
((DSStateMachine *)mStateMachine)->informStatus(notification.rsrcStatus, ID);
|
||||
break;
|
||||
default:
|
||||
notify = false;
|
||||
}
|
||||
}
|
||||
return notify;
|
||||
}
|
||||
void DSSubscriber :: setInactive()
|
||||
{
|
||||
mIsInactive = true;
|
||||
((DSStateMachine *)mStateMachine)->informStatus(RSRC_UNSUBSCRIBE, ID);
|
||||
}
|
||||
//======================================================================
|
||||
// AgpsState: AgpsReleasedState / AgpsPendingState / AgpsAcquiredState
|
||||
//======================================================================
|
||||
|
||||
// AgpsReleasedState
|
||||
class AgpsReleasedState : public AgpsState
|
||||
{
|
||||
friend class AgpsStateMachine;
|
||||
|
||||
inline AgpsReleasedState(AgpsStateMachine* stateMachine) :
|
||||
AgpsState(stateMachine)
|
||||
{ mReleasedState = this; }
|
||||
|
||||
inline ~AgpsReleasedState() {}
|
||||
public:
|
||||
virtual AgpsState* onRsrcEvent(AgpsRsrcStatus event, void* data);
|
||||
inline virtual char* whoami() {return (char*)"AgpsReleasedState";}
|
||||
};
|
||||
|
||||
AgpsState* AgpsReleasedState::onRsrcEvent(AgpsRsrcStatus event, void* data)
|
||||
{
|
||||
LOC_LOGD("AgpsReleasedState::onRsrcEvent; event:%d\n", (int)event);
|
||||
if (mStateMachine->hasSubscribers()) {
|
||||
LOC_LOGE("Error: %s subscriber list not empty!!!", whoami());
|
||||
// I don't know how to recover from it. I am adding this rather
|
||||
// for debugging purpose.
|
||||
}
|
||||
|
||||
AgpsState* nextState = this;
|
||||
switch (event)
|
||||
{
|
||||
case RSRC_SUBSCRIBE:
|
||||
{
|
||||
// no notification until we get RSRC_GRANTED
|
||||
// but we need to add subscriber to the list
|
||||
mStateMachine->addSubscriber((Subscriber*)data);
|
||||
// request from connecivity service for NIF
|
||||
//The if condition is added so that if the data call setup fails
|
||||
//for DS State Machine, we want to retry in released state.
|
||||
//for AGps State Machine, sendRsrcRequest() will always return success
|
||||
if(!mStateMachine->sendRsrcRequest(GPS_REQUEST_AGPS_DATA_CONN)) {
|
||||
// move the state to PENDING
|
||||
nextState = mPendingState;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case RSRC_UNSUBSCRIBE:
|
||||
{
|
||||
// the list should really be empty, nothing to remove.
|
||||
// but we might as well just tell the client it is
|
||||
// unsubscribed. False tolerance, right?
|
||||
Subscriber* subscriber = (Subscriber*) data;
|
||||
Notification notification(subscriber, event, false);
|
||||
subscriber->notifyRsrcStatus(notification);
|
||||
}
|
||||
// break;
|
||||
case RSRC_GRANTED:
|
||||
case RSRC_RELEASED:
|
||||
case RSRC_DENIED:
|
||||
default:
|
||||
LOC_LOGW("%s: unrecognized event %d", whoami(), event);
|
||||
// no state change.
|
||||
break;
|
||||
}
|
||||
|
||||
LOC_LOGD("onRsrcEvent, old state %s, new state %s, event %d",
|
||||
whoami(), nextState->whoami(), event);
|
||||
return nextState;
|
||||
}
|
||||
|
||||
// AgpsPendingState
|
||||
class AgpsPendingState : public AgpsState
|
||||
{
|
||||
friend class AgpsStateMachine;
|
||||
|
||||
inline AgpsPendingState(AgpsStateMachine* stateMachine) :
|
||||
AgpsState(stateMachine)
|
||||
{ mPendingState = this; }
|
||||
|
||||
inline ~AgpsPendingState() {}
|
||||
public:
|
||||
virtual AgpsState* onRsrcEvent(AgpsRsrcStatus event, void* data);
|
||||
inline virtual char* whoami() {return (char*)"AgpsPendingState";}
|
||||
};
|
||||
|
||||
AgpsState* AgpsPendingState::onRsrcEvent(AgpsRsrcStatus event, void* data)
|
||||
{
|
||||
AgpsState* nextState = this;;
|
||||
LOC_LOGD("AgpsPendingState::onRsrcEvent; event:%d\n", (int)event);
|
||||
switch (event)
|
||||
{
|
||||
case RSRC_SUBSCRIBE:
|
||||
{
|
||||
// already requested for NIF resource,
|
||||
// do nothing until we get RSRC_GRANTED indication
|
||||
// but we need to add subscriber to the list
|
||||
mStateMachine->addSubscriber((Subscriber*)data);
|
||||
// no state change.
|
||||
}
|
||||
break;
|
||||
|
||||
case RSRC_UNSUBSCRIBE:
|
||||
{
|
||||
Subscriber* subscriber = (Subscriber*) data;
|
||||
if (subscriber->waitForCloseComplete()) {
|
||||
subscriber->setInactive();
|
||||
} else {
|
||||
// auto notify this subscriber of the unsubscribe
|
||||
Notification notification(subscriber, event, true);
|
||||
mStateMachine->notifySubscribers(notification);
|
||||
}
|
||||
|
||||
// now check if there is any subscribers left
|
||||
if (!mStateMachine->hasSubscribers()) {
|
||||
// no more subscribers, move to RELEASED state
|
||||
nextState = mReleasedState;
|
||||
|
||||
// tell connecivity service we can release NIF
|
||||
mStateMachine->sendRsrcRequest(GPS_RELEASE_AGPS_DATA_CONN);
|
||||
} else if (!mStateMachine->hasActiveSubscribers()) {
|
||||
// only inactive subscribers, move to RELEASING state
|
||||
nextState = mReleasingState;
|
||||
|
||||
// tell connecivity service we can release NIF
|
||||
mStateMachine->sendRsrcRequest(GPS_RELEASE_AGPS_DATA_CONN);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case RSRC_GRANTED:
|
||||
{
|
||||
nextState = mAcquiredState;
|
||||
Notification notification(Notification::BROADCAST_ACTIVE, event, false);
|
||||
// notify all subscribers NIF resource GRANTED
|
||||
// by setting false, we keep subscribers on the linked list
|
||||
mStateMachine->notifySubscribers(notification);
|
||||
}
|
||||
break;
|
||||
|
||||
case RSRC_RELEASED:
|
||||
// no state change.
|
||||
// we are expecting either GRANTED or DENIED. Handling RELEASED
|
||||
// may like break our state machine in race conditions.
|
||||
break;
|
||||
|
||||
case RSRC_DENIED:
|
||||
{
|
||||
nextState = mReleasedState;
|
||||
Notification notification(Notification::BROADCAST_ALL, event, true);
|
||||
// notify all subscribers NIF resource RELEASED or DENIED
|
||||
// by setting true, we remove subscribers from the linked list
|
||||
mStateMachine->notifySubscribers(notification);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
LOC_LOGE("%s: unrecognized event %d", whoami(), event);
|
||||
// no state change.
|
||||
}
|
||||
|
||||
LOC_LOGD("onRsrcEvent, old state %s, new state %s, event %d",
|
||||
whoami(), nextState->whoami(), event);
|
||||
return nextState;
|
||||
}
|
||||
|
||||
|
||||
class AgpsAcquiredState : public AgpsState
|
||||
{
|
||||
friend class AgpsStateMachine;
|
||||
|
||||
inline AgpsAcquiredState(AgpsStateMachine* stateMachine) :
|
||||
AgpsState(stateMachine)
|
||||
{ mAcquiredState = this; }
|
||||
|
||||
inline ~AgpsAcquiredState() {}
|
||||
public:
|
||||
virtual AgpsState* onRsrcEvent(AgpsRsrcStatus event, void* data);
|
||||
inline virtual char* whoami() { return (char*)"AgpsAcquiredState"; }
|
||||
};
|
||||
|
||||
|
||||
AgpsState* AgpsAcquiredState::onRsrcEvent(AgpsRsrcStatus event, void* data)
|
||||
{
|
||||
AgpsState* nextState = this;
|
||||
LOC_LOGD("AgpsAcquiredState::onRsrcEvent; event:%d\n", (int)event);
|
||||
switch (event)
|
||||
{
|
||||
case RSRC_SUBSCRIBE:
|
||||
{
|
||||
// we already have the NIF resource, simply notify subscriber
|
||||
Subscriber* subscriber = (Subscriber*) data;
|
||||
// we have rsrc in hand, so grant it right away
|
||||
Notification notification(subscriber, RSRC_GRANTED, false);
|
||||
subscriber->notifyRsrcStatus(notification);
|
||||
// add subscriber to the list
|
||||
mStateMachine->addSubscriber(subscriber);
|
||||
// no state change.
|
||||
}
|
||||
break;
|
||||
|
||||
case RSRC_UNSUBSCRIBE:
|
||||
{
|
||||
Subscriber* subscriber = (Subscriber*) data;
|
||||
if (subscriber->waitForCloseComplete()) {
|
||||
subscriber->setInactive();
|
||||
} else {
|
||||
// auto notify this subscriber of the unsubscribe
|
||||
Notification notification(subscriber, event, true);
|
||||
mStateMachine->notifySubscribers(notification);
|
||||
}
|
||||
|
||||
// now check if there is any subscribers left
|
||||
if (!mStateMachine->hasSubscribers()) {
|
||||
// no more subscribers, move to RELEASED state
|
||||
nextState = mReleasedState;
|
||||
|
||||
// tell connecivity service we can release NIF
|
||||
mStateMachine->sendRsrcRequest(GPS_RELEASE_AGPS_DATA_CONN);
|
||||
} else if (!mStateMachine->hasActiveSubscribers()) {
|
||||
// only inactive subscribers, move to RELEASING state
|
||||
nextState = mReleasingState;
|
||||
|
||||
// tell connecivity service we can release NIF
|
||||
mStateMachine->sendRsrcRequest(GPS_RELEASE_AGPS_DATA_CONN);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case RSRC_GRANTED:
|
||||
LOC_LOGW("%s: %d, RSRC_GRANTED already received", whoami(), event);
|
||||
// no state change.
|
||||
break;
|
||||
|
||||
case RSRC_RELEASED:
|
||||
{
|
||||
LOC_LOGW("%s: %d, a force rsrc release", whoami(), event);
|
||||
nextState = mReleasedState;
|
||||
Notification notification(Notification::BROADCAST_ALL, event, true);
|
||||
// by setting true, we remove subscribers from the linked list
|
||||
mStateMachine->notifySubscribers(notification);
|
||||
}
|
||||
break;
|
||||
|
||||
case RSRC_DENIED:
|
||||
// no state change.
|
||||
// we are expecting RELEASED. Handling DENIED
|
||||
// may like break our state machine in race conditions.
|
||||
break;
|
||||
|
||||
default:
|
||||
LOC_LOGE("%s: unrecognized event %d", whoami(), event);
|
||||
// no state change.
|
||||
}
|
||||
|
||||
LOC_LOGD("onRsrcEvent, old state %s, new state %s, event %d",
|
||||
whoami(), nextState->whoami(), event);
|
||||
return nextState;
|
||||
}
|
||||
|
||||
// AgpsPendingState
|
||||
class AgpsReleasingState : public AgpsState
|
||||
{
|
||||
friend class AgpsStateMachine;
|
||||
|
||||
inline AgpsReleasingState(AgpsStateMachine* stateMachine) :
|
||||
AgpsState(stateMachine)
|
||||
{ mReleasingState = this; }
|
||||
|
||||
inline ~AgpsReleasingState() {}
|
||||
public:
|
||||
virtual AgpsState* onRsrcEvent(AgpsRsrcStatus event, void* data);
|
||||
inline virtual char* whoami() {return (char*)"AgpsReleasingState";}
|
||||
};
|
||||
|
||||
AgpsState* AgpsReleasingState::onRsrcEvent(AgpsRsrcStatus event, void* data)
|
||||
{
|
||||
AgpsState* nextState = this;;
|
||||
LOC_LOGD("AgpsReleasingState::onRsrcEvent; event:%d\n", (int)event);
|
||||
|
||||
switch (event)
|
||||
{
|
||||
case RSRC_SUBSCRIBE:
|
||||
{
|
||||
// already requested for NIF resource,
|
||||
// do nothing until we get RSRC_GRANTED indication
|
||||
// but we need to add subscriber to the list
|
||||
mStateMachine->addSubscriber((Subscriber*)data);
|
||||
// no state change.
|
||||
}
|
||||
break;
|
||||
|
||||
case RSRC_UNSUBSCRIBE:
|
||||
{
|
||||
Subscriber* subscriber = (Subscriber*) data;
|
||||
if (subscriber->waitForCloseComplete()) {
|
||||
subscriber->setInactive();
|
||||
} else {
|
||||
// auto notify this subscriber of the unsubscribe
|
||||
Notification notification(subscriber, event, true);
|
||||
mStateMachine->notifySubscribers(notification);
|
||||
}
|
||||
|
||||
// now check if there is any subscribers left
|
||||
if (!mStateMachine->hasSubscribers()) {
|
||||
// no more subscribers, move to RELEASED state
|
||||
nextState = mReleasedState;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case RSRC_DENIED:
|
||||
// A race condition subscriber unsubscribes before AFW denies resource.
|
||||
case RSRC_RELEASED:
|
||||
{
|
||||
nextState = mAcquiredState;
|
||||
Notification notification(Notification::BROADCAST_INACTIVE, event, true);
|
||||
// notify all subscribers that are active NIF resource RELEASE
|
||||
// by setting false, we keep subscribers on the linked list
|
||||
mStateMachine->notifySubscribers(notification);
|
||||
|
||||
if (mStateMachine->hasActiveSubscribers()) {
|
||||
nextState = mPendingState;
|
||||
// request from connecivity service for NIF
|
||||
mStateMachine->sendRsrcRequest(GPS_REQUEST_AGPS_DATA_CONN);
|
||||
} else {
|
||||
nextState = mReleasedState;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case RSRC_GRANTED:
|
||||
default:
|
||||
LOC_LOGE("%s: unrecognized event %d", whoami(), event);
|
||||
// no state change.
|
||||
}
|
||||
|
||||
LOC_LOGD("onRsrcEvent, old state %s, new state %s, event %d",
|
||||
whoami(), nextState->whoami(), event);
|
||||
return nextState;
|
||||
}
|
||||
//======================================================================
|
||||
//Servicer
|
||||
//======================================================================
|
||||
Servicer* Servicer :: getServicer(servicerType type, void *cb_func)
|
||||
{
|
||||
LOC_LOGD(" Enter getServicer type:%d\n", (int)type);
|
||||
switch(type) {
|
||||
case servicerTypeNoCbParam:
|
||||
return (new Servicer(cb_func));
|
||||
case servicerTypeExt:
|
||||
return (new ExtServicer(cb_func));
|
||||
case servicerTypeAgps:
|
||||
return (new AGpsServicer(cb_func));
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
int Servicer :: requestRsrc(void *cb_data)
|
||||
{
|
||||
callback();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ExtServicer :: requestRsrc(void *cb_data)
|
||||
{
|
||||
int ret=-1;
|
||||
LOC_LOGD("Enter ExtServicer :: requestRsrc\n");
|
||||
ret = callbackExt(cb_data);
|
||||
LOC_LOGD("Exit ExtServicer :: requestRsrc\n");
|
||||
return(ret);
|
||||
}
|
||||
|
||||
int AGpsServicer :: requestRsrc(void *cb_data)
|
||||
{
|
||||
callbackAGps((AGpsStatus *)cb_data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//======================================================================
|
||||
// AgpsStateMachine
|
||||
//======================================================================
|
||||
|
||||
AgpsStateMachine::AgpsStateMachine(servicerType servType,
|
||||
void *cb_func,
|
||||
AGpsExtType type,
|
||||
bool enforceSingleSubscriber) :
|
||||
mStatePtr(new AgpsReleasedState(this)),mType(type),
|
||||
mAPN(NULL),
|
||||
mAPNLen(0),
|
||||
mBearer(AGPS_APN_BEARER_INVALID),
|
||||
mEnforceSingleSubscriber(enforceSingleSubscriber),
|
||||
mServicer(Servicer :: getServicer(servType, (void *)cb_func))
|
||||
{
|
||||
linked_list_init(&mSubscribers);
|
||||
|
||||
// setting up mReleasedState
|
||||
mStatePtr->mPendingState = new AgpsPendingState(this);
|
||||
mStatePtr->mAcquiredState = new AgpsAcquiredState(this);
|
||||
mStatePtr->mReleasingState = new AgpsReleasingState(this);
|
||||
|
||||
// setting up mAcquiredState
|
||||
mStatePtr->mAcquiredState->mReleasedState = mStatePtr;
|
||||
mStatePtr->mAcquiredState->mPendingState = mStatePtr->mPendingState;
|
||||
mStatePtr->mAcquiredState->mReleasingState = mStatePtr->mReleasingState;
|
||||
|
||||
// setting up mPendingState
|
||||
mStatePtr->mPendingState->mAcquiredState = mStatePtr->mAcquiredState;
|
||||
mStatePtr->mPendingState->mReleasedState = mStatePtr;
|
||||
mStatePtr->mPendingState->mReleasingState = mStatePtr->mReleasingState;
|
||||
|
||||
// setting up mReleasingState
|
||||
mStatePtr->mReleasingState->mReleasedState = mStatePtr;
|
||||
mStatePtr->mReleasingState->mPendingState = mStatePtr->mPendingState;
|
||||
mStatePtr->mReleasingState->mAcquiredState = mStatePtr->mAcquiredState;
|
||||
}
|
||||
|
||||
AgpsStateMachine::~AgpsStateMachine()
|
||||
{
|
||||
dropAllSubscribers();
|
||||
|
||||
// free the 3 states. We must read out all 3 pointers first.
|
||||
// Otherwise we run the risk of getting pointers from already
|
||||
// freed memory.
|
||||
AgpsState* acquiredState = mStatePtr->mAcquiredState;
|
||||
AgpsState* releasedState = mStatePtr->mReleasedState;
|
||||
AgpsState* pendindState = mStatePtr->mPendingState;
|
||||
AgpsState* releasingState = mStatePtr->mReleasingState;
|
||||
|
||||
delete acquiredState;
|
||||
delete releasedState;
|
||||
delete pendindState;
|
||||
delete releasingState;
|
||||
delete mServicer;
|
||||
linked_list_destroy(&mSubscribers);
|
||||
|
||||
if (NULL != mAPN) {
|
||||
delete[] mAPN;
|
||||
mAPN = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void AgpsStateMachine::setAPN(const char* apn, unsigned int len)
|
||||
{
|
||||
if (NULL != mAPN) {
|
||||
delete mAPN;
|
||||
}
|
||||
|
||||
if (NULL != apn) {
|
||||
mAPN = new char[len+1];
|
||||
memcpy(mAPN, apn, len);
|
||||
mAPN[len] = NULL;
|
||||
|
||||
mAPNLen = len;
|
||||
} else {
|
||||
mAPN = NULL;
|
||||
mAPNLen = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void AgpsStateMachine::onRsrcEvent(AgpsRsrcStatus event)
|
||||
{
|
||||
switch (event)
|
||||
{
|
||||
case RSRC_GRANTED:
|
||||
case RSRC_RELEASED:
|
||||
case RSRC_DENIED:
|
||||
mStatePtr = mStatePtr->onRsrcEvent(event, NULL);
|
||||
break;
|
||||
default:
|
||||
LOC_LOGW("AgpsStateMachine: unrecognized event %d", event);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void AgpsStateMachine::notifySubscribers(Notification& notification) const
|
||||
{
|
||||
if (notification.postNotifyDelete) {
|
||||
// just any non NULL value to get started
|
||||
Subscriber* s = (Subscriber*)~0;
|
||||
while (NULL != s) {
|
||||
s = NULL;
|
||||
// if the last param sets to true, _search will delete
|
||||
// the node from the list for us. But the problem is
|
||||
// once that is done, _search returns, leaving the
|
||||
// rest of the list unprocessed. So we need a loop.
|
||||
linked_list_search(mSubscribers, (void**)&s, notifySubscriber,
|
||||
(void*)¬ification, true);
|
||||
delete s;
|
||||
}
|
||||
} else {
|
||||
// no loop needed if it the last param sets to false, which
|
||||
// mean nothing gets deleted from the list.
|
||||
linked_list_search(mSubscribers, NULL, notifySubscriber,
|
||||
(void*)¬ification, false);
|
||||
}
|
||||
}
|
||||
|
||||
void AgpsStateMachine::addSubscriber(Subscriber* subscriber) const
|
||||
{
|
||||
Subscriber* s = NULL;
|
||||
Notification notification((const Subscriber*)subscriber);
|
||||
linked_list_search(mSubscribers, (void**)&s,
|
||||
hasSubscriber, (void*)¬ification, false);
|
||||
|
||||
if (NULL == s) {
|
||||
linked_list_add(mSubscribers, subscriber->clone(), deleteObj);
|
||||
}
|
||||
}
|
||||
|
||||
int AgpsStateMachine::sendRsrcRequest(AGpsStatusValue action) const
|
||||
{
|
||||
Subscriber* s = NULL;
|
||||
Notification notification(Notification::BROADCAST_ACTIVE);
|
||||
linked_list_search(mSubscribers, (void**)&s, hasSubscriber,
|
||||
(void*)¬ification, false);
|
||||
|
||||
if ((NULL == s) == (GPS_RELEASE_AGPS_DATA_CONN == action)) {
|
||||
AGpsExtStatus nifRequest;
|
||||
nifRequest.size = sizeof(nifRequest);
|
||||
nifRequest.type = mType;
|
||||
nifRequest.status = action;
|
||||
|
||||
if (s == NULL) {
|
||||
nifRequest.ipv4_addr = INADDR_NONE;
|
||||
memset(&nifRequest.addr, 0, sizeof(nifRequest.addr));
|
||||
nifRequest.ssid[0] = '\0';
|
||||
nifRequest.password[0] = '\0';
|
||||
} else {
|
||||
s->setIPAddresses(nifRequest.addr);
|
||||
s->setWifiInfo(nifRequest.ssid, nifRequest.password);
|
||||
}
|
||||
|
||||
CALLBACK_LOG_CALLFLOW("agps_cb", %s, loc_get_agps_status_name(action));
|
||||
mServicer->requestRsrc((void *)&nifRequest);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void AgpsStateMachine::subscribeRsrc(Subscriber *subscriber)
|
||||
{
|
||||
if (mEnforceSingleSubscriber && hasSubscribers()) {
|
||||
Notification notification(Notification::BROADCAST_ALL, RSRC_DENIED, true);
|
||||
notifySubscriber(¬ification, subscriber);
|
||||
} else {
|
||||
mStatePtr = mStatePtr->onRsrcEvent(RSRC_SUBSCRIBE, (void*)subscriber);
|
||||
}
|
||||
}
|
||||
|
||||
bool AgpsStateMachine::unsubscribeRsrc(Subscriber *subscriber)
|
||||
{
|
||||
Subscriber* s = NULL;
|
||||
Notification notification((const Subscriber*)subscriber);
|
||||
linked_list_search(mSubscribers, (void**)&s,
|
||||
hasSubscriber, (void*)¬ification, false);
|
||||
|
||||
if (NULL != s) {
|
||||
mStatePtr = mStatePtr->onRsrcEvent(RSRC_UNSUBSCRIBE, (void*)s);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool AgpsStateMachine::hasActiveSubscribers() const
|
||||
{
|
||||
Subscriber* s = NULL;
|
||||
Notification notification(Notification::BROADCAST_ACTIVE);
|
||||
linked_list_search(mSubscribers, (void**)&s,
|
||||
hasSubscriber, (void*)¬ification, false);
|
||||
return NULL != s;
|
||||
}
|
||||
|
||||
//======================================================================
|
||||
// DSStateMachine
|
||||
//======================================================================
|
||||
void delay_callback(void *callbackData, int result)
|
||||
{
|
||||
if(callbackData) {
|
||||
DSStateMachine *DSSMInstance = (DSStateMachine *)callbackData;
|
||||
DSSMInstance->retryCallback();
|
||||
}
|
||||
else {
|
||||
LOC_LOGE(" NULL argument received. Failing.\n");
|
||||
goto err;
|
||||
}
|
||||
err:
|
||||
return;
|
||||
}
|
||||
|
||||
DSStateMachine :: DSStateMachine(servicerType type, void *cb_func,
|
||||
LocEngAdapter* adapterHandle):
|
||||
AgpsStateMachine(type, cb_func, AGPS_TYPE_INVALID,false),
|
||||
mLocAdapter(adapterHandle)
|
||||
{
|
||||
LOC_LOGD("%s:%d]: New DSStateMachine\n", __func__, __LINE__);
|
||||
mRetries = 0;
|
||||
}
|
||||
|
||||
void DSStateMachine :: retryCallback(void)
|
||||
{
|
||||
DSSubscriber *subscriber = NULL;
|
||||
Notification notification(Notification::BROADCAST_ACTIVE);
|
||||
linked_list_search(mSubscribers, (void**)&subscriber, hasSubscriber,
|
||||
(void*)¬ification, false);
|
||||
if(subscriber)
|
||||
mLocAdapter->requestSuplES(subscriber->ID);
|
||||
else
|
||||
LOC_LOGE("DSStateMachine :: retryCallback: No subscriber found." \
|
||||
"Cannot retry data call\n");
|
||||
return;
|
||||
}
|
||||
|
||||
int DSStateMachine :: sendRsrcRequest(AGpsStatusValue action) const
|
||||
{
|
||||
DSSubscriber* s = NULL;
|
||||
dsCbData cbData;
|
||||
int ret=-1;
|
||||
int connHandle=-1;
|
||||
LOC_LOGD("Enter DSStateMachine :: sendRsrcRequest\n");
|
||||
Notification notification(Notification::BROADCAST_ACTIVE);
|
||||
linked_list_search(mSubscribers, (void**)&s, hasSubscriber,
|
||||
(void*)¬ification, false);
|
||||
if(s) {
|
||||
connHandle = s->ID;
|
||||
LOC_LOGD("DSStateMachine :: sendRsrcRequest - subscriber found\n");
|
||||
}
|
||||
else
|
||||
LOC_LOGD("DSStateMachine :: sendRsrcRequest - No subscriber found\n");
|
||||
|
||||
cbData.action = action;
|
||||
cbData.mAdapter = mLocAdapter;
|
||||
ret = mServicer->requestRsrc((void *)&cbData);
|
||||
//Only the request to start data call returns a success/failure
|
||||
//The request to stop data call will always succeed
|
||||
//Hence, the below block will only be executed when the
|
||||
//request to start the data call fails
|
||||
switch(ret) {
|
||||
case LOC_API_ADAPTER_ERR_ENGINE_BUSY:
|
||||
LOC_LOGD("DSStateMachine :: sendRsrcRequest - Failure returned: %d\n",ret);
|
||||
((DSStateMachine *)this)->incRetries();
|
||||
if(mRetries > MAX_START_DATA_CALL_RETRIES) {
|
||||
LOC_LOGE(" Failed to start Data call. Fallback to normal ATL SUPL\n");
|
||||
informStatus(RSRC_DENIED, connHandle);
|
||||
}
|
||||
else {
|
||||
if(loc_timer_start(DATA_CALL_RETRY_DELAY_MSEC, delay_callback, (void *)this)) {
|
||||
LOC_LOGE("Error: Could not start delay thread\n");
|
||||
ret = -1;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case LOC_API_ADAPTER_ERR_UNSUPPORTED:
|
||||
LOC_LOGE("No profile found for emergency call. Fallback to normal SUPL ATL\n");
|
||||
informStatus(RSRC_DENIED, connHandle);
|
||||
break;
|
||||
case LOC_API_ADAPTER_ERR_SUCCESS:
|
||||
LOC_LOGD("%s:%d]: Request to start data call sent\n", __func__, __LINE__);
|
||||
break;
|
||||
case -1:
|
||||
//One of the ways this case can be encountered is if the callback function
|
||||
//receives a null argument, it just exits with -1 error
|
||||
LOC_LOGE("Error: Something went wrong somewhere. Falling back to normal SUPL ATL\n");
|
||||
informStatus(RSRC_DENIED, connHandle);
|
||||
break;
|
||||
default:
|
||||
LOC_LOGE("%s:%d]: Unrecognized return value\n", __func__, __LINE__);
|
||||
}
|
||||
err:
|
||||
LOC_LOGD("EXIT DSStateMachine :: sendRsrcRequest; ret = %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void DSStateMachine :: onRsrcEvent(AgpsRsrcStatus event)
|
||||
{
|
||||
void* currState = (void *)mStatePtr;
|
||||
LOC_LOGD("Enter DSStateMachine :: onRsrcEvent. event = %d\n", (int)event);
|
||||
switch (event)
|
||||
{
|
||||
case RSRC_GRANTED:
|
||||
LOC_LOGD("DSStateMachine :: onRsrcEvent RSRC_GRANTED\n");
|
||||
mStatePtr = mStatePtr->onRsrcEvent(event, NULL);
|
||||
break;
|
||||
case RSRC_RELEASED:
|
||||
LOC_LOGD("DSStateMachine :: onRsrcEvent RSRC_RELEASED\n");
|
||||
mStatePtr = mStatePtr->onRsrcEvent(event, NULL);
|
||||
//To handle the case where we get a RSRC_RELEASED in
|
||||
//pending state, we translate that to a RSRC_DENIED state
|
||||
//since the callback from DSI is either RSRC_GRANTED or RSRC_RELEASED
|
||||
//for when the call is connected or disconnected respectively.
|
||||
if((void *)mStatePtr != currState)
|
||||
break;
|
||||
else {
|
||||
event = RSRC_DENIED;
|
||||
LOC_LOGE(" Switching event to RSRC_DENIED\n");
|
||||
}
|
||||
case RSRC_DENIED:
|
||||
mStatePtr = mStatePtr->onRsrcEvent(event, NULL);
|
||||
break;
|
||||
default:
|
||||
LOC_LOGW("AgpsStateMachine: unrecognized event %d", event);
|
||||
break;
|
||||
}
|
||||
LOC_LOGD("Exit DSStateMachine :: onRsrcEvent. event = %d\n", (int)event);
|
||||
}
|
||||
|
||||
void DSStateMachine :: informStatus(AgpsRsrcStatus status, int ID) const
|
||||
{
|
||||
LOC_LOGD("DSStateMachine :: informStatus. Status=%d\n",(int)status);
|
||||
switch(status) {
|
||||
case RSRC_UNSUBSCRIBE:
|
||||
mLocAdapter->atlCloseStatus(ID, 1);
|
||||
break;
|
||||
case RSRC_RELEASED:
|
||||
mLocAdapter->closeDataCall();
|
||||
break;
|
||||
case RSRC_DENIED:
|
||||
((DSStateMachine *)this)->mRetries = 0;
|
||||
mLocAdapter->requestATL(ID, AGPS_TYPE_SUPL);
|
||||
break;
|
||||
case RSRC_GRANTED:
|
||||
mLocAdapter->atlOpenStatus(ID, 1,
|
||||
NULL,
|
||||
AGPS_APN_BEARER_INVALID,
|
||||
AGPS_TYPE_INVALID);
|
||||
break;
|
||||
default:
|
||||
LOC_LOGW("DSStateMachine :: informStatus - unknown status");
|
||||
}
|
||||
return;
|
||||
}
|
431
gps/loc_api/libloc_api_50001/loc_eng_agps.h
Normal file
431
gps/loc_api/libloc_api_50001/loc_eng_agps.h
Normal file
@ -0,0 +1,431 @@
|
||||
/* 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_AGPS_H__
|
||||
#define __LOC_ENG_AGPS_H__
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <hardware/gps.h>
|
||||
#include <gps_extended.h>
|
||||
#include <loc_core_log.h>
|
||||
#include <linked_list.h>
|
||||
#include <loc_timer.h>
|
||||
#include <LocEngAdapter.h>
|
||||
|
||||
// forward declaration
|
||||
class AgpsStateMachine;
|
||||
class Subscriber;
|
||||
|
||||
// NIF resource events
|
||||
typedef enum {
|
||||
RSRC_SUBSCRIBE,
|
||||
RSRC_UNSUBSCRIBE,
|
||||
RSRC_GRANTED,
|
||||
RSRC_RELEASED,
|
||||
RSRC_DENIED,
|
||||
RSRC_STATUS_MAX
|
||||
} AgpsRsrcStatus;
|
||||
|
||||
typedef enum {
|
||||
servicerTypeNoCbParam,
|
||||
servicerTypeAgps,
|
||||
servicerTypeExt
|
||||
}servicerType;
|
||||
|
||||
//DS Callback struct
|
||||
typedef struct {
|
||||
LocEngAdapter *mAdapter;
|
||||
AGpsStatusValue action;
|
||||
}dsCbData;
|
||||
|
||||
// information bundle for subscribers
|
||||
struct Notification {
|
||||
// goes to every subscriber
|
||||
static const int BROADCAST_ALL;
|
||||
// goes to every ACTIVE subscriber
|
||||
static const int BROADCAST_ACTIVE;
|
||||
// goes to every INACTIVE subscriber
|
||||
static const int BROADCAST_INACTIVE;
|
||||
|
||||
// go to a specific subscriber
|
||||
const Subscriber* rcver;
|
||||
// broadcast
|
||||
const int groupID;
|
||||
// the new resource status event
|
||||
const AgpsRsrcStatus rsrcStatus;
|
||||
// should the subscriber be deleted after the notification
|
||||
const bool postNotifyDelete;
|
||||
|
||||
// convenient constructor
|
||||
inline Notification(const int broadcast,
|
||||
const AgpsRsrcStatus status,
|
||||
const bool deleteAfterwards) :
|
||||
rcver(NULL), groupID(broadcast), rsrcStatus(status),
|
||||
postNotifyDelete(deleteAfterwards) {}
|
||||
|
||||
// convenient constructor
|
||||
inline Notification(const Subscriber* subscriber,
|
||||
const AgpsRsrcStatus status,
|
||||
const bool deleteAfterwards) :
|
||||
rcver(subscriber), groupID(-1), rsrcStatus(status),
|
||||
postNotifyDelete(deleteAfterwards) {}
|
||||
|
||||
// convenient constructor
|
||||
inline Notification(const int broadcast) :
|
||||
rcver(NULL), groupID(broadcast), rsrcStatus(RSRC_STATUS_MAX),
|
||||
postNotifyDelete(false) {}
|
||||
|
||||
// convenient constructor
|
||||
inline Notification(const Subscriber* subscriber) :
|
||||
rcver(subscriber), groupID(-1), rsrcStatus(RSRC_STATUS_MAX),
|
||||
postNotifyDelete(false) {}
|
||||
};
|
||||
|
||||
class AgpsState {
|
||||
// allows AgpsStateMachine to access private data
|
||||
// no class members are public. We don't want
|
||||
// anyone but state machine to use state.
|
||||
friend class AgpsStateMachine;
|
||||
friend class DSStateMachine;
|
||||
// state transitions are done here.
|
||||
// Each state implements its own transitions (of course).
|
||||
inline virtual AgpsState* onRsrcEvent(AgpsRsrcStatus event, void* data) = 0;
|
||||
|
||||
protected:
|
||||
// handle back to state machine
|
||||
const AgpsStateMachine* mStateMachine;
|
||||
// each state has pointers to all 3 states
|
||||
// one of which is to itself.
|
||||
AgpsState* mReleasedState;
|
||||
AgpsState* mAcquiredState;
|
||||
AgpsState* mPendingState;
|
||||
AgpsState* mReleasingState;
|
||||
|
||||
inline AgpsState(const AgpsStateMachine *stateMachine) :
|
||||
mStateMachine(stateMachine),
|
||||
mReleasedState(NULL),
|
||||
mAcquiredState(NULL),
|
||||
mPendingState(NULL),
|
||||
mReleasingState(NULL) {}
|
||||
virtual ~AgpsState() {}
|
||||
|
||||
public:
|
||||
// for logging purpose
|
||||
inline virtual char* whoami() = 0;
|
||||
};
|
||||
|
||||
class Servicer {
|
||||
void (*callback)(void);
|
||||
public:
|
||||
static Servicer* getServicer(servicerType type, void *cb_func);
|
||||
virtual int requestRsrc(void *cb_data);
|
||||
Servicer() {}
|
||||
Servicer(void *cb_func)
|
||||
{ callback = (void(*)(void))(cb_func); }
|
||||
virtual ~Servicer(){}
|
||||
inline virtual char *whoami() {return (char*)"Servicer";}
|
||||
};
|
||||
|
||||
class ExtServicer : public Servicer {
|
||||
int (*callbackExt)(void *cb_data);
|
||||
public:
|
||||
int requestRsrc(void *cb_data);
|
||||
ExtServicer() {}
|
||||
ExtServicer(void *cb_func)
|
||||
{ callbackExt = (int(*)(void *))(cb_func); }
|
||||
virtual ~ExtServicer(){}
|
||||
inline virtual char *whoami() {return (char*)"ExtServicer";}
|
||||
};
|
||||
|
||||
class AGpsServicer : public Servicer {
|
||||
void (*callbackAGps)(AGpsStatus* status);
|
||||
public:
|
||||
int requestRsrc(void *cb_data);
|
||||
AGpsServicer() {}
|
||||
AGpsServicer(void *cb_func)
|
||||
{ callbackAGps = (void(*)(AGpsStatus *))(cb_func); }
|
||||
virtual ~AGpsServicer(){}
|
||||
inline virtual char *whoami() {return (char*)"AGpsServicer";}
|
||||
};
|
||||
|
||||
class AgpsStateMachine {
|
||||
protected:
|
||||
// a linked list of subscribers.
|
||||
void* mSubscribers;
|
||||
//handle to whoever provides the service
|
||||
Servicer *mServicer;
|
||||
// allows AgpsState to access private data
|
||||
// each state is really internal data to the
|
||||
// state machine, so it should be able to
|
||||
// access anything within the state machine.
|
||||
friend class AgpsState;
|
||||
// pointer to the current state.
|
||||
AgpsState* mStatePtr;
|
||||
private:
|
||||
// NIF type: AGNSS or INTERNET.
|
||||
const AGpsExtType mType;
|
||||
// apn to the NIF. Each state machine tracks
|
||||
// resource state of a particular NIF. For each
|
||||
// NIF, there is also an active APN.
|
||||
char* mAPN;
|
||||
// for convenience, we don't do strlen each time.
|
||||
unsigned int mAPNLen;
|
||||
// bear
|
||||
AGpsBearerType mBearer;
|
||||
// ipv4 address for routing
|
||||
bool mEnforceSingleSubscriber;
|
||||
|
||||
public:
|
||||
AgpsStateMachine(servicerType servType, void *cb_func,
|
||||
AGpsExtType type, bool enforceSingleSubscriber);
|
||||
virtual ~AgpsStateMachine();
|
||||
|
||||
// self explanatory methods below
|
||||
void setAPN(const char* apn, unsigned int len);
|
||||
inline const char* getAPN() const { return (const char*)mAPN; }
|
||||
inline void setBearer(AGpsBearerType bearer) { mBearer = bearer; }
|
||||
inline AGpsBearerType getBearer() const { return mBearer; }
|
||||
inline AGpsExtType getType() const { return (AGpsExtType)mType; }
|
||||
|
||||
// someone, a ATL client or BIT, is asking for NIF
|
||||
void subscribeRsrc(Subscriber *subscriber);
|
||||
|
||||
// someone, a ATL client or BIT, is done with NIF
|
||||
bool unsubscribeRsrc(Subscriber *subscriber);
|
||||
|
||||
// add a subscriber in the linked list, if not already there.
|
||||
void addSubscriber(Subscriber* subscriber) const;
|
||||
|
||||
virtual void onRsrcEvent(AgpsRsrcStatus event);
|
||||
|
||||
// put the data together and send the FW
|
||||
virtual int sendRsrcRequest(AGpsStatusValue action) const;
|
||||
|
||||
//if list is empty, linked_list_empty returns 1
|
||||
//else if list is not empty, returns 0
|
||||
//so hasSubscribers() returns 1 if list is not empty
|
||||
//and returns 0 if list is empty
|
||||
inline bool hasSubscribers() const
|
||||
{ return !linked_list_empty(mSubscribers); }
|
||||
|
||||
bool hasActiveSubscribers() const;
|
||||
|
||||
inline void dropAllSubscribers() const
|
||||
{ linked_list_flush(mSubscribers); }
|
||||
|
||||
// private. Only a state gets to call this.
|
||||
void notifySubscribers(Notification& notification) const;
|
||||
|
||||
};
|
||||
|
||||
class DSStateMachine : public AgpsStateMachine {
|
||||
static const unsigned char MAX_START_DATA_CALL_RETRIES;
|
||||
static const unsigned int DATA_CALL_RETRY_DELAY_MSEC;
|
||||
LocEngAdapter* mLocAdapter;
|
||||
unsigned char mRetries;
|
||||
public:
|
||||
DSStateMachine(servicerType type,
|
||||
void *cb_func,
|
||||
LocEngAdapter* adapterHandle);
|
||||
int sendRsrcRequest(AGpsStatusValue action) const;
|
||||
void onRsrcEvent(AgpsRsrcStatus event);
|
||||
void retryCallback();
|
||||
void informStatus(AgpsRsrcStatus status, int ID) const;
|
||||
inline void incRetries() {mRetries++;}
|
||||
inline virtual char *whoami() {return (char*)"DSStateMachine";}
|
||||
};
|
||||
|
||||
// each subscriber is a AGPS client. In the case of ATL, there could be
|
||||
// multiple clients from modem. In the case of BIT, there is only one
|
||||
// cilent from BIT daemon.
|
||||
struct Subscriber {
|
||||
const uint32_t ID;
|
||||
const AgpsStateMachine* mStateMachine;
|
||||
inline Subscriber(const int id,
|
||||
const AgpsStateMachine* stateMachine) :
|
||||
ID(id), mStateMachine(stateMachine) {}
|
||||
inline virtual ~Subscriber() {}
|
||||
|
||||
virtual void setIPAddresses(uint32_t &v4, char* v6) = 0;
|
||||
virtual void setIPAddresses(struct sockaddr_storage& addr) = 0;
|
||||
inline virtual void setWifiInfo(char* ssid, char* password)
|
||||
{ ssid[0] = 0; password[0] = 0; }
|
||||
|
||||
inline virtual bool equals(const Subscriber *s) const
|
||||
{ return ID == s->ID; }
|
||||
|
||||
// notifies a subscriber a new NIF resource status, usually
|
||||
// either GRANTE, DENIED, or RELEASED
|
||||
virtual bool notifyRsrcStatus(Notification ¬ification) = 0;
|
||||
|
||||
virtual bool waitForCloseComplete() { return false; }
|
||||
virtual void setInactive() {}
|
||||
virtual bool isInactive() { return false; }
|
||||
|
||||
virtual Subscriber* clone() = 0;
|
||||
// checks if this notification is for me, i.e.
|
||||
// either has my id, or has a broadcast id.
|
||||
bool forMe(Notification ¬ification);
|
||||
};
|
||||
|
||||
// BITSubscriber, created with requests from BIT daemon
|
||||
struct BITSubscriber : public Subscriber {
|
||||
char mIPv6Addr[16];
|
||||
|
||||
inline BITSubscriber(const AgpsStateMachine* stateMachine,
|
||||
unsigned int ipv4, char* ipv6) :
|
||||
Subscriber(ipv4, stateMachine)
|
||||
{
|
||||
if (NULL == ipv6) {
|
||||
mIPv6Addr[0] = 0;
|
||||
} else {
|
||||
memcpy(mIPv6Addr, ipv6, sizeof(mIPv6Addr));
|
||||
}
|
||||
}
|
||||
|
||||
virtual bool notifyRsrcStatus(Notification ¬ification);
|
||||
|
||||
inline virtual void setIPAddresses(uint32_t &v4, char* v6)
|
||||
{ v4 = ID; memcpy(v6, mIPv6Addr, sizeof(mIPv6Addr)); }
|
||||
|
||||
inline virtual void setIPAddresses(struct sockaddr_storage& addr)
|
||||
{ addr.ss_family = AF_INET6;/*todo: convert mIPv6Addr into addr */ }
|
||||
|
||||
virtual Subscriber* clone()
|
||||
{
|
||||
return new BITSubscriber(mStateMachine, ID, mIPv6Addr);
|
||||
}
|
||||
|
||||
virtual bool equals(const Subscriber *s) const;
|
||||
inline virtual ~BITSubscriber(){}
|
||||
};
|
||||
|
||||
// ATLSubscriber, created with requests from ATL
|
||||
struct ATLSubscriber : public Subscriber {
|
||||
const LocEngAdapter* mLocAdapter;
|
||||
const bool mBackwardCompatibleMode;
|
||||
inline ATLSubscriber(const int id,
|
||||
const AgpsStateMachine* stateMachine,
|
||||
const LocEngAdapter* adapter,
|
||||
const bool compatibleMode) :
|
||||
Subscriber(id, stateMachine), mLocAdapter(adapter),
|
||||
mBackwardCompatibleMode(compatibleMode){}
|
||||
virtual bool notifyRsrcStatus(Notification ¬ification);
|
||||
|
||||
inline virtual void setIPAddresses(uint32_t &v4, char* v6)
|
||||
{ v4 = INADDR_NONE; v6[0] = 0; }
|
||||
|
||||
inline virtual void setIPAddresses(struct sockaddr_storage& addr)
|
||||
{ addr.ss_family = AF_INET6; }
|
||||
|
||||
inline virtual Subscriber* clone()
|
||||
{
|
||||
return new ATLSubscriber(ID, mStateMachine, mLocAdapter,
|
||||
mBackwardCompatibleMode);
|
||||
}
|
||||
inline virtual ~ATLSubscriber(){}
|
||||
};
|
||||
|
||||
// WIFISubscriber, created with requests from MSAPM or QuIPC
|
||||
struct WIFISubscriber : public Subscriber {
|
||||
char * mSSID;
|
||||
char * mPassword;
|
||||
loc_if_req_sender_id_e_type senderId;
|
||||
bool mIsInactive;
|
||||
inline WIFISubscriber(const AgpsStateMachine* stateMachine,
|
||||
char * ssid, char * password, loc_if_req_sender_id_e_type sender_id) :
|
||||
Subscriber(sender_id, stateMachine),
|
||||
mSSID(NULL == ssid ? NULL : new char[SSID_BUF_SIZE]),
|
||||
mPassword(NULL == password ? NULL : new char[SSID_BUF_SIZE]),
|
||||
senderId(sender_id)
|
||||
{
|
||||
if (NULL != mSSID)
|
||||
strlcpy(mSSID, ssid, SSID_BUF_SIZE);
|
||||
if (NULL != mPassword)
|
||||
strlcpy(mPassword, password, SSID_BUF_SIZE);
|
||||
mIsInactive = false;
|
||||
}
|
||||
|
||||
virtual bool notifyRsrcStatus(Notification ¬ification);
|
||||
|
||||
inline virtual void setIPAddresses(uint32_t &v4, char* v6) {}
|
||||
|
||||
inline virtual void setIPAddresses(struct sockaddr_storage& addr)
|
||||
{ addr.ss_family = AF_INET6; }
|
||||
|
||||
inline virtual void setWifiInfo(char* ssid, char* password)
|
||||
{
|
||||
if (NULL != mSSID)
|
||||
strlcpy(ssid, mSSID, SSID_BUF_SIZE);
|
||||
else
|
||||
ssid[0] = '\0';
|
||||
if (NULL != mPassword)
|
||||
strlcpy(password, mPassword, SSID_BUF_SIZE);
|
||||
else
|
||||
password[0] = '\0';
|
||||
}
|
||||
|
||||
inline virtual bool waitForCloseComplete() { return true; }
|
||||
|
||||
inline virtual void setInactive() { mIsInactive = true; }
|
||||
inline virtual bool isInactive() { return mIsInactive; }
|
||||
|
||||
virtual Subscriber* clone()
|
||||
{
|
||||
return new WIFISubscriber(mStateMachine, mSSID, mPassword, senderId);
|
||||
}
|
||||
inline virtual ~WIFISubscriber(){}
|
||||
};
|
||||
|
||||
struct DSSubscriber : public Subscriber {
|
||||
bool mIsInactive;
|
||||
inline DSSubscriber(const AgpsStateMachine *stateMachine,
|
||||
const int id) :
|
||||
Subscriber(id, stateMachine)
|
||||
{
|
||||
mIsInactive = false;
|
||||
}
|
||||
inline virtual void setIPAddresses(uint32_t &v4, char* v6) {}
|
||||
inline virtual void setIPAddresses(struct sockaddr_storage& addr)
|
||||
{ addr.ss_family = AF_INET6; }
|
||||
virtual Subscriber* clone()
|
||||
{return new DSSubscriber(mStateMachine, ID);}
|
||||
virtual bool notifyRsrcStatus(Notification ¬ification);
|
||||
inline virtual bool waitForCloseComplete() { return true; }
|
||||
virtual void setInactive();
|
||||
inline virtual bool isInactive()
|
||||
{ return mIsInactive; }
|
||||
inline virtual ~DSSubscriber(){}
|
||||
inline virtual char *whoami() {return (char*)"DSSubscriber";}
|
||||
};
|
||||
|
||||
#endif //__LOC_ENG_AGPS_H__
|
270
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn.cpp
Normal file
270
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn.cpp
Normal file
@ -0,0 +1,270 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <linux/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <linux/types.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <grp.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "log_util.h"
|
||||
#include "platform_lib_includes.h"
|
||||
#include "loc_eng_dmn_conn_glue_msg.h"
|
||||
#include "loc_eng_dmn_conn_handler.h"
|
||||
#include "loc_eng_dmn_conn.h"
|
||||
#include "loc_eng_msg.h"
|
||||
|
||||
static int loc_api_server_msgqid;
|
||||
static int loc_api_resp_msgqid;
|
||||
static int quipc_msgqid;
|
||||
static int msapm_msgqid;
|
||||
static int msapu_msgqid;
|
||||
|
||||
static const char * global_loc_api_q_path = GPSONE_LOC_API_Q_PATH;
|
||||
static const char * global_loc_api_resp_q_path = GPSONE_LOC_API_RESP_Q_PATH;
|
||||
static const char * global_quipc_ctrl_q_path = QUIPC_CTRL_Q_PATH;
|
||||
static const char * global_msapm_ctrl_q_path = MSAPM_CTRL_Q_PATH;
|
||||
static const char * global_msapu_ctrl_q_path = MSAPU_CTRL_Q_PATH;
|
||||
|
||||
static int loc_api_server_proc_init(void *context)
|
||||
{
|
||||
loc_api_server_msgqid = loc_eng_dmn_conn_glue_msgget(global_loc_api_q_path, O_RDWR);
|
||||
//change mode/group for the global_loc_api_q_path pipe
|
||||
int result = chmod (global_loc_api_q_path, 0660);
|
||||
if (result != 0)
|
||||
{
|
||||
LOC_LOGE("failed to change mode for %s, error = %s\n", global_loc_api_q_path, strerror(errno));
|
||||
}
|
||||
|
||||
struct group * gps_group = getgrnam("gps");
|
||||
if (gps_group != NULL)
|
||||
{
|
||||
result = chown (global_loc_api_q_path, -1, gps_group->gr_gid);
|
||||
if (result != 0)
|
||||
{
|
||||
LOC_LOGE("chown for pipe failed, pipe %s, gid = %d, result = %d, error = %s\n",
|
||||
global_loc_api_q_path, gps_group->gr_gid, result, strerror(errno));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOC_LOGE("getgrnam for gps failed, error code = %d\n", errno);
|
||||
}
|
||||
|
||||
loc_api_resp_msgqid = loc_eng_dmn_conn_glue_msgget(global_loc_api_resp_q_path, O_RDWR);
|
||||
|
||||
//change mode/group for the global_loc_api_resp_q_path pipe
|
||||
result = chmod (global_loc_api_resp_q_path, 0660);
|
||||
if (result != 0)
|
||||
{
|
||||
LOC_LOGE("failed to change mode for %s, error = %s\n", global_loc_api_resp_q_path, strerror(errno));
|
||||
}
|
||||
|
||||
if (gps_group != NULL)
|
||||
{
|
||||
result = chown (global_loc_api_resp_q_path, -1, gps_group->gr_gid);
|
||||
if (result != 0)
|
||||
{
|
||||
LOC_LOGE("chown for pipe failed, pipe %s, gid = %d, result = %d, error = %s\n",
|
||||
global_loc_api_resp_q_path,
|
||||
gps_group->gr_gid, result, strerror(errno));
|
||||
}
|
||||
}
|
||||
|
||||
quipc_msgqid = loc_eng_dmn_conn_glue_msgget(global_quipc_ctrl_q_path, O_RDWR);
|
||||
msapm_msgqid = loc_eng_dmn_conn_glue_msgget(global_msapm_ctrl_q_path , O_RDWR);
|
||||
msapu_msgqid = loc_eng_dmn_conn_glue_msgget(global_msapu_ctrl_q_path , O_RDWR);
|
||||
|
||||
LOC_LOGD("%s:%d] loc_api_server_msgqid = %d\n", __func__, __LINE__, loc_api_server_msgqid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int loc_api_server_proc_pre(void *context)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int loc_api_server_proc(void *context)
|
||||
{
|
||||
int length, sz;
|
||||
int result = 0;
|
||||
static int cnt = 0;
|
||||
struct ctrl_msgbuf * p_cmsgbuf;
|
||||
struct ctrl_msgbuf cmsg_resp;
|
||||
|
||||
sz = sizeof(struct ctrl_msgbuf) + 256;
|
||||
p_cmsgbuf = (struct ctrl_msgbuf *) malloc(sz);
|
||||
|
||||
if (!p_cmsgbuf) {
|
||||
LOC_LOGE("%s:%d] Out of memory\n", __func__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
cnt ++;
|
||||
LOC_LOGD("%s:%d] %d listening on %s...\n", __func__, __LINE__, cnt, (char *) context);
|
||||
length = loc_eng_dmn_conn_glue_msgrcv(loc_api_server_msgqid, p_cmsgbuf, sz);
|
||||
if (length <= 0) {
|
||||
free(p_cmsgbuf);
|
||||
LOC_LOGE("%s:%d] fail receiving msg from gpsone_daemon, retry later\n", __func__, __LINE__);
|
||||
usleep(1000);
|
||||
return -1;
|
||||
}
|
||||
|
||||
LOC_LOGD("%s:%d] received ctrl_type = %d\n", __func__, __LINE__, p_cmsgbuf->ctrl_type);
|
||||
switch(p_cmsgbuf->ctrl_type) {
|
||||
case GPSONE_LOC_API_IF_REQUEST:
|
||||
result = loc_eng_dmn_conn_loc_api_server_if_request_handler(p_cmsgbuf, length);
|
||||
break;
|
||||
|
||||
case GPSONE_LOC_API_IF_RELEASE:
|
||||
result = loc_eng_dmn_conn_loc_api_server_if_release_handler(p_cmsgbuf, length);
|
||||
break;
|
||||
|
||||
case GPSONE_UNBLOCK:
|
||||
LOC_LOGD("%s:%d] GPSONE_UNBLOCK\n", __func__, __LINE__);
|
||||
break;
|
||||
|
||||
default:
|
||||
LOC_LOGE("%s:%d] unsupported ctrl_type = %d\n",
|
||||
__func__, __LINE__, p_cmsgbuf->ctrl_type);
|
||||
break;
|
||||
}
|
||||
|
||||
free(p_cmsgbuf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int loc_api_server_proc_post(void *context)
|
||||
{
|
||||
LOC_LOGD("%s:%d]\n", __func__, __LINE__);
|
||||
loc_eng_dmn_conn_glue_msgremove( global_loc_api_q_path, loc_api_server_msgqid);
|
||||
loc_eng_dmn_conn_glue_msgremove( global_loc_api_resp_q_path, loc_api_resp_msgqid);
|
||||
loc_eng_dmn_conn_glue_msgremove( global_quipc_ctrl_q_path, quipc_msgqid);
|
||||
loc_eng_dmn_conn_glue_msgremove( global_msapm_ctrl_q_path, msapm_msgqid);
|
||||
loc_eng_dmn_conn_glue_msgremove( global_msapu_ctrl_q_path, msapu_msgqid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int loc_eng_dmn_conn_unblock_proc(void)
|
||||
{
|
||||
struct ctrl_msgbuf cmsgbuf;
|
||||
cmsgbuf.ctrl_type = GPSONE_UNBLOCK;
|
||||
LOC_LOGD("%s:%d]\n", __func__, __LINE__);
|
||||
loc_eng_dmn_conn_glue_msgsnd(loc_api_server_msgqid, & cmsgbuf, sizeof(cmsgbuf));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct loc_eng_dmn_conn_thelper thelper;
|
||||
|
||||
int loc_eng_dmn_conn_loc_api_server_launch(thelper_create_thread create_thread_cb,
|
||||
const char * loc_api_q_path, const char * resp_q_path, void *agps_handle)
|
||||
{
|
||||
int result;
|
||||
|
||||
loc_api_handle = agps_handle;
|
||||
|
||||
if (loc_api_q_path) global_loc_api_q_path = loc_api_q_path;
|
||||
if (resp_q_path) global_loc_api_resp_q_path = resp_q_path;
|
||||
|
||||
result = loc_eng_dmn_conn_launch_thelper( &thelper,
|
||||
loc_api_server_proc_init,
|
||||
loc_api_server_proc_pre,
|
||||
loc_api_server_proc,
|
||||
loc_api_server_proc_post,
|
||||
create_thread_cb,
|
||||
(char *) global_loc_api_q_path);
|
||||
if (result != 0) {
|
||||
LOC_LOGE("%s:%d]\n", __func__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int loc_eng_dmn_conn_loc_api_server_unblock(void)
|
||||
{
|
||||
loc_eng_dmn_conn_unblock_thelper(&thelper);
|
||||
loc_eng_dmn_conn_unblock_proc();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int loc_eng_dmn_conn_loc_api_server_join(void)
|
||||
{
|
||||
loc_eng_dmn_conn_join_thelper(&thelper);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int loc_eng_dmn_conn_loc_api_server_data_conn(int sender_id, int status) {
|
||||
struct ctrl_msgbuf cmsgbuf;
|
||||
LOC_LOGD("%s:%d] quipc_msgqid = %d\n", __func__, __LINE__, quipc_msgqid);
|
||||
cmsgbuf.ctrl_type = GPSONE_LOC_API_RESPONSE;
|
||||
cmsgbuf.cmsg.cmsg_response.result = status;
|
||||
switch (sender_id) {
|
||||
case LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC: {
|
||||
LOC_LOGD("%s:%d] sender_id = LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC", __func__, __LINE__);
|
||||
if (loc_eng_dmn_conn_glue_msgsnd(quipc_msgqid, & cmsgbuf, sizeof(struct ctrl_msgbuf)) < 0) {
|
||||
LOC_LOGD("%s:%d] error! conn_glue_msgsnd failed\n", __func__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM: {
|
||||
LOC_LOGD("%s:%d] sender_id = LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM", __func__, __LINE__);
|
||||
if (loc_eng_dmn_conn_glue_msgsnd(msapm_msgqid, & cmsgbuf, sizeof(struct ctrl_msgbuf)) < 0) {
|
||||
LOC_LOGD("%s:%d] error! conn_glue_msgsnd failed\n", __func__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU: {
|
||||
LOC_LOGD("%s:%d] sender_id = LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU", __func__, __LINE__);
|
||||
if (loc_eng_dmn_conn_glue_msgsnd(msapu_msgqid, & cmsgbuf, sizeof(struct ctrl_msgbuf)) < 0) {
|
||||
LOC_LOGD("%s:%d] error! conn_glue_msgsnd failed\n", __func__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON: {
|
||||
LOC_LOGD("%s:%d] sender_id = LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON", __func__, __LINE__);
|
||||
if (loc_eng_dmn_conn_glue_msgsnd(loc_api_resp_msgqid, & cmsgbuf, sizeof(struct ctrl_msgbuf)) < 0) {
|
||||
LOC_LOGD("%s:%d] error! conn_glue_msgsnd failed\n", __func__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
LOC_LOGD("%s:%d] invalid sender ID!", __func__, __LINE__);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
59
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn.h
Normal file
59
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn.h
Normal file
@ -0,0 +1,59 @@
|
||||
/* Copyright (c) 2011-2012,2014 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_DATA_SERVER_H
|
||||
#define LOC_ENG_DATA_SERVER_H
|
||||
|
||||
#include "loc_eng_dmn_conn_thread_helper.h"
|
||||
|
||||
#ifdef _ANDROID_
|
||||
|
||||
#define GPSONE_LOC_API_Q_PATH "/data/misc/location/gpsone_d/gpsone_loc_api_q"
|
||||
#define GPSONE_LOC_API_RESP_Q_PATH "/data/misc/location/gpsone_d/gpsone_loc_api_resp_q"
|
||||
#define QUIPC_CTRL_Q_PATH "/data/misc/location/gpsone_d/quipc_ctrl_q"
|
||||
#define MSAPM_CTRL_Q_PATH "/data/misc/location/gpsone_d/msapm_ctrl_q"
|
||||
#define MSAPU_CTRL_Q_PATH "/data/misc/location/gpsone_d/msapu_ctrl_q"
|
||||
|
||||
#else
|
||||
|
||||
#define GPSONE_LOC_API_Q_PATH "/tmp/gpsone_loc_api_q"
|
||||
#define GPSONE_LOC_API_RESP_Q_PATH "/tmp/gpsone_loc_api_resp_q"
|
||||
#define QUIPC_CTRL_Q_PATH "/tmp/quipc_ctrl_q"
|
||||
#define MSAPM_CTRL_Q_PATH "/tmp/msapm_ctrl_q"
|
||||
#define MSAPU_CTRL_Q_PATH "/tmp/msapu_ctrl_q"
|
||||
|
||||
#endif
|
||||
|
||||
int loc_eng_dmn_conn_loc_api_server_launch(thelper_create_thread create_thread_cb,
|
||||
const char * loc_api_q_path, const char * ctrl_q_path, void *agps_handle);
|
||||
int loc_eng_dmn_conn_loc_api_server_unblock(void);
|
||||
int loc_eng_dmn_conn_loc_api_server_join(void);
|
||||
int loc_eng_dmn_conn_loc_api_server_data_conn(int, int);
|
||||
|
||||
#endif /* LOC_ENG_DATA_SERVER_H */
|
||||
|
223
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_glue_msg.c
Normal file
223
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_glue_msg.c
Normal file
@ -0,0 +1,223 @@
|
||||
/* 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 <linux/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#include "log_util.h"
|
||||
#include "platform_lib_includes.h"
|
||||
#include "loc_eng_dmn_conn_glue_msg.h"
|
||||
#include "loc_eng_dmn_conn_handler.h"
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_dmn_conn_glue_msgget
|
||||
|
||||
DESCRIPTION
|
||||
This function get a message queue
|
||||
|
||||
q_path - name path of the message queue
|
||||
mode -
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
message queue id
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_dmn_conn_glue_msgget(const char * q_path, int mode)
|
||||
{
|
||||
int msgqid;
|
||||
msgqid = loc_eng_dmn_conn_glue_pipeget(q_path, mode);
|
||||
return msgqid;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_dmn_conn_glue_msgremove
|
||||
|
||||
DESCRIPTION
|
||||
remove a message queue
|
||||
|
||||
q_path - name path of the message queue
|
||||
msgqid - message queue id
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
0: success or negative value for failure
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_dmn_conn_glue_msgremove(const char * q_path, int msgqid)
|
||||
{
|
||||
int result;
|
||||
result = loc_eng_dmn_conn_glue_piperemove(q_path, msgqid);
|
||||
return result;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_dmn_conn_glue_msgsnd
|
||||
|
||||
DESCRIPTION
|
||||
Send a message
|
||||
|
||||
msgqid - message queue id
|
||||
msgp - pointer to the message to be sent
|
||||
msgsz - size of the message
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
number of bytes sent out or negative value for failure
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_dmn_conn_glue_msgsnd(int msgqid, const void * msgp, size_t msgsz)
|
||||
{
|
||||
int result;
|
||||
struct ctrl_msgbuf *pmsg = (struct ctrl_msgbuf *) msgp;
|
||||
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;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_dmn_conn_glue_msgrcv
|
||||
|
||||
DESCRIPTION
|
||||
receive a message
|
||||
|
||||
msgqid - message queue id
|
||||
msgp - pointer to the buffer to hold the message
|
||||
msgsz - size of the buffer
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
number of bytes received or negative value for failure
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_dmn_conn_glue_msgrcv(int msgqid, void *msgp, size_t msgbufsz)
|
||||
{
|
||||
int result;
|
||||
struct ctrl_msgbuf *pmsg = (struct ctrl_msgbuf *) msgp;
|
||||
|
||||
result = loc_eng_dmn_conn_glue_piperead(msgqid, &(pmsg->msgsz), sizeof(pmsg->msgsz));
|
||||
if (result != sizeof(pmsg->msgsz)) {
|
||||
LOC_LOGE("%s:%d] pipe broken %d\n", __func__, __LINE__, result);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (msgbufsz < pmsg->msgsz) {
|
||||
LOC_LOGE("%s:%d] msgbuf is too small %d < %d\n", __func__, __LINE__, (int) msgbufsz, (int) pmsg->msgsz);
|
||||
return -1;
|
||||
}
|
||||
|
||||
result = loc_eng_dmn_conn_glue_piperead(msgqid, (uint8_t *) msgp + sizeof(pmsg->msgsz), pmsg->msgsz - sizeof(pmsg->msgsz));
|
||||
if (result != (int) (pmsg->msgsz - sizeof(pmsg->msgsz))) {
|
||||
LOC_LOGE("%s:%d] pipe broken %d, msgsz = %d\n", __func__, __LINE__, result, (int) pmsg->msgsz);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return pmsg->msgsz;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_dmn_conn_glue_msgunblock
|
||||
|
||||
DESCRIPTION
|
||||
unblock a message queue
|
||||
|
||||
msgqid - message queue id
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
0: success
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_dmn_conn_glue_msgunblock(int msgqid)
|
||||
{
|
||||
return loc_eng_dmn_conn_glue_pipeunblock(msgqid);
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_dmn_conn_glue_msgflush
|
||||
|
||||
DESCRIPTION
|
||||
flush out the message in a queue
|
||||
|
||||
msgqid - message queue id
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
number of bytes that are flushed out.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_dmn_conn_glue_msgflush(int msgqid)
|
||||
{
|
||||
int length;
|
||||
char buf[128];
|
||||
|
||||
do {
|
||||
length = loc_eng_dmn_conn_glue_piperead(msgqid, buf, 128);
|
||||
LOC_LOGD("%s:%d] %s\n", __func__, __LINE__, buf);
|
||||
} while(length);
|
||||
return length;
|
||||
}
|
||||
|
51
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_glue_msg.h
Normal file
51
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_glue_msg.h
Normal file
@ -0,0 +1,51 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
#ifndef LOC_ENG_DMN_CONN_GLUE_MSG_H
|
||||
#define LOC_ENG_DMN_CONN_GLUE_MSG_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#include <linux/types.h>
|
||||
#include "loc_eng_dmn_conn_glue_pipe.h"
|
||||
|
||||
int loc_eng_dmn_conn_glue_msgget(const char * q_path, int mode);
|
||||
int loc_eng_dmn_conn_glue_msgremove(const char * q_path, int msgqid);
|
||||
int loc_eng_dmn_conn_glue_msgsnd(int msgqid, const void * msgp, size_t msgsz);
|
||||
int loc_eng_dmn_conn_glue_msgrcv(int msgqid, void *msgp, size_t msgsz);
|
||||
int loc_eng_dmn_conn_glue_msgflush(int msgqid);
|
||||
int loc_eng_dmn_conn_glue_msgunblock(int msgqid);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* LOC_ENG_DMN_CONN_GLUE_MSG_H */
|
214
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_glue_pipe.c
Normal file
214
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_glue_pipe.c
Normal file
@ -0,0 +1,214 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
// #include <linux/stat.h>
|
||||
#include <fcntl.h>
|
||||
// #include <linux/types.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "loc_eng_dmn_conn_glue_pipe.h"
|
||||
#include "log_util.h"
|
||||
#include "platform_lib_includes.h"
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_dmn_conn_glue_pipeget
|
||||
|
||||
DESCRIPTION
|
||||
create a named pipe.
|
||||
|
||||
pipe_name - pipe name path
|
||||
mode - mode
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
0: success or negative value for failure
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_dmn_conn_glue_pipeget(const char * pipe_name, int mode)
|
||||
{
|
||||
int fd;
|
||||
int result;
|
||||
|
||||
LOC_LOGD("%s, mode = %d\n", pipe_name, mode);
|
||||
result = mkfifo(pipe_name, 0660);
|
||||
|
||||
if ((result == -1) && (errno != EEXIST)) {
|
||||
LOC_LOGE("failed: %s\n", strerror(errno));
|
||||
return result;
|
||||
}
|
||||
|
||||
// The mode in mkfifo is not honoured and does not provide the
|
||||
// group permissions. Doing chmod to add group permissions.
|
||||
result = chmod (pipe_name, 0660);
|
||||
if (result != 0){
|
||||
LOC_LOGE ("%s failed to change mode for %s, error = %s\n", __func__,
|
||||
pipe_name, strerror(errno));
|
||||
}
|
||||
|
||||
fd = open(pipe_name, mode);
|
||||
if (fd <= 0)
|
||||
{
|
||||
LOC_LOGE("failed: %s\n", strerror(errno));
|
||||
}
|
||||
LOC_LOGD("fd = %d, %s\n", fd, pipe_name);
|
||||
return fd;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_dmn_conn_glue_piperemove
|
||||
|
||||
DESCRIPTION
|
||||
remove a pipe
|
||||
|
||||
pipe_name - pipe name path
|
||||
fd - fd for the pipe
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
0: success
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_dmn_conn_glue_piperemove(const char * pipe_name, int fd)
|
||||
{
|
||||
close(fd);
|
||||
if (pipe_name) unlink(pipe_name);
|
||||
LOC_LOGD("fd = %d, %s\n", fd, pipe_name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_dmn_conn_glue_pipewrite
|
||||
|
||||
DESCRIPTION
|
||||
write to a pipe
|
||||
|
||||
fd - fd of a pipe
|
||||
buf - buffer for the data to write
|
||||
sz - size of the data in buffer
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
number of bytes written or negative value for failure
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_dmn_conn_glue_pipewrite(int fd, const void * buf, size_t sz)
|
||||
{
|
||||
int result;
|
||||
|
||||
result = write(fd, buf, sz);
|
||||
|
||||
/* @todo check for non EINTR & EAGAIN, shall not do select again, select_tut Law 7) */
|
||||
|
||||
/* LOC_LOGD("fd = %d, buf = 0x%lx, size = %d, result = %d\n", fd, (long) buf, (int) sz, (int) result); */
|
||||
return result;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_dmn_conn_glue_piperead
|
||||
|
||||
DESCRIPTION
|
||||
read from a pipe
|
||||
|
||||
fd - fd for the pipe
|
||||
buf - buffer to hold the data read from pipe
|
||||
sz - size of the buffer
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
number of bytes read from pipe or negative value for failure
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_dmn_conn_glue_piperead(int fd, void * buf, size_t sz)
|
||||
{
|
||||
int len;
|
||||
|
||||
len = read(fd, buf, sz);
|
||||
|
||||
/* @todo check for non EINTR & EAGAIN, shall not do select again, select_tut Law 7) */
|
||||
|
||||
/* LOC_LOGD("fd = %d, buf = 0x%lx, size = %d, len = %d\n", fd, (long) buf, (int) sz, len); */
|
||||
return len;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_dmn_conn_glue_pipeunblock
|
||||
|
||||
DESCRIPTION
|
||||
unblock a pipe
|
||||
|
||||
fd - fd for the pipe
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
0 for success or negative value for failure
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_dmn_conn_glue_pipeunblock(int fd)
|
||||
{
|
||||
int result;
|
||||
struct flock flock_v;
|
||||
LOC_LOGD("\n");
|
||||
// result = fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NDELAY);
|
||||
flock_v.l_type = F_UNLCK;
|
||||
flock_v.l_len = 32;
|
||||
result = fcntl(fd, F_SETLK, &flock_v);
|
||||
if (result < 0) {
|
||||
LOC_LOGE("fcntl failure, %s\n", strerror(errno));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
50
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_glue_pipe.h
Normal file
50
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_glue_pipe.h
Normal file
@ -0,0 +1,50 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
#ifndef LOC_ENG_DMN_CONN_GLUE_PIPE_H
|
||||
#define LOC_ENG_DMN_CONN_GLUE_PIPE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
int loc_eng_dmn_conn_glue_pipeget(const char * pipe_name, int mode);
|
||||
int loc_eng_dmn_conn_glue_piperemove(const char * pipe_name, int fd);
|
||||
int loc_eng_dmn_conn_glue_pipewrite(int fd, const void * buf, size_t sz);
|
||||
int loc_eng_dmn_conn_glue_piperead(int fd, void * buf, size_t sz);
|
||||
|
||||
int loc_eng_dmn_conn_glue_pipeflush(int fd);
|
||||
int loc_eng_dmn_conn_glue_pipeunblock(int fd);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* LOC_ENG_DMN_CONN_GLUE_PIPE_H */
|
237
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_handler.cpp
Normal file
237
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_handler.cpp
Normal file
@ -0,0 +1,237 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "log_util.h"
|
||||
#include "platform_lib_includes.h"
|
||||
#include "loc_eng_msg.h"
|
||||
#include "loc_eng_dmn_conn.h"
|
||||
#include "loc_eng_dmn_conn_handler.h"
|
||||
|
||||
void* loc_api_handle = NULL;
|
||||
|
||||
int loc_eng_dmn_conn_loc_api_server_if_request_handler(struct ctrl_msgbuf *pmsg, int len)
|
||||
{
|
||||
LOC_LOGD("%s:%d]\n", __func__, __LINE__);
|
||||
#ifndef DEBUG_DMN_LOC_API
|
||||
if (NULL == loc_api_handle) {
|
||||
LOC_LOGE("%s:%d] NO agps data handle\n", __func__, __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (NULL != loc_api_handle) {
|
||||
AGpsExtType type;
|
||||
switch (pmsg->cmsg.cmsg_if_request.type) {
|
||||
case IF_REQUEST_TYPE_SUPL:
|
||||
{
|
||||
LOC_LOGD("IF_REQUEST_TYPE_SUPL");
|
||||
type = AGPS_TYPE_SUPL;
|
||||
break;
|
||||
}
|
||||
case IF_REQUEST_TYPE_WIFI:
|
||||
{
|
||||
LOC_LOGD("IF_REQUEST_TYPE_WIFI");
|
||||
type = AGPS_TYPE_WIFI;
|
||||
break;
|
||||
}
|
||||
case IF_REQUEST_TYPE_ANY:
|
||||
{
|
||||
LOC_LOGD("IF_REQUEST_TYPE_ANY");
|
||||
type = AGPS_TYPE_ANY;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
LOC_LOGD("invalid IF_REQUEST_TYPE!");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
switch (pmsg->cmsg.cmsg_if_request.sender_id) {
|
||||
case IF_REQUEST_SENDER_ID_QUIPC:
|
||||
{
|
||||
LOC_LOGD("IF_REQUEST_SENDER_ID_QUIPC");
|
||||
LocEngReqRelWifi* msg =
|
||||
new LocEngReqRelWifi(loc_api_handle,
|
||||
type,
|
||||
LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC,
|
||||
(char*)pmsg->cmsg.cmsg_if_request.ssid,
|
||||
(char*)pmsg->cmsg.cmsg_if_request.password,
|
||||
true);
|
||||
msg->send();
|
||||
break;
|
||||
}
|
||||
case IF_REQUEST_SENDER_ID_MSAPM:
|
||||
{
|
||||
LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPM");
|
||||
LocEngReqRelWifi* msg =
|
||||
new LocEngReqRelWifi(loc_api_handle,
|
||||
type,
|
||||
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM,
|
||||
(char*)pmsg->cmsg.cmsg_if_request.ssid,
|
||||
(char*)pmsg->cmsg.cmsg_if_request.password,
|
||||
true);
|
||||
msg->send();
|
||||
break;
|
||||
}
|
||||
case IF_REQUEST_SENDER_ID_MSAPU:
|
||||
{
|
||||
LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPU");
|
||||
LocEngReqRelWifi* msg =
|
||||
new LocEngReqRelWifi(loc_api_handle,
|
||||
type,
|
||||
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU,
|
||||
(char*)pmsg->cmsg.cmsg_if_request.ssid,
|
||||
(char*)pmsg->cmsg.cmsg_if_request.password,
|
||||
true);
|
||||
msg->send();
|
||||
break;
|
||||
}
|
||||
case IF_REQUEST_SENDER_ID_GPSONE_DAEMON:
|
||||
{
|
||||
LOC_LOGD("IF_REQUEST_SENDER_ID_GPSONE_DAEMON");
|
||||
LocEngReqRelBIT* msg =
|
||||
new LocEngReqRelBIT(loc_api_handle,
|
||||
type,
|
||||
pmsg->cmsg.cmsg_if_request.ipv4_addr,
|
||||
(char*)pmsg->cmsg.cmsg_if_request.ipv6_addr,
|
||||
true);
|
||||
msg->send();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
LOC_LOGD("invalid IF_REQUEST_SENDER_ID!");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
loc_eng_dmn_conn_loc_api_server_data_conn(LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON, GPSONE_LOC_API_IF_REQUEST_SUCCESS);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int loc_eng_dmn_conn_loc_api_server_if_release_handler(struct ctrl_msgbuf *pmsg, int len)
|
||||
{
|
||||
LOC_LOGD("%s:%d]\n", __func__, __LINE__);
|
||||
#ifndef DEBUG_DMN_LOC_API
|
||||
AGpsExtType type;
|
||||
switch (pmsg->cmsg.cmsg_if_request.type) {
|
||||
case IF_REQUEST_TYPE_SUPL:
|
||||
{
|
||||
LOC_LOGD("IF_REQUEST_TYPE_SUPL");
|
||||
type = AGPS_TYPE_SUPL;
|
||||
break;
|
||||
}
|
||||
case IF_REQUEST_TYPE_WIFI:
|
||||
{
|
||||
LOC_LOGD("IF_REQUEST_TYPE_WIFI");
|
||||
type = AGPS_TYPE_WIFI;
|
||||
break;
|
||||
}
|
||||
case IF_REQUEST_TYPE_ANY:
|
||||
{
|
||||
LOC_LOGD("IF_REQUEST_TYPE_ANY");
|
||||
type = AGPS_TYPE_ANY;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
LOC_LOGD("invalid IF_REQUEST_TYPE!");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
switch (pmsg->cmsg.cmsg_if_request.sender_id) {
|
||||
case IF_REQUEST_SENDER_ID_QUIPC:
|
||||
{
|
||||
LOC_LOGD("IF_REQUEST_SENDER_ID_QUIPC");
|
||||
LocEngReqRelWifi* msg =
|
||||
new LocEngReqRelWifi(loc_api_handle,
|
||||
type,
|
||||
LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC,
|
||||
(char*)pmsg->cmsg.cmsg_if_request.ssid,
|
||||
(char*)pmsg->cmsg.cmsg_if_request.password,
|
||||
false);
|
||||
msg->send();
|
||||
break;
|
||||
}
|
||||
case IF_REQUEST_SENDER_ID_MSAPM:
|
||||
{
|
||||
LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPM");
|
||||
LocEngReqRelWifi* msg =
|
||||
new LocEngReqRelWifi(loc_api_handle,
|
||||
type,
|
||||
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM,
|
||||
(char*)pmsg->cmsg.cmsg_if_request.ssid,
|
||||
(char*)pmsg->cmsg.cmsg_if_request.password,
|
||||
false);
|
||||
msg->send();
|
||||
break;
|
||||
}
|
||||
case IF_REQUEST_SENDER_ID_MSAPU:
|
||||
{
|
||||
LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPU");
|
||||
LocEngReqRelWifi* msg =
|
||||
new LocEngReqRelWifi(loc_api_handle,
|
||||
type,
|
||||
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU,
|
||||
(char*)pmsg->cmsg.cmsg_if_request.ssid,
|
||||
(char*)pmsg->cmsg.cmsg_if_request.password,
|
||||
false);
|
||||
msg->send();
|
||||
break;
|
||||
}
|
||||
case IF_REQUEST_SENDER_ID_GPSONE_DAEMON:
|
||||
{
|
||||
LOC_LOGD("IF_REQUEST_SENDER_ID_GPSONE_DAEMON");
|
||||
LocEngReqRelBIT* msg =
|
||||
new LocEngReqRelBIT(loc_api_handle,
|
||||
type,
|
||||
pmsg->cmsg.cmsg_if_request.ipv4_addr,
|
||||
(char*)pmsg->cmsg.cmsg_if_request.ipv6_addr,
|
||||
false);
|
||||
msg->send();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
LOC_LOGD("invalid IF_REQUEST_SENDER_ID!");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
#else
|
||||
loc_eng_dmn_conn_loc_api_server_data_conn(LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON, GPSONE_LOC_API_IF_RELEASE_SUCCESS);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
106
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_handler.h
Normal file
106
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_handler.h
Normal file
@ -0,0 +1,106 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
#ifndef LOC_ENG_DATA_SERVER_HANDLER
|
||||
#define LOC_ENG_DATA_SERVER_HANDLER
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
//for SSID_BUF_SIZE
|
||||
#include <hardware/gps.h>
|
||||
|
||||
#ifndef SSID_BUF_SIZE
|
||||
#define SSID_BUF_SIZE (32+1)
|
||||
#endif
|
||||
|
||||
enum {
|
||||
/* 0x0 - 0xEF is reserved for daemon internal */
|
||||
GPSONE_LOC_API_IF_REQUEST = 0xF0,
|
||||
GPSONE_LOC_API_IF_RELEASE,
|
||||
GPSONE_LOC_API_RESPONSE,
|
||||
GPSONE_UNBLOCK,
|
||||
};
|
||||
|
||||
enum {
|
||||
GPSONE_LOC_API_IF_REQUEST_SUCCESS = 0xF0,
|
||||
GPSONE_LOC_API_IF_RELEASE_SUCCESS,
|
||||
GPSONE_LOC_API_IF_FAILURE,
|
||||
};
|
||||
|
||||
|
||||
struct ctrl_msg_response {
|
||||
int result;
|
||||
};
|
||||
|
||||
struct ctrl_msg_unblock {
|
||||
int reserved;
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
IF_REQUEST_TYPE_SUPL = 0,
|
||||
IF_REQUEST_TYPE_WIFI,
|
||||
IF_REQUEST_TYPE_ANY
|
||||
} ctrl_if_req_type_e_type;
|
||||
|
||||
typedef enum {
|
||||
IF_REQUEST_SENDER_ID_QUIPC = 0,
|
||||
IF_REQUEST_SENDER_ID_MSAPM,
|
||||
IF_REQUEST_SENDER_ID_MSAPU,
|
||||
IF_REQUEST_SENDER_ID_GPSONE_DAEMON,
|
||||
IF_REQUEST_SENDER_ID_MODEM
|
||||
} ctrl_if_req_sender_id_e_type;
|
||||
|
||||
struct ctrl_msg_if_request {
|
||||
ctrl_if_req_type_e_type type;
|
||||
ctrl_if_req_sender_id_e_type sender_id;
|
||||
unsigned long ipv4_addr;
|
||||
unsigned char ipv6_addr[16];
|
||||
char ssid[SSID_BUF_SIZE];
|
||||
char password[SSID_BUF_SIZE];
|
||||
};
|
||||
|
||||
/* do not change this structure */
|
||||
struct ctrl_msgbuf {
|
||||
size_t msgsz;
|
||||
uint16_t reserved1;
|
||||
uint32_t reserved2;
|
||||
uint8_t ctrl_type;
|
||||
union {
|
||||
struct ctrl_msg_response cmsg_response;
|
||||
struct ctrl_msg_unblock cmsg_unblock;
|
||||
struct ctrl_msg_if_request cmsg_if_request;
|
||||
} cmsg;
|
||||
};
|
||||
|
||||
extern void* loc_api_handle;
|
||||
|
||||
int loc_eng_dmn_conn_loc_api_server_if_request_handler(struct ctrl_msgbuf *pmsg, int len);
|
||||
int loc_eng_dmn_conn_loc_api_server_if_release_handler(struct ctrl_msgbuf *pmsg, int len);
|
||||
|
||||
#endif /* LOC_ENG_DATA_SERVER_HANDLER */
|
399
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_thread_helper.c
Normal file
399
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_thread_helper.c
Normal file
@ -0,0 +1,399 @@
|
||||
/* 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 <stdio.h>
|
||||
|
||||
#include "log_util.h"
|
||||
#include "platform_lib_includes.h"
|
||||
#include "loc_eng_dmn_conn_thread_helper.h"
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION thelper_signal_init
|
||||
|
||||
DESCRIPTION
|
||||
This function will initialize the conditional variable resources.
|
||||
|
||||
thelper - thelper instance
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
0: success or negative value for failure
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int thelper_signal_init(struct loc_eng_dmn_conn_thelper * thelper)
|
||||
{
|
||||
int result;
|
||||
thelper->thread_exit = 0;
|
||||
thelper->thread_ready = 0;
|
||||
result = pthread_cond_init( &thelper->thread_cond, NULL);
|
||||
if (result) {
|
||||
return result;
|
||||
}
|
||||
|
||||
result = pthread_mutex_init(&thelper->thread_mutex, NULL);
|
||||
if (result) {
|
||||
pthread_cond_destroy(&thelper->thread_cond);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION
|
||||
|
||||
DESCRIPTION
|
||||
This function will destroy the conditional variable resources
|
||||
|
||||
thelper - pointer to thelper instance
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
0: success or negative value for failure
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int thelper_signal_destroy(struct loc_eng_dmn_conn_thelper * thelper)
|
||||
{
|
||||
int result, ret_result = 0;
|
||||
result = pthread_cond_destroy( &thelper->thread_cond);
|
||||
if (result) {
|
||||
ret_result = result;
|
||||
}
|
||||
|
||||
result = pthread_mutex_destroy(&thelper->thread_mutex);
|
||||
if (result) {
|
||||
ret_result = result;
|
||||
}
|
||||
|
||||
return ret_result;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION thelper_signal_wait
|
||||
|
||||
DESCRIPTION
|
||||
This function will be blocked on the conditional variable until thelper_signal_ready
|
||||
is called
|
||||
|
||||
thelper - pointer to thelper instance
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
0: success or negative value for failure
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int thelper_signal_wait(struct loc_eng_dmn_conn_thelper * thelper)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
pthread_mutex_lock(&thelper->thread_mutex);
|
||||
if (!thelper->thread_ready && !thelper->thread_exit) {
|
||||
result = pthread_cond_wait(&thelper->thread_cond, &thelper->thread_mutex);
|
||||
}
|
||||
|
||||
if (thelper->thread_exit) {
|
||||
result = -1;
|
||||
}
|
||||
pthread_mutex_unlock(&thelper->thread_mutex);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION thelper_signal_ready
|
||||
|
||||
DESCRIPTION
|
||||
This function will wake up the conditional variable
|
||||
|
||||
thelper - pointer to thelper instance
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
0: success or negative value for failure
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int thelper_signal_ready(struct loc_eng_dmn_conn_thelper * thelper)
|
||||
{
|
||||
int result;
|
||||
|
||||
LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||
|
||||
pthread_mutex_lock(&thelper->thread_mutex);
|
||||
thelper->thread_ready = 1;
|
||||
result = pthread_cond_signal(&thelper->thread_cond);
|
||||
pthread_mutex_unlock(&thelper->thread_mutex);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION thelper_signal_block
|
||||
|
||||
DESCRIPTION
|
||||
This function will set the thread ready to 0 to block the thelper_signal_wait
|
||||
|
||||
thelper - pointer to thelper instance
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
if thread_ready is set
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int thelper_signal_block(struct loc_eng_dmn_conn_thelper * thelper)
|
||||
{
|
||||
int result = thelper->thread_ready;
|
||||
|
||||
LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||
|
||||
pthread_mutex_lock(&thelper->thread_mutex);
|
||||
thelper->thread_ready = 0;
|
||||
pthread_mutex_unlock(&thelper->thread_mutex);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION thelper_main
|
||||
|
||||
DESCRIPTION
|
||||
This function is the main thread. It will be launched as a child thread
|
||||
|
||||
data - pointer to the instance
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
NULL
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
static void * thelper_main(void *data)
|
||||
{
|
||||
int result = 0;
|
||||
struct loc_eng_dmn_conn_thelper * thelper = (struct loc_eng_dmn_conn_thelper *) data;
|
||||
|
||||
if (thelper->thread_proc_init) {
|
||||
result = thelper->thread_proc_init(thelper->thread_context);
|
||||
if (result < 0) {
|
||||
thelper->thread_exit = 1;
|
||||
thelper_signal_ready(thelper);
|
||||
LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
thelper_signal_ready(thelper);
|
||||
|
||||
if (thelper->thread_proc_pre) {
|
||||
result = thelper->thread_proc_pre(thelper->thread_context);
|
||||
if (result < 0) {
|
||||
thelper->thread_exit = 1;
|
||||
LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
do {
|
||||
if (thelper->thread_proc) {
|
||||
result = thelper->thread_proc(thelper->thread_context);
|
||||
if (result < 0) {
|
||||
thelper->thread_exit = 1;
|
||||
LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||
}
|
||||
}
|
||||
} while (thelper->thread_exit == 0);
|
||||
|
||||
if (thelper->thread_proc_post) {
|
||||
result = thelper->thread_proc_post(thelper->thread_context);
|
||||
}
|
||||
|
||||
if (result != 0) {
|
||||
LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void thelper_main_2(void *data)
|
||||
{
|
||||
thelper_main(data);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_dmn_conn_launch_thelper
|
||||
|
||||
DESCRIPTION
|
||||
This function will initialize the thread context and launch the thelper_main
|
||||
|
||||
thelper - pointer to thelper instance
|
||||
thread_proc_init - The initialization function pointer
|
||||
thread_proc_pre - The function to call before task loop and after initialization
|
||||
thread_proc - The task loop
|
||||
thread_proc_post - The function to call after the task loop
|
||||
context - the context for the above four functions
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
0: success or negative value for failure
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_dmn_conn_launch_thelper(struct loc_eng_dmn_conn_thelper * thelper,
|
||||
int (*thread_proc_init) (void * context),
|
||||
int (*thread_proc_pre) (void * context),
|
||||
int (*thread_proc) (void * context),
|
||||
int (*thread_proc_post) (void * context),
|
||||
thelper_create_thread create_thread_cb,
|
||||
void * context)
|
||||
{
|
||||
int result;
|
||||
|
||||
thelper_signal_init(thelper);
|
||||
|
||||
if (context) {
|
||||
thelper->thread_context = context;
|
||||
}
|
||||
|
||||
thelper->thread_proc_init = thread_proc_init;
|
||||
thelper->thread_proc_pre = thread_proc_pre;
|
||||
thelper->thread_proc = thread_proc;
|
||||
thelper->thread_proc_post = thread_proc_post;
|
||||
|
||||
LOC_LOGD("%s:%d] 0x%lx call pthread_create\n", __func__, __LINE__, (long) thelper);
|
||||
if (create_thread_cb) {
|
||||
result = 0;
|
||||
thelper->thread_id = create_thread_cb("loc_eng_dmn_conn",
|
||||
thelper_main_2, (void *)thelper);
|
||||
} else {
|
||||
result = pthread_create(&thelper->thread_id, NULL,
|
||||
thelper_main, (void *)thelper);
|
||||
}
|
||||
|
||||
if (result != 0) {
|
||||
LOC_LOGE("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||
return -1;
|
||||
}
|
||||
|
||||
LOC_LOGD("%s:%d] 0x%lx pthread_create done\n", __func__, __LINE__, (long) thelper);
|
||||
|
||||
thelper_signal_wait(thelper);
|
||||
|
||||
LOC_LOGD("%s:%d] 0x%lx pthread ready\n", __func__, __LINE__, (long) thelper);
|
||||
return thelper->thread_exit;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_dmn_conn_unblock_thelper
|
||||
|
||||
DESCRIPTION
|
||||
This function unblocks thelper_main to release the thread
|
||||
|
||||
thelper - pointer to thelper instance
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
0: success
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_dmn_conn_unblock_thelper(struct loc_eng_dmn_conn_thelper * thelper)
|
||||
{
|
||||
LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||
thelper->thread_exit = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_dmn_conn_join_thelper
|
||||
|
||||
thelper - pointer to thelper instance
|
||||
|
||||
DESCRIPTION
|
||||
This function will wait for the thread of thelper_main to finish
|
||||
|
||||
DEPENDENCIES
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
0: success or negative value for failure
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_dmn_conn_join_thelper(struct loc_eng_dmn_conn_thelper * thelper)
|
||||
{
|
||||
int result;
|
||||
|
||||
LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||
result = pthread_join(thelper->thread_id, NULL);
|
||||
if (result != 0) {
|
||||
LOC_LOGE("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||
}
|
||||
LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||
|
||||
thelper_signal_destroy(thelper);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -0,0 +1,74 @@
|
||||
/* 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.
|
||||
*
|
||||
*/
|
||||
#ifndef __LOC_ENG_DMN_CONN_THREAD_HELPER_H__
|
||||
#define __LOC_ENG_DMN_CONN_THREAD_HELPER_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
struct loc_eng_dmn_conn_thelper {
|
||||
unsigned char thread_exit;
|
||||
unsigned char thread_ready;
|
||||
pthread_cond_t thread_cond;
|
||||
pthread_mutex_t thread_mutex;
|
||||
pthread_t thread_id;
|
||||
void * thread_context;
|
||||
int (*thread_proc_init) (void * context);
|
||||
int (*thread_proc_pre) (void * context);
|
||||
int (*thread_proc) (void * context);
|
||||
int (*thread_proc_post) (void * context);
|
||||
};
|
||||
|
||||
typedef pthread_t (* thelper_create_thread)(const char* name, void (*start)(void *), void* arg);
|
||||
int loc_eng_dmn_conn_launch_thelper(struct loc_eng_dmn_conn_thelper * thelper,
|
||||
int (*thread_proc_init) (void * context),
|
||||
int (*thread_proc_pre) (void * context),
|
||||
int (*thread_proc) (void * context),
|
||||
int (*thread_proc_post) (void * context),
|
||||
thelper_create_thread create_thread_cb,
|
||||
void * context);
|
||||
|
||||
int loc_eng_dmn_conn_unblock_thelper(struct loc_eng_dmn_conn_thelper * thelper);
|
||||
int loc_eng_dmn_conn_join_thelper(struct loc_eng_dmn_conn_thelper * thelper);
|
||||
|
||||
/* if only need to use signal */
|
||||
int thelper_signal_init(struct loc_eng_dmn_conn_thelper * thelper);
|
||||
int thelper_signal_destroy(struct loc_eng_dmn_conn_thelper * thelper);
|
||||
int thelper_signal_wait(struct loc_eng_dmn_conn_thelper * thelper);
|
||||
int thelper_signal_ready(struct loc_eng_dmn_conn_thelper * thelper);
|
||||
int thelper_signal_block(struct loc_eng_dmn_conn_thelper * thelper);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* __LOC_ENG_DMN_CONN_THREAD_HELPER_H__ */
|
35
gps/loc_api/libloc_api_50001/loc_eng_log.cpp
Normal file
35
gps/loc_api/libloc_api_50001/loc_eng_log.cpp
Normal file
@ -0,0 +1,35 @@
|
||||
/* 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_eng"
|
||||
|
||||
#include "loc_log.h"
|
||||
#include "loc_eng_log.h"
|
||||
|
44
gps/loc_api/libloc_api_50001/loc_eng_log.h
Normal file
44
gps/loc_api/libloc_api_50001/loc_eng_log.h
Normal file
@ -0,0 +1,44 @@
|
||||
/* 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_LOG_H
|
||||
#define LOC_ENG_LOG_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LOC_ENG_LOG_H */
|
306
gps/loc_api/libloc_api_50001/loc_eng_msg.h
Normal file
306
gps/loc_api/libloc_api_50001/loc_eng_msg.h
Normal file
@ -0,0 +1,306 @@
|
||||
/* 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_MSG_H
|
||||
#define LOC_ENG_MSG_H
|
||||
|
||||
|
||||
#include <hardware/gps.h>
|
||||
#include <gps_extended.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <log_util.h>
|
||||
#include <loc_eng_log.h>
|
||||
#include <loc_eng.h>
|
||||
#include <MsgTask.h>
|
||||
#include <LocEngAdapter.h>
|
||||
|
||||
#ifndef SSID_BUF_SIZE
|
||||
#define SSID_BUF_SIZE (32+1)
|
||||
#endif
|
||||
#ifdef USE_GLIB
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#endif /* USE_GLIB */
|
||||
#include "platform_lib_includes.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
using namespace loc_core;
|
||||
|
||||
struct LocEngPositionMode : public LocMsg {
|
||||
LocEngAdapter* mAdapter;
|
||||
const LocPosMode mPosMode;
|
||||
LocEngPositionMode(LocEngAdapter* adapter, LocPosMode &mode);
|
||||
virtual void proc() const;
|
||||
virtual void log() const;
|
||||
void send() const;
|
||||
};
|
||||
|
||||
|
||||
struct LocEngStartFix : public LocMsg {
|
||||
LocEngAdapter* mAdapter;
|
||||
LocEngStartFix(LocEngAdapter* adapter);
|
||||
virtual void proc() const;
|
||||
void locallog() const;
|
||||
virtual void log() const;
|
||||
void send() const;
|
||||
};
|
||||
|
||||
struct LocEngStopFix : public LocMsg {
|
||||
LocEngAdapter* mAdapter;
|
||||
LocEngStopFix(LocEngAdapter* adapter);
|
||||
virtual void proc() const;
|
||||
void locallog() const;
|
||||
virtual void log() const;
|
||||
void send() const;
|
||||
};
|
||||
|
||||
struct LocEngReportPosition : public LocMsg {
|
||||
LocAdapterBase* mAdapter;
|
||||
const UlpLocation mLocation;
|
||||
const GpsLocationExtended mLocationExtended;
|
||||
const void* mLocationExt;
|
||||
const enum loc_sess_status mStatus;
|
||||
const LocPosTechMask mTechMask;
|
||||
LocEngReportPosition(LocAdapterBase* adapter,
|
||||
UlpLocation &loc,
|
||||
GpsLocationExtended &locExtended,
|
||||
void* locExt,
|
||||
enum loc_sess_status st,
|
||||
LocPosTechMask technology);
|
||||
virtual void proc() const;
|
||||
void locallog() const;
|
||||
virtual void log() const;
|
||||
void send() const;
|
||||
};
|
||||
|
||||
struct LocEngReportSv : public LocMsg {
|
||||
LocAdapterBase* mAdapter;
|
||||
const GnssSvStatus mSvStatus;
|
||||
const GpsLocationExtended mLocationExtended;
|
||||
const void* mSvExt;
|
||||
LocEngReportSv(LocAdapterBase* adapter,
|
||||
GnssSvStatus &sv,
|
||||
GpsLocationExtended &locExtended,
|
||||
void* svExtended);
|
||||
virtual void proc() const;
|
||||
void locallog() const;
|
||||
virtual void log() const;
|
||||
void send() const;
|
||||
};
|
||||
|
||||
struct LocEngReportStatus : public LocMsg {
|
||||
LocAdapterBase* mAdapter;
|
||||
const GpsStatusValue mStatus;
|
||||
LocEngReportStatus(LocAdapterBase* adapter,
|
||||
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,
|
||||
char* s, char* p, bool isReq);
|
||||
virtual ~LocEngReqRelWifi();
|
||||
virtual void proc() const;
|
||||
void locallog() const;
|
||||
virtual void log() const;
|
||||
void send() const;
|
||||
};
|
||||
|
||||
struct LocEngRequestXtra : public LocMsg {
|
||||
void* mLocEng;
|
||||
LocEngRequestXtra(void* locEng);
|
||||
virtual void proc() const;
|
||||
void locallog() const;
|
||||
virtual void log() const;
|
||||
};
|
||||
|
||||
struct LocEngRequestTime : public LocMsg {
|
||||
void* mLocEng;
|
||||
LocEngRequestTime(void* locEng);
|
||||
virtual void proc() const;
|
||||
void locallog() const;
|
||||
virtual void log() const;
|
||||
};
|
||||
|
||||
struct LocEngRequestNi : public LocMsg {
|
||||
void* mLocEng;
|
||||
const GpsNiNotification mNotify;
|
||||
const void *mPayload;
|
||||
LocEngRequestNi(void* locEng,
|
||||
GpsNiNotification ¬if,
|
||||
const void* data);
|
||||
virtual void proc() const;
|
||||
void locallog() const;
|
||||
virtual void log() const;
|
||||
};
|
||||
|
||||
struct LocEngDown : public LocMsg {
|
||||
void* mLocEng;
|
||||
LocEngDown(void* locEng);
|
||||
virtual void proc() const;
|
||||
void locallog() const;
|
||||
virtual void log() const;
|
||||
};
|
||||
|
||||
struct LocEngUp : public LocMsg {
|
||||
void* mLocEng;
|
||||
LocEngUp(void* locEng);
|
||||
virtual void proc() const;
|
||||
void locallog() const;
|
||||
virtual void log() const;
|
||||
};
|
||||
|
||||
struct LocEngGetZpp : public LocMsg {
|
||||
LocEngAdapter* mAdapter;
|
||||
LocEngGetZpp(LocEngAdapter* adapter);
|
||||
virtual void proc() const;
|
||||
void locallog() const;
|
||||
virtual void log() const;
|
||||
void send() const;
|
||||
};
|
||||
|
||||
struct LocEngReportGpsMeasurement : public LocMsg {
|
||||
void* mLocEng;
|
||||
const GpsData mGpsData;
|
||||
LocEngReportGpsMeasurement(void* locEng,
|
||||
GpsData &gpsData);
|
||||
virtual void proc() const;
|
||||
void locallog() const;
|
||||
virtual void log() const;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* LOC_ENG_MSG_H */
|
414
gps/loc_api/libloc_api_50001/loc_eng_ni.cpp
Normal file
414
gps/loc_api/libloc_api_50001/loc_eng_ni.cpp
Normal file
@ -0,0 +1,414 @@
|
||||
/* Copyright (c) 2009-2014, 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_eng"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
#include <pthread.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
#include <MsgTask.h>
|
||||
|
||||
#include <loc_eng.h>
|
||||
|
||||
#include "log_util.h"
|
||||
#include "platform_lib_includes.h"
|
||||
|
||||
using namespace loc_core;
|
||||
|
||||
/*=============================================================================
|
||||
*
|
||||
* DATA DECLARATION
|
||||
*
|
||||
*============================================================================*/
|
||||
|
||||
/*=============================================================================
|
||||
*
|
||||
* FUNCTION DECLARATIONS
|
||||
*
|
||||
*============================================================================*/
|
||||
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
|
||||
|
||||
DESCRIPTION
|
||||
Displays the NI request and awaits user input. If a previous request is
|
||||
in session, it is ignored.
|
||||
|
||||
RETURN VALUE
|
||||
none
|
||||
|
||||
===========================================================================*/
|
||||
void loc_eng_ni_request_handler(loc_eng_data_s_type &loc_eng_data,
|
||||
const GpsNiNotification *notif,
|
||||
const void* passThrough)
|
||||
{
|
||||
ENTRY_LOG();
|
||||
char lcs_addr[32]; // Decoded LCS address for UMTS CP NI
|
||||
loc_eng_ni_data_s_type* loc_eng_ni_data_p = &loc_eng_data.loc_eng_ni_data;
|
||||
loc_eng_ni_session_s_type* pSession = NULL;
|
||||
|
||||
if (NULL == loc_eng_data.ni_notify_cb) {
|
||||
EXIT_LOG(%s, "loc_eng_ni_init hasn't happened yet.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (notif->ni_type == GPS_NI_TYPE_EMERGENCY_SUPL) {
|
||||
if (NULL != loc_eng_ni_data_p->sessionEs.rawRequest) {
|
||||
LOC_LOGW("loc_eng_ni_request_handler, supl es NI in progress, new supl es NI ignored, type: %d",
|
||||
notif->ni_type);
|
||||
if (NULL != passThrough) {
|
||||
free((void*)passThrough);
|
||||
}
|
||||
} else {
|
||||
pSession = &loc_eng_ni_data_p->sessionEs;
|
||||
}
|
||||
} else {
|
||||
if (NULL != loc_eng_ni_data_p->session.rawRequest ||
|
||||
NULL != loc_eng_ni_data_p->sessionEs.rawRequest) {
|
||||
LOC_LOGW("loc_eng_ni_request_handler, supl NI in progress, new supl NI ignored, type: %d",
|
||||
notif->ni_type);
|
||||
if (NULL != passThrough) {
|
||||
free((void*)passThrough);
|
||||
}
|
||||
} else {
|
||||
pSession = &loc_eng_ni_data_p->session;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (pSession) {
|
||||
/* Save request */
|
||||
pSession->rawRequest = (void*)passThrough;
|
||||
pSession->reqID = ++loc_eng_ni_data_p->reqIDCounter;
|
||||
pSession->adapter = loc_eng_data.adapter;
|
||||
|
||||
/* Fill in notification */
|
||||
((GpsNiNotification*)notif)->notification_id = pSession->reqID;
|
||||
|
||||
if (notif->notify_flags == GPS_NI_PRIVACY_OVERRIDE)
|
||||
{
|
||||
loc_eng_mute_one_session(loc_eng_data);
|
||||
}
|
||||
|
||||
/* Log requestor ID and text for debugging */
|
||||
LOC_LOGI("Notification: notif_type: %d, timeout: %d, default_resp: %d", notif->ni_type, notif->timeout, notif->default_response);
|
||||
LOC_LOGI(" requestor_id: %s (encoding: %d)", notif->requestor_id, notif->requestor_id_encoding);
|
||||
LOC_LOGI(" text: %s text (encoding: %d)", notif->text, notif->text_encoding);
|
||||
if (notif->extras[0])
|
||||
{
|
||||
LOC_LOGI(" extras: %s", notif->extras);
|
||||
}
|
||||
|
||||
/* For robustness, spawn a thread at this point to timeout to clear up the notification status, even though
|
||||
* the OEM layer in java does not do so.
|
||||
**/
|
||||
pSession->respTimeLeft = 5 + (notif->timeout != 0 ? notif->timeout : LOC_NI_NO_RESPONSE_TIME);
|
||||
LOC_LOGI("Automatically sends 'no response' in %d seconds (to clear status)\n", pSession->respTimeLeft);
|
||||
|
||||
int rc = 0;
|
||||
rc = pthread_create(&pSession->thread, NULL, ni_thread_proc, pSession);
|
||||
if (rc)
|
||||
{
|
||||
LOC_LOGE("Loc NI thread is not created.\n");
|
||||
}
|
||||
rc = pthread_detach(pSession->thread);
|
||||
if (rc)
|
||||
{
|
||||
LOC_LOGE("Loc NI thread is not detached.\n");
|
||||
}
|
||||
|
||||
CALLBACK_LOG_CALLFLOW("ni_notify_cb - id", %d, notif->notification_id);
|
||||
loc_eng_data.ni_notify_cb((GpsNiNotification*)notif);
|
||||
}
|
||||
EXIT_LOG(%s, VOID_RET);
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION ni_thread_proc
|
||||
|
||||
===========================================================================*/
|
||||
static void* ni_thread_proc(void *args)
|
||||
{
|
||||
ENTRY_LOG();
|
||||
|
||||
loc_eng_ni_session_s_type* pSession = (loc_eng_ni_session_s_type*)args;
|
||||
int rc = 0; /* return code from pthread calls */
|
||||
|
||||
struct timeval present_time;
|
||||
struct timespec expire_time;
|
||||
|
||||
LOC_LOGD("Starting Loc NI thread...\n");
|
||||
pthread_mutex_lock(&pSession->tLock);
|
||||
/* Calculate absolute expire time */
|
||||
gettimeofday(&present_time, NULL);
|
||||
expire_time.tv_sec = present_time.tv_sec + pSession->respTimeLeft;
|
||||
expire_time.tv_nsec = present_time.tv_usec * 1000;
|
||||
LOC_LOGD("ni_thread_proc-Time out set for abs time %ld with delay %d sec\n",
|
||||
(long) expire_time.tv_sec, pSession->respTimeLeft );
|
||||
|
||||
while (!pSession->respRecvd)
|
||||
{
|
||||
rc = pthread_cond_timedwait(&pSession->tCond,
|
||||
&pSession->tLock,
|
||||
&expire_time);
|
||||
if (rc == ETIMEDOUT)
|
||||
{
|
||||
pSession->resp = GPS_NI_RESPONSE_NORESP;
|
||||
LOC_LOGD("ni_thread_proc-Thread time out after valting for specified time. Ret Val %d\n",rc );
|
||||
break;
|
||||
}
|
||||
}
|
||||
LOC_LOGD("ni_thread_proc-Java layer has sent us a user response and return value from "
|
||||
"pthread_cond_timedwait = %d\n",rc );
|
||||
pSession->respRecvd = FALSE; /* Reset the user response flag for the next session*/
|
||||
|
||||
LOC_LOGD("pSession->resp is %d\n",pSession->resp);
|
||||
|
||||
// adding this check to support modem restart, in which case, we need the thread
|
||||
// to exit without calling sending data. We made sure that rawRequest is NULL in
|
||||
// loc_eng_ni_reset_on_engine_restart()
|
||||
LocEngAdapter* adapter = pSession->adapter;
|
||||
LocEngInformNiResponse *msg = NULL;
|
||||
|
||||
if (NULL != pSession->rawRequest) {
|
||||
if (pSession->resp != GPS_NI_RESPONSE_IGNORE) {
|
||||
LOC_LOGD("pSession->resp != GPS_NI_RESPONSE_IGNORE \n");
|
||||
msg = new LocEngInformNiResponse(adapter,
|
||||
pSession->resp,
|
||||
pSession->rawRequest);
|
||||
} else {
|
||||
LOC_LOGD("this is the ignore reply for SUPL ES\n");
|
||||
free(pSession->rawRequest);
|
||||
}
|
||||
pSession->rawRequest = NULL;
|
||||
}
|
||||
pthread_mutex_unlock(&pSession->tLock);
|
||||
|
||||
pSession->respTimeLeft = 0;
|
||||
pSession->reqID = 0;
|
||||
|
||||
if (NULL != msg) {
|
||||
LOC_LOGD("ni_thread_proc: adapter->sendMsg(msg)\n");
|
||||
adapter->sendMsg(msg);
|
||||
}
|
||||
|
||||
EXIT_LOG(%s, VOID_RET);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void loc_eng_ni_reset_on_engine_restart(loc_eng_data_s_type &loc_eng_data)
|
||||
{
|
||||
ENTRY_LOG();
|
||||
loc_eng_ni_data_s_type* loc_eng_ni_data_p = &loc_eng_data.loc_eng_ni_data;
|
||||
|
||||
if (NULL == loc_eng_data.ni_notify_cb) {
|
||||
EXIT_LOG(%s, "loc_eng_ni_init hasn't happened yet.");
|
||||
return;
|
||||
}
|
||||
|
||||
// only if modem has requested but then died.
|
||||
if (NULL != loc_eng_ni_data_p->sessionEs.rawRequest) {
|
||||
free(loc_eng_ni_data_p->sessionEs.rawRequest);
|
||||
loc_eng_ni_data_p->sessionEs.rawRequest = NULL;
|
||||
|
||||
pthread_mutex_lock(&loc_eng_ni_data_p->sessionEs.tLock);
|
||||
// the goal is to wake up ni_thread_proc
|
||||
// and let it exit.
|
||||
loc_eng_ni_data_p->sessionEs.respRecvd = TRUE;
|
||||
pthread_cond_signal(&loc_eng_ni_data_p->sessionEs.tCond);
|
||||
pthread_mutex_unlock(&loc_eng_ni_data_p->sessionEs.tLock);
|
||||
}
|
||||
|
||||
if (NULL != loc_eng_ni_data_p->session.rawRequest) {
|
||||
free(loc_eng_ni_data_p->session.rawRequest);
|
||||
loc_eng_ni_data_p->session.rawRequest = NULL;
|
||||
|
||||
pthread_mutex_lock(&loc_eng_ni_data_p->session.tLock);
|
||||
// the goal is to wake up ni_thread_proc
|
||||
// and let it exit.
|
||||
loc_eng_ni_data_p->session.respRecvd = TRUE;
|
||||
pthread_cond_signal(&loc_eng_ni_data_p->session.tCond);
|
||||
pthread_mutex_unlock(&loc_eng_ni_data_p->session.tLock);
|
||||
}
|
||||
|
||||
EXIT_LOG(%s, VOID_RET);
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_ni_init
|
||||
|
||||
DESCRIPTION
|
||||
This function initializes the NI interface
|
||||
|
||||
DEPENDENCIES
|
||||
NONE
|
||||
|
||||
RETURN VALUE
|
||||
None
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
void loc_eng_ni_init(loc_eng_data_s_type &loc_eng_data, GpsNiExtCallbacks *callbacks)
|
||||
{
|
||||
ENTRY_LOG_CALLFLOW();
|
||||
|
||||
if(callbacks == NULL)
|
||||
EXIT_LOG(%s, "loc_eng_ni_init: failed, cb is NULL");
|
||||
else if (NULL == callbacks->notify_cb) {
|
||||
EXIT_LOG(%s, "loc_eng_ni_init: failed, no cb.");
|
||||
} else if (NULL != loc_eng_data.ni_notify_cb) {
|
||||
EXIT_LOG(%s, "loc_eng_ni_init: already inited.");
|
||||
} else {
|
||||
loc_eng_ni_data_s_type* loc_eng_ni_data_p = &loc_eng_data.loc_eng_ni_data;
|
||||
loc_eng_ni_data_p->sessionEs.respTimeLeft = 0;
|
||||
loc_eng_ni_data_p->sessionEs.respRecvd = FALSE;
|
||||
loc_eng_ni_data_p->sessionEs.rawRequest = NULL;
|
||||
loc_eng_ni_data_p->sessionEs.reqID = 0;
|
||||
pthread_cond_init(&loc_eng_ni_data_p->sessionEs.tCond, NULL);
|
||||
pthread_mutex_init(&loc_eng_ni_data_p->sessionEs.tLock, NULL);
|
||||
|
||||
loc_eng_ni_data_p->session.respTimeLeft = 0;
|
||||
loc_eng_ni_data_p->session.respRecvd = FALSE;
|
||||
loc_eng_ni_data_p->session.rawRequest = NULL;
|
||||
loc_eng_ni_data_p->session.reqID = 0;
|
||||
pthread_cond_init(&loc_eng_ni_data_p->session.tCond, NULL);
|
||||
pthread_mutex_init(&loc_eng_ni_data_p->session.tLock, NULL);
|
||||
|
||||
loc_eng_data.ni_notify_cb = callbacks->notify_cb;
|
||||
EXIT_LOG(%s, VOID_RET);
|
||||
}
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_ni_respond
|
||||
|
||||
DESCRIPTION
|
||||
This function receives user response from upper layer framework
|
||||
|
||||
DEPENDENCIES
|
||||
NONE
|
||||
|
||||
RETURN VALUE
|
||||
None
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
void loc_eng_ni_respond(loc_eng_data_s_type &loc_eng_data,
|
||||
int notif_id, GpsUserResponseType user_response)
|
||||
{
|
||||
ENTRY_LOG_CALLFLOW();
|
||||
loc_eng_ni_data_s_type* loc_eng_ni_data_p = &loc_eng_data.loc_eng_ni_data;
|
||||
loc_eng_ni_session_s_type* pSession = NULL;
|
||||
|
||||
if (NULL == loc_eng_data.ni_notify_cb) {
|
||||
EXIT_LOG(%s, "loc_eng_ni_init hasn't happened yet.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (notif_id == loc_eng_ni_data_p->sessionEs.reqID &&
|
||||
NULL != loc_eng_ni_data_p->sessionEs.rawRequest) {
|
||||
pSession = &loc_eng_ni_data_p->sessionEs;
|
||||
// ignore any SUPL NI non-Es session if a SUPL NI ES is accepted
|
||||
if (user_response == GPS_NI_RESPONSE_ACCEPT &&
|
||||
NULL != loc_eng_ni_data_p->session.rawRequest) {
|
||||
pthread_mutex_lock(&loc_eng_ni_data_p->session.tLock);
|
||||
loc_eng_ni_data_p->session.resp = GPS_NI_RESPONSE_IGNORE;
|
||||
loc_eng_ni_data_p->session.respRecvd = TRUE;
|
||||
pthread_cond_signal(&loc_eng_ni_data_p->session.tCond);
|
||||
pthread_mutex_unlock(&loc_eng_ni_data_p->session.tLock);
|
||||
}
|
||||
} else if (notif_id == loc_eng_ni_data_p->session.reqID &&
|
||||
NULL != loc_eng_ni_data_p->session.rawRequest) {
|
||||
pSession = &loc_eng_ni_data_p->session;
|
||||
}
|
||||
|
||||
if (pSession) {
|
||||
LOC_LOGI("loc_eng_ni_respond: send user response %d for notif %d", user_response, notif_id);
|
||||
pthread_mutex_lock(&pSession->tLock);
|
||||
pSession->resp = user_response;
|
||||
pSession->respRecvd = TRUE;
|
||||
pthread_cond_signal(&pSession->tCond);
|
||||
pthread_mutex_unlock(&pSession->tLock);
|
||||
}
|
||||
else {
|
||||
LOC_LOGE("loc_eng_ni_respond: notif_id %d not an active session", notif_id);
|
||||
}
|
||||
|
||||
EXIT_LOG(%s, VOID_RET);
|
||||
}
|
59
gps/loc_api/libloc_api_50001/loc_eng_ni.h
Normal file
59
gps/loc_api/libloc_api_50001/loc_eng_ni.h
Normal file
@ -0,0 +1,59 @@
|
||||
/* Copyright (c) 2009,2011,2014 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_NI_H
|
||||
#define LOC_ENG_NI_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <LocEngAdapter.h>
|
||||
|
||||
#define LOC_NI_NO_RESPONSE_TIME 20 /* secs */
|
||||
#define LOC_NI_NOTIF_KEY_ADDRESS "Address"
|
||||
#define GPS_NI_RESPONSE_IGNORE 4
|
||||
|
||||
typedef struct {
|
||||
pthread_t thread; /* NI thread */
|
||||
int respTimeLeft; /* examine time for NI response */
|
||||
bool respRecvd; /* NI User reponse received or not from Java layer*/
|
||||
void* rawRequest;
|
||||
int reqID; /* ID to check against response */
|
||||
GpsUserResponseType resp;
|
||||
pthread_cond_t tCond;
|
||||
pthread_mutex_t tLock;
|
||||
LocEngAdapter* adapter;
|
||||
} loc_eng_ni_session_s_type;
|
||||
|
||||
typedef struct {
|
||||
loc_eng_ni_session_s_type session; /* SUPL NI Session */
|
||||
loc_eng_ni_session_s_type sessionEs; /* Emergency SUPL NI Session */
|
||||
int reqIDCounter;
|
||||
} loc_eng_ni_data_s_type;
|
||||
|
||||
|
||||
#endif /* LOC_ENG_NI_H */
|
814
gps/loc_api/libloc_api_50001/loc_eng_nmea.cpp
Normal file
814
gps/loc_api/libloc_api_50001/loc_eng_nmea.cpp
Normal file
@ -0,0 +1,814 @@
|
||||
/* Copyright (c) 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_eng_nmea"
|
||||
#define GPS_PRN_START 1
|
||||
#define GPS_PRN_END 32
|
||||
#define GLONASS_PRN_START 65
|
||||
#define GLONASS_PRN_END 96
|
||||
#include <loc_eng.h>
|
||||
#include <loc_eng_nmea.h>
|
||||
#include <math.h>
|
||||
#include "log_util.h"
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_nmea_send
|
||||
|
||||
DESCRIPTION
|
||||
send out NMEA sentence
|
||||
|
||||
DEPENDENCIES
|
||||
NONE
|
||||
|
||||
RETURN VALUE
|
||||
Total length of the nmea sentence
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
void loc_eng_nmea_send(char *pNmea, int length, loc_eng_data_s_type *loc_eng_data_p)
|
||||
{
|
||||
struct timeval tv;
|
||||
gettimeofday(&tv, (struct timezone *) NULL);
|
||||
int64_t now = tv.tv_sec * 1000LL + tv.tv_usec / 1000;
|
||||
CALLBACK_LOG_CALLFLOW("nmea_cb", %p, pNmea);
|
||||
if (loc_eng_data_p->nmea_cb != NULL)
|
||||
loc_eng_data_p->nmea_cb(now, pNmea, length);
|
||||
LOC_LOGD("NMEA <%s", pNmea);
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_nmea_put_checksum
|
||||
|
||||
DESCRIPTION
|
||||
Generate NMEA sentences generated based on position report
|
||||
|
||||
DEPENDENCIES
|
||||
NONE
|
||||
|
||||
RETURN VALUE
|
||||
Total length of the nmea sentence
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_nmea_put_checksum(char *pNmea, int maxSize)
|
||||
{
|
||||
uint8_t checksum = 0;
|
||||
int length = 0;
|
||||
|
||||
pNmea++; //skip the $
|
||||
while (*pNmea != '\0')
|
||||
{
|
||||
checksum ^= *pNmea++;
|
||||
length++;
|
||||
}
|
||||
|
||||
int checksumLength = snprintf(pNmea,(maxSize-length-1),"*%02X\r\n", checksum);
|
||||
return (length + checksumLength);
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_nmea_generate_pos
|
||||
|
||||
DESCRIPTION
|
||||
Generate NMEA sentences generated based on position report
|
||||
|
||||
DEPENDENCIES
|
||||
NONE
|
||||
|
||||
RETURN VALUE
|
||||
0
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
void loc_eng_nmea_generate_pos(loc_eng_data_s_type *loc_eng_data_p,
|
||||
const UlpLocation &location,
|
||||
const GpsLocationExtended &locationExtended,
|
||||
unsigned char generate_nmea)
|
||||
{
|
||||
ENTRY_LOG();
|
||||
time_t utcTime(location.gpsLocation.timestamp/1000);
|
||||
tm * pTm = gmtime(&utcTime);
|
||||
if (NULL == pTm) {
|
||||
LOC_LOGE("gmtime failed");
|
||||
return;
|
||||
}
|
||||
|
||||
char sentence[NMEA_SENTENCE_MAX_LENGTH] = {0};
|
||||
char* pMarker = sentence;
|
||||
int lengthRemaining = sizeof(sentence);
|
||||
int length = 0;
|
||||
int utcYear = pTm->tm_year % 100; // 2 digit year
|
||||
int utcMonth = pTm->tm_mon + 1; // tm_mon starts at zero
|
||||
int utcDay = pTm->tm_mday;
|
||||
int utcHours = pTm->tm_hour;
|
||||
int utcMinutes = pTm->tm_min;
|
||||
int utcSeconds = pTm->tm_sec;
|
||||
|
||||
if (generate_nmea) {
|
||||
// ------------------
|
||||
// ------$GPGSA------
|
||||
// ------------------
|
||||
|
||||
uint32_t svUsedCount = 0;
|
||||
uint32_t svUsedList[32] = {0};
|
||||
uint32_t mask = loc_eng_data_p->sv_used_mask;
|
||||
for (uint8_t i = 1; mask > 0 && svUsedCount < 32; i++)
|
||||
{
|
||||
if (mask & 1)
|
||||
svUsedList[svUsedCount++] = i;
|
||||
mask = mask >> 1;
|
||||
}
|
||||
// clear the cache so they can't be used again
|
||||
loc_eng_data_p->sv_used_mask = 0;
|
||||
|
||||
char fixType;
|
||||
if (svUsedCount == 0)
|
||||
fixType = '1'; // no fix
|
||||
else if (svUsedCount <= 3)
|
||||
fixType = '2'; // 2D fix
|
||||
else
|
||||
fixType = '3'; // 3D fix
|
||||
|
||||
length = snprintf(pMarker, lengthRemaining, "$GPGSA,A,%c,", fixType);
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
|
||||
for (uint8_t i = 0; i < 12; i++) // only the first 12 sv go in sentence
|
||||
{
|
||||
if (i < svUsedCount)
|
||||
length = snprintf(pMarker, lengthRemaining, "%02d,", svUsedList[i]);
|
||||
else
|
||||
length = snprintf(pMarker, lengthRemaining, ",");
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
}
|
||||
|
||||
if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_DOP)
|
||||
{ // dop is in locationExtended, (QMI)
|
||||
length = snprintf(pMarker, lengthRemaining, "%.1f,%.1f,%.1f",
|
||||
locationExtended.pdop,
|
||||
locationExtended.hdop,
|
||||
locationExtended.vdop);
|
||||
}
|
||||
else if (loc_eng_data_p->pdop > 0 && loc_eng_data_p->hdop > 0 && loc_eng_data_p->vdop > 0)
|
||||
{ // dop was cached from sv report (RPC)
|
||||
length = snprintf(pMarker, lengthRemaining, "%.1f,%.1f,%.1f",
|
||||
loc_eng_data_p->pdop,
|
||||
loc_eng_data_p->hdop,
|
||||
loc_eng_data_p->vdop);
|
||||
}
|
||||
else
|
||||
{ // no dop
|
||||
length = snprintf(pMarker, lengthRemaining, ",,");
|
||||
}
|
||||
|
||||
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||
|
||||
// ------------------
|
||||
// ------$GPVTG------
|
||||
// ------------------
|
||||
|
||||
pMarker = sentence;
|
||||
lengthRemaining = sizeof(sentence);
|
||||
|
||||
if (location.gpsLocation.flags & GPS_LOCATION_HAS_BEARING)
|
||||
{
|
||||
float magTrack = location.gpsLocation.bearing;
|
||||
if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_MAG_DEV)
|
||||
{
|
||||
float magTrack = location.gpsLocation.bearing - locationExtended.magneticDeviation;
|
||||
if (magTrack < 0.0)
|
||||
magTrack += 360.0;
|
||||
else if (magTrack > 360.0)
|
||||
magTrack -= 360.0;
|
||||
}
|
||||
|
||||
length = snprintf(pMarker, lengthRemaining, "$GPVTG,%.1lf,T,%.1lf,M,", location.gpsLocation.bearing, magTrack);
|
||||
}
|
||||
else
|
||||
{
|
||||
length = snprintf(pMarker, lengthRemaining, "$GPVTG,,T,,M,");
|
||||
}
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
|
||||
if (location.gpsLocation.flags & GPS_LOCATION_HAS_SPEED)
|
||||
{
|
||||
float speedKnots = location.gpsLocation.speed * (3600.0/1852.0);
|
||||
float speedKmPerHour = location.gpsLocation.speed * 3.6;
|
||||
|
||||
length = snprintf(pMarker, lengthRemaining, "%.1lf,N,%.1lf,K,", speedKnots, speedKmPerHour);
|
||||
}
|
||||
else
|
||||
{
|
||||
length = snprintf(pMarker, lengthRemaining, ",N,,K,");
|
||||
}
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
|
||||
if (!(location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG))
|
||||
length = snprintf(pMarker, lengthRemaining, "%c", 'N'); // N means no fix
|
||||
else if (LOC_POSITION_MODE_STANDALONE == loc_eng_data_p->adapter->getPositionMode().mode)
|
||||
length = snprintf(pMarker, lengthRemaining, "%c", 'A'); // A means autonomous
|
||||
else
|
||||
length = snprintf(pMarker, lengthRemaining, "%c", 'D'); // D means differential
|
||||
|
||||
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||
|
||||
// ------------------
|
||||
// ------$GPRMC------
|
||||
// ------------------
|
||||
|
||||
pMarker = sentence;
|
||||
lengthRemaining = sizeof(sentence);
|
||||
|
||||
length = snprintf(pMarker, lengthRemaining, "$GPRMC,%02d%02d%02d,A," ,
|
||||
utcHours, utcMinutes, utcSeconds);
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
|
||||
if (location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG)
|
||||
{
|
||||
double latitude = location.gpsLocation.latitude;
|
||||
double longitude = location.gpsLocation.longitude;
|
||||
char latHemisphere;
|
||||
char lonHemisphere;
|
||||
double latMinutes;
|
||||
double lonMinutes;
|
||||
|
||||
if (latitude > 0)
|
||||
{
|
||||
latHemisphere = 'N';
|
||||
}
|
||||
else
|
||||
{
|
||||
latHemisphere = 'S';
|
||||
latitude *= -1.0;
|
||||
}
|
||||
|
||||
if (longitude < 0)
|
||||
{
|
||||
lonHemisphere = 'W';
|
||||
longitude *= -1.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
lonHemisphere = 'E';
|
||||
}
|
||||
|
||||
latMinutes = fmod(latitude * 60.0 , 60.0);
|
||||
lonMinutes = fmod(longitude * 60.0 , 60.0);
|
||||
|
||||
length = snprintf(pMarker, lengthRemaining, "%02d%09.6lf,%c,%03d%09.6lf,%c,",
|
||||
(uint8_t)floor(latitude), latMinutes, latHemisphere,
|
||||
(uint8_t)floor(longitude),lonMinutes, lonHemisphere);
|
||||
}
|
||||
else
|
||||
{
|
||||
length = snprintf(pMarker, lengthRemaining,",,,,");
|
||||
}
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
|
||||
if (location.gpsLocation.flags & GPS_LOCATION_HAS_SPEED)
|
||||
{
|
||||
float speedKnots = location.gpsLocation.speed * (3600.0/1852.0);
|
||||
length = snprintf(pMarker, lengthRemaining, "%.1lf,", speedKnots);
|
||||
}
|
||||
else
|
||||
{
|
||||
length = snprintf(pMarker, lengthRemaining, ",");
|
||||
}
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
|
||||
if (location.gpsLocation.flags & GPS_LOCATION_HAS_BEARING)
|
||||
{
|
||||
length = snprintf(pMarker, lengthRemaining, "%.1lf,", location.gpsLocation.bearing);
|
||||
}
|
||||
else
|
||||
{
|
||||
length = snprintf(pMarker, lengthRemaining, ",");
|
||||
}
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
|
||||
length = snprintf(pMarker, lengthRemaining, "%2.2d%2.2d%2.2d,",
|
||||
utcDay, utcMonth, utcYear);
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
|
||||
if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_MAG_DEV)
|
||||
{
|
||||
float magneticVariation = locationExtended.magneticDeviation;
|
||||
char direction;
|
||||
if (magneticVariation < 0.0)
|
||||
{
|
||||
direction = 'W';
|
||||
magneticVariation *= -1.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
direction = 'E';
|
||||
}
|
||||
|
||||
length = snprintf(pMarker, lengthRemaining, "%.1lf,%c,",
|
||||
magneticVariation, direction);
|
||||
}
|
||||
else
|
||||
{
|
||||
length = snprintf(pMarker, lengthRemaining, ",,");
|
||||
}
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
|
||||
if (!(location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG))
|
||||
length = snprintf(pMarker, lengthRemaining, "%c", 'N'); // N means no fix
|
||||
else if (LOC_POSITION_MODE_STANDALONE == loc_eng_data_p->adapter->getPositionMode().mode)
|
||||
length = snprintf(pMarker, lengthRemaining, "%c", 'A'); // A means autonomous
|
||||
else
|
||||
length = snprintf(pMarker, lengthRemaining, "%c", 'D'); // D means differential
|
||||
|
||||
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||
|
||||
// ------------------
|
||||
// ------$GPGGA------
|
||||
// ------------------
|
||||
|
||||
pMarker = sentence;
|
||||
lengthRemaining = sizeof(sentence);
|
||||
|
||||
length = snprintf(pMarker, lengthRemaining, "$GPGGA,%02d%02d%02d," ,
|
||||
utcHours, utcMinutes, utcSeconds);
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
|
||||
if (location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG)
|
||||
{
|
||||
double latitude = location.gpsLocation.latitude;
|
||||
double longitude = location.gpsLocation.longitude;
|
||||
char latHemisphere;
|
||||
char lonHemisphere;
|
||||
double latMinutes;
|
||||
double lonMinutes;
|
||||
|
||||
if (latitude > 0)
|
||||
{
|
||||
latHemisphere = 'N';
|
||||
}
|
||||
else
|
||||
{
|
||||
latHemisphere = 'S';
|
||||
latitude *= -1.0;
|
||||
}
|
||||
|
||||
if (longitude < 0)
|
||||
{
|
||||
lonHemisphere = 'W';
|
||||
longitude *= -1.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
lonHemisphere = 'E';
|
||||
}
|
||||
|
||||
latMinutes = fmod(latitude * 60.0 , 60.0);
|
||||
lonMinutes = fmod(longitude * 60.0 , 60.0);
|
||||
|
||||
length = snprintf(pMarker, lengthRemaining, "%02d%09.6lf,%c,%03d%09.6lf,%c,",
|
||||
(uint8_t)floor(latitude), latMinutes, latHemisphere,
|
||||
(uint8_t)floor(longitude),lonMinutes, lonHemisphere);
|
||||
}
|
||||
else
|
||||
{
|
||||
length = snprintf(pMarker, lengthRemaining,",,,,");
|
||||
}
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
|
||||
char gpsQuality;
|
||||
if (!(location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG))
|
||||
gpsQuality = '0'; // 0 means no fix
|
||||
else if (LOC_POSITION_MODE_STANDALONE == loc_eng_data_p->adapter->getPositionMode().mode)
|
||||
gpsQuality = '1'; // 1 means GPS fix
|
||||
else
|
||||
gpsQuality = '2'; // 2 means DGPS fix
|
||||
|
||||
if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_DOP)
|
||||
{ // dop is in locationExtended, (QMI)
|
||||
length = snprintf(pMarker, lengthRemaining, "%c,%02d,%.1f,",
|
||||
gpsQuality, svUsedCount, locationExtended.hdop);
|
||||
}
|
||||
else if (loc_eng_data_p->pdop > 0 && loc_eng_data_p->hdop > 0 && loc_eng_data_p->vdop > 0)
|
||||
{ // dop was cached from sv report (RPC)
|
||||
length = snprintf(pMarker, lengthRemaining, "%c,%02d,%.1f,",
|
||||
gpsQuality, svUsedCount, loc_eng_data_p->hdop);
|
||||
}
|
||||
else
|
||||
{ // no hdop
|
||||
length = snprintf(pMarker, lengthRemaining, "%c,%02d,,",
|
||||
gpsQuality, svUsedCount);
|
||||
}
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
|
||||
if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_ALTITUDE_MEAN_SEA_LEVEL)
|
||||
{
|
||||
length = snprintf(pMarker, lengthRemaining, "%.1lf,M,",
|
||||
locationExtended.altitudeMeanSeaLevel);
|
||||
}
|
||||
else
|
||||
{
|
||||
length = snprintf(pMarker, lengthRemaining,",,");
|
||||
}
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
|
||||
if ((location.gpsLocation.flags & GPS_LOCATION_HAS_ALTITUDE) &&
|
||||
(locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_ALTITUDE_MEAN_SEA_LEVEL))
|
||||
{
|
||||
length = snprintf(pMarker, lengthRemaining, "%.1lf,M,,",
|
||||
location.gpsLocation.altitude - locationExtended.altitudeMeanSeaLevel);
|
||||
}
|
||||
else
|
||||
{
|
||||
length = snprintf(pMarker, lengthRemaining,",,,");
|
||||
}
|
||||
|
||||
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||
|
||||
}
|
||||
//Send blank NMEA reports for non-final fixes
|
||||
else {
|
||||
strlcpy(sentence, "$GPGSA,A,1,,,,,,,,,,,,,,,", sizeof(sentence));
|
||||
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||
|
||||
strlcpy(sentence, "$GPVTG,,T,,M,,N,,K,N", sizeof(sentence));
|
||||
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||
|
||||
strlcpy(sentence, "$GPRMC,,V,,,,,,,,,,N", sizeof(sentence));
|
||||
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||
|
||||
strlcpy(sentence, "$GPGGA,,,,,,0,,,,,,,,", sizeof(sentence));
|
||||
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||
}
|
||||
// clear the dop cache so they can't be used again
|
||||
loc_eng_data_p->pdop = 0;
|
||||
loc_eng_data_p->hdop = 0;
|
||||
loc_eng_data_p->vdop = 0;
|
||||
|
||||
EXIT_LOG(%d, 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_nmea_generate_sv
|
||||
|
||||
DESCRIPTION
|
||||
Generate NMEA sentences generated based on sv report
|
||||
|
||||
DEPENDENCIES
|
||||
NONE
|
||||
|
||||
RETURN VALUE
|
||||
0
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p,
|
||||
const GnssSvStatus &svStatus, const GpsLocationExtended &locationExtended)
|
||||
{
|
||||
ENTRY_LOG();
|
||||
|
||||
char sentence[NMEA_SENTENCE_MAX_LENGTH] = {0};
|
||||
char* pMarker = sentence;
|
||||
int lengthRemaining = sizeof(sentence);
|
||||
int length = 0;
|
||||
int svCount = svStatus.num_svs;
|
||||
int sentenceCount = 0;
|
||||
int sentenceNumber = 1;
|
||||
int svNumber = 1;
|
||||
int gpsCount = 0;
|
||||
int glnCount = 0;
|
||||
|
||||
//Count GPS SVs for saparating GPS from GLONASS and throw others
|
||||
|
||||
for(svNumber=1; svNumber <= svCount; svNumber++) {
|
||||
if( (svStatus.sv_list[svNumber-1].prn >= GPS_PRN_START)&&
|
||||
(svStatus.sv_list[svNumber-1].prn <= GPS_PRN_END) )
|
||||
{
|
||||
gpsCount++;
|
||||
}
|
||||
else if( (svStatus.sv_list[svNumber-1].prn >= GLONASS_PRN_START) &&
|
||||
(svStatus.sv_list[svNumber-1].prn <= GLONASS_PRN_END) )
|
||||
{
|
||||
glnCount++;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------
|
||||
// ------$GPGSV------
|
||||
// ------------------
|
||||
|
||||
if (gpsCount <= 0)
|
||||
{
|
||||
// no svs in view, so just send a blank $GPGSV sentence
|
||||
strlcpy(sentence, "$GPGSV,1,1,0,", sizeof(sentence));
|
||||
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
svNumber = 1;
|
||||
sentenceNumber = 1;
|
||||
sentenceCount = gpsCount/4 + (gpsCount % 4 != 0);
|
||||
|
||||
while (sentenceNumber <= sentenceCount)
|
||||
{
|
||||
pMarker = sentence;
|
||||
lengthRemaining = sizeof(sentence);
|
||||
|
||||
length = snprintf(pMarker, lengthRemaining, "$GPGSV,%d,%d,%02d",
|
||||
sentenceCount, sentenceNumber, gpsCount);
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
|
||||
for (int i=0; (svNumber <= svCount) && (i < 4); svNumber++)
|
||||
{
|
||||
if( (svStatus.sv_list[svNumber-1].prn >= GPS_PRN_START) &&
|
||||
(svStatus.sv_list[svNumber-1].prn <= GPS_PRN_END) )
|
||||
{
|
||||
length = snprintf(pMarker, lengthRemaining,",%02d,%02d,%03d,",
|
||||
svStatus.sv_list[svNumber-1].prn,
|
||||
(int)(0.5 + svStatus.sv_list[svNumber-1].elevation), //float to int
|
||||
(int)(0.5 + svStatus.sv_list[svNumber-1].azimuth)); //float to int
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
|
||||
if (svStatus.sv_list[svNumber-1].snr > 0)
|
||||
{
|
||||
length = snprintf(pMarker, lengthRemaining,"%02d",
|
||||
(int)(0.5 + svStatus.sv_list[svNumber-1].snr)); //float to int
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||
sentenceNumber++;
|
||||
|
||||
} //while
|
||||
|
||||
} //if
|
||||
|
||||
// ------------------
|
||||
// ------$GLGSV------
|
||||
// ------------------
|
||||
|
||||
if (glnCount <= 0)
|
||||
{
|
||||
// no svs in view, so just send a blank $GLGSV sentence
|
||||
strlcpy(sentence, "$GLGSV,1,1,0,", sizeof(sentence));
|
||||
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
svNumber = 1;
|
||||
sentenceNumber = 1;
|
||||
sentenceCount = glnCount/4 + (glnCount % 4 != 0);
|
||||
|
||||
while (sentenceNumber <= sentenceCount)
|
||||
{
|
||||
pMarker = sentence;
|
||||
lengthRemaining = sizeof(sentence);
|
||||
|
||||
length = snprintf(pMarker, lengthRemaining, "$GLGSV,%d,%d,%02d",
|
||||
sentenceCount, sentenceNumber, glnCount);
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
|
||||
for (int i=0; (svNumber <= svCount) && (i < 4); svNumber++)
|
||||
{
|
||||
if( (svStatus.sv_list[svNumber-1].prn >= GLONASS_PRN_START) &&
|
||||
(svStatus.sv_list[svNumber-1].prn <= GLONASS_PRN_END) ) {
|
||||
|
||||
length = snprintf(pMarker, lengthRemaining,",%02d,%02d,%03d,",
|
||||
svStatus.sv_list[svNumber-1].prn,
|
||||
(int)(0.5 + svStatus.sv_list[svNumber-1].elevation), //float to int
|
||||
(int)(0.5 + svStatus.sv_list[svNumber-1].azimuth)); //float to int
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
|
||||
if (svStatus.sv_list[svNumber-1].snr > 0)
|
||||
{
|
||||
length = snprintf(pMarker, lengthRemaining,"%02d",
|
||||
(int)(0.5 + svStatus.sv_list[svNumber-1].snr)); //float to int
|
||||
|
||||
if (length < 0 || length >= lengthRemaining)
|
||||
{
|
||||
LOC_LOGE("NMEA Error in string formatting");
|
||||
return;
|
||||
}
|
||||
pMarker += length;
|
||||
lengthRemaining -= length;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||
sentenceNumber++;
|
||||
|
||||
} //while
|
||||
|
||||
}//if
|
||||
|
||||
// cache the used in fix mask, as it will be needed to send $GPGSA
|
||||
// during the position report
|
||||
loc_eng_data_p->sv_used_mask = svStatus.gps_used_in_fix_mask;
|
||||
|
||||
// For RPC, the DOP are sent during sv report, so cache them
|
||||
// now to be sent during position report.
|
||||
// For QMI, the DOP will be in position report.
|
||||
if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_DOP)
|
||||
{
|
||||
loc_eng_data_p->pdop = locationExtended.pdop;
|
||||
loc_eng_data_p->hdop = locationExtended.hdop;
|
||||
loc_eng_data_p->vdop = locationExtended.vdop;
|
||||
}
|
||||
else
|
||||
{
|
||||
loc_eng_data_p->pdop = 0;
|
||||
loc_eng_data_p->hdop = 0;
|
||||
loc_eng_data_p->vdop = 0;
|
||||
}
|
||||
|
||||
EXIT_LOG(%d, 0);
|
||||
}
|
43
gps/loc_api/libloc_api_50001/loc_eng_nmea.h
Normal file
43
gps/loc_api/libloc_api_50001/loc_eng_nmea.h
Normal file
@ -0,0 +1,43 @@
|
||||
/* Copyright (c) 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LOC_ENG_NMEA_H
|
||||
#define LOC_ENG_NMEA_H
|
||||
|
||||
#include <hardware/gps.h>
|
||||
#include <gps_extended.h>
|
||||
|
||||
#define NMEA_SENTENCE_MAX_LENGTH 200
|
||||
|
||||
void loc_eng_nmea_send(char *pNmea, int length, loc_eng_data_s_type *loc_eng_data_p);
|
||||
int loc_eng_nmea_put_checksum(char *pNmea, int maxSize);
|
||||
void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p, const GnssSvStatus &svStatus, const GpsLocationExtended &locationExtended);
|
||||
void loc_eng_nmea_generate_pos(loc_eng_data_s_type *loc_eng_data_p, const UlpLocation &location, const GpsLocationExtended &locationExtended, unsigned char generate_nmea);
|
||||
|
||||
#endif // LOC_ENG_NMEA_H
|
213
gps/loc_api/libloc_api_50001/loc_eng_xtra.cpp
Normal file
213
gps/loc_api/libloc_api_50001/loc_eng_xtra.cpp
Normal file
@ -0,0 +1,213 @@
|
||||
/* Copyright (c) 2009-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_eng"
|
||||
|
||||
#include <loc_eng.h>
|
||||
#include <MsgTask.h>
|
||||
#include "log_util.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();
|
||||
}
|
||||
};
|
||||
|
||||
struct LocEngSetXtraVersionCheck : public LocMsg {
|
||||
LocEngAdapter *mAdapter;
|
||||
int mCheck;
|
||||
inline LocEngSetXtraVersionCheck(LocEngAdapter* adapter,
|
||||
int check):
|
||||
mAdapter(adapter), mCheck(check) {}
|
||||
inline virtual void proc() const {
|
||||
locallog();
|
||||
mAdapter->setXtraVersionCheck(mCheck);
|
||||
}
|
||||
inline void locallog() const {
|
||||
LOC_LOGD("%s:%d]: mCheck: %d",
|
||||
__func__, __LINE__, mCheck);
|
||||
}
|
||||
inline virtual void log() const {
|
||||
locallog();
|
||||
}
|
||||
};
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_xtra_init
|
||||
|
||||
DESCRIPTION
|
||||
Initialize XTRA module.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
0: success
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_xtra_init (loc_eng_data_s_type &loc_eng_data,
|
||||
GpsXtraExtCallbacks* callbacks)
|
||||
{
|
||||
int ret_val = -1;
|
||||
loc_eng_xtra_data_s_type *xtra_module_data_ptr;
|
||||
ENTRY_LOG();
|
||||
|
||||
if(callbacks == NULL) {
|
||||
LOC_LOGE("loc_eng_xtra_init: failed, cb is NULL");
|
||||
} else {
|
||||
xtra_module_data_ptr = &loc_eng_data.xtra_module_data;
|
||||
xtra_module_data_ptr->download_request_cb = callbacks->download_request_cb;
|
||||
xtra_module_data_ptr->report_xtra_server_cb = callbacks->report_xtra_server_cb;
|
||||
|
||||
ret_val = 0;
|
||||
}
|
||||
EXIT_LOG(%d, ret_val);
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_xtra_inject_data
|
||||
|
||||
DESCRIPTION
|
||||
Injects XTRA file into the engine but buffers the data if engine is busy.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
0
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_xtra_inject_data(loc_eng_data_s_type &loc_eng_data,
|
||||
char* data, int length)
|
||||
{
|
||||
ENTRY_LOG();
|
||||
LocEngAdapter* adapter = loc_eng_data.adapter;
|
||||
adapter->sendMsg(new LocEngInjectXtraData(adapter, data, length));
|
||||
EXIT_LOG(%d, 0);
|
||||
return 0;
|
||||
}
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_xtra_request_server
|
||||
|
||||
DESCRIPTION
|
||||
Request the Xtra server url from the modem
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
0
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int loc_eng_xtra_request_server(loc_eng_data_s_type &loc_eng_data)
|
||||
{
|
||||
ENTRY_LOG();
|
||||
LocEngAdapter* adapter = loc_eng_data.adapter;
|
||||
adapter->sendMsg(new LocEngRequestXtraServer(adapter));
|
||||
EXIT_LOG(%d, 0);
|
||||
return 0;
|
||||
}
|
||||
/*===========================================================================
|
||||
FUNCTION loc_eng_xtra_version_check
|
||||
|
||||
DESCRIPTION
|
||||
Injects the enable/disable value for checking XTRA version
|
||||
that is specified in gps.conf
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
none
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
void loc_eng_xtra_version_check(loc_eng_data_s_type &loc_eng_data,
|
||||
int check)
|
||||
{
|
||||
ENTRY_LOG();
|
||||
LocEngAdapter *adapter = loc_eng_data.adapter;
|
||||
adapter->sendMsg(new LocEngSetXtraVersionCheck(adapter, check));
|
||||
EXIT_LOG(%d, 0);
|
||||
}
|
47
gps/loc_api/libloc_api_50001/loc_eng_xtra.h
Normal file
47
gps/loc_api/libloc_api_50001/loc_eng_xtra.h
Normal file
@ -0,0 +1,47 @@
|
||||
/* Copyright (c) 2009,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.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LOC_ENG_XTRA_H
|
||||
#define LOC_ENG_XTRA_H
|
||||
|
||||
#include <hardware/gps.h>
|
||||
|
||||
// Module data
|
||||
typedef struct
|
||||
{
|
||||
// loc_eng_ioctl_cb_data_s_type ioctl_cb_data;
|
||||
gps_xtra_download_request download_request_cb;
|
||||
report_xtra_server report_xtra_server_cb;
|
||||
|
||||
// XTRA data buffer
|
||||
char *xtra_data_for_injection; // NULL if no pending data
|
||||
int xtra_data_len;
|
||||
} loc_eng_xtra_data_s_type;
|
||||
|
||||
#endif // LOC_ENG_XTRA_H
|
71
gps/utils/Android.mk
Normal file
71
gps/utils/Android.mk
Normal file
@ -0,0 +1,71 @@
|
||||
ifneq ($(BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE),)
|
||||
ifneq ($(BUILD_TINY_ANDROID),true)
|
||||
#Compile this library only for builds with the latest modem image
|
||||
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
## Libs
|
||||
LOCAL_SHARED_LIBRARIES := \
|
||||
libutils \
|
||||
libcutils \
|
||||
liblog
|
||||
|
||||
LOCAL_SRC_FILES += \
|
||||
loc_log.cpp \
|
||||
loc_cfg.cpp \
|
||||
msg_q.c \
|
||||
linked_list.c \
|
||||
loc_target.cpp \
|
||||
platform_lib_abstractions/elapsed_millis_since_boot.cpp \
|
||||
LocHeap.cpp \
|
||||
LocTimer.cpp \
|
||||
LocThread.cpp \
|
||||
MsgTask.cpp \
|
||||
loc_misc_utils.cpp
|
||||
|
||||
LOCAL_CFLAGS += \
|
||||
-fno-short-enums \
|
||||
-D_ANDROID_ \
|
||||
-std=c++11
|
||||
|
||||
ifeq ($(TARGET_BUILD_VARIANT),user)
|
||||
LOCAL_CFLAGS += -DTARGET_BUILD_VARIANT_USER
|
||||
endif
|
||||
|
||||
LOCAL_LDFLAGS += -Wl,--export-dynamic
|
||||
|
||||
## Includes
|
||||
LOCAL_C_INCLUDES:= \
|
||||
$(LOCAL_PATH)/platform_lib_abstractions
|
||||
|
||||
LOCAL_COPY_HEADERS_TO:= gps.utils/
|
||||
LOCAL_COPY_HEADERS:= \
|
||||
loc_log.h \
|
||||
loc_cfg.h \
|
||||
log_util.h \
|
||||
linked_list.h \
|
||||
msg_q.h \
|
||||
MsgTask.h \
|
||||
LocHeap.h \
|
||||
LocThread.h \
|
||||
LocTimer.h \
|
||||
loc_target.h \
|
||||
loc_timer.h \
|
||||
LocSharedLock.h \
|
||||
platform_lib_abstractions/platform_lib_includes.h \
|
||||
platform_lib_abstractions/platform_lib_time.h \
|
||||
platform_lib_abstractions/platform_lib_macros.h \
|
||||
loc_misc_utils.h
|
||||
|
||||
LOCAL_MODULE := libgps.utils
|
||||
LOCAL_CLANG := false
|
||||
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
|
||||
LOCAL_PRELINK_MODULE := false
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
endif # not BUILD_TINY_ANDROID
|
||||
endif # BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE
|
354
gps/utils/LocHeap.cpp
Normal file
354
gps/utils/LocHeap.cpp
Normal file
@ -0,0 +1,354 @@
|
||||
/* Copyright (c) 2015, 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 <LocHeap.h>
|
||||
|
||||
class LocHeapNode {
|
||||
friend class LocHeap;
|
||||
|
||||
// size of of the subtree, excluding self, 1 if no subtree
|
||||
int mSize;
|
||||
LocHeapNode* mLeft;
|
||||
LocHeapNode* mRight;
|
||||
LocRankable* mData;
|
||||
public:
|
||||
inline LocHeapNode(LocRankable& data) :
|
||||
mSize(1), mLeft(NULL), mRight(NULL), mData(&data) {}
|
||||
~LocHeapNode();
|
||||
|
||||
// this only swaps the data of the two nodes, so no
|
||||
// detach / re-attached is necessary
|
||||
void swap(LocHeapNode& node);
|
||||
|
||||
LocRankable* detachData();
|
||||
|
||||
// push a node into the tree stucture, keeping sorted by rank
|
||||
void push(LocHeapNode& node);
|
||||
|
||||
// pop the head node out of the tree stucture. keeping sorted by rank
|
||||
static LocHeapNode* pop(LocHeapNode*& top);
|
||||
|
||||
// remove a specific node from the tree
|
||||
// returns the pointer to the node removed, which would be either the
|
||||
// same as input (if successfully removed); or NULL (if failed).
|
||||
static LocHeapNode* remove(LocHeapNode*& top, LocRankable& data);
|
||||
|
||||
// convenience method to compare data ranking
|
||||
inline bool outRanks(LocHeapNode& node) { return mData->outRanks(*node.mData); }
|
||||
inline bool outRanks(LocRankable& data) { return mData->outRanks(data); }
|
||||
|
||||
// checks if mSize is correct, AND this node is the highest ranking
|
||||
// of the entire subtree
|
||||
bool checkNodes();
|
||||
|
||||
inline int getSize() { return mSize; }
|
||||
};
|
||||
|
||||
inline
|
||||
LocHeapNode::~LocHeapNode() {
|
||||
if (mLeft) {
|
||||
delete mLeft;
|
||||
mLeft = NULL;
|
||||
}
|
||||
if (mRight) {
|
||||
delete mRight;
|
||||
mRight = NULL;
|
||||
}
|
||||
if (mData) {
|
||||
mData = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
inline
|
||||
void LocHeapNode::swap(LocHeapNode& node) {
|
||||
LocRankable* tmpData = node.mData;
|
||||
node.mData = mData;
|
||||
mData = tmpData;
|
||||
}
|
||||
|
||||
inline
|
||||
LocRankable* LocHeapNode::detachData() {
|
||||
LocRankable* data = mData;
|
||||
mData = NULL;
|
||||
return data;
|
||||
}
|
||||
|
||||
// push keeps the tree sorted by rank, it also tries to balance the
|
||||
// tree by adding the new node to the smaller of the subtrees.
|
||||
// The pointer to the tree and internal links never change. If the
|
||||
// mData of tree top ranks lower than that of the incoming node,
|
||||
// mData will be swapped with that of the incoming node to ensure
|
||||
// ranking, no restructuring the container nodes.
|
||||
void LocHeapNode::push(LocHeapNode& node) {
|
||||
// ensure the current node ranks higher than in the incoming one
|
||||
if (node.outRanks(*this)) {
|
||||
swap(node);
|
||||
}
|
||||
|
||||
// now drop the new node (ensured lower than *this) into a subtree
|
||||
if (NULL == mLeft) {
|
||||
mLeft = &node;
|
||||
} else if (NULL == mRight) {
|
||||
mRight = &node;
|
||||
} else if (mLeft->mSize <= mRight->mSize) {
|
||||
mLeft->push(node);
|
||||
} else {
|
||||
mRight->push(node);
|
||||
}
|
||||
mSize++;
|
||||
}
|
||||
|
||||
// pop keeps the tree sorted by rank, but it does not try to balance
|
||||
// the tree. It recursively swaps with the higher ranked top of the
|
||||
// subtrees.
|
||||
// The return is a popped out node from leaf level, that has the data
|
||||
// swapped all the way down from the top. The pinter to the tree and
|
||||
// internal links will not be changed or restructured, except for the
|
||||
// node that is popped out.
|
||||
// If the return pointer == this, this the last node in the tree.
|
||||
LocHeapNode* LocHeapNode::pop(LocHeapNode*& top) {
|
||||
// we know the top has the highest ranking at this point, else
|
||||
// the tree is broken. This top will be popped out. But we need
|
||||
// a node from the left or right child, whichever ranks higher,
|
||||
// to replace the current top. This then will need to be done
|
||||
// recursively to the leaf level. So we swap the mData of the
|
||||
// current top node all the way down to the leaf level.
|
||||
LocHeapNode* poppedNode = top;
|
||||
// top is losing a node in its subtree
|
||||
top->mSize--;
|
||||
if (top->mLeft || top->mRight) {
|
||||
// if mLeft is NULL, mRight for sure is NOT NULL, take that;
|
||||
// else if mRight is NULL, mLeft for sure is NOT, take that;
|
||||
// else we take the address of whatever has higher ranking mData
|
||||
LocHeapNode*& subTop = (NULL == top->mLeft) ? top->mRight :
|
||||
((NULL == top->mRight) ? top->mLeft :
|
||||
(top->mLeft->outRanks(*(top->mRight)) ? top->mLeft : top->mRight));
|
||||
// swap mData, the tree top gets updated with the new data.
|
||||
top->swap(*subTop);
|
||||
// pop out from the subtree
|
||||
poppedNode = pop(subTop);
|
||||
} else {
|
||||
// if the top has only single node
|
||||
// detach the poppedNode from the tree
|
||||
// subTop is the reference of ether mLeft or mRight
|
||||
// NOT a local stack pointer. so it MUST be NULL'ed here.
|
||||
top = NULL;
|
||||
}
|
||||
|
||||
return poppedNode;
|
||||
}
|
||||
|
||||
// navigating through the tree and find the node that hass the input
|
||||
// data. Since this is a heap, we do recursive linear search.
|
||||
// returns the pointer to the node removed, which would be either the
|
||||
// same as input (if successfully removed); or NULL (if failed).
|
||||
LocHeapNode* LocHeapNode::remove(LocHeapNode*& top, LocRankable& data) {
|
||||
LocHeapNode* removedNode = NULL;
|
||||
// this is the node, by address
|
||||
if (&data == (LocRankable*)(top->mData)) {
|
||||
// pop this node out
|
||||
removedNode = pop(top);
|
||||
} else if (!data.outRanks(*top->mData)) {
|
||||
// subtrees might have this node
|
||||
if (top->mLeft) {
|
||||
removedNode = remove(top->mLeft, data);
|
||||
}
|
||||
// if we did not find in mLeft, and mRight is not empty
|
||||
if (!removedNode && top->mRight) {
|
||||
removedNode = remove(top->mRight, data);
|
||||
}
|
||||
|
||||
// top lost a node in its subtree
|
||||
if (removedNode) {
|
||||
top->mSize--;
|
||||
}
|
||||
}
|
||||
|
||||
return removedNode;
|
||||
}
|
||||
|
||||
// checks if mSize is correct, AND this node is the highest ranking
|
||||
// of the entire subtree
|
||||
bool LocHeapNode::checkNodes() {
|
||||
// size of the current subtree
|
||||
int totalSize = mSize;
|
||||
if (mLeft) {
|
||||
// check the consistency of left subtree
|
||||
if (mLeft->outRanks(*this) || !mLeft->checkNodes()) {
|
||||
return false;
|
||||
}
|
||||
// subtract the size of left subtree (with subtree head)
|
||||
totalSize -= mLeft->mSize;
|
||||
}
|
||||
|
||||
if (mRight) {
|
||||
// check the consistency of right subtree
|
||||
if (mRight->outRanks(*this) || !mRight->checkNodes()) {
|
||||
return false;
|
||||
}
|
||||
// subtract the size of right subtree (with subtree head)
|
||||
totalSize -= mRight->mSize;
|
||||
}
|
||||
|
||||
// for the tree nodes to consistent, totalSize must be 1 now
|
||||
return totalSize == 1;
|
||||
}
|
||||
|
||||
LocHeap::~LocHeap() {
|
||||
if (mTree) {
|
||||
delete mTree;
|
||||
}
|
||||
}
|
||||
|
||||
void LocHeap::push(LocRankable& node) {
|
||||
LocHeapNode* heapNode = new LocHeapNode(node);
|
||||
if (!mTree) {
|
||||
mTree = heapNode;
|
||||
} else {
|
||||
mTree->push(*heapNode);
|
||||
}
|
||||
}
|
||||
|
||||
LocRankable* LocHeap::peek() {
|
||||
LocRankable* top = NULL;
|
||||
if (mTree) {
|
||||
top = mTree->mData;
|
||||
}
|
||||
return top;
|
||||
}
|
||||
|
||||
LocRankable* LocHeap::pop() {
|
||||
LocRankable* locNode = NULL;
|
||||
if (mTree) {
|
||||
// mTree may become NULL after this call
|
||||
LocHeapNode* heapNode = LocHeapNode::pop(mTree);
|
||||
locNode = heapNode->detachData();
|
||||
delete heapNode;
|
||||
}
|
||||
return locNode;
|
||||
}
|
||||
|
||||
LocRankable* LocHeap::remove(LocRankable& rankable) {
|
||||
LocRankable* locNode = NULL;
|
||||
if (mTree) {
|
||||
// mTree may become NULL after this call
|
||||
LocHeapNode* heapNode = LocHeapNode::remove(mTree, rankable);
|
||||
if (heapNode) {
|
||||
locNode = heapNode->detachData();
|
||||
delete heapNode;
|
||||
}
|
||||
}
|
||||
return locNode;
|
||||
}
|
||||
|
||||
#ifdef __LOC_UNIT_TEST__
|
||||
bool LocHeap::checkTree() {
|
||||
return ((NULL == mTree) || mTree->checkNodes());
|
||||
}
|
||||
uint32_t LocHeap::getTreeSize() {
|
||||
return (NULL == mTree) ? 0 : mTree->getSize();
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __LOC_DEBUG__
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
class LocHeapDebug : public LocHeap {
|
||||
public:
|
||||
bool checkTree() {
|
||||
return ((NULL == mTree) || mTree->checkNodes());
|
||||
}
|
||||
|
||||
uint32_t getTreeSize() {
|
||||
return (NULL == mTree) ? 0 : (mTree->getSize());
|
||||
}
|
||||
};
|
||||
|
||||
class LocHeapDebugData : public LocRankable {
|
||||
const int mID;
|
||||
public:
|
||||
LocHeapDebugData(int id) : mID(id) {}
|
||||
inline virtual int ranks(LocRankable& rankable) {
|
||||
LocHeapDebugData* testData = dynamic_cast<LocHeapDebugData*>(&rankable);
|
||||
return testData->mID - mID;
|
||||
}
|
||||
};
|
||||
|
||||
// For Linux command line testing:
|
||||
// compilation: g++ -D__LOC_HOST_DEBUG__ -D__LOC_DEBUG__ -g -I. -I../../../../vendor/qcom/proprietary/gps-internal/unit-tests/fakes_for_host -I../../../../system/core/include LocHeap.cpp
|
||||
// test: valgrind --leak-check=full ./a.out 100
|
||||
int main(int argc, char** argv) {
|
||||
srand(time(NULL));
|
||||
int tries = atoi(argv[1]);
|
||||
int checks = tries >> 3;
|
||||
LocHeapDebug heap;
|
||||
int treeSize = 0;
|
||||
|
||||
for (int i = 0; i < tries; i++) {
|
||||
if (i % checks == 0 && !heap.checkTree()) {
|
||||
printf("tree check failed before %dth op\n", i);
|
||||
}
|
||||
int r = rand();
|
||||
|
||||
if (r & 1) {
|
||||
LocHeapDebugData* data = new LocHeapDebugData(r >> 1);
|
||||
heap.push(dynamic_cast<LocRankable&>(*data));
|
||||
treeSize++;
|
||||
} else {
|
||||
LocRankable* rankable = heap.pop();
|
||||
if (rankable) {
|
||||
delete rankable;
|
||||
}
|
||||
treeSize ? treeSize-- : 0;
|
||||
}
|
||||
|
||||
printf("%s: %d == %d\n", (r&1)?"push":"pop", treeSize, heap.getTreeSize());
|
||||
if (treeSize != heap.getTreeSize()) {
|
||||
printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
|
||||
tries = i+1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!heap.checkTree()) {
|
||||
printf("!!!!!!!!!!tree check failed at the end after %d ops!!!!!!!\n", tries);
|
||||
} else {
|
||||
printf("success!\n");
|
||||
}
|
||||
|
||||
for (LocRankable* data = heap.pop(); NULL != data; data = heap.pop()) {
|
||||
delete data;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
96
gps/utils/LocHeap.h
Normal file
96
gps/utils/LocHeap.h
Normal file
@ -0,0 +1,96 @@
|
||||
/* Copyright (c) 2015, 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_HEAP__
|
||||
#define __LOC_HEAP__
|
||||
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
|
||||
// abstract class to be implemented by client to provide a rankable class
|
||||
class LocRankable {
|
||||
public:
|
||||
virtual inline ~LocRankable() {}
|
||||
|
||||
// method to rank objects of such type for sorting purposes.
|
||||
// The pointer of the input node would be stored in the heap.
|
||||
// >0 if ranks higher than the input;
|
||||
// ==0 if equally ranks with the input;
|
||||
// <0 if ranks lower than the input
|
||||
virtual int ranks(LocRankable& rankable) = 0;
|
||||
|
||||
// convenient method to rank objects of such type for sorting purposes.
|
||||
inline bool outRanks(LocRankable& rankable) { return ranks(rankable) > 0; }
|
||||
};
|
||||
|
||||
// opaque class to provide service implementation.
|
||||
class LocHeapNode;
|
||||
|
||||
// a heap whose left and right children are not sorted. It is sorted only vertically,
|
||||
// i.e. parent always ranks higher than children, if they exist. Ranking algorithm is
|
||||
// implemented in Rankable. The reason that there is no sort between children is to
|
||||
// help beter balance the tree with lower cost. When a node is pushed to the tree,
|
||||
// it is guaranteed that the subtree that is smaller gets to have the new node.
|
||||
class LocHeap {
|
||||
protected:
|
||||
LocHeapNode* mTree;
|
||||
public:
|
||||
inline LocHeap() : mTree(NULL) {}
|
||||
~LocHeap();
|
||||
|
||||
// push keeps the tree sorted by rank, it also tries to balance the
|
||||
// tree by adding the new node to the smaller of the subtrees.
|
||||
// node is reference to an obj that is managed by client, that client
|
||||
// creates and destroyes. The destroy should happen after the
|
||||
// node is popped out from the heap.
|
||||
void push(LocRankable& node);
|
||||
|
||||
// Peeks the node data on tree top, which has currently the highest ranking
|
||||
// There is no change the tree structure with this operation
|
||||
// Returns NULL if the tree is empty, otherwise pointer to the node data of
|
||||
// the tree top.
|
||||
LocRankable* peek();
|
||||
|
||||
// pop keeps the tree sorted by rank, but it does not try to balance
|
||||
// the tree.
|
||||
// Return - pointer to the node popped out, or NULL if heap is already empty
|
||||
LocRankable* pop();
|
||||
|
||||
// navigating through the tree and find the node that ranks the same
|
||||
// as the input data, then remove it from the tree. Rank is implemented
|
||||
// by rankable obj.
|
||||
// returns the pointer to the node removed; or NULL (if failed).
|
||||
LocRankable* remove(LocRankable& rankable);
|
||||
|
||||
#ifdef __LOC_UNIT_TEST__
|
||||
bool checkTree();
|
||||
uint32_t getTreeSize();
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif //__LOC_HEAP__
|
59
gps/utils/LocSharedLock.h
Normal file
59
gps/utils/LocSharedLock.h
Normal file
@ -0,0 +1,59 @@
|
||||
/* Copyright (c) 2015, 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_SHARED_LOCK__
|
||||
#define __LOC_SHARED_LOCK__
|
||||
|
||||
#include <stddef.h>
|
||||
#include <cutils/atomic.h>
|
||||
#include <pthread.h>
|
||||
|
||||
// This is a utility created for use cases such that there are more than
|
||||
// one client who need to share the same lock, but it is not predictable
|
||||
// which of these clients is to last to go away. This shared lock deletes
|
||||
// itself when the last client calls its drop() method. To add a cient,
|
||||
// this share lock's share() method has to be called, so that the obj
|
||||
// can maintain an accurate client count.
|
||||
class LocSharedLock {
|
||||
volatile int32_t mRef;
|
||||
pthread_mutex_t mMutex;
|
||||
inline ~LocSharedLock() { pthread_mutex_destroy(&mMutex); }
|
||||
public:
|
||||
// first client to create this LockSharedLock
|
||||
inline LocSharedLock() : mRef(1) { pthread_mutex_init(&mMutex, NULL); }
|
||||
// following client(s) are to *share()* this lock created by the first client
|
||||
inline LocSharedLock* share() { android_atomic_inc(&mRef); return this; }
|
||||
// whe a client no longer needs this shared lock, drop() shall be called.
|
||||
inline void drop() { if (1 == android_atomic_dec(&mRef)) delete this; }
|
||||
// locking the lock to enter critical section
|
||||
inline void lock() { pthread_mutex_lock(&mMutex); }
|
||||
// unlocking the lock to leave the critical section
|
||||
inline void unlock() { pthread_mutex_unlock(&mMutex); }
|
||||
};
|
||||
|
||||
#endif //__LOC_SHARED_LOCK__
|
264
gps/utils/LocThread.cpp
Normal file
264
gps/utils/LocThread.cpp
Normal file
@ -0,0 +1,264 @@
|
||||
/* Copyright (c) 2015, 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 <LocThread.h>
|
||||
#include <string.h>
|
||||
#include <pthread.h>
|
||||
|
||||
class LocThreadDelegate {
|
||||
LocRunnable* mRunnable;
|
||||
bool mJoinable;
|
||||
pthread_t mThandle;
|
||||
pthread_mutex_t mMutex;
|
||||
int mRefCount;
|
||||
~LocThreadDelegate();
|
||||
LocThreadDelegate(LocThread::tCreate creator, const char* threadName,
|
||||
LocRunnable* runnable, bool joinable);
|
||||
void destroy();
|
||||
public:
|
||||
static LocThreadDelegate* create(LocThread::tCreate creator,
|
||||
const char* threadName, LocRunnable* runnable, bool joinable);
|
||||
void stop();
|
||||
// bye() is for the parent thread to go away. if joinable,
|
||||
// parent must stop the spawned thread, join, and then
|
||||
// destroy(); if detached, the parent can go straight
|
||||
// ahead to destroy()
|
||||
inline void bye() { mJoinable ? stop() : destroy(); }
|
||||
inline bool isRunning() { return (NULL != mRunnable); }
|
||||
static void* threadMain(void* arg);
|
||||
};
|
||||
|
||||
// it is important to note that internal members must be
|
||||
// initialized to values as if pthread_create succeeds.
|
||||
// This is to avoid the race condition between the threads,
|
||||
// once the thread is created, some of these values will
|
||||
// be check in the spawned thread, and must set correctly
|
||||
// then and there.
|
||||
// However, upon pthread_create failure, the data members
|
||||
// must be set to indicate failure, e.g. mRunnable, and
|
||||
// threashold approprietly for destroy(), e.g. mRefCount.
|
||||
LocThreadDelegate::LocThreadDelegate(LocThread::tCreate creator,
|
||||
const char* threadName, LocRunnable* runnable, bool joinable) :
|
||||
mRunnable(runnable), mJoinable(joinable), mThandle(NULL),
|
||||
mMutex(PTHREAD_MUTEX_INITIALIZER), mRefCount(2) {
|
||||
|
||||
// set up thread name, if nothing is passed in
|
||||
if (!threadName) {
|
||||
threadName = "LocThread";
|
||||
}
|
||||
|
||||
// create the thread here, then if successful
|
||||
// and a name is given, we set the thread name
|
||||
if (creator) {
|
||||
mThandle = creator(threadName, threadMain, this);
|
||||
} else if (pthread_create(&mThandle, NULL, threadMain, this)) {
|
||||
// pthread_create() failed
|
||||
mThandle = NULL;
|
||||
}
|
||||
|
||||
if (mThandle) {
|
||||
// set thread name
|
||||
char lname[16];
|
||||
int len = sizeof(lname) - 1;
|
||||
memcpy(lname, threadName, len);
|
||||
lname[len] = 0;
|
||||
// set the thread name here
|
||||
pthread_setname_np(mThandle, lname);
|
||||
|
||||
// detach, if not joinable
|
||||
if (!joinable) {
|
||||
pthread_detach(mThandle);
|
||||
}
|
||||
} else {
|
||||
// must set these values upon failure
|
||||
mRunnable = NULL;
|
||||
mJoinable = false;
|
||||
mRefCount = 1;
|
||||
}
|
||||
}
|
||||
|
||||
inline
|
||||
LocThreadDelegate::~LocThreadDelegate() {
|
||||
// at this point nothing should need done any more
|
||||
}
|
||||
|
||||
// factory method so that we could return NULL upon failure
|
||||
LocThreadDelegate* LocThreadDelegate::create(LocThread::tCreate creator,
|
||||
const char* threadName, LocRunnable* runnable, bool joinable) {
|
||||
LocThreadDelegate* thread = NULL;
|
||||
if (runnable) {
|
||||
thread = new LocThreadDelegate(creator, threadName, runnable, joinable);
|
||||
if (thread && !thread->isRunning()) {
|
||||
thread->destroy();
|
||||
thread = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return thread;
|
||||
}
|
||||
|
||||
// The order is importang
|
||||
// NULLing mRunnalbe stops the while loop in threadMain()
|
||||
// join() if mJoinble must come before destroy() call, as
|
||||
// the obj must remain alive at this time so that mThandle
|
||||
// remains valud.
|
||||
void LocThreadDelegate::stop() {
|
||||
// mRunnable and mJoinable are reset on different triggers.
|
||||
// mRunnable may get nulled on the spawned thread's way out;
|
||||
// or here.
|
||||
// mJouinable (if ever been true) gets falsed when client
|
||||
// thread triggers stop, with either a stop()
|
||||
// call or the client releases thread obj handle.
|
||||
if (mRunnable) {
|
||||
mRunnable = NULL;
|
||||
}
|
||||
if (mJoinable) {
|
||||
mJoinable = false;
|
||||
pthread_join(mThandle, NULL);
|
||||
}
|
||||
// call destroy() to possibly delete the obj
|
||||
destroy();
|
||||
}
|
||||
|
||||
// method for clients to call to release the obj
|
||||
// when it is a detached thread, the client thread
|
||||
// and the spawned thread can both try to destroy()
|
||||
// asynchronously. And we delete this obj when
|
||||
// mRefCount becomes 0.
|
||||
void LocThreadDelegate::destroy() {
|
||||
// else case shouldn't happen, unless there is a
|
||||
// leaking obj. But only our code here has such
|
||||
// obj, so if we test our code well, else case
|
||||
// will never happen
|
||||
if (mRefCount > 0) {
|
||||
// we need a flag on the stack
|
||||
bool callDelete = false;
|
||||
|
||||
// critical section between threads
|
||||
pthread_mutex_lock(&mMutex);
|
||||
// last destroy() call
|
||||
callDelete = (1 == mRefCount--);
|
||||
pthread_mutex_unlock(&mMutex);
|
||||
|
||||
// upon last destroy() call we delete this obj
|
||||
if (callDelete) {
|
||||
delete this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void* LocThreadDelegate::threadMain(void* arg) {
|
||||
LocThreadDelegate* locThread = (LocThreadDelegate*)(arg);
|
||||
|
||||
if (locThread) {
|
||||
LocRunnable* runnable = locThread->mRunnable;
|
||||
|
||||
if (runnable) {
|
||||
if (locThread->isRunning()) {
|
||||
runnable->prerun();
|
||||
}
|
||||
|
||||
while (locThread->isRunning() && runnable->run());
|
||||
|
||||
if (locThread->isRunning()) {
|
||||
runnable->postrun();
|
||||
}
|
||||
|
||||
// at this time, locThread->mRunnable may or may not be NULL
|
||||
// NULL it just to be safe and clean, as we want the field
|
||||
// in the released memory slot to be NULL.
|
||||
locThread->mRunnable = NULL;
|
||||
delete runnable;
|
||||
}
|
||||
locThread->destroy();
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
LocThread::~LocThread() {
|
||||
if (mThread) {
|
||||
mThread->bye();
|
||||
mThread = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
bool LocThread::start(tCreate creator, const char* threadName, LocRunnable* runnable, bool joinable) {
|
||||
bool success = false;
|
||||
if (!mThread) {
|
||||
mThread = LocThreadDelegate::create(creator, threadName, runnable, joinable);
|
||||
// true only if thread is created successfully
|
||||
success = (NULL != mThread);
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
void LocThread::stop() {
|
||||
if (mThread) {
|
||||
mThread->stop();
|
||||
mThread = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __LOC_DEBUG__
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
class LocRunnableTest1 : public LocRunnable {
|
||||
int mID;
|
||||
public:
|
||||
LocRunnableTest1(int id) : LocRunnable(), mID(id) {}
|
||||
virtual bool run() {
|
||||
printf("LocRunnableTest1: %d\n", mID++);
|
||||
sleep(1);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
// on linux command line:
|
||||
// compile: g++ -D__LOC_HOST_DEBUG__ -D__LOC_DEBUG__ -g -std=c++0x -I. -I../../../../vendor/qcom/proprietary/gps-internal/unit-tests/fakes_for_host -I../../../../system/core/include -lpthread LocThread.cpp
|
||||
// test detached thread: valgrind ./a.out 0
|
||||
// test joinable thread: valgrind ./a.out 1
|
||||
int main(int argc, char** argv) {
|
||||
LocRunnableTest1 test(10);
|
||||
|
||||
LocThread thread;
|
||||
thread.start("LocThreadTest", test, atoi(argv[1]));
|
||||
|
||||
sleep(10);
|
||||
|
||||
thread.stop();
|
||||
|
||||
sleep(5);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
92
gps/utils/LocThread.h
Normal file
92
gps/utils/LocThread.h
Normal file
@ -0,0 +1,92 @@
|
||||
/* Copyright (c) 2015, 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_THREAD__
|
||||
#define __LOC_THREAD__
|
||||
|
||||
#include <stddef.h>
|
||||
#include <pthread.h>
|
||||
|
||||
// abstract class to be implemented by client to provide a runnable class
|
||||
// which gets scheduled by LocThread
|
||||
class LocRunnable {
|
||||
public:
|
||||
inline LocRunnable() {}
|
||||
inline virtual ~LocRunnable() {}
|
||||
|
||||
// The method to be implemented by thread clients
|
||||
// and be scheduled by LocThread
|
||||
// This method will be repeated called until it returns false; or
|
||||
// until thread is stopped.
|
||||
virtual bool run() = 0;
|
||||
|
||||
// The method to be run before thread loop (conditionally repeatedly)
|
||||
// calls run()
|
||||
inline virtual void prerun() {}
|
||||
|
||||
// The method to be run after thread loop (conditionally repeatedly)
|
||||
// calls run()
|
||||
inline virtual void postrun() {}
|
||||
};
|
||||
|
||||
// opaque class to provide service implementation.
|
||||
class LocThreadDelegate;
|
||||
|
||||
// A utility class to create a thread and run LocRunnable
|
||||
// caller passes in.
|
||||
class LocThread {
|
||||
LocThreadDelegate* mThread;
|
||||
public:
|
||||
inline LocThread() : mThread(NULL) {}
|
||||
virtual ~LocThread();
|
||||
|
||||
typedef pthread_t (*tCreate)(const char* name, void* (*start)(void*), void* arg);
|
||||
// client starts thread with a runnable, which implements
|
||||
// the logics to fun in the created thread context.
|
||||
// The thread could be either joinable or detached.
|
||||
// runnable is an obj managed by client. Client creates and
|
||||
// frees it (but must be after stop() is called, or
|
||||
// this LocThread obj is deleted).
|
||||
// The obj will be deleted by LocThread if start()
|
||||
// returns true. Else it is client's responsibility
|
||||
// to delete the object
|
||||
// Returns 0 if success; false if failure.
|
||||
bool start(tCreate creator, const char* threadName, LocRunnable* runnable, bool joinable = true);
|
||||
inline bool start(const char* threadName, LocRunnable* runnable, bool joinable = true) {
|
||||
return start(NULL, threadName, runnable, joinable);
|
||||
}
|
||||
|
||||
// NOTE: if this is a joinable thread, this stop may block
|
||||
// for a while until the thread is joined.
|
||||
void stop();
|
||||
|
||||
// thread status check
|
||||
inline bool isRunning() { return NULL != mThread; }
|
||||
};
|
||||
|
||||
#endif //__LOC_THREAD__
|
737
gps/utils/LocTimer.cpp
Normal file
737
gps/utils/LocTimer.cpp
Normal file
@ -0,0 +1,737 @@
|
||||
/* Copyright (c) 2015, 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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
#include <loc_timer.h>
|
||||
#include <sys/timerfd.h>
|
||||
#include <sys/epoll.h>
|
||||
#include <LocTimer.h>
|
||||
#include <LocHeap.h>
|
||||
#include <LocThread.h>
|
||||
#include <LocSharedLock.h>
|
||||
#include <MsgTask.h>
|
||||
|
||||
#ifdef __HOST_UNIT_TEST__
|
||||
#define EPOLLWAKEUP 0
|
||||
#define CLOCK_BOOTTIME CLOCK_MONOTONIC
|
||||
#define CLOCK_BOOTTIME_ALARM CLOCK_MONOTONIC
|
||||
#endif
|
||||
|
||||
/*
|
||||
There are implementations of 5 classes in this file:
|
||||
LocTimer, LocTimerDelegate, LocTimerContainer, LocTimerPollTask, LocTimerWrapper
|
||||
|
||||
LocTimer - client front end, interface for client to start / stop timers, also
|
||||
to provide a callback.
|
||||
LocTimerDelegate - an internal timer entity, which also is a LocRankable obj.
|
||||
Its life cycle is different than that of LocTimer. It gets
|
||||
created when LocTimer::start() is called, and gets deleted
|
||||
when it expires or clients calls the hosting LocTimer obj's
|
||||
stop() method. When a LocTimerDelegate obj is ticking, it
|
||||
stays in the corresponding LocTimerContainer. When expired
|
||||
or stopped, the obj is removed from the container. Since it
|
||||
is also a LocRankable obj, and LocTimerContainer also is a
|
||||
heap, its ranks() implementation decides where it is placed
|
||||
in the heap.
|
||||
LocTimerContainer - core of the timer service. It is a container (derived from
|
||||
LocHeap) for LocTimerDelegate (implements LocRankable) objs.
|
||||
There are 2 of such containers, one for sw timers (or Linux
|
||||
timers) one for hw timers (or Linux alarms). It adds one of
|
||||
each (those that expire the soonest) to kernel via services
|
||||
provided by LocTimerPollTask. All the heap management on the
|
||||
LocTimerDelegate objs are done in the MsgTask context, such
|
||||
that synchronization is ensured.
|
||||
LocTimerPollTask - is a class that wraps timerfd and epoll POXIS APIs. It also
|
||||
both implements LocRunnalbe with epoll_wait() in the run()
|
||||
method. It is also a LocThread client, so as to loop the run
|
||||
method.
|
||||
LocTimerWrapper - a LocTimer client itself, to implement the existing C API with
|
||||
APIs, loc_timer_start() and loc_timer_stop().
|
||||
|
||||
*/
|
||||
|
||||
class LocTimerPollTask;
|
||||
|
||||
// This is a multi-functaional class that:
|
||||
// * extends the LocHeap class for the detection of head update upon add / remove
|
||||
// events. When that happens, soonest time out changes, so timerfd needs update.
|
||||
// * contains the timers, and add / remove them into the heap
|
||||
// * provides and maps 2 of such containers, one for timers (or mSwTimers), one
|
||||
// for alarms (or mHwTimers);
|
||||
// * provides a polling thread;
|
||||
// * provides a MsgTask thread for synchronized add / remove / timer client callback.
|
||||
class LocTimerContainer : public LocHeap {
|
||||
// mutex to synchronize getters of static members
|
||||
static pthread_mutex_t mMutex;
|
||||
// Container of timers
|
||||
static LocTimerContainer* mSwTimers;
|
||||
// Container of alarms
|
||||
static LocTimerContainer* mHwTimers;
|
||||
// Msg task to provider msg Q, sender and reader.
|
||||
static MsgTask* mMsgTask;
|
||||
// Poll task to provide epoll call and threading to poll.
|
||||
static LocTimerPollTask* mPollTask;
|
||||
// timer / alarm fd
|
||||
int mDevFd;
|
||||
// ctor
|
||||
LocTimerContainer(bool wakeOnExpire);
|
||||
// dtor
|
||||
~LocTimerContainer();
|
||||
static MsgTask* getMsgTaskLocked();
|
||||
static LocTimerPollTask* getPollTaskLocked();
|
||||
// extend LocHeap and pop if the top outRanks input
|
||||
LocTimerDelegate* popIfOutRanks(LocTimerDelegate& timer);
|
||||
// update the timer POSIX calls with updated soonest timer spec
|
||||
void updateSoonestTime(LocTimerDelegate* priorTop);
|
||||
|
||||
public:
|
||||
// factory method to control the creation of mSwTimers / mHwTimers
|
||||
static LocTimerContainer* get(bool wakeOnExpire);
|
||||
|
||||
LocTimerDelegate* getSoonestTimer();
|
||||
int getTimerFd();
|
||||
// add a timer / alarm obj into the container
|
||||
void add(LocTimerDelegate& timer);
|
||||
// remove a timer / alarm obj from the container
|
||||
void remove(LocTimerDelegate& timer);
|
||||
// handling of timer / alarm expiration
|
||||
void expire();
|
||||
};
|
||||
|
||||
// This class implements the polling thread that epolls imer / alarm fds.
|
||||
// The LocRunnable::run() contains the actual polling. The other methods
|
||||
// will be run in the caller's thread context to add / remove timer / alarm
|
||||
// fds the kernel, while the polling is blocked on epoll_wait() call.
|
||||
// Since the design is that we have maximally 2 polls, one for all the
|
||||
// timers; one for all the alarms, we will poll at most on 2 fds. But it
|
||||
// is possile that all we have are only timers or alarms at one time, so we
|
||||
// allow dynamically add / remove fds we poll on. The design decision of
|
||||
// having 1 fd per container of timer / alarm is such that, we may not need
|
||||
// to make a system call each time a timer / alarm is added / removed, unless
|
||||
// that changes the "soonest" time out of that of all the timers / alarms.
|
||||
class LocTimerPollTask : public LocRunnable {
|
||||
// the epoll fd
|
||||
const int mFd;
|
||||
// the thread that calls run() method
|
||||
LocThread* mThread;
|
||||
friend class LocThreadDelegate;
|
||||
// dtor
|
||||
~LocTimerPollTask();
|
||||
public:
|
||||
// ctor
|
||||
LocTimerPollTask();
|
||||
// this obj will be deleted once thread is deleted
|
||||
void destroy();
|
||||
// add a container of timers. Each contain has a unique device fd, i.e.
|
||||
// either timer or alarm fd, and a heap of timers / alarms. It is expected
|
||||
// that container would have written to the device fd with the soonest
|
||||
// time out value in the heap at the time of calling this method. So all
|
||||
// this method does is to add the fd of the input container to the poll
|
||||
// and also add the pointer of the container to the event data ptr, such
|
||||
// when poll_wait wakes up on events, we know who is the owner of the fd.
|
||||
void addPoll(LocTimerContainer& timerContainer);
|
||||
// remove a fd that is assciated with a container. The expectation is that
|
||||
// the atual timer would have been removed from the container.
|
||||
void removePoll(LocTimerContainer& timerContainer);
|
||||
// The polling thread context will call this method. This is where
|
||||
// epoll_wait() is blocking and waiting for events..
|
||||
virtual bool run();
|
||||
};
|
||||
|
||||
// Internal class of timer obj. It gets born when client calls LocTimer::start();
|
||||
// and gets deleted when client calls LocTimer::stop() or when the it expire()'s.
|
||||
// This class implements LocRankable::ranks() so that when an obj is added into
|
||||
// the container (of LocHeap), it gets placed in sorted order.
|
||||
class LocTimerDelegate : public LocRankable {
|
||||
friend class LocTimerContainer;
|
||||
friend class LocTimer;
|
||||
LocTimer* mClient;
|
||||
LocSharedLock* mLock;
|
||||
struct timespec mFutureTime;
|
||||
LocTimerContainer* mContainer;
|
||||
// not a complete obj, just ctor for LocRankable comparisons
|
||||
inline LocTimerDelegate(struct timespec& delay)
|
||||
: mClient(NULL), mLock(NULL), mFutureTime(delay), mContainer(NULL) {}
|
||||
inline ~LocTimerDelegate() { if (mLock) { mLock->drop(); mLock = NULL; } }
|
||||
public:
|
||||
LocTimerDelegate(LocTimer& client, struct timespec& futureTime, bool wakeOnExpire);
|
||||
void destroyLocked();
|
||||
// LocRankable virtual method
|
||||
virtual int ranks(LocRankable& rankable);
|
||||
void expire();
|
||||
inline struct timespec getFutureTime() { return mFutureTime; }
|
||||
};
|
||||
|
||||
/***************************LocTimerContainer methods***************************/
|
||||
|
||||
// Most of these static recources are created on demand. They however are never
|
||||
// destoyed. The theory is that there are processes that link to this util lib
|
||||
// but never use timer, then these resources would never need to be created.
|
||||
// For those processes that do use timer, it will likely also need to every
|
||||
// once in a while. It might be cheaper keeping them around.
|
||||
pthread_mutex_t LocTimerContainer::mMutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
LocTimerContainer* LocTimerContainer::mSwTimers = NULL;
|
||||
LocTimerContainer* LocTimerContainer::mHwTimers = NULL;
|
||||
MsgTask* LocTimerContainer::mMsgTask = NULL;
|
||||
LocTimerPollTask* LocTimerContainer::mPollTask = NULL;
|
||||
|
||||
// ctor - initialize timer heaps
|
||||
// A container for swTimer (timer) is created, when wakeOnExpire is true; or
|
||||
// HwTimer (alarm), when wakeOnExpire is false.
|
||||
LocTimerContainer::LocTimerContainer(bool wakeOnExpire) :
|
||||
mDevFd(timerfd_create(wakeOnExpire ? CLOCK_BOOTTIME_ALARM : CLOCK_BOOTTIME, 0)) {
|
||||
|
||||
if ((-1 == mDevFd) && (errno == EINVAL)) {
|
||||
LOC_LOGW("%s: timerfd_create failure, fallback to CLOCK_MONOTONIC - %s",
|
||||
__FUNCTION__, strerror(errno));
|
||||
mDevFd = timerfd_create(CLOCK_MONOTONIC, 0);
|
||||
}
|
||||
|
||||
if (-1 != mDevFd) {
|
||||
// ensure we have the necessary resources created
|
||||
LocTimerContainer::getPollTaskLocked();
|
||||
LocTimerContainer::getMsgTaskLocked();
|
||||
} else {
|
||||
LOC_LOGE("%s: timerfd_create failure - %s", __FUNCTION__, strerror(errno));
|
||||
}
|
||||
}
|
||||
|
||||
// dtor
|
||||
// we do not ever destroy the static resources.
|
||||
inline
|
||||
LocTimerContainer::~LocTimerContainer() {
|
||||
close(mDevFd);
|
||||
}
|
||||
|
||||
LocTimerContainer* LocTimerContainer::get(bool wakeOnExpire) {
|
||||
// get the reference of either mHwTimer or mSwTimers per wakeOnExpire
|
||||
LocTimerContainer*& container = wakeOnExpire ? mHwTimers : mSwTimers;
|
||||
// it is cheap to check pointer first than locking mutext unconditionally
|
||||
if (!container) {
|
||||
pthread_mutex_lock(&mMutex);
|
||||
// let's check one more time to be safe
|
||||
if (!container) {
|
||||
container = new LocTimerContainer(wakeOnExpire);
|
||||
// timerfd_create failure
|
||||
if (-1 == container->getTimerFd()) {
|
||||
delete container;
|
||||
container = NULL;
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&mMutex);
|
||||
}
|
||||
return container;
|
||||
}
|
||||
|
||||
MsgTask* LocTimerContainer::getMsgTaskLocked() {
|
||||
// it is cheap to check pointer first than locking mutext unconditionally
|
||||
if (!mMsgTask) {
|
||||
mMsgTask = new MsgTask("LocTimerMsgTask", false);
|
||||
}
|
||||
return mMsgTask;
|
||||
}
|
||||
|
||||
LocTimerPollTask* LocTimerContainer::getPollTaskLocked() {
|
||||
// it is cheap to check pointer first than locking mutext unconditionally
|
||||
if (!mPollTask) {
|
||||
mPollTask = new LocTimerPollTask();
|
||||
}
|
||||
return mPollTask;
|
||||
}
|
||||
|
||||
inline
|
||||
LocTimerDelegate* LocTimerContainer::getSoonestTimer() {
|
||||
return (LocTimerDelegate*)(peek());
|
||||
}
|
||||
|
||||
inline
|
||||
int LocTimerContainer::getTimerFd() {
|
||||
return mDevFd;
|
||||
}
|
||||
|
||||
void LocTimerContainer::updateSoonestTime(LocTimerDelegate* priorTop) {
|
||||
LocTimerDelegate* curTop = getSoonestTimer();
|
||||
|
||||
// check if top has changed
|
||||
if (curTop != priorTop) {
|
||||
struct itimerspec delay = {0};
|
||||
bool toSetTime = false;
|
||||
// if tree is empty now, we remove poll and disarm timer
|
||||
if (!curTop) {
|
||||
mPollTask->removePoll(*this);
|
||||
// setting the values to disarm timer
|
||||
delay.it_value.tv_sec = 0;
|
||||
delay.it_value.tv_nsec = 0;
|
||||
toSetTime = true;
|
||||
} else if (!priorTop || curTop->outRanks(*priorTop)) {
|
||||
// do this first to avoid race condition, in case settime is called
|
||||
// with too small an interval
|
||||
mPollTask->addPoll(*this);
|
||||
delay.it_value = curTop->getFutureTime();
|
||||
toSetTime = true;
|
||||
}
|
||||
if (toSetTime) {
|
||||
timerfd_settime(getTimerFd(), TFD_TIMER_ABSTIME, &delay, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// all the heap management is done in the MsgTask context.
|
||||
inline
|
||||
void LocTimerContainer::add(LocTimerDelegate& timer) {
|
||||
struct MsgTimerPush : public LocMsg {
|
||||
LocTimerContainer* mTimerContainer;
|
||||
LocHeapNode* mTree;
|
||||
LocTimerDelegate* mTimer;
|
||||
inline MsgTimerPush(LocTimerContainer& container, LocTimerDelegate& timer) :
|
||||
LocMsg(), mTimerContainer(&container), mTimer(&timer) {}
|
||||
inline virtual void proc() const {
|
||||
LocTimerDelegate* priorTop = mTimerContainer->getSoonestTimer();
|
||||
mTimerContainer->push((LocRankable&)(*mTimer));
|
||||
mTimerContainer->updateSoonestTime(priorTop);
|
||||
}
|
||||
};
|
||||
|
||||
mMsgTask->sendMsg(new MsgTimerPush(*this, timer));
|
||||
}
|
||||
|
||||
// all the heap management is done in the MsgTask context.
|
||||
void LocTimerContainer::remove(LocTimerDelegate& timer) {
|
||||
struct MsgTimerRemove : public LocMsg {
|
||||
LocTimerContainer* mTimerContainer;
|
||||
LocTimerDelegate* mTimer;
|
||||
inline MsgTimerRemove(LocTimerContainer& container, LocTimerDelegate& timer) :
|
||||
LocMsg(), mTimerContainer(&container), mTimer(&timer) {}
|
||||
inline virtual void proc() const {
|
||||
LocTimerDelegate* priorTop = mTimerContainer->getSoonestTimer();
|
||||
|
||||
// update soonest timer only if mTimer is actually removed from
|
||||
// mTimerContainer AND mTimer is not priorTop.
|
||||
if (priorTop == ((LocHeap*)mTimerContainer)->remove((LocRankable&)*mTimer)) {
|
||||
// if passing in NULL, we tell updateSoonestTime to update
|
||||
// kernel with the current top timer interval.
|
||||
mTimerContainer->updateSoonestTime(NULL);
|
||||
}
|
||||
// all timers are deleted here, and only here.
|
||||
delete mTimer;
|
||||
}
|
||||
};
|
||||
|
||||
mMsgTask->sendMsg(new MsgTimerRemove(*this, timer));
|
||||
}
|
||||
|
||||
// all the heap management is done in the MsgTask context.
|
||||
// Upon expire, we check and continuously pop the heap until
|
||||
// the top node's timeout is in the future.
|
||||
void LocTimerContainer::expire() {
|
||||
struct MsgTimerExpire : public LocMsg {
|
||||
LocTimerContainer* mTimerContainer;
|
||||
inline MsgTimerExpire(LocTimerContainer& container) :
|
||||
LocMsg(), mTimerContainer(&container) {}
|
||||
inline virtual void proc() const {
|
||||
struct timespec now;
|
||||
// get time spec of now
|
||||
clock_gettime(CLOCK_BOOTTIME, &now);
|
||||
LocTimerDelegate timerOfNow(now);
|
||||
// pop everything in the heap that outRanks now, i.e. has time older than now
|
||||
// and then call expire() on that timer.
|
||||
for (LocTimerDelegate* timer = (LocTimerDelegate*)mTimerContainer->pop();
|
||||
NULL != timer;
|
||||
timer = mTimerContainer->popIfOutRanks(timerOfNow)) {
|
||||
// the timer delegate obj will be deleted before the return of this call
|
||||
timer->expire();
|
||||
}
|
||||
mTimerContainer->updateSoonestTime(NULL);
|
||||
}
|
||||
};
|
||||
|
||||
struct itimerspec delay = {0};
|
||||
timerfd_settime(getTimerFd(), TFD_TIMER_ABSTIME, &delay, NULL);
|
||||
mPollTask->removePoll(*this);
|
||||
mMsgTask->sendMsg(new MsgTimerExpire(*this));
|
||||
}
|
||||
|
||||
LocTimerDelegate* LocTimerContainer::popIfOutRanks(LocTimerDelegate& timer) {
|
||||
LocTimerDelegate* poppedNode = NULL;
|
||||
if (mTree && !timer.outRanks(*peek())) {
|
||||
poppedNode = (LocTimerDelegate*)(pop());
|
||||
}
|
||||
|
||||
return poppedNode;
|
||||
}
|
||||
|
||||
|
||||
/***************************LocTimerPollTask methods***************************/
|
||||
|
||||
inline
|
||||
LocTimerPollTask::LocTimerPollTask()
|
||||
: mFd(epoll_create(2)), mThread(new LocThread()) {
|
||||
// before a next call returens, a thread will be created. The run() method
|
||||
// could already be running in parallel. Also, since each of the objs
|
||||
// creates a thread, the container will make sure that there will be only
|
||||
// one of such obj for our timer implementation.
|
||||
if (!mThread->start("LocTimerPollTask", this)) {
|
||||
delete mThread;
|
||||
mThread = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
inline
|
||||
LocTimerPollTask::~LocTimerPollTask() {
|
||||
// when fs is closed, epoll_wait() should fail run() should return false
|
||||
// and the spawned thread should exit.
|
||||
close(mFd);
|
||||
}
|
||||
|
||||
void LocTimerPollTask::destroy() {
|
||||
if (mThread) {
|
||||
LocThread* thread = mThread;
|
||||
mThread = NULL;
|
||||
delete thread;
|
||||
} else {
|
||||
delete this;
|
||||
}
|
||||
}
|
||||
|
||||
void LocTimerPollTask::addPoll(LocTimerContainer& timerContainer) {
|
||||
struct epoll_event ev;
|
||||
memset(&ev, 0, sizeof(ev));
|
||||
|
||||
ev.events = EPOLLIN | EPOLLWAKEUP;
|
||||
ev.data.fd = timerContainer.getTimerFd();
|
||||
// it is important that we set this context pointer with the input
|
||||
// timer container this is how we know which container should handle
|
||||
// which expiration.
|
||||
ev.data.ptr = &timerContainer;
|
||||
|
||||
epoll_ctl(mFd, EPOLL_CTL_ADD, timerContainer.getTimerFd(), &ev);
|
||||
}
|
||||
|
||||
inline
|
||||
void LocTimerPollTask::removePoll(LocTimerContainer& timerContainer) {
|
||||
epoll_ctl(mFd, EPOLL_CTL_DEL, timerContainer.getTimerFd(), NULL);
|
||||
}
|
||||
|
||||
// The polling thread context will call this method. If run() method needs to
|
||||
// be repetitvely called, it must return true from the previous call.
|
||||
bool LocTimerPollTask::run() {
|
||||
struct epoll_event ev[2];
|
||||
|
||||
// we have max 2 descriptors to poll from
|
||||
int fds = epoll_wait(mFd, ev, 2, -1);
|
||||
|
||||
// we pretty much want to continually poll until the fd is closed
|
||||
bool rerun = (fds > 0) || (errno == EINTR);
|
||||
|
||||
if (fds > 0) {
|
||||
// we may have 2 events
|
||||
for (int i = 0; i < fds; i++) {
|
||||
// each fd has a context pointer associated with the right timer container
|
||||
LocTimerContainer* container = (LocTimerContainer*)(ev[i].data.ptr);
|
||||
if (container) {
|
||||
container->expire();
|
||||
} else {
|
||||
epoll_ctl(mFd, EPOLL_CTL_DEL, ev[i].data.fd, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if rerun is true, we are requesting to be scheduled again
|
||||
return rerun;
|
||||
}
|
||||
|
||||
/***************************LocTimerDelegate methods***************************/
|
||||
|
||||
inline
|
||||
LocTimerDelegate::LocTimerDelegate(LocTimer& client, struct timespec& futureTime, bool wakeOnExpire)
|
||||
: mClient(&client),
|
||||
mLock(mClient->mLock->share()),
|
||||
mFutureTime(futureTime),
|
||||
mContainer(LocTimerContainer::get(wakeOnExpire)) {
|
||||
// adding the timer into the container
|
||||
mContainer->add(*this);
|
||||
}
|
||||
|
||||
inline
|
||||
void LocTimerDelegate::destroyLocked() {
|
||||
// client handle will likely be deleted soon after this
|
||||
// method returns. Nulling this handle so that expire()
|
||||
// won't call the callback on the dead handle any more.
|
||||
mClient = NULL;
|
||||
|
||||
if (mContainer) {
|
||||
LocTimerContainer* container = mContainer;
|
||||
mContainer = NULL;
|
||||
if (container) {
|
||||
container->remove(*this);
|
||||
}
|
||||
} // else we do not do anything. No such *this* can be
|
||||
// created and reached here with mContainer ever been
|
||||
// a non NULL. So *this* must have reached the if clause
|
||||
// once, and we want it reach there only once.
|
||||
}
|
||||
|
||||
int LocTimerDelegate::ranks(LocRankable& rankable) {
|
||||
int rank = -1;
|
||||
LocTimerDelegate* timer = (LocTimerDelegate*)(&rankable);
|
||||
if (timer) {
|
||||
// larger time ranks lower!!!
|
||||
// IOW, if input obj has bigger tv_sec, this obj outRanks higher
|
||||
rank = timer->mFutureTime.tv_sec - mFutureTime.tv_sec;
|
||||
}
|
||||
return rank;
|
||||
}
|
||||
|
||||
inline
|
||||
void LocTimerDelegate::expire() {
|
||||
// keeping a copy of client pointer to be safe
|
||||
// when timeOutCallback() is called at the end of this
|
||||
// method, *this* obj may be already deleted.
|
||||
LocTimer* client = mClient;
|
||||
// force a stop, which will lead to delete of this obj
|
||||
if (client && client->stop()) {
|
||||
// calling client callback with a pointer save on the stack
|
||||
// only if stop() returns true, i.e. it hasn't been stopped
|
||||
// already.
|
||||
client->timeOutCallback();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***************************LocTimer methods***************************/
|
||||
LocTimer::LocTimer() : mTimer(NULL), mLock(new LocSharedLock()) {
|
||||
}
|
||||
|
||||
LocTimer::~LocTimer() {
|
||||
stop();
|
||||
if (mLock) {
|
||||
mLock->drop();
|
||||
mLock = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
bool LocTimer::start(unsigned int timeOutInMs, bool wakeOnExpire) {
|
||||
bool success = false;
|
||||
mLock->lock();
|
||||
if (!mTimer) {
|
||||
struct timespec futureTime;
|
||||
clock_gettime(CLOCK_BOOTTIME, &futureTime);
|
||||
futureTime.tv_sec += timeOutInMs / 1000;
|
||||
futureTime.tv_nsec += (timeOutInMs % 1000) * 1000000;
|
||||
if (futureTime.tv_nsec >= 1000000000) {
|
||||
futureTime.tv_sec += futureTime.tv_nsec / 1000000000;
|
||||
futureTime.tv_nsec %= 1000000000;
|
||||
}
|
||||
mTimer = new LocTimerDelegate(*this, futureTime, wakeOnExpire);
|
||||
// if mTimer is non 0, success should be 0; or vice versa
|
||||
success = (NULL != mTimer);
|
||||
}
|
||||
mLock->unlock();
|
||||
return success;
|
||||
}
|
||||
|
||||
bool LocTimer::stop() {
|
||||
bool success = false;
|
||||
mLock->lock();
|
||||
if (mTimer) {
|
||||
LocTimerDelegate* timer = mTimer;
|
||||
mTimer = NULL;
|
||||
if (timer) {
|
||||
timer->destroyLocked();
|
||||
success = true;
|
||||
}
|
||||
}
|
||||
mLock->unlock();
|
||||
return success;
|
||||
}
|
||||
|
||||
/***************************LocTimerWrapper methods***************************/
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// This section below wraps for the C style APIs
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
class LocTimerWrapper : public LocTimer {
|
||||
loc_timer_callback mCb;
|
||||
void* mCallerData;
|
||||
LocTimerWrapper* mMe;
|
||||
static pthread_mutex_t mMutex;
|
||||
inline ~LocTimerWrapper() { mCb = NULL; mMe = NULL; }
|
||||
public:
|
||||
inline LocTimerWrapper(loc_timer_callback cb, void* callerData) :
|
||||
mCb(cb), mCallerData(callerData), mMe(this) {
|
||||
}
|
||||
void destroy() {
|
||||
pthread_mutex_lock(&mMutex);
|
||||
if (NULL != mCb && this == mMe) {
|
||||
delete this;
|
||||
}
|
||||
pthread_mutex_unlock(&mMutex);
|
||||
}
|
||||
virtual void timeOutCallback() {
|
||||
loc_timer_callback cb = mCb;
|
||||
void* callerData = mCallerData;
|
||||
if (cb) {
|
||||
cb(callerData, 0);
|
||||
}
|
||||
destroy();
|
||||
}
|
||||
};
|
||||
|
||||
pthread_mutex_t LocTimerWrapper::mMutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
void* loc_timer_start(uint64_t msec, loc_timer_callback cb_func,
|
||||
void *caller_data, bool wake_on_expire)
|
||||
{
|
||||
LocTimerWrapper* locTimerWrapper = NULL;
|
||||
|
||||
if (cb_func) {
|
||||
locTimerWrapper = new LocTimerWrapper(cb_func, caller_data);
|
||||
|
||||
if (locTimerWrapper) {
|
||||
locTimerWrapper->start(msec, wake_on_expire);
|
||||
}
|
||||
}
|
||||
|
||||
return locTimerWrapper;
|
||||
}
|
||||
|
||||
void loc_timer_stop(void*& handle)
|
||||
{
|
||||
if (handle) {
|
||||
LocTimerWrapper* locTimerWrapper = (LocTimerWrapper*)(handle);
|
||||
locTimerWrapper->destroy();
|
||||
handle = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// This section above wraps for the C style APIs
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __LOC_DEBUG__
|
||||
|
||||
double getDeltaSeconds(struct timespec from, struct timespec to) {
|
||||
return (double)to.tv_sec + (double)to.tv_nsec / 1000000000
|
||||
- from.tv_sec - (double)from.tv_nsec / 1000000000;
|
||||
}
|
||||
|
||||
struct timespec getNow() {
|
||||
struct timespec now;
|
||||
clock_gettime(CLOCK_BOOTTIME, &now);
|
||||
return now;
|
||||
}
|
||||
|
||||
class LocTimerTest : public LocTimer, public LocRankable {
|
||||
int mTimeOut;
|
||||
const struct timespec mTimeOfBirth;
|
||||
inline struct timespec getTimerWrapper(int timeout) {
|
||||
struct timespec now;
|
||||
clock_gettime(CLOCK_BOOTTIME, &now);
|
||||
now.tv_sec += timeout;
|
||||
return now;
|
||||
}
|
||||
public:
|
||||
inline LocTimerTest(int timeout) : LocTimer(), LocRankable(),
|
||||
mTimeOut(timeout), mTimeOfBirth(getTimerWrapper(0)) {}
|
||||
inline virtual int ranks(LocRankable& rankable) {
|
||||
LocTimerTest* timer = dynamic_cast<LocTimerTest*>(&rankable);
|
||||
return timer->mTimeOut - mTimeOut;
|
||||
}
|
||||
inline virtual void timeOutCallback() {
|
||||
printf("timeOutCallback() - ");
|
||||
deviation();
|
||||
}
|
||||
double deviation() {
|
||||
struct timespec now = getTimerWrapper(0);
|
||||
double delta = getDeltaSeconds(mTimeOfBirth, now);
|
||||
printf("%lf: %lf\n", delta, delta * 100 / mTimeOut);
|
||||
return delta / mTimeOut;
|
||||
}
|
||||
};
|
||||
|
||||
// For Linux command line testing:
|
||||
// compilation:
|
||||
// g++ -D__LOC_HOST_DEBUG__ -D__LOC_DEBUG__ -g -I. -I../../../../system/core/include -o LocHeap.o LocHeap.cpp
|
||||
// g++ -D__LOC_HOST_DEBUG__ -D__LOC_DEBUG__ -g -std=c++0x -I. -I../../../../system/core/include -lpthread -o LocThread.o LocThread.cpp
|
||||
// g++ -D__LOC_HOST_DEBUG__ -D__LOC_DEBUG__ -g -I. -I../../../../system/core/include -o LocTimer.o LocTimer.cpp
|
||||
int main(int argc, char** argv) {
|
||||
struct timespec timeOfStart=getNow();
|
||||
srand(time(NULL));
|
||||
int tries = atoi(argv[1]);
|
||||
int checks = tries >> 3;
|
||||
LocTimerTest** timerArray = new LocTimerTest*[tries];
|
||||
memset(timerArray, NULL, tries);
|
||||
|
||||
for (int i = 0; i < tries; i++) {
|
||||
int r = rand() % tries;
|
||||
LocTimerTest* timer = new LocTimerTest(r);
|
||||
if (timerArray[r]) {
|
||||
if (!timer->stop()) {
|
||||
printf("%lf:\n", getDeltaSeconds(timeOfStart, getNow()));
|
||||
printf("ERRER: %dth timer, id %d, not running when it should be\n", i, r);
|
||||
exit(0);
|
||||
} else {
|
||||
printf("stop() - %d\n", r);
|
||||
delete timer;
|
||||
timerArray[r] = NULL;
|
||||
}
|
||||
} else {
|
||||
if (!timer->start(r, false)) {
|
||||
printf("%lf:\n", getDeltaSeconds(timeOfStart, getNow()));
|
||||
printf("ERRER: %dth timer, id %d, running when it should not be\n", i, r);
|
||||
exit(0);
|
||||
} else {
|
||||
printf("stop() - %d\n", r);
|
||||
timerArray[r] = timer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < tries; i++) {
|
||||
if (timerArray[i]) {
|
||||
if (!timerArray[i]->stop()) {
|
||||
printf("%lf:\n", getDeltaSeconds(timeOfStart, getNow()));
|
||||
printf("ERRER: %dth timer, not running when it should be\n", i);
|
||||
exit(0);
|
||||
} else {
|
||||
printf("stop() - %d\n", i);
|
||||
delete timerArray[i];
|
||||
timerArray[i] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delete[] timerArray;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
74
gps/utils/LocTimer.h
Normal file
74
gps/utils/LocTimer.h
Normal file
@ -0,0 +1,74 @@
|
||||
/* Copyright (c) 2015, 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_TIMER_CPP_H__
|
||||
#define __LOC_TIMER_CPP_H__
|
||||
|
||||
#include <stddef.h>
|
||||
#include <log_util.h>
|
||||
|
||||
// opaque class to provide service implementation.
|
||||
class LocTimerDelegate;
|
||||
class LocSharedLock;
|
||||
|
||||
// LocTimer client must extend this class and implementthe callback.
|
||||
// start() / stop() methods are to arm / disarm timer.
|
||||
class LocTimer
|
||||
{
|
||||
LocTimerDelegate* mTimer;
|
||||
LocSharedLock* mLock;
|
||||
// don't really want mLock to be manipulated by clients, yet LocTimer
|
||||
// has to have a reference to the lock so that the delete of LocTimer
|
||||
// and LocTimerDelegate can work together on their share resources.
|
||||
friend class LocTimerDelegate;
|
||||
|
||||
public:
|
||||
LocTimer();
|
||||
virtual ~LocTimer();
|
||||
|
||||
// timeOutInMs: timeout delay in ms
|
||||
// wakeOnExpire: true if to wake up CPU (if sleeping) upon timer
|
||||
// expiration and notify the client.
|
||||
// false if to wait until next time CPU wakes up (if
|
||||
// sleeping) and then notify the client.
|
||||
// return: true on success;
|
||||
// false on failure, e.g. timer is already running.
|
||||
bool start(uint32_t timeOutInMs, bool wakeOnExpire);
|
||||
|
||||
// return: true on success;
|
||||
// false on failure, e.g. timer is not running.
|
||||
bool stop();
|
||||
|
||||
// LocTimer client Should implement this method.
|
||||
// This method is used for timeout calling back to client. This method
|
||||
// should be short enough (eg: send a message to your own thread).
|
||||
virtual void timeOutCallback() = 0;
|
||||
};
|
||||
|
||||
#endif //__LOC_DELAY_H__
|
44
gps/utils/Makefile.am
Normal file
44
gps/utils/Makefile.am
Normal file
@ -0,0 +1,44 @@
|
||||
AM_CFLAGS = -Wundef \
|
||||
-MD \
|
||||
-Wno-trigraphs \
|
||||
-g -O0 \
|
||||
-fno-inline \
|
||||
-fno-short-enums \
|
||||
-fpic \
|
||||
-I../platform_lib_abstractions
|
||||
|
||||
libgps_utils_so_la_h_sources = log_util.h \
|
||||
msg_q.h \
|
||||
linked_list.h \
|
||||
loc_cfg.h \
|
||||
loc_log.h \
|
||||
../platform_lib_abstractions/platform_lib_includes.h \
|
||||
../platform_lib_abstractions/platform_lib_time.h \
|
||||
../platform_lib_abstractions/platform_lib_macros.h
|
||||
|
||||
libgps_utils_so_la_c_sources = linked_list.c \
|
||||
msg_q.c \
|
||||
loc_cfg.cpp \
|
||||
loc_log.cpp \
|
||||
../platform_lib_abstractions/elapsed_millis_since_boot.cpp
|
||||
|
||||
library_includedir = $(pkgincludedir)/utils
|
||||
|
||||
library_include_HEADERS = $(libgps_utils_so_la_h_sources)
|
||||
|
||||
libgps_utils_so_la_SOURCES = $(libgps_utils_so_la_c_sources)
|
||||
|
||||
if USE_GLIB
|
||||
libgps_utils_so_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@
|
||||
libgps_utils_so_la_LDFLAGS = -lstdc++ -lpthread @GLIB_LIBS@ -shared -version-info 1:0:0
|
||||
libgps_utils_so_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@
|
||||
else
|
||||
libgps_utils_so_la_CFLAGS = $(AM_CFLAGS)
|
||||
libgps_utils_so_la_LDFLAGS = -lpthread -shared -version-info 1:0:0
|
||||
libgps_utils_so_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS)
|
||||
endif
|
||||
|
||||
libgps_utils_so_la_LIBADD = -lstdc++ -lcutils
|
||||
|
||||
#Create and Install libraries
|
||||
lib_LTLIBRARIES = libgps_utils_so.la
|
102
gps/utils/MsgTask.cpp
Normal file
102
gps/utils/MsgTask.cpp
Normal file
@ -0,0 +1,102 @@
|
||||
/* Copyright (c) 2011-2013,2015 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>
|
||||
|
||||
static void LocMsgDestroy(void* msg) {
|
||||
delete (LocMsg*)msg;
|
||||
}
|
||||
|
||||
MsgTask::MsgTask(LocThread::tCreate tCreator,
|
||||
const char* threadName, bool joinable) :
|
||||
mQ(msg_q_init2()), mThread(new LocThread()) {
|
||||
if (!mThread->start(tCreator, threadName, this, joinable)) {
|
||||
delete mThread;
|
||||
mThread = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
MsgTask::MsgTask(const char* threadName, bool joinable) :
|
||||
mQ(msg_q_init2()), mThread(new LocThread()) {
|
||||
if (!mThread->start(threadName, this, joinable)) {
|
||||
delete mThread;
|
||||
mThread = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
MsgTask::~MsgTask() {
|
||||
msg_q_flush((void*)mQ);
|
||||
msg_q_destroy((void**)&mQ);
|
||||
}
|
||||
|
||||
void MsgTask::destroy() {
|
||||
msg_q_unblock((void*)mQ);
|
||||
if (mThread) {
|
||||
LocThread* thread = mThread;
|
||||
mThread = NULL;
|
||||
delete thread;
|
||||
} else {
|
||||
delete this;
|
||||
}
|
||||
}
|
||||
|
||||
void MsgTask::sendMsg(const LocMsg* msg) const {
|
||||
msg_q_snd((void*)mQ, (void*)msg, LocMsgDestroy);
|
||||
}
|
||||
|
||||
void MsgTask::prerun() {
|
||||
// make sure we do not run in background scheduling group
|
||||
set_sched_policy(gettid(), SP_FOREGROUND);
|
||||
}
|
||||
|
||||
bool MsgTask::run() {
|
||||
LOC_LOGV("MsgTask::loop() listening ...\n");
|
||||
LocMsg* msg;
|
||||
msq_q_err_type result = msg_q_rcv((void*)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));
|
||||
return false;
|
||||
}
|
||||
|
||||
msg->log();
|
||||
// there is where each individual msg handling is invoked
|
||||
msg->proc();
|
||||
|
||||
delete msg;
|
||||
|
||||
return true;
|
||||
}
|
67
gps/utils/MsgTask.h
Normal file
67
gps/utils/MsgTask.h
Normal file
@ -0,0 +1,67 @@
|
||||
/* Copyright (c) 2011-2013,2015 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 <LocThread.h>
|
||||
|
||||
struct LocMsg {
|
||||
inline LocMsg() {}
|
||||
inline virtual ~LocMsg() {}
|
||||
virtual void proc() const = 0;
|
||||
inline virtual void log() const {}
|
||||
};
|
||||
|
||||
class MsgTask : public LocRunnable {
|
||||
const void* mQ;
|
||||
LocThread* mThread;
|
||||
friend class LocThreadDelegate;
|
||||
protected:
|
||||
virtual ~MsgTask();
|
||||
public:
|
||||
MsgTask(LocThread::tCreate tCreator, const char* threadName = NULL, bool joinable = true);
|
||||
MsgTask(const char* threadName = NULL, bool joinable = true);
|
||||
// this obj will be deleted once thread is deleted
|
||||
void destroy();
|
||||
void sendMsg(const LocMsg* msg) const;
|
||||
// Overrides of LocRunnable methods
|
||||
// This method will be repeated called until it returns false; or
|
||||
// until thread is stopped.
|
||||
virtual bool run();
|
||||
|
||||
// The method to be run before thread loop (conditionally repeatedly)
|
||||
// calls run()
|
||||
virtual void prerun();
|
||||
|
||||
// The method to be run after thread loop (conditionally repeatedly)
|
||||
// calls run()
|
||||
inline virtual void postrun() {}
|
||||
};
|
||||
|
||||
#endif //__MSG_TASK__
|
328
gps/utils/linked_list.c
Normal file
328
gps/utils/linked_list.c
Normal file
@ -0,0 +1,328 @@
|
||||
/* 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 "linked_list.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define LOG_TAG "LocSvc_utils_ll"
|
||||
#include "log_util.h"
|
||||
#include "platform_lib_includes.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
|
||||
typedef struct list_element {
|
||||
struct list_element* next;
|
||||
struct list_element* prev;
|
||||
void* data_ptr;
|
||||
void (*dealloc_func)(void*);
|
||||
}list_element;
|
||||
|
||||
typedef struct list_state {
|
||||
list_element* p_head;
|
||||
list_element* p_tail;
|
||||
} list_state;
|
||||
|
||||
/* ----------------------- END INTERNAL FUNCTIONS ---------------------------------------- */
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: linked_list_init
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_init(void** list_data)
|
||||
{
|
||||
if( list_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__);
|
||||
return eLINKED_LIST_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
list_state* tmp_list;
|
||||
tmp_list = (list_state*)calloc(1, sizeof(list_state));
|
||||
if( tmp_list == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Unable to allocate space for list!\n", __FUNCTION__);
|
||||
return eLINKED_LIST_FAILURE_GENERAL;
|
||||
}
|
||||
|
||||
tmp_list->p_head = NULL;
|
||||
tmp_list->p_tail = NULL;
|
||||
|
||||
*list_data = tmp_list;
|
||||
|
||||
return eLINKED_LIST_SUCCESS;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: linked_list_destroy
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_destroy(void** list_data)
|
||||
{
|
||||
if( list_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__);
|
||||
return eLINKED_LIST_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
list_state* p_list = (list_state*)*list_data;
|
||||
|
||||
linked_list_flush(p_list);
|
||||
|
||||
free(*list_data);
|
||||
*list_data = NULL;
|
||||
|
||||
return eLINKED_LIST_SUCCESS;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: linked_list_add
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_add(void* list_data, void *data_obj, void (*dealloc)(void*))
|
||||
{
|
||||
LOC_LOGV("%s: Adding to list data_obj = 0x%08X\n", __FUNCTION__, data_obj);
|
||||
if( list_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__);
|
||||
return eLINKED_LIST_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
if( data_obj == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid input parameter!\n", __FUNCTION__);
|
||||
return eLINKED_LIST_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
list_state* p_list = (list_state*)list_data;
|
||||
list_element* elem = (list_element*)malloc(sizeof(list_element));
|
||||
if( elem == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Memory allocation failed\n", __FUNCTION__);
|
||||
return eLINKED_LIST_FAILURE_GENERAL;
|
||||
}
|
||||
|
||||
/* Copy data to newly created element */
|
||||
elem->data_ptr = data_obj;
|
||||
elem->next = NULL;
|
||||
elem->prev = NULL;
|
||||
elem->dealloc_func = dealloc;
|
||||
|
||||
/* Replace head element */
|
||||
list_element* tmp = p_list->p_head;
|
||||
p_list->p_head = elem;
|
||||
/* Point next to the previous head element */
|
||||
p_list->p_head->next = tmp;
|
||||
|
||||
if( tmp != NULL )
|
||||
{
|
||||
tmp->prev = p_list->p_head;
|
||||
}
|
||||
else
|
||||
{
|
||||
p_list->p_tail = p_list->p_head;
|
||||
}
|
||||
|
||||
return eLINKED_LIST_SUCCESS;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: linked_list_remove
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_remove(void* list_data, void **data_obj)
|
||||
{
|
||||
LOC_LOGV("%s: Removing from list\n", __FUNCTION__);
|
||||
if( list_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__);
|
||||
return eLINKED_LIST_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
if( data_obj == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid input parameter!\n", __FUNCTION__);
|
||||
return eLINKED_LIST_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
list_state* p_list = (list_state*)list_data;
|
||||
if( p_list->p_tail == NULL )
|
||||
{
|
||||
return eLINKED_LIST_UNAVAILABLE_RESOURCE;
|
||||
}
|
||||
|
||||
list_element* tmp = p_list->p_tail;
|
||||
|
||||
/* Replace tail element */
|
||||
p_list->p_tail = tmp->prev;
|
||||
|
||||
if( p_list->p_tail != NULL )
|
||||
{
|
||||
p_list->p_tail->next = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
p_list->p_head = p_list->p_tail;
|
||||
}
|
||||
|
||||
/* Copy data to output param */
|
||||
*data_obj = tmp->data_ptr;
|
||||
|
||||
/* Free allocated list element */
|
||||
free(tmp);
|
||||
|
||||
return eLINKED_LIST_SUCCESS;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: linked_list_empty
|
||||
|
||||
===========================================================================*/
|
||||
int linked_list_empty(void* list_data)
|
||||
{
|
||||
if( list_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__);
|
||||
return (int)eLINKED_LIST_INVALID_HANDLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
list_state* p_list = (list_state*)list_data;
|
||||
return p_list->p_head == NULL ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: linked_list_flush
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_flush(void* list_data)
|
||||
{
|
||||
if( list_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__);
|
||||
return eLINKED_LIST_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
list_state* p_list = (list_state*)list_data;
|
||||
|
||||
/* Remove all dynamically allocated elements */
|
||||
while( p_list->p_head != NULL )
|
||||
{
|
||||
list_element* tmp = p_list->p_head->next;
|
||||
|
||||
/* Free data pointer if told to do so. */
|
||||
if( p_list->p_head->dealloc_func != NULL )
|
||||
{
|
||||
p_list->p_head->dealloc_func(p_list->p_head->data_ptr);
|
||||
}
|
||||
|
||||
/* Free list element */
|
||||
free(p_list->p_head);
|
||||
|
||||
p_list->p_head = tmp;
|
||||
}
|
||||
|
||||
p_list->p_tail = NULL;
|
||||
|
||||
return eLINKED_LIST_SUCCESS;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: linked_list_search
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_search(void* list_data, void **data_p,
|
||||
bool (*equal)(void* data_0, void* data),
|
||||
void* data_0, bool rm_if_found)
|
||||
{
|
||||
LOC_LOGV("%s: Search the list\n", __FUNCTION__);
|
||||
if( list_data == NULL || NULL == equal )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid list parameter! list_data %p equal %p\n",
|
||||
__FUNCTION__, list_data, equal);
|
||||
return eLINKED_LIST_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
list_state* p_list = (list_state*)list_data;
|
||||
if( p_list->p_tail == NULL )
|
||||
{
|
||||
return eLINKED_LIST_UNAVAILABLE_RESOURCE;
|
||||
}
|
||||
|
||||
list_element* tmp = p_list->p_head;
|
||||
|
||||
if (NULL != data_p) {
|
||||
*data_p = NULL;
|
||||
}
|
||||
|
||||
while (NULL != tmp) {
|
||||
if ((*equal)(data_0, tmp->data_ptr)) {
|
||||
if (NULL != data_p) {
|
||||
*data_p = tmp->data_ptr;
|
||||
}
|
||||
|
||||
if (rm_if_found) {
|
||||
if (NULL == tmp->prev) {
|
||||
p_list->p_head = tmp->next;
|
||||
} else {
|
||||
tmp->prev->next = tmp->next;
|
||||
}
|
||||
|
||||
if (NULL == tmp->next) {
|
||||
p_list->p_tail = tmp->prev;
|
||||
} else {
|
||||
tmp->next->prev = tmp->prev;
|
||||
}
|
||||
|
||||
tmp->prev = tmp->next = NULL;
|
||||
|
||||
// dealloc data if it is not copied out && caller
|
||||
// has given us a dealloc function pointer.
|
||||
if (NULL == data_p && NULL != tmp->dealloc_func) {
|
||||
tmp->dealloc_func(tmp->data_ptr);
|
||||
}
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
tmp = NULL;
|
||||
} else {
|
||||
tmp = tmp->next;
|
||||
}
|
||||
}
|
||||
|
||||
return eLINKED_LIST_SUCCESS;
|
||||
}
|
||||
|
217
gps/utils/linked_list.h
Normal file
217
gps/utils/linked_list.h
Normal file
@ -0,0 +1,217 @@
|
||||
/* 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.
|
||||
*/
|
||||
#ifndef __LINKED_LIST_H__
|
||||
#define __LINKED_LIST_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/** Linked List Return Codes */
|
||||
typedef enum
|
||||
{
|
||||
eLINKED_LIST_SUCCESS = 0,
|
||||
/**< Request was successful. */
|
||||
eLINKED_LIST_FAILURE_GENERAL = -1,
|
||||
/**< Failed because of a general failure. */
|
||||
eLINKED_LIST_INVALID_PARAMETER = -2,
|
||||
/**< Failed because the request contained invalid parameters. */
|
||||
eLINKED_LIST_INVALID_HANDLE = -3,
|
||||
/**< Failed because an invalid handle was specified. */
|
||||
eLINKED_LIST_UNAVAILABLE_RESOURCE = -4,
|
||||
/**< Failed because an there were not enough resources. */
|
||||
eLINKED_LIST_INSUFFICIENT_BUFFER = -5,
|
||||
/**< Failed because an the supplied buffer was too small. */
|
||||
}linked_list_err_type;
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION linked_list_init
|
||||
|
||||
DESCRIPTION
|
||||
Initializes internal structures for linked list.
|
||||
|
||||
list_data: State of list to be initialized.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_init(void** list_data);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION linked_list_destroy
|
||||
|
||||
DESCRIPTION
|
||||
Destroys internal structures for linked list.
|
||||
|
||||
p_list_data: State of list to be destroyed.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_destroy(void** list_data);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION linked_list_add
|
||||
|
||||
DESCRIPTION
|
||||
Adds an element to the head of the linked list. The passed in data pointer
|
||||
is not modified or freed. Passed in data_obj is expected to live throughout
|
||||
the use of the linked_list (i.e. data is not allocated internally)
|
||||
|
||||
p_list_data: List to add data to the head of.
|
||||
data_obj: Pointer to data to add into list
|
||||
dealloc: Function used to deallocate memory for this element. Pass NULL
|
||||
if you do not want data deallocated during a flush operation
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_add(void* list_data, void *data_obj, void (*dealloc)(void*));
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION linked_list_remove
|
||||
|
||||
DESCRIPTION
|
||||
Retrieves data from the list tail. data_obj is the tail element from the list
|
||||
passed in by linked_list_add.
|
||||
|
||||
p_list_data: List to remove the tail from.
|
||||
data_obj: Pointer to data removed from list
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_remove(void* list_data, void **data_obj);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION linked_list_empty
|
||||
|
||||
DESCRIPTION
|
||||
Tells whether the list currently contains any elements
|
||||
|
||||
p_list_data: List to check if empty.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
0/FALSE : List contains elements
|
||||
1/TRUE : List is Empty
|
||||
Otherwise look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int linked_list_empty(void* list_data);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION linked_list_flush
|
||||
|
||||
DESCRIPTION
|
||||
Removes all elements from the list and deallocates them using the provided
|
||||
dealloc function while adding elements.
|
||||
|
||||
p_list_data: List to remove all elements from.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_flush(void* list_data);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION linked_list_search
|
||||
|
||||
DESCRIPTION
|
||||
Searches for an element in the linked list.
|
||||
|
||||
p_list_data: List handle.
|
||||
data_p: to be stored with the data found; NUll if no match.
|
||||
if data_p passed in as NULL, then no write to it.
|
||||
equal: Function ptr takes in a list element, and returns
|
||||
indication if this the one looking for.
|
||||
data_0: The data being compared against.
|
||||
rm_if_found: Should data be removed if found?
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_search(void* list_data, void **data_p,
|
||||
bool (*equal)(void* data_0, void* data),
|
||||
void* data_0, bool rm_if_found);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* __LINKED_LIST_H__ */
|
400
gps/utils/loc_cfg.cpp
Normal file
400
gps/utils/loc_cfg.cpp
Normal file
@ -0,0 +1,400 @@
|
||||
/* Copyright (c) 2011-2015, 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_utils_cfg"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
#include <loc_cfg.h>
|
||||
#include <log_util.h>
|
||||
#include <loc_misc_utils.h>
|
||||
#ifdef USE_GLIB
|
||||
#include <glib.h>
|
||||
#endif
|
||||
#include "platform_lib_includes.h"
|
||||
|
||||
/*=============================================================================
|
||||
*
|
||||
* GLOBAL DATA DECLARATION
|
||||
*
|
||||
*============================================================================*/
|
||||
|
||||
/* Parameter data */
|
||||
static uint32_t DEBUG_LEVEL = 0xff;
|
||||
static uint32_t TIMESTAMP = 0;
|
||||
|
||||
/* Parameter spec table */
|
||||
static const loc_param_s_type loc_param_table[] =
|
||||
{
|
||||
{"DEBUG_LEVEL", &DEBUG_LEVEL, NULL, 'n'},
|
||||
{"TIMESTAMP", &TIMESTAMP, NULL, 'n'},
|
||||
};
|
||||
static const int loc_param_num = sizeof(loc_param_table) / sizeof(loc_param_s_type);
|
||||
|
||||
typedef struct loc_param_v_type
|
||||
{
|
||||
char* param_name;
|
||||
char* param_str_value;
|
||||
int param_int_value;
|
||||
double param_double_value;
|
||||
}loc_param_v_type;
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_set_config_entry
|
||||
|
||||
DESCRIPTION
|
||||
Potentially sets a given configuration table entry based on the passed in
|
||||
configuration value. This is done by using a string comparison of the
|
||||
parameter names and those found in the configuration file.
|
||||
|
||||
PARAMETERS:
|
||||
config_entry: configuration entry in the table to possibly set
|
||||
config_value: value to store in the entry if the parameter names match
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
None
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
===========================================================================*/
|
||||
int loc_set_config_entry(const loc_param_s_type* config_entry, loc_param_v_type* config_value)
|
||||
{
|
||||
int ret=-1;
|
||||
if(NULL == config_entry || NULL == config_value)
|
||||
{
|
||||
LOC_LOGE("%s: INVALID config entry or parameter", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (strcmp(config_entry->param_name, config_value->param_name) == 0 &&
|
||||
config_entry->param_ptr)
|
||||
{
|
||||
switch (config_entry->param_type)
|
||||
{
|
||||
case 's':
|
||||
if (strcmp(config_value->param_str_value, "NULL") == 0)
|
||||
{
|
||||
*((char*)config_entry->param_ptr) = '\0';
|
||||
}
|
||||
else {
|
||||
strlcpy((char*) config_entry->param_ptr,
|
||||
config_value->param_str_value,
|
||||
LOC_MAX_PARAM_STRING + 1);
|
||||
}
|
||||
/* Log INI values */
|
||||
LOC_LOGD("%s: PARAM %s = %s", __FUNCTION__,
|
||||
config_entry->param_name, (char*)config_entry->param_ptr);
|
||||
|
||||
if(NULL != config_entry->param_set)
|
||||
{
|
||||
*(config_entry->param_set) = 1;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
case 'n':
|
||||
*((int *)config_entry->param_ptr) = config_value->param_int_value;
|
||||
/* Log INI values */
|
||||
LOC_LOGD("%s: PARAM %s = %d", __FUNCTION__,
|
||||
config_entry->param_name, config_value->param_int_value);
|
||||
|
||||
if(NULL != config_entry->param_set)
|
||||
{
|
||||
*(config_entry->param_set) = 1;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
case 'f':
|
||||
*((double *)config_entry->param_ptr) = config_value->param_double_value;
|
||||
/* Log INI values */
|
||||
LOC_LOGD("%s: PARAM %s = %f", __FUNCTION__,
|
||||
config_entry->param_name, config_value->param_double_value);
|
||||
|
||||
if(NULL != config_entry->param_set)
|
||||
{
|
||||
*(config_entry->param_set) = 1;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
default:
|
||||
LOC_LOGE("%s: PARAM %s parameter type must be n, f, or s",
|
||||
__FUNCTION__, config_entry->param_name);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_fill_conf_item
|
||||
|
||||
DESCRIPTION
|
||||
Takes a line of configuration item and sets defined values based on
|
||||
the passed in configuration table. This table maps strings to values to
|
||||
set along with the type of each of these values.
|
||||
|
||||
PARAMETERS:
|
||||
input_buf : buffer contanis config item
|
||||
config_table: table definition of strings to places to store information
|
||||
table_length: length of the configuration table
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
0: Number of records in the config_table filled with input_buf
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
===========================================================================*/
|
||||
int loc_fill_conf_item(char* input_buf,
|
||||
const loc_param_s_type* config_table, uint32_t table_length)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (input_buf && config_table) {
|
||||
char *lasts;
|
||||
loc_param_v_type config_value;
|
||||
memset(&config_value, 0, sizeof(config_value));
|
||||
|
||||
/* Separate variable and value */
|
||||
config_value.param_name = strtok_r(input_buf, "=", &lasts);
|
||||
/* skip lines that do not contain "=" */
|
||||
if (config_value.param_name) {
|
||||
config_value.param_str_value = strtok_r(NULL, "=", &lasts);
|
||||
|
||||
/* skip lines that do not contain two operands */
|
||||
if (config_value.param_str_value) {
|
||||
/* Trim leading and trailing spaces */
|
||||
loc_util_trim_space(config_value.param_name);
|
||||
loc_util_trim_space(config_value.param_str_value);
|
||||
|
||||
/* Parse numerical value */
|
||||
if ((strlen(config_value.param_str_value) >=3) &&
|
||||
(config_value.param_str_value[0] == '0') &&
|
||||
(tolower(config_value.param_str_value[1]) == 'x'))
|
||||
{
|
||||
/* hex */
|
||||
config_value.param_int_value = (int) strtol(&config_value.param_str_value[2],
|
||||
(char**) NULL, 16);
|
||||
}
|
||||
else {
|
||||
config_value.param_double_value = (double) atof(config_value.param_str_value); /* float */
|
||||
config_value.param_int_value = atoi(config_value.param_str_value); /* dec */
|
||||
}
|
||||
|
||||
for(uint32_t i = 0; NULL != config_table && i < table_length; i++)
|
||||
{
|
||||
if(!loc_set_config_entry(&config_table[i], &config_value)) {
|
||||
ret += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_read_conf_r (repetitive)
|
||||
|
||||
DESCRIPTION
|
||||
Reads the specified configuration file and sets defined values based on
|
||||
the passed in configuration table. This table maps strings to values to
|
||||
set along with the type of each of these values.
|
||||
The difference between this and loc_read_conf is that this function returns
|
||||
the file pointer position at the end of filling a config table. Also, it
|
||||
reads a fixed number of parameters at a time which is equal to the length
|
||||
of the configuration table. This functionality enables the caller to
|
||||
repeatedly call the function to read data from the same file.
|
||||
|
||||
PARAMETERS:
|
||||
conf_fp : file pointer
|
||||
config_table: table definition of strings to places to store information
|
||||
table_length: length of the configuration table
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
0: Table filled successfully
|
||||
1: No more parameters to read
|
||||
-1: Error filling table
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
===========================================================================*/
|
||||
int loc_read_conf_r(FILE *conf_fp, const loc_param_s_type* config_table, uint32_t table_length)
|
||||
{
|
||||
int ret=0;
|
||||
|
||||
unsigned int num_params=table_length;
|
||||
if(conf_fp == NULL) {
|
||||
LOC_LOGE("%s:%d]: ERROR: File pointer is NULL\n", __func__, __LINE__);
|
||||
ret = -1;
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Clear all validity bits */
|
||||
for(uint32_t i = 0; NULL != config_table && i < table_length; i++)
|
||||
{
|
||||
if(NULL != config_table[i].param_set)
|
||||
{
|
||||
*(config_table[i].param_set) = 0;
|
||||
}
|
||||
}
|
||||
|
||||
char input_buf[LOC_MAX_PARAM_LINE]; /* declare a char array */
|
||||
|
||||
LOC_LOGD("%s:%d]: num_params: %d\n", __func__, __LINE__, num_params);
|
||||
while(num_params)
|
||||
{
|
||||
if(!fgets(input_buf, LOC_MAX_PARAM_LINE, conf_fp)) {
|
||||
LOC_LOGD("%s:%d]: fgets returned NULL\n", __func__, __LINE__);
|
||||
break;
|
||||
}
|
||||
|
||||
num_params -= loc_fill_conf_item(input_buf, config_table, table_length);
|
||||
}
|
||||
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_udpate_conf
|
||||
|
||||
DESCRIPTION
|
||||
Parses the passed in buffer for configuration items, and update the table
|
||||
that is also passed in.
|
||||
|
||||
Reads the specified configuration file and sets defined values based on
|
||||
the passed in configuration table. This table maps strings to values to
|
||||
set along with the type of each of these values.
|
||||
|
||||
PARAMETERS:
|
||||
conf_data: configuration items in bufferas a string
|
||||
length: strlen(conf_data)
|
||||
config_table: table definition of strings to places to store information
|
||||
table_length: length of the configuration table
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
number of the records in the table that is updated at time of return.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
===========================================================================*/
|
||||
int loc_update_conf(const char* conf_data, int32_t length,
|
||||
const loc_param_s_type* config_table, uint32_t table_length)
|
||||
{
|
||||
int ret = -1;
|
||||
|
||||
if (conf_data && length && config_table && table_length) {
|
||||
// make a copy, so we do not tokenize the original data
|
||||
char* conf_copy = (char*)malloc(length+1);
|
||||
|
||||
if (conf_copy != NULL)
|
||||
{
|
||||
memcpy(conf_copy, conf_data, length);
|
||||
// we hard NULL the end of string to be safe
|
||||
conf_copy[length] = 0;
|
||||
|
||||
// start with one record off
|
||||
uint32_t num_params = table_length - 1;
|
||||
char* saveptr = NULL;
|
||||
char* input_buf = strtok_r(conf_copy, "\n", &saveptr);
|
||||
ret = 0;
|
||||
|
||||
LOC_LOGD("%s:%d]: num_params: %d\n", __func__, __LINE__, num_params);
|
||||
while(num_params && input_buf) {
|
||||
ret++;
|
||||
num_params -= loc_fill_conf_item(input_buf, config_table, table_length);
|
||||
input_buf = strtok_r(NULL, "\n", &saveptr);
|
||||
}
|
||||
free(conf_copy);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_read_conf
|
||||
|
||||
DESCRIPTION
|
||||
Reads the specified configuration file and sets defined values based on
|
||||
the passed in configuration table. This table maps strings to values to
|
||||
set along with the type of each of these values.
|
||||
|
||||
PARAMETERS:
|
||||
conf_file_name: configuration file to read
|
||||
config_table: table definition of strings to places to store information
|
||||
table_length: length of the configuration table
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
None
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
===========================================================================*/
|
||||
void loc_read_conf(const char* conf_file_name, const loc_param_s_type* config_table,
|
||||
uint32_t table_length)
|
||||
{
|
||||
FILE *conf_fp = NULL;
|
||||
char *lasts;
|
||||
loc_param_v_type config_value;
|
||||
uint32_t i;
|
||||
|
||||
if((conf_fp = fopen(conf_file_name, "r")) != NULL)
|
||||
{
|
||||
LOC_LOGD("%s: using %s", __FUNCTION__, conf_file_name);
|
||||
if(table_length && config_table) {
|
||||
loc_read_conf_r(conf_fp, config_table, table_length);
|
||||
rewind(conf_fp);
|
||||
}
|
||||
loc_read_conf_r(conf_fp, loc_param_table, loc_param_num);
|
||||
fclose(conf_fp);
|
||||
}
|
||||
/* Initialize logging mechanism with parsed data */
|
||||
loc_logger_init(DEBUG_LEVEL, TIMESTAMP);
|
||||
}
|
91
gps/utils/loc_cfg.h
Normal file
91
gps/utils/loc_cfg.h
Normal file
@ -0,0 +1,91 @@
|
||||
/* Copyright (c) 2011-2015, 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_CFG_H
|
||||
#define LOC_CFG_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define LOC_MAX_PARAM_NAME 80
|
||||
#define LOC_MAX_PARAM_STRING 80
|
||||
#define LOC_MAX_PARAM_LINE (LOC_MAX_PARAM_NAME + LOC_MAX_PARAM_STRING)
|
||||
|
||||
#define UTIL_UPDATE_CONF(conf_data, len, config_table) \
|
||||
loc_update_conf((conf_data), (len), (config_table), \
|
||||
sizeof(config_table) / sizeof(config_table[0]))
|
||||
|
||||
#define UTIL_READ_CONF_DEFAULT(filename) \
|
||||
loc_read_conf((filename), NULL, 0);
|
||||
|
||||
#define UTIL_READ_CONF(filename, config_table) \
|
||||
loc_read_conf((filename), (config_table), sizeof(config_table) / sizeof(config_table[0]))
|
||||
|
||||
/*=============================================================================
|
||||
*
|
||||
* MODULE TYPE DECLARATION
|
||||
*
|
||||
*============================================================================*/
|
||||
typedef struct
|
||||
{
|
||||
const char *param_name;
|
||||
void *param_ptr;
|
||||
uint8_t *param_set; /* was this value set by config file? */
|
||||
char param_type; /* 'n' for number,
|
||||
's' for string,
|
||||
'f' for float */
|
||||
} loc_param_s_type;
|
||||
|
||||
/*=============================================================================
|
||||
*
|
||||
* MODULE EXTERNAL DATA
|
||||
*
|
||||
*============================================================================*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*=============================================================================
|
||||
*
|
||||
* MODULE EXPORTED FUNCTIONS
|
||||
*
|
||||
*============================================================================*/
|
||||
void loc_read_conf(const char* conf_file_name,
|
||||
const loc_param_s_type* config_table,
|
||||
uint32_t table_length);
|
||||
int loc_read_conf_r(FILE *conf_fp, const loc_param_s_type* config_table,
|
||||
uint32_t table_length);
|
||||
int loc_update_conf(const char* conf_data, int32_t length,
|
||||
const loc_param_s_type* config_table, uint32_t table_length);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LOC_CFG_H */
|
242
gps/utils/loc_log.cpp
Normal file
242
gps/utils/loc_log.cpp
Normal file
@ -0,0 +1,242 @@
|
||||
/* Copyright (c) 2011-2012, 2015, 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
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
#include "loc_log.h"
|
||||
#include "msg_q.h"
|
||||
#ifdef USE_GLIB
|
||||
#include <time.h>
|
||||
#endif /* USE_GLIB */
|
||||
#include "log_util.h"
|
||||
#include "platform_lib_includes.h"
|
||||
|
||||
#define BUFFER_SIZE 120
|
||||
|
||||
// Logging Improvements
|
||||
const char *loc_logger_boolStr[]={"False","True"};
|
||||
const char VOID_RET[] = "None";
|
||||
const char FROM_AFW[] = "===>";
|
||||
const char TO_MODEM[] = "--->";
|
||||
const char FROM_MODEM[] = "<---";
|
||||
const char TO_AFW[] = "<===";
|
||||
const char EXIT_TAG[] = "Exiting";
|
||||
const char ENTRY_TAG[] = "Entering";
|
||||
const char EXIT_ERROR_TAG[] = "Exiting with error";
|
||||
|
||||
/* Logging Mechanism */
|
||||
loc_logger_s_type loc_logger;
|
||||
|
||||
/* Get names from value */
|
||||
const char* loc_get_name_from_mask(const loc_name_val_s_type table[], size_t table_size, long mask)
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; i < table_size; i++)
|
||||
{
|
||||
if (table[i].val & (long) mask)
|
||||
{
|
||||
return table[i].name;
|
||||
}
|
||||
}
|
||||
return UNKNOWN_STR;
|
||||
}
|
||||
|
||||
/* Get names from value */
|
||||
const char* loc_get_name_from_val(const loc_name_val_s_type table[], size_t table_size, long value)
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; i < table_size; i++)
|
||||
{
|
||||
if (table[i].val == (long) value)
|
||||
{
|
||||
return table[i].name;
|
||||
}
|
||||
}
|
||||
return UNKNOWN_STR;
|
||||
}
|
||||
|
||||
static const loc_name_val_s_type loc_msg_q_status[] =
|
||||
{
|
||||
NAME_VAL( eMSG_Q_SUCCESS ),
|
||||
NAME_VAL( eMSG_Q_FAILURE_GENERAL ),
|
||||
NAME_VAL( eMSG_Q_INVALID_PARAMETER ),
|
||||
NAME_VAL( eMSG_Q_INVALID_HANDLE ),
|
||||
NAME_VAL( eMSG_Q_UNAVAILABLE_RESOURCE ),
|
||||
NAME_VAL( eMSG_Q_INSUFFICIENT_BUFFER )
|
||||
};
|
||||
static const size_t loc_msg_q_status_num = LOC_TABLE_SIZE(loc_msg_q_status);
|
||||
|
||||
/* Find msg_q status name */
|
||||
const char* loc_get_msg_q_status(int status)
|
||||
{
|
||||
return loc_get_name_from_val(loc_msg_q_status, loc_msg_q_status_num, (long) status);
|
||||
}
|
||||
|
||||
const char* log_succ_fail_string(int is_succ)
|
||||
{
|
||||
return is_succ? "successful" : "failed";
|
||||
}
|
||||
|
||||
//Target names
|
||||
static const loc_name_val_s_type target_name[] =
|
||||
{
|
||||
NAME_VAL(GNSS_NONE),
|
||||
NAME_VAL(GNSS_MSM),
|
||||
NAME_VAL(GNSS_GSS),
|
||||
NAME_VAL(GNSS_MDM),
|
||||
NAME_VAL(GNSS_QCA1530),
|
||||
NAME_VAL(GNSS_AUTO),
|
||||
NAME_VAL(GNSS_UNKNOWN)
|
||||
};
|
||||
|
||||
static const size_t target_name_num = LOC_TABLE_SIZE(target_name);
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_get_target_name
|
||||
|
||||
DESCRIPTION
|
||||
Returns pointer to a string that contains name of the target
|
||||
|
||||
XX:XX:XX.000\0
|
||||
|
||||
RETURN VALUE
|
||||
The target name string
|
||||
|
||||
===========================================================================*/
|
||||
const char *loc_get_target_name(unsigned int target)
|
||||
{
|
||||
int index = 0;
|
||||
static char ret[BUFFER_SIZE];
|
||||
|
||||
index = getTargetGnssType(target);
|
||||
if( index < 0 || (unsigned)index >= target_name_num )
|
||||
index = target_name_num - 1;
|
||||
|
||||
if( (target & HAS_SSC) == HAS_SSC ) {
|
||||
snprintf(ret, sizeof(ret), " %s with SSC",
|
||||
loc_get_name_from_val(target_name, target_name_num, (long)index) );
|
||||
}
|
||||
else {
|
||||
snprintf(ret, sizeof(ret), " %s without SSC",
|
||||
loc_get_name_from_val(target_name, target_name_num, (long)index) );
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_get_time
|
||||
|
||||
DESCRIPTION
|
||||
Logs a callback event header.
|
||||
The pointer time_string should point to a buffer of at least 13 bytes:
|
||||
|
||||
XX:XX:XX.000\0
|
||||
|
||||
RETURN VALUE
|
||||
The time string
|
||||
|
||||
===========================================================================*/
|
||||
char *loc_get_time(char *time_string, size_t buf_size)
|
||||
{
|
||||
struct timeval now; /* sec and usec */
|
||||
struct tm now_tm; /* broken-down time */
|
||||
char hms_string[80]; /* HH:MM:SS */
|
||||
|
||||
gettimeofday(&now, NULL);
|
||||
localtime_r(&now.tv_sec, &now_tm);
|
||||
|
||||
strftime(hms_string, sizeof hms_string, "%H:%M:%S", &now_tm);
|
||||
snprintf(time_string, buf_size, "%s.%03d", hms_string, (int) (now.tv_usec / 1000));
|
||||
|
||||
return time_string;
|
||||
}
|
||||
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_logger_init
|
||||
|
||||
DESCRIPTION
|
||||
Initializes the state of DEBUG_LEVEL and TIMESTAMP
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
None
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
===========================================================================*/
|
||||
void loc_logger_init(unsigned long debug, unsigned long timestamp)
|
||||
{
|
||||
loc_logger.DEBUG_LEVEL = debug;
|
||||
#ifdef TARGET_BUILD_VARIANT_USER
|
||||
// force user builds to 2 or less
|
||||
if (loc_logger.DEBUG_LEVEL > 2) {
|
||||
loc_logger.DEBUG_LEVEL = 2;
|
||||
}
|
||||
#endif
|
||||
loc_logger.TIMESTAMP = timestamp;
|
||||
}
|
||||
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION get_timestamp
|
||||
|
||||
DESCRIPTION
|
||||
Generates a timestamp using the current system time
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Char pointer to the parameter str
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
===========================================================================*/
|
||||
char * get_timestamp(char *str, unsigned long buf_size)
|
||||
{
|
||||
struct timeval tv;
|
||||
struct timezone tz;
|
||||
int hh, mm, ss;
|
||||
gettimeofday(&tv, &tz);
|
||||
hh = tv.tv_sec/3600%24;
|
||||
mm = (tv.tv_sec%3600)/60;
|
||||
ss = tv.tv_sec%60;
|
||||
snprintf(str, buf_size, "%02d:%02d:%02d.%06ld", hh, mm, ss, tv.tv_usec);
|
||||
return str;
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user