diff options
Diffstat (limited to 'gps')
130 files changed, 0 insertions, 32178 deletions
diff --git a/gps/Android.mk b/gps/Android.mk deleted file mode 100644 index 23b2a66..0000000 --- a/gps/Android.mk +++ /dev/null @@ -1,6 +0,0 @@ -ifneq ($(BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE),) -LOCAL_PATH := $(call my-dir) -include $(LOCAL_PATH)/build/target_specific_features.mk - -include $(call all-makefiles-under,$(LOCAL_PATH)) -endif diff --git a/gps/CleanSpec.mk b/gps/CleanSpec.mk deleted file mode 100644 index dd1849d..0000000 --- a/gps/CleanSpec.mk +++ /dev/null @@ -1,50 +0,0 @@ -# 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*) diff --git a/gps/Makefile.am b/gps/Makefile.am deleted file mode 100644 index cd4a731..0000000 --- a/gps/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -# Makefile.am - Automake script for gps loc_api -# - -ACLOCAL_AMFLAGS = -I m4 - -SUBDIRS = gnss - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = loc-hal.pc -EXTRA_DIST = $(pkgconfig_DATA) diff --git a/gps/android/AGnss.cpp b/gps/android/AGnss.cpp deleted file mode 100644 index faaf75e..0000000 --- a/gps/android/AGnss.cpp +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - * Not a Contribution - */ -/* - * Copyright (C) 2016 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. - */ - -#define LOG_TAG "LocSvc_AGnssInterface" - -#include <log_util.h> -#include "Gnss.h" -#include "AGnss.h" - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -static AGnss* spAGnss = nullptr; - -AGnss::AGnss(Gnss* gnss) : mGnss(gnss) { - spAGnss = this; -} - -AGnss::~AGnss() { - spAGnss = nullptr; -} - -void AGnss::agnssStatusIpV4Cb(AGnssExtStatusIpV4 status){ - if (nullptr != spAGnss) { - spAGnss->statusIpV4Cb(status); - } -} - -void AGnss::statusIpV4Cb(AGnssExtStatusIpV4 status) { - IAGnssCallback::AGnssStatusIpV4 st = {}; - - switch (status.type) { - case LOC_AGPS_TYPE_SUPL: - st.type = IAGnssCallback::AGnssType::TYPE_SUPL; - break; - case LOC_AGPS_TYPE_C2K: - st.type = IAGnssCallback::AGnssType::TYPE_C2K; - break; - default: - LOC_LOGE("invalid type: %d", status.type); - return; - } - - switch (status.status) { - case LOC_GPS_REQUEST_AGPS_DATA_CONN: - st.status = IAGnssCallback::AGnssStatusValue::REQUEST_AGNSS_DATA_CONN; - break; - case LOC_GPS_RELEASE_AGPS_DATA_CONN: - st.status = IAGnssCallback::AGnssStatusValue::RELEASE_AGNSS_DATA_CONN; - break; - case LOC_GPS_AGPS_DATA_CONNECTED: - st.status = IAGnssCallback::AGnssStatusValue::AGNSS_DATA_CONNECTED; - break; - case LOC_GPS_AGPS_DATA_CONN_DONE: - st.status = IAGnssCallback::AGnssStatusValue::AGNSS_DATA_CONN_DONE; - break; - case LOC_GPS_AGPS_DATA_CONN_FAILED: - st.status = IAGnssCallback::AGnssStatusValue::AGNSS_DATA_CONN_FAILED; - break; - default: - LOC_LOGE("invalid status: %d", status.status); - return; - } - st.ipV4Addr = status.ipV4Addr; - - if (mAGnssCbIface != nullptr) { - auto r = mAGnssCbIface->agnssStatusIpV4Cb(st); - if (!r.isOk()) { - LOC_LOGw("Error invoking AGNSS status cb %s", r.description().c_str()); - } - } else { - LOC_LOGw("setCallback has not been called yet"); - } -} - -Return<void> AGnss::setCallback(const sp<IAGnssCallback>& callback) { - - if(mGnss == nullptr || mGnss->getGnssInterface() == nullptr){ - LOC_LOGE("Null GNSS interface"); - return Void(); - } - - // Save the interface - mAGnssCbIface = callback; - - AgpsCbInfo cbInfo = {}; - cbInfo.statusV4Cb = (void*)agnssStatusIpV4Cb; - cbInfo.cbPriority = AGPS_CB_PRIORITY_LOW; - - mGnss->getGnssInterface()->agpsInit(cbInfo); - return Void(); -} - -Return<bool> AGnss::dataConnClosed() { - - if(mGnss == nullptr || mGnss->getGnssInterface() == nullptr){ - LOC_LOGE("Null GNSS interface"); - return false; - } - - mGnss->getGnssInterface()->agpsDataConnClosed(LOC_AGPS_TYPE_SUPL); - return true; -} - -Return<bool> AGnss::dataConnFailed() { - - if(mGnss == nullptr || mGnss->getGnssInterface() == nullptr){ - LOC_LOGE("Null GNSS interface"); - return false; - } - - mGnss->getGnssInterface()->agpsDataConnFailed(LOC_AGPS_TYPE_SUPL); - return true; -} - -Return<bool> AGnss::dataConnOpen(const hidl_string& apn, - IAGnss::ApnIpType apnIpType) { - - if(mGnss == nullptr || mGnss->getGnssInterface() == nullptr){ - LOC_LOGE("Null GNSS interface"); - return false; - } - - /* Validate */ - if(apn.empty()){ - LOC_LOGE("Invalid APN"); - return false; - } - - LOC_LOGD("dataConnOpen APN name = [%s]", apn.c_str()); - - AGpsBearerType bearerType; - switch (apnIpType) { - case IAGnss::ApnIpType::IPV4: - bearerType = AGPS_APN_BEARER_IPV4; - break; - case IAGnss::ApnIpType::IPV6: - bearerType = AGPS_APN_BEARER_IPV6; - break; - case IAGnss::ApnIpType::IPV4V6: - bearerType = AGPS_APN_BEARER_IPV4V6; - break; - default: - bearerType = AGPS_APN_BEARER_IPV4; - break; - } - - mGnss->getGnssInterface()->agpsDataConnOpen( - LOC_AGPS_TYPE_SUPL, apn.c_str(), apn.size(), (int)bearerType); - return true; -} - -Return<bool> AGnss::setServer(IAGnssCallback::AGnssType type, - const hidl_string& hostname, - int32_t port) { - if (mGnss == nullptr) { - LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__); - return false; - } - - GnssConfig config; - memset(&config, 0, sizeof(GnssConfig)); - config.size = sizeof(GnssConfig); - config.flags = GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT; - config.assistanceServer.size = sizeof(GnssConfigSetAssistanceServer); - if (type == IAGnssCallback::AGnssType::TYPE_SUPL) { - config.assistanceServer.type = GNSS_ASSISTANCE_TYPE_SUPL; - } else if (type == IAGnssCallback::AGnssType::TYPE_C2K) { - config.assistanceServer.type = GNSS_ASSISTANCE_TYPE_C2K; - } else { - LOC_LOGE("%s]: invalid AGnssType: %d", __FUNCTION__, static_cast<int>(type)); - return false; - } - config.assistanceServer.hostName = strdup(hostname.c_str()); - config.assistanceServer.port = port; - return mGnss->updateConfiguration(config); -} - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android diff --git a/gps/android/AGnss.h b/gps/android/AGnss.h deleted file mode 100644 index cdd5931..0000000 --- a/gps/android/AGnss.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - * Not a Contribution - */ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_HARDWARE_GNSS_V1_0_AGNSS_H -#define ANDROID_HARDWARE_GNSS_V1_0_AGNSS_H - -#include <android/hardware/gnss/1.0/IAGnss.h> -#include <hidl/Status.h> -#include <gps_extended_c.h> - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::hardware::gnss::V1_0::IAGnss; -using ::android::hardware::gnss::V1_0::IAGnssCallback; -using ::android::hardware::Return; -using ::android::hardware::Void; -using ::android::hardware::hidl_vec; -using ::android::hardware::hidl_string; -using ::android::sp; - -struct Gnss; -struct AGnss : public IAGnss { - - AGnss(Gnss* gnss); - ~AGnss(); - /* - * Methods from ::android::hardware::gnss::V1_0::IAGnss interface follow. - * These declarations were generated from IAGnss.hal. - */ - Return<void> setCallback(const sp<IAGnssCallback>& callback) override; - - Return<bool> dataConnClosed() override; - - Return<bool> dataConnFailed() override; - - Return<bool> dataConnOpen(const hidl_string& apn, - IAGnss::ApnIpType apnIpType) override; - - Return<bool> setServer(IAGnssCallback::AGnssType type, - const hidl_string& hostname, int32_t port) override; - - void statusIpV4Cb(AGnssExtStatusIpV4 status); - - /* Data call setup callback passed down to GNSS HAL implementation */ - static void agnssStatusIpV4Cb(AGnssExtStatusIpV4 status); - - private: - Gnss* mGnss = nullptr; - sp<IAGnssCallback> mAGnssCbIface = nullptr; -}; - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android - -#endif // ANDROID_HARDWARE_GNSS_V1_0_AGNSS_H diff --git a/gps/android/AGnssRil.cpp b/gps/android/AGnssRil.cpp deleted file mode 100644 index f4b9849..0000000 --- a/gps/android/AGnssRil.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - * Not a Contribution - */ -/* - * Copyright (C) 2016 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. - */ - -#define LOG_TAG "LocSvc__AGnssRilInterface" - -#include <log_util.h> -#include <dlfcn.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <sstream> -#include <string> -#include "Gnss.h" -#include "AGnssRil.h" -#include <DataItemConcreteTypesBase.h> - -typedef void* (getLocationInterface)(); - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - - -AGnssRil::AGnssRil(Gnss* gnss) : mGnss(gnss) { - ENTRY_LOG_CALLFLOW(); -} - -AGnssRil::~AGnssRil() { - ENTRY_LOG_CALLFLOW(); -} - -Return<bool> AGnssRil::updateNetworkState(bool connected, NetworkType type, bool /*roaming*/) { - ENTRY_LOG_CALLFLOW(); - - // for XTRA - if (nullptr != mGnss && ( nullptr != mGnss->getGnssInterface() )) { - int8_t typeout = loc_core::NetworkInfoDataItemBase::TYPE_UNKNOWN; - switch(type) - { - case IAGnssRil::NetworkType::MOBILE: - typeout = loc_core::NetworkInfoDataItemBase::TYPE_MOBILE; - break; - case IAGnssRil::NetworkType::WIFI: - typeout = loc_core::NetworkInfoDataItemBase::TYPE_WIFI; - break; - case IAGnssRil::NetworkType::MMS: - typeout = loc_core::NetworkInfoDataItemBase::TYPE_MMS; - break; - case IAGnssRil::NetworkType::SUPL: - typeout = loc_core::NetworkInfoDataItemBase::TYPE_SUPL; - break; - case IAGnssRil::NetworkType::DUN: - typeout = loc_core::NetworkInfoDataItemBase::TYPE_DUN; - break; - case IAGnssRil::NetworkType::HIPRI: - typeout = loc_core::NetworkInfoDataItemBase::TYPE_HIPRI; - break; - case IAGnssRil::NetworkType::WIMAX: - typeout = loc_core::NetworkInfoDataItemBase::TYPE_WIMAX; - break; - default: - typeout = loc_core::NetworkInfoDataItemBase::TYPE_UNKNOWN; - break; - } - mGnss->getGnssInterface()->updateConnectionStatus(connected, typeout); - } - return true; -} - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android diff --git a/gps/android/AGnssRil.h b/gps/android/AGnssRil.h deleted file mode 100644 index 7f18c57..0000000 --- a/gps/android/AGnssRil.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - * Not a Contribution - */ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_HARDWARE_GNSS_V1_0_AGNSSRIL_H_ -#define ANDROID_HARDWARE_GNSS_V1_0_AGNSSRIL_H_ - -#include <android/hardware/gnss/1.0/IAGnssRil.h> -#include <hidl/Status.h> -#include <location_interface.h> - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::hardware::gnss::V1_0::IAGnssRil; -using ::android::hardware::gnss::V1_0::IAGnssRilCallback; -using ::android::hardware::Return; -using ::android::hardware::Void; -using ::android::hardware::hidl_vec; -using ::android::hardware::hidl_string; -using ::android::sp; - -struct Gnss; -/* - * Extended interface for AGNSS RIL support. An Assisted GNSS Radio Interface Layer interface - * allows the GNSS chipset to request radio interface layer information from Android platform. - * Examples of such information are reference location, unique subscriber ID, phone number string - * and network availability changes. Also contains wrapper methods to allow methods from - * IAGnssiRilCallback interface to be passed into the conventional implementation of the GNSS HAL. - */ -struct AGnssRil : public IAGnssRil { - AGnssRil(Gnss* gnss); - ~AGnssRil(); - - /* - * Methods from ::android::hardware::gnss::V1_0::IAGnssRil follow. - * These declarations were generated from IAGnssRil.hal. - */ - Return<void> setCallback(const sp<IAGnssRilCallback>& /*callback*/) override { - return Void(); - } - Return<void> setRefLocation(const IAGnssRil::AGnssRefLocation& /*agnssReflocation*/) override { - return Void(); - } - Return<bool> setSetId(IAGnssRil::SetIDType /*type*/, const hidl_string& /*setid*/) override { - return false; - } - Return<bool> updateNetworkAvailability(bool /*available*/, - const hidl_string& /*apn*/) override { - return false; - } - Return<bool> updateNetworkState(bool connected, NetworkType type, bool roaming) override; - - private: - Gnss* mGnss = nullptr; -}; - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android - -#endif // ANDROID_HARDWARE_GNSS_V1_0_AGNSSRIL_H_ diff --git a/gps/android/Android.mk b/gps/android/Android.mk deleted file mode 100644 index dc721db..0000000 --- a/gps/android/Android.mk +++ /dev/null @@ -1,91 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.gnss@1.0-impl-qti -LOCAL_VENDOR_MODULE := true -LOCAL_MODULE_RELATIVE_PATH := hw -LOCAL_SRC_FILES := \ - AGnss.cpp \ - Gnss.cpp \ - GnssBatching.cpp \ - GnssGeofencing.cpp \ - GnssMeasurement.cpp \ - GnssNi.cpp \ - GnssConfiguration.cpp \ - GnssDebug.cpp \ - AGnssRil.cpp - -LOCAL_SRC_FILES += \ - location_api/LocationUtil.cpp \ - location_api/GnssAPIClient.cpp \ - location_api/GeofenceAPIClient.cpp \ - location_api/BatchingAPIClient.cpp \ - location_api/MeasurementAPIClient.cpp \ - -LOCAL_C_INCLUDES:= \ - $(LOCAL_PATH)/location_api -LOCAL_HEADER_LIBRARIES := \ - libgps.utils_headers \ - libloc_core_headers \ - libloc_pla_headers \ - liblocation_api_headers - -LOCAL_SHARED_LIBRARIES := \ - liblog \ - libhidlbase \ - libhidltransport \ - libhwbinder \ - libcutils \ - libutils \ - android.hardware.gnss@1.0 \ - -LOCAL_SHARED_LIBRARIES += \ - libloc_core \ - libgps.utils \ - libdl \ - liblocation_api \ - -LOCAL_CFLAGS += $(GNSS_CFLAGS) -include $(BUILD_SHARED_LIBRARY) - -BUILD_GNSS_HIDL_SERVICE := true -ifneq ($(BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET), true) -ifneq ($(LW_FEATURE_SET),true) -BUILD_GNSS_HIDL_SERVICE := false -endif # LW_FEATURE_SET -endif # BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET - -ifeq ($(BUILD_GNSS_HIDL_SERVICE), true) -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.gnss@1.0-service-qti -LOCAL_VENDOR_MODULE := true -LOCAL_MODULE_RELATIVE_PATH := hw -LOCAL_INIT_RC := android.hardware.gnss@1.0-service-qti.rc -LOCAL_SRC_FILES := \ - service.cpp \ - -LOCAL_C_INCLUDES:= \ - $(LOCAL_PATH)/location_api -LOCAL_HEADER_LIBRARIES := \ - libgps.utils_headers \ - libloc_core_headers \ - libloc_pla_headers \ - liblocation_api_headers - - -LOCAL_SHARED_LIBRARIES := \ - liblog \ - libcutils \ - libdl \ - libbase \ - libutils \ - -LOCAL_SHARED_LIBRARIES += \ - libhwbinder \ - libhidlbase \ - libhidltransport \ - android.hardware.gnss@1.0 \ - -LOCAL_CFLAGS += $(GNSS_CFLAGS) -include $(BUILD_EXECUTABLE) -endif # BUILD_GNSS_HIDL_SERVICE diff --git a/gps/android/Gnss.cpp b/gps/android/Gnss.cpp deleted file mode 100644 index c844118..0000000 --- a/gps/android/Gnss.cpp +++ /dev/null @@ -1,343 +0,0 @@ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - * Not a Contribution - */ -/* - * Copyright (C) 2016 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. - */ - -#define LOG_TAG "LocSvc_GnssInterface" - -#include <fstream> -#include <log_util.h> -#include <dlfcn.h> -#include <cutils/properties.h> -#include "Gnss.h" -#include <LocationUtil.h> - -typedef void* (getLocationInterface)(); - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -void Gnss::GnssDeathRecipient::serviceDied(uint64_t cookie, const wp<IBase>& who) { - LOC_LOGE("%s] service died. cookie: %llu, who: %p", - __FUNCTION__, static_cast<unsigned long long>(cookie), &who); - if (mGnss != nullptr) { - mGnss->stop(); - mGnss->cleanup(); - } -} - -Gnss::Gnss() { - ENTRY_LOG_CALLFLOW(); - // clear pending GnssConfig - memset(&mPendingConfig, 0, sizeof(GnssConfig)); - - mGnssDeathRecipient = new GnssDeathRecipient(this); -} - -Gnss::~Gnss() { - ENTRY_LOG_CALLFLOW(); - if (mApi != nullptr) { - delete mApi; - mApi = nullptr; - } -} - -GnssAPIClient* Gnss::getApi() { - if (mApi == nullptr && (mGnssCbIface != nullptr || mGnssNiCbIface != nullptr)) { - mApi = new GnssAPIClient(mGnssCbIface, mGnssNiCbIface); - if (mApi == nullptr) { - LOC_LOGE("%s] faild to create GnssAPIClient", __FUNCTION__); - return mApi; - } - - if (mPendingConfig.size == sizeof(GnssConfig)) { - // we have pending GnssConfig - mApi->gnssConfigurationUpdate(mPendingConfig); - // clear size to invalid mPendingConfig - mPendingConfig.size = 0; - if (mPendingConfig.assistanceServer.hostName != nullptr) { - free((void*)mPendingConfig.assistanceServer.hostName); - } - } - } - if (mApi == nullptr) { - LOC_LOGW("%s] GnssAPIClient is not ready", __FUNCTION__); - } - return mApi; -} - -GnssInterface* Gnss::getGnssInterface() { - static bool getGnssInterfaceFailed = false; - if (nullptr == mGnssInterface && !getGnssInterfaceFailed) { - LOC_LOGD("%s]: loading libgnss.so::getGnssInterface ...", __func__); - getLocationInterface* getter = NULL; - const char *error = NULL; - dlerror(); - void *handle = dlopen("libgnss.so", RTLD_NOW); - if (NULL == handle || (error = dlerror()) != NULL) { - LOC_LOGW("dlopen for libgnss.so failed, error = %s", error); - } else { - getter = (getLocationInterface*)dlsym(handle, "getGnssInterface"); - if ((error = dlerror()) != NULL) { - LOC_LOGW("dlsym for libgnss.so::getGnssInterface failed, error = %s", error); - getter = NULL; - } - } - - if (NULL == getter) { - getGnssInterfaceFailed = true; - } else { - mGnssInterface = (GnssInterface*)(*getter)(); - } - } - return mGnssInterface; -} - -Return<bool> Gnss::setCallback(const sp<V1_0::IGnssCallback>& callback) { - ENTRY_LOG_CALLFLOW(); - if (mGnssCbIface != nullptr) { - mGnssCbIface->unlinkToDeath(mGnssDeathRecipient); - } - mGnssCbIface = callback; - if (mGnssCbIface != nullptr) { - mGnssCbIface->linkToDeath(mGnssDeathRecipient, 0 /*cookie*/); - } - - GnssAPIClient* api = getApi(); - if (api != nullptr) { - api->gnssUpdateCallbacks(mGnssCbIface, mGnssNiCbIface); - api->gnssEnable(LOCATION_TECHNOLOGY_TYPE_GNSS); - api->requestCapabilities(); - } - return true; -} - -Return<bool> Gnss::setGnssNiCb(const sp<IGnssNiCallback>& callback) { - ENTRY_LOG_CALLFLOW(); - mGnssNiCbIface = callback; - GnssAPIClient* api = getApi(); - if (api != nullptr) { - api->gnssUpdateCallbacks(mGnssCbIface, mGnssNiCbIface); - } - return true; -} - -Return<bool> Gnss::updateConfiguration(GnssConfig& gnssConfig) { - ENTRY_LOG_CALLFLOW(); - GnssAPIClient* api = getApi(); - if (api) { - api->gnssConfigurationUpdate(gnssConfig); - } else if (gnssConfig.flags != 0) { - // api is not ready yet, update mPendingConfig with gnssConfig - mPendingConfig.size = sizeof(GnssConfig); - - if (gnssConfig.flags & GNSS_CONFIG_FLAGS_GPS_LOCK_VALID_BIT) { - mPendingConfig.flags |= GNSS_CONFIG_FLAGS_GPS_LOCK_VALID_BIT; - mPendingConfig.gpsLock = gnssConfig.gpsLock; - } - if (gnssConfig.flags & GNSS_CONFIG_FLAGS_SUPL_VERSION_VALID_BIT) { - mPendingConfig.flags |= GNSS_CONFIG_FLAGS_SUPL_VERSION_VALID_BIT; - mPendingConfig.suplVersion = gnssConfig.suplVersion; - } - if (gnssConfig.flags & GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT) { - mPendingConfig.flags |= GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT; - mPendingConfig.assistanceServer.size = sizeof(GnssConfigSetAssistanceServer); - mPendingConfig.assistanceServer.type = gnssConfig.assistanceServer.type; - if (mPendingConfig.assistanceServer.hostName != nullptr) { - free((void*)mPendingConfig.assistanceServer.hostName); - mPendingConfig.assistanceServer.hostName = - strdup(gnssConfig.assistanceServer.hostName); - } - mPendingConfig.assistanceServer.port = gnssConfig.assistanceServer.port; - } - if (gnssConfig.flags & GNSS_CONFIG_FLAGS_LPP_PROFILE_VALID_BIT) { - mPendingConfig.flags |= GNSS_CONFIG_FLAGS_LPP_PROFILE_VALID_BIT; - mPendingConfig.lppProfile = gnssConfig.lppProfile; - } - if (gnssConfig.flags & GNSS_CONFIG_FLAGS_LPPE_CONTROL_PLANE_VALID_BIT) { - mPendingConfig.flags |= GNSS_CONFIG_FLAGS_LPPE_CONTROL_PLANE_VALID_BIT; - mPendingConfig.lppeControlPlaneMask = gnssConfig.lppeControlPlaneMask; - } - if (gnssConfig.flags & GNSS_CONFIG_FLAGS_LPPE_USER_PLANE_VALID_BIT) { - mPendingConfig.flags |= GNSS_CONFIG_FLAGS_LPPE_USER_PLANE_VALID_BIT; - mPendingConfig.lppeUserPlaneMask = gnssConfig.lppeUserPlaneMask; - } - if (gnssConfig.flags & GNSS_CONFIG_FLAGS_AGLONASS_POSITION_PROTOCOL_VALID_BIT) { - mPendingConfig.flags |= GNSS_CONFIG_FLAGS_AGLONASS_POSITION_PROTOCOL_VALID_BIT; - mPendingConfig.aGlonassPositionProtocolMask = gnssConfig.aGlonassPositionProtocolMask; - } - if (gnssConfig.flags & GNSS_CONFIG_FLAGS_EM_PDN_FOR_EM_SUPL_VALID_BIT) { - mPendingConfig.flags |= GNSS_CONFIG_FLAGS_EM_PDN_FOR_EM_SUPL_VALID_BIT; - mPendingConfig.emergencyPdnForEmergencySupl = gnssConfig.emergencyPdnForEmergencySupl; - } - if (gnssConfig.flags & GNSS_CONFIG_FLAGS_SUPL_EM_SERVICES_BIT) { - mPendingConfig.flags |= GNSS_CONFIG_FLAGS_SUPL_EM_SERVICES_BIT; - mPendingConfig.suplEmergencyServices = gnssConfig.suplEmergencyServices; - } - if (gnssConfig.flags & GNSS_CONFIG_FLAGS_SUPL_MODE_BIT) { - mPendingConfig.flags |= GNSS_CONFIG_FLAGS_SUPL_MODE_BIT; - mPendingConfig.suplModeMask = gnssConfig.suplModeMask; - } - } - return true; -} - -Return<bool> Gnss::start() { - ENTRY_LOG_CALLFLOW(); - bool retVal = false; - GnssAPIClient* api = getApi(); - if (api) { - retVal = api->gnssStart(); - } - return retVal; -} - -Return<bool> Gnss::stop() { - ENTRY_LOG_CALLFLOW(); - bool retVal = false; - GnssAPIClient* api = getApi(); - if (api) { - retVal = api->gnssStop(); - } - return retVal; -} - -Return<void> Gnss::cleanup() { - ENTRY_LOG_CALLFLOW(); - - if (mApi != nullptr) { - mApi->gnssDisable(); - } - - return Void(); -} - -Return<bool> Gnss::injectLocation(double latitudeDegrees, - double longitudeDegrees, - float accuracyMeters) { - ENTRY_LOG_CALLFLOW(); - GnssInterface* gnssInterface = getGnssInterface(); - if (nullptr != gnssInterface) { - gnssInterface->injectLocation(latitudeDegrees, longitudeDegrees, accuracyMeters); - return true; - } else { - return false; - } -} - -Return<bool> Gnss::injectTime(int64_t timeMs, int64_t timeReferenceMs, - int32_t uncertaintyMs) { - ENTRY_LOG_CALLFLOW(); - GnssInterface* gnssInterface = getGnssInterface(); - if (nullptr != gnssInterface) { - gnssInterface->injectTime(timeMs, timeReferenceMs, uncertaintyMs); - return true; - } else { - return false; - } -} - -Return<void> Gnss::deleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags) { - ENTRY_LOG_CALLFLOW(); - GnssAPIClient* api = getApi(); - if (api) { - api->gnssDeleteAidingData(aidingDataFlags); - } - return Void(); -} - -Return<bool> Gnss::setPositionMode(V1_0::IGnss::GnssPositionMode mode, - V1_0::IGnss::GnssPositionRecurrence recurrence, - uint32_t minIntervalMs, - uint32_t preferredAccuracyMeters, - uint32_t preferredTimeMs) { - ENTRY_LOG_CALLFLOW(); - bool retVal = false; - GnssAPIClient* api = getApi(); - if (api) { - retVal = api->gnssSetPositionMode(mode, recurrence, minIntervalMs, - preferredAccuracyMeters, preferredTimeMs); - } - return retVal; -} - -Return<sp<V1_0::IAGnss>> Gnss::getExtensionAGnss() { - ENTRY_LOG_CALLFLOW(); - mAGnssIface = new AGnss(this); - return mAGnssIface; -} - -Return<sp<V1_0::IGnssNi>> Gnss::getExtensionGnssNi() { - ENTRY_LOG_CALLFLOW(); - mGnssNi = new GnssNi(this); - return mGnssNi; -} - -Return<sp<V1_0::IGnssMeasurement>> Gnss::getExtensionGnssMeasurement() { - ENTRY_LOG_CALLFLOW(); - if (mGnssMeasurement == nullptr) - mGnssMeasurement = new GnssMeasurement(); - return mGnssMeasurement; -} - -Return<sp<V1_0::IGnssConfiguration>> Gnss::getExtensionGnssConfiguration() { - ENTRY_LOG_CALLFLOW(); - mGnssConfig = new GnssConfiguration(this); - return mGnssConfig; -} - -Return<sp<V1_0::IGnssGeofencing>> Gnss::getExtensionGnssGeofencing() { - ENTRY_LOG_CALLFLOW(); - mGnssGeofencingIface = new GnssGeofencing(); - return mGnssGeofencingIface; -} - -Return<sp<V1_0::IGnssBatching>> Gnss::getExtensionGnssBatching() { - mGnssBatching = new GnssBatching(); - return mGnssBatching; -} - -Return<sp<V1_0::IGnssDebug>> Gnss::getExtensionGnssDebug() { - ENTRY_LOG_CALLFLOW(); - mGnssDebug = new GnssDebug(this); - return mGnssDebug; -} - -Return<sp<V1_0::IAGnssRil>> Gnss::getExtensionAGnssRil() { - mGnssRil = new AGnssRil(this); - return mGnssRil; -} - -IGnss* HIDL_FETCH_IGnss(const char* hal) { - ENTRY_LOG_CALLFLOW(); - IGnss* iface = nullptr; - iface = new Gnss(); - if (iface == nullptr) { - LOC_LOGE("%s]: failed to get %s", __FUNCTION__, hal); - } - return iface; -} - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android diff --git a/gps/android/Gnss.h b/gps/android/Gnss.h deleted file mode 100644 index 03ef170..0000000 --- a/gps/android/Gnss.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 2017-2018-2018-2018, The Linux Foundation. All rights reserved. - * Not a Contribution - */ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSS_H -#define ANDROID_HARDWARE_GNSS_V1_0_GNSS_H - -#include <AGnss.h> -#include <AGnssRil.h> -#include <GnssBatching.h> -#include <GnssConfiguration.h> -#include <GnssGeofencing.h> -#include <GnssMeasurement.h> -#include <GnssNi.h> -#include <GnssDebug.h> - -#include <android/hardware/gnss/1.0/IGnss.h> -#include <hidl/MQDescriptor.h> -#include <hidl/Status.h> - -#include <GnssAPIClient.h> -#include <location_interface.h> - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::hardware::hidl_array; -using ::android::hardware::hidl_memory; -using ::android::hardware::hidl_string; -using ::android::hardware::hidl_vec; -using ::android::hardware::Return; -using ::android::hardware::Void; -using ::android::sp; -using ::android::hardware::gnss::V1_0::GnssLocation; - -struct Gnss : public IGnss { - Gnss(); - ~Gnss(); - - /* - * Methods from ::android::hardware::gnss::V1_0::IGnss follow. - * These declarations were generated from Gnss.hal. - */ - Return<bool> setCallback(const sp<V1_0::IGnssCallback>& callback) override; - Return<bool> start() override; - Return<bool> stop() override; - Return<void> cleanup() override; - Return<bool> injectLocation(double latitudeDegrees, - double longitudeDegrees, - float accuracyMeters) override; - Return<bool> injectTime(int64_t timeMs, - int64_t timeReferenceMs, - int32_t uncertaintyMs) override; - Return<void> deleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags) override; - Return<bool> setPositionMode(V1_0::IGnss::GnssPositionMode mode, - V1_0::IGnss::GnssPositionRecurrence recurrence, - uint32_t minIntervalMs, - uint32_t preferredAccuracyMeters, - uint32_t preferredTimeMs) override; - Return<sp<V1_0::IAGnss>> getExtensionAGnss() override; - Return<sp<V1_0::IGnssNi>> getExtensionGnssNi() override; - Return<sp<V1_0::IGnssMeasurement>> getExtensionGnssMeasurement() override; - Return<sp<V1_0::IGnssConfiguration>> getExtensionGnssConfiguration() override; - Return<sp<V1_0::IGnssGeofencing>> getExtensionGnssGeofencing() override; - Return<sp<V1_0::IGnssBatching>> getExtensionGnssBatching() override; - - Return<sp<V1_0::IAGnssRil>> getExtensionAGnssRil() override; - - inline Return<sp<V1_0::IGnssNavigationMessage>> getExtensionGnssNavigationMessage() override { - return nullptr; - } - - inline Return<sp<V1_0::IGnssXtra>> getExtensionXtra() override { - return nullptr; - } - - Return<sp<V1_0::IGnssDebug>> getExtensionGnssDebug() override; - - // These methods are not part of the IGnss base class. - GnssAPIClient* getApi(); - Return<bool> setGnssNiCb(const sp<IGnssNiCallback>& niCb); - Return<bool> updateConfiguration(GnssConfig& gnssConfig); - GnssInterface* getGnssInterface(); - - // Callback for ODCPI request - void odcpiRequestCb(const OdcpiRequestInfo& request); - - private: - struct GnssDeathRecipient : hidl_death_recipient { - GnssDeathRecipient(sp<Gnss> gnss) : mGnss(gnss) { - } - ~GnssDeathRecipient() = default; - virtual void serviceDied(uint64_t cookie, const wp<IBase>& who) override; - sp<Gnss> mGnss; - }; - - private: - sp<GnssDeathRecipient> mGnssDeathRecipient = nullptr; - - sp<AGnss> mAGnssIface = nullptr; - sp<GnssNi> mGnssNi = nullptr; - sp<GnssMeasurement> mGnssMeasurement = nullptr; - sp<GnssConfiguration> mGnssConfig = nullptr; - sp<GnssGeofencing> mGnssGeofencingIface = nullptr; - sp<GnssBatching> mGnssBatching = nullptr; - sp<IGnssDebug> mGnssDebug = nullptr; - sp<AGnssRil> mGnssRil = nullptr; - - GnssAPIClient* mApi = nullptr; - sp<V1_0::IGnssCallback> mGnssCbIface = nullptr; - sp<V1_0::IGnssNiCallback> mGnssNiCbIface = nullptr; - GnssConfig mPendingConfig; - GnssInterface* mGnssInterface = nullptr; -}; - -extern "C" IGnss* HIDL_FETCH_IGnss(const char* name); - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android - -#endif // ANDROID_HARDWARE_GNSS_V1_0_GNSS_H diff --git a/gps/android/GnssBatching.cpp b/gps/android/GnssBatching.cpp deleted file mode 100644 index 3e5a9f4..0000000 --- a/gps/android/GnssBatching.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - * Not a Contribution - */ -/* - * Copyright (C) 2016 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. - */ - -#define LOG_TAG "LocSvc_GnssBatchingInterface" - -#include <log_util.h> -#include <BatchingAPIClient.h> -#include "GnssBatching.h" - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -void GnssBatching::GnssBatchingDeathRecipient::serviceDied( - uint64_t cookie, const wp<IBase>& who) { - LOC_LOGE("%s] service died. cookie: %llu, who: %p", - __FUNCTION__, static_cast<unsigned long long>(cookie), &who); - if (mGnssBatching != nullptr) { - mGnssBatching->stop(); - mGnssBatching->cleanup(); - } -} - -GnssBatching::GnssBatching() : mApi(nullptr) { - mGnssBatchingDeathRecipient = new GnssBatchingDeathRecipient(this); -} - -GnssBatching::~GnssBatching() { - if (mApi != nullptr) { - delete mApi; - mApi = nullptr; - } -} - - -// Methods from ::android::hardware::gnss::V1_0::IGnssBatching follow. -Return<bool> GnssBatching::init(const sp<IGnssBatchingCallback>& callback) { - if (mApi != nullptr) { - LOC_LOGD("%s]: mApi is NOT nullptr, delete it first", __FUNCTION__); - delete mApi; - mApi = nullptr; - } - - mApi = new BatchingAPIClient(callback); - if (mApi == nullptr) { - LOC_LOGE("%s]: failed to create mApi", __FUNCTION__); - return false; - } - - if (mGnssBatchingCbIface != nullptr) { - mGnssBatchingCbIface->unlinkToDeath(mGnssBatchingDeathRecipient); - } - mGnssBatchingCbIface = callback; - if (mGnssBatchingCbIface != nullptr) { - mGnssBatchingCbIface->linkToDeath(mGnssBatchingDeathRecipient, 0 /*cookie*/); - } - - return true; -} - -Return<uint16_t> GnssBatching::getBatchSize() { - uint16_t ret = 0; - if (mApi == nullptr) { - LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__); - } else { - ret = mApi->getBatchSize(); - } - return ret; -} - -Return<bool> GnssBatching::start(const IGnssBatching::Options& options) { - bool ret = false; - if (mApi == nullptr) { - LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__); - } else { - ret = mApi->startSession(options); - } - return ret; -} - -Return<void> GnssBatching::flush() { - if (mApi == nullptr) { - LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__); - } else { - mApi->flushBatchedLocations(); - } - return Void(); -} - -Return<bool> GnssBatching::stop() { - bool ret = false; - if (mApi == nullptr) { - LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__); - } else { - ret = mApi->stopSession(); - } - return ret; -} - -Return<void> GnssBatching::cleanup() { - if (mGnssBatchingCbIface != nullptr) { - mGnssBatchingCbIface->unlinkToDeath(mGnssBatchingDeathRecipient); - } - return Void(); -} - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android diff --git a/gps/android/GnssBatching.h b/gps/android/GnssBatching.h deleted file mode 100644 index 8fab857..0000000 --- a/gps/android/GnssBatching.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - * Not a Contribution - */ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSBATCHING_H -#define ANDROID_HARDWARE_GNSS_V1_0_GNSSBATCHING_H - -#include <android/hardware/gnss/1.0/IGnssBatching.h> -#include <hidl/Status.h> - - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::hardware::gnss::V1_0::IGnssBatching; -using ::android::hardware::gnss::V1_0::IGnssBatchingCallback; -using ::android::hidl::base::V1_0::IBase; -using ::android::hardware::hidl_array; -using ::android::hardware::hidl_memory; -using ::android::hardware::hidl_string; -using ::android::hardware::hidl_vec; -using ::android::hardware::Return; -using ::android::hardware::Void; -using ::android::sp; - -class BatchingAPIClient; -struct GnssBatching : public IGnssBatching { - GnssBatching(); - ~GnssBatching(); - - // Methods from ::android::hardware::gnss::V1_0::IGnssBatching follow. - Return<bool> init(const sp<IGnssBatchingCallback>& callback) override; - Return<uint16_t> getBatchSize() override; - Return<bool> start(const IGnssBatching::Options& options ) override; - Return<void> flush() override; - Return<bool> stop() override; - Return<void> cleanup() override; - - private: - struct GnssBatchingDeathRecipient : hidl_death_recipient { - GnssBatchingDeathRecipient(sp<GnssBatching> gnssBatching) : - mGnssBatching(gnssBatching) { - } - ~GnssBatchingDeathRecipient() = default; - virtual void serviceDied(uint64_t cookie, const wp<IBase>& who) override; - sp<GnssBatching> mGnssBatching; - }; - - private: - sp<GnssBatchingDeathRecipient> mGnssBatchingDeathRecipient = nullptr; - sp<IGnssBatchingCallback> mGnssBatchingCbIface = nullptr; - BatchingAPIClient* mApi = nullptr; -}; - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android - -#endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSBATCHING_H diff --git a/gps/android/GnssConfiguration.cpp b/gps/android/GnssConfiguration.cpp deleted file mode 100644 index 15153dd..0000000 --- a/gps/android/GnssConfiguration.cpp +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - * Not a Contribution - */ -/* - * Copyright (C) 2016 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. - */ - -#define LOG_TAG "LocSvc_GnssConfigurationInterface" - -#include <log_util.h> -#include "Gnss.h" -#include "GnssConfiguration.h" - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -GnssConfiguration::GnssConfiguration(Gnss* gnss) : mGnss(gnss) { -} - -// Methods from ::android::hardware::gps::V1_0::IGnssConfiguration follow. -Return<bool> GnssConfiguration::setSuplEs(bool enabled) { - if (mGnss == nullptr) { - LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__); - return false; - } - - GnssConfig config; - memset(&config, 0, sizeof(GnssConfig)); - config.size = sizeof(GnssConfig); - config.flags = GNSS_CONFIG_FLAGS_SUPL_EM_SERVICES_BIT; - config.suplEmergencyServices = (enabled ? - GNSS_CONFIG_SUPL_EMERGENCY_SERVICES_YES : - GNSS_CONFIG_SUPL_EMERGENCY_SERVICES_NO); - - return mGnss->updateConfiguration(config); -} - -Return<bool> GnssConfiguration::setSuplVersion(uint32_t version) { - if (mGnss == nullptr) { - LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__); - return false; - } - - GnssConfig config; - memset(&config, 0, sizeof(GnssConfig)); - config.size = sizeof(GnssConfig); - config.flags = GNSS_CONFIG_FLAGS_SUPL_VERSION_VALID_BIT; - switch (version) { - case 0x00020002: - config.suplVersion = GNSS_CONFIG_SUPL_VERSION_2_0_2; - break; - case 0x00020000: - config.suplVersion = GNSS_CONFIG_SUPL_VERSION_2_0_0; - break; - case 0x00010000: - config.suplVersion = GNSS_CONFIG_SUPL_VERSION_1_0_0; - break; - default: - LOC_LOGE("%s]: invalid version: 0x%x.", __FUNCTION__, version); - return false; - break; - } - - return mGnss->updateConfiguration(config); -} - -Return<bool> GnssConfiguration::setSuplMode(uint8_t mode) { - if (mGnss == nullptr) { - LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__); - return false; - } - - GnssConfig config; - memset(&config, 0, sizeof(GnssConfig)); - config.size = sizeof(GnssConfig); - config.flags = GNSS_CONFIG_FLAGS_SUPL_MODE_BIT; - switch (mode) { - case 0: - config.suplModeMask = 0; // STANDALONE ONLY - break; - case 1: - config.suplModeMask = GNSS_CONFIG_SUPL_MODE_MSB_BIT; - break; - case 2: - config.suplModeMask = GNSS_CONFIG_SUPL_MODE_MSA_BIT; - break; - case 3: - config.suplModeMask = GNSS_CONFIG_SUPL_MODE_MSB_BIT | GNSS_CONFIG_SUPL_MODE_MSA_BIT; - break; - default: - LOC_LOGE("%s]: invalid mode: %d.", __FUNCTION__, mode); - return false; - break; - } - - return mGnss->updateConfiguration(config); -} - -Return<bool> GnssConfiguration::setLppProfile(uint8_t lppProfile) { - if (mGnss == nullptr) { - LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__); - return false; - } - - GnssConfig config; - memset(&config, 0, sizeof(GnssConfig)); - config.size = sizeof(GnssConfig); - config.flags = GNSS_CONFIG_FLAGS_LPP_PROFILE_VALID_BIT; - switch (lppProfile) { - case 0: - config.lppProfile = GNSS_CONFIG_LPP_PROFILE_RRLP_ON_LTE; - break; - case 1: - config.lppProfile = GNSS_CONFIG_LPP_PROFILE_USER_PLANE; - break; - case 2: - config.lppProfile = GNSS_CONFIG_LPP_PROFILE_CONTROL_PLANE; - break; - case 3: - config.lppProfile = GNSS_CONFIG_LPP_PROFILE_USER_PLANE_AND_CONTROL_PLANE; - break; - default: - LOC_LOGE("%s]: invalid lppProfile: %d.", __FUNCTION__, lppProfile); - return false; - break; - } - - return mGnss->updateConfiguration(config); -} - -Return<bool> GnssConfiguration::setGlonassPositioningProtocol(uint8_t protocol) { - if (mGnss == nullptr) { - LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__); - return false; - } - - GnssConfig config; - memset(&config, 0, sizeof(GnssConfig)); - config.size = sizeof(GnssConfig); - - config.flags = GNSS_CONFIG_FLAGS_AGLONASS_POSITION_PROTOCOL_VALID_BIT; - if (protocol & (1<<0)) { - config.aGlonassPositionProtocolMask |= GNSS_CONFIG_RRC_CONTROL_PLANE_BIT; - } - if (protocol & (1<<1)) { - config.aGlonassPositionProtocolMask |= GNSS_CONFIG_RRLP_USER_PLANE_BIT; - } - if (protocol & (1<<2)) { - config.aGlonassPositionProtocolMask |= GNSS_CONFIG_LLP_USER_PLANE_BIT; - } - if (protocol & (1<<3)) { - config.aGlonassPositionProtocolMask |= GNSS_CONFIG_LLP_CONTROL_PLANE_BIT; - } - - return mGnss->updateConfiguration(config); -} - -Return<bool> GnssConfiguration::setGpsLock(uint8_t lock) { - if (mGnss == nullptr) { - LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__); - return false; - } - - GnssConfig config; - memset(&config, 0, sizeof(GnssConfig)); - config.size = sizeof(GnssConfig); - config.flags = GNSS_CONFIG_FLAGS_GPS_LOCK_VALID_BIT; - switch (lock) { - case 0: - config.gpsLock = GNSS_CONFIG_GPS_LOCK_NONE; - break; - case 1: - config.gpsLock = GNSS_CONFIG_GPS_LOCK_MO; - break; - case 2: - config.gpsLock = GNSS_CONFIG_GPS_LOCK_NI; - break; - case 3: - config.gpsLock = GNSS_CONFIG_GPS_LOCK_MO_AND_NI; - break; - default: - LOC_LOGE("%s]: invalid lock: %d.", __FUNCTION__, lock); - return false; - break; - } - - return mGnss->updateConfiguration(config); -} - -Return<bool> GnssConfiguration::setEmergencySuplPdn(bool enabled) { - if (mGnss == nullptr) { - LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__); - return false; - } - - GnssConfig config; - memset(&config, 0, sizeof(GnssConfig)); - config.size = sizeof(GnssConfig); - config.flags = GNSS_CONFIG_FLAGS_EM_PDN_FOR_EM_SUPL_VALID_BIT; - config.emergencyPdnForEmergencySupl = (enabled ? - GNSS_CONFIG_EMERGENCY_PDN_FOR_EMERGENCY_SUPL_YES : - GNSS_CONFIG_EMERGENCY_PDN_FOR_EMERGENCY_SUPL_NO); - - return mGnss->updateConfiguration(config); -} - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android diff --git a/gps/android/GnssConfiguration.h b/gps/android/GnssConfiguration.h deleted file mode 100644 index 1629e06..0000000 --- a/gps/android/GnssConfiguration.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - * Not a Contribution - */ - - /* Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSCONFIGURATION_H -#define ANDROID_HARDWARE_GNSS_V1_0_GNSSCONFIGURATION_H - -#include <android/hardware/gnss/1.0/IGnssConfiguration.h> -#include <hidl/Status.h> - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::hardware::gnss::V1_0::IGnssConfiguration; -using ::android::hardware::Return; -using ::android::hardware::Void; -using ::android::hardware::hidl_vec; -using ::android::hardware::hidl_string; -using ::android::sp; - -/* - * Interface for passing GNSS configuration info from platform to HAL. - */ -struct Gnss; -struct GnssConfiguration : public IGnssConfiguration { - GnssConfiguration(Gnss* gnss); - ~GnssConfiguration() = default; - - /* - * Methods from ::android::hardware::gnss::V1_0::IGnssConfiguration follow. - * These declarations were generated from IGnssConfiguration.hal. - */ - Return<bool> setSuplVersion(uint32_t version) override; - Return<bool> setSuplMode(uint8_t mode) override; - Return<bool> setSuplEs(bool enabled) override; - Return<bool> setLppProfile(uint8_t lppProfile) override; - Return<bool> setGlonassPositioningProtocol(uint8_t protocol) override; - Return<bool> setEmergencySuplPdn(bool enable) override; - Return<bool> setGpsLock(uint8_t lock) override; - - private: - Gnss* mGnss = nullptr; -}; - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android - -#endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSCONFIGURATION_H diff --git a/gps/android/GnssDebug.cpp b/gps/android/GnssDebug.cpp deleted file mode 100644 index 3d8e055..0000000 --- a/gps/android/GnssDebug.cpp +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (C) 2016 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. - */ - -#define LOG_TAG "LocSvc_GnssDebugInterface" - -#include <log/log.h> -#include <log_util.h> -#include "Gnss.h" -#include "GnssDebug.h" -#include "LocationUtil.h" - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::hardware::hidl_vec; - -#define GNSS_DEBUG_UNKNOWN_HORIZONTAL_ACCURACY_METERS (20000000) -#define GNSS_DEBUG_UNKNOWN_VERTICAL_ACCURACY_METERS (20000) -#define GNSS_DEBUG_UNKNOWN_SPEED_ACCURACY_PER_SEC (500) -#define GNSS_DEBUG_UNKNOWN_BEARING_ACCURACY_DEG (180) - -#define GNSS_DEBUG_UNKNOWN_UTC_TIME (1483228800000LL) // 1/1/2017 00:00 GMT -#define GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC (1.57783680E17) // 5 years in ns -#define GNSS_DEBUG_UNKNOWN_FREQ_UNC_NS_PER_SEC (2.0e5) // ppm - -GnssDebug::GnssDebug(Gnss* gnss) : mGnss(gnss) -{ -} - -/* - * This methods requests position, time and satellite ephemeris debug information - * from the HAL. - * - * @return void -*/ -Return<void> GnssDebug::getDebugData(getDebugData_cb _hidl_cb) -{ - LOC_LOGD("%s]: ", __func__); - - DebugData data = { }; - - if((nullptr == mGnss) || (nullptr == mGnss->getGnssInterface())){ - LOC_LOGE("GnssDebug - Null GNSS interface"); - _hidl_cb(data); - return Void(); - } - - // get debug report snapshot via hal interface - GnssDebugReport reports = { }; - mGnss->getGnssInterface()->getDebugReport(reports); - - // location block - if (reports.mLocation.mValid) { - data.position.valid = true; - data.position.latitudeDegrees = reports.mLocation.mLocation.latitude; - data.position.longitudeDegrees = reports.mLocation.mLocation.longitude; - data.position.altitudeMeters = reports.mLocation.mLocation.altitude; - - data.position.speedMetersPerSec = - (double)(reports.mLocation.mLocation.speed); - data.position.bearingDegrees = - (double)(reports.mLocation.mLocation.bearing); - data.position.horizontalAccuracyMeters = - (double)(reports.mLocation.mLocation.accuracy); - data.position.verticalAccuracyMeters = - reports.mLocation.verticalAccuracyMeters; - data.position.speedAccuracyMetersPerSecond = - reports.mLocation.speedAccuracyMetersPerSecond; - data.position.bearingAccuracyDegrees = - reports.mLocation.bearingAccuracyDegrees; - - timeval tv_now, tv_report; - tv_report.tv_sec = reports.mLocation.mUtcReported.tv_sec; - tv_report.tv_usec = reports.mLocation.mUtcReported.tv_nsec / 1000ULL; - gettimeofday(&tv_now, NULL); - data.position.ageSeconds = - (tv_now.tv_sec - tv_report.tv_sec) + - (float)((tv_now.tv_usec - tv_report.tv_usec)) / 1000000; - } - else { - data.position.valid = false; - } - - if (data.position.horizontalAccuracyMeters <= 0 || - data.position.horizontalAccuracyMeters > GNSS_DEBUG_UNKNOWN_HORIZONTAL_ACCURACY_METERS) { - data.position.horizontalAccuracyMeters = GNSS_DEBUG_UNKNOWN_HORIZONTAL_ACCURACY_METERS; - } - if (data.position.verticalAccuracyMeters <= 0 || - data.position.verticalAccuracyMeters > GNSS_DEBUG_UNKNOWN_VERTICAL_ACCURACY_METERS) { - data.position.verticalAccuracyMeters = GNSS_DEBUG_UNKNOWN_VERTICAL_ACCURACY_METERS; - } - if (data.position.speedAccuracyMetersPerSecond <= 0 || - data.position.speedAccuracyMetersPerSecond > GNSS_DEBUG_UNKNOWN_SPEED_ACCURACY_PER_SEC) { - data.position.speedAccuracyMetersPerSecond = GNSS_DEBUG_UNKNOWN_SPEED_ACCURACY_PER_SEC; - } - if (data.position.bearingAccuracyDegrees <= 0 || - data.position.bearingAccuracyDegrees > GNSS_DEBUG_UNKNOWN_BEARING_ACCURACY_DEG) { - data.position.bearingAccuracyDegrees = GNSS_DEBUG_UNKNOWN_BEARING_ACCURACY_DEG; - } - - if (data.position.horizontalAccuracyMeters <= 0 || - data.position.horizontalAccuracyMeters > GNSS_DEBUG_UNKNOWN_HORIZONTAL_ACCURACY_METERS) { - data.position.horizontalAccuracyMeters = GNSS_DEBUG_UNKNOWN_HORIZONTAL_ACCURACY_METERS; - } - if (data.position.verticalAccuracyMeters <= 0 || - data.position.verticalAccuracyMeters > GNSS_DEBUG_UNKNOWN_VERTICAL_ACCURACY_METERS) { - data.position.verticalAccuracyMeters = GNSS_DEBUG_UNKNOWN_VERTICAL_ACCURACY_METERS; - } - if (data.position.speedAccuracyMetersPerSecond <= 0 || - data.position.speedAccuracyMetersPerSecond > GNSS_DEBUG_UNKNOWN_SPEED_ACCURACY_PER_SEC) { - data.position.speedAccuracyMetersPerSecond = GNSS_DEBUG_UNKNOWN_SPEED_ACCURACY_PER_SEC; - } - if (data.position.bearingAccuracyDegrees <= 0 || - data.position.bearingAccuracyDegrees > GNSS_DEBUG_UNKNOWN_BEARING_ACCURACY_DEG) { - data.position.bearingAccuracyDegrees = GNSS_DEBUG_UNKNOWN_BEARING_ACCURACY_DEG; - } - - // time block - if (reports.mTime.mValid) { - data.time.timeEstimate = reports.mTime.timeEstimate; - data.time.timeUncertaintyNs = reports.mTime.timeUncertaintyNs; - data.time.frequencyUncertaintyNsPerSec = - reports.mTime.frequencyUncertaintyNsPerSec; - } - - if (data.time.timeEstimate < GNSS_DEBUG_UNKNOWN_UTC_TIME) { - data.time.timeEstimate = GNSS_DEBUG_UNKNOWN_UTC_TIME; - } - if (data.time.timeUncertaintyNs <= 0 || - data.time.timeUncertaintyNs > (float)GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC) { - data.time.timeUncertaintyNs = (float)GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC; - } - if (data.time.frequencyUncertaintyNsPerSec <= 0 || - data.time.frequencyUncertaintyNsPerSec > (float)GNSS_DEBUG_UNKNOWN_FREQ_UNC_NS_PER_SEC) { - data.time.frequencyUncertaintyNsPerSec = (float)GNSS_DEBUG_UNKNOWN_FREQ_UNC_NS_PER_SEC; - } - - // satellite data block - SatelliteData s = { }; - std::vector<SatelliteData> s_array = { }; - - for (uint32_t i=0; i<reports.mSatelliteInfo.size(); i++) { - memset(&s, 0, sizeof(s)); - s.svid = reports.mSatelliteInfo[i].svid; - convertGnssConstellationType( - reports.mSatelliteInfo[i].constellation, s.constellation); - convertGnssEphemerisType( - reports.mSatelliteInfo[i].mEphemerisType, s.ephemerisType); - convertGnssEphemerisSource( - reports.mSatelliteInfo[i].mEphemerisSource, s.ephemerisSource); - convertGnssEphemerisHealth( - reports.mSatelliteInfo[i].mEphemerisHealth, s.ephemerisHealth); - - s.ephemerisAgeSeconds = - reports.mSatelliteInfo[i].ephemerisAgeSeconds; - s.serverPredictionIsAvailable = - reports.mSatelliteInfo[i].serverPredictionIsAvailable; - s.serverPredictionAgeSeconds = - reports.mSatelliteInfo[i].serverPredictionAgeSeconds; - - s_array.push_back(s); - } - data.satelliteDataArray = s_array; - - // callback HIDL with collected debug data - _hidl_cb(data); - return Void(); -} - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android diff --git a/gps/android/GnssDebug.h b/gps/android/GnssDebug.h deleted file mode 100644 index a7116cb..0000000 --- a/gps/android/GnssDebug.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSDEBUG_H -#define ANDROID_HARDWARE_GNSS_V1_0_GNSSDEBUG_H - - -#include <android/hardware/gnss/1.0/IGnssDebug.h> -#include <hidl/Status.h> - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::hardware::gnss::V1_0::IGnssDebug; -using ::android::hardware::Return; -using ::android::hardware::Void; -using ::android::hardware::hidl_vec; -using ::android::hardware::hidl_string; -using ::android::sp; - -/* Interface for GNSS Debug support. */ -struct Gnss; -struct GnssDebug : public IGnssDebug { - GnssDebug(Gnss* gnss); - ~GnssDebug() {}; - - /* - * Methods from ::android::hardware::gnss::V1_0::IGnssDebug follow. - * These declarations were generated from IGnssDebug.hal. - */ - Return<void> getDebugData(getDebugData_cb _hidl_cb) override; - -private: - Gnss* mGnss = nullptr; -}; - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android - -#endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSDEBUG_H diff --git a/gps/android/GnssGeofencing.cpp b/gps/android/GnssGeofencing.cpp deleted file mode 100644 index 2a8ff88..0000000 --- a/gps/android/GnssGeofencing.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - * Not a Contribution - */ -/* - * Copyright (C) 2016 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. - */ - -#define LOG_TAG "GnssHal_GnssGeofencing" - -#include <log_util.h> -#include <GeofenceAPIClient.h> -#include "GnssGeofencing.h" - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -void GnssGeofencing::GnssGeofencingDeathRecipient::serviceDied( - uint64_t cookie, const wp<IBase>& who) { - LOC_LOGE("%s] service died. cookie: %llu, who: %p", - __FUNCTION__, static_cast<unsigned long long>(cookie), &who); - if (mGnssGeofencing != nullptr) { - mGnssGeofencing->removeAllGeofences(); - } -} - -GnssGeofencing::GnssGeofencing() : mApi(nullptr) { - mGnssGeofencingDeathRecipient = new GnssGeofencingDeathRecipient(this); -} - -GnssGeofencing::~GnssGeofencing() { - if (mApi != nullptr) { - delete mApi; - mApi = nullptr; - } -} - -// Methods from ::android::hardware::gnss::V1_0::IGnssGeofencing follow. -Return<void> GnssGeofencing::setCallback(const sp<IGnssGeofenceCallback>& callback) { - if (mApi != nullptr) { - LOC_LOGE("%s]: mApi is NOT nullptr", __FUNCTION__); - return Void(); - } - - mApi = new GeofenceAPIClient(callback); - if (mApi == nullptr) { - LOC_LOGE("%s]: failed to create mApi", __FUNCTION__); - } - - if (mGnssGeofencingCbIface != nullptr) { - mGnssGeofencingCbIface->unlinkToDeath(mGnssGeofencingDeathRecipient); - } - mGnssGeofencingCbIface = callback; - if (mGnssGeofencingCbIface != nullptr) { - mGnssGeofencingCbIface->linkToDeath(mGnssGeofencingDeathRecipient, 0 /*cookie*/); - } - - return Void(); -} - -Return<void> GnssGeofencing::addGeofence( - int32_t geofenceId, - double latitudeDegrees, - double longitudeDegrees, - double radiusMeters, - IGnssGeofenceCallback::GeofenceTransition lastTransition, - int32_t monitorTransitions, - uint32_t notificationResponsivenessMs, - uint32_t unknownTimerMs) { - if (mApi == nullptr) { - LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__); - } else { - mApi->geofenceAdd( - geofenceId, - latitudeDegrees, - longitudeDegrees, - radiusMeters, - static_cast<int32_t>(lastTransition), - monitorTransitions, - notificationResponsivenessMs, - unknownTimerMs); - } - return Void(); -} - -Return<void> GnssGeofencing::pauseGeofence(int32_t geofenceId) { - if (mApi == nullptr) { - LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__); - } else { - mApi->geofencePause(geofenceId); - } - return Void(); -} - -Return<void> GnssGeofencing::resumeGeofence(int32_t geofenceId, int32_t monitorTransitions) { - if (mApi == nullptr) { - LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__); - } else { - mApi->geofenceResume(geofenceId, monitorTransitions); - } - return Void(); -} - -Return<void> GnssGeofencing::removeGeofence(int32_t geofenceId) { - if (mApi == nullptr) { - LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__); - } else { - mApi->geofenceRemove(geofenceId); - } - return Void(); -} - -Return<void> GnssGeofencing::removeAllGeofences() { - if (mApi == nullptr) { - LOC_LOGD("%s]: mApi is nullptr, do nothing", __FUNCTION__); - } else { - mApi->geofenceRemoveAll(); - } - return Void(); -} - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android diff --git a/gps/android/GnssGeofencing.h b/gps/android/GnssGeofencing.h deleted file mode 100644 index db5f9d2..0000000 --- a/gps/android/GnssGeofencing.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - * Not a Contribution - */ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSGEOFENCING_H -#define ANDROID_HARDWARE_GNSS_V1_0_GNSSGEOFENCING_H - -#include <android/hardware/gnss/1.0/IGnssGeofencing.h> -#include <hidl/Status.h> - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::hardware::gnss::V1_0::IGnssGeofenceCallback; -using ::android::hardware::gnss::V1_0::IGnssGeofencing; -using ::android::hardware::Return; -using ::android::hardware::Void; -using ::android::hardware::hidl_vec; -using ::android::hardware::hidl_string; -using ::android::sp; - -class GeofenceAPIClient; -struct GnssGeofencing : public IGnssGeofencing { - GnssGeofencing(); - ~GnssGeofencing(); - - /* - * Methods from ::android::hardware::gnss::V1_0::IGnssGeofencing follow. - * These declarations were generated from IGnssGeofencing.hal. - */ - Return<void> setCallback(const sp<IGnssGeofenceCallback>& callback) override; - Return<void> addGeofence(int32_t geofenceId, - double latitudeDegrees, - double longitudeDegrees, - double radiusMeters, - IGnssGeofenceCallback::GeofenceTransition lastTransition, - int32_t monitorTransitions, - uint32_t notificationResponsivenessMs, - uint32_t unknownTimerMs) override; - - Return<void> pauseGeofence(int32_t geofenceId) override; - Return<void> resumeGeofence(int32_t geofenceId, int32_t monitorTransitions) override; - Return<void> removeGeofence(int32_t geofenceId) override; - - private: - // This method is not part of the IGnss base class. - // It is called by GnssGeofencingDeathRecipient to remove all geofences added so far. - Return<void> removeAllGeofences(); - - private: - struct GnssGeofencingDeathRecipient : hidl_death_recipient { - GnssGeofencingDeathRecipient(sp<GnssGeofencing> gnssGeofencing) : - mGnssGeofencing(gnssGeofencing) { - } - ~GnssGeofencingDeathRecipient() = default; - virtual void serviceDied(uint64_t cookie, const wp<IBase>& who) override; - sp<GnssGeofencing> mGnssGeofencing; - }; - - private: - sp<GnssGeofencingDeathRecipient> mGnssGeofencingDeathRecipient = nullptr; - sp<IGnssGeofenceCallback> mGnssGeofencingCbIface = nullptr; - GeofenceAPIClient* mApi = nullptr; -}; - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android - -#endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSGEOFENCING_H diff --git a/gps/android/GnssMeasurement.cpp b/gps/android/GnssMeasurement.cpp deleted file mode 100644 index 1c65bd6..0000000 --- a/gps/android/GnssMeasurement.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - * Not a Contribution - */ -/* - * Copyright (C) 2016 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. - */ - -#define LOG_TAG "LocSvc_GnssMeasurementInterface" - -#include <log_util.h> -#include <MeasurementAPIClient.h> -#include "GnssMeasurement.h" - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -void GnssMeasurement::GnssMeasurementDeathRecipient::serviceDied( - uint64_t cookie, const wp<IBase>& who) { - LOC_LOGE("%s] service died. cookie: %llu, who: %p", - __FUNCTION__, static_cast<unsigned long long>(cookie), &who); - if (mGnssMeasurement != nullptr) { - mGnssMeasurement->close(); - } -} - -GnssMeasurement::GnssMeasurement() { - mGnssMeasurementDeathRecipient = new GnssMeasurementDeathRecipient(this); - mApi = new MeasurementAPIClient(); -} - -GnssMeasurement::~GnssMeasurement() { - if (mApi) { - delete mApi; - mApi = nullptr; - } -} - -// Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow. - -Return<IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback( - const sp<V1_0::IGnssMeasurementCallback>& callback) { - - Return<IGnssMeasurement::GnssMeasurementStatus> ret = - IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC; - if (mGnssMeasurementCbIface != nullptr) { - LOC_LOGE("%s]: GnssMeasurementCallback is already set", __FUNCTION__); - return IGnssMeasurement::GnssMeasurementStatus::ERROR_ALREADY_INIT; - } - - if (callback == nullptr) { - LOC_LOGE("%s]: callback is nullptr", __FUNCTION__); - return ret; - } - if (mApi == nullptr) { - LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__); - return ret; - } - - mGnssMeasurementCbIface = callback; - mGnssMeasurementCbIface->linkToDeath(mGnssMeasurementDeathRecipient, 0); - - return mApi->measurementSetCallback(callback); - -} - -Return<void> GnssMeasurement::close() { - if (mApi == nullptr) { - LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__); - return Void(); - } - - if (mGnssMeasurementCbIface != nullptr) { - mGnssMeasurementCbIface->unlinkToDeath(mGnssMeasurementDeathRecipient); - mGnssMeasurementCbIface = nullptr; - } - mApi->measurementClose(); - - return Void(); -} - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android diff --git a/gps/android/GnssMeasurement.h b/gps/android/GnssMeasurement.h deleted file mode 100644 index 4247dbf..0000000 --- a/gps/android/GnssMeasurement.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - * Not a Contribution - */ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSMEASUREMENT_H -#define ANDROID_HARDWARE_GNSS_V1_0_GNSSMEASUREMENT_H - -#include <android/hardware/gnss/1.0/IGnssMeasurement.h> -#include <hidl/MQDescriptor.h> -#include <hidl/Status.h> - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::hardware::gnss::V1_0::IGnssMeasurement; -using ::android::hardware::gnss::V1_0::IGnssMeasurementCallback; -using ::android::hardware::Return; -using ::android::hardware::Void; -using ::android::hardware::hidl_vec; -using ::android::hardware::hidl_string; -using ::android::sp; - -class MeasurementAPIClient; -struct GnssMeasurement : public IGnssMeasurement { - GnssMeasurement(); - ~GnssMeasurement(); - - /* - * Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow. - * These declarations were generated from IGnssMeasurement.hal. - */ - Return<GnssMeasurement::GnssMeasurementStatus> setCallback( - const sp<V1_0::IGnssMeasurementCallback>& callback) override; - Return<void> close() override; - - private: - struct GnssMeasurementDeathRecipient : hidl_death_recipient { - GnssMeasurementDeathRecipient(sp<GnssMeasurement> gnssMeasurement) : - mGnssMeasurement(gnssMeasurement) { - } - ~GnssMeasurementDeathRecipient() = default; - virtual void serviceDied(uint64_t cookie, const wp<IBase>& who) override; - sp<GnssMeasurement> mGnssMeasurement; - }; - - private: - sp<GnssMeasurementDeathRecipient> mGnssMeasurementDeathRecipient = nullptr; - sp<V1_0::IGnssMeasurementCallback> mGnssMeasurementCbIface = nullptr; - MeasurementAPIClient* mApi; -}; - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android - -#endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSMEASUREMENT_H diff --git a/gps/android/GnssNi.cpp b/gps/android/GnssNi.cpp deleted file mode 100644 index d06cc20..0000000 --- a/gps/android/GnssNi.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - * Not a Contribution - */ -/* - * Copyright (C) 2016 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. - */ - -#define LOG_TAG "LocSvc_GnssNiInterface" - -#include <log_util.h> -#include "Gnss.h" -#include "GnssNi.h" - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -void GnssNi::GnssNiDeathRecipient::serviceDied(uint64_t cookie, const wp<IBase>& who) { - LOC_LOGE("%s] service died. cookie: %llu, who: %p", - __FUNCTION__, static_cast<unsigned long long>(cookie), &who); - // we do nothing here - // Gnss::GnssDeathRecipient will stop the session -} - -GnssNi::GnssNi(Gnss* gnss) : mGnss(gnss) { - mGnssNiDeathRecipient = new GnssNiDeathRecipient(this); -} - -// Methods from ::android::hardware::gnss::V1_0::IGnssNi follow. -Return<void> GnssNi::setCallback(const sp<IGnssNiCallback>& callback) { - if (mGnss == nullptr) { - LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__); - return Void(); - } - - mGnss->setGnssNiCb(callback); - - if (mGnssNiCbIface != nullptr) { - mGnssNiCbIface->unlinkToDeath(mGnssNiDeathRecipient); - } - mGnssNiCbIface = callback; - if (mGnssNiCbIface != nullptr) { - mGnssNiCbIface->linkToDeath(mGnssNiDeathRecipient, 0 /*cookie*/); - } - - return Void(); -} - -Return<void> GnssNi::respond(int32_t notifId, IGnssNiCallback::GnssUserResponseType userResponse) { - if (mGnss == nullptr) { - LOC_LOGE("%s]: mGnss is nullptr", __FUNCTION__); - return Void(); - } - - GnssAPIClient* api = mGnss->getApi(); - if (api == nullptr) { - LOC_LOGE("%s]: api is nullptr", __FUNCTION__); - return Void(); - } - - api->gnssNiRespond(notifId, userResponse); - - return Void(); -} - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android diff --git a/gps/android/GnssNi.h b/gps/android/GnssNi.h deleted file mode 100644 index 90f62d5..0000000 --- a/gps/android/GnssNi.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - * Not a Contribution - */ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSNI_H -#define ANDROID_HARDWARE_GNSS_V1_0_GNSSNI_H - -#include <android/hardware/gnss/1.0/IGnssNi.h> -#include <hidl/Status.h> - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::hardware::gnss::V1_0::IGnssNi; -using ::android::hardware::gnss::V1_0::IGnssNiCallback; -using ::android::hardware::Return; -using ::android::hardware::Void; -using ::android::hardware::hidl_vec; -using ::android::hardware::hidl_string; -using ::android::sp; - -struct Gnss; -struct GnssNi : public IGnssNi { - GnssNi(Gnss* gnss); - ~GnssNi() = default; - - /* - * Methods from ::android::hardware::gnss::V1_0::IGnssNi follow. - * These declarations were generated from IGnssNi.hal. - */ - Return<void> setCallback(const sp<IGnssNiCallback>& callback) override; - Return<void> respond(int32_t notifId, - IGnssNiCallback::GnssUserResponseType userResponse) override; - - private: - struct GnssNiDeathRecipient : hidl_death_recipient { - GnssNiDeathRecipient(sp<GnssNi> gnssNi) : mGnssNi(gnssNi) { - } - ~GnssNiDeathRecipient() = default; - virtual void serviceDied(uint64_t cookie, const wp<IBase>& who) override; - sp<GnssNi> mGnssNi; - }; - - private: - sp<GnssNiDeathRecipient> mGnssNiDeathRecipient = nullptr; - sp<IGnssNiCallback> mGnssNiCbIface = nullptr; - Gnss* mGnss = nullptr; -}; - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android - -#endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSNI_H diff --git a/gps/android/android.hardware.gnss@1.1-service-qti.rc b/gps/android/android.hardware.gnss@1.1-service-qti.rc deleted file mode 100644 index b5da6f9..0000000 --- a/gps/android/android.hardware.gnss@1.1-service-qti.rc +++ /dev/null @@ -1,4 +0,0 @@ -service gnss_service /vendor/bin/hw/android.hardware.gnss@1.0-service-qti - class hal - user gps - group system gps radio diff --git a/gps/android/location_api/BatchingAPIClient.cpp b/gps/android/location_api/BatchingAPIClient.cpp deleted file mode 100644 index 264ab83..0000000 --- a/gps/android/location_api/BatchingAPIClient.cpp +++ /dev/null @@ -1,196 +0,0 @@ -/* Copyright (c) 2017-2018, 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_NDEBUG 0 -#define LOG_TAG "LocSvc_BatchingAPIClient" - -#include <log_util.h> -#include <loc_cfg.h> - -#include "LocationUtil.h" -#include "BatchingAPIClient.h" - -#include "limits.h" - - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::hardware::gnss::V1_0::IGnssBatching; -using ::android::hardware::gnss::V1_0::IGnssBatchingCallback; -using ::android::hardware::gnss::V1_0::GnssLocation; - -static void convertBatchOption(const IGnssBatching::Options& in, LocationOptions& out, - LocationCapabilitiesMask mask); - -BatchingAPIClient::BatchingAPIClient(const sp<IGnssBatchingCallback>& callback) : - LocationAPIClientBase(), - mGnssBatchingCbIface(callback), - mDefaultId(UINT_MAX), - mLocationCapabilitiesMask(0) -{ - LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback); - - LocationCallbacks locationCallbacks; - memset(&locationCallbacks, 0, sizeof(LocationCallbacks)); - locationCallbacks.size = sizeof(LocationCallbacks); - - locationCallbacks.trackingCb = nullptr; - locationCallbacks.batchingCb = nullptr; - if (mGnssBatchingCbIface != nullptr) { - locationCallbacks.batchingCb = [this](size_t count, Location* location, - BatchingOptions batchOptions) { - onBatchingCb(count, location, batchOptions); - }; - } - locationCallbacks.geofenceBreachCb = nullptr; - locationCallbacks.geofenceStatusCb = nullptr; - locationCallbacks.gnssLocationInfoCb = nullptr; - locationCallbacks.gnssNiCb = nullptr; - locationCallbacks.gnssSvCb = nullptr; - locationCallbacks.gnssNmeaCb = nullptr; - locationCallbacks.gnssMeasurementsCb = nullptr; - - locAPISetCallbacks(locationCallbacks); -} - -BatchingAPIClient::~BatchingAPIClient() -{ - LOC_LOGD("%s]: ()", __FUNCTION__); -} - -int BatchingAPIClient::getBatchSize() -{ - LOC_LOGD("%s]: ()", __FUNCTION__); - return locAPIGetBatchSize(); -} - -int BatchingAPIClient::startSession(const IGnssBatching::Options& opts) -{ - LOC_LOGD("%s]: (%lld %d)", __FUNCTION__, - static_cast<long long>(opts.periodNanos), static_cast<uint8_t>(opts.flags)); - int retVal = -1; - LocationOptions options; - convertBatchOption(opts, options, mLocationCapabilitiesMask); - uint32_t mode = 0; - if (opts.flags == static_cast<uint8_t>(IGnssBatching::Flag::WAKEUP_ON_FIFO_FULL)) { - mode = SESSION_MODE_ON_FULL; - } - if (locAPIStartSession(mDefaultId, mode, options) == LOCATION_ERROR_SUCCESS) { - retVal = 1; - } - return retVal; -} - -int BatchingAPIClient::updateSessionOptions(const IGnssBatching::Options& opts) -{ - LOC_LOGD("%s]: (%lld %d)", __FUNCTION__, - static_cast<long long>(opts.periodNanos), static_cast<uint8_t>(opts.flags)); - int retVal = -1; - LocationOptions options; - convertBatchOption(opts, options, mLocationCapabilitiesMask); - - uint32_t mode = 0; - if (opts.flags == static_cast<uint8_t>(IGnssBatching::Flag::WAKEUP_ON_FIFO_FULL)) { - mode = SESSION_MODE_ON_FULL; - } - if (locAPIUpdateSessionOptions(mDefaultId, mode, options) == LOCATION_ERROR_SUCCESS) { - retVal = 1; - } - return retVal; -} - -int BatchingAPIClient::stopSession() -{ - LOC_LOGD("%s]: ", __FUNCTION__); - int retVal = -1; - if (locAPIStopSession(mDefaultId) == LOCATION_ERROR_SUCCESS) { - retVal = 1; - } - return retVal; -} - -void BatchingAPIClient::getBatchedLocation(int last_n_locations) -{ - LOC_LOGD("%s]: (%d)", __FUNCTION__, last_n_locations); - locAPIGetBatchedLocations(mDefaultId, last_n_locations); -} - -void BatchingAPIClient::flushBatchedLocations() -{ - LOC_LOGD("%s]: ()", __FUNCTION__); - locAPIGetBatchedLocations(mDefaultId, SIZE_MAX); -} - -void BatchingAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMask) -{ - LOC_LOGD("%s]: (%02x)", __FUNCTION__, capabilitiesMask); - mLocationCapabilitiesMask = capabilitiesMask; -} - -void BatchingAPIClient::onBatchingCb(size_t count, Location* location, - BatchingOptions /*batchOptions*/) -{ - LOC_LOGD("%s]: (count: %zu)", __FUNCTION__, count); - if (mGnssBatchingCbIface != nullptr && count > 0) { - hidl_vec<GnssLocation> locationVec; - locationVec.resize(count); - for (size_t i = 0; i < count; i++) { - convertGnssLocation(location[i], locationVec[i]); - } - auto r = mGnssBatchingCbIface->gnssLocationBatchCb(locationVec); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssLocationBatchCb description=%s", - __func__, r.description().c_str()); - } - } -} - -static void convertBatchOption(const IGnssBatching::Options& in, LocationOptions& out, - LocationCapabilitiesMask mask) -{ - memset(&out, 0, sizeof(LocationOptions)); - out.size = sizeof(LocationOptions); - out.minInterval = (uint32_t)(in.periodNanos / 1000000L); - out.minDistance = 0; - out.mode = GNSS_SUPL_MODE_STANDALONE; - if (mask & LOCATION_CAPABILITIES_GNSS_MSA_BIT) - out.mode = GNSS_SUPL_MODE_MSA; - if (mask & LOCATION_CAPABILITIES_GNSS_MSB_BIT) - out.mode = GNSS_SUPL_MODE_MSB; -} - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android diff --git a/gps/android/location_api/BatchingAPIClient.h b/gps/android/location_api/BatchingAPIClient.h deleted file mode 100644 index 5d64df3..0000000 --- a/gps/android/location_api/BatchingAPIClient.h +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (c) 2017-2018, 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 BATCHING_API_CLINET_H -#define BATCHING_API_CLINET_H - -#include <android/hardware/gnss/1.0/IGnssBatching.h> -#include <android/hardware/gnss/1.0/IGnssBatchingCallback.h> -#include <pthread.h> - -#include <LocationAPIClientBase.h> - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -class BatchingAPIClient : public LocationAPIClientBase -{ -public: - BatchingAPIClient(const sp<V1_0::IGnssBatchingCallback>& callback); - ~BatchingAPIClient(); - int getBatchSize(); - int startSession(const V1_0::IGnssBatching::Options& options); - int updateSessionOptions(const V1_0::IGnssBatching::Options& options); - int stopSession(); - void getBatchedLocation(int last_n_locations); - void flushBatchedLocations(); - - inline LocationCapabilitiesMask getCapabilities() { return mLocationCapabilitiesMask; } - - // callbacks - void onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMask) final; - void onBatchingCb(size_t count, Location* location, BatchingOptions batchOptions) final; - -private: - sp<V1_0::IGnssBatchingCallback> mGnssBatchingCbIface; - uint32_t mDefaultId; - LocationCapabilitiesMask mLocationCapabilitiesMask; -}; - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android -#endif // BATCHING_API_CLINET_H diff --git a/gps/android/location_api/GeofenceAPIClient.cpp b/gps/android/location_api/GeofenceAPIClient.cpp deleted file mode 100644 index 774a049..0000000 --- a/gps/android/location_api/GeofenceAPIClient.cpp +++ /dev/null @@ -1,275 +0,0 @@ -/* Copyright (c) 2017-2018, 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_NDEBUG 0 -#define LOG_TAG "LocSvc_GeofenceApiClient" - -#include <log_util.h> -#include <loc_cfg.h> - -#include "LocationUtil.h" -#include "GeofenceAPIClient.h" - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::hardware::gnss::V1_0::IGnssGeofenceCallback; -using ::android::hardware::gnss::V1_0::GnssLocation; - -GeofenceAPIClient::GeofenceAPIClient(const sp<IGnssGeofenceCallback>& callback) : - LocationAPIClientBase(), - mGnssGeofencingCbIface(callback) -{ - LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback); - - LocationCallbacks locationCallbacks; - memset(&locationCallbacks, 0, sizeof(LocationCallbacks)); - locationCallbacks.size = sizeof(LocationCallbacks); - - locationCallbacks.trackingCb = nullptr; - locationCallbacks.batchingCb = nullptr; - - locationCallbacks.geofenceBreachCb = nullptr; - if (mGnssGeofencingCbIface != nullptr) { - locationCallbacks.geofenceBreachCb = - [this](GeofenceBreachNotification geofenceBreachNotification) { - onGeofenceBreachCb(geofenceBreachNotification); - }; - - locationCallbacks.geofenceStatusCb = - [this](GeofenceStatusNotification geofenceStatusNotification) { - onGeofenceStatusCb(geofenceStatusNotification); - }; - } - - locationCallbacks.gnssLocationInfoCb = nullptr; - locationCallbacks.gnssNiCb = nullptr; - locationCallbacks.gnssSvCb = nullptr; - locationCallbacks.gnssNmeaCb = nullptr; - locationCallbacks.gnssMeasurementsCb = nullptr; - - locAPISetCallbacks(locationCallbacks); -} - -void GeofenceAPIClient::geofenceAdd(uint32_t geofence_id, double latitude, double longitude, - double radius_meters, int32_t last_transition, int32_t monitor_transitions, - uint32_t notification_responsiveness_ms, uint32_t unknown_timer_ms) -{ - LOC_LOGD("%s]: (%d %f %f %f %d %d %d %d)", __FUNCTION__, - geofence_id, latitude, longitude, radius_meters, - last_transition, monitor_transitions, notification_responsiveness_ms, unknown_timer_ms); - - GeofenceOption options; - memset(&options, 0, sizeof(GeofenceOption)); - options.size = sizeof(GeofenceOption); - if (monitor_transitions & IGnssGeofenceCallback::GeofenceTransition::ENTERED) - options.breachTypeMask |= GEOFENCE_BREACH_ENTER_BIT; - if (monitor_transitions & IGnssGeofenceCallback::GeofenceTransition::EXITED) - options.breachTypeMask |= GEOFENCE_BREACH_EXIT_BIT; - options.responsiveness = notification_responsiveness_ms; - - GeofenceInfo data; - data.size = sizeof(GeofenceInfo); - data.latitude = latitude; - data.longitude = longitude; - data.radius = radius_meters; - - LocationError err = (LocationError)locAPIAddGeofences(1, &geofence_id, &options, &data); - if (LOCATION_ERROR_SUCCESS != err) { - onAddGeofencesCb(1, &err, &geofence_id); - } -} - -void GeofenceAPIClient::geofencePause(uint32_t geofence_id) -{ - LOC_LOGD("%s]: (%d)", __FUNCTION__, geofence_id); - locAPIPauseGeofences(1, &geofence_id); -} - -void GeofenceAPIClient::geofenceResume(uint32_t geofence_id, int32_t monitor_transitions) -{ - LOC_LOGD("%s]: (%d %d)", __FUNCTION__, geofence_id, monitor_transitions); - GeofenceBreachTypeMask mask = 0; - if (monitor_transitions & IGnssGeofenceCallback::GeofenceTransition::ENTERED) - mask |= GEOFENCE_BREACH_ENTER_BIT; - if (monitor_transitions & IGnssGeofenceCallback::GeofenceTransition::EXITED) - mask |= GEOFENCE_BREACH_EXIT_BIT; - locAPIResumeGeofences(1, &geofence_id, &mask); -} - -void GeofenceAPIClient::geofenceRemove(uint32_t geofence_id) -{ - LOC_LOGD("%s]: (%d)", __FUNCTION__, geofence_id); - locAPIRemoveGeofences(1, &geofence_id); -} - -void GeofenceAPIClient::geofenceRemoveAll() -{ - LOC_LOGD("%s]", __FUNCTION__); - // TODO locAPIRemoveAllGeofences(); -} - -// callbacks -void GeofenceAPIClient::onGeofenceBreachCb(GeofenceBreachNotification geofenceBreachNotification) -{ - LOC_LOGD("%s]: (%zu)", __FUNCTION__, geofenceBreachNotification.count); - if (mGnssGeofencingCbIface != nullptr) { - for (size_t i = 0; i < geofenceBreachNotification.count; i++) { - GnssLocation gnssLocation; - convertGnssLocation(geofenceBreachNotification.location, gnssLocation); - - IGnssGeofenceCallback::GeofenceTransition transition; - if (geofenceBreachNotification.type == GEOFENCE_BREACH_ENTER) - transition = IGnssGeofenceCallback::GeofenceTransition::ENTERED; - else if (geofenceBreachNotification.type == GEOFENCE_BREACH_EXIT) - transition = IGnssGeofenceCallback::GeofenceTransition::EXITED; - else { - // continue with other breach if transition is - // nether GPS_GEOFENCE_ENTERED nor GPS_GEOFENCE_EXITED - continue; - } - - auto r = mGnssGeofencingCbIface->gnssGeofenceTransitionCb( - geofenceBreachNotification.ids[i], gnssLocation, transition, - static_cast<V1_0::GnssUtcTime>(geofenceBreachNotification.timestamp)); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssGeofenceTransitionCb description=%s", - __func__, r.description().c_str()); - } - } - } -} - -void GeofenceAPIClient::onGeofenceStatusCb(GeofenceStatusNotification geofenceStatusNotification) -{ - LOC_LOGD("%s]: (%d)", __FUNCTION__, geofenceStatusNotification.available); - if (mGnssGeofencingCbIface != nullptr) { - IGnssGeofenceCallback::GeofenceAvailability status = - IGnssGeofenceCallback::GeofenceAvailability::UNAVAILABLE; - if (geofenceStatusNotification.available == GEOFENCE_STATUS_AVAILABILE_YES) { - status = IGnssGeofenceCallback::GeofenceAvailability::AVAILABLE; - } - GnssLocation gnssLocation; - memset(&gnssLocation, 0, sizeof(GnssLocation)); - auto r = mGnssGeofencingCbIface->gnssGeofenceStatusCb(status, gnssLocation); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssGeofenceStatusCb description=%s", - __func__, r.description().c_str()); - } - } -} - -void GeofenceAPIClient::onAddGeofencesCb(size_t count, LocationError* errors, uint32_t* ids) -{ - LOC_LOGD("%s]: (%zu)", __FUNCTION__, count); - if (mGnssGeofencingCbIface != nullptr) { - for (size_t i = 0; i < count; i++) { - IGnssGeofenceCallback::GeofenceStatus status = - IGnssGeofenceCallback::GeofenceStatus::ERROR_GENERIC; - if (errors[i] == LOCATION_ERROR_SUCCESS) - status = IGnssGeofenceCallback::GeofenceStatus::OPERATION_SUCCESS; - else if (errors[i] == LOCATION_ERROR_ID_EXISTS) - status = IGnssGeofenceCallback::GeofenceStatus::ERROR_ID_EXISTS; - auto r = mGnssGeofencingCbIface->gnssGeofenceAddCb(ids[i], status); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssGeofenceAddCb description=%s", - __func__, r.description().c_str()); - } - } - } -} - -void GeofenceAPIClient::onRemoveGeofencesCb(size_t count, LocationError* errors, uint32_t* ids) -{ - LOC_LOGD("%s]: (%zu)", __FUNCTION__, count); - if (mGnssGeofencingCbIface != nullptr) { - for (size_t i = 0; i < count; i++) { - IGnssGeofenceCallback::GeofenceStatus status = - IGnssGeofenceCallback::GeofenceStatus::ERROR_GENERIC; - if (errors[i] == LOCATION_ERROR_SUCCESS) - status = IGnssGeofenceCallback::GeofenceStatus::OPERATION_SUCCESS; - else if (errors[i] == LOCATION_ERROR_ID_UNKNOWN) - status = IGnssGeofenceCallback::GeofenceStatus::ERROR_ID_UNKNOWN; - auto r = mGnssGeofencingCbIface->gnssGeofenceRemoveCb(ids[i], status); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssGeofenceRemoveCb description=%s", - __func__, r.description().c_str()); - } - } - } -} - -void GeofenceAPIClient::onPauseGeofencesCb(size_t count, LocationError* errors, uint32_t* ids) -{ - LOC_LOGD("%s]: (%zu)", __FUNCTION__, count); - if (mGnssGeofencingCbIface != nullptr) { - for (size_t i = 0; i < count; i++) { - IGnssGeofenceCallback::GeofenceStatus status = - IGnssGeofenceCallback::GeofenceStatus::ERROR_GENERIC; - if (errors[i] == LOCATION_ERROR_SUCCESS) - status = IGnssGeofenceCallback::GeofenceStatus::OPERATION_SUCCESS; - else if (errors[i] == LOCATION_ERROR_ID_UNKNOWN) - status = IGnssGeofenceCallback::GeofenceStatus::ERROR_ID_UNKNOWN; - auto r = mGnssGeofencingCbIface->gnssGeofencePauseCb(ids[i], status); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssGeofencePauseCb description=%s", - __func__, r.description().c_str()); - } - } - } -} - -void GeofenceAPIClient::onResumeGeofencesCb(size_t count, LocationError* errors, uint32_t* ids) -{ - LOC_LOGD("%s]: (%zu)", __FUNCTION__, count); - if (mGnssGeofencingCbIface != nullptr) { - for (size_t i = 0; i < count; i++) { - IGnssGeofenceCallback::GeofenceStatus status = - IGnssGeofenceCallback::GeofenceStatus::ERROR_GENERIC; - if (errors[i] == LOCATION_ERROR_SUCCESS) - status = IGnssGeofenceCallback::GeofenceStatus::OPERATION_SUCCESS; - else if (errors[i] == LOCATION_ERROR_ID_UNKNOWN) - status = IGnssGeofenceCallback::GeofenceStatus::ERROR_ID_UNKNOWN; - auto r = mGnssGeofencingCbIface->gnssGeofenceResumeCb(ids[i], status); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssGeofenceResumeCb description=%s", - __func__, r.description().c_str()); - } - } - } -} - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android diff --git a/gps/android/location_api/GeofenceAPIClient.h b/gps/android/location_api/GeofenceAPIClient.h deleted file mode 100644 index dc99ddd..0000000 --- a/gps/android/location_api/GeofenceAPIClient.h +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright (c) 2017-2018, 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 GEOFENCE_API_CLINET_H -#define GEOFENCE_API_CLINET_H - - -#include <android/hardware/gnss/1.0/IGnssGeofenceCallback.h> -#include <LocationAPIClientBase.h> - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::sp; - -class GeofenceAPIClient : public LocationAPIClientBase -{ -public: - GeofenceAPIClient(const sp<V1_0::IGnssGeofenceCallback>& callback); - virtual ~GeofenceAPIClient() = default; - - void geofenceAdd(uint32_t geofence_id, double latitude, double longitude, - double radius_meters, int32_t last_transition, int32_t monitor_transitions, - uint32_t notification_responsiveness_ms, uint32_t unknown_timer_ms); - void geofencePause(uint32_t geofence_id); - void geofenceResume(uint32_t geofence_id, int32_t monitor_transitions); - void geofenceRemove(uint32_t geofence_id); - void geofenceRemoveAll(); - - // callbacks - void onGeofenceBreachCb(GeofenceBreachNotification geofenceBreachNotification) final; - void onGeofenceStatusCb(GeofenceStatusNotification geofenceStatusNotification) final; - void onAddGeofencesCb(size_t count, LocationError* errors, uint32_t* ids) final; - void onRemoveGeofencesCb(size_t count, LocationError* errors, uint32_t* ids) final; - void onPauseGeofencesCb(size_t count, LocationError* errors, uint32_t* ids) final; - void onResumeGeofencesCb(size_t count, LocationError* errors, uint32_t* ids) final; - -private: - sp<V1_0::IGnssGeofenceCallback> mGnssGeofencingCbIface; -}; - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android -#endif // GEOFENCE_API_CLINET_H diff --git a/gps/android/location_api/GnssAPIClient.cpp b/gps/android/location_api/GnssAPIClient.cpp deleted file mode 100644 index 320ae15..0000000 --- a/gps/android/location_api/GnssAPIClient.cpp +++ /dev/null @@ -1,537 +0,0 @@ -/* Copyright (c) 2017-2018, 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_NDEBUG 0 -#define LOG_TAG "LocSvc_GnssAPIClient" - -#include <log_util.h> -#include <loc_cfg.h> - -#include "LocationUtil.h" -#include "GnssAPIClient.h" -#include <LocDualContext.h> - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::hardware::gnss::V1_0::IGnss; -using ::android::hardware::gnss::V1_0::IGnssCallback; -using ::android::hardware::gnss::V1_0::IGnssNiCallback; -using ::android::hardware::gnss::V1_0::GnssLocation; - -static void convertGnssSvStatus(GnssSvNotification& in, IGnssCallback::GnssSvStatus& out); - -GnssAPIClient::GnssAPIClient(const sp<IGnssCallback>& gpsCb, - const sp<IGnssNiCallback>& niCb) : - LocationAPIClientBase(), - mGnssCbIface(nullptr), - mGnssNiCbIface(nullptr), - mControlClient(new LocationAPIControlClient()), - mLocationCapabilitiesMask(0), - mLocationCapabilitiesCached(false) -{ - LOC_LOGD("%s]: (%p %p)", __FUNCTION__, &gpsCb, &niCb); - - // set default LocationOptions. - memset(&mLocationOptions, 0, sizeof(LocationOptions)); - mLocationOptions.size = sizeof(LocationOptions); - mLocationOptions.minInterval = 1000; - mLocationOptions.minDistance = 0; - mLocationOptions.mode = GNSS_SUPL_MODE_STANDALONE; - - gnssUpdateCallbacks(gpsCb, niCb); -} - -GnssAPIClient::~GnssAPIClient() -{ - LOC_LOGD("%s]: ()", __FUNCTION__); - if (mControlClient) { - delete mControlClient; - mControlClient = nullptr; - } -} - -// for GpsInterface -void GnssAPIClient::gnssUpdateCallbacks(const sp<IGnssCallback>& gpsCb, - const sp<IGnssNiCallback>& niCb) -{ - LOC_LOGD("%s]: (%p %p)", __FUNCTION__, &gpsCb, &niCb); - - mMutex.lock(); - mGnssCbIface = gpsCb; - mGnssNiCbIface = niCb; - mMutex.unlock(); - - LocationCallbacks locationCallbacks; - memset(&locationCallbacks, 0, sizeof(LocationCallbacks)); - locationCallbacks.size = sizeof(LocationCallbacks); - - locationCallbacks.trackingCb = nullptr; - if (mGnssCbIface != nullptr) { - locationCallbacks.trackingCb = [this](Location location) { - onTrackingCb(location); - }; - } - - locationCallbacks.batchingCb = nullptr; - locationCallbacks.geofenceBreachCb = nullptr; - locationCallbacks.geofenceStatusCb = nullptr; - locationCallbacks.gnssLocationInfoCb = nullptr; - - locationCallbacks.gnssNiCb = nullptr; - loc_core::ContextBase* context = - loc_core::LocDualContext::getLocFgContext( - NULL, NULL, - loc_core::LocDualContext::mLocationHalName, false); - if (mGnssNiCbIface != nullptr && !context->hasAgpsExtendedCapabilities()) { - LOC_LOGD("Registering NI CB"); - locationCallbacks.gnssNiCb = [this](uint32_t id, GnssNiNotification gnssNiNotification) { - onGnssNiCb(id, gnssNiNotification); - }; - } - - locationCallbacks.gnssSvCb = nullptr; - if (mGnssCbIface != nullptr) { - locationCallbacks.gnssSvCb = [this](GnssSvNotification gnssSvNotification) { - onGnssSvCb(gnssSvNotification); - }; - } - - locationCallbacks.gnssNmeaCb = nullptr; - if (mGnssCbIface != nullptr) { - locationCallbacks.gnssNmeaCb = [this](GnssNmeaNotification gnssNmeaNotification) { - onGnssNmeaCb(gnssNmeaNotification); - }; - } - - locationCallbacks.gnssMeasurementsCb = nullptr; - - locAPISetCallbacks(locationCallbacks); -} - -bool GnssAPIClient::gnssStart() -{ - LOC_LOGD("%s]: ()", __FUNCTION__); - bool retVal = true; - locAPIStartTracking(mLocationOptions); - return retVal; -} - -bool GnssAPIClient::gnssStop() -{ - LOC_LOGD("%s]: ()", __FUNCTION__); - bool retVal = true; - locAPIStopTracking(); - return retVal; -} - -bool GnssAPIClient::gnssSetPositionMode(IGnss::GnssPositionMode mode, - IGnss::GnssPositionRecurrence recurrence, uint32_t minIntervalMs, - uint32_t preferredAccuracyMeters, uint32_t preferredTimeMs) -{ - LOC_LOGD("%s]: (%d %d %d %d %d)", __FUNCTION__, - (int)mode, recurrence, minIntervalMs, preferredAccuracyMeters, preferredTimeMs); - bool retVal = true; - memset(&mLocationOptions, 0, sizeof(LocationOptions)); - mLocationOptions.size = sizeof(LocationOptions); - mLocationOptions.minInterval = minIntervalMs; - mLocationOptions.minDistance = preferredAccuracyMeters; - if (IGnss::GnssPositionRecurrence::RECURRENCE_SINGLE == recurrence) { - mLocationOptions.minInterval = - std::numeric_limits<decltype(mLocationOptions.minInterval)>::max(); - } - if (mode == IGnss::GnssPositionMode::STANDALONE) - mLocationOptions.mode = GNSS_SUPL_MODE_STANDALONE; - else if (mode == IGnss::GnssPositionMode::MS_BASED) - mLocationOptions.mode = GNSS_SUPL_MODE_MSB; - else if (mode == IGnss::GnssPositionMode::MS_ASSISTED) - mLocationOptions.mode = GNSS_SUPL_MODE_MSA; - else { - LOC_LOGD("%s]: invalid GnssPositionMode: %d", __FUNCTION__, (int)mode); - retVal = false; - } - locAPIUpdateTrackingOptions(mLocationOptions); - return retVal; -} - -// for GpsNiInterface -void GnssAPIClient::gnssNiRespond(int32_t notifId, - IGnssNiCallback::GnssUserResponseType userResponse) -{ - LOC_LOGD("%s]: (%d %d)", __FUNCTION__, notifId, static_cast<int>(userResponse)); - GnssNiResponse data = GNSS_NI_RESPONSE_IGNORE; - if (userResponse == IGnssNiCallback::GnssUserResponseType::RESPONSE_ACCEPT) - data = GNSS_NI_RESPONSE_ACCEPT; - else if (userResponse == IGnssNiCallback::GnssUserResponseType::RESPONSE_DENY) - data = GNSS_NI_RESPONSE_DENY; - else if (userResponse == IGnssNiCallback::GnssUserResponseType::RESPONSE_NORESP) - data = GNSS_NI_RESPONSE_NO_RESPONSE; - else { - LOC_LOGD("%s]: invalid GnssUserResponseType: %d", __FUNCTION__, (int)userResponse); - return; - } - locAPIGnssNiResponse(notifId, data); -} - -// these apis using LocationAPIControlClient -void GnssAPIClient::gnssDeleteAidingData(IGnss::GnssAidingData aidingDataFlags) -{ - LOC_LOGD("%s]: (%02hx)", __FUNCTION__, aidingDataFlags); - if (mControlClient == nullptr) { - return; - } - GnssAidingData data; - memset(&data, 0, sizeof (GnssAidingData)); - data.sv.svTypeMask = GNSS_AIDING_DATA_SV_TYPE_GPS_BIT | - GNSS_AIDING_DATA_SV_TYPE_GLONASS_BIT | - GNSS_AIDING_DATA_SV_TYPE_QZSS_BIT | - GNSS_AIDING_DATA_SV_TYPE_BEIDOU_BIT | - GNSS_AIDING_DATA_SV_TYPE_GALILEO_BIT; - - if (aidingDataFlags == IGnss::GnssAidingData::DELETE_ALL) - data.deleteAll = true; - else { - if (aidingDataFlags & IGnss::GnssAidingData::DELETE_EPHEMERIS) - data.sv.svMask |= GNSS_AIDING_DATA_SV_EPHEMERIS_BIT; - if (aidingDataFlags & IGnss::GnssAidingData::DELETE_ALMANAC) - data.sv.svMask |= GNSS_AIDING_DATA_SV_ALMANAC_BIT; - if (aidingDataFlags & IGnss::GnssAidingData::DELETE_POSITION) - data.common.mask |= GNSS_AIDING_DATA_COMMON_POSITION_BIT; - if (aidingDataFlags & IGnss::GnssAidingData::DELETE_TIME) - data.common.mask |= GNSS_AIDING_DATA_COMMON_TIME_BIT; - if (aidingDataFlags & IGnss::GnssAidingData::DELETE_IONO) - data.sv.svMask |= GNSS_AIDING_DATA_SV_IONOSPHERE_BIT; - if (aidingDataFlags & IGnss::GnssAidingData::DELETE_UTC) - data.common.mask |= GNSS_AIDING_DATA_COMMON_UTC_BIT; - if (aidingDataFlags & IGnss::GnssAidingData::DELETE_HEALTH) - data.sv.svMask |= GNSS_AIDING_DATA_SV_HEALTH_BIT; - if (aidingDataFlags & IGnss::GnssAidingData::DELETE_SVDIR) - data.sv.svMask |= GNSS_AIDING_DATA_SV_DIRECTION_BIT; - if (aidingDataFlags & IGnss::GnssAidingData::DELETE_SVSTEER) - data.sv.svMask |= GNSS_AIDING_DATA_SV_STEER_BIT; - if (aidingDataFlags & IGnss::GnssAidingData::DELETE_SADATA) - data.sv.svMask |= GNSS_AIDING_DATA_SV_SA_DATA_BIT; - if (aidingDataFlags & IGnss::GnssAidingData::DELETE_RTI) - data.common.mask |= GNSS_AIDING_DATA_COMMON_RTI_BIT; - if (aidingDataFlags & IGnss::GnssAidingData::DELETE_CELLDB_INFO) - data.common.mask |= GNSS_AIDING_DATA_COMMON_CELLDB_BIT; - } - mControlClient->locAPIGnssDeleteAidingData(data); -} - -void GnssAPIClient::gnssEnable(LocationTechnologyType techType) -{ - LOC_LOGD("%s]: (%0d)", __FUNCTION__, techType); - if (mControlClient == nullptr) { - return; - } - mControlClient->locAPIEnable(techType); -} - -void GnssAPIClient::gnssDisable() -{ - LOC_LOGD("%s]: ()", __FUNCTION__); - if (mControlClient == nullptr) { - return; - } - mControlClient->locAPIDisable(); -} - -void GnssAPIClient::gnssConfigurationUpdate(const GnssConfig& gnssConfig) -{ - LOC_LOGD("%s]: (%02x)", __FUNCTION__, gnssConfig.flags); - if (mControlClient == nullptr) { - return; - } - mControlClient->locAPIGnssUpdateConfig(gnssConfig); -} - -void GnssAPIClient::requestCapabilities() { - // only send capablities if it's already cached, otherwise the first time LocationAPI - // is initialized, capabilities will be sent by LocationAPI - if (mLocationCapabilitiesCached) { - onCapabilitiesCb(mLocationCapabilitiesMask); - } -} - -// callbacks -void GnssAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMask) -{ - LOC_LOGD("%s]: (%02x)", __FUNCTION__, capabilitiesMask); - mLocationCapabilitiesMask = capabilitiesMask; - mLocationCapabilitiesCached = true; - - mMutex.lock(); - auto gnssCbIface(mGnssCbIface); - mMutex.unlock(); - - if (gnssCbIface != nullptr) { - uint32_t data = 0; - if ((capabilitiesMask & LOCATION_CAPABILITIES_TIME_BASED_TRACKING_BIT) || - (capabilitiesMask & LOCATION_CAPABILITIES_TIME_BASED_BATCHING_BIT) || - (capabilitiesMask & LOCATION_CAPABILITIES_DISTANCE_BASED_TRACKING_BIT) || - (capabilitiesMask & LOCATION_CAPABILITIES_DISTANCE_BASED_BATCHING_BIT)) - data |= IGnssCallback::Capabilities::SCHEDULING; - if (capabilitiesMask & LOCATION_CAPABILITIES_GEOFENCE_BIT) - data |= IGnssCallback::Capabilities::GEOFENCING; - if (capabilitiesMask & LOCATION_CAPABILITIES_GNSS_MEASUREMENTS_BIT) - data |= IGnssCallback::Capabilities::MEASUREMENTS; - if (capabilitiesMask & LOCATION_CAPABILITIES_GNSS_MSB_BIT) - data |= IGnssCallback::Capabilities::MSB; - if (capabilitiesMask & LOCATION_CAPABILITIES_GNSS_MSA_BIT) - data |= IGnssCallback::Capabilities::MSA; - auto r = gnssCbIface->gnssSetCapabilitesCb(data); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssSetCapabilitesCb description=%s", - __func__, r.description().c_str()); - } - } - if (gnssCbIface != nullptr) { - IGnssCallback::GnssSystemInfo gnssInfo; - if (capabilitiesMask & LOCATION_CAPABILITIES_DEBUG_NMEA_BIT) { - gnssInfo.yearOfHw = 2017; - } else if (capabilitiesMask & LOCATION_CAPABILITIES_GNSS_MEASUREMENTS_BIT) { - gnssInfo.yearOfHw = 2016; - } else { - gnssInfo.yearOfHw = 2015; - } - LOC_LOGV("%s:%d] set_system_info_cb (%d)", __FUNCTION__, __LINE__, gnssInfo.yearOfHw); - auto r = gnssCbIface->gnssSetSystemInfoCb(gnssInfo); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssSetSystemInfoCb description=%s", - __func__, r.description().c_str()); - } - } -} - -void GnssAPIClient::onTrackingCb(Location location) -{ - LOC_LOGD("%s]: (flags: %02x)", __FUNCTION__, location.flags); - mMutex.lock(); - auto gnssCbIface(mGnssCbIface); - mMutex.unlock(); - - if (gnssCbIface != nullptr) { - GnssLocation gnssLocation; - convertGnssLocation(location, gnssLocation); - auto r = gnssCbIface->gnssLocationCb(gnssLocation); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssLocationCb description=%s", - __func__, r.description().c_str()); - } - } -} - -void GnssAPIClient::onGnssNiCb(uint32_t id, GnssNiNotification gnssNiNotification) -{ - LOC_LOGD("%s]: (id: %d)", __FUNCTION__, id); - mMutex.lock(); - auto gnssNiCbIface(mGnssNiCbIface); - mMutex.unlock(); - - if (gnssNiCbIface == nullptr) { - LOC_LOGE("%s]: mGnssNiCbIface is nullptr", __FUNCTION__); - return; - } - - IGnssNiCallback::GnssNiNotification notificationGnss = {}; - - notificationGnss.notificationId = id; - - if (gnssNiNotification.type == GNSS_NI_TYPE_VOICE) - notificationGnss.niType = IGnssNiCallback::GnssNiType::VOICE; - else if (gnssNiNotification.type == GNSS_NI_TYPE_SUPL) - notificationGnss.niType = IGnssNiCallback::GnssNiType::UMTS_SUPL; - else if (gnssNiNotification.type == GNSS_NI_TYPE_CONTROL_PLANE) - notificationGnss.niType = IGnssNiCallback::GnssNiType::UMTS_CTRL_PLANE; - else if (gnssNiNotification.type == GNSS_NI_TYPE_EMERGENCY_SUPL) - notificationGnss.niType = IGnssNiCallback::GnssNiType::EMERGENCY_SUPL; - - if (gnssNiNotification.options & GNSS_NI_OPTIONS_NOTIFICATION_BIT) - notificationGnss.notifyFlags |= IGnssNiCallback::GnssNiNotifyFlags::NEED_NOTIFY; - if (gnssNiNotification.options & GNSS_NI_OPTIONS_VERIFICATION_BIT) - notificationGnss.notifyFlags |= IGnssNiCallback::GnssNiNotifyFlags::NEED_VERIFY; - if (gnssNiNotification.options & GNSS_NI_OPTIONS_PRIVACY_OVERRIDE_BIT) - notificationGnss.notifyFlags |= IGnssNiCallback::GnssNiNotifyFlags::PRIVACY_OVERRIDE; - - notificationGnss.timeoutSec = gnssNiNotification.timeout; - - if (gnssNiNotification.timeoutResponse == GNSS_NI_RESPONSE_ACCEPT) - notificationGnss.defaultResponse = IGnssNiCallback::GnssUserResponseType::RESPONSE_ACCEPT; - else if (gnssNiNotification.timeoutResponse == GNSS_NI_RESPONSE_DENY) - notificationGnss.defaultResponse = IGnssNiCallback::GnssUserResponseType::RESPONSE_DENY; - else if (gnssNiNotification.timeoutResponse == GNSS_NI_RESPONSE_NO_RESPONSE || - gnssNiNotification.timeoutResponse == GNSS_NI_RESPONSE_IGNORE) - notificationGnss.defaultResponse = IGnssNiCallback::GnssUserResponseType::RESPONSE_NORESP; - - notificationGnss.requestorId = gnssNiNotification.requestor; - - notificationGnss.notificationMessage = gnssNiNotification.message; - - if (gnssNiNotification.requestorEncoding == GNSS_NI_ENCODING_TYPE_NONE) - notificationGnss.requestorIdEncoding = - IGnssNiCallback::GnssNiEncodingType::ENC_NONE; - else if (gnssNiNotification.requestorEncoding == GNSS_NI_ENCODING_TYPE_GSM_DEFAULT) - notificationGnss.requestorIdEncoding = - IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_GSM_DEFAULT; - else if (gnssNiNotification.requestorEncoding == GNSS_NI_ENCODING_TYPE_UTF8) - notificationGnss.requestorIdEncoding = - IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_UTF8; - else if (gnssNiNotification.requestorEncoding == GNSS_NI_ENCODING_TYPE_UCS2) - notificationGnss.requestorIdEncoding = - IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_UCS2; - - if (gnssNiNotification.messageEncoding == GNSS_NI_ENCODING_TYPE_NONE) - notificationGnss.notificationIdEncoding = - IGnssNiCallback::GnssNiEncodingType::ENC_NONE; - else if (gnssNiNotification.messageEncoding == GNSS_NI_ENCODING_TYPE_GSM_DEFAULT) - notificationGnss.notificationIdEncoding = - IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_GSM_DEFAULT; - else if (gnssNiNotification.messageEncoding == GNSS_NI_ENCODING_TYPE_UTF8) - notificationGnss.notificationIdEncoding = - IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_UTF8; - else if (gnssNiNotification.messageEncoding == GNSS_NI_ENCODING_TYPE_UCS2) - notificationGnss.notificationIdEncoding = - IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_UCS2; - - gnssNiCbIface->niNotifyCb(notificationGnss); -} - -void GnssAPIClient::onGnssSvCb(GnssSvNotification gnssSvNotification) -{ - LOC_LOGD("%s]: (count: %zu)", __FUNCTION__, gnssSvNotification.count); - mMutex.lock(); - auto gnssCbIface(mGnssCbIface); - mMutex.unlock(); - - if (gnssCbIface != nullptr) { - IGnssCallback::GnssSvStatus svStatus; - convertGnssSvStatus(gnssSvNotification, svStatus); - auto r = gnssCbIface->gnssSvStatusCb(svStatus); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssSvStatusCb description=%s", - __func__, r.description().c_str()); - } - } -} - -void GnssAPIClient::onGnssNmeaCb(GnssNmeaNotification gnssNmeaNotification) -{ - mMutex.lock(); - auto gnssCbIface(mGnssCbIface); - mMutex.unlock(); - - if (gnssCbIface != nullptr) { - android::hardware::hidl_string nmeaString; - nmeaString.setToExternal(gnssNmeaNotification.nmea, gnssNmeaNotification.length); - auto r = gnssCbIface->gnssNmeaCb( - static_cast<V1_0::GnssUtcTime>(gnssNmeaNotification.timestamp), nmeaString); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssNmeaCb nmea=%s length=%zu description=%s", __func__, - gnssNmeaNotification.nmea, gnssNmeaNotification.length, r.description().c_str()); - } - } -} - -void GnssAPIClient::onStartTrackingCb(LocationError error) -{ - LOC_LOGD("%s]: (%d)", __FUNCTION__, error); - mMutex.lock(); - auto gnssCbIface(mGnssCbIface); - mMutex.unlock(); - - if (error == LOCATION_ERROR_SUCCESS && gnssCbIface != nullptr) { - auto r = gnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::ENGINE_ON); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssStatusCb ENGINE_ON description=%s", - __func__, r.description().c_str()); - } - r = gnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::SESSION_BEGIN); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssStatusCb SESSION_BEGIN description=%s", - __func__, r.description().c_str()); - } - } -} - -void GnssAPIClient::onStopTrackingCb(LocationError error) -{ - LOC_LOGD("%s]: (%d)", __FUNCTION__, error); - mMutex.lock(); - auto gnssCbIface(mGnssCbIface); - mMutex.unlock(); - - if (error == LOCATION_ERROR_SUCCESS && gnssCbIface != nullptr) { - auto r = gnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::SESSION_END); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssStatusCb SESSION_END description=%s", - __func__, r.description().c_str()); - } - r = gnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::ENGINE_OFF); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssStatusCb ENGINE_OFF description=%s", - __func__, r.description().c_str()); - } - } -} - -static void convertGnssSvStatus(GnssSvNotification& in, IGnssCallback::GnssSvStatus& out) -{ - memset(&out, 0, sizeof(IGnssCallback::GnssSvStatus)); - out.numSvs = in.count; - if (out.numSvs > static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT)) { - LOC_LOGW("%s]: Too many satellites %u. Clamps to %d.", - __FUNCTION__, out.numSvs, V1_0::GnssMax::SVS_COUNT); - out.numSvs = static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT); - } - for (size_t i = 0; i < out.numSvs; i++) { - IGnssCallback::GnssSvInfo& info = out.gnssSvList[i]; - info.svid = in.gnssSvs[i].svId; - convertGnssConstellationType(in.gnssSvs[i].type, info.constellation); - info.cN0Dbhz = in.gnssSvs[i].cN0Dbhz; - info.elevationDegrees = in.gnssSvs[i].elevation; - info.azimuthDegrees = in.gnssSvs[i].azimuth; - info.svFlag = static_cast<uint8_t>(IGnssCallback::GnssSvFlags::NONE); - if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_HAS_EPHEMER_BIT) - info.svFlag |= IGnssCallback::GnssSvFlags::HAS_EPHEMERIS_DATA; - if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_HAS_ALMANAC_BIT) - info.svFlag |= IGnssCallback::GnssSvFlags::HAS_ALMANAC_DATA; - if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_USED_IN_FIX_BIT) - info.svFlag |= IGnssCallback::GnssSvFlags::USED_IN_FIX; - } -} - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android diff --git a/gps/android/location_api/GnssAPIClient.h b/gps/android/location_api/GnssAPIClient.h deleted file mode 100644 index 923cb48..0000000 --- a/gps/android/location_api/GnssAPIClient.h +++ /dev/null @@ -1,108 +0,0 @@ -/* Copyright (c) 2017-2018, 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 GNSS_API_CLINET_H -#define GNSS_API_CLINET_H - - -#include <mutex> -#include <android/hardware/gnss/1.0/IGnss.h> -#include <android/hardware/gnss/1.0/IGnssCallback.h> -#include <android/hardware/gnss/1.0/IGnssNiCallback.h> -#include <LocationAPIClientBase.h> - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::sp; - -class GnssAPIClient : public LocationAPIClientBase -{ -public: - GnssAPIClient(const sp<V1_0::IGnssCallback>& gpsCb, - const sp<V1_0::IGnssNiCallback>& niCb); - virtual ~GnssAPIClient(); - GnssAPIClient(const GnssAPIClient&) = delete; - GnssAPIClient& operator=(const GnssAPIClient&) = delete; - - // for GpsInterface - void gnssUpdateCallbacks(const sp<V1_0::IGnssCallback>& gpsCb, - const sp<V1_0::IGnssNiCallback>& niCb); - bool gnssStart(); - bool gnssStop(); - bool gnssSetPositionMode(V1_0::IGnss::GnssPositionMode mode, - V1_0::IGnss::GnssPositionRecurrence recurrence, - uint32_t minIntervalMs, - uint32_t preferredAccuracyMeters, - uint32_t preferredTimeMs); - - // for GpsNiInterface - void gnssNiRespond(int32_t notifId, V1_0::IGnssNiCallback::GnssUserResponseType userResponse); - - // these apis using LocationAPIControlClient - void gnssDeleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags); - void gnssEnable(LocationTechnologyType techType); - void gnssDisable(); - void gnssConfigurationUpdate(const GnssConfig& gnssConfig); - - inline LocationCapabilitiesMask gnssGetCapabilities() const { - return mLocationCapabilitiesMask; - } - void requestCapabilities(); - - // callbacks we are interested in - void onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMask) final; - void onTrackingCb(Location location) final; - void onGnssNiCb(uint32_t id, GnssNiNotification gnssNiNotification) final; - void onGnssSvCb(GnssSvNotification gnssSvNotification) final; - void onGnssNmeaCb(GnssNmeaNotification gnssNmeaNotification) final; - - void onStartTrackingCb(LocationError error) final; - void onStopTrackingCb(LocationError error) final; - -private: - sp<V1_0::IGnssCallback> mGnssCbIface; - sp<V1_0::IGnssNiCallback> mGnssNiCbIface; - std::mutex mMutex; - LocationAPIControlClient* mControlClient; - LocationCapabilitiesMask mLocationCapabilitiesMask; - bool mLocationCapabilitiesCached; - - LocationOptions mLocationOptions; -}; - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android -#endif // GNSS_API_CLINET_H diff --git a/gps/android/location_api/LocationUtil.cpp b/gps/android/location_api/LocationUtil.cpp deleted file mode 100644 index 89681f2..0000000 --- a/gps/android/location_api/LocationUtil.cpp +++ /dev/null @@ -1,188 +0,0 @@ -/* Copyright (c) 2017-2018, 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 <LocationUtil.h> - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::hardware::gnss::V1_0::GnssLocation; -using ::android::hardware::gnss::V1_0::GnssConstellationType; -using ::android::hardware::gnss::V1_0::GnssLocationFlags; - -void convertGnssLocation(Location& in, GnssLocation& out) -{ - memset(&out, 0, sizeof(GnssLocation)); - if (in.flags & LOCATION_HAS_LAT_LONG_BIT) - out.gnssLocationFlags |= GnssLocationFlags::HAS_LAT_LONG; - if (in.flags & LOCATION_HAS_ALTITUDE_BIT) - out.gnssLocationFlags |= GnssLocationFlags::HAS_ALTITUDE; - if (in.flags & LOCATION_HAS_SPEED_BIT) - out.gnssLocationFlags |= GnssLocationFlags::HAS_SPEED; - if (in.flags & LOCATION_HAS_BEARING_BIT) - out.gnssLocationFlags |= GnssLocationFlags::HAS_BEARING; - if (in.flags & LOCATION_HAS_ACCURACY_BIT) - out.gnssLocationFlags |= GnssLocationFlags::HAS_HORIZONTAL_ACCURACY; - if (in.flags & LOCATION_HAS_VERTICAL_ACCURACY_BIT) - out.gnssLocationFlags |= GnssLocationFlags::HAS_VERTICAL_ACCURACY; - if (in.flags & LOCATION_HAS_SPEED_ACCURACY_BIT) - out.gnssLocationFlags |= GnssLocationFlags::HAS_SPEED_ACCURACY; - if (in.flags & LOCATION_HAS_BEARING_ACCURACY_BIT) - out.gnssLocationFlags |= GnssLocationFlags::HAS_BEARING_ACCURACY; - out.latitudeDegrees = in.latitude; - out.longitudeDegrees = in.longitude; - out.altitudeMeters = in.altitude; - out.speedMetersPerSec = in.speed; - out.bearingDegrees = in.bearing; - out.horizontalAccuracyMeters = in.accuracy; - out.verticalAccuracyMeters = in.verticalAccuracy; - out.speedAccuracyMetersPerSecond = in.speedAccuracy; - out.bearingAccuracyDegrees = in.bearingAccuracy; - out.timestamp = static_cast<V1_0::GnssUtcTime>(in.timestamp); -} - -void convertGnssLocation(const GnssLocation& in, Location& out) -{ - memset(&out, 0, sizeof(out)); - if (in.gnssLocationFlags & GnssLocationFlags::HAS_LAT_LONG) - out.flags |= LOCATION_HAS_LAT_LONG_BIT; - if (in.gnssLocationFlags & GnssLocationFlags::HAS_ALTITUDE) - out.flags |= LOCATION_HAS_ALTITUDE_BIT; - if (in.gnssLocationFlags & GnssLocationFlags::HAS_SPEED) - out.flags |= LOCATION_HAS_SPEED_BIT; - if (in.gnssLocationFlags & GnssLocationFlags::HAS_BEARING) - out.flags |= LOCATION_HAS_BEARING_BIT; - if (in.gnssLocationFlags & GnssLocationFlags::HAS_HORIZONTAL_ACCURACY) - out.flags |= LOCATION_HAS_ACCURACY_BIT; - if (in.gnssLocationFlags & GnssLocationFlags::HAS_VERTICAL_ACCURACY) - out.flags |= LOCATION_HAS_VERTICAL_ACCURACY_BIT; - if (in.gnssLocationFlags & GnssLocationFlags::HAS_SPEED_ACCURACY) - out.flags |= LOCATION_HAS_SPEED_ACCURACY_BIT; - if (in.gnssLocationFlags & GnssLocationFlags::HAS_BEARING_ACCURACY) - out.flags |= LOCATION_HAS_BEARING_ACCURACY_BIT; - out.latitude = in.latitudeDegrees; - out.longitude = in.longitudeDegrees; - out.altitude = in.altitudeMeters; - out.speed = in.speedMetersPerSec; - out.bearing = in.bearingDegrees; - out.accuracy = in.horizontalAccuracyMeters; - out.verticalAccuracy = in.verticalAccuracyMeters; - out.speedAccuracy = in.speedAccuracyMetersPerSecond; - out.bearingAccuracy = in.bearingAccuracyDegrees; - out.timestamp = static_cast<uint64_t>(in.timestamp); -} - -void convertGnssConstellationType(GnssSvType& in, GnssConstellationType& out) -{ - switch(in) { - case GNSS_SV_TYPE_GPS: - out = GnssConstellationType::GPS; - break; - case GNSS_SV_TYPE_SBAS: - out = GnssConstellationType::SBAS; - break; - case GNSS_SV_TYPE_GLONASS: - out = GnssConstellationType::GLONASS; - break; - case GNSS_SV_TYPE_QZSS: - out = GnssConstellationType::QZSS; - break; - case GNSS_SV_TYPE_BEIDOU: - out = GnssConstellationType::BEIDOU; - break; - case GNSS_SV_TYPE_GALILEO: - out = GnssConstellationType::GALILEO; - break; - case GNSS_SV_TYPE_UNKNOWN: - default: - out = GnssConstellationType::UNKNOWN; - break; - } -} - -void convertGnssEphemerisType(GnssEphemerisType& in, GnssDebug::SatelliteEphemerisType& out) -{ - switch(in) { - case GNSS_EPH_TYPE_EPHEMERIS: - out = GnssDebug::SatelliteEphemerisType::EPHEMERIS; - break; - case GNSS_EPH_TYPE_ALMANAC: - out = GnssDebug::SatelliteEphemerisType::ALMANAC_ONLY; - break; - case GNSS_EPH_TYPE_UNKNOWN: - default: - out = GnssDebug::SatelliteEphemerisType::NOT_AVAILABLE; - break; - } -} - -void convertGnssEphemerisSource(GnssEphemerisSource& in, GnssDebug::SatelliteEphemerisSource& out) -{ - switch(in) { - case GNSS_EPH_SOURCE_DEMODULATED: - out = GnssDebug::SatelliteEphemerisSource::DEMODULATED; - break; - case GNSS_EPH_SOURCE_SUPL_PROVIDED: - out = GnssDebug::SatelliteEphemerisSource::SUPL_PROVIDED; - break; - case GNSS_EPH_SOURCE_OTHER_SERVER_PROVIDED: - out = GnssDebug::SatelliteEphemerisSource::OTHER_SERVER_PROVIDED; - break; - case GNSS_EPH_SOURCE_LOCAL: - case GNSS_EPH_SOURCE_UNKNOWN: - default: - out = GnssDebug::SatelliteEphemerisSource::OTHER; - break; - } -} - -void convertGnssEphemerisHealth(GnssEphemerisHealth& in, GnssDebug::SatelliteEphemerisHealth& out) -{ - switch(in) { - case GNSS_EPH_HEALTH_GOOD: - out = GnssDebug::SatelliteEphemerisHealth::GOOD; - break; - case GNSS_EPH_HEALTH_BAD: - out = GnssDebug::SatelliteEphemerisHealth::BAD; - break; - case GNSS_EPH_HEALTH_UNKNOWN: - default: - out = GnssDebug::SatelliteEphemerisHealth::UNKNOWN; - break; - } -} - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android diff --git a/gps/android/location_api/LocationUtil.h b/gps/android/location_api/LocationUtil.h deleted file mode 100644 index 9e0cd36..0000000 --- a/gps/android/location_api/LocationUtil.h +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (c) 2017-2018, 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 LOCATION_UTIL_H -#define LOCATION_UTIL_H - -#include <android/hardware/gnss/1.0/types.h> -#include <LocationAPI.h> -#include <GnssDebug.h> - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -void convertGnssLocation(Location& in, V1_0::GnssLocation& out); -void convertGnssLocation(const V1_0::GnssLocation& in, Location& out); -void convertGnssConstellationType(GnssSvType& in, V1_0::GnssConstellationType& out); -void convertGnssEphemerisType(GnssEphemerisType& in, GnssDebug::SatelliteEphemerisType& out); -void convertGnssEphemerisSource(GnssEphemerisSource& in, GnssDebug::SatelliteEphemerisSource& out); -void convertGnssEphemerisHealth(GnssEphemerisHealth& in, GnssDebug::SatelliteEphemerisHealth& out); - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android -#endif // LOCATION_UTIL_H diff --git a/gps/android/location_api/MeasurementAPIClient.cpp b/gps/android/location_api/MeasurementAPIClient.cpp deleted file mode 100644 index 823851d..0000000 --- a/gps/android/location_api/MeasurementAPIClient.cpp +++ /dev/null @@ -1,275 +0,0 @@ -/* Copyright (c) 2017-2018, 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_NDEBUG 0 -#define LOG_TAG "LocSvc_MeasurementAPIClient" - -#include <log_util.h> -#include <loc_cfg.h> - -#include "LocationUtil.h" -#include "MeasurementAPIClient.h" - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::hardware::gnss::V1_0::IGnssMeasurement; -using ::android::hardware::gnss::V1_0::IGnssMeasurementCallback; - -static void convertGnssData(GnssMeasurementsNotification& in, - V1_0::IGnssMeasurementCallback::GnssData& out); -static void convertGnssMeasurement(GnssMeasurementsData& in, - V1_0::IGnssMeasurementCallback::GnssMeasurement& out); -static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback::GnssClock& out); - -MeasurementAPIClient::MeasurementAPIClient() : - mGnssMeasurementCbIface(nullptr), - mTracking(false) -{ - LOC_LOGD("%s]: ()", __FUNCTION__); -} - -MeasurementAPIClient::~MeasurementAPIClient() -{ - LOC_LOGD("%s]: ()", __FUNCTION__); -} - -// for GpsInterface -Return<IGnssMeasurement::GnssMeasurementStatus> -MeasurementAPIClient::measurementSetCallback(const sp<V1_0::IGnssMeasurementCallback>& callback) -{ - LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback); - - mMutex.lock(); - mGnssMeasurementCbIface = callback; - mMutex.unlock(); - - return startTracking(); -} - -Return<IGnssMeasurement::GnssMeasurementStatus> -MeasurementAPIClient::startTracking() -{ - LocationCallbacks locationCallbacks; - memset(&locationCallbacks, 0, sizeof(LocationCallbacks)); - locationCallbacks.size = sizeof(LocationCallbacks); - - locationCallbacks.trackingCb = nullptr; - locationCallbacks.batchingCb = nullptr; - locationCallbacks.geofenceBreachCb = nullptr; - locationCallbacks.geofenceStatusCb = nullptr; - locationCallbacks.gnssLocationInfoCb = nullptr; - locationCallbacks.gnssNiCb = nullptr; - locationCallbacks.gnssSvCb = nullptr; - locationCallbacks.gnssNmeaCb = nullptr; - - locationCallbacks.gnssMeasurementsCb = nullptr; - if (mGnssMeasurementCbIface != nullptr) { - locationCallbacks.gnssMeasurementsCb = - [this](GnssMeasurementsNotification gnssMeasurementsNotification) { - onGnssMeasurementsCb(gnssMeasurementsNotification); - }; - } - - locAPISetCallbacks(locationCallbacks); - LocationOptions options; - memset(&options, 0, sizeof(LocationOptions)); - options.size = sizeof(LocationOptions); - options.minInterval = 1000; - options.mode = GNSS_SUPL_MODE_STANDALONE; - mTracking = true; - LOC_LOGD("%s]: start tracking session", __FUNCTION__); - locAPIStartTracking(options); - - return IGnssMeasurement::GnssMeasurementStatus::SUCCESS; -} - -// for GpsMeasurementInterface -void MeasurementAPIClient::measurementClose() { - LOC_LOGD("%s]: ()", __FUNCTION__); - mTracking = false; - locAPIStopTracking(); -} - -// callbacks -void MeasurementAPIClient::onGnssMeasurementsCb( - GnssMeasurementsNotification gnssMeasurementsNotification) -{ - LOC_LOGD("%s]: (count: %zu active: %d)", - __FUNCTION__, gnssMeasurementsNotification.count, mTracking); - if (mTracking) { - mMutex.lock(); - sp<V1_0::IGnssMeasurementCallback> gnssMeasurementCbIface = nullptr; - if (mGnssMeasurementCbIface != nullptr) { - gnssMeasurementCbIface = mGnssMeasurementCbIface; - } - mMutex.unlock(); - - if (gnssMeasurementCbIface != nullptr) { - V1_0::IGnssMeasurementCallback::GnssData gnssData; - convertGnssData(gnssMeasurementsNotification, gnssData); - auto r = gnssMeasurementCbIface->GnssMeasurementCb(gnssData); - if (!r.isOk()) { - LOC_LOGE("%s] Error from GnssMeasurementCb description=%s", - __func__, r.description().c_str()); - } - } - } -} - -static void convertGnssMeasurement(GnssMeasurementsData& in, - V1_0::IGnssMeasurementCallback::GnssMeasurement& out) -{ - memset(&out, 0, sizeof(IGnssMeasurementCallback::GnssMeasurement)); - if (in.flags & GNSS_MEASUREMENTS_DATA_SIGNAL_TO_NOISE_RATIO_BIT) - out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_SNR; - if (in.flags & GNSS_MEASUREMENTS_DATA_CARRIER_FREQUENCY_BIT) - out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_FREQUENCY; - if (in.flags & GNSS_MEASUREMENTS_DATA_CARRIER_CYCLES_BIT) - out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_CYCLES; - if (in.flags & GNSS_MEASUREMENTS_DATA_CARRIER_PHASE_BIT) - out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_PHASE; - if (in.flags & GNSS_MEASUREMENTS_DATA_CARRIER_PHASE_UNCERTAINTY_BIT) - out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_CARRIER_PHASE_UNCERTAINTY; - if (in.flags & GNSS_MEASUREMENTS_DATA_AUTOMATIC_GAIN_CONTROL_BIT) - out.flags |= IGnssMeasurementCallback::GnssMeasurementFlags::HAS_AUTOMATIC_GAIN_CONTROL; - out.svid = in.svId; - convertGnssConstellationType(in.svType, out.constellation); - out.timeOffsetNs = in.timeOffsetNs; - if (in.stateMask & GNSS_MEASUREMENTS_STATE_CODE_LOCK_BIT) - out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_CODE_LOCK; - if (in.stateMask & GNSS_MEASUREMENTS_STATE_BIT_SYNC_BIT) - out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BIT_SYNC; - if (in.stateMask & GNSS_MEASUREMENTS_STATE_SUBFRAME_SYNC_BIT) - out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SUBFRAME_SYNC; - if (in.stateMask & GNSS_MEASUREMENTS_STATE_TOW_DECODED_BIT) - out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_TOW_DECODED; - if (in.stateMask & GNSS_MEASUREMENTS_STATE_MSEC_AMBIGUOUS_BIT) - out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_MSEC_AMBIGUOUS; - if (in.stateMask & GNSS_MEASUREMENTS_STATE_SYMBOL_SYNC_BIT) - out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SYMBOL_SYNC; - if (in.stateMask & GNSS_MEASUREMENTS_STATE_GLO_STRING_SYNC_BIT) - out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GLO_STRING_SYNC; - if (in.stateMask & GNSS_MEASUREMENTS_STATE_GLO_TOD_DECODED_BIT) - out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GLO_TOD_DECODED; - if (in.stateMask & GNSS_MEASUREMENTS_STATE_BDS_D2_BIT_SYNC_BIT) - out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BDS_D2_BIT_SYNC; - if (in.stateMask & GNSS_MEASUREMENTS_STATE_BDS_D2_SUBFRAME_SYNC_BIT) - out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_BDS_D2_SUBFRAME_SYNC; - if (in.stateMask & GNSS_MEASUREMENTS_STATE_GAL_E1BC_CODE_LOCK_BIT) - out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1BC_CODE_LOCK; - if (in.stateMask & GNSS_MEASUREMENTS_STATE_GAL_E1C_2ND_CODE_LOCK_BIT) - out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1C_2ND_CODE_LOCK; - if (in.stateMask & GNSS_MEASUREMENTS_STATE_GAL_E1B_PAGE_SYNC_BIT) - out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_GAL_E1B_PAGE_SYNC; - if (in.stateMask & GNSS_MEASUREMENTS_STATE_SBAS_SYNC_BIT) - out.state |= IGnssMeasurementCallback::GnssMeasurementState::STATE_SBAS_SYNC; - out.receivedSvTimeInNs = in.receivedSvTimeNs; - out.receivedSvTimeUncertaintyInNs = in.receivedSvTimeUncertaintyNs; - out.cN0DbHz = in.carrierToNoiseDbHz; - out.pseudorangeRateMps = in.pseudorangeRateMps; - out.pseudorangeRateUncertaintyMps = in.pseudorangeRateUncertaintyMps; - if (in.adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_VALID_BIT) - out.accumulatedDeltaRangeState |= - IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_VALID; - if (in.adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_RESET_BIT) - out.accumulatedDeltaRangeState |= - IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_RESET; - if (in.adrStateMask & GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_CYCLE_SLIP_BIT) - out.accumulatedDeltaRangeState |= - IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_CYCLE_SLIP; - out.accumulatedDeltaRangeM = in.adrMeters; - out.accumulatedDeltaRangeUncertaintyM = in.adrUncertaintyMeters; - out.carrierFrequencyHz = in.carrierFrequencyHz; - out.carrierCycles = in.carrierCycles; - out.carrierPhase = in.carrierPhase; - out.carrierPhaseUncertainty = in.carrierPhaseUncertainty; - uint8_t indicator = - static_cast<uint8_t>(IGnssMeasurementCallback::GnssMultipathIndicator::INDICATOR_UNKNOWN); - if (in.multipathIndicator & GNSS_MEASUREMENTS_MULTIPATH_INDICATOR_PRESENT) - indicator |= IGnssMeasurementCallback::GnssMultipathIndicator::INDICATOR_PRESENT; - if (in.multipathIndicator & GNSS_MEASUREMENTS_MULTIPATH_INDICATOR_NOT_PRESENT) - indicator |= IGnssMeasurementCallback::GnssMultipathIndicator::INDICATIOR_NOT_PRESENT; - out.multipathIndicator = - static_cast<IGnssMeasurementCallback::GnssMultipathIndicator>(indicator); - out.snrDb = in.signalToNoiseRatioDb; - out.agcLevelDb = in.agcLevelDb; -} - -static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback::GnssClock& out) -{ - memset(&out, 0, sizeof(IGnssMeasurementCallback::GnssClock)); - if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_LEAP_SECOND_BIT) - out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_LEAP_SECOND; - if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_TIME_UNCERTAINTY_BIT) - out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_TIME_UNCERTAINTY; - if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_FULL_BIAS_BIT) - out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_FULL_BIAS; - if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_BIAS_BIT) - out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_BIAS; - if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_BIAS_UNCERTAINTY_BIT) - out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_BIAS_UNCERTAINTY; - if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_DRIFT_BIT) - out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_DRIFT; - if (in.flags & GNSS_MEASUREMENTS_CLOCK_FLAGS_DRIFT_UNCERTAINTY_BIT) - out.gnssClockFlags |= IGnssMeasurementCallback::GnssClockFlags::HAS_DRIFT_UNCERTAINTY; - out.leapSecond = in.leapSecond; - out.timeNs = in.timeNs; - out.timeUncertaintyNs = in.timeUncertaintyNs; - out.fullBiasNs = in.fullBiasNs; - out.biasNs = in.biasNs; - out.biasUncertaintyNs = in.biasUncertaintyNs; - out.driftNsps = in.driftNsps; - out.driftUncertaintyNsps = in.driftUncertaintyNsps; - out.hwClockDiscontinuityCount = in.hwClockDiscontinuityCount; -} - -static void convertGnssData(GnssMeasurementsNotification& in, - V1_0::IGnssMeasurementCallback::GnssData& out) -{ - out.measurementCount = in.count; - if (out.measurementCount > static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT)) { - LOC_LOGW("%s]: Too many measurement %u. Clamps to %d.", - __FUNCTION__, out.measurementCount, V1_0::GnssMax::SVS_COUNT); - out.measurementCount = static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT); - } - for (size_t i = 0; i < out.measurementCount; i++) { - convertGnssMeasurement(in.measurements[i], out.measurements[i]); - } - convertGnssClock(in.clock, out.clock); -} - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android diff --git a/gps/android/location_api/MeasurementAPIClient.h b/gps/android/location_api/MeasurementAPIClient.h deleted file mode 100644 index 08b4811..0000000 --- a/gps/android/location_api/MeasurementAPIClient.h +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright (c) 2017-2018, 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 MEASUREMENT_API_CLINET_H -#define MEASUREMENT_API_CLINET_H - -#include <mutex> -#include <android/hardware/gnss/1.0/IGnssMeasurement.h> -#include <android/hardware/gnss/1.0/IGnssMeasurementCallback.h> -#include <LocationAPIClientBase.h> -#include <hidl/Status.h> - -namespace android { -namespace hardware { -namespace gnss { -namespace V1_0 { -namespace implementation { - -using ::android::sp; - -class MeasurementAPIClient : public LocationAPIClientBase -{ -public: - MeasurementAPIClient(); - virtual ~MeasurementAPIClient(); - MeasurementAPIClient(const MeasurementAPIClient&) = delete; - MeasurementAPIClient& operator=(const MeasurementAPIClient&) = delete; - - // for GpsMeasurementInterface - Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback( - const sp<V1_0::IGnssMeasurementCallback>& callback); - void measurementClose(); - Return<IGnssMeasurement::GnssMeasurementStatus> startTracking(); - - // callbacks we are interested in - void onGnssMeasurementsCb(GnssMeasurementsNotification gnssMeasurementsNotification) final; - -private: - std::mutex mMutex; - sp<V1_0::IGnssMeasurementCallback> mGnssMeasurementCbIface; - - bool mTracking; -}; - -} // namespace implementation -} // namespace V1_0 -} // namespace gnss -} // namespace hardware -} // namespace android -#endif // MEASUREMENT_API_CLINET_H diff --git a/gps/android/service.cpp b/gps/android/service.cpp deleted file mode 100644 index c03b7ea..0000000 --- a/gps/android/service.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. - * Not a Contribution - */ -/* - * Copyright (C) 2016 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. - */ - -#define LOG_TAG "android.hardware.gnss@1.1-service-qti" - -#include <android/hardware/gnss/1.1/IGnss.h> -#include <hidl/LegacySupport.h> - -using android::hardware::gnss::V1_0::IGnss; -using android::hardware::defaultPassthroughServiceImplementation; - -int main() { - return defaultPassthroughServiceImplementation<IGnss>(); -} diff --git a/gps/build/target_specific_features.mk b/gps/build/target_specific_features.mk deleted file mode 100644 index 943e231..0000000 --- a/gps/build/target_specific_features.mk +++ /dev/null @@ -1,17 +0,0 @@ -GNSS_CFLAGS := \ - -Werror \ - -Wno-error=unused-parameter \ - -Wno-error=format \ - -Wno-error=macro-redefined \ - -Wno-error=reorder \ - -Wno-error=missing-braces \ - -Wno-error=self-assign \ - -Wno-error=enum-conversion \ - -Wno-error=logical-op-parentheses \ - -Wno-error=null-arithmetic \ - -Wno-error=null-conversion \ - -Wno-error=parentheses-equality \ - -Wno-error=undefined-bool-conversion \ - -Wno-error=tautological-compare \ - -Wno-error=switch \ - -Wno-error=date-time diff --git a/gps/configure.ac b/gps/configure.ac deleted file mode 100644 index 0ab8e68..0000000 --- a/gps/configure.ac +++ /dev/null @@ -1,87 +0,0 @@ -# configure.ac -- Autoconf script for gps loc_hal -# -# 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-hal package version 1.0.0 -AC_INIT([loc-hal],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([Makefile.am]) -# 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([GPSUTILS], [gps-utils]) -AC_SUBST([GPSUTILS_CFLAGS]) -AC_SUBST([GPSUTILS_LIBS]) - -PKG_CHECK_MODULES([LOCCORE], [loc-core]) -AC_SUBST([LOCCORE_CFLAGS]) -AC_SUBST([LOCCORE_LIBS]) - -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_ARG_WITH([locpla_includes], - AC_HELP_STRING([--with-locpla-includes=@<:@dir@:>@], - [specify the path to locpla-includes in loc-pla_git.bb]), - [locpla_incdir=$withval], - with_locpla_includes=no) - -if test "x$with_locpla_includes" != "xno"; then - AC_SUBST(LOCPLA_CFLAGS, "-I${locpla_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 \ - gnss/Makefile \ - loc-hal.pc \ - ]) - -AC_OUTPUT diff --git a/gps/core/Android.mk b/gps/core/Android.mk deleted file mode 100644 index 1a4f51a..0000000 --- a/gps/core/Android.mk +++ /dev/null @@ -1,65 +0,0 @@ -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_VENDOR_MODULE := true -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 := \ - liblog \ - libutils \ - libcutils \ - libgps.utils \ - libdl \ - liblog - -LOCAL_SRC_FILES += \ - LocApiBase.cpp \ - LocAdapterBase.cpp \ - ContextBase.cpp \ - LocDualContext.cpp \ - loc_core_log.cpp \ - data-items/DataItemsFactoryProxy.cpp \ - SystemStatusOsObserver.cpp \ - SystemStatus.cpp - -LOCAL_CFLAGS += \ - -fno-short-enums \ - -D_ANDROID_ - -LOCAL_C_INCLUDES:= \ - $(LOCAL_PATH)/data-items \ - $(LOCAL_PATH)/data-items/common \ - $(LOCAL_PATH)/observer \ - -LOCAL_HEADER_LIBRARIES := \ - libutils_headers \ - libgps.utils_headers \ - libloc_pla_headers \ - liblocation_api_headers - -LOCAL_CFLAGS += $(GNSS_CFLAGS) - -include $(BUILD_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := libloc_core_headers -LOCAL_EXPORT_C_INCLUDE_DIRS := \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/data-items \ - $(LOCAL_PATH)/data-items/common \ - $(LOCAL_PATH)/observer -include $(BUILD_HEADER_LIBRARY) - -endif # not BUILD_TINY_ANDROID -endif # BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE diff --git a/gps/core/ContextBase.cpp b/gps/core/ContextBase.cpp deleted file mode 100644 index 35e6585..0000000 --- a/gps/core/ContextBase.cpp +++ /dev/null @@ -1,252 +0,0 @@ -/* Copyright (c) 2011-2014,2016-2017 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_NDEBUG 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 <loc_pla.h> -#include <loc_log.h> - -namespace loc_core { - -loc_gps_cfg_s_type ContextBase::mGps_conf {}; -loc_sap_cfg_s_type ContextBase::mSap_conf {}; - -const loc_param_s_type ContextBase::mGps_conf_table[] = -{ - {"GPS_LOCK", &mGps_conf.GPS_LOCK, NULL, 'n'}, - {"SUPL_VER", &mGps_conf.SUPL_VER, NULL, 'n'}, - {"LPP_PROFILE", &mGps_conf.LPP_PROFILE, NULL, 'n'}, - {"A_GLONASS_POS_PROTOCOL_SELECT", &mGps_conf.A_GLONASS_POS_PROTOCOL_SELECT, NULL, 'n'}, - {"LPPE_CP_TECHNOLOGY", &mGps_conf.LPPE_CP_TECHNOLOGY, NULL, 'n'}, - {"LPPE_UP_TECHNOLOGY", &mGps_conf.LPPE_UP_TECHNOLOGY, NULL, 'n'}, - {"AGPS_CERT_WRITABLE_MASK", &mGps_conf.AGPS_CERT_WRITABLE_MASK, NULL, 'n'}, - {"SUPL_MODE", &mGps_conf.SUPL_MODE, NULL, 'n'}, - {"SUPL_ES", &mGps_conf.SUPL_ES, NULL, 'n'}, - {"INTERMEDIATE_POS", &mGps_conf.INTERMEDIATE_POS, NULL, 'n'}, - {"ACCURACY_THRES", &mGps_conf.ACCURACY_THRES, NULL, 'n'}, - {"NMEA_PROVIDER", &mGps_conf.NMEA_PROVIDER, NULL, 'n'}, - {"CAPABILITIES", &mGps_conf.CAPABILITIES, NULL, 'n'}, - {"XTRA_VERSION_CHECK", &mGps_conf.XTRA_VERSION_CHECK, NULL, 'n'}, - {"XTRA_SERVER_1", &mGps_conf.XTRA_SERVER_1, NULL, 's'}, - {"XTRA_SERVER_2", &mGps_conf.XTRA_SERVER_2, NULL, 's'}, - {"XTRA_SERVER_3", &mGps_conf.XTRA_SERVER_3, NULL, 's'}, - {"USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL", &mGps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL, NULL, 'n'}, - {"AGPS_CONFIG_INJECT", &mGps_conf.AGPS_CONFIG_INJECT, NULL, 'n'}, - {"EXTERNAL_DR_ENABLED", &mGps_conf.EXTERNAL_DR_ENABLED, NULL, 'n'}, - {"SUPL_HOST", &mGps_conf.SUPL_HOST, NULL, 's'}, - {"SUPL_PORT", &mGps_conf.SUPL_PORT, NULL, 'n'}, -}; - -const loc_param_s_type ContextBase::mSap_conf_table[] = -{ - {"GYRO_BIAS_RANDOM_WALK", &mSap_conf.GYRO_BIAS_RANDOM_WALK, &mSap_conf.GYRO_BIAS_RANDOM_WALK_VALID, 'f'}, - {"ACCEL_RANDOM_WALK_SPECTRAL_DENSITY", &mSap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY, &mSap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 'f'}, - {"ANGLE_RANDOM_WALK_SPECTRAL_DENSITY", &mSap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY, &mSap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 'f'}, - {"RATE_RANDOM_WALK_SPECTRAL_DENSITY", &mSap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY, &mSap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 'f'}, - {"VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY", &mSap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY, &mSap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 'f'}, - {"SENSOR_ACCEL_BATCHES_PER_SEC", &mSap_conf.SENSOR_ACCEL_BATCHES_PER_SEC, NULL, 'n'}, - {"SENSOR_ACCEL_SAMPLES_PER_BATCH", &mSap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH, NULL, 'n'}, - {"SENSOR_GYRO_BATCHES_PER_SEC", &mSap_conf.SENSOR_GYRO_BATCHES_PER_SEC, NULL, 'n'}, - {"SENSOR_GYRO_SAMPLES_PER_BATCH", &mSap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH, NULL, 'n'}, - {"SENSOR_ACCEL_BATCHES_PER_SEC_HIGH", &mSap_conf.SENSOR_ACCEL_BATCHES_PER_SEC_HIGH, NULL, 'n'}, - {"SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH", &mSap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH, NULL, 'n'}, - {"SENSOR_GYRO_BATCHES_PER_SEC_HIGH", &mSap_conf.SENSOR_GYRO_BATCHES_PER_SEC_HIGH, NULL, 'n'}, - {"SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH", &mSap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH, NULL, 'n'}, - {"SENSOR_CONTROL_MODE", &mSap_conf.SENSOR_CONTROL_MODE, NULL, 'n'}, - {"SENSOR_USAGE", &mSap_conf.SENSOR_USAGE, NULL, 'n'}, - {"SENSOR_ALGORITHM_CONFIG_MASK", &mSap_conf.SENSOR_ALGORITHM_CONFIG_MASK, NULL, 'n'}, - {"SENSOR_PROVIDER", &mSap_conf.SENSOR_PROVIDER, NULL, 'n'} -}; - -void ContextBase::readConfig() -{ - /*Defaults for gps.conf*/ - mGps_conf.INTERMEDIATE_POS = 0; - mGps_conf.ACCURACY_THRES = 0; - mGps_conf.NMEA_PROVIDER = 0; - mGps_conf.GPS_LOCK = 0; - mGps_conf.SUPL_VER = 0x10000; - mGps_conf.SUPL_MODE = 0x1; - mGps_conf.SUPL_ES = 0; - mGps_conf.SUPL_HOST[0] = 0; - mGps_conf.SUPL_PORT = 0; - mGps_conf.CAPABILITIES = 0x7; - /* LTE Positioning Profile configuration is disable by default*/ - mGps_conf.LPP_PROFILE = 0; - /*By default no positioning protocol is selected on A-GLONASS system*/ - mGps_conf.A_GLONASS_POS_PROTOCOL_SELECT = 0; - /*XTRA version check is disabled by default*/ - mGps_conf.XTRA_VERSION_CHECK=0; - /*Use emergency PDN by default*/ - mGps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL = 1; - /* By default no LPPe CP technology is enabled*/ - mGps_conf.LPPE_CP_TECHNOLOGY = 0; - /* By default no LPPe UP technology is enabled*/ - mGps_conf.LPPE_UP_TECHNOLOGY = 0; - - /*Defaults for sap.conf*/ - mSap_conf.GYRO_BIAS_RANDOM_WALK = 0; - mSap_conf.SENSOR_ACCEL_BATCHES_PER_SEC = 2; - mSap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH = 5; - mSap_conf.SENSOR_GYRO_BATCHES_PER_SEC = 2; - mSap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH = 5; - mSap_conf.SENSOR_ACCEL_BATCHES_PER_SEC_HIGH = 4; - mSap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH = 25; - mSap_conf.SENSOR_GYRO_BATCHES_PER_SEC_HIGH = 4; - mSap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH = 25; - mSap_conf.SENSOR_CONTROL_MODE = 0; /* AUTO */ - mSap_conf.SENSOR_USAGE = 0; /* Enabled */ - mSap_conf.SENSOR_ALGORITHM_CONFIG_MASK = 0; /* INS Disabled = FALSE*/ - /* Values MUST be set by OEMs in configuration for sensor-assisted - navigation to work. There are NO default values */ - mSap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY = 0; - mSap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY = 0; - mSap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY = 0; - mSap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY = 0; - mSap_conf.GYRO_BIAS_RANDOM_WALK_VALID = 0; - mSap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID = 0; - mSap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID = 0; - mSap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID = 0; - mSap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID = 0; - /* default provider is SSC */ - mSap_conf.SENSOR_PROVIDER = 1; - - /* None of the 10 slots for agps certificates are writable by default */ - mGps_conf.AGPS_CERT_WRITABLE_MASK = 0; - - /* inject supl config to modem with config values from config.xml or gps.conf, default 1 */ - mGps_conf.AGPS_CONFIG_INJECT = 1; - - UTIL_READ_CONF(LOC_PATH_GPS_CONF, mGps_conf_table); - UTIL_READ_CONF(LOC_PATH_SAP_CONF, mSap_conf_table); -} - -uint32_t ContextBase::getCarrierCapabilities() { - #define carrierMSA (uint32_t)0x2 - #define carrierMSB (uint32_t)0x1 - #define gpsConfMSA (uint32_t)0x4 - #define gpsConfMSB (uint32_t)0x2 - uint32_t capabilities = mGps_conf.CAPABILITIES; - if ((mGps_conf.SUPL_MODE & carrierMSA) != carrierMSA) { - capabilities &= ~gpsConfMSA; - } - if ((mGps_conf.SUPL_MODE & carrierMSB) != carrierMSB) { - capabilities &= ~gpsConfMSB; - } - - LOC_LOGV("getCarrierCapabilities: CAPABILITIES %x, SUPL_MODE %x, carrier capabilities %x", - mGps_conf.CAPABILITIES, mGps_conf.SUPL_MODE, capabilities); - return capabilities; -} - -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)(); - } - } - else - { - LOC_LOGW("%s:%d]: FAILED TO LOAD libname: %s\n", __func__, __LINE__, libName); - } - 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; - - // Check the target - if (TARGET_NO_GNSS != 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()) -{ -} - -} diff --git a/gps/core/ContextBase.h b/gps/core/ContextBase.h deleted file mode 100644 index dc64b6a..0000000 --- a/gps/core/ContextBase.h +++ /dev/null @@ -1,151 +0,0 @@ -/* Copyright (c) 2011-2017, 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> -#include <loc_cfg.h> - -#define MAX_XTRA_SERVER_URL_LENGTH (256) -#define MAX_SUPL_SERVER_URL_LENGTH (256) - -/* 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 SUPL_ES; - 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; - uint32_t AGPS_CONFIG_INJECT; - uint32_t LPPE_CP_TECHNOLOGY; - uint32_t LPPE_UP_TECHNOLOGY; - uint32_t EXTERNAL_DR_ENABLED; - char SUPL_HOST[MAX_SUPL_SERVER_URL_LENGTH]; - uint32_t SUPL_PORT; -} 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; - -namespace loc_core { - -class LocAdapterBase; - -class ContextBase { - static LBSProxyBase* getLBSProxy(const char* libName); - LocApiBase* createLocApi(LOC_API_ADAPTER_EVENT_MASK_T excludedMask); - static const loc_param_s_type mGps_conf_table[]; - static const loc_param_s_type mSap_conf_table[]; -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 bool hasNativeXtraClient() { return mLBSProxy->hasNativeXtraClient(); } - 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); } - - static loc_gps_cfg_s_type mGps_conf; - static loc_sap_cfg_s_type mSap_conf; - - void readConfig(); - static uint32_t getCarrierCapabilities(); - -}; - -} // namespace loc_core - -#endif //__LOC_CONTEXT_BASE__ diff --git a/gps/core/LBSProxyBase.h b/gps/core/LBSProxyBase.h deleted file mode 100644 index 94ddd0f..0000000 --- a/gps/core/LBSProxyBase.h +++ /dev/null @@ -1,80 +0,0 @@ -/* 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 { - - (void)msgTask; - (void)exMask; - (void)context; - return NULL; - } -protected: - inline LBSProxyBase() {} -public: - inline virtual ~LBSProxyBase() {} - inline virtual void requestUlp(LocAdapterBase* adapter, - unsigned long capabilities) const { - - (void)adapter; - (void)capabilities; - } - inline virtual bool hasAgpsExtendedCapabilities() const { return false; } - inline virtual bool hasCPIExtendedCapabilities() const { return false; } - inline virtual void modemPowerVote(bool power) const { - - (void)power; - } - virtual void injectFeatureConfig(ContextBase* context) const { - - (void)context; - } - inline virtual bool hasNativeXtraClient() const { return false; } - inline virtual IzatDevId_t getIzatDevId() const { return 0; } -}; - -typedef LBSProxyBase* (getLBSProxy_t)(); - -} // namespace loc_core - -#endif // IZAT_PROXY_BASE_H diff --git a/gps/core/LocAdapterBase.cpp b/gps/core/LocAdapterBase.cpp deleted file mode 100644 index d0da3da..0000000 --- a/gps/core/LocAdapterBase.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/* Copyright (c) 2011-2014, 2016-2017The 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_NDEBUG 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); -} - -uint32_t LocAdapterBase::mSessionIdCounter(1); - -uint32_t LocAdapterBase::generateSessionId() -{ - if (++mSessionIdCounter == 0xFFFFFFFF) - mSessionIdCounter = 1; - - return mSessionIdCounter; -} - -void LocAdapterBase::handleEngineUpEvent() -{ - if (mLocAdapterProxyBase) { - mLocAdapterProxyBase->handleEngineUpEvent(); - } -} - -void LocAdapterBase::handleEngineDownEvent() -{ - if (mLocAdapterProxyBase) { - mLocAdapterProxyBase->handleEngineDownEvent(); - } -} - -void LocAdapterBase:: - reportPositionEvent(const UlpLocation& location, - const GpsLocationExtended& locationExtended, - enum loc_sess_status status, - LocPosTechMask loc_technology_mask, - bool /*fromUlp*/) { - if (mLocAdapterProxyBase != NULL) { - mLocAdapterProxyBase->reportPositionEvent((UlpLocation&)location, - (GpsLocationExtended&)locationExtended, - status, - loc_technology_mask); - } else { - DEFAULT_IMPL() - } -} - -void LocAdapterBase:: - reportSvEvent(const GnssSvNotification& /*svNotify*/, bool /*fromUlp*/) -DEFAULT_IMPL() - -void LocAdapterBase:: - reportSvMeasurementEvent(GnssSvMeasurementSet &/*svMeasurementSet*/) -DEFAULT_IMPL() - -void LocAdapterBase:: - reportSvPolynomialEvent(GnssSvPolynomial &/*svPolynomial*/) -DEFAULT_IMPL() - -void LocAdapterBase:: - reportStatus(LocGpsStatusValue /*status*/) -DEFAULT_IMPL() - - -void LocAdapterBase:: - reportNmeaEvent(const char* /*nmea*/, size_t /*length*/, bool /*fromUlp*/) -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*/, LocAGpsType /*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:: - requestNiNotifyEvent(const GnssNiNotification &/*notify*/, const void* /*data*/) -DEFAULT_IMPL(false) - -void LocAdapterBase:: - reportGnssMeasurementDataEvent(const GnssMeasurementsNotification& /*measurements*/, - int /*msInWeek*/) -DEFAULT_IMPL() - -bool LocAdapterBase:: - reportWwanZppFix(LocGpsLocation &/*zppLoc*/) -DEFAULT_IMPL(false) - -bool LocAdapterBase:: - reportOdcpiRequestEvent(OdcpiRequestInfo& /*request*/) -DEFAULT_IMPL(false) - -} // namespace loc_core diff --git a/gps/core/LocAdapterBase.h b/gps/core/LocAdapterBase.h deleted file mode 100644 index 35fc48e..0000000 --- a/gps/core/LocAdapterBase.h +++ /dev/null @@ -1,161 +0,0 @@ -/* Copyright (c) 2011-2014, 2016-2017 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> -#include <LocationAPI.h> -#include <map> - -typedef struct LocationSessionKey { - LocationAPI* client; - uint32_t id; - inline LocationSessionKey(LocationAPI* _client, uint32_t _id) : - client(_client), id(_id) {} -} LocationSessionKey; -inline bool operator <(LocationSessionKey const& left, LocationSessionKey const& right) { - return left.id < right.id || (left.id == right.id && left.client < right.client); -} -inline bool operator ==(LocationSessionKey const& left, LocationSessionKey const& right) { - return left.id == right.id && left.client == right.client; -} -inline bool operator !=(LocationSessionKey const& left, LocationSessionKey const& right) { - return left.id != right.id || left.client != right.client; -} -typedef std::map<LocationSessionKey, LocationOptions> LocationSessionMap; - -namespace loc_core { - -class LocAdapterProxyBase; - -class LocAdapterBase { -private: - static uint32_t mSessionIdCounter; -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 status) - { - switch(status) { - case (LOC_REGISTRATION_MASK_ENABLED): - mEvtMask = mEvtMask | event; - break; - case (LOC_REGISTRATION_MASK_DISABLED): - mEvtMask = mEvtMask &~ event; - break; - case (LOC_REGISTRATION_MASK_SET): - mEvtMask = event; - break; - } - mLocApi->updateEvtMask(); - } - - inline bool isFeatureSupported(uint8_t featureVal) { - return mLocApi->isFeatureSupported(featureVal); - } - - uint32_t generateSessionId(); - - // This will be overridden by the individual adapters - // if necessary. - inline virtual void setUlpProxyCommand(UlpProxyBase* ulp) { - - (void)ulp; - } - virtual void handleEngineUpEvent(); - virtual void handleEngineDownEvent(); - inline virtual void setPositionModeCommand(LocPosMode& posMode) { - - (void)posMode; - } - virtual void startTrackingCommand() {} - virtual void stopTrackingCommand() {} - virtual void getZppCommand() {} - virtual void reportPositionEvent(const UlpLocation& location, - const GpsLocationExtended& locationExtended, - enum loc_sess_status status, - LocPosTechMask loc_technology_mask, - bool fromUlp=false); - virtual void reportSvEvent(const GnssSvNotification& svNotify, bool fromUlp=false); - virtual void reportNmeaEvent(const char* nmea, size_t length, bool fromUlp=false); - virtual void reportSvMeasurementEvent(GnssSvMeasurementSet &svMeasurementSet); - virtual void reportSvPolynomialEvent(GnssSvPolynomial &svPolynomial); - virtual void reportStatus(LocGpsStatusValue status); - 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, LocAGpsType agps_type); - virtual bool releaseATL(int connHandle); - virtual bool requestSuplES(int connHandle); - virtual bool reportDataCallOpened(); - virtual bool reportDataCallClosed(); - virtual bool requestNiNotifyEvent(const GnssNiNotification ¬ify, const void* data); - inline virtual bool isInSession() { return false; } - ContextBase* getContext() const { return mContext; } - virtual void reportGnssMeasurementDataEvent(const GnssMeasurementsNotification& measurements, - int msInWeek); - virtual bool reportWwanZppFix(LocGpsLocation &zppLoc); - virtual bool reportOdcpiRequestEvent(OdcpiRequestInfo& request); -}; - -} // namespace loc_core - -#endif //LOC_API_ADAPTER_BASE_H diff --git a/gps/core/LocAdapterProxyBase.h b/gps/core/LocAdapterProxyBase.h deleted file mode 100644 index 044f59b..0000000 --- a/gps/core/LocAdapterProxyBase.h +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright (c) 2014, 2016-2017 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; - } - inline void updateEvtMask(LOC_API_ADAPTER_EVENT_MASK_T event, - loc_registration_mask_status isEnabled) { - mLocAdapterBase->updateEvtMask(event,isEnabled); - } - - inline uint32_t generateSessionId() { - return mLocAdapterBase->generateSessionId(); - } -public: - inline ContextBase* getContext() const { - return mLocAdapterBase->getContext(); - } - - inline virtual void handleEngineUpEvent() {}; - inline virtual void handleEngineDownEvent() {}; - inline virtual void reportPositionEvent(UlpLocation &location, - GpsLocationExtended &locationExtended, - enum loc_sess_status status, - LocPosTechMask loc_technology_mask) { - - (void)location; - (void)locationExtended; - (void)status; - (void)loc_technology_mask; - } -}; - -} // namespace loc_core - -#endif //LOC_ADAPTER_PROXY_BASE_H diff --git a/gps/core/LocApiBase.cpp b/gps/core/LocApiBase.cpp deleted file mode 100644 index 426335d..0000000 --- a/gps/core/LocApiBase.cpp +++ /dev/null @@ -1,614 +0,0 @@ -/* Copyright (c) 2011-2014, 2016-2017 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_NDEBUG 0 //Define to enable LOGV -#define LOG_TAG "LocSvc_LocApiBase" - -#include <dlfcn.h> -#include <inttypes.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() const { - LOC_LOGV("LocSsrMsg"); - } - inline virtual void log() const { - locallog(); - } -}; - -struct LocOpenMsg : public LocMsg { - LocApiBase* mLocApi; - inline LocOpenMsg(LocApiBase* locApi) : - LocMsg(), mLocApi(locApi) - { - locallog(); - } - inline virtual void proc() const { - mLocApi->open(mLocApi->getEvtMask()); - } - inline void locallog() const { - LOC_LOGv("LocOpen Mask: %" PRIx64 "\n", mLocApi->getEvtMask()); - } - inline virtual void log() const { - locallog(); - } -}; - -LocApiBase::LocApiBase(const MsgTask* msgTask, - LOC_API_ADAPTER_EVENT_MASK_T excludedMask, - ContextBase* context) : - mMsgTask(msgTask), mContext(context), mSupportedMsg(0), - mMask(0), mExcludedMask(excludedMask) -{ - memset(mLocAdapters, 0, sizeof(mLocAdapters)); - memset(mFeaturesSupported, 0, sizeof(mFeaturesSupported)); -} - -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)); - 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)); - } - } - } -} - -void LocApiBase::updateEvtMask() -{ - open(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, - enum loc_sess_status status, - LocPosTechMask loc_technology_mask) -{ - // print the location info before delivering - LOC_LOGD("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: %" PRId64 "\n rawDataSize: %d\n rawData: %p\n " - "Session status: %d\n Technology mask: %u\n " - "SV used in fix (gps/glo/bds/gal/qzss) : \ - (%" PRIx64 "/%" PRIx64 "/%" PRIx64 "/%" PRIx64 "/%" PRIx64 ")", - 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, - locationExtended.gnss_sv_used_ids.gps_sv_used_ids_mask, - locationExtended.gnss_sv_used_ids.glo_sv_used_ids_mask, - locationExtended.gnss_sv_used_ids.bds_sv_used_ids_mask, - locationExtended.gnss_sv_used_ids.gal_sv_used_ids_mask, - locationExtended.gnss_sv_used_ids.qzss_sv_used_ids_mask); - // loop through adapters, and deliver to all adapters. - TO_ALL_LOCADAPTERS( - mLocAdapters[i]->reportPositionEvent(location, locationExtended, - status, loc_technology_mask) - ); -} - -void LocApiBase::reportWwanZppFix(LocGpsLocation &zppLoc) -{ - // loop through adapters, and deliver to the first handling adapter. - TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->reportWwanZppFix(zppLoc)); -} - -void LocApiBase::reportOdcpiRequest(OdcpiRequestInfo& request) -{ - // loop through adapters, and deliver to the first handling adapter. - TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->reportOdcpiRequestEvent(request)); -} - -void LocApiBase::reportSv(GnssSvNotification& svNotify) -{ - const char* constellationString[] = { "Unknown", "GPS", "SBAS", "GLONASS", - "QZSS", "BEIDOU", "GALILEO" }; - - // print the SV info before delivering - LOC_LOGV("num sv: %zu\n" - " sv: constellation svid cN0" - " elevation azimuth flags", - svNotify.count); - for (size_t i = 0; i < svNotify.count && i < LOC_GNSS_MAX_SVS; i++) { - if (svNotify.gnssSvs[i].type > - sizeof(constellationString) / sizeof(constellationString[0]) - 1) { - svNotify.gnssSvs[i].type = GNSS_SV_TYPE_UNKNOWN; - } - LOC_LOGV(" %03zu: %*s %02d %f %f %f 0x%02X", - i, - 13, - constellationString[svNotify.gnssSvs[i].type], - svNotify.gnssSvs[i].svId, - svNotify.gnssSvs[i].cN0Dbhz, - svNotify.gnssSvs[i].elevation, - svNotify.gnssSvs[i].azimuth, - svNotify.gnssSvs[i].gnssSvOptionsMask); - } - // loop through adapters, and deliver to all adapters. - TO_ALL_LOCADAPTERS( - mLocAdapters[i]->reportSvEvent(svNotify) - ); -} - -void LocApiBase::reportSvMeasurement(GnssSvMeasurementSet &svMeasurementSet) -{ - // loop through adapters, and deliver to all adapters. - TO_ALL_LOCADAPTERS( - mLocAdapters[i]->reportSvMeasurementEvent(svMeasurementSet) - ); -} - -void LocApiBase::reportSvPolynomial(GnssSvPolynomial &svPolynomial) -{ - // loop through adapters, and deliver to all adapters. - TO_ALL_LOCADAPTERS( - mLocAdapters[i]->reportSvPolynomialEvent(svPolynomial) - ); -} - -void LocApiBase::reportStatus(LocGpsStatusValue 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]->reportNmeaEvent(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, LocAGpsType 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(GnssNiNotification ¬ify, const void* data) -{ - // loop through adapters, and deliver to the first handling adapter. - TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestNiNotifyEvent(notify, data)); -} - -void LocApiBase::saveSupportedMsgList(uint64_t supportedMsgList) -{ - mSupportedMsg = supportedMsgList; -} - -void LocApiBase::saveSupportedFeatureList(uint8_t *featureList) -{ - memcpy((void *)mFeaturesSupported, (void *)featureList, sizeof(mFeaturesSupported)); -} - -void* LocApiBase :: getSibling() - DEFAULT_IMPL(NULL) - -LocApiProxyBase* LocApiBase :: getLocApiProxy() - DEFAULT_IMPL(NULL) - -void LocApiBase::reportGnssMeasurementData(GnssMeasurementsNotification& measurements, - int msInWeek) -{ - // loop through adapters, and deliver to all adapters. - TO_ALL_LOCADAPTERS(mLocAdapters[i]->reportGnssMeasurementDataEvent(measurements, msInWeek)); -} - -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) - -LocationError LocApiBase:: - deleteAidingData(const GnssAidingData& /*data*/) -DEFAULT_IMPL(LOCATION_ERROR_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:: - injectPosition(const Location& /*location*/) -DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS) - -enum loc_api_adapter_err LocApiBase:: - setTime(LocGpsUtcTime /*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*/, LocAGpsType /*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) - -LocationError LocApiBase:: - setServer(const char* /*url*/, int /*len*/) -DEFAULT_IMPL(LOCATION_ERROR_SUCCESS) - -LocationError LocApiBase:: - setServer(unsigned int /*ip*/, int /*port*/, LocServerType /*type*/) -DEFAULT_IMPL(LOCATION_ERROR_SUCCESS) - -LocationError LocApiBase:: - informNiResponse(GnssNiResponse /*userResponse*/, const void* /*passThroughData*/) -DEFAULT_IMPL(LOCATION_ERROR_SUCCESS) - -LocationError LocApiBase:: - setSUPLVersion(GnssConfigSuplVersion /*version*/) -DEFAULT_IMPL(LOCATION_ERROR_SUCCESS) - -enum loc_api_adapter_err LocApiBase:: - setNMEATypes (uint32_t /*typesMask*/) -DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS) - -LocationError LocApiBase:: - setLPPConfig(GnssConfigLppProfile /*profile*/) -DEFAULT_IMPL(LOCATION_ERROR_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) - -LocationError LocApiBase:: - setAGLONASSProtocol(GnssConfigAGlonassPositionProtocolMask /*aGlonassProtocol*/) -DEFAULT_IMPL(LOCATION_ERROR_SUCCESS) - -LocationError LocApiBase:: - setLPPeProtocolCp(GnssConfigLppeControlPlaneMask /*lppeCP*/) -DEFAULT_IMPL(LOCATION_ERROR_SUCCESS) - -LocationError LocApiBase:: - setLPPeProtocolUp(GnssConfigLppeUserPlaneMask /*lppeUP*/) -DEFAULT_IMPL(LOCATION_ERROR_SUCCESS) - -enum loc_api_adapter_err LocApiBase:: - getWwanZppFix() -DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS) - -enum loc_api_adapter_err LocApiBase:: - getBestAvailableZppFix(LocGpsLocation& zppLoc) -{ - memset(&zppLoc, 0, sizeof(zppLoc)); - DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS) -} - -enum loc_api_adapter_err LocApiBase:: - getBestAvailableZppFix(LocGpsLocation & zppLoc, GpsLocationExtended & locationExtended, - LocPosTechMask & tech_mask) -{ - memset(&zppLoc, 0, sizeof(zppLoc)); - memset(&tech_mask, 0, sizeof(tech_mask)); - memset(&locationExtended, 0, sizeof (locationExtended)); - DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS) -} - -int LocApiBase:: - initDataServiceClient(bool /*isDueToSsr*/) -DEFAULT_IMPL(-1) - -int LocApiBase:: - openAndStartDataCall() -DEFAULT_IMPL(-1) - -void LocApiBase:: - stopDataCall() -DEFAULT_IMPL() - -void LocApiBase:: - closeDataCall() -DEFAULT_IMPL() - -void LocApiBase:: - releaseDataServiceClient() -DEFAULT_IMPL() - -LocationError LocApiBase:: - setGpsLock(GnssConfigGpsLock /*lock*/) -DEFAULT_IMPL(LOCATION_ERROR_SUCCESS) - -void LocApiBase:: - installAGpsCert(const LocDerEncodedCertificate* /*pData*/, - size_t /*length*/, - uint32_t /*slotBitMask*/) -DEFAULT_IMPL() - -int LocApiBase:: - getGpsLock() -DEFAULT_IMPL(-1) - -LocationError LocApiBase:: - setXtraVersionCheck(uint32_t /*check*/) -DEFAULT_IMPL(LOCATION_ERROR_SUCCESS) - -bool LocApiBase:: - gnssConstellationConfig() -DEFAULT_IMPL(false) - -bool LocApiBase:: - isFeatureSupported(uint8_t featureVal) -{ - uint8_t arrayIndex = featureVal >> 3; - uint8_t bitPos = featureVal & 7; - - if (arrayIndex >= MAX_FEATURE_LENGTH) return false; - return ((mFeaturesSupported[arrayIndex] >> bitPos ) & 0x1); -} - -} // namespace loc_core diff --git a/gps/core/LocApiBase.h b/gps/core/LocApiBase.h deleted file mode 100644 index 6563dea..0000000 --- a/gps/core/LocApiBase.h +++ /dev/null @@ -1,269 +0,0 @@ -/* Copyright (c) 2011-2014, 2016-2017 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 <LocationAPI.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 MAX_FEATURE_LENGTH 100 - -#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; - uint8_t mFeaturesSupported[MAX_FEATURE_LENGTH]; - -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, - enum loc_sess_status status, - LocPosTechMask loc_technology_mask = - LOC_POS_TECH_MASK_DEFAULT); - void reportSv(GnssSvNotification& svNotify); - void reportSvMeasurement(GnssSvMeasurementSet &svMeasurementSet); - void reportSvPolynomial(GnssSvPolynomial &svPolynomial); - void reportStatus(LocGpsStatusValue 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, LocAGpsType agps_type); - void releaseATL(int connHandle); - void requestSuplES(int connHandle); - void reportDataCallOpened(); - void reportDataCallClosed(); - void requestNiNotify(GnssNiNotification ¬ify, const void* data); - void saveSupportedMsgList(uint64_t supportedMsgList); - void reportGnssMeasurementData(GnssMeasurementsNotification& measurements, int msInWeek); - void saveSupportedFeatureList(uint8_t *featureList); - void reportWwanZppFix(LocGpsLocation &zppLoc); - void reportOdcpiRequest(OdcpiRequestInfo& request); - - // 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 LocationError - deleteAidingData(const GnssAidingData& data); - 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 - injectPosition(const Location& location); - virtual enum loc_api_adapter_err - setTime(LocGpsUtcTime 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, LocAGpsType agpsType); - virtual enum loc_api_adapter_err - atlCloseStatus(int handle, int is_succ); - virtual enum loc_api_adapter_err - setPositionMode(const LocPosMode& posMode); - virtual LocationError - setServer(const char* url, int len); - virtual LocationError - setServer(unsigned int ip, int port, - LocServerType type); - virtual LocationError - informNiResponse(GnssNiResponse userResponse, const void* passThroughData); - virtual LocationError setSUPLVersion(GnssConfigSuplVersion version); - virtual enum loc_api_adapter_err - setNMEATypes (uint32_t typesMask); - virtual LocationError setLPPConfig(GnssConfigLppProfile 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 LocationError - setAGLONASSProtocol(GnssConfigAGlonassPositionProtocolMask aGlonassProtocol); - virtual LocationError setLPPeProtocolCp(GnssConfigLppeControlPlaneMask lppeCP); - virtual LocationError setLPPeProtocolUp(GnssConfigLppeUserPlaneMask lppeUP); - virtual enum loc_api_adapter_err - getWwanZppFix(); - virtual enum loc_api_adapter_err - getBestAvailableZppFix(LocGpsLocation & zppLoc); - virtual enum loc_api_adapter_err - getBestAvailableZppFix(LocGpsLocation & zppLoc, GpsLocationExtended & locationExtended, - LocPosTechMask & tech_mask); - virtual int initDataServiceClient(bool isDueToSsr); - virtual int openAndStartDataCall(); - virtual void stopDataCall(); - virtual void closeDataCall(); - virtual void releaseDataServiceClient(); - virtual void installAGpsCert(const LocDerEncodedCertificate* pData, - size_t length, - uint32_t slotBitMask); - inline virtual void setInSession(bool inSession) { - - (void)inSession; - } - inline bool isMessageSupported (LocCheckingMessagesID msgID) const { - - // confirm if msgID is not larger than the number of bits in - // mSupportedMsg - if ((uint64_t)msgID > (sizeof(mSupportedMsg) << 3)) { - return false; - } else { - uint32_t messageChecker = 1 << msgID; - return (messageChecker & mSupportedMsg) == messageChecker; - } - } - - void updateEvtMask(); - - virtual LocationError setGpsLock(GnssConfigGpsLock lock); - /* - Returns - Current value of GPS Lock on success - -1 on failure - */ - virtual int getGpsLock(void); - - virtual LocationError setXtraVersionCheck(uint32_t check); - /* - Check if the modem support the service - */ - virtual bool gnssConstellationConfig(); - - /* - Check if a feature is supported - */ - bool isFeatureSupported(uint8_t featureVal); -}; - -typedef LocApiBase* (getLocApi_t)(const MsgTask* msgTask, - LOC_API_ADAPTER_EVENT_MASK_T exMask, - ContextBase *context); - -} // namespace loc_core - -#endif //LOC_API_BASE_H diff --git a/gps/core/LocDualContext.cpp b/gps/core/LocDualContext.cpp deleted file mode 100644 index 180d9dc..0000000 --- a/gps/core/LocDualContext.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/* Copyright (c) 2011-2014, 2016-2017 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_NDEBUG 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_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"; -#ifndef USE_GLIB -const char* LocDualContext::mLBSLibName = "liblbs_core.so"; -#else -const char* LocDualContext::mLBSLibName = "liblbs_core.so.1"; -#endif - -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) -{ -} - -} diff --git a/gps/core/LocDualContext.h b/gps/core/LocDualContext.h deleted file mode 100644 index 3b3ce2c..0000000 --- a/gps/core/LocDualContext.h +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright (c) 2011-2014, 2017 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__ diff --git a/gps/core/Makefile.am b/gps/core/Makefile.am deleted file mode 100644 index 77bc610..0000000 --- a/gps/core/Makefile.am +++ /dev/null @@ -1,66 +0,0 @@ -ACLOCAL_AMFLAGS = -I m4 - -AM_CFLAGS = -I./ \ - $(LOCPLA_CFLAGS) \ - $(GPSUTILS_CFLAGS) \ - -I./data-items/ \ - -I./data-items/common \ - -I./observer \ - -I$(WORKSPACE)/gps-noship/flp \ - -D__func__=__PRETTY_FUNCTION__ \ - -fno-short-enums \ - -std=c++11 - -libloc_core_la_h_sources = \ - LocApiBase.h \ - LocAdapterBase.h \ - ContextBase.h \ - LocDualContext.h \ - LBSProxyBase.h \ - UlpProxyBase.h \ - loc_core_log.h \ - LocAdapterProxyBase.h \ - data-items/DataItemId.h \ - data-items/IDataItemCore.h \ - data-items/DataItemConcreteTypesBase.h \ - observer/IDataItemObserver.h \ - observer/IDataItemSubscription.h \ - observer/IFrameworkActionReq.h \ - observer/IOsObserver.h \ - SystemStatusOsObserver.h \ - SystemStatus.h - -libloc_core_la_c_sources = \ - LocApiBase.cpp \ - LocAdapterBase.cpp \ - ContextBase.cpp \ - LocDualContext.cpp \ - loc_core_log.cpp \ - data-items/DataItemsFactoryProxy.cpp \ - SystemStatusOsObserver.cpp \ - SystemStatus.cpp - -library_includedir = $(pkgincludedir) - -library_include_HEADERS = $(libloc_core_la_h_sources) - -libloc_core_la_SOURCES = $(libloc_core_la_c_sources) - -if USE_GLIB -libloc_core_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@ -libloc_core_la_LDFLAGS = -lstdc++ -Wl,-z,defs -lpthread @GLIB_LIBS@ -shared -version-info 1:0:0 -libloc_core_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@ -else -libloc_core_la_CFLAGS = $(AM_CFLAGS) -libloc_core_la_LDFLAGS = -Wl,-z,defs -lpthread -shared -version-info 1:0:0 -libloc_core_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -endif - -libloc_core_la_LIBADD = -ldl $(GPSUTILS_LIBS) - -#Create and Install libraries -lib_LTLIBRARIES = libloc_core.la - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = loc-core.pc -EXTRA_DIST = $(pkgconfig_DATA) diff --git a/gps/core/SystemStatus.cpp b/gps/core/SystemStatus.cpp deleted file mode 100644 index f4316ca..0000000 --- a/gps/core/SystemStatus.cpp +++ /dev/null @@ -1,1695 +0,0 @@ -/* Copyright (c) 2017, 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_TAG "LocSvc_SystemStatus" - -#include <inttypes.h> -#include <string> -#include <stdlib.h> -#include <string.h> -#include <sys/time.h> -#include <pthread.h> -#include <loc_pla.h> -#include <log_util.h> -#include <loc_nmea.h> -#include <DataItemsFactoryProxy.h> -#include <SystemStatus.h> -#include <SystemStatusOsObserver.h> -#include <DataItemConcreteTypesBase.h> - -namespace loc_core -{ - -/****************************************************************************** - SystemStatusNmeaBase - base class for all NMEA parsers -******************************************************************************/ -class SystemStatusNmeaBase -{ -protected: - std::vector<std::string> mField; - - SystemStatusNmeaBase(const char *str_in, uint32_t len_in) - { - // check size and talker - if (!loc_nmea_is_debug(str_in, len_in)) { - return; - } - - std::string parser(str_in); - std::string::size_type index = 0; - - // verify checksum field - index = parser.find("*"); - if (index == std::string::npos) { - return; - } - parser[index] = ','; - - // tokenize parser - while (1) { - std::string str; - index = parser.find(","); - if (index == std::string::npos) { - break; - } - str = parser.substr(0, index); - parser = parser.substr(index + 1); - mField.push_back(str); - } - } - - virtual ~SystemStatusNmeaBase() { } - -public: - static const uint32_t NMEA_MINSIZE = DEBUG_NMEA_MINSIZE; - static const uint32_t NMEA_MAXSIZE = DEBUG_NMEA_MAXSIZE; -}; - -/****************************************************************************** - SystemStatusPQWM1 -******************************************************************************/ -class SystemStatusPQWM1 -{ -public: - uint16_t mGpsWeek; // x1 - uint32_t mGpsTowMs; // x2 - uint8_t mTimeValid; // x3 - uint8_t mTimeSource; // x4 - int32_t mTimeUnc; // x5 - int32_t mClockFreqBias; // x6 - int32_t mClockFreqBiasUnc; // x7 - uint8_t mXoState; // x8 - int32_t mPgaGain; // x9 - uint32_t mGpsBpAmpI; // xA - uint32_t mGpsBpAmpQ; // xB - uint32_t mAdcI; // xC - uint32_t mAdcQ; // xD - uint32_t mJammerGps; // xE - uint32_t mJammerGlo; // xF - uint32_t mJammerBds; // x10 - uint32_t mJammerGal; // x11 - uint32_t mRecErrorRecovery; // x12 - double mAgcGps; // x13 - double mAgcGlo; // x14 - double mAgcBds; // x15 - double mAgcGal; // x16 - int32_t mLeapSeconds;// x17 - int32_t mLeapSecUnc; // x18 - uint32_t mGloBpAmpI; // x19 - uint32_t mGloBpAmpQ; // x1A - uint32_t mBdsBpAmpI; // x1B - uint32_t mBdsBpAmpQ; // x1C - uint32_t mGalBpAmpI; // x1D - uint32_t mGalBpAmpQ; // x1E -}; - -// parser -class SystemStatusPQWM1parser : public SystemStatusNmeaBase -{ -private: - enum - { - eTalker = 0, - eGpsWeek = 1, - eGpsTowMs = 2, - eTimeValid = 3, - eTimeSource = 4, - eTimeUnc = 5, - eClockFreqBias = 6, - eClockFreqBiasUnc = 7, - eXoState = 8, - ePgaGain = 9, - eGpsBpAmpI = 10, - eGpsBpAmpQ = 11, - eAdcI = 12, - eAdcQ = 13, - eJammerGps = 14, - eJammerGlo = 15, - eJammerBds = 16, - eJammerGal = 17, - eRecErrorRecovery = 18, - eAgcGps = 19, - eAgcGlo = 20, - eAgcBds = 21, - eAgcGal = 22, - eMax0 = eAgcGal, - eLeapSeconds = 23, - eLeapSecUnc = 24, - eGloBpAmpI = 25, - eGloBpAmpQ = 26, - eBdsBpAmpI = 27, - eBdsBpAmpQ = 28, - eGalBpAmpI = 29, - eGalBpAmpQ = 30, - eMax - }; - SystemStatusPQWM1 mM1; - -public: - inline uint16_t getGpsWeek() { return mM1.mGpsWeek; } - inline uint32_t getGpsTowMs() { return mM1.mGpsTowMs; } - inline uint8_t getTimeValid() { return mM1.mTimeValid; } - inline uint8_t getTimeSource() { return mM1.mTimeSource; } - inline int32_t getTimeUnc() { return mM1.mTimeUnc; } - inline int32_t getClockFreqBias() { return mM1.mClockFreqBias; } - inline int32_t getClockFreqBiasUnc() { return mM1.mClockFreqBiasUnc; } - inline uint8_t getXoState() { return mM1.mXoState;} - inline int32_t getPgaGain() { return mM1.mPgaGain; } - inline uint32_t getGpsBpAmpI() { return mM1.mGpsBpAmpI; } - inline uint32_t getGpsBpAmpQ() { return mM1.mGpsBpAmpQ; } - inline uint32_t getAdcI() { return mM1.mAdcI; } - inline uint32_t getAdcQ() { return mM1.mAdcQ; } - inline uint32_t getJammerGps() { return mM1.mJammerGps; } - inline uint32_t getJammerGlo() { return mM1.mJammerGlo; } - inline uint32_t getJammerBds() { return mM1.mJammerBds; } - inline uint32_t getJammerGal() { return mM1.mJammerGal; } - inline uint32_t getAgcGps() { return mM1.mAgcGps; } - inline uint32_t getAgcGlo() { return mM1.mAgcGlo; } - inline uint32_t getAgcBds() { return mM1.mAgcBds; } - inline uint32_t getAgcGal() { return mM1.mAgcGal; } - inline uint32_t getRecErrorRecovery() { return mM1.mRecErrorRecovery; } - inline int32_t getLeapSeconds(){ return mM1.mLeapSeconds; } - inline int32_t getLeapSecUnc() { return mM1.mLeapSecUnc; } - inline uint32_t getGloBpAmpI() { return mM1.mGloBpAmpI; } - inline uint32_t getGloBpAmpQ() { return mM1.mGloBpAmpQ; } - inline uint32_t getBdsBpAmpI() { return mM1.mBdsBpAmpI; } - inline uint32_t getBdsBpAmpQ() { return mM1.mBdsBpAmpQ; } - inline uint32_t getGalBpAmpI() { return mM1.mGalBpAmpI; } - inline uint32_t getGalBpAmpQ() { return mM1.mGalBpAmpQ; } - - SystemStatusPQWM1parser(const char *str_in, uint32_t len_in) - : SystemStatusNmeaBase(str_in, len_in) - { - memset(&mM1, 0, sizeof(mM1)); - if (mField.size() <= eMax0) { - LOC_LOGE("PQWM1parser - invalid size=%zu", mField.size()); - mM1.mTimeValid = 0; - return; - } - mM1.mGpsWeek = atoi(mField[eGpsWeek].c_str()); - mM1.mGpsTowMs = atoi(mField[eGpsTowMs].c_str()); - mM1.mTimeValid = atoi(mField[eTimeValid].c_str()); - mM1.mTimeSource = atoi(mField[eTimeSource].c_str()); - mM1.mTimeUnc = atoi(mField[eTimeUnc].c_str()); - mM1.mClockFreqBias = atoi(mField[eClockFreqBias].c_str()); - mM1.mClockFreqBiasUnc = atoi(mField[eClockFreqBiasUnc].c_str()); - mM1.mXoState = atoi(mField[eXoState].c_str()); - mM1.mPgaGain = atoi(mField[ePgaGain].c_str()); - mM1.mGpsBpAmpI = atoi(mField[eGpsBpAmpI].c_str()); - mM1.mGpsBpAmpQ = atoi(mField[eGpsBpAmpQ].c_str()); - mM1.mAdcI = atoi(mField[eAdcI].c_str()); - mM1.mAdcQ = atoi(mField[eAdcQ].c_str()); - mM1.mJammerGps = atoi(mField[eJammerGps].c_str()); - mM1.mJammerGlo = atoi(mField[eJammerGlo].c_str()); - mM1.mJammerBds = atoi(mField[eJammerBds].c_str()); - mM1.mJammerGal = atoi(mField[eJammerGal].c_str()); - mM1.mRecErrorRecovery = atoi(mField[eRecErrorRecovery].c_str()); - mM1.mAgcGps = atof(mField[eAgcGps].c_str()); - mM1.mAgcGlo = atof(mField[eAgcGlo].c_str()); - mM1.mAgcBds = atof(mField[eAgcBds].c_str()); - mM1.mAgcGal = atof(mField[eAgcGal].c_str()); - if (mField.size() > eLeapSecUnc) { - mM1.mLeapSeconds = atoi(mField[eLeapSeconds].c_str()); - mM1.mLeapSecUnc = atoi(mField[eLeapSecUnc].c_str()); - } - if (mField.size() > eGalBpAmpQ) { - mM1.mGloBpAmpI = atoi(mField[eGloBpAmpI].c_str()); - mM1.mGloBpAmpQ = atoi(mField[eGloBpAmpQ].c_str()); - mM1.mBdsBpAmpI = atoi(mField[eBdsBpAmpI].c_str()); - mM1.mBdsBpAmpQ = atoi(mField[eBdsBpAmpQ].c_str()); - mM1.mGalBpAmpI = atoi(mField[eGalBpAmpI].c_str()); - mM1.mGalBpAmpQ = atoi(mField[eGalBpAmpQ].c_str()); - } - } - - inline SystemStatusPQWM1& get() { return mM1;} //getparser -}; - -/****************************************************************************** - SystemStatusPQWP1 -******************************************************************************/ -class SystemStatusPQWP1 -{ -public: - uint8_t mEpiValidity; // x4 - float mEpiLat; // x5 - float mEpiLon; // x6 - float mEpiAlt; // x7 - float mEpiHepe; // x8 - float mEpiAltUnc; // x9 - uint8_t mEpiSrc; // x10 -}; - -class SystemStatusPQWP1parser : public SystemStatusNmeaBase -{ -private: - enum - { - eTalker = 0, - eUtcTime = 1, - eEpiValidity = 2, - eEpiLat = 3, - eEpiLon = 4, - eEpiAlt = 5, - eEpiHepe = 6, - eEpiAltUnc = 7, - eEpiSrc = 8, - eMax - }; - SystemStatusPQWP1 mP1; - -public: - inline uint8_t getEpiValidity() { return mP1.mEpiValidity; } - inline float getEpiLat() { return mP1.mEpiLat; } - inline float getEpiLon() { return mP1.mEpiLon; } - inline float getEpiAlt() { return mP1.mEpiAlt; } - inline float getEpiHepe() { return mP1.mEpiHepe; } - inline float getEpiAltUnc() { return mP1.mEpiAltUnc; } - inline uint8_t getEpiSrc() { return mP1.mEpiSrc; } - - SystemStatusPQWP1parser(const char *str_in, uint32_t len_in) - : SystemStatusNmeaBase(str_in, len_in) - { - if (mField.size() < eMax) { - return; - } - memset(&mP1, 0, sizeof(mP1)); - mP1.mEpiValidity = strtol(mField[eEpiValidity].c_str(), NULL, 16); - mP1.mEpiLat = atof(mField[eEpiLat].c_str()); - mP1.mEpiLon = atof(mField[eEpiLon].c_str()); - mP1.mEpiAlt = atof(mField[eEpiAlt].c_str()); - mP1.mEpiHepe = atoi(mField[eEpiHepe].c_str()); - mP1.mEpiAltUnc = atof(mField[eEpiAltUnc].c_str()); - mP1.mEpiSrc = atoi(mField[eEpiSrc].c_str()); - } - - inline SystemStatusPQWP1& get() { return mP1;} -}; - -/****************************************************************************** - SystemStatusPQWP2 -******************************************************************************/ -class SystemStatusPQWP2 -{ -public: - float mBestLat; // x4 - float mBestLon; // x5 - float mBestAlt; // x6 - float mBestHepe; // x7 - float mBestAltUnc; // x8 -}; - -class SystemStatusPQWP2parser : public SystemStatusNmeaBase -{ -private: - enum - { - eTalker = 0, - eUtcTime = 1, - eBestLat = 2, - eBestLon = 3, - eBestAlt = 4, - eBestHepe = 5, - eBestAltUnc = 6, - eMax - }; - SystemStatusPQWP2 mP2; - -public: - inline float getBestLat() { return mP2.mBestLat; } - inline float getBestLon() { return mP2.mBestLon; } - inline float getBestAlt() { return mP2.mBestAlt; } - inline float getBestHepe() { return mP2.mBestHepe; } - inline float getBestAltUnc() { return mP2.mBestAltUnc; } - - SystemStatusPQWP2parser(const char *str_in, uint32_t len_in) - : SystemStatusNmeaBase(str_in, len_in) - { - if (mField.size() < eMax) { - return; - } - memset(&mP2, 0, sizeof(mP2)); - mP2.mBestLat = atof(mField[eBestLat].c_str()); - mP2.mBestLon = atof(mField[eBestLon].c_str()); - mP2.mBestAlt = atof(mField[eBestAlt].c_str()); - mP2.mBestHepe = atof(mField[eBestHepe].c_str()); - mP2.mBestAltUnc = atof(mField[eBestAltUnc].c_str()); - } - - inline SystemStatusPQWP2& get() { return mP2;} -}; - -/****************************************************************************** - SystemStatusPQWP3 -******************************************************************************/ -class SystemStatusPQWP3 -{ -public: - uint8_t mXtraValidMask; - uint32_t mGpsXtraAge; - uint32_t mGloXtraAge; - uint32_t mBdsXtraAge; - uint32_t mGalXtraAge; - uint32_t mQzssXtraAge; - uint32_t mGpsXtraValid; - uint32_t mGloXtraValid; - uint64_t mBdsXtraValid; - uint64_t mGalXtraValid; - uint8_t mQzssXtraValid; -}; - -class SystemStatusPQWP3parser : public SystemStatusNmeaBase -{ -private: - enum - { - eTalker = 0, - eUtcTime = 1, - eXtraValidMask = 2, - eGpsXtraAge = 3, - eGloXtraAge = 4, - eBdsXtraAge = 5, - eGalXtraAge = 6, - eQzssXtraAge = 7, - eGpsXtraValid = 8, - eGloXtraValid = 9, - eBdsXtraValid = 10, - eGalXtraValid = 11, - eQzssXtraValid = 12, - eMax - }; - SystemStatusPQWP3 mP3; - -public: - inline uint8_t getXtraValid() { return mP3.mXtraValidMask; } - inline uint32_t getGpsXtraAge() { return mP3.mGpsXtraAge; } - inline uint32_t getGloXtraAge() { return mP3.mGloXtraAge; } - inline uint32_t getBdsXtraAge() { return mP3.mBdsXtraAge; } - inline uint32_t getGalXtraAge() { return mP3.mGalXtraAge; } - inline uint32_t getQzssXtraAge() { return mP3.mQzssXtraAge; } - inline uint32_t getGpsXtraValid() { return mP3.mGpsXtraValid; } - inline uint32_t getGloXtraValid() { return mP3.mGloXtraValid; } - inline uint64_t getBdsXtraValid() { return mP3.mBdsXtraValid; } - inline uint64_t getGalXtraValid() { return mP3.mGalXtraValid; } - inline uint8_t getQzssXtraValid() { return mP3.mQzssXtraValid; } - - SystemStatusPQWP3parser(const char *str_in, uint32_t len_in) - : SystemStatusNmeaBase(str_in, len_in) - { - if (mField.size() < eMax) { - return; - } - memset(&mP3, 0, sizeof(mP3)); - mP3.mXtraValidMask = strtol(mField[eXtraValidMask].c_str(), NULL, 16); - mP3.mGpsXtraAge = atoi(mField[eGpsXtraAge].c_str()); - mP3.mGloXtraAge = atoi(mField[eGloXtraAge].c_str()); - mP3.mBdsXtraAge = atoi(mField[eBdsXtraAge].c_str()); - mP3.mGalXtraAge = atoi(mField[eGalXtraAge].c_str()); - mP3.mQzssXtraAge = atoi(mField[eQzssXtraAge].c_str()); - mP3.mGpsXtraValid = strtol(mField[eGpsXtraValid].c_str(), NULL, 16); - mP3.mGloXtraValid = strtol(mField[eGloXtraValid].c_str(), NULL, 16); - mP3.mBdsXtraValid = strtol(mField[eBdsXtraValid].c_str(), NULL, 16); - mP3.mGalXtraValid = strtol(mField[eGalXtraValid].c_str(), NULL, 16); - mP3.mQzssXtraValid = strtol(mField[eQzssXtraValid].c_str(), NULL, 16); - } - - inline SystemStatusPQWP3& get() { return mP3;} -}; - -/****************************************************************************** - SystemStatusPQWP4 -******************************************************************************/ -class SystemStatusPQWP4 -{ -public: - uint32_t mGpsEpheValid; - uint32_t mGloEpheValid; - uint64_t mBdsEpheValid; - uint64_t mGalEpheValid; - uint8_t mQzssEpheValid; -}; - -class SystemStatusPQWP4parser : public SystemStatusNmeaBase -{ -private: - enum - { - eTalker = 0, - eUtcTime = 1, - eGpsEpheValid = 2, - eGloEpheValid = 3, - eBdsEpheValid = 4, - eGalEpheValid = 5, - eQzssEpheValid = 6, - eMax - }; - SystemStatusPQWP4 mP4; - -public: - inline uint32_t getGpsEpheValid() { return mP4.mGpsEpheValid; } - inline uint32_t getGloEpheValid() { return mP4.mGloEpheValid; } - inline uint64_t getBdsEpheValid() { return mP4.mBdsEpheValid; } - inline uint64_t getGalEpheValid() { return mP4.mGalEpheValid; } - inline uint8_t getQzssEpheValid() { return mP4.mQzssEpheValid; } - - SystemStatusPQWP4parser(const char *str_in, uint32_t len_in) - : SystemStatusNmeaBase(str_in, len_in) - { - if (mField.size() < eMax) { - return; - } - memset(&mP4, 0, sizeof(mP4)); - mP4.mGpsEpheValid = strtol(mField[eGpsEpheValid].c_str(), NULL, 16); - mP4.mGloEpheValid = strtol(mField[eGloEpheValid].c_str(), NULL, 16); - mP4.mBdsEpheValid = strtol(mField[eBdsEpheValid].c_str(), NULL, 16); - mP4.mGalEpheValid = strtol(mField[eGalEpheValid].c_str(), NULL, 16); - mP4.mQzssEpheValid = strtol(mField[eQzssEpheValid].c_str(), NULL, 16); - } - - inline SystemStatusPQWP4& get() { return mP4;} -}; - -/****************************************************************************** - SystemStatusPQWP5 -******************************************************************************/ -class SystemStatusPQWP5 -{ -public: - uint32_t mGpsUnknownMask; - uint32_t mGloUnknownMask; - uint64_t mBdsUnknownMask; - uint64_t mGalUnknownMask; - uint8_t mQzssUnknownMask; - uint32_t mGpsGoodMask; - uint32_t mGloGoodMask; - uint64_t mBdsGoodMask; - uint64_t mGalGoodMask; - uint8_t mQzssGoodMask; - uint32_t mGpsBadMask; - uint32_t mGloBadMask; - uint64_t mBdsBadMask; - uint64_t mGalBadMask; - uint8_t mQzssBadMask; -}; - -class SystemStatusPQWP5parser : public SystemStatusNmeaBase -{ -private: - enum - { - eTalker = 0, - eUtcTime = 1, - eGpsUnknownMask = 2, - eGloUnknownMask = 3, - eBdsUnknownMask = 4, - eGalUnknownMask = 5, - eQzssUnknownMask = 6, - eGpsGoodMask = 7, - eGloGoodMask = 8, - eBdsGoodMask = 9, - eGalGoodMask = 10, - eQzssGoodMask = 11, - eGpsBadMask = 12, - eGloBadMask = 13, - eBdsBadMask = 14, - eGalBadMask = 15, - eQzssBadMask = 16, - eMax - }; - SystemStatusPQWP5 mP5; - -public: - inline uint32_t getGpsUnknownMask() { return mP5.mGpsUnknownMask; } - inline uint32_t getGloUnknownMask() { return mP5.mGloUnknownMask; } - inline uint64_t getBdsUnknownMask() { return mP5.mBdsUnknownMask; } - inline uint64_t getGalUnknownMask() { return mP5.mGalUnknownMask; } - inline uint8_t getQzssUnknownMask() { return mP5.mQzssUnknownMask; } - inline uint32_t getGpsGoodMask() { return mP5.mGpsGoodMask; } - inline uint32_t getGloGoodMask() { return mP5.mGloGoodMask; } - inline uint64_t getBdsGoodMask() { return mP5.mBdsGoodMask; } - inline uint64_t getGalGoodMask() { return mP5.mGalGoodMask; } - inline uint8_t getQzssGoodMask() { return mP5.mQzssGoodMask; } - inline uint32_t getGpsBadMask() { return mP5.mGpsBadMask; } - inline uint32_t getGloBadMask() { return mP5.mGloBadMask; } - inline uint64_t getBdsBadMask() { return mP5.mBdsBadMask; } - inline uint64_t getGalBadMask() { return mP5.mGalBadMask; } - inline uint8_t getQzssBadMask() { return mP5.mQzssBadMask; } - - SystemStatusPQWP5parser(const char *str_in, uint32_t len_in) - : SystemStatusNmeaBase(str_in, len_in) - { - if (mField.size() < eMax) { - return; - } - memset(&mP5, 0, sizeof(mP5)); - mP5.mGpsUnknownMask = strtol(mField[eGpsUnknownMask].c_str(), NULL, 16); - mP5.mGloUnknownMask = strtol(mField[eGloUnknownMask].c_str(), NULL, 16); - mP5.mBdsUnknownMask = strtol(mField[eBdsUnknownMask].c_str(), NULL, 16); - mP5.mGalUnknownMask = strtol(mField[eGalUnknownMask].c_str(), NULL, 16); - mP5.mQzssUnknownMask = strtol(mField[eQzssUnknownMask].c_str(), NULL, 16); - mP5.mGpsGoodMask = strtol(mField[eGpsGoodMask].c_str(), NULL, 16); - mP5.mGloGoodMask = strtol(mField[eGloGoodMask].c_str(), NULL, 16); - mP5.mBdsGoodMask = strtol(mField[eBdsGoodMask].c_str(), NULL, 16); - mP5.mGalGoodMask = strtol(mField[eGalGoodMask].c_str(), NULL, 16); - mP5.mQzssGoodMask = strtol(mField[eQzssGoodMask].c_str(), NULL, 16); - mP5.mGpsBadMask = strtol(mField[eGpsBadMask].c_str(), NULL, 16); - mP5.mGloBadMask = strtol(mField[eGloBadMask].c_str(), NULL, 16); - mP5.mBdsBadMask = strtol(mField[eBdsBadMask].c_str(), NULL, 16); - mP5.mGalBadMask = strtol(mField[eGalBadMask].c_str(), NULL, 16); - mP5.mQzssBadMask = strtol(mField[eQzssBadMask].c_str(), NULL, 16); - } - - inline SystemStatusPQWP5& get() { return mP5;} -}; - -/****************************************************************************** - SystemStatusPQWP6parser -******************************************************************************/ -class SystemStatusPQWP6 -{ -public: - uint32_t mFixInfoMask; -}; - -class SystemStatusPQWP6parser : public SystemStatusNmeaBase -{ -private: - enum - { - eTalker = 0, - eUtcTime = 1, - eFixInfoMask = 2, - eMax - }; - SystemStatusPQWP6 mP6; - -public: - inline uint32_t getFixInfoMask() { return mP6.mFixInfoMask; } - - SystemStatusPQWP6parser(const char *str_in, uint32_t len_in) - : SystemStatusNmeaBase(str_in, len_in) - { - if (mField.size() < eMax) { - return; - } - memset(&mP6, 0, sizeof(mP6)); - mP6.mFixInfoMask = strtol(mField[eFixInfoMask].c_str(), NULL, 16); - } - - inline SystemStatusPQWP6& get() { return mP6;} -}; - -/****************************************************************************** - SystemStatusPQWP7parser -******************************************************************************/ -class SystemStatusPQWP7 -{ -public: - SystemStatusNav mNav[SV_ALL_NUM]; -}; - -class SystemStatusPQWP7parser : public SystemStatusNmeaBase -{ -private: - enum - { - eTalker = 0, - eUtcTime = 1, - eMax = 2 + SV_ALL_NUM*3 - }; - SystemStatusPQWP7 mP7; - -public: - SystemStatusPQWP7parser(const char *str_in, uint32_t len_in) - : SystemStatusNmeaBase(str_in, len_in) - { - if (mField.size() < eMax) { - LOC_LOGE("PQWP7parser - invalid size=%zu", mField.size()); - return; - } - for (uint32_t i=0; i<SV_ALL_NUM; i++) { - mP7.mNav[i].mType = GnssEphemerisType(atoi(mField[i*3+2].c_str())); - mP7.mNav[i].mSource = GnssEphemerisSource(atoi(mField[i*3+3].c_str())); - mP7.mNav[i].mAgeSec = atoi(mField[i*3+4].c_str()); - } - } - - inline SystemStatusPQWP7& get() { return mP7;} -}; - -/****************************************************************************** - SystemStatusPQWS1parser -******************************************************************************/ -class SystemStatusPQWS1 -{ -public: - uint32_t mFixInfoMask; - uint32_t mHepeLimit; -}; - -class SystemStatusPQWS1parser : public SystemStatusNmeaBase -{ -private: - enum - { - eTalker = 0, - eUtcTime = 1, - eFixInfoMask = 2, - eHepeLimit = 3, - eMax - }; - SystemStatusPQWS1 mS1; - -public: - inline uint16_t getFixInfoMask() { return mS1.mFixInfoMask; } - inline uint32_t getHepeLimit() { return mS1.mHepeLimit; } - - SystemStatusPQWS1parser(const char *str_in, uint32_t len_in) - : SystemStatusNmeaBase(str_in, len_in) - { - if (mField.size() < eMax) { - return; - } - memset(&mS1, 0, sizeof(mS1)); - mS1.mFixInfoMask = atoi(mField[eFixInfoMask].c_str()); - mS1.mHepeLimit = atoi(mField[eHepeLimit].c_str()); - } - - inline SystemStatusPQWS1& get() { return mS1;} -}; - -/****************************************************************************** - SystemStatusTimeAndClock -******************************************************************************/ -SystemStatusTimeAndClock::SystemStatusTimeAndClock(const SystemStatusPQWM1& nmea) : - mGpsWeek(nmea.mGpsWeek), - mGpsTowMs(nmea.mGpsTowMs), - mTimeValid(nmea.mTimeValid), - mTimeSource(nmea.mTimeSource), - mTimeUnc(nmea.mTimeUnc), - mClockFreqBias(nmea.mClockFreqBias), - mClockFreqBiasUnc(nmea.mClockFreqBiasUnc), - mLeapSeconds(nmea.mLeapSeconds), - mLeapSecUnc(nmea.mLeapSecUnc) -{ -} - -bool SystemStatusTimeAndClock::equals(const SystemStatusTimeAndClock& peer) -{ - if ((mGpsWeek != peer.mGpsWeek) || - (mGpsTowMs != peer.mGpsTowMs) || - (mTimeValid != peer.mTimeValid) || - (mTimeSource != peer.mTimeSource) || - (mTimeUnc != peer.mTimeUnc) || - (mClockFreqBias != peer.mClockFreqBias) || - (mClockFreqBiasUnc != peer.mClockFreqBiasUnc) || - (mLeapSeconds != peer.mLeapSeconds) || - (mLeapSecUnc != peer.mLeapSecUnc)) { - return false; - } - return true; -} - -void SystemStatusTimeAndClock::dump() -{ - LOC_LOGV("TimeAndClock: u=%ld:%ld g=%d:%d v=%d ts=%d tu=%d b=%d bu=%d ls=%d lu=%d", - mUtcTime.tv_sec, mUtcTime.tv_nsec, - mGpsWeek, - mGpsTowMs, - mTimeValid, - mTimeSource, - mTimeUnc, - mClockFreqBias, - mClockFreqBiasUnc, - mLeapSeconds, - mLeapSecUnc); - return; -} - -/****************************************************************************** - SystemStatusXoState -******************************************************************************/ -SystemStatusXoState::SystemStatusXoState(const SystemStatusPQWM1& nmea) : - mXoState(nmea.mXoState) -{ -} - -bool SystemStatusXoState::equals(const SystemStatusXoState& peer) -{ - if (mXoState != peer.mXoState) { - return false; - } - return true; -} - -void SystemStatusXoState::dump() -{ - LOC_LOGV("XoState: u=%ld:%ld x=%d", - mUtcTime.tv_sec, mUtcTime.tv_nsec, - mXoState); - return; -} - -/****************************************************************************** - SystemStatusRfAndParams -******************************************************************************/ -SystemStatusRfAndParams::SystemStatusRfAndParams(const SystemStatusPQWM1& nmea) : - mPgaGain(nmea.mPgaGain), - mGpsBpAmpI(nmea.mGpsBpAmpI), - mGpsBpAmpQ(nmea.mGpsBpAmpQ), - mAdcI(nmea.mAdcI), - mAdcQ(nmea.mAdcQ), - mJammerGps(nmea.mJammerGps), - mJammerGlo(nmea.mJammerGlo), - mJammerBds(nmea.mJammerBds), - mJammerGal(nmea.mJammerGal), - mAgcGps(nmea.mAgcGps), - mAgcGlo(nmea.mAgcGlo), - mAgcBds(nmea.mAgcBds), - mAgcGal(nmea.mAgcGal), - mGloBpAmpI(nmea.mGloBpAmpI), - mGloBpAmpQ(nmea.mGloBpAmpQ), - mBdsBpAmpI(nmea.mBdsBpAmpI), - mBdsBpAmpQ(nmea.mBdsBpAmpQ), - mGalBpAmpI(nmea.mGalBpAmpI), - mGalBpAmpQ(nmea.mGalBpAmpQ) -{ -} - -bool SystemStatusRfAndParams::equals(const SystemStatusRfAndParams& peer) -{ - if ((mPgaGain != peer.mPgaGain) || - (mGpsBpAmpI != peer.mGpsBpAmpI) || - (mGpsBpAmpQ != peer.mGpsBpAmpQ) || - (mAdcI != peer.mAdcI) || - (mAdcQ != peer.mAdcQ) || - (mJammerGps != peer.mJammerGps) || - (mJammerGlo != peer.mJammerGlo) || - (mJammerBds != peer.mJammerBds) || - (mJammerGal != peer.mJammerGal) || - (mAgcGps != peer.mAgcGps) || - (mAgcGlo != peer.mAgcGlo) || - (mAgcBds != peer.mAgcBds) || - (mAgcGal != peer.mAgcGal) || - (mGloBpAmpI != peer.mGloBpAmpI) || - (mGloBpAmpQ != peer.mGloBpAmpQ) || - (mBdsBpAmpI != peer.mBdsBpAmpI) || - (mBdsBpAmpQ != peer.mBdsBpAmpQ) || - (mGalBpAmpI != peer.mGalBpAmpI) || - (mGalBpAmpQ != peer.mGalBpAmpQ)) { - return false; - } - return true; -} - -void SystemStatusRfAndParams::dump() -{ - LOC_LOGV("RfAndParams: u=%ld:%ld p=%d bi=%d bq=%d ai=%d aq=%d " - "jgp=%d jgl=%d jbd=%d jga=%d " - "agp=%lf agl=%lf abd=%lf aga=%lf", - mUtcTime.tv_sec, mUtcTime.tv_nsec, - mPgaGain, - mGpsBpAmpI, - mGpsBpAmpQ, - mAdcI, - mAdcQ, - mJammerGps, - mJammerGlo, - mJammerBds, - mJammerGal, - mAgcGps, - mAgcGlo, - mAgcBds, - mAgcGal); - return; -} - -/****************************************************************************** - SystemStatusErrRecovery -******************************************************************************/ -SystemStatusErrRecovery::SystemStatusErrRecovery(const SystemStatusPQWM1& nmea) : - mRecErrorRecovery(nmea.mRecErrorRecovery) -{ -} - -bool SystemStatusErrRecovery::equals(const SystemStatusErrRecovery& peer) -{ - if (mRecErrorRecovery != peer.mRecErrorRecovery) { - return false; - } - return true; -} - -void SystemStatusErrRecovery::dump() -{ - LOC_LOGV("ErrRecovery: u=%ld:%ld e=%d", - mUtcTime.tv_sec, mUtcTime.tv_nsec, - mRecErrorRecovery); - return; -} - -/****************************************************************************** - SystemStatusInjectedPosition -******************************************************************************/ -SystemStatusInjectedPosition::SystemStatusInjectedPosition(const SystemStatusPQWP1& nmea) : - mEpiValidity(nmea.mEpiValidity), - mEpiLat(nmea.mEpiLat), - mEpiLon(nmea.mEpiLon), - mEpiAlt(nmea.mEpiAlt), - mEpiHepe(nmea.mEpiHepe), - mEpiAltUnc(nmea.mEpiAltUnc), - mEpiSrc(nmea.mEpiSrc) -{ -} - -bool SystemStatusInjectedPosition::equals(const SystemStatusInjectedPosition& peer) -{ - if ((mEpiValidity != peer.mEpiValidity) || - (mEpiLat != peer.mEpiLat) || - (mEpiLon != peer.mEpiLon) || - (mEpiAlt != peer.mEpiAlt) || - (mEpiHepe != peer.mEpiHepe) || - (mEpiAltUnc != peer.mEpiAltUnc) || - (mEpiSrc != peer.mEpiSrc)) { - return false; - } - return true; -} - -void SystemStatusInjectedPosition::dump() -{ - LOC_LOGV("InjectedPosition: u=%ld:%ld v=%x la=%f lo=%f al=%f he=%f au=%f es=%d", - mUtcTime.tv_sec, mUtcTime.tv_nsec, - mEpiValidity, - mEpiLat, - mEpiLon, - mEpiAlt, - mEpiHepe, - mEpiAltUnc, - mEpiSrc); - return; -} - -/****************************************************************************** - SystemStatusBestPosition -******************************************************************************/ -SystemStatusBestPosition::SystemStatusBestPosition(const SystemStatusPQWP2& nmea) : - mValid(true), - mBestLat(nmea.mBestLat), - mBestLon(nmea.mBestLon), - mBestAlt(nmea.mBestAlt), - mBestHepe(nmea.mBestHepe), - mBestAltUnc(nmea.mBestAltUnc) -{ -} - -bool SystemStatusBestPosition::equals(const SystemStatusBestPosition& peer) -{ - if ((mBestLat != peer.mBestLat) || - (mBestLon != peer.mBestLon) || - (mBestAlt != peer.mBestAlt) || - (mBestHepe != peer.mBestHepe) || - (mBestAltUnc != peer.mBestAltUnc)) { - return false; - } - return true; -} - -void SystemStatusBestPosition::dump() -{ - LOC_LOGV("BestPosition: u=%ld:%ld la=%f lo=%f al=%f he=%f au=%f", - mUtcTime.tv_sec, mUtcTime.tv_nsec, - mBestLat, - mBestLon, - mBestAlt, - mBestHepe, - mBestAltUnc); - return; -} - -/****************************************************************************** - SystemStatusXtra -******************************************************************************/ -SystemStatusXtra::SystemStatusXtra(const SystemStatusPQWP3& nmea) : - mXtraValidMask(nmea.mXtraValidMask), - mGpsXtraAge(nmea.mGpsXtraAge), - mGloXtraAge(nmea.mGloXtraAge), - mBdsXtraAge(nmea.mBdsXtraAge), - mGalXtraAge(nmea.mGalXtraAge), - mQzssXtraAge(nmea.mQzssXtraAge), - mGpsXtraValid(nmea.mGpsXtraValid), - mGloXtraValid(nmea.mGloXtraValid), - mBdsXtraValid(nmea.mBdsXtraValid), - mGalXtraValid(nmea.mGalXtraValid), - mQzssXtraValid(nmea.mQzssXtraValid) -{ -} - -bool SystemStatusXtra::equals(const SystemStatusXtra& peer) -{ - if ((mXtraValidMask != peer.mXtraValidMask) || - (mGpsXtraAge != peer.mGpsXtraAge) || - (mGloXtraAge != peer.mGloXtraAge) || - (mBdsXtraAge != peer.mBdsXtraAge) || - (mGalXtraAge != peer.mGalXtraAge) || - (mQzssXtraAge != peer.mQzssXtraAge) || - (mGpsXtraValid != peer.mGpsXtraValid) || - (mGloXtraValid != peer.mGloXtraValid) || - (mBdsXtraValid != peer.mBdsXtraValid) || - (mGalXtraValid != peer.mGalXtraValid) || - (mQzssXtraValid != peer.mQzssXtraValid)) { - return false; - } - return true; -} - -void SystemStatusXtra::dump() -{ - LOC_LOGV("SystemStatusXtra: u=%ld:%ld m=%x a=%d:%d:%d:%d:%d v=%x:%x:%" PRIx64 ":%" PRIx64":%x", - mUtcTime.tv_sec, mUtcTime.tv_nsec, - mXtraValidMask, - mGpsXtraAge, - mGloXtraAge, - mBdsXtraAge, - mGalXtraAge, - mQzssXtraAge, - mGpsXtraValid, - mGloXtraValid, - mBdsXtraValid, - mGalXtraValid, - mQzssXtraValid); - return; -} - -/****************************************************************************** - SystemStatusEphemeris -******************************************************************************/ -SystemStatusEphemeris::SystemStatusEphemeris(const SystemStatusPQWP4& nmea) : - mGpsEpheValid(nmea.mGpsEpheValid), - mGloEpheValid(nmea.mGloEpheValid), - mBdsEpheValid(nmea.mBdsEpheValid), - mGalEpheValid(nmea.mGalEpheValid), - mQzssEpheValid(nmea.mQzssEpheValid) -{ -} - -bool SystemStatusEphemeris::equals(const SystemStatusEphemeris& peer) -{ - if ((mGpsEpheValid != peer.mGpsEpheValid) || - (mGloEpheValid != peer.mGloEpheValid) || - (mBdsEpheValid != peer.mBdsEpheValid) || - (mGalEpheValid != peer.mGalEpheValid) || - (mQzssEpheValid != peer.mQzssEpheValid)) { - return false; - } - return true; -} - -void SystemStatusEphemeris::dump() -{ - LOC_LOGV("Ephemeris: u=%ld:%ld ev=%x:%x:%" PRIx64 ":%" PRIx64 ":%x", - mUtcTime.tv_sec, mUtcTime.tv_nsec, - mGpsEpheValid, - mGloEpheValid, - mBdsEpheValid, - mGalEpheValid, - mQzssEpheValid); - return; -} - -/****************************************************************************** - SystemStatusSvHealth -******************************************************************************/ -SystemStatusSvHealth::SystemStatusSvHealth(const SystemStatusPQWP5& nmea) : - mGpsUnknownMask(nmea.mGpsUnknownMask), - mGloUnknownMask(nmea.mGloUnknownMask), - mBdsUnknownMask(nmea.mBdsUnknownMask), - mGalUnknownMask(nmea.mGalUnknownMask), - mQzssUnknownMask(nmea.mQzssUnknownMask), - mGpsGoodMask(nmea.mGpsGoodMask), - mGloGoodMask(nmea.mGloGoodMask), - mBdsGoodMask(nmea.mBdsGoodMask), - mGalGoodMask(nmea.mGalGoodMask), - mQzssGoodMask(nmea.mQzssGoodMask), - mGpsBadMask(nmea.mGpsBadMask), - mGloBadMask(nmea.mGloBadMask), - mBdsBadMask(nmea.mBdsBadMask), - mGalBadMask(nmea.mGalBadMask), - mQzssBadMask(nmea.mQzssBadMask) -{ -} - -bool SystemStatusSvHealth::equals(const SystemStatusSvHealth& peer) -{ - if ((mGpsUnknownMask != peer.mGpsUnknownMask) || - (mGloUnknownMask != peer.mGloUnknownMask) || - (mBdsUnknownMask != peer.mBdsUnknownMask) || - (mGalUnknownMask != peer.mGalUnknownMask) || - (mQzssUnknownMask != peer.mQzssUnknownMask) || - (mGpsGoodMask != peer.mGpsGoodMask) || - (mGloGoodMask != peer.mGloGoodMask) || - (mBdsGoodMask != peer.mBdsGoodMask) || - (mGalGoodMask != peer.mGalGoodMask) || - (mQzssGoodMask != peer.mQzssGoodMask) || - (mGpsBadMask != peer.mGpsBadMask) || - (mGloBadMask != peer.mGloBadMask) || - (mBdsBadMask != peer.mBdsBadMask) || - (mGalBadMask != peer.mGalBadMask) || - (mQzssBadMask != peer.mQzssBadMask)) { - return false; - } - return true; -} - -void SystemStatusSvHealth::dump() -{ - LOC_LOGV("SvHealth: u=%ld:%ld \ - u=%x:%x:%" PRIx64 ":%" PRIx64 ":%x \ - g=%x:%x:%" PRIx64 ":%" PRIx64 ":%x \ - b=%x:%x:%" PRIx64 ":%" PRIx64 ":%x", - mUtcTime.tv_sec, mUtcTime.tv_nsec, - mGpsUnknownMask, - mGloUnknownMask, - mBdsUnknownMask, - mGalUnknownMask, - mQzssUnknownMask, - mGpsGoodMask, - mGloGoodMask, - mBdsGoodMask, - mGalGoodMask, - mQzssGoodMask, - mGpsBadMask, - mGloBadMask, - mBdsBadMask, - mGalBadMask, - mQzssBadMask); - return; -} - -/****************************************************************************** - SystemStatusPdr -******************************************************************************/ -SystemStatusPdr::SystemStatusPdr(const SystemStatusPQWP6& nmea) : - mFixInfoMask(nmea.mFixInfoMask) -{ -} - -bool SystemStatusPdr::equals(const SystemStatusPdr& peer) -{ - if (mFixInfoMask != peer.mFixInfoMask) { - return false; - } - return true; -} - -void SystemStatusPdr::dump() -{ - LOC_LOGV("Pdr: u=%ld:%ld m=%x", - mUtcTime.tv_sec, mUtcTime.tv_nsec, - mFixInfoMask); - return; -} - -/****************************************************************************** - SystemStatusNavData -******************************************************************************/ -SystemStatusNavData::SystemStatusNavData(const SystemStatusPQWP7& nmea) -{ - for (uint32_t i=0; i<SV_ALL_NUM; i++) { - mNav[i] = nmea.mNav[i]; - } -} - -bool SystemStatusNavData::equals(const SystemStatusNavData& peer) -{ - for (uint32_t i=0; i<SV_ALL_NUM; i++) { - if ((mNav[i].mType != peer.mNav[i].mType) || - (mNav[i].mSource != peer.mNav[i].mSource) || - (mNav[i].mAgeSec != peer.mNav[i].mAgeSec)) { - return false; - } - } - return true; -} - -void SystemStatusNavData::dump() -{ - LOC_LOGV("NavData: u=%ld:%ld", - mUtcTime.tv_sec, mUtcTime.tv_nsec); - for (uint32_t i=0; i<SV_ALL_NUM; i++) { - LOC_LOGV("i=%d type=%d src=%d age=%d", - i, mNav[i].mType, mNav[i].mSource, mNav[i].mAgeSec); - } - return; -} - -/****************************************************************************** - SystemStatusPositionFailure -******************************************************************************/ -SystemStatusPositionFailure::SystemStatusPositionFailure(const SystemStatusPQWS1& nmea) : - mFixInfoMask(nmea.mFixInfoMask), - mHepeLimit(nmea.mHepeLimit) -{ -} - -bool SystemStatusPositionFailure::equals(const SystemStatusPositionFailure& peer) -{ - if ((mFixInfoMask != peer.mFixInfoMask) || - (mHepeLimit != peer.mHepeLimit)) { - return false; - } - return true; -} - -void SystemStatusPositionFailure::dump() -{ - LOC_LOGV("PositionFailure: u=%ld:%ld m=%d h=%d", - mUtcTime.tv_sec, mUtcTime.tv_nsec, - mFixInfoMask, - mHepeLimit); - return; -} - -/****************************************************************************** - SystemStatusLocation -******************************************************************************/ -bool SystemStatusLocation::equals(const SystemStatusLocation& peer) -{ - if ((mLocation.gpsLocation.latitude != peer.mLocation.gpsLocation.latitude) || - (mLocation.gpsLocation.longitude != peer.mLocation.gpsLocation.longitude) || - (mLocation.gpsLocation.altitude != peer.mLocation.gpsLocation.altitude)) { - return false; - } - return true; -} - -void SystemStatusLocation::dump() -{ - LOC_LOGV("Location: lat=%f lon=%f alt=%f spd=%f", - mLocation.gpsLocation.latitude, - mLocation.gpsLocation.longitude, - mLocation.gpsLocation.altitude, - mLocation.gpsLocation.speed); - return; -} - -/****************************************************************************** - SystemStatus -******************************************************************************/ -pthread_mutex_t SystemStatus::mMutexSystemStatus = PTHREAD_MUTEX_INITIALIZER; -SystemStatus* SystemStatus::mInstance = NULL; - -SystemStatus* SystemStatus::getInstance(const MsgTask* msgTask) -{ - pthread_mutex_lock(&mMutexSystemStatus); - - if (!mInstance) { - // Instantiating for the first time. msgTask should not be NULL - if (msgTask == NULL) { - LOC_LOGE("SystemStatus: msgTask is NULL!!"); - pthread_mutex_unlock(&mMutexSystemStatus); - return NULL; - } - mInstance = new (nothrow) SystemStatus(msgTask); - LOC_LOGD("SystemStatus::getInstance:%p. Msgtask:%p", mInstance, msgTask); - } - - pthread_mutex_unlock(&mMutexSystemStatus); - return mInstance; -} - -void SystemStatus::destroyInstance() -{ - delete mInstance; - mInstance = NULL; -} - -IOsObserver* SystemStatus::getOsObserver() -{ - return &mSysStatusObsvr; -} - -SystemStatus::SystemStatus(const MsgTask* msgTask) : - mSysStatusObsvr(this, msgTask) -{ - int result = 0; - ENTRY_LOG (); - mCache.mLocation.clear(); - - mCache.mTimeAndClock.clear(); - mCache.mXoState.clear(); - mCache.mRfAndParams.clear(); - mCache.mErrRecovery.clear(); - - mCache.mInjectedPosition.clear(); - mCache.mBestPosition.clear(); - mCache.mXtra.clear(); - mCache.mEphemeris.clear(); - mCache.mSvHealth.clear(); - mCache.mPdr.clear(); - mCache.mNavData.clear(); - - mCache.mPositionFailure.clear(); - - mCache.mAirplaneMode.clear(); - mCache.mENH.clear(); - mCache.mGPSState.clear(); - mCache.mNLPStatus.clear(); - mCache.mWifiHardwareState.clear(); - mCache.mNetworkInfo.clear(); - mCache.mRilServiceInfo.clear(); - mCache.mRilCellInfo.clear(); - mCache.mServiceStatus.clear(); - mCache.mModel.clear(); - mCache.mManufacturer.clear(); - mCache.mAssistedGps.clear(); - mCache.mScreenState.clear(); - mCache.mPowerConnectState.clear(); - mCache.mTimeZoneChange.clear(); - mCache.mTimeChange.clear(); - mCache.mWifiSupplicantStatus.clear(); - mCache.mShutdownState.clear(); - mCache.mTac.clear(); - mCache.mMccMnc.clear(); - mCache.mBtDeviceScanDetail.clear(); - mCache.mBtLeDeviceScanDetail.clear(); - - EXIT_LOG_WITH_ERROR ("%d",result); -} - -/****************************************************************************** - SystemStatus - storing dataitems -******************************************************************************/ -template <typename TYPE_REPORT, typename TYPE_ITEM> -bool SystemStatus::setIteminReport(TYPE_REPORT& report, TYPE_ITEM&& s) -{ - if (!report.empty() && report.back().equals(static_cast<TYPE_ITEM&>(s.collate(report.back())))) { - // there is no change - just update reported timestamp - report.back().mUtcReported = s.mUtcReported; - return false; - } - - // first event or updated - report.push_back(s); - if (report.size() > s.maxItem) { - report.erase(report.begin()); - } - return true; -} - -template <typename TYPE_REPORT, typename TYPE_ITEM> -void SystemStatus::setDefaultIteminReport(TYPE_REPORT& report, const TYPE_ITEM& s) -{ - report.push_back(s); - if (report.size() > s.maxItem) { - report.erase(report.begin()); - } -} - -template <typename TYPE_REPORT, typename TYPE_ITEM> -void SystemStatus::getIteminReport(TYPE_REPORT& reportout, const TYPE_ITEM& c) const -{ - reportout.clear(); - if (c.size() >= 1) { - reportout.push_back(c.back()); - reportout.back().dump(); - } -} - -/****************************************************************************** -@brief API to set report data into internal buffer - -@param[In] data pointer to the NMEA string -@param[In] len length of the NMEA string - -@return true when the NMEA is consumed by the method. -******************************************************************************/ -bool SystemStatus::setNmeaString(const char *data, uint32_t len) -{ - if (!loc_nmea_is_debug(data, len)) { - return false; - } - - char buf[SystemStatusNmeaBase::NMEA_MAXSIZE + 1] = { 0 }; - strlcpy(buf, data, sizeof(buf)); - - pthread_mutex_lock(&mMutexSystemStatus); - - // parse the received nmea strings here - if (0 == strncmp(data, "$PQWM1", SystemStatusNmeaBase::NMEA_MINSIZE)) { - SystemStatusPQWM1 s = SystemStatusPQWM1parser(buf, len).get(); - setIteminReport(mCache.mTimeAndClock, SystemStatusTimeAndClock(s)); - setIteminReport(mCache.mXoState, SystemStatusXoState(s)); - setIteminReport(mCache.mRfAndParams, SystemStatusRfAndParams(s)); - setIteminReport(mCache.mErrRecovery, SystemStatusErrRecovery(s)); - } - else if (0 == strncmp(data, "$PQWP1", SystemStatusNmeaBase::NMEA_MINSIZE)) { - setIteminReport(mCache.mInjectedPosition, - SystemStatusInjectedPosition(SystemStatusPQWP1parser(buf, len).get())); - } - else if (0 == strncmp(data, "$PQWP2", SystemStatusNmeaBase::NMEA_MINSIZE)) { - setIteminReport(mCache.mBestPosition, - SystemStatusBestPosition(SystemStatusPQWP2parser(buf, len).get())); - } - else if (0 == strncmp(data, "$PQWP3", SystemStatusNmeaBase::NMEA_MINSIZE)) { - setIteminReport(mCache.mXtra, - SystemStatusXtra(SystemStatusPQWP3parser(buf, len).get())); - } - else if (0 == strncmp(data, "$PQWP4", SystemStatusNmeaBase::NMEA_MINSIZE)) { - setIteminReport(mCache.mEphemeris, - SystemStatusEphemeris(SystemStatusPQWP4parser(buf, len).get())); - } - else if (0 == strncmp(data, "$PQWP5", SystemStatusNmeaBase::NMEA_MINSIZE)) { - setIteminReport(mCache.mSvHealth, - SystemStatusSvHealth(SystemStatusPQWP5parser(buf, len).get())); - } - else if (0 == strncmp(data, "$PQWP6", SystemStatusNmeaBase::NMEA_MINSIZE)) { - setIteminReport(mCache.mPdr, - SystemStatusPdr(SystemStatusPQWP6parser(buf, len).get())); - } - else if (0 == strncmp(data, "$PQWP7", SystemStatusNmeaBase::NMEA_MINSIZE)) { - setIteminReport(mCache.mNavData, - SystemStatusNavData(SystemStatusPQWP7parser(buf, len).get())); - } - else if (0 == strncmp(data, "$PQWS1", SystemStatusNmeaBase::NMEA_MINSIZE)) { - setIteminReport(mCache.mPositionFailure, - SystemStatusPositionFailure(SystemStatusPQWS1parser(buf, len).get())); - } - else { - // do nothing - } - - pthread_mutex_unlock(&mMutexSystemStatus); - return true; -} - -/****************************************************************************** -@brief API to set report position data into internal buffer - -@param[In] UlpLocation - -@return true when successfully done -******************************************************************************/ -bool SystemStatus::eventPosition(const UlpLocation& location, - const GpsLocationExtended& locationEx) -{ - bool ret = false; - pthread_mutex_lock(&mMutexSystemStatus); - - ret = setIteminReport(mCache.mLocation, SystemStatusLocation(location, locationEx)); - LOC_LOGV("eventPosition - lat=%f lon=%f alt=%f speed=%f", - location.gpsLocation.latitude, - location.gpsLocation.longitude, - location.gpsLocation.altitude, - location.gpsLocation.speed); - - pthread_mutex_unlock(&mMutexSystemStatus); - return ret; -} - -/****************************************************************************** -@brief API to set report DataItem event into internal buffer - -@param[In] DataItem - -@return true when info is updatated -******************************************************************************/ -bool SystemStatus::eventDataItemNotify(IDataItemCore* dataitem) -{ - bool ret = false; - pthread_mutex_lock(&mMutexSystemStatus); - switch(dataitem->getId()) - { - case AIRPLANEMODE_DATA_ITEM_ID: - ret = setIteminReport(mCache.mAirplaneMode, - SystemStatusAirplaneMode(*(static_cast<AirplaneModeDataItemBase*>(dataitem)))); - break; - case ENH_DATA_ITEM_ID: - ret = setIteminReport(mCache.mENH, - SystemStatusENH(*(static_cast<ENHDataItemBase*>(dataitem)))); - break; - case GPSSTATE_DATA_ITEM_ID: - ret = setIteminReport(mCache.mGPSState, - SystemStatusGpsState(*(static_cast<GPSStateDataItemBase*>(dataitem)))); - break; - case NLPSTATUS_DATA_ITEM_ID: - ret = setIteminReport(mCache.mNLPStatus, - SystemStatusNLPStatus(*(static_cast<NLPStatusDataItemBase*>(dataitem)))); - break; - case WIFIHARDWARESTATE_DATA_ITEM_ID: - ret = setIteminReport(mCache.mWifiHardwareState, - SystemStatusWifiHardwareState(*(static_cast<WifiHardwareStateDataItemBase*>(dataitem)))); - break; - case NETWORKINFO_DATA_ITEM_ID: - ret = setIteminReport(mCache.mNetworkInfo, - SystemStatusNetworkInfo(*(static_cast<NetworkInfoDataItemBase*>(dataitem)))); - break; - case RILSERVICEINFO_DATA_ITEM_ID: - ret = setIteminReport(mCache.mRilServiceInfo, - SystemStatusServiceInfo(*(static_cast<RilServiceInfoDataItemBase*>(dataitem)))); - break; - case RILCELLINFO_DATA_ITEM_ID: - ret = setIteminReport(mCache.mRilCellInfo, - SystemStatusRilCellInfo(*(static_cast<RilCellInfoDataItemBase*>(dataitem)))); - break; - case SERVICESTATUS_DATA_ITEM_ID: - ret = setIteminReport(mCache.mServiceStatus, - SystemStatusServiceStatus(*(static_cast<ServiceStatusDataItemBase*>(dataitem)))); - break; - case MODEL_DATA_ITEM_ID: - ret = setIteminReport(mCache.mModel, - SystemStatusModel(*(static_cast<ModelDataItemBase*>(dataitem)))); - break; - case MANUFACTURER_DATA_ITEM_ID: - ret = setIteminReport(mCache.mManufacturer, - SystemStatusManufacturer(*(static_cast<ManufacturerDataItemBase*>(dataitem)))); - break; - case ASSISTED_GPS_DATA_ITEM_ID: - ret = setIteminReport(mCache.mAssistedGps, - SystemStatusAssistedGps(*(static_cast<AssistedGpsDataItemBase*>(dataitem)))); - break; - case SCREEN_STATE_DATA_ITEM_ID: - ret = setIteminReport(mCache.mScreenState, - SystemStatusScreenState(*(static_cast<ScreenStateDataItemBase*>(dataitem)))); - break; - case POWER_CONNECTED_STATE_DATA_ITEM_ID: - ret = setIteminReport(mCache.mPowerConnectState, - SystemStatusPowerConnectState(*(static_cast<PowerConnectStateDataItemBase*>(dataitem)))); - break; - case TIMEZONE_CHANGE_DATA_ITEM_ID: - ret = setIteminReport(mCache.mTimeZoneChange, - SystemStatusTimeZoneChange(*(static_cast<TimeZoneChangeDataItemBase*>(dataitem)))); - break; - case TIME_CHANGE_DATA_ITEM_ID: - ret = setIteminReport(mCache.mTimeChange, - SystemStatusTimeChange(*(static_cast<TimeChangeDataItemBase*>(dataitem)))); - break; - case WIFI_SUPPLICANT_STATUS_DATA_ITEM_ID: - ret = setIteminReport(mCache.mWifiSupplicantStatus, - SystemStatusWifiSupplicantStatus(*(static_cast<WifiSupplicantStatusDataItemBase*>(dataitem)))); - break; - case SHUTDOWN_STATE_DATA_ITEM_ID: - ret = setIteminReport(mCache.mShutdownState, - SystemStatusShutdownState(*(static_cast<ShutdownStateDataItemBase*>(dataitem)))); - break; - case TAC_DATA_ITEM_ID: - ret = setIteminReport(mCache.mTac, - SystemStatusTac(*(static_cast<TacDataItemBase*>(dataitem)))); - break; - case MCCMNC_DATA_ITEM_ID: - ret = setIteminReport(mCache.mMccMnc, - SystemStatusMccMnc(*(static_cast<MccmncDataItemBase*>(dataitem)))); - break; - case BTLE_SCAN_DATA_ITEM_ID: - ret = setIteminReport(mCache.mBtDeviceScanDetail, - SystemStatusBtDeviceScanDetail(*(static_cast<BtDeviceScanDetailsDataItemBase*>(dataitem)))); - break; - case BT_SCAN_DATA_ITEM_ID: - ret = setIteminReport(mCache.mBtLeDeviceScanDetail, - SystemStatusBtleDeviceScanDetail(*(static_cast<BtLeDeviceScanDetailsDataItemBase*>(dataitem)))); - break; - default: - break; - } - pthread_mutex_unlock(&mMutexSystemStatus); - return ret; -} - -/****************************************************************************** -@brief API to get report data into a given buffer - -@param[In] reference to report buffer -@param[In] bool flag to identify latest only or entire buffer - -@return true when successfully done -******************************************************************************/ -bool SystemStatus::getReport(SystemStatusReports& report, bool isLatestOnly) const -{ - pthread_mutex_lock(&mMutexSystemStatus); - - if (isLatestOnly) { - // push back only the latest report and return it - getIteminReport(report.mLocation, mCache.mLocation); - - getIteminReport(report.mTimeAndClock, mCache.mTimeAndClock); - getIteminReport(report.mXoState, mCache.mXoState); - getIteminReport(report.mRfAndParams, mCache.mRfAndParams); - getIteminReport(report.mErrRecovery, mCache.mErrRecovery); - - getIteminReport(report.mInjectedPosition, mCache.mInjectedPosition); - getIteminReport(report.mBestPosition, mCache.mBestPosition); - getIteminReport(report.mXtra, mCache.mXtra); - getIteminReport(report.mEphemeris, mCache.mEphemeris); - getIteminReport(report.mSvHealth, mCache.mSvHealth); - getIteminReport(report.mPdr, mCache.mPdr); - getIteminReport(report.mNavData, mCache.mNavData); - - getIteminReport(report.mPositionFailure, mCache.mPositionFailure); - - getIteminReport(report.mAirplaneMode, mCache.mAirplaneMode); - getIteminReport(report.mENH, mCache.mENH); - getIteminReport(report.mGPSState, mCache.mGPSState); - getIteminReport(report.mNLPStatus, mCache.mNLPStatus); - getIteminReport(report.mWifiHardwareState, mCache.mWifiHardwareState); - getIteminReport(report.mNetworkInfo, mCache.mNetworkInfo); - getIteminReport(report.mRilServiceInfo, mCache.mRilServiceInfo); - getIteminReport(report.mRilCellInfo, mCache.mRilCellInfo); - getIteminReport(report.mServiceStatus, mCache.mServiceStatus); - getIteminReport(report.mModel, mCache.mModel); - getIteminReport(report.mManufacturer, mCache.mManufacturer); - getIteminReport(report.mAssistedGps, mCache.mAssistedGps); - getIteminReport(report.mScreenState, mCache.mScreenState); - getIteminReport(report.mPowerConnectState, mCache.mPowerConnectState); - getIteminReport(report.mTimeZoneChange, mCache.mTimeZoneChange); - getIteminReport(report.mTimeChange, mCache.mTimeChange); - getIteminReport(report.mWifiSupplicantStatus, mCache.mWifiSupplicantStatus); - getIteminReport(report.mShutdownState, mCache.mShutdownState); - getIteminReport(report.mTac, mCache.mTac); - getIteminReport(report.mMccMnc, mCache.mMccMnc); - getIteminReport(report.mBtDeviceScanDetail, mCache.mBtDeviceScanDetail); - getIteminReport(report.mBtLeDeviceScanDetail, mCache.mBtLeDeviceScanDetail); - } - else { - // copy entire reports and return them - report.mLocation.clear(); - - report.mTimeAndClock.clear(); - report.mXoState.clear(); - report.mRfAndParams.clear(); - report.mErrRecovery.clear(); - - report.mInjectedPosition.clear(); - report.mBestPosition.clear(); - report.mXtra.clear(); - report.mEphemeris.clear(); - report.mSvHealth.clear(); - report.mPdr.clear(); - report.mNavData.clear(); - - report.mPositionFailure.clear(); - - report.mAirplaneMode.clear(); - report.mENH.clear(); - report.mGPSState.clear(); - report.mNLPStatus.clear(); - report.mWifiHardwareState.clear(); - report.mNetworkInfo.clear(); - report.mRilServiceInfo.clear(); - report.mRilCellInfo.clear(); - report.mServiceStatus.clear(); - report.mModel.clear(); - report.mManufacturer.clear(); - report.mAssistedGps.clear(); - report.mScreenState.clear(); - report.mPowerConnectState.clear(); - report.mTimeZoneChange.clear(); - report.mTimeChange.clear(); - report.mWifiSupplicantStatus.clear(); - report.mShutdownState.clear(); - report.mTac.clear(); - report.mMccMnc.clear(); - report.mBtDeviceScanDetail.clear(); - report.mBtLeDeviceScanDetail.clear(); - - report = mCache; - } - - pthread_mutex_unlock(&mMutexSystemStatus); - return true; -} - -/****************************************************************************** -@brief API to set default report data - -@param[In] none - -@return true when successfully done -******************************************************************************/ -bool SystemStatus::setDefaultGnssEngineStates(void) -{ - pthread_mutex_lock(&mMutexSystemStatus); - - setDefaultIteminReport(mCache.mLocation, SystemStatusLocation()); - - setDefaultIteminReport(mCache.mTimeAndClock, SystemStatusTimeAndClock()); - setDefaultIteminReport(mCache.mXoState, SystemStatusXoState()); - setDefaultIteminReport(mCache.mRfAndParams, SystemStatusRfAndParams()); - setDefaultIteminReport(mCache.mErrRecovery, SystemStatusErrRecovery()); - - setDefaultIteminReport(mCache.mInjectedPosition, SystemStatusInjectedPosition()); - setDefaultIteminReport(mCache.mBestPosition, SystemStatusBestPosition()); - setDefaultIteminReport(mCache.mXtra, SystemStatusXtra()); - setDefaultIteminReport(mCache.mEphemeris, SystemStatusEphemeris()); - setDefaultIteminReport(mCache.mSvHealth, SystemStatusSvHealth()); - setDefaultIteminReport(mCache.mPdr, SystemStatusPdr()); - setDefaultIteminReport(mCache.mNavData, SystemStatusNavData()); - - setDefaultIteminReport(mCache.mPositionFailure, SystemStatusPositionFailure()); - - pthread_mutex_unlock(&mMutexSystemStatus); - return true; -} - -/****************************************************************************** -@brief API to handle connection status update event from GnssRil - -@param[In] Connection status - -@return true when successfully done -******************************************************************************/ -bool SystemStatus::eventConnectionStatus(bool connected, int8_t type) -{ - // send networkinof dataitem to systemstatus observer clients - SystemStatusNetworkInfo s(type, "", "", connected); - mSysStatusObsvr.notify({&s}); - - return true; -} - -} // namespace loc_core - diff --git a/gps/core/SystemStatus.h b/gps/core/SystemStatus.h deleted file mode 100644 index b2f4fb6..0000000 --- a/gps/core/SystemStatus.h +++ /dev/null @@ -1,831 +0,0 @@ -/* Copyright (c) 2017, 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 __SYSTEM_STATUS__ -#define __SYSTEM_STATUS__ - -#include <stdint.h> -#include <sys/time.h> -#include <vector> -#include <loc_pla.h> -#include <log_util.h> -#include <MsgTask.h> -#include <IDataItemCore.h> -#include <IOsObserver.h> -#include <DataItemConcreteTypesBase.h> -#include <SystemStatusOsObserver.h> - -#include <gps_extended_c.h> - -#define GPS_MIN (1) //1-32 -#define SBAS_MIN (33) -#define GLO_MIN (65) //65-88 -#define QZSS_MIN (193) //193-197 -#define BDS_MIN (201) //201-237 -#define GAL_MIN (301) //301-336 - -#define GPS_NUM (32) -#define SBAS_NUM (32) -#define GLO_NUM (24) -#define QZSS_NUM (5) -#define BDS_NUM (37) -#define GAL_NUM (36) -#define SV_ALL_NUM (GPS_NUM+GLO_NUM+QZSS_NUM+BDS_NUM+GAL_NUM) //=134 - -namespace loc_core -{ - -/****************************************************************************** - SystemStatus report data structure -******************************************************************************/ -class SystemStatusItemBase -{ -public: - timespec mUtcTime; // UTC timestamp when this info was last updated - timespec mUtcReported; // UTC timestamp when this info was reported - static const uint32_t maxItem = 5; - - SystemStatusItemBase() { - struct timespec tv; - clock_gettime(CLOCK_MONOTONIC, &tv); - mUtcTime.tv_sec = tv.tv_sec; - mUtcTime.tv_nsec = tv.tv_nsec; - mUtcReported = mUtcTime; - }; - virtual ~SystemStatusItemBase() {}; - inline virtual SystemStatusItemBase& collate(SystemStatusItemBase&) { - return *this; - } - virtual void dump(void) {}; -}; - -class SystemStatusLocation : public SystemStatusItemBase -{ -public: - bool mValid; - UlpLocation mLocation; - GpsLocationExtended mLocationEx; - inline SystemStatusLocation() : - mValid(false) {} - inline SystemStatusLocation(const UlpLocation& location, - const GpsLocationExtended& locationEx) : - mValid(true), - mLocation(location), - mLocationEx(locationEx) {} - bool equals(const SystemStatusLocation& peer); - void dump(void); -}; - -class SystemStatusPQWM1; -class SystemStatusTimeAndClock : public SystemStatusItemBase -{ -public: - uint16_t mGpsWeek; - uint32_t mGpsTowMs; - uint8_t mTimeValid; - uint8_t mTimeSource; - int32_t mTimeUnc; - int32_t mClockFreqBias; - int32_t mClockFreqBiasUnc; - int32_t mLeapSeconds; - int32_t mLeapSecUnc; - inline SystemStatusTimeAndClock() : - mGpsWeek(0), - mGpsTowMs(0), - mTimeValid(0), - mTimeSource(0), - mTimeUnc(0), - mClockFreqBias(0), - mClockFreqBiasUnc(0), - mLeapSeconds(0), - mLeapSecUnc(0) {} - inline SystemStatusTimeAndClock(const SystemStatusPQWM1& nmea); - bool equals(const SystemStatusTimeAndClock& peer); - void dump(void); -}; - -class SystemStatusXoState : public SystemStatusItemBase -{ -public: - uint8_t mXoState; - inline SystemStatusXoState() : - mXoState(0) {} - inline SystemStatusXoState(const SystemStatusPQWM1& nmea); - bool equals(const SystemStatusXoState& peer); - void dump(void); -}; - -class SystemStatusRfAndParams : public SystemStatusItemBase -{ -public: - int32_t mPgaGain; - uint32_t mGpsBpAmpI; - uint32_t mGpsBpAmpQ; - uint32_t mAdcI; - uint32_t mAdcQ; - uint32_t mJammerGps; - uint32_t mJammerGlo; - uint32_t mJammerBds; - uint32_t mJammerGal; - double mAgcGps; - double mAgcGlo; - double mAgcBds; - double mAgcGal; - uint32_t mGloBpAmpI; - uint32_t mGloBpAmpQ; - uint32_t mBdsBpAmpI; - uint32_t mBdsBpAmpQ; - uint32_t mGalBpAmpI; - uint32_t mGalBpAmpQ; - inline SystemStatusRfAndParams() : - mPgaGain(0), - mGpsBpAmpI(0), - mGpsBpAmpQ(0), - mAdcI(0), - mAdcQ(0), - mJammerGps(0), - mJammerGlo(0), - mJammerBds(0), - mJammerGal(0), - mAgcGps(0), - mAgcGlo(0), - mAgcBds(0), - mAgcGal(0), - mGloBpAmpI(0), - mGloBpAmpQ(0), - mBdsBpAmpI(0), - mBdsBpAmpQ(0), - mGalBpAmpI(0), - mGalBpAmpQ(0) {} - inline SystemStatusRfAndParams(const SystemStatusPQWM1& nmea); - bool equals(const SystemStatusRfAndParams& peer); - void dump(void); -}; - -class SystemStatusErrRecovery : public SystemStatusItemBase -{ -public: - uint32_t mRecErrorRecovery; - inline SystemStatusErrRecovery() : - mRecErrorRecovery(0) {}; - inline SystemStatusErrRecovery(const SystemStatusPQWM1& nmea); - bool equals(const SystemStatusErrRecovery& peer); - void dump(void); -}; - -class SystemStatusPQWP1; -class SystemStatusInjectedPosition : public SystemStatusItemBase -{ -public: - uint8_t mEpiValidity; - float mEpiLat; - float mEpiLon; - float mEpiAlt; - float mEpiHepe; - float mEpiAltUnc; - uint8_t mEpiSrc; - inline SystemStatusInjectedPosition() : - mEpiValidity(0), - mEpiLat(0), - mEpiLon(0), - mEpiAlt(0), - mEpiHepe(0), - mEpiAltUnc(0), - mEpiSrc(0) {} - inline SystemStatusInjectedPosition(const SystemStatusPQWP1& nmea); - bool equals(const SystemStatusInjectedPosition& peer); - void dump(void); -}; - -class SystemStatusPQWP2; -class SystemStatusBestPosition : public SystemStatusItemBase -{ -public: - bool mValid; - float mBestLat; - float mBestLon; - float mBestAlt; - float mBestHepe; - float mBestAltUnc; - inline SystemStatusBestPosition() : - mValid(false), - mBestLat(0), - mBestLon(0), - mBestAlt(0), - mBestHepe(0), - mBestAltUnc(0) {} - inline SystemStatusBestPosition(const SystemStatusPQWP2& nmea); - bool equals(const SystemStatusBestPosition& peer); - void dump(void); -}; - -class SystemStatusPQWP3; -class SystemStatusXtra : public SystemStatusItemBase -{ -public: - uint8_t mXtraValidMask; - uint32_t mGpsXtraAge; - uint32_t mGloXtraAge; - uint32_t mBdsXtraAge; - uint32_t mGalXtraAge; - uint32_t mQzssXtraAge; - uint32_t mGpsXtraValid; - uint32_t mGloXtraValid; - uint64_t mBdsXtraValid; - uint64_t mGalXtraValid; - uint8_t mQzssXtraValid; - inline SystemStatusXtra() : - mXtraValidMask(0), - mGpsXtraAge(0), - mGloXtraAge(0), - mBdsXtraAge(0), - mGalXtraAge(0), - mQzssXtraAge(0), - mGpsXtraValid(0), - mGloXtraValid(0), - mBdsXtraValid(0ULL), - mGalXtraValid(0ULL), - mQzssXtraValid(0) {} - inline SystemStatusXtra(const SystemStatusPQWP3& nmea); - bool equals(const SystemStatusXtra& peer); - void dump(void); -}; - -class SystemStatusPQWP4; -class SystemStatusEphemeris : public SystemStatusItemBase -{ -public: - uint32_t mGpsEpheValid; - uint32_t mGloEpheValid; - uint64_t mBdsEpheValid; - uint64_t mGalEpheValid; - uint8_t mQzssEpheValid; - inline SystemStatusEphemeris() : - mGpsEpheValid(0), - mGloEpheValid(0), - mBdsEpheValid(0ULL), - mGalEpheValid(0ULL), - mQzssEpheValid(0) {} - inline SystemStatusEphemeris(const SystemStatusPQWP4& nmea); - bool equals(const SystemStatusEphemeris& peer); - void dump(void); -}; - -class SystemStatusPQWP5; -class SystemStatusSvHealth : public SystemStatusItemBase -{ -public: - uint32_t mGpsUnknownMask; - uint32_t mGloUnknownMask; - uint64_t mBdsUnknownMask; - uint64_t mGalUnknownMask; - uint8_t mQzssUnknownMask; - uint32_t mGpsGoodMask; - uint32_t mGloGoodMask; - uint64_t mBdsGoodMask; - uint64_t mGalGoodMask; - uint8_t mQzssGoodMask; - uint32_t mGpsBadMask; - uint32_t mGloBadMask; - uint64_t mBdsBadMask; - uint64_t mGalBadMask; - uint8_t mQzssBadMask; - inline SystemStatusSvHealth() : - mGpsUnknownMask(0), - mGloUnknownMask(0), - mBdsUnknownMask(0ULL), - mGalUnknownMask(0ULL), - mQzssUnknownMask(0), - mGpsGoodMask(0), - mGloGoodMask(0), - mBdsGoodMask(0ULL), - mGalGoodMask(0ULL), - mQzssGoodMask(0), - mGpsBadMask(0), - mGloBadMask(0), - mBdsBadMask(0ULL), - mGalBadMask(0ULL), - mQzssBadMask(0) {} - inline SystemStatusSvHealth(const SystemStatusPQWP5& nmea); - bool equals(const SystemStatusSvHealth& peer); - void dump(void); -}; - -class SystemStatusPQWP6; -class SystemStatusPdr : public SystemStatusItemBase -{ -public: - uint32_t mFixInfoMask; - inline SystemStatusPdr() : - mFixInfoMask(0) {} - inline SystemStatusPdr(const SystemStatusPQWP6& nmea); - bool equals(const SystemStatusPdr& peer); - void dump(void); -}; - -class SystemStatusPQWP7; -struct SystemStatusNav -{ - GnssEphemerisType mType; - GnssEphemerisSource mSource; - int32_t mAgeSec; -}; - -class SystemStatusNavData : public SystemStatusItemBase -{ -public: - SystemStatusNav mNav[SV_ALL_NUM]; - inline SystemStatusNavData() { - for (uint32_t i=0; i<SV_ALL_NUM; i++) { - mNav[i].mType = GNSS_EPH_TYPE_UNKNOWN; - mNav[i].mSource = GNSS_EPH_SOURCE_UNKNOWN; - mNav[i].mAgeSec = 0; - } - } - inline SystemStatusNavData(const SystemStatusPQWP7& nmea); - bool equals(const SystemStatusNavData& peer); - void dump(void); -}; - -class SystemStatusPQWS1; -class SystemStatusPositionFailure : public SystemStatusItemBase -{ -public: - uint32_t mFixInfoMask; - uint32_t mHepeLimit; - inline SystemStatusPositionFailure() : - mFixInfoMask(0), - mHepeLimit(0) {} - inline SystemStatusPositionFailure(const SystemStatusPQWS1& nmea); - bool equals(const SystemStatusPositionFailure& peer); - void dump(void); -}; - -/****************************************************************************** - SystemStatus report data structure - from DataItem observer -******************************************************************************/ -class SystemStatusAirplaneMode : public SystemStatusItemBase, - public AirplaneModeDataItemBase -{ -public: - inline SystemStatusAirplaneMode(bool mode=false) : - AirplaneModeDataItemBase(mode) {} - inline SystemStatusAirplaneMode(const AirplaneModeDataItemBase& itemBase) : - AirplaneModeDataItemBase(itemBase) {} - inline bool equals(const SystemStatusAirplaneMode& peer) { - return (mMode == peer.mMode); - } -}; - -class SystemStatusENH : public SystemStatusItemBase, - public ENHDataItemBase -{ -public: - inline SystemStatusENH(bool enabled=false) : - ENHDataItemBase(enabled) {} - inline SystemStatusENH(const ENHDataItemBase& itemBase) : - ENHDataItemBase(itemBase) {} - inline bool equals(const SystemStatusENH& peer) { - return (mEnabled == peer.mEnabled); - } -}; - -class SystemStatusGpsState : public SystemStatusItemBase, - public GPSStateDataItemBase -{ -public: - inline SystemStatusGpsState(bool enabled=false) : - GPSStateDataItemBase(enabled) {} - inline SystemStatusGpsState(const GPSStateDataItemBase& itemBase) : - GPSStateDataItemBase(itemBase) {} - inline bool equals(const SystemStatusGpsState& peer) { - return (mEnabled == peer.mEnabled); - } - inline void dump(void) override { - LOC_LOGD("GpsState: state=%u", mEnabled); - } -}; - -class SystemStatusNLPStatus : public SystemStatusItemBase, - public NLPStatusDataItemBase -{ -public: - inline SystemStatusNLPStatus(bool enabled=false) : - NLPStatusDataItemBase(enabled) {} - inline SystemStatusNLPStatus(const NLPStatusDataItemBase& itemBase) : - NLPStatusDataItemBase(itemBase) {} - inline bool equals(const SystemStatusNLPStatus& peer) { - return (mEnabled == peer.mEnabled); - } -}; - -class SystemStatusWifiHardwareState : public SystemStatusItemBase, - public WifiHardwareStateDataItemBase -{ -public: - inline SystemStatusWifiHardwareState(bool enabled=false) : - WifiHardwareStateDataItemBase(enabled) {} - inline SystemStatusWifiHardwareState(const WifiHardwareStateDataItemBase& itemBase) : - WifiHardwareStateDataItemBase(itemBase) {} - inline bool equals(const SystemStatusWifiHardwareState& peer) { - return (mEnabled == peer.mEnabled); - } -}; - -class SystemStatusNetworkInfo : public SystemStatusItemBase, - public NetworkInfoDataItemBase -{ - NetworkInfoDataItemBase* mSrcObjPtr; -public: - inline SystemStatusNetworkInfo( - int32_t type=0, - std::string typeName="", - string subTypeName="", - bool connected=false, - bool roaming=false) : - NetworkInfoDataItemBase( - (NetworkType)type, - type, - typeName, - subTypeName, - connected && (!roaming), - connected, - roaming), - mSrcObjPtr(nullptr) {} - inline SystemStatusNetworkInfo(const NetworkInfoDataItemBase& itemBase) : - NetworkInfoDataItemBase(itemBase), - mSrcObjPtr((NetworkInfoDataItemBase*)&itemBase) { - mType = itemBase.getType(); - } - inline bool equals(const SystemStatusNetworkInfo& peer) { - return (mAllTypes == peer.mAllTypes); - } - inline virtual SystemStatusItemBase& collate(SystemStatusItemBase& curInfo) { - uint64_t allTypes = (static_cast<SystemStatusNetworkInfo&>(curInfo)).mAllTypes; - if (mConnected) { - mAllTypes |= allTypes; - } else if (0 != mAllTypes) { - mAllTypes = (allTypes & (~mAllTypes)); - } // else (mConnected == false && mAllTypes == 0) - // we keep mAllTypes as 0, which means no more connections. - - if (nullptr != mSrcObjPtr) { - // this is critical, changing mAllTypes of the original obj - mSrcObjPtr->mAllTypes = mAllTypes; - } - return *this; - } - inline void dump(void) override { - LOC_LOGD("NetworkInfo: mAllTypes=%" PRIx64 " connected=%u mType=%x", - mAllTypes, mConnected, mType); - } -}; - -class SystemStatusServiceInfo : public SystemStatusItemBase, - public RilServiceInfoDataItemBase -{ -public: - inline SystemStatusServiceInfo() : - RilServiceInfoDataItemBase() {} - inline SystemStatusServiceInfo(const RilServiceInfoDataItemBase& itemBase) : - RilServiceInfoDataItemBase(itemBase) {} - inline bool equals(const SystemStatusServiceInfo& peer) { - return static_cast<const RilServiceInfoDataItemBase&>(peer) == - static_cast<const RilServiceInfoDataItemBase&>(*this); - } -}; - -class SystemStatusRilCellInfo : public SystemStatusItemBase, - public RilCellInfoDataItemBase -{ -public: - inline SystemStatusRilCellInfo() : - RilCellInfoDataItemBase() {} - inline SystemStatusRilCellInfo(const RilCellInfoDataItemBase& itemBase) : - RilCellInfoDataItemBase(itemBase) {} - inline bool equals(const SystemStatusRilCellInfo& peer) { - return static_cast<const RilCellInfoDataItemBase&>(peer) == - static_cast<const RilCellInfoDataItemBase&>(*this); - } -}; - -class SystemStatusServiceStatus : public SystemStatusItemBase, - public ServiceStatusDataItemBase -{ -public: - inline SystemStatusServiceStatus(int32_t mServiceState=0) : - ServiceStatusDataItemBase(mServiceState) {} - inline SystemStatusServiceStatus(const ServiceStatusDataItemBase& itemBase) : - ServiceStatusDataItemBase(itemBase) {} - inline bool equals(const SystemStatusServiceStatus& peer) { - return (mServiceState == peer.mServiceState); - } -}; - -class SystemStatusModel : public SystemStatusItemBase, - public ModelDataItemBase -{ -public: - inline SystemStatusModel(string name="") : - ModelDataItemBase(name) {} - inline SystemStatusModel(const ModelDataItemBase& itemBase) : - ModelDataItemBase(itemBase) {} - inline bool equals(const SystemStatusModel& peer) { - return (mModel == peer.mModel); - } -}; - -class SystemStatusManufacturer : public SystemStatusItemBase, - public ManufacturerDataItemBase -{ -public: - inline SystemStatusManufacturer(string name="") : - ManufacturerDataItemBase(name) {} - inline SystemStatusManufacturer(const ManufacturerDataItemBase& itemBase) : - ManufacturerDataItemBase(itemBase) {} - inline bool equals(const SystemStatusManufacturer& peer) { - return (mManufacturer == peer.mManufacturer); - } -}; - -class SystemStatusAssistedGps : public SystemStatusItemBase, - public AssistedGpsDataItemBase -{ -public: - inline SystemStatusAssistedGps(bool enabled=false) : - AssistedGpsDataItemBase(enabled) {} - inline SystemStatusAssistedGps(const AssistedGpsDataItemBase& itemBase) : - AssistedGpsDataItemBase(itemBase) {} - inline bool equals(const SystemStatusAssistedGps& peer) { - return (mEnabled == peer.mEnabled); - } -}; - -class SystemStatusScreenState : public SystemStatusItemBase, - public ScreenStateDataItemBase -{ -public: - inline SystemStatusScreenState(bool state=false) : - ScreenStateDataItemBase(state) {} - inline SystemStatusScreenState(const ScreenStateDataItemBase& itemBase) : - ScreenStateDataItemBase(itemBase) {} - inline bool equals(const SystemStatusScreenState& peer) { - return (mState == peer.mState); - } -}; - -class SystemStatusPowerConnectState : public SystemStatusItemBase, - public PowerConnectStateDataItemBase -{ -public: - inline SystemStatusPowerConnectState(bool state=false) : - PowerConnectStateDataItemBase(state) {} - inline SystemStatusPowerConnectState(const PowerConnectStateDataItemBase& itemBase) : - PowerConnectStateDataItemBase(itemBase) {} - inline bool equals(const SystemStatusPowerConnectState& peer) { - return (mState == peer.mState); - } -}; - -class SystemStatusTimeZoneChange : public SystemStatusItemBase, - public TimeZoneChangeDataItemBase -{ -public: - inline SystemStatusTimeZoneChange( - int64_t currTimeMillis=0ULL, int32_t rawOffset=0, int32_t dstOffset=0) : - TimeZoneChangeDataItemBase(currTimeMillis, rawOffset, dstOffset) {} - inline SystemStatusTimeZoneChange(const TimeZoneChangeDataItemBase& itemBase) : - TimeZoneChangeDataItemBase(itemBase) {} - inline bool equals(const SystemStatusTimeZoneChange& peer) { - return ((mCurrTimeMillis == peer.mCurrTimeMillis) && - (mRawOffsetTZ == peer.mRawOffsetTZ) && - (mDstOffsetTZ == peer.mDstOffsetTZ)); - } -}; - -class SystemStatusTimeChange : public SystemStatusItemBase, - public TimeChangeDataItemBase -{ -public: - inline SystemStatusTimeChange( - int64_t currTimeMillis=0ULL, int32_t rawOffset=0, int32_t dstOffset=0) : - TimeChangeDataItemBase(currTimeMillis, rawOffset, dstOffset) {} - inline SystemStatusTimeChange(const TimeChangeDataItemBase& itemBase) : - TimeChangeDataItemBase(itemBase) {} - inline bool equals(const SystemStatusTimeChange& peer) { - return ((mCurrTimeMillis == peer.mCurrTimeMillis) && - (mRawOffsetTZ == peer.mRawOffsetTZ) && - (mDstOffsetTZ == peer.mDstOffsetTZ)); - } -}; - -class SystemStatusWifiSupplicantStatus : public SystemStatusItemBase, - public WifiSupplicantStatusDataItemBase -{ -public: - inline SystemStatusWifiSupplicantStatus() : - WifiSupplicantStatusDataItemBase() {} - inline SystemStatusWifiSupplicantStatus(const WifiSupplicantStatusDataItemBase& itemBase) : - WifiSupplicantStatusDataItemBase(itemBase) {} - inline bool equals(const SystemStatusWifiSupplicantStatus& peer) { - return ((mState == peer.mState) && - (mApMacAddressValid == peer.mApMacAddressValid) && - (mWifiApSsidValid == peer.mWifiApSsidValid) && - (mWifiApSsid == peer.mWifiApSsid)); - } -}; - -class SystemStatusShutdownState : public SystemStatusItemBase, - public ShutdownStateDataItemBase -{ -public: - inline SystemStatusShutdownState(bool state=false) : - ShutdownStateDataItemBase(state) {} - inline SystemStatusShutdownState(const ShutdownStateDataItemBase& itemBase) : - ShutdownStateDataItemBase(itemBase) {} - inline bool equals(const SystemStatusShutdownState& peer) { - return (mState == peer.mState); - } -}; - -class SystemStatusTac : public SystemStatusItemBase, - public TacDataItemBase -{ -public: - inline SystemStatusTac(std::string value="") : - TacDataItemBase(value) {} - inline SystemStatusTac(const TacDataItemBase& itemBase) : - TacDataItemBase(itemBase) {} - inline bool equals(const SystemStatusTac& peer) { - return (mValue == peer.mValue); - } - inline void dump(void) { - LOC_LOGD("Tac: value=%s", mValue.c_str()); - } -}; - -class SystemStatusMccMnc : public SystemStatusItemBase, - public MccmncDataItemBase -{ -public: - inline SystemStatusMccMnc(std::string value="") : - MccmncDataItemBase(value) {} - inline SystemStatusMccMnc(const MccmncDataItemBase& itemBase) : - MccmncDataItemBase(itemBase) {} - inline bool equals(const SystemStatusMccMnc& peer) { - return (mValue == peer.mValue); - } - inline void dump(void) { - LOC_LOGD("TacMccMnc value=%s", mValue.c_str()); - } -}; - -class SystemStatusBtDeviceScanDetail : public SystemStatusItemBase, - public BtDeviceScanDetailsDataItemBase -{ -public: - inline SystemStatusBtDeviceScanDetail() : - BtDeviceScanDetailsDataItemBase() {} - inline SystemStatusBtDeviceScanDetail(const BtDeviceScanDetailsDataItemBase& itemBase) : - BtDeviceScanDetailsDataItemBase(itemBase) {} - inline bool equals(const SystemStatusBtDeviceScanDetail& /*peer*/) { - return true; - } -}; - -class SystemStatusBtleDeviceScanDetail : public SystemStatusItemBase, - public BtLeDeviceScanDetailsDataItemBase -{ -public: - inline SystemStatusBtleDeviceScanDetail() : - BtLeDeviceScanDetailsDataItemBase() {} - inline SystemStatusBtleDeviceScanDetail(const BtLeDeviceScanDetailsDataItemBase& itemBase) : - BtLeDeviceScanDetailsDataItemBase(itemBase) {} - inline bool equals(const SystemStatusBtleDeviceScanDetail& /*peer*/) { - return true; - } -}; - -/****************************************************************************** - SystemStatusReports -******************************************************************************/ -class SystemStatusReports -{ -public: - // from QMI_LOC indication - std::vector<SystemStatusLocation> mLocation; - - // from ME debug NMEA - std::vector<SystemStatusTimeAndClock> mTimeAndClock; - std::vector<SystemStatusXoState> mXoState; - std::vector<SystemStatusRfAndParams> mRfAndParams; - std::vector<SystemStatusErrRecovery> mErrRecovery; - - // from PE debug NMEA - std::vector<SystemStatusInjectedPosition> mInjectedPosition; - std::vector<SystemStatusBestPosition> mBestPosition; - std::vector<SystemStatusXtra> mXtra; - std::vector<SystemStatusEphemeris> mEphemeris; - std::vector<SystemStatusSvHealth> mSvHealth; - std::vector<SystemStatusPdr> mPdr; - std::vector<SystemStatusNavData> mNavData; - - // from SM debug NMEA - std::vector<SystemStatusPositionFailure> mPositionFailure; - - // from dataitems observer - std::vector<SystemStatusAirplaneMode> mAirplaneMode; - std::vector<SystemStatusENH> mENH; - std::vector<SystemStatusGpsState> mGPSState; - std::vector<SystemStatusNLPStatus> mNLPStatus; - std::vector<SystemStatusWifiHardwareState> mWifiHardwareState; - std::vector<SystemStatusNetworkInfo> mNetworkInfo; - std::vector<SystemStatusServiceInfo> mRilServiceInfo; - std::vector<SystemStatusRilCellInfo> mRilCellInfo; - std::vector<SystemStatusServiceStatus> mServiceStatus; - std::vector<SystemStatusModel> mModel; - std::vector<SystemStatusManufacturer> mManufacturer; - std::vector<SystemStatusAssistedGps> mAssistedGps; - std::vector<SystemStatusScreenState> mScreenState; - std::vector<SystemStatusPowerConnectState> mPowerConnectState; - std::vector<SystemStatusTimeZoneChange> mTimeZoneChange; - std::vector<SystemStatusTimeChange> mTimeChange; - std::vector<SystemStatusWifiSupplicantStatus> mWifiSupplicantStatus; - std::vector<SystemStatusShutdownState> mShutdownState; - std::vector<SystemStatusTac> mTac; - std::vector<SystemStatusMccMnc> mMccMnc; - std::vector<SystemStatusBtDeviceScanDetail> mBtDeviceScanDetail; - std::vector<SystemStatusBtleDeviceScanDetail> mBtLeDeviceScanDetail; -}; - -/****************************************************************************** - SystemStatus -******************************************************************************/ -class SystemStatus -{ -private: - static SystemStatus *mInstance; - SystemStatusOsObserver mSysStatusObsvr; - // ctor - SystemStatus(const MsgTask* msgTask); - // dtor - inline ~SystemStatus() {} - - // Data members - static pthread_mutex_t mMutexSystemStatus; - SystemStatusReports mCache; - - template <typename TYPE_REPORT, typename TYPE_ITEM> - bool setIteminReport(TYPE_REPORT& report, TYPE_ITEM&& s); - - // set default dataitem derived item in report cache - template <typename TYPE_REPORT, typename TYPE_ITEM> - void setDefaultIteminReport(TYPE_REPORT& report, const TYPE_ITEM& s); - - template <typename TYPE_REPORT, typename TYPE_ITEM> - void getIteminReport(TYPE_REPORT& reportout, const TYPE_ITEM& c) const; - -public: - // Static methods - static SystemStatus* getInstance(const MsgTask* msgTask); - static void destroyInstance(); - IOsObserver* getOsObserver(); - - // Helpers - bool eventPosition(const UlpLocation& location,const GpsLocationExtended& locationEx); - bool eventDataItemNotify(IDataItemCore* dataitem); - bool setNmeaString(const char *data, uint32_t len); - bool getReport(SystemStatusReports& reports, bool isLatestonly = false) const; - bool setDefaultGnssEngineStates(void); - bool eventConnectionStatus(bool connected, int8_t type); -}; - -} // namespace loc_core - -#endif //__SYSTEM_STATUS__ - diff --git a/gps/core/SystemStatusOsObserver.cpp b/gps/core/SystemStatusOsObserver.cpp deleted file mode 100644 index 8127e86..0000000 --- a/gps/core/SystemStatusOsObserver.cpp +++ /dev/null @@ -1,575 +0,0 @@ -/* Copyright (c) 2015-2017, 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_TAG "LocSvc_SystemStatusOsObserver" - -#include <algorithm> -#include <SystemStatus.h> -#include <SystemStatusOsObserver.h> -#include <IDataItemCore.h> -#include <DataItemsFactoryProxy.h> - -namespace loc_core -{ -template <typename CINT, typename COUT> -COUT SystemStatusOsObserver::containerTransfer(CINT& inContainer) { - COUT outContainer(0); - for (auto item : inContainer) { - outContainer.insert(outContainer.begin(), item); - } - return outContainer; -} - -SystemStatusOsObserver::~SystemStatusOsObserver() { - // Close data-item library handle - DataItemsFactoryProxy::closeDataItemLibraryHandle(); - - // Destroy cache - for (auto each : mDataItemCache) { - if (nullptr != each.second) { - delete each.second; - } - } - - mDataItemCache.clear(); -} - -void SystemStatusOsObserver::setSubscriptionObj(IDataItemSubscription* subscriptionObj) -{ - struct SetSubsObj : public LocMsg { - ObserverContext& mContext; - IDataItemSubscription* mSubsObj; - inline SetSubsObj(ObserverContext& context, IDataItemSubscription* subscriptionObj) : - mContext(context), mSubsObj(subscriptionObj) {} - void proc() const { - mContext.mSubscriptionObj = mSubsObj; - - if (!mContext.mSSObserver->mDataItemToClients.empty()) { - list<DataItemId> dis( - containerTransfer<unordered_set<DataItemId>, list<DataItemId>>( - mContext.mSSObserver->mDataItemToClients.getKeys())); - mContext.mSubscriptionObj->subscribe(dis, mContext.mSSObserver); - mContext.mSubscriptionObj->requestData(dis, mContext.mSSObserver); - } - } - }; - - if (nullptr == subscriptionObj) { - LOC_LOGw("subscriptionObj is NULL"); - } else { - mContext.mMsgTask->sendMsg(new SetSubsObj(mContext, subscriptionObj)); - } -} - -/****************************************************************************** - IDataItemSubscription Overrides -******************************************************************************/ -void SystemStatusOsObserver::subscribe(const list<DataItemId>& l, IDataItemObserver* client, - bool toRequestData) -{ - struct HandleSubscribeReq : public LocMsg { - inline HandleSubscribeReq(SystemStatusOsObserver* parent, - list<DataItemId>& l, IDataItemObserver* client, bool requestData) : - mParent(parent), mClient(client), - mDataItemSet(containerTransfer<list<DataItemId>, unordered_set<DataItemId>>(l)), - mToRequestData(requestData) {} - - void proc() const { - unordered_set<DataItemId> dataItemsToSubscribe(0); - mParent->mDataItemToClients.add(mDataItemSet, {mClient}, &dataItemsToSubscribe); - mParent->mClientToDataItems.add(mClient, mDataItemSet); - - mParent->sendCachedDataItems(mDataItemSet, mClient); - - // Send subscription set to framework - if (nullptr != mParent->mContext.mSubscriptionObj && !dataItemsToSubscribe.empty()) { - LOC_LOGD("Subscribe Request sent to framework for the following"); - mParent->logMe(dataItemsToSubscribe); - - if (mToRequestData) { - mParent->mContext.mSubscriptionObj->requestData( - containerTransfer<unordered_set<DataItemId>, list<DataItemId>>( - std::move(dataItemsToSubscribe)), - mParent); - } else { - mParent->mContext.mSubscriptionObj->subscribe( - containerTransfer<unordered_set<DataItemId>, list<DataItemId>>( - std::move(dataItemsToSubscribe)), - mParent); - } - } - } - mutable SystemStatusOsObserver* mParent; - IDataItemObserver* mClient; - const unordered_set<DataItemId> mDataItemSet; - bool mToRequestData; - }; - - if (l.empty() || nullptr == client) { - LOC_LOGw("Data item set is empty or client is nullptr"); - } else { - mContext.mMsgTask->sendMsg( - new HandleSubscribeReq(this, (list<DataItemId>&)l, client, toRequestData)); - } -} - -void SystemStatusOsObserver::updateSubscription( - const list<DataItemId>& l, IDataItemObserver* client) -{ - struct HandleUpdateSubscriptionReq : public LocMsg { - HandleUpdateSubscriptionReq(SystemStatusOsObserver* parent, - list<DataItemId>& l, IDataItemObserver* client) : - mParent(parent), mClient(client), - mDataItemSet(containerTransfer<list<DataItemId>, unordered_set<DataItemId>>(l)) {} - - void proc() const { - unordered_set<DataItemId> dataItemsToSubscribe(0); - unordered_set<DataItemId> dataItemsToUnsubscribe(0); - unordered_set<IDataItemObserver*> clients({mClient}); - // below removes clients from all entries keyed with the return of the - // mClientToDataItems.update() call. If leaving an empty set of clients as the - // result, the entire entry will be removed. dataItemsToUnsubscribe will be - // populated to keep the keys of the removed entries. - mParent->mDataItemToClients.trimOrRemove( - // this call updates <IDataItemObserver*, DataItemId> map; removes - // the DataItemId's that are not new to the clietn from mDataItemSet; - // and returns a set of mDataItemSet's that are no longer used by client. - // This unused set of mDataItemSet's is passed to trimOrRemove method of - // <DataItemId, IDataItemObserver*> map to remove the client from the - // corresponding entries, and gets a set of the entries that are - // removed from the <DataItemId, IDataItemObserver*> map as a result. - mParent->mClientToDataItems.update(mClient, - (unordered_set<DataItemId>&)mDataItemSet), - clients, &dataItemsToUnsubscribe, nullptr); - // below adds mClient to <DataItemId, IDataItemObserver*> map, and populates - // new keys added to that map, which are DataItemIds to be subscribed. - mParent->mDataItemToClients.add(mDataItemSet, clients, &dataItemsToSubscribe); - - // Send First Response - mParent->sendCachedDataItems(mDataItemSet, mClient); - - if (nullptr != mParent->mContext.mSubscriptionObj) { - // Send subscription set to framework - if (!dataItemsToSubscribe.empty()) { - LOC_LOGD("Subscribe Request sent to framework for the following"); - mParent->logMe(dataItemsToSubscribe); - - mParent->mContext.mSubscriptionObj->subscribe( - containerTransfer<unordered_set<DataItemId>, list<DataItemId>>( - std::move(dataItemsToSubscribe)), - mParent); - } - - // Send unsubscribe to framework - if (!dataItemsToUnsubscribe.empty()) { - LOC_LOGD("Unsubscribe Request sent to framework for the following"); - mParent->logMe(dataItemsToUnsubscribe); - - mParent->mContext.mSubscriptionObj->unsubscribe( - containerTransfer<unordered_set<DataItemId>, list<DataItemId>>( - std::move(dataItemsToUnsubscribe)), - mParent); - } - } - } - SystemStatusOsObserver* mParent; - IDataItemObserver* mClient; - unordered_set<DataItemId> mDataItemSet; - }; - - if (l.empty() || nullptr == client) { - LOC_LOGw("Data item set is empty or client is nullptr"); - } else { - mContext.mMsgTask->sendMsg( - new HandleUpdateSubscriptionReq(this, (list<DataItemId>&)l, client)); - } -} - -void SystemStatusOsObserver::unsubscribe( - const list<DataItemId>& l, IDataItemObserver* client) -{ - struct HandleUnsubscribeReq : public LocMsg { - HandleUnsubscribeReq(SystemStatusOsObserver* parent, - list<DataItemId>& l, IDataItemObserver* client) : - mParent(parent), mClient(client), - mDataItemSet(containerTransfer<list<DataItemId>, unordered_set<DataItemId>>(l)) {} - - void proc() const { - unordered_set<DataItemId> dataItemsUnusedByClient(0); - unordered_set<IDataItemObserver*> clientToRemove(0); - mParent->mClientToDataItems.trimOrRemove({mClient}, mDataItemSet, &clientToRemove, - &dataItemsUnusedByClient); - unordered_set<DataItemId> dataItemsToUnsubscribe(0); - mParent->mDataItemToClients.trimOrRemove(dataItemsUnusedByClient, {mClient}, - &dataItemsToUnsubscribe, nullptr); - - if (nullptr != mParent->mContext.mSubscriptionObj && !dataItemsToUnsubscribe.empty()) { - LOC_LOGD("Unsubscribe Request sent to framework for the following data items"); - mParent->logMe(dataItemsToUnsubscribe); - - // Send unsubscribe to framework - mParent->mContext.mSubscriptionObj->unsubscribe( - containerTransfer<unordered_set<DataItemId>, list<DataItemId>>( - std::move(dataItemsToUnsubscribe)), - mParent); - } - } - SystemStatusOsObserver* mParent; - IDataItemObserver* mClient; - unordered_set<DataItemId> mDataItemSet; - }; - - if (l.empty() || nullptr == client) { - LOC_LOGw("Data item set is empty or client is nullptr"); - } else { - mContext.mMsgTask->sendMsg(new HandleUnsubscribeReq(this, (list<DataItemId>&)l, client)); - } -} - -void SystemStatusOsObserver::unsubscribeAll(IDataItemObserver* client) -{ - struct HandleUnsubscribeAllReq : public LocMsg { - HandleUnsubscribeAllReq(SystemStatusOsObserver* parent, - IDataItemObserver* client) : - mParent(parent), mClient(client) {} - - void proc() const { - unordered_set<DataItemId> diByClient = mParent->mClientToDataItems.getValSet(mClient); - if (!diByClient.empty()) { - unordered_set<DataItemId> dataItemsToUnsubscribe; - mParent->mClientToDataItems.remove(mClient); - mParent->mDataItemToClients.trimOrRemove(diByClient, {mClient}, - &dataItemsToUnsubscribe, nullptr); - - if (!dataItemsToUnsubscribe.empty() && - nullptr != mParent->mContext.mSubscriptionObj) { - - LOC_LOGD("Unsubscribe Request sent to framework for the following data items"); - mParent->logMe(dataItemsToUnsubscribe); - - // Send unsubscribe to framework - mParent->mContext.mSubscriptionObj->unsubscribe( - containerTransfer<unordered_set<DataItemId>, list<DataItemId>>( - std::move(dataItemsToUnsubscribe)), - mParent); - } - } - } - SystemStatusOsObserver* mParent; - IDataItemObserver* mClient; - }; - - if (nullptr == client) { - LOC_LOGw("Data item set is empty or client is nullptr"); - } else { - mContext.mMsgTask->sendMsg(new HandleUnsubscribeAllReq(this, client)); - } -} - -/****************************************************************************** - IDataItemObserver Overrides -******************************************************************************/ -void SystemStatusOsObserver::notify(const list<IDataItemCore*>& dlist) -{ - struct HandleNotify : public LocMsg { - HandleNotify(SystemStatusOsObserver* parent, vector<IDataItemCore*>& v) : - mParent(parent), mDiVec(std::move(v)) {} - - inline virtual ~HandleNotify() { - for (auto item : mDiVec) { - delete item; - } - } - - void proc() const { - // Update Cache with received data items and prepare - // list of data items to be sent. - unordered_set<DataItemId> dataItemIdsToBeSent(0); - for (auto item : mDiVec) { - if (mParent->updateCache(item)) { - dataItemIdsToBeSent.insert(item->getId()); - } - } - - // Send data item to all subscribed clients - unordered_set<IDataItemObserver*> clientSet(0); - for (auto each : dataItemIdsToBeSent) { - auto clients = mParent->mDataItemToClients.getValSetPtr(each); - if (nullptr != clients) { - clientSet.insert(clients->begin(), clients->end()); - } - } - - for (auto client : clientSet) { - unordered_set<DataItemId> dataItemIdsForThisClient( - mParent->mClientToDataItems.getValSet(client)); - for (auto itr = dataItemIdsForThisClient.begin(); - itr != dataItemIdsForThisClient.end(); ) { - if (dataItemIdsToBeSent.find(*itr) == dataItemIdsToBeSent.end()) { - itr = dataItemIdsForThisClient.erase(itr); - } else { - itr++; - } - } - - mParent->sendCachedDataItems(dataItemIdsForThisClient, client); - } - } - SystemStatusOsObserver* mParent; - const vector<IDataItemCore*> mDiVec; - }; - - if (!dlist.empty()) { - vector<IDataItemCore*> dataItemVec(dlist.size()); - - for (auto each : dlist) { - IF_LOC_LOGD { - string dv; - each->stringify(dv); - LOC_LOGD("notify: DataItem In Value:%s", dv.c_str()); - } - - IDataItemCore* di = DataItemsFactoryProxy::createNewDataItem(each->getId()); - if (nullptr == di) { - LOC_LOGw("Unable to create dataitem:%d", each->getId()); - continue; - } - - // Copy contents into the newly created data item - di->copy(each); - - // add this dataitem if updated from last one - dataItemVec.push_back(di); - } - - if (!dataItemVec.empty()) { - mContext.mMsgTask->sendMsg(new HandleNotify(this, dataItemVec)); - } - } -} - -/****************************************************************************** - IFrameworkActionReq Overrides -******************************************************************************/ -void SystemStatusOsObserver::turnOn(DataItemId dit, int timeOut) -{ - if (nullptr == mContext.mFrameworkActionReqObj) { - LOC_LOGE("%s:%d]: Framework action request object is NULL", __func__, __LINE__); - return; - } - - // Check if data item exists in mActiveRequestCount - DataItemIdToInt::iterator citer = mActiveRequestCount.find(dit); - if (citer == mActiveRequestCount.end()) { - // Data item not found in map - // Add reference count as 1 and add dataitem to map - pair<DataItemId, int> cpair(dit, 1); - mActiveRequestCount.insert(cpair); - LOC_LOGD("Sending turnOn request"); - - // Send action turn on to framework - struct HandleTurnOnMsg : public LocMsg { - HandleTurnOnMsg(IFrameworkActionReq* framework, - DataItemId dit, int timeOut) : - mFrameworkActionReqObj(framework), mDataItemId(dit), mTimeOut(timeOut) {} - virtual ~HandleTurnOnMsg() {} - void proc() const { - mFrameworkActionReqObj->turnOn(mDataItemId, mTimeOut); - } - IFrameworkActionReq* mFrameworkActionReqObj; - DataItemId mDataItemId; - int mTimeOut; - }; - mContext.mMsgTask->sendMsg(new (nothrow) HandleTurnOnMsg(this, dit, timeOut)); - } - else { - // Found in map, update reference count - citer->second++; - LOC_LOGD("turnOn - Data item:%d Num_refs:%d", dit, citer->second); - } -} - -void SystemStatusOsObserver::turnOff(DataItemId dit) -{ - if (nullptr == mContext.mFrameworkActionReqObj) { - LOC_LOGE("%s:%d]: Framework action request object is NULL", __func__, __LINE__); - return; - } - - // Check if data item exists in mActiveRequestCount - DataItemIdToInt::iterator citer = mActiveRequestCount.find(dit); - if (citer != mActiveRequestCount.end()) { - // found - citer->second--; - LOC_LOGD("turnOff - Data item:%d Remaining:%d", dit, citer->second); - if(citer->second == 0) { - // if this was last reference, remove item from map and turn off module - mActiveRequestCount.erase(citer); - - // Send action turn off to framework - struct HandleTurnOffMsg : public LocMsg { - HandleTurnOffMsg(IFrameworkActionReq* framework, DataItemId dit) : - mFrameworkActionReqObj(framework), mDataItemId(dit) {} - virtual ~HandleTurnOffMsg() {} - void proc() const { - mFrameworkActionReqObj->turnOff(mDataItemId); - } - IFrameworkActionReq* mFrameworkActionReqObj; - DataItemId mDataItemId; - }; - mContext.mMsgTask->sendMsg( - new (nothrow) HandleTurnOffMsg(mContext.mFrameworkActionReqObj, dit)); - } - } -} - -#ifdef USE_GLIB -bool SystemStatusOsObserver::connectBackhaul() -{ - bool result = false; - - if (mContext.mFrameworkActionReqObj != NULL) { - struct HandleConnectBackhaul : public LocMsg { - HandleConnectBackhaul(IFrameworkActionReq* fwkActReq) : - mFwkActionReqObj(fwkActReq) {} - virtual ~HandleConnectBackhaul() {} - void proc() const { - LOC_LOGD("HandleConnectBackhaul"); - mFwkActionReqObj->connectBackhaul(); - } - IFrameworkActionReq* mFwkActionReqObj; - }; - mContext.mMsgTask->sendMsg( - new (nothrow) HandleConnectBackhaul(mContext.mFrameworkActionReqObj)); - result = true; - } - else { - ++mBackHaulConnectReqCount; - LOC_LOGE("Framework action request object is NULL.Caching connect request: %d", - mBackHaulConnectReqCount); - result = false; - } - return result; - -} - -bool SystemStatusOsObserver::disconnectBackhaul() -{ - bool result = false; - - if (mContext.mFrameworkActionReqObj != NULL) { - struct HandleDisconnectBackhaul : public LocMsg { - HandleDisconnectBackhaul(IFrameworkActionReq* fwkActReq) : - mFwkActionReqObj(fwkActReq) {} - virtual ~HandleDisconnectBackhaul() {} - void proc() const { - LOC_LOGD("HandleDisconnectBackhaul"); - mFwkActionReqObj->disconnectBackhaul(); - } - IFrameworkActionReq* mFwkActionReqObj; - }; - mContext.mMsgTask->sendMsg( - new (nothrow) HandleDisconnectBackhaul(mContext.mFrameworkActionReqObj)); - } - else { - if (mBackHaulConnectReqCount > 0) { - --mBackHaulConnectReqCount; - } - LOC_LOGE("Framework action request object is NULL.Caching disconnect request: %d", - mBackHaulConnectReqCount); - result = false; - } - return result; -} -#endif -/****************************************************************************** - Helpers -******************************************************************************/ -void SystemStatusOsObserver::sendCachedDataItems( - const unordered_set<DataItemId>& s, IDataItemObserver* to) -{ - if (nullptr == to) { - LOC_LOGv("client pointer is NULL."); - } else { - string clientName; - to->getName(clientName); - list<IDataItemCore*> dataItems(0); - - for (auto each : s) { - auto citer = mDataItemCache.find(each); - if (citer != mDataItemCache.end()) { - string dv; - citer->second->stringify(dv); - LOC_LOGI("DataItem: %s >> %s", dv.c_str(), clientName.c_str()); - dataItems.push_front(citer->second); - } - } - - if (dataItems.empty()) { - LOC_LOGv("No items to notify."); - } else { - to->notify(dataItems); - } - } -} - -bool SystemStatusOsObserver::updateCache(IDataItemCore* d) -{ - bool dataItemUpdated = false; - - // Request systemstatus to record this dataitem in its cache - // if the return is false, it means that SystemStatus is not - // handling it, so SystemStatusOsObserver also doesn't. - // So it has to be true to proceed. - if (nullptr != d && mSystemStatus->eventDataItemNotify(d)) { - auto citer = mDataItemCache.find(d->getId()); - if (citer == mDataItemCache.end()) { - // New data item; not found in cache - IDataItemCore* dataitem = DataItemsFactoryProxy::createNewDataItem(d->getId()); - if (nullptr != dataitem) { - // Copy the contents of the data item - dataitem->copy(d); - // Insert in mDataItemCache - mDataItemCache.insert(std::make_pair(d->getId(), dataitem)); - dataItemUpdated = true; - } - } else { - // Found in cache; Update cache if necessary - citer->second->copy(d, &dataItemUpdated); - } - - if (dataItemUpdated) { - LOC_LOGV("DataItem:%d updated:%d", d->getId(), dataItemUpdated); - } - } - - return dataItemUpdated; -} - -} // namespace loc_core - diff --git a/gps/core/SystemStatusOsObserver.h b/gps/core/SystemStatusOsObserver.h deleted file mode 100644 index fd60606..0000000 --- a/gps/core/SystemStatusOsObserver.h +++ /dev/null @@ -1,176 +0,0 @@ -/* Copyright (c) 2015-2017, 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 __SYSTEM_STATUS_OSOBSERVER__ -#define __SYSTEM_STATUS_OSOBSERVER__ - -#include <cinttypes> -#include <string> -#include <list> -#include <map> -#include <new> -#include <vector> - -#include <MsgTask.h> -#include <DataItemId.h> -#include <IOsObserver.h> -#include <loc_pla.h> -#include <log_util.h> -#include <LocUnorderedSetMap.h> - -namespace loc_core -{ -/****************************************************************************** - SystemStatusOsObserver -******************************************************************************/ -using namespace std; -using namespace loc_util; - -// Forward Declarations -class IDataItemCore; -class SystemStatus; -class SystemStatusOsObserver; -typedef map<IDataItemObserver*, list<DataItemId>> ObserverReqCache; -typedef LocUnorderedSetMap<IDataItemObserver*, DataItemId> ClientToDataItems; -typedef LocUnorderedSetMap<DataItemId, IDataItemObserver*> DataItemToClients; -typedef unordered_map<DataItemId, IDataItemCore*> DataItemIdToCore; -typedef unordered_map<DataItemId, int> DataItemIdToInt; - -struct ObserverContext { - IDataItemSubscription* mSubscriptionObj; - IFrameworkActionReq* mFrameworkActionReqObj; - const MsgTask* mMsgTask; - SystemStatusOsObserver* mSSObserver; - - inline ObserverContext(const MsgTask* msgTask, SystemStatusOsObserver* observer) : - mSubscriptionObj(NULL), mFrameworkActionReqObj(NULL), - mMsgTask(msgTask), mSSObserver(observer) {} -}; - -// Clients wanting to get data from OS/Framework would need to -// subscribe with OSObserver using IDataItemSubscription interface. -// Such clients would need to implement IDataItemObserver interface -// to receive data when it becomes available. -class SystemStatusOsObserver : public IOsObserver { - -public: - // ctor - inline SystemStatusOsObserver(SystemStatus* systemstatus, const MsgTask* msgTask) : - mSystemStatus(systemstatus), mContext(msgTask, this), - mAddress("SystemStatusOsObserver"), - mClientToDataItems(MAX_DATA_ITEM_ID), mDataItemToClients(MAX_DATA_ITEM_ID) -#ifdef USE_GLIB - , mBackHaulConnectReqCount(0) -#endif - { - } - - // dtor - ~SystemStatusOsObserver(); - - template <typename CINT, typename COUT> - static COUT containerTransfer(CINT& s); - template <typename CINT, typename COUT> - inline static COUT containerTransfer(CINT&& s) { - return containerTransfer<CINT, COUT>(s); - } - - // To set the subscription object - virtual void setSubscriptionObj(IDataItemSubscription* subscriptionObj); - - // To set the framework action request object - inline void setFrameworkActionReqObj(IFrameworkActionReq* frameworkActionReqObj) { - mContext.mFrameworkActionReqObj = frameworkActionReqObj; -#ifdef USE_GLIB - if (mBackHaulConnectReqCount > 0) { - connectBackhaul(); - mBackHaulConnectReqCount = 0; - } -#endif - } - - // IDataItemSubscription Overrides - inline virtual void subscribe(const list<DataItemId>& l, IDataItemObserver* client) override { - subscribe(l, client, false); - } - virtual void updateSubscription(const list<DataItemId>& l, IDataItemObserver* client) override; - inline virtual void requestData(const list<DataItemId>& l, IDataItemObserver* client) override { - subscribe(l, client, true); - } - virtual void unsubscribe(const list<DataItemId>& l, IDataItemObserver* client) override; - virtual void unsubscribeAll(IDataItemObserver* client) override; - - // IDataItemObserver Overrides - virtual void notify(const list<IDataItemCore*>& dlist) override; - inline virtual void getName(string& name) override { - name = mAddress; - } - - // IFrameworkActionReq Overrides - virtual void turnOn(DataItemId dit, int timeOut = 0) override; - virtual void turnOff(DataItemId dit) override; -#ifdef USE_GLIB - virtual bool connectBackhaul() override; - virtual bool disconnectBackhaul(); -#endif - -private: - SystemStatus* mSystemStatus; - ObserverContext mContext; - const string mAddress; - ClientToDataItems mClientToDataItems; - DataItemToClients mDataItemToClients; - DataItemIdToCore mDataItemCache; - DataItemIdToInt mActiveRequestCount; - - // Cache the subscribe and requestData till subscription obj is obtained - void cacheObserverRequest(ObserverReqCache& reqCache, - const list<DataItemId>& l, IDataItemObserver* client); -#ifdef USE_GLIB - // Cache the framework action request for connect/disconnect - int mBackHaulConnectReqCount; -#endif - - void subscribe(const list<DataItemId>& l, IDataItemObserver* client, bool toRequestData); - - // Helpers - void sendCachedDataItems(const unordered_set<DataItemId>& s, IDataItemObserver* to); - bool updateCache(IDataItemCore* d); - inline void logMe(const unordered_set<DataItemId>& l) { - IF_LOC_LOGD { - for (auto id : l) { - LOC_LOGD("DataItem %d", id); - } - } - } -}; - -} // namespace loc_core - -#endif //__SYSTEM_STATUS__ - diff --git a/gps/core/UlpProxyBase.h b/gps/core/UlpProxyBase.h deleted file mode 100644 index 8863b66..0000000 --- a/gps/core/UlpProxyBase.h +++ /dev/null @@ -1,124 +0,0 @@ -/* Copyright (c) 2013-2017, 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 <LocationAPI.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(const UlpLocation &location, - const GpsLocationExtended &locationExtended, - enum loc_sess_status status, - LocPosTechMask loc_technology_mask) { - (void)location; - (void)locationExtended; - (void)status; - (void)loc_technology_mask; - return false; - } - inline virtual bool reportSv(const GnssSvNotification& svNotify) { - (void)svNotify; - return false; - } - inline virtual bool reportSvMeasurement(GnssSvMeasurementSet &svMeasurementSet) { - (void)svMeasurementSet; - return false; - } - - inline virtual bool reportSvPolynomial(GnssSvPolynomial &svPolynomial) - { - (void)svPolynomial; - return false; - } - inline virtual bool reportStatus(LocGpsStatusValue status) { - - (void)status; - return false; - } - inline virtual void setAdapter(LocAdapterBase* adapter) { - - (void)adapter; - } - inline virtual void setCapabilities(unsigned long capabilities) { - - (void)capabilities; - } - inline virtual bool reportBatchingSession(const LocationOptions& options, bool active) - { - (void)options; - (void)active; - return false; - } - inline virtual bool reportPositions(const UlpLocation* ulpLocations, - const GpsLocationExtended* extendedLocations, - const uint32_t* techMasks, - const size_t count) - { - (void)ulpLocations; - (void)extendedLocations; - (void)techMasks; - (void)count; - return false; - } - inline virtual bool reportDeleteAidingData(LocGpsAidingData aidingData) - { - (void)aidingData; - return false; - } - inline virtual bool reportNmea(const char* nmea, int length) - { - (void)nmea; - (void)length; - return false; - } -}; - -} // namespace loc_core - -#endif // ULP_PROXY_BASE_H diff --git a/gps/core/configure.ac b/gps/core/configure.ac deleted file mode 100644 index ea0a128..0000000 --- a/gps/core/configure.ac +++ /dev/null @@ -1,82 +0,0 @@ -# configure.ac -- Autoconf script for gps loc-core -# -# 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-hal package version 1.0.0 -AC_INIT([loc-core],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([loc-core.pc.in]) -# 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([GPSUTILS], [gps-utils]) -AC_SUBST([GPSUTILS_CFLAGS]) -AC_SUBST([GPSUTILS_LIBS]) - -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_ARG_WITH([locpla_includes], - AC_HELP_STRING([--with-locpla-includes=@<:@dir@:>@], - [specify the path to locpla-includes in loc-pla_git.bb]), - [locpla_incdir=$withval], - with_locpla_includes=no) - -if test "x$with_locpla_includes" != "xno"; then - AC_SUBST(LOCPLA_CFLAGS, "-I${locpla_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 \ - loc-core.pc \ - ]) - -AC_OUTPUT diff --git a/gps/core/data-items/DataItemConcreteTypesBase.h b/gps/core/data-items/DataItemConcreteTypesBase.h deleted file mode 100644 index bcb8d72..0000000 --- a/gps/core/data-items/DataItemConcreteTypesBase.h +++ /dev/null @@ -1,496 +0,0 @@ -/* Copyright (c) 2015-2017, 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 __DATAITEMCONCRETEBASETYPES__ -#define __DATAITEMCONCRETEBASETYPES__ - -#include <string> -#include <cstring> -#include <DataItemId.h> -#include <IDataItemCore.h> - -#define MAC_ADDRESS_LENGTH 6 -// MAC address length in bytes -// QMI_LOC_SRN_MAC_ADDR_LENGTH_V02 -#define SRN_MAC_ADDRESS_LENGTH 6 -#define WIFI_SUPPLICANT_DEFAULT_STATE 0 - -namespace loc_core -{ -using namespace std; - -class AirplaneModeDataItemBase : public IDataItemCore { -public: - AirplaneModeDataItemBase(bool mode): - mMode(mode), - mId(AIRPLANEMODE_DATA_ITEM_ID) {} - virtual ~AirplaneModeDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -// Data members - bool mMode; - -protected: - DataItemId mId; -}; - -class ENHDataItemBase : public IDataItemCore { -public: - ENHDataItemBase(bool enabled) : - mEnabled(enabled), - mId(ENH_DATA_ITEM_ID) {} - virtual ~ENHDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -// Data members - bool mEnabled; -protected: - DataItemId mId; -}; - -class GPSStateDataItemBase : public IDataItemCore { -public: - GPSStateDataItemBase(bool enabled) : - mEnabled(enabled), - mId(GPSSTATE_DATA_ITEM_ID) {} - virtual ~GPSStateDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -// Data members - bool mEnabled; -protected: - DataItemId mId; -}; - -class NLPStatusDataItemBase : public IDataItemCore { -public: - NLPStatusDataItemBase(bool enabled) : - mEnabled(enabled), - mId(NLPSTATUS_DATA_ITEM_ID) {} - virtual ~NLPStatusDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -// Data members - bool mEnabled; -protected: - DataItemId mId; -}; - -class WifiHardwareStateDataItemBase : public IDataItemCore { -public: - WifiHardwareStateDataItemBase(bool enabled) : - mEnabled(enabled), - mId(WIFIHARDWARESTATE_DATA_ITEM_ID) {} - virtual ~WifiHardwareStateDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -// Data members - bool mEnabled; -protected: - DataItemId mId; -}; - -class ScreenStateDataItemBase : public IDataItemCore { -public: - ScreenStateDataItemBase(bool state) : - mState(state), - mId(SCREEN_STATE_DATA_ITEM_ID) {} - virtual ~ScreenStateDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -// Data members - bool mState; -protected: - DataItemId mId; -}; - -class PowerConnectStateDataItemBase : public IDataItemCore { -public: - PowerConnectStateDataItemBase(bool state) : - mState(state), - mId(POWER_CONNECTED_STATE_DATA_ITEM_ID) {} - virtual ~PowerConnectStateDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -// Data members - bool mState; -protected: - DataItemId mId; -}; - -class TimeZoneChangeDataItemBase : public IDataItemCore { -public: - TimeZoneChangeDataItemBase(int64_t currTimeMillis, int32_t rawOffset, int32_t dstOffset) : - mCurrTimeMillis (currTimeMillis), - mRawOffsetTZ (rawOffset), - mDstOffsetTZ (dstOffset), - mId(TIMEZONE_CHANGE_DATA_ITEM_ID) {} - virtual ~TimeZoneChangeDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -// Data members - int64_t mCurrTimeMillis; - int32_t mRawOffsetTZ; - int32_t mDstOffsetTZ; -protected: - DataItemId mId; -}; - -class TimeChangeDataItemBase : public IDataItemCore { -public: - TimeChangeDataItemBase(int64_t currTimeMillis, int32_t rawOffset, int32_t dstOffset) : - mCurrTimeMillis (currTimeMillis), - mRawOffsetTZ (rawOffset), - mDstOffsetTZ (dstOffset), - mId(TIME_CHANGE_DATA_ITEM_ID) {} - virtual ~TimeChangeDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -// Data members - int64_t mCurrTimeMillis; - int32_t mRawOffsetTZ; - int32_t mDstOffsetTZ; -protected: - DataItemId mId; -}; - -class ShutdownStateDataItemBase : public IDataItemCore { -public: - ShutdownStateDataItemBase(bool state) : - mState (state), - mId(SHUTDOWN_STATE_DATA_ITEM_ID) {} - virtual ~ShutdownStateDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -// Data members - bool mState; -protected: - DataItemId mId; -}; - -class AssistedGpsDataItemBase : public IDataItemCore { -public: - AssistedGpsDataItemBase(bool enabled) : - mEnabled(enabled), - mId(ASSISTED_GPS_DATA_ITEM_ID) {} - virtual ~AssistedGpsDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -// Data members - bool mEnabled; -protected: - DataItemId mId; -}; - -class NetworkInfoDataItemBase : public IDataItemCore { -public: - enum NetworkType { - TYPE_MOBILE, - TYPE_WIFI, - TYPE_ETHERNET, - TYPE_BLUETOOTH, - TYPE_MMS, - TYPE_SUPL, - TYPE_DUN, - TYPE_HIPRI, - TYPE_WIMAX, - TYPE_UNKNOWN, - }; - NetworkInfoDataItemBase( - NetworkType initialType, int32_t type, string typeName, string subTypeName, - bool available, bool connected, bool roaming ): - mAllTypes(typeToAllTypes(initialType)), - mType(type), - mTypeName(typeName), - mSubTypeName(subTypeName), - mAvailable(available), - mConnected(connected), - mRoaming(roaming), - mId(NETWORKINFO_DATA_ITEM_ID) {} - virtual ~NetworkInfoDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} - inline virtual NetworkType getType(void) const { - return (NetworkType)mType; - } - inline uint64_t getAllTypes() { return mAllTypes; } - // Data members - uint64_t mAllTypes; - int32_t mType; - string mTypeName; - string mSubTypeName; - bool mAvailable; - bool mConnected; - bool mRoaming; -protected: - DataItemId mId; - inline uint64_t typeToAllTypes(NetworkType type) { - return (type >= TYPE_UNKNOWN || type < TYPE_MOBILE) ? 0 : (1<<type); - } -}; - -class ServiceStatusDataItemBase : public IDataItemCore { -public: - ServiceStatusDataItemBase(int32_t serviceState) : - mServiceState (serviceState), - mId(SERVICESTATUS_DATA_ITEM_ID) {} - virtual ~ServiceStatusDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -// Data members - int32_t mServiceState; -protected: - DataItemId mId; -}; - -class ModelDataItemBase : public IDataItemCore { -public: - ModelDataItemBase(const string & name) : - mModel (name), - mId(MODEL_DATA_ITEM_ID) {} - virtual ~ModelDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -// Data members - string mModel; -protected: - DataItemId mId; -}; - -class ManufacturerDataItemBase : public IDataItemCore { -public: - ManufacturerDataItemBase(const string & name) : - mManufacturer (name), - mId(MANUFACTURER_DATA_ITEM_ID) {} - virtual ~ManufacturerDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -// Data members - string mManufacturer; -protected: - DataItemId mId; -}; - -class RilServiceInfoDataItemBase : public IDataItemCore { -public: - inline RilServiceInfoDataItemBase() : - mData(nullptr), mId(RILSERVICEINFO_DATA_ITEM_ID) {} - inline virtual ~RilServiceInfoDataItemBase() { if (nullptr != mData) free(mData); } - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} - inline RilServiceInfoDataItemBase(const RilServiceInfoDataItemBase& peer) : - RilServiceInfoDataItemBase() { - peer.setPeerData(*this); - } - inline virtual bool operator==(const RilServiceInfoDataItemBase& other) const { - return other.mData == mData; - } - inline virtual void setPeerData(RilServiceInfoDataItemBase& /*peer*/) const {} - void* mData; -protected: - DataItemId mId; -}; - -class RilCellInfoDataItemBase : public IDataItemCore { -public: - inline RilCellInfoDataItemBase() : - mData(nullptr), mId(RILCELLINFO_DATA_ITEM_ID) {} - inline virtual ~RilCellInfoDataItemBase() { if (nullptr != mData) free(mData); } - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} - inline RilCellInfoDataItemBase(const RilCellInfoDataItemBase& peer) : - RilCellInfoDataItemBase() { - peer.setPeerData(*this); - } - inline virtual bool operator==(const RilCellInfoDataItemBase& other) const { - return other.mData == mData; - } - inline virtual void setPeerData(RilCellInfoDataItemBase& /*peer*/) const {} - void* mData; -protected: - DataItemId mId; -}; - -class WifiSupplicantStatusDataItemBase : public IDataItemCore { -public: - WifiSupplicantStatusDataItemBase() : - mState((WifiSupplicantState)WIFI_SUPPLICANT_DEFAULT_STATE), - mApMacAddressValid(false), - mWifiApSsidValid(false), - mId(WIFI_SUPPLICANT_STATUS_DATA_ITEM_ID) { - memset (&mApMacAddress, 0, sizeof (mApMacAddress)); - mWifiApSsid.clear(); - } - virtual ~WifiSupplicantStatusDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} - // Data members - typedef enum WifiSupplicantState { - DISCONNECTED, - INTERFACE_DISABLED, - INACTIVE, - SCANNING, - AUTHENTICATING, - ASSOCIATING, - ASSOCIATED, - FOUR_WAY_HANDSHAKE, - GROUP_HANDSHAKE, - COMPLETED, - DORMANT, - UNINITIALIZED, - INVALID - } WifiSupplicantState; - /* Represents whether access point attach state*/ - WifiSupplicantState mState; - /* Represents info on whether ap mac address is valid */ - bool mApMacAddressValid; - /* Represents mac address of the wifi access point*/ - uint8_t mApMacAddress[MAC_ADDRESS_LENGTH]; - /* Represents info on whether ap SSID is valid */ - bool mWifiApSsidValid; - /* Represents Wifi SSID string*/ - string mWifiApSsid; -protected: - DataItemId mId; -}; - -class TacDataItemBase : public IDataItemCore { -public: - TacDataItemBase(const string & name) : - mValue (name), - mId(TAC_DATA_ITEM_ID) {} - virtual ~TacDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -// Data members - string mValue; -protected: - DataItemId mId; -}; - -class MccmncDataItemBase : public IDataItemCore { -public: - MccmncDataItemBase(const string & name) : - mValue(name), - mId(MCCMNC_DATA_ITEM_ID) {} - virtual ~MccmncDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -// Data members - string mValue; -protected: - DataItemId mId; -}; - -class SrnDeviceScanDetailsDataItemBase : public IDataItemCore { -public: - SrnDeviceScanDetailsDataItemBase(DataItemId Id) : - mValidSrnData(false), - mApSrnRssi(-1), - mApSrnTimestamp(0), - mRequestTimestamp(0), - mReceiveTimestamp(0), - mErrorCause(-1), - mId(Id) {} - virtual ~SrnDeviceScanDetailsDataItemBase() {} - inline virtual DataItemId getId() { return mId; } - // Data members common to all SRN tech types - /* Represents info on whether SRN data is valid (no error)*/ - bool mValidSrnData; - /* SRN device RSSI reported */ - int32_t mApSrnRssi; - /* MAC adress of SRN device */ - uint8_t mApSrnMacAddress[SRN_MAC_ADDRESS_LENGTH]; - /* UTC timestamp at which the scan was requested.for this SRN device*/ - int64_t mApSrnTimestamp; - /* UTC timestamp at which the scan was started. */ - int64_t mRequestTimestamp; - /* UTC timestamp at which the scan was received.*/ - int64_t mReceiveTimestamp; - /* Reason for the error/failure if SRN details are not valid */ - int32_t mErrorCause; -protected: - DataItemId mId; -}; - -class BtDeviceScanDetailsDataItemBase : public SrnDeviceScanDetailsDataItemBase { - -public: - BtDeviceScanDetailsDataItemBase() : - SrnDeviceScanDetailsDataItemBase(BT_SCAN_DATA_ITEM_ID) {} - virtual ~BtDeviceScanDetailsDataItemBase() {} - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -}; - -class BtLeDeviceScanDetailsDataItemBase : public SrnDeviceScanDetailsDataItemBase { - -public: - BtLeDeviceScanDetailsDataItemBase() : - SrnDeviceScanDetailsDataItemBase(BTLE_SCAN_DATA_ITEM_ID) {} - virtual ~BtLeDeviceScanDetailsDataItemBase() {} - virtual void stringify(string& /*valueStr*/) {} - virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} -}; - -class BatteryLevelDataItemBase : public IDataItemCore { -public: - inline BatteryLevelDataItemBase(uint8_t batteryPct) : - mBatteryPct(batteryPct), mId(BATTERY_LEVEL_DATA_ITEM_ID) {} - inline ~BatteryLevelDataItemBase() {} - inline virtual DataItemId getId() { return mId; } -// Data members - uint8_t mBatteryPct; -protected: - DataItemId mId; -}; - -} // namespace loc_core - -#endif //__DATAITEMCONCRETEBASETYPES__ diff --git a/gps/core/data-items/DataItemId.h b/gps/core/data-items/DataItemId.h deleted file mode 100644 index 1661be6..0000000 --- a/gps/core/data-items/DataItemId.h +++ /dev/null @@ -1,79 +0,0 @@ -/* Copyright (c) 2015-2017 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 __DATAITEMID_H__ -#define __DATAITEMID_H__ - -/** - * Enumeration of Data Item types - * When add/remove/update changes are made to Data Items, this file needs to be updated - * accordingly - */ -typedef enum e_DataItemId { - INVALID_DATA_ITEM_ID = -1, - // 0 - 4 - AIRPLANEMODE_DATA_ITEM_ID, - ENH_DATA_ITEM_ID, - GPSSTATE_DATA_ITEM_ID, - NLPSTATUS_DATA_ITEM_ID, - WIFIHARDWARESTATE_DATA_ITEM_ID, - // 5 - 9 - NETWORKINFO_DATA_ITEM_ID, - RILVERSION_DATA_ITEM_ID, - RILSERVICEINFO_DATA_ITEM_ID, - RILCELLINFO_DATA_ITEM_ID, - SERVICESTATUS_DATA_ITEM_ID, - // 10 - 14 - MODEL_DATA_ITEM_ID, - MANUFACTURER_DATA_ITEM_ID, - VOICECALL_DATA_ITEM, - ASSISTED_GPS_DATA_ITEM_ID, - SCREEN_STATE_DATA_ITEM_ID, - // 15 - 19 - POWER_CONNECTED_STATE_DATA_ITEM_ID, - TIMEZONE_CHANGE_DATA_ITEM_ID, - TIME_CHANGE_DATA_ITEM_ID, - WIFI_SUPPLICANT_STATUS_DATA_ITEM_ID, - SHUTDOWN_STATE_DATA_ITEM_ID, - // 20 - 24 - TAC_DATA_ITEM_ID, - MCCMNC_DATA_ITEM_ID, - BTLE_SCAN_DATA_ITEM_ID, - BT_SCAN_DATA_ITEM_ID, - OEM_GTP_UPLOAD_TRIGGER_READY_ITEM_ID, - - MAX_DATA_ITEM_ID, - - // 26 - - BATTERY_LEVEL_DATA_ITEM_ID, - - MAX_DATA_ITEM_ID_1_1, -} DataItemId; - -#endif // #ifndef __DATAITEMID_H__ diff --git a/gps/core/data-items/DataItemsFactoryProxy.cpp b/gps/core/data-items/DataItemsFactoryProxy.cpp deleted file mode 100644 index f8a5e03..0000000 --- a/gps/core/data-items/DataItemsFactoryProxy.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright (c) 2017, 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_TAG "DataItemsFactoryProxy" - -#include <dlfcn.h> -#include <DataItemId.h> -#include <IDataItemCore.h> -#include <DataItemsFactoryProxy.h> -#include <loc_pla.h> -#include <log_util.h> - -namespace loc_core -{ -void* DataItemsFactoryProxy::dataItemLibHandle = NULL; -get_concrete_data_item_fn* DataItemsFactoryProxy::getConcreteDIFunc = NULL; - -IDataItemCore* DataItemsFactoryProxy::createNewDataItem(DataItemId id) -{ - IDataItemCore *mydi = nullptr; - - if (NULL != getConcreteDIFunc) { - mydi = (*getConcreteDIFunc)(id); - } - else { - // first call to this function, symbol not yet loaded - if (NULL == dataItemLibHandle) { - LOC_LOGD("Loaded library %s",DATA_ITEMS_LIB_NAME); - dataItemLibHandle = dlopen(DATA_ITEMS_LIB_NAME, RTLD_NOW); - if (NULL == dataItemLibHandle) { - // dlopen failed. - const char * err = dlerror(); - if (NULL == err) - { - err = "Unknown"; - } - LOC_LOGE("%s:%d]: failed to load library %s; error=%s", - __func__, __LINE__, DATA_ITEMS_LIB_NAME, err); - } - } - - // load sym - if dlopen handle is obtained and symbol is not yet obtained - if (NULL != dataItemLibHandle) { - getConcreteDIFunc = (get_concrete_data_item_fn * ) - dlsym(dataItemLibHandle, DATA_ITEMS_GET_CONCRETE_DI); - if (NULL != getConcreteDIFunc) { - LOC_LOGD("Loaded function %s : %p",DATA_ITEMS_GET_CONCRETE_DI,getConcreteDIFunc); - mydi = (*getConcreteDIFunc)(id); - } - else { - // dlysm failed. - const char * err = dlerror(); - if (NULL == err) - { - err = "Unknown"; - } - LOC_LOGE("%s:%d]: failed to find symbol %s; error=%s", - __func__, __LINE__, DATA_ITEMS_GET_CONCRETE_DI, err); - } - } - } - return mydi; -} - -void DataItemsFactoryProxy::closeDataItemLibraryHandle() -{ - if (NULL != dataItemLibHandle) { - dlclose(dataItemLibHandle); - dataItemLibHandle = NULL; - } -} - -} // namespace loc_core - - diff --git a/gps/core/data-items/DataItemsFactoryProxy.h b/gps/core/data-items/DataItemsFactoryProxy.h deleted file mode 100644 index cfd447d..0000000 --- a/gps/core/data-items/DataItemsFactoryProxy.h +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (c) 2017, 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 __DATAITEMFACTORYBASE__ -#define __DATAITEMFACTORYBASE__ - -#include <DataItemId.h> -#include <IDataItemCore.h> - -namespace loc_core -{ - -#define DATA_ITEMS_LIB_NAME "libdataitems.so" -#define DATA_ITEMS_GET_CONCRETE_DI "getConcreteDataItem" - -typedef IDataItemCore * (get_concrete_data_item_fn)(DataItemId); - -class DataItemsFactoryProxy { -public: - static IDataItemCore* createNewDataItem(DataItemId id); - static void closeDataItemLibraryHandle(); - static void *dataItemLibHandle; - static get_concrete_data_item_fn *getConcreteDIFunc; -}; - -} // namespace loc_core - -#endif //__DATAITEMFACTORYBASE__ - diff --git a/gps/core/data-items/IDataItemCore.h b/gps/core/data-items/IDataItemCore.h deleted file mode 100644 index 6084c92..0000000 --- a/gps/core/data-items/IDataItemCore.h +++ /dev/null @@ -1,82 +0,0 @@ -/* Copyright (c) 2015, 2017 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 __IDATAITEMCORE_H__ -#define __IDATAITEMCORE_H__ - -#include <string> -#include <DataItemId.h> - -namespace loc_core { - -using namespace std; - -/** - * @brief IDataItemCore interface. - * @details IDataItemCore interface. - * - */ -class IDataItemCore { -public: - /** - * @brief Gets Data item id. - * @details Gets Data item id. - * @return Data item id. - */ - virtual DataItemId getId () = 0; - - /** - * @brief Stringify. - * @details Stringify. - * - * @param valueStr Reference to string. - */ - virtual void stringify (string & valueStr) = 0; - - /** - * @brief copy. - * @details copy. - * - * @param src Where to copy from. - * @param dataItemCopied Boolean flag indicated whether or not copied. - * - * @return Zero for success or non zero for failure. - */ - virtual int32_t copy (IDataItemCore * src, bool *dataItemCopied = nullptr) = 0; - - /** - * @brief Destructor. - * @details Destructor. - */ - virtual ~IDataItemCore () {} -}; - -} // namespace loc_core - -#endif // __IDATAITEMCORE_H__ diff --git a/gps/core/loc-core.pc.in b/gps/core/loc-core.pc.in deleted file mode 100644 index 76b514c..0000000 --- a/gps/core/loc-core.pc.in +++ /dev/null @@ -1,10 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: loc-core -Description: QTI GPS Loc Core -Version: @VERSION@ -Libs: -L${libdir} -lloc_core -Cflags: -I${includedir}/loc-core diff --git a/gps/core/loc_core_log.cpp b/gps/core/loc_core_log.cpp deleted file mode 100644 index 67d68f0..0000000 --- a/gps/core/loc_core_log.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/* 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_NDEBUG 0 -#define LOG_TAG "LocSvc_core_log" - -#include <log_util.h> -#include <loc_log.h> -#include <loc_core_log.h> -#include <loc_pla.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( LOC_GPS_STATUS_NONE ), - NAME_VAL( LOC_GPS_STATUS_SESSION_BEGIN ), - NAME_VAL( LOC_GPS_STATUS_SESSION_END ), - NAME_VAL( LOC_GPS_STATUS_ENGINE_ON ), - NAME_VAL( LOC_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(LocGpsStatusValue 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(LocGpsPositionMode 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( LOC_GPS_POSITION_RECURRENCE_PERIODIC ), - NAME_VAL( LOC_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(LocGpsPositionRecurrence recur) -{ - return loc_get_name_from_val(loc_eng_position_recurrences, loc_eng_position_recurrence_num, (long) recur); -} - -const char* loc_get_aiding_data_mask_names(LocGpsAidingData /*data*/) -{ - return NULL; -} - - -static const loc_name_val_s_type loc_eng_agps_types[] = -{ - NAME_VAL( LOC_AGPS_TYPE_INVALID ), - NAME_VAL( LOC_AGPS_TYPE_ANY ), - NAME_VAL( LOC_AGPS_TYPE_SUPL ), - NAME_VAL( LOC_AGPS_TYPE_C2K ), - NAME_VAL( LOC_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(LocAGpsType 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( LOC_GPS_NI_TYPE_VOICE ), - NAME_VAL( LOC_GPS_NI_TYPE_UMTS_SUPL ), - NAME_VAL( LOC_GPS_NI_TYPE_UMTS_CTRL_PLANE ), - NAME_VAL( LOC_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(LocGpsNiType 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( LOC_GPS_NI_RESPONSE_ACCEPT ), - NAME_VAL( LOC_GPS_NI_RESPONSE_DENY ), - NAME_VAL( LOC_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(LocGpsUserResponseType 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( LOC_GPS_ENC_NONE ), - NAME_VAL( LOC_GPS_ENC_SUPL_GSM_DEFAULT ), - NAME_VAL( LOC_GPS_ENC_SUPL_UTF8 ), - NAME_VAL( LOC_GPS_ENC_SUPL_UCS2 ), - NAME_VAL( LOC_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(LocGpsNiEncodingType 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( LOC_GPS_REQUEST_AGPS_DATA_CONN ), - NAME_VAL( LOC_GPS_RELEASE_AGPS_DATA_CONN ), - NAME_VAL( LOC_GPS_AGPS_DATA_CONNECTED ), - NAME_VAL( LOC_GPS_AGPS_DATA_CONN_DONE ), - NAME_VAL( LOC_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(LocAGpsStatusValue status) -{ - return loc_get_name_from_val(loc_eng_agps_status_names, loc_eng_agps_status_num, (long) status); -} diff --git a/gps/core/loc_core_log.h b/gps/core/loc_core_log.h deleted file mode 100644 index 2beb687..0000000 --- a/gps/core/loc_core_log.h +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (c) 2011-2013, 2016-2017 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 - -#include <ctype.h> -#include <gps_extended.h> - -#ifdef __cplusplus -extern "C" -{ -#endif - -const char* loc_get_gps_status_name(LocGpsStatusValue gps_status); -const char* loc_get_position_mode_name(LocGpsPositionMode mode); -const char* loc_get_position_recurrence_name(LocGpsPositionRecurrence recur); -const char* loc_get_aiding_data_mask_names(LocGpsAidingData data); -const char* loc_get_agps_type_name(LocAGpsType type); -const char* loc_get_ni_type_name(LocGpsNiType type); -const char* loc_get_ni_response_name(LocGpsUserResponseType response); -const char* loc_get_ni_encoding_name(LocGpsNiEncodingType 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(LocAGpsStatusValue status); - -#ifdef __cplusplus -} -#endif - -#endif /* LOC_CORE_LOG_H */ diff --git a/gps/core/observer/IDataItemObserver.h b/gps/core/observer/IDataItemObserver.h deleted file mode 100644 index 7954d85..0000000 --- a/gps/core/observer/IDataItemObserver.h +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright (c) 2015, 2017 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 __IDATAITEMOBSERVER_H__ -#define __IDATAITEMOBSERVER_H__ - -#include <list> -#include <string> - -using namespace std; - -namespace loc_core -{ -class IDataItemCore; - -/** - * @brief IDataItemObserver interface - * @details IDataItemObserver interface; - * In OS dependent code this type serves as a handle to an OS independent instance of this interface. - */ -class IDataItemObserver { - -public: - - /** - * @brief Gets name of Data Item Observer - * @details Gets name of Data Item Observer - * - * @param name reference to name of Data Item Observer - */ - virtual void getName (string & name) = 0; - - /** - * @brief Notify updated values of Data Items - * @details Notifys updated values of Data items - * - * @param dlist List of updated data items - */ - virtual void notify (const std :: list <IDataItemCore *> & dlist) = 0; - - /** - * @brief Destructor - * @details Destructor - */ - virtual ~IDataItemObserver () {} -}; - -} // namespace loc_core - -#endif // #ifndef __IDATAITEMOBSERVER_H__ diff --git a/gps/core/observer/IDataItemSubscription.h b/gps/core/observer/IDataItemSubscription.h deleted file mode 100644 index 7e8b8c8..0000000 --- a/gps/core/observer/IDataItemSubscription.h +++ /dev/null @@ -1,129 +0,0 @@ -/* Copyright (c) 2015, 2017 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 __IDATAITEMSUBSCRIPTION_H__ -#define __IDATAITEMSUBSCRIPTION_H__ - -#include <list> -#include <DataItemId.h> - -namespace loc_core -{ -class IDataItemObserver; - -/** - * @brief IDataItemSubscription interface - * @details IDataItemSubscription interface; - * Defines an interface for operations such as subscribe, - * unsubscribe data items by their IDs. - * Must be implemented by OS dependent code. - */ -class IDataItemSubscription { - -public: - /** - * @brief Subscribe for data items by their IDs - * @details Subscribe for data items by their IDs; - * An IDataItemObserver implementer invokes this method to subscribe - * for a list of DataItems by passing in their Ids. - * A symbolic invocation of this method in the following order - * subscribe ( {1,2,3}, &obj), subscribe ( {2,3,4,5}, &obj) - * where the numbers enclosed in braces indicate a list of data item Ids - * will cause this class implementer to update its subscription list for - * &obj to only contain the following Data Item Ids 1,2,3,4,5. - * - * @param l List of DataItemId - * @param o Pointer to an instance of IDataItemObserver - */ - virtual void subscribe (const std :: list <DataItemId> & l, IDataItemObserver * o = NULL) = 0; - - /** - * @brief Update subscription for Data items - * @details Update subscription for Data items; - * An IDataItemObserver implementer invokes this method to update their - * subscription for a list of DataItems by passing in their Ids - * A symbolic invocation of this method in the following order - * updateSubscription ( {1,2,3}, &obj),updateSubscription ( {2,3,4,5}, &obj) - * where the numbers enclosed in braces indicate a list of data item Ids - * will cause this class implementer to update its subscription list for - * &obj to only contain the following Data Item Ids 2,3,4,5. - * Note that this method may or may not be called. - * - * @param l List of DataItemId - * @param o Pointer to an instance of IDataItemObserver - */ - virtual void updateSubscription (const std :: list <DataItemId> & l, IDataItemObserver * o = NULL) = 0; - - /** - * @brief Request Data - * @details Request Data - * - * @param l List of DataItemId - * @param o Pointer to an instance of IDataItemObserver - */ - virtual void requestData (const std :: list <DataItemId> & l, IDataItemObserver * o = NULL) = 0; - - /** - * @brief Unsubscribe Data items - * @details Unsubscrbe Data items; - * An IDataItemObserver implementer invokes this method to unsubscribe their - * subscription for a list of DataItems by passing in their Ids - * Suppose this class implementor has a currently active subscription list - * containing 1,2,3,4,5,6,7 for &obj then a symbolic invocation of this - * method in the following order - * unsubscribe ( {1,2,3}, &obj), unsubscribe ( {1,2,3,4}, &obj), - * unsubscribe ( {7}, &obj) - * where the numbers enclosed in braces indicate a list of data item Ids - * will cause this class implementer to update its subscription list for - * &obj to only contain the following data item id 5,6. - * - * @param l List of DataItemId - * @param o Pointer to an instance of IDataItemObserver - */ - virtual void unsubscribe (const std :: list <DataItemId> & l, IDataItemObserver * o = NULL) = 0; - - /** - * @brief Unsubscribe all data items - * @details Unsubscribe all data items - * - * @param o Pointer to an instance of IDataItemObserver - */ - virtual void unsubscribeAll (IDataItemObserver * o = NULL) = 0; - - /** - * @brief Destructor - * @details Destructor - */ - virtual ~IDataItemSubscription () {} -}; - -} // namespace loc_core - -#endif // #ifndef __IDATAITEMSUBSCRIPTION_H__ - diff --git a/gps/core/observer/IFrameworkActionReq.h b/gps/core/observer/IFrameworkActionReq.h deleted file mode 100644 index 4be947f..0000000 --- a/gps/core/observer/IFrameworkActionReq.h +++ /dev/null @@ -1,101 +0,0 @@ -/* Copyright (c) 2017 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 __IFRAMEWORKACTIONREQ_H__ -#define __IFRAMEWORKACTIONREQ_H__ - -#include <DataItemId.h> - -namespace loc_core -{ - -/** - * @brief IFrameworkActionReq interface - * @details IFrameworkActionReq interface; - * Defines an interface for operations such as turnOn, turnOff a - * framework module described by the data item. Framework module - * could be bluetooth, wifi etc. - * Must be implemented by OS dependent code. - * - */ -class IFrameworkActionReq { - -public: - /** - * @brief Turn on the framework module described by the data item. - * @details Turn on the framework module described by the data item; - * An IFrameworkActionReq implementer invokes this method to - * turn on the framework module described by the data item. - * Framework module could be bluetooth, wifi etc. - * - * @param dit DataItemId - * @param timeout Timeout after which to turn off the framework module. - */ - virtual void turnOn (DataItemId dit, int timeOut = 0) = 0; - - /** - * @brief Turn off the framework module described by the data item. - * @details Turn off the framework module described by the data item; - * An IFrameworkActionReq implementer invokes this method to - * turn off the framework module described by the data item. - * Framework module could be bluetooth, wifi etc. - * - * @param dit DataItemId - */ - virtual void turnOff (DataItemId dit) = 0; - -#ifdef USE_GLIB - /** - * @brief Setup WWAN backhaul - * @details Setup WWAN backhaul - * - * @param None - */ - virtual bool connectBackhaul() = 0; - - /** - * @brief Disconnects the WWANbackhaul - * @details Disconnects the WWANbackhaul, only if it was setup by us - * - * @param None - */ - virtual bool disconnectBackhaul() = 0; -#endif - - /** - * @brief Destructor - * @details Destructor - */ - virtual ~IFrameworkActionReq () {} -}; - -} // namespace loc_core - -#endif // #ifndef __IFRAMEWORKACTIONREQ_H__ - diff --git a/gps/core/observer/IOsObserver.h b/gps/core/observer/IOsObserver.h deleted file mode 100644 index 40d7671..0000000 --- a/gps/core/observer/IOsObserver.h +++ /dev/null @@ -1,107 +0,0 @@ -/* Copyright (c) 2017, 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 __IOSOBSERVER_H__ -#define __IOSOBSERVER_H__ - -#include <list> -#include <string> -#include <IDataItemObserver.h> -#include <IDataItemSubscription.h> -#include <IFrameworkActionReq.h> - -using namespace std; - -namespace loc_core -{ - -/** - * @brief IOsObserver interface - * @details IOsObserver interface; - * In OS dependent code this type serves as a handle to - * an OS independent instance of this interface. - */ -class IOsObserver : - public IDataItemObserver, - public IDataItemSubscription, - public IFrameworkActionReq { - -public: - - // To set the subscription object - virtual void setSubscriptionObj(IDataItemSubscription *subscriptionObj) = 0; - - // To set the framework action request object - virtual void setFrameworkActionReqObj(IFrameworkActionReq *frameworkActionReqObj) = 0; - - // IDataItemObserver Overrides - inline virtual void getName (string & /*name*/) {} - inline virtual void notify (const std::list <IDataItemCore *> & /*dlist*/) {} - - // IDataItemSubscription Overrides - inline virtual void subscribe - ( - const std :: list <DataItemId> & /*l*/, - IDataItemObserver * /*client*/ - ){} - inline virtual void updateSubscription - ( - const std :: list <DataItemId> & /*l*/, - IDataItemObserver * /*client*/ - ){} - inline virtual void requestData - ( - const std :: list <DataItemId> & /*l*/, - IDataItemObserver * /*client*/ - ){} - inline virtual void unsubscribe - ( - const std :: list <DataItemId> & /*l*/, - IDataItemObserver * /*client*/ - ){} - inline virtual void unsubscribeAll (IDataItemObserver * /*client*/){} - - // IFrameworkActionReq Overrides - inline virtual void turnOn (DataItemId /*dit*/, int /*timeOut*/){} - inline virtual void turnOff (DataItemId /*dit*/) {} -#ifdef USE_GLIB - inline virtual bool connectBackhaul() {} - inline virtual bool disconnectBackhaul() {} -#endif - - /** - * @brief Destructor - * @details Destructor - */ - virtual ~IOsObserver () {} -}; - -} // namespace loc_core - -#endif // #ifndef __IOSOBSERVER_H__ diff --git a/gps/gnss/Agps.cpp b/gps/gnss/Agps.cpp deleted file mode 100644 index 6ce0c34..0000000 --- a/gps/gnss/Agps.cpp +++ /dev/null @@ -1,912 +0,0 @@ -/* Copyright (c) 2012-2017, 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_TAG "LocSvc_Agps" - -#include <Agps.h> -#include <loc_pla.h> -#include <ContextBase.h> -#include <loc_timer.h> - -/* -------------------------------------------------------------------- - * AGPS State Machine Methods - * -------------------------------------------------------------------*/ -void AgpsStateMachine::processAgpsEvent(AgpsEvent event){ - - LOC_LOGD("processAgpsEvent(): SM %p, Event %d, State %d", - this, event, mState); - - switch (event) { - - case AGPS_EVENT_SUBSCRIBE: - processAgpsEventSubscribe(); - break; - - case AGPS_EVENT_UNSUBSCRIBE: - processAgpsEventUnsubscribe(); - break; - - case AGPS_EVENT_GRANTED: - processAgpsEventGranted(); - break; - - case AGPS_EVENT_RELEASED: - processAgpsEventReleased(); - break; - - case AGPS_EVENT_DENIED: - processAgpsEventDenied(); - break; - - default: - LOC_LOGE("Invalid Loc Agps Event"); - } -} - -void AgpsStateMachine::processAgpsEventSubscribe(){ - - switch (mState) { - - case AGPS_STATE_RELEASED: - /* Add subscriber to list - * No notifications until we get RSRC_GRANTED */ - addSubscriber(mCurrentSubscriber); - - /* Send data request - * The if condition below 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 (requestOrReleaseDataConn(true) == 0) { - // If data request successful, move to pending state - transitionState(AGPS_STATE_PENDING); - } - break; - - case AGPS_STATE_PENDING: - /* Already requested for data connection, - * do nothing until we get RSRC_GRANTED event; - * Just add this subscriber to the list, for notifications */ - addSubscriber(mCurrentSubscriber); - break; - - case AGPS_STATE_ACQUIRED: - /* We already have the data connection setup, - * Notify current subscriber with GRANTED event, - * And add it to the subscriber list for further notifications. */ - notifyEventToSubscriber(AGPS_EVENT_GRANTED, mCurrentSubscriber, false); - addSubscriber(mCurrentSubscriber); - break; - - case AGPS_STATE_RELEASING: - addSubscriber(mCurrentSubscriber); - break; - - default: - LOC_LOGE("Invalid state: %d", mState); - } -} - -void AgpsStateMachine::processAgpsEventUnsubscribe(){ - - switch (mState) { - - case AGPS_STATE_RELEASED: - notifyEventToSubscriber( - AGPS_EVENT_UNSUBSCRIBE, mCurrentSubscriber, false); - break; - - case AGPS_STATE_PENDING: - case AGPS_STATE_ACQUIRED: - /* If the subscriber wishes to wait for connection close, - * before being removed from list, move to inactive state - * and notify */ - if (mCurrentSubscriber->mWaitForCloseComplete) { - mCurrentSubscriber->mIsInactive = true; - } - else { - /* Notify only current subscriber and then delete it from - * subscriberList */ - notifyEventToSubscriber( - AGPS_EVENT_UNSUBSCRIBE, mCurrentSubscriber, true); - } - - /* If no subscribers in list, release data connection */ - if (mSubscriberList.empty()) { - transitionState(AGPS_STATE_RELEASED); - requestOrReleaseDataConn(false); - } - /* Some subscribers in list, but all inactive; - * Release data connection */ - else if(!anyActiveSubscribers()) { - transitionState(AGPS_STATE_RELEASING); - requestOrReleaseDataConn(false); - } - break; - - case AGPS_STATE_RELEASING: - /* If the subscriber wishes to wait for connection close, - * before being removed from list, move to inactive state - * and notify */ - if (mCurrentSubscriber->mWaitForCloseComplete) { - mCurrentSubscriber->mIsInactive = true; - } - else { - /* Notify only current subscriber and then delete it from - * subscriberList */ - notifyEventToSubscriber( - AGPS_EVENT_UNSUBSCRIBE, mCurrentSubscriber, true); - } - - /* If no subscribers in list, just move the state. - * Request for releasing data connection should already have been - * sent */ - if (mSubscriberList.empty()) { - transitionState(AGPS_STATE_RELEASED); - } - break; - - default: - LOC_LOGE("Invalid state: %d", mState); - } -} - -void AgpsStateMachine::processAgpsEventGranted(){ - - switch (mState) { - - case AGPS_STATE_RELEASED: - case AGPS_STATE_ACQUIRED: - case AGPS_STATE_RELEASING: - LOC_LOGE("Unexpected event GRANTED in state %d", mState); - break; - - case AGPS_STATE_PENDING: - // Move to acquired state - transitionState(AGPS_STATE_ACQUIRED); - notifyAllSubscribers( - AGPS_EVENT_GRANTED, false, - AGPS_NOTIFICATION_TYPE_FOR_ACTIVE_SUBSCRIBERS); - break; - - default: - LOC_LOGE("Invalid state: %d", mState); - } -} - -void AgpsStateMachine::processAgpsEventReleased(){ - - switch (mState) { - - case AGPS_STATE_RELEASED: - /* Subscriber list should be empty if we are in released state */ - if (!mSubscriberList.empty()) { - LOC_LOGE("Unexpected event RELEASED in RELEASED state"); - } - break; - - case AGPS_STATE_ACQUIRED: - /* Force release received */ - LOC_LOGW("Force RELEASED event in ACQUIRED state"); - transitionState(AGPS_STATE_RELEASED); - notifyAllSubscribers( - AGPS_EVENT_RELEASED, true, - AGPS_NOTIFICATION_TYPE_FOR_ALL_SUBSCRIBERS); - break; - - case AGPS_STATE_RELEASING: - /* Notify all inactive subscribers about the event */ - notifyAllSubscribers( - AGPS_EVENT_RELEASED, true, - AGPS_NOTIFICATION_TYPE_FOR_INACTIVE_SUBSCRIBERS); - - /* If we have active subscribers now, they must be waiting for - * data conn setup */ - if (anyActiveSubscribers()) { - transitionState(AGPS_STATE_PENDING); - requestOrReleaseDataConn(true); - } - /* No active subscribers, move to released state */ - else { - transitionState(AGPS_STATE_RELEASED); - } - break; - - case AGPS_STATE_PENDING: - /* NOOP */ - break; - - default: - LOC_LOGE("Invalid state: %d", mState); - } -} - -void AgpsStateMachine::processAgpsEventDenied(){ - - switch (mState) { - - case AGPS_STATE_RELEASED: - LOC_LOGE("Unexpected event DENIED in state %d", mState); - break; - - case AGPS_STATE_ACQUIRED: - /* NOOP */ - break; - - case AGPS_STATE_RELEASING: - /* Notify all inactive subscribers about the event */ - notifyAllSubscribers( - AGPS_EVENT_RELEASED, true, - AGPS_NOTIFICATION_TYPE_FOR_INACTIVE_SUBSCRIBERS); - - /* If we have active subscribers now, they must be waiting for - * data conn setup */ - if (anyActiveSubscribers()) { - transitionState(AGPS_STATE_PENDING); - requestOrReleaseDataConn(true); - } - /* No active subscribers, move to released state */ - else { - transitionState(AGPS_STATE_RELEASED); - } - break; - - case AGPS_STATE_PENDING: - transitionState(AGPS_STATE_RELEASED); - notifyAllSubscribers( - AGPS_EVENT_DENIED, true, - AGPS_NOTIFICATION_TYPE_FOR_ALL_SUBSCRIBERS); - break; - - default: - LOC_LOGE("Invalid state: %d", mState); - } -} - -/* Request or Release data connection - * bool request : - * true = Request data connection - * false = Release data connection */ -int AgpsStateMachine::requestOrReleaseDataConn(bool request){ - - AGnssExtStatusIpV4 nifRequest; - memset(&nifRequest, 0, sizeof(nifRequest)); - - nifRequest.type = mAgpsType; - - if (request) { - LOC_LOGD("AGPS Data Conn Request"); - nifRequest.status = LOC_GPS_REQUEST_AGPS_DATA_CONN; - } - else{ - LOC_LOGD("AGPS Data Conn Release"); - nifRequest.status = LOC_GPS_RELEASE_AGPS_DATA_CONN; - } - - mAgpsManager->mFrameworkStatusV4Cb(nifRequest); - return 0; -} - -void AgpsStateMachine::notifyAllSubscribers( - AgpsEvent event, bool deleteSubscriberPostNotify, - AgpsNotificationType notificationType){ - - LOC_LOGD("notifyAllSubscribers(): " - "SM %p, Event %d Delete %d Notification Type %d", - this, event, deleteSubscriberPostNotify, notificationType); - - std::list<AgpsSubscriber*>::const_iterator it = mSubscriberList.begin(); - while ( it != mSubscriberList.end() ) { - - AgpsSubscriber* subscriber = *it; - - if (notificationType == AGPS_NOTIFICATION_TYPE_FOR_ALL_SUBSCRIBERS || - (notificationType == AGPS_NOTIFICATION_TYPE_FOR_INACTIVE_SUBSCRIBERS && - subscriber->mIsInactive) || - (notificationType == AGPS_NOTIFICATION_TYPE_FOR_ACTIVE_SUBSCRIBERS && - !subscriber->mIsInactive)) { - - /* Deleting via this call would require another traversal - * through subscriber list, inefficient; hence pass in false*/ - notifyEventToSubscriber(event, subscriber, false); - - if (deleteSubscriberPostNotify) { - it = mSubscriberList.erase(it); - delete subscriber; - } else { - it++; - } - } else { - it++; - } - } -} - -void AgpsStateMachine::notifyEventToSubscriber( - AgpsEvent event, AgpsSubscriber* subscriberToNotify, - bool deleteSubscriberPostNotify) { - - LOC_LOGD("notifyEventToSubscriber(): " - "SM %p, Event %d Subscriber %p Delete %d", - this, event, subscriberToNotify, deleteSubscriberPostNotify); - - switch (event) { - - case AGPS_EVENT_GRANTED: - mAgpsManager->mAtlOpenStatusCb( - subscriberToNotify->mConnHandle, 1, getAPN(), - getBearer(), mAgpsType); - break; - - case AGPS_EVENT_DENIED: - mAgpsManager->mAtlOpenStatusCb( - subscriberToNotify->mConnHandle, 0, getAPN(), - getBearer(), mAgpsType); - break; - - case AGPS_EVENT_UNSUBSCRIBE: - case AGPS_EVENT_RELEASED: - mAgpsManager->mAtlCloseStatusCb(subscriberToNotify->mConnHandle, 1); - break; - - default: - LOC_LOGE("Invalid event %d", event); - } - - /* Search this subscriber in list and delete */ - if (deleteSubscriberPostNotify) { - deleteSubscriber(subscriberToNotify); - } -} - -void AgpsStateMachine::transitionState(AgpsState newState){ - - LOC_LOGD("transitionState(): SM %p, old %d, new %d", - this, mState, newState); - - mState = newState; - - // notify state transitions to all subscribers ? -} - -void AgpsStateMachine::addSubscriber(AgpsSubscriber* subscriberToAdd){ - - LOC_LOGD("addSubscriber(): SM %p, Subscriber %p", - this, subscriberToAdd); - - // Check if subscriber is already present in the current list - // If not, then add - std::list<AgpsSubscriber*>::const_iterator it = mSubscriberList.begin(); - for (; it != mSubscriberList.end(); it++) { - AgpsSubscriber* subscriber = *it; - if (subscriber->equals(subscriberToAdd)) { - LOC_LOGE("Subscriber already in list"); - return; - } - } - - AgpsSubscriber* cloned = subscriberToAdd->clone(); - LOC_LOGD("addSubscriber(): cloned subscriber: %p", cloned); - mSubscriberList.push_back(cloned); -} - -void AgpsStateMachine::deleteSubscriber(AgpsSubscriber* subscriberToDelete){ - - LOC_LOGD("deleteSubscriber(): SM %p, Subscriber %p", - this, subscriberToDelete); - - std::list<AgpsSubscriber*>::const_iterator it = mSubscriberList.begin(); - while ( it != mSubscriberList.end() ) { - - AgpsSubscriber* subscriber = *it; - if (subscriber && subscriber->equals(subscriberToDelete)) { - - it = mSubscriberList.erase(it); - delete subscriber; - } else { - it++; - } - } -} - -bool AgpsStateMachine::anyActiveSubscribers(){ - - std::list<AgpsSubscriber*>::const_iterator it = mSubscriberList.begin(); - for (; it != mSubscriberList.end(); it++) { - AgpsSubscriber* subscriber = *it; - if (!subscriber->mIsInactive) { - return true; - } - } - return false; -} - -void AgpsStateMachine::setAPN(char* apn, unsigned int len){ - - if (NULL != mAPN) { - delete mAPN; - } - - if (apn == NULL || len <= 0) { - LOC_LOGD("Invalid apn len (%d) or null apn", len); - mAPN = NULL; - mAPNLen = 0; - } - - if (NULL != apn) { - mAPN = new char[len+1]; - if (NULL != mAPN) { - memcpy(mAPN, apn, len); - mAPN[len] = '\0'; - mAPNLen = len; - } - } -} - -AgpsSubscriber* AgpsStateMachine::getSubscriber(int connHandle){ - - /* Go over the subscriber list */ - std::list<AgpsSubscriber*>::const_iterator it = mSubscriberList.begin(); - for (; it != mSubscriberList.end(); it++) { - AgpsSubscriber* subscriber = *it; - if (subscriber->mConnHandle == connHandle) { - return subscriber; - } - } - - /* Not found, return NULL */ - return NULL; -} - -AgpsSubscriber* AgpsStateMachine::getFirstSubscriber(bool isInactive){ - - /* Go over the subscriber list */ - std::list<AgpsSubscriber*>::const_iterator it = mSubscriberList.begin(); - for (; it != mSubscriberList.end(); it++) { - AgpsSubscriber* subscriber = *it; - if(subscriber->mIsInactive == isInactive) { - return subscriber; - } - } - - /* Not found, return NULL */ - return NULL; -} - -void AgpsStateMachine::dropAllSubscribers(){ - - LOC_LOGD("dropAllSubscribers(): SM %p", this); - - /* Go over the subscriber list */ - std::list<AgpsSubscriber*>::const_iterator it = mSubscriberList.begin(); - while ( it != mSubscriberList.end() ) { - AgpsSubscriber* subscriber = *it; - it = mSubscriberList.erase(it); - delete subscriber; - } -} - -/* -------------------------------------------------------------------- - * DS State Machine Methods - * -------------------------------------------------------------------*/ -const int DSStateMachine::MAX_START_DATA_CALL_RETRIES = 4; -const int DSStateMachine::DATA_CALL_RETRY_DELAY_MSEC = 500; - -/* Overridden method - * DS SM needs to handle one scenario differently */ -void DSStateMachine::processAgpsEvent(AgpsEvent event) { - - LOC_LOGD("DSStateMachine::processAgpsEvent() %d", event); - - /* DS Client call setup APIs don't return failure/closure separately. - * Hence we receive RELEASED event in both cases. - * If we are in pending, we should consider RELEASED as DENIED */ - if (event == AGPS_EVENT_RELEASED && mState == AGPS_STATE_PENDING) { - - LOC_LOGD("Translating RELEASED to DENIED event"); - event = AGPS_EVENT_DENIED; - } - - /* Redirect process to base class */ - AgpsStateMachine::processAgpsEvent(event); -} - -/* Timer Callback - * For the retry timer started in case of DS Client call setup failure */ -void delay_callback(void *callbackData, int result) -{ - LOC_LOGD("delay_callback(): cbData %p", callbackData); - - (void)result; - - if (callbackData == NULL) { - LOC_LOGE("delay_callback(): NULL argument received !"); - return; - } - DSStateMachine* dsStateMachine = (DSStateMachine *)callbackData; - dsStateMachine->retryCallback(); -} - -/* Invoked from Timer Callback - * For the retry timer started in case of DS Client call setup failure */ -void DSStateMachine :: retryCallback() -{ - LOC_LOGD("DSStateMachine::retryCallback()"); - - /* Request SUPL ES - * There must be at least one active subscriber in list */ - AgpsSubscriber* subscriber = getFirstSubscriber(false); - if (subscriber == NULL) { - - LOC_LOGE("No active subscriber for DS Client call setup"); - return; - } - - /* Send message to retry */ - mAgpsManager->mSendMsgToAdapterQueueFn( - new AgpsMsgRequestATL( - mAgpsManager, subscriber->mConnHandle, - LOC_AGPS_TYPE_SUPL_ES)); -} - -/* Overridden method - * Request or Release data connection - * bool request : - * true = Request data connection - * false = Release data connection */ -int DSStateMachine::requestOrReleaseDataConn(bool request){ - - LOC_LOGD("DSStateMachine::requestOrReleaseDataConn(): " - "request %d", request); - - /* Release data connection required ? */ - if (!request && mAgpsManager->mDSClientStopDataCallFn) { - - mAgpsManager->mDSClientStopDataCallFn(); - LOC_LOGD("DS Client release data call request sent !"); - return 0; - } - - /* Setup data connection request - * There must be at least one active subscriber in list */ - AgpsSubscriber* subscriber = getFirstSubscriber(false); - if (subscriber == NULL) { - - LOC_LOGE("No active subscriber for DS Client call setup"); - return -1; - } - - /* DS Client Fn registered ? */ - if (!mAgpsManager->mDSClientOpenAndStartDataCallFn) { - - LOC_LOGE("DS Client start fn not registered, fallback to SUPL ATL"); - notifyEventToSubscriber(AGPS_EVENT_DENIED, subscriber, false); - return -1; - } - - /* Setup the call */ - int ret = mAgpsManager->mDSClientOpenAndStartDataCallFn(); - - /* Check if data call start failed */ - switch (ret) { - - case LOC_API_ADAPTER_ERR_ENGINE_BUSY: - LOC_LOGE("DS Client open call failed, err: %d", ret); - mRetries++; - if (mRetries > MAX_START_DATA_CALL_RETRIES) { - - LOC_LOGE("DS Client call retries exhausted, " - "falling back to normal SUPL ATL"); - notifyEventToSubscriber(AGPS_EVENT_DENIED, subscriber, false); - } - /* Retry DS Client call setup after some delay */ - else if(loc_timer_start( - DATA_CALL_RETRY_DELAY_MSEC, delay_callback, this)) { - LOC_LOGE("Error: Could not start delay thread\n"); - return -1; - } - break; - - case LOC_API_ADAPTER_ERR_UNSUPPORTED: - LOC_LOGE("No emergency profile found. Fall back to normal SUPL ATL"); - notifyEventToSubscriber(AGPS_EVENT_DENIED, subscriber, false); - break; - - case LOC_API_ADAPTER_ERR_SUCCESS: - LOC_LOGD("Request to start data call sent"); - break; - - default: - LOC_LOGE("Unrecognized return value: %d", ret); - } - - return ret; -} - -void DSStateMachine::notifyEventToSubscriber( - AgpsEvent event, AgpsSubscriber* subscriberToNotify, - bool deleteSubscriberPostNotify) { - - LOC_LOGD("DSStateMachine::notifyEventToSubscriber(): " - "SM %p, Event %d Subscriber %p Delete %d", - this, event, subscriberToNotify, deleteSubscriberPostNotify); - - switch (event) { - - case AGPS_EVENT_GRANTED: - mAgpsManager->mAtlOpenStatusCb( - subscriberToNotify->mConnHandle, 1, NULL, - AGPS_APN_BEARER_INVALID, LOC_AGPS_TYPE_SUPL_ES); - break; - - case AGPS_EVENT_DENIED: - /* Now try with regular SUPL - * We need to send request via message queue */ - mRetries = 0; - mAgpsManager->mSendMsgToAdapterQueueFn( - new AgpsMsgRequestATL( - mAgpsManager, subscriberToNotify->mConnHandle, - LOC_AGPS_TYPE_SUPL)); - break; - - case AGPS_EVENT_UNSUBSCRIBE: - mAgpsManager->mAtlCloseStatusCb(subscriberToNotify->mConnHandle, 1); - break; - - case AGPS_EVENT_RELEASED: - mAgpsManager->mDSClientCloseDataCallFn(); - mAgpsManager->mAtlCloseStatusCb(subscriberToNotify->mConnHandle, 1); - break; - - default: - LOC_LOGE("Invalid event %d", event); - } - - /* Search this subscriber in list and delete */ - if (deleteSubscriberPostNotify) { - deleteSubscriber(subscriberToNotify); - } -} - -/* -------------------------------------------------------------------- - * Loc AGPS Manager Methods - * -------------------------------------------------------------------*/ - -/* CREATE AGPS STATE MACHINES - * Must be invoked in Msg Handler context */ -void AgpsManager::createAgpsStateMachines() { - - LOC_LOGD("AgpsManager::createAgpsStateMachines"); - - bool agpsCapable = - ((loc_core::ContextBase::mGps_conf.CAPABILITIES & LOC_GPS_CAPABILITY_MSA) || - (loc_core::ContextBase::mGps_conf.CAPABILITIES & LOC_GPS_CAPABILITY_MSB)); - - if (NULL == mInternetNif) { - mInternetNif = new AgpsStateMachine(this, LOC_AGPS_TYPE_WWAN_ANY); - LOC_LOGD("Internet NIF: %p", mInternetNif); - } - if (agpsCapable) { - if (NULL == mAgnssNif) { - mAgnssNif = new AgpsStateMachine(this, LOC_AGPS_TYPE_SUPL); - LOC_LOGD("AGNSS NIF: %p", mAgnssNif); - } - if (NULL == mDsNif && - loc_core::ContextBase::mGps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL) { - - if(!mDSClientInitFn){ - - LOC_LOGE("DS Client Init Fn not registered !"); - return; - } - if (mDSClientInitFn(false) != 0) { - - LOC_LOGE("Failed to init data service client"); - return; - } - mDsNif = new DSStateMachine(this); - LOC_LOGD("DS NIF: %p", mDsNif); - } - } -} - -AgpsStateMachine* AgpsManager::getAgpsStateMachine(AGpsExtType agpsType) { - - LOC_LOGD("AgpsManager::getAgpsStateMachine(): agpsType %d", agpsType); - - switch (agpsType) { - - case LOC_AGPS_TYPE_INVALID: - case LOC_AGPS_TYPE_SUPL: - if (mAgnssNif == NULL) { - LOC_LOGE("NULL AGNSS NIF !"); - } - return mAgnssNif; - - case LOC_AGPS_TYPE_SUPL_ES: - if (loc_core::ContextBase::mGps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL) { - if (mDsNif == NULL) { - createAgpsStateMachines(); - } - return mDsNif; - } else { - return mAgnssNif; - } - - default: - return mInternetNif; - } - - LOC_LOGE("No SM found !"); - return NULL; -} - -void AgpsManager::requestATL(int connHandle, AGpsExtType agpsType){ - - LOC_LOGD("AgpsManager::requestATL(): connHandle %d, agpsType %d", - connHandle, agpsType); - - AgpsStateMachine* sm = getAgpsStateMachine(agpsType); - - if (sm == NULL) { - - LOC_LOGE("No AGPS State Machine for agpsType: %d", agpsType); - mAtlOpenStatusCb( - connHandle, 0, NULL, AGPS_APN_BEARER_INVALID, agpsType); - return; - } - - /* Invoke AGPS SM processing */ - AgpsSubscriber subscriber(connHandle, false, false); - sm->setCurrentSubscriber(&subscriber); - - /* If DS State Machine, wait for close complete */ - if (agpsType == LOC_AGPS_TYPE_SUPL_ES) { - subscriber.mWaitForCloseComplete = true; - } - - /* Send subscriber event */ - sm->processAgpsEvent(AGPS_EVENT_SUBSCRIBE); -} - -void AgpsManager::releaseATL(int connHandle){ - - LOC_LOGD("AgpsManager::releaseATL(): connHandle %d", connHandle); - - /* First find the subscriber with specified handle. - * We need to search in all state machines. */ - AgpsStateMachine* sm = NULL; - AgpsSubscriber* subscriber = NULL; - - if (mAgnssNif && - (subscriber = mAgnssNif->getSubscriber(connHandle)) != NULL) { - sm = mAgnssNif; - } - else if (mInternetNif && - (subscriber = mInternetNif->getSubscriber(connHandle)) != NULL) { - sm = mInternetNif; - } - else if (mDsNif && - (subscriber = mDsNif->getSubscriber(connHandle)) != NULL) { - sm = mDsNif; - } - - if (sm == NULL) { - LOC_LOGE("Subscriber with connHandle %d not found in any SM", - connHandle); - mAtlCloseStatusCb(connHandle, 0); - return; - } - - /* Now send unsubscribe event */ - sm->setCurrentSubscriber(subscriber); - sm->processAgpsEvent(AGPS_EVENT_UNSUBSCRIBE); -} - -void AgpsManager::reportDataCallOpened(){ - - LOC_LOGD("AgpsManager::reportDataCallOpened"); - - if (mDsNif) { - mDsNif->processAgpsEvent(AGPS_EVENT_GRANTED); - } -} - -void AgpsManager::reportDataCallClosed(){ - - LOC_LOGD("AgpsManager::reportDataCallClosed"); - - if (mDsNif) { - mDsNif->processAgpsEvent(AGPS_EVENT_RELEASED); - } -} - -void AgpsManager::reportAtlOpenSuccess( - AGpsExtType agpsType, char* apnName, int apnLen, - AGpsBearerType bearerType){ - - LOC_LOGD("AgpsManager::reportAtlOpenSuccess(): " - "AgpsType %d, APN [%s], Len %d, BearerType %d", - agpsType, apnName, apnLen, bearerType); - - /* Find the state machine instance */ - AgpsStateMachine* sm = getAgpsStateMachine(agpsType); - - /* Set bearer and apn info in state machine instance */ - sm->setBearer(bearerType); - sm->setAPN(apnName, apnLen); - - /* Send GRANTED event to state machine */ - sm->processAgpsEvent(AGPS_EVENT_GRANTED); -} - -void AgpsManager::reportAtlOpenFailed(AGpsExtType agpsType){ - - LOC_LOGD("AgpsManager::reportAtlOpenFailed(): AgpsType %d", agpsType); - - /* Fetch SM and send DENIED event */ - AgpsStateMachine* sm = getAgpsStateMachine(agpsType); - sm->processAgpsEvent(AGPS_EVENT_DENIED); -} - -void AgpsManager::reportAtlClosed(AGpsExtType agpsType){ - - LOC_LOGD("AgpsManager::reportAtlClosed(): AgpsType %d", agpsType); - - /* Fetch SM and send RELEASED event */ - AgpsStateMachine* sm = getAgpsStateMachine(agpsType); - sm->processAgpsEvent(AGPS_EVENT_RELEASED); -} - -void AgpsManager::handleModemSSR(){ - - LOC_LOGD("AgpsManager::handleModemSSR"); - - /* Drop subscribers from all state machines */ - if (mAgnssNif) { - mAgnssNif->dropAllSubscribers(); - } - if (mInternetNif) { - mInternetNif->dropAllSubscribers(); - } - if (mDsNif) { - mDsNif->dropAllSubscribers(); - } - - // reinitialize DS client in SSR mode - if (loc_core::ContextBase::mGps_conf. - USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL) { - - mDSClientStopDataCallFn(); - mDSClientCloseDataCallFn(); - mDSClientReleaseFn(); - - mDSClientInitFn(true); - } -} diff --git a/gps/gnss/Agps.h b/gps/gnss/Agps.h deleted file mode 100644 index 703a475..0000000 --- a/gps/gnss/Agps.h +++ /dev/null @@ -1,379 +0,0 @@ -/* Copyright (c) 2012-2017, 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 AGPS_H -#define AGPS_H - -#include <functional> -#include <list> -#include <MsgTask.h> -#include <gps_extended_c.h> -#include <loc_pla.h> -#include <log_util.h> - -/* ATL callback function pointers - * Passed in by Adapter to AgpsManager */ -typedef std::function<void( - int handle, int isSuccess, char* apn, - AGpsBearerType bearerType, AGpsExtType agpsType)> AgpsAtlOpenStatusCb; - -typedef std::function<void(int handle, int isSuccess)> AgpsAtlCloseStatusCb; - -/* DS Client control APIs - * Passed in by Adapter to AgpsManager */ -typedef std::function<int(bool isDueToSSR)> AgpsDSClientInitFn; -typedef std::function<int()> AgpsDSClientOpenAndStartDataCallFn; -typedef std::function<void()> AgpsDSClientStopDataCallFn; -typedef std::function<void()> AgpsDSClientCloseDataCallFn; -typedef std::function<void()> AgpsDSClientReleaseFn; - -/* Post message to adapter's message queue */ -typedef std::function<void(LocMsg* msg)> SendMsgToAdapterMsgQueueFn; - -/* AGPS States */ -typedef enum { - AGPS_STATE_INVALID = 0, - AGPS_STATE_RELEASED, - AGPS_STATE_PENDING, - AGPS_STATE_ACQUIRED, - AGPS_STATE_RELEASING -} AgpsState; - -typedef enum { - AGPS_EVENT_INVALID = 0, - AGPS_EVENT_SUBSCRIBE, - AGPS_EVENT_UNSUBSCRIBE, - AGPS_EVENT_GRANTED, - AGPS_EVENT_RELEASED, - AGPS_EVENT_DENIED -} AgpsEvent; - -/* Notification Types sent to subscribers */ -typedef enum { - AGPS_NOTIFICATION_TYPE_INVALID = 0, - - /* Meant for all subscribers, either active or inactive */ - AGPS_NOTIFICATION_TYPE_FOR_ALL_SUBSCRIBERS, - - /* Meant for only inactive subscribers */ - AGPS_NOTIFICATION_TYPE_FOR_INACTIVE_SUBSCRIBERS, - - /* Meant for only active subscribers */ - AGPS_NOTIFICATION_TYPE_FOR_ACTIVE_SUBSCRIBERS -} AgpsNotificationType; - -/* Classes in this header */ -class AgpsSubscriber; -class AgpsManager; -class AgpsStateMachine; -class DSStateMachine; - - -/* SUBSCRIBER - * Each Subscriber instance corresponds to one AGPS request, - * received by the AGPS state machine */ -class AgpsSubscriber { - -public: - int mConnHandle; - - /* Does this subscriber wait for data call close complete, - * before being notified ATL close ? - * While waiting for data call close, subscriber will be in - * inactive state. */ - bool mWaitForCloseComplete; - bool mIsInactive; - - inline AgpsSubscriber( - int connHandle, bool waitForCloseComplete, bool isInactive) : - mConnHandle(connHandle), - mWaitForCloseComplete(waitForCloseComplete), - mIsInactive(isInactive) {} - inline virtual ~AgpsSubscriber() {} - - inline virtual bool equals(const AgpsSubscriber *s) const - { return (mConnHandle == s->mConnHandle); } - - inline virtual AgpsSubscriber* clone() - { return new AgpsSubscriber( - mConnHandle, mWaitForCloseComplete, mIsInactive); } -}; - -/* AGPS STATE MACHINE */ -class AgpsStateMachine { -protected: - /* AGPS Manager instance, from where this state machine is created */ - AgpsManager* mAgpsManager; - - /* List of all subscribers for this State Machine. - * Once a subscriber is notified for ATL open/close status, - * it is deleted */ - std::list<AgpsSubscriber*> mSubscriberList; - - /* Current subscriber, whose request this State Machine is - * currently processing */ - AgpsSubscriber* mCurrentSubscriber; - - /* Current state for this state machine */ - AgpsState mState; - -private: - /* AGPS Type for this state machine - LOC_AGPS_TYPE_ANY 0 - LOC_AGPS_TYPE_SUPL 1 - LOC_AGPS_TYPE_WWAN_ANY 3 - LOC_AGPS_TYPE_SUPL_ES 5 */ - AGpsExtType mAgpsType; - - /* APN and IP Type info for AGPS Call */ - char* mAPN; - unsigned int mAPNLen; - AGpsBearerType mBearer; - -public: - /* CONSTRUCTOR */ - AgpsStateMachine(AgpsManager* agpsManager, AGpsExtType agpsType): - mAgpsManager(agpsManager), mSubscriberList(), - mCurrentSubscriber(NULL), mState(AGPS_STATE_RELEASED), - mAgpsType(agpsType), mAPN(NULL), mAPNLen(0), - mBearer(AGPS_APN_BEARER_INVALID) {}; - - virtual ~AgpsStateMachine() { if(NULL != mAPN) delete[] mAPN; }; - - /* Getter/Setter methods */ - void setAPN(char* apn, unsigned int len); - inline char* getAPN() const { return (char*)mAPN; } - inline void setBearer(AGpsBearerType bearer) { mBearer = bearer; } - inline AGpsBearerType getBearer() const { return mBearer; } - inline AGpsExtType getType() const { return mAgpsType; } - inline void setCurrentSubscriber(AgpsSubscriber* subscriber) - { mCurrentSubscriber = subscriber; } - - /* Fetch subscriber with specified handle */ - AgpsSubscriber* getSubscriber(int connHandle); - - /* Fetch first active or inactive subscriber in list - * isInactive = true : fetch first inactive subscriber - * isInactive = false : fetch first active subscriber */ - AgpsSubscriber* getFirstSubscriber(bool isInactive); - - /* Process LOC AGPS Event being passed in - * onRsrcEvent */ - virtual void processAgpsEvent(AgpsEvent event); - - /* Drop all subscribers, in case of Modem SSR */ - void dropAllSubscribers(); - -protected: - /* Remove the specified subscriber from list if present. - * Also delete the subscriber instance. */ - void deleteSubscriber(AgpsSubscriber* subscriber); - -private: - /* Send call setup request to framework - * sendRsrcRequest(LOC_GPS_REQUEST_AGPS_DATA_CONN) - * sendRsrcRequest(LOC_GPS_RELEASE_AGPS_DATA_CONN) */ - virtual int requestOrReleaseDataConn(bool request); - - /* Individual event processing methods */ - void processAgpsEventSubscribe(); - void processAgpsEventUnsubscribe(); - void processAgpsEventGranted(); - void processAgpsEventReleased(); - void processAgpsEventDenied(); - - /* Clone the passed in subscriber and add to the subscriber list - * if not already present */ - void addSubscriber(AgpsSubscriber* subscriber); - - /* Notify subscribers about AGPS events */ - void notifyAllSubscribers( - AgpsEvent event, bool deleteSubscriberPostNotify, - AgpsNotificationType notificationType); - virtual void notifyEventToSubscriber( - AgpsEvent event, AgpsSubscriber* subscriber, - bool deleteSubscriberPostNotify); - - /* Do we have any subscribers in active state */ - bool anyActiveSubscribers(); - - /* Transition state */ - void transitionState(AgpsState newState); -}; - -/* DS STATE MACHINE */ -class DSStateMachine : public AgpsStateMachine { - -private: - static const int MAX_START_DATA_CALL_RETRIES; - static const int DATA_CALL_RETRY_DELAY_MSEC; - - int mRetries; - -public: - /* CONSTRUCTOR */ - DSStateMachine(AgpsManager* agpsManager): - AgpsStateMachine(agpsManager, LOC_AGPS_TYPE_SUPL_ES), mRetries(0) {} - - /* Overridden method - * DS SM needs to handle one event differently */ - void processAgpsEvent(AgpsEvent event); - - /* Retry callback, used in case call failure */ - void retryCallback(); - -private: - /* Overridden method, different functionality for DS SM - * Send call setup request to framework - * sendRsrcRequest(LOC_GPS_REQUEST_AGPS_DATA_CONN) - * sendRsrcRequest(LOC_GPS_RELEASE_AGPS_DATA_CONN) */ - int requestOrReleaseDataConn(bool request); - - /* Overridden method, different functionality for DS SM */ - void notifyEventToSubscriber( - AgpsEvent event, AgpsSubscriber* subscriber, - bool deleteSubscriberPostNotify); -}; - -/* LOC AGPS MANAGER */ -class AgpsManager { - - friend class AgpsStateMachine; - friend class DSStateMachine; - -public: - /* CONSTRUCTOR */ - AgpsManager(): - mFrameworkStatusV4Cb(NULL), - mAtlOpenStatusCb(), mAtlCloseStatusCb(), - mDSClientInitFn(), mDSClientOpenAndStartDataCallFn(), - mDSClientStopDataCallFn(), mDSClientCloseDataCallFn(), mDSClientReleaseFn(), - mSendMsgToAdapterQueueFn(), - mAgnssNif(NULL), mInternetNif(NULL), mDsNif(NULL) {} - - /* Register callbacks */ - inline void registerATLCallbacks(AgpsAtlOpenStatusCb atlOpenStatusCb, - AgpsAtlCloseStatusCb atlCloseStatusCb, - AgpsDSClientInitFn dsClientInitFn, - AgpsDSClientOpenAndStartDataCallFn dsClientOpenAndStartDataCallFn, - AgpsDSClientStopDataCallFn dsClientStopDataCallFn, - AgpsDSClientCloseDataCallFn dsClientCloseDataCallFn, - AgpsDSClientReleaseFn dsClientReleaseFn, - SendMsgToAdapterMsgQueueFn sendMsgToAdapterQueueFn) { - - mAtlOpenStatusCb = atlOpenStatusCb; - mAtlCloseStatusCb = atlCloseStatusCb; - mDSClientInitFn = dsClientInitFn; - mDSClientOpenAndStartDataCallFn = dsClientOpenAndStartDataCallFn; - mDSClientStopDataCallFn = dsClientStopDataCallFn; - mDSClientCloseDataCallFn = dsClientCloseDataCallFn; - mDSClientReleaseFn = dsClientReleaseFn; - mSendMsgToAdapterQueueFn = sendMsgToAdapterQueueFn; - } - - inline void registerFrameworkStatusCallback(AgnssStatusIpV4Cb frameworkStatusV4Cb) { - mFrameworkStatusV4Cb = frameworkStatusV4Cb; - } - - /* Create all AGPS state machines */ - void createAgpsStateMachines(); - - /* Process incoming ATL requests */ - void requestATL(int connHandle, AGpsExtType agpsType); - void releaseATL(int connHandle); - - /* Process incoming DS Client data call events */ - void reportDataCallOpened(); - void reportDataCallClosed(); - - /* Process incoming framework data call events */ - void reportAtlOpenSuccess(AGpsExtType agpsType, char* apnName, int apnLen, - AGpsBearerType bearerType); - void reportAtlOpenFailed(AGpsExtType agpsType); - void reportAtlClosed(AGpsExtType agpsType); - - /* Handle Modem SSR */ - void handleModemSSR(); - -protected: - AgnssStatusIpV4Cb mFrameworkStatusV4Cb; - - AgpsAtlOpenStatusCb mAtlOpenStatusCb; - AgpsAtlCloseStatusCb mAtlCloseStatusCb; - - AgpsDSClientInitFn mDSClientInitFn; - AgpsDSClientOpenAndStartDataCallFn mDSClientOpenAndStartDataCallFn; - AgpsDSClientStopDataCallFn mDSClientStopDataCallFn; - AgpsDSClientCloseDataCallFn mDSClientCloseDataCallFn; - AgpsDSClientReleaseFn mDSClientReleaseFn; - - SendMsgToAdapterMsgQueueFn mSendMsgToAdapterQueueFn; - - AgpsStateMachine* mAgnssNif; - AgpsStateMachine* mInternetNif; - AgpsStateMachine* mDsNif; - -private: - /* Fetch state machine for handling request ATL call */ - AgpsStateMachine* getAgpsStateMachine(AGpsExtType agpsType); -}; - -/* Request SUPL/INTERNET/SUPL_ES ATL - * This LocMsg is defined in this header since it has to be used from more - * than one place, other Agps LocMsg are restricted to GnssAdapter and - * declared inline */ -struct AgpsMsgRequestATL: public LocMsg { - - AgpsManager* mAgpsManager; - int mConnHandle; - AGpsExtType mAgpsType; - - inline AgpsMsgRequestATL(AgpsManager* agpsManager, int connHandle, - AGpsExtType agpsType) : - LocMsg(), mAgpsManager(agpsManager), mConnHandle(connHandle), mAgpsType( - agpsType) { - - LOC_LOGV("AgpsMsgRequestATL"); - } - - inline virtual void proc() const { - - LOC_LOGV("AgpsMsgRequestATL::proc()"); - mAgpsManager->requestATL(mConnHandle, mAgpsType); - } -}; - -namespace AgpsUtils { - -AGpsBearerType ipTypeToBearerType(LocApnIpType ipType); -LocApnIpType bearerTypeToIpType(AGpsBearerType bearerType); - -} - -#endif /* AGPS_H */ diff --git a/gps/gnss/Android.mk b/gps/gnss/Android.mk deleted file mode 100644 index d809bc2..0000000 --- a/gps/gnss/Android.mk +++ /dev/null @@ -1,46 +0,0 @@ -ifneq ($(BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE),) -ifneq ($(BUILD_TINY_ANDROID),true) - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_MODULE := libgnss -LOCAL_VENDOR_MODULE := true -LOCAL_MODULE_TAGS := optional - -LOCAL_SHARED_LIBRARIES := \ - libutils \ - libcutils \ - libdl \ - liblog \ - libloc_core \ - libgps.utils - -LOCAL_SRC_FILES += \ - location_gnss.cpp \ - GnssAdapter.cpp \ - Agps.cpp \ - XtraSystemStatusObserver.cpp - -LOCAL_CFLAGS += \ - -fno-short-enums \ - -ifeq ($(TARGET_BUILD_VARIANT),user) - LOCAL_CFLAGS += -DTARGET_BUILD_VARIANT_USER -endif - -LOCAL_HEADER_LIBRARIES := \ - libgps.utils_headers \ - libloc_core_headers \ - libloc_pla_headers \ - liblocation_api_headers - -LOCAL_CFLAGS += $(GNSS_CFLAGS) - -LOCAL_PRELINK_MODULE := false - -include $(BUILD_SHARED_LIBRARY) - -endif # not BUILD_TINY_ANDROID -endif # BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE diff --git a/gps/gnss/GnssAdapter.cpp b/gps/gnss/GnssAdapter.cpp deleted file mode 100644 index 6df8e12..0000000 --- a/gps/gnss/GnssAdapter.cpp +++ /dev/null @@ -1,3323 +0,0 @@ -/* Copyright (c) 2017, 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_TAG "LocSvc_GnssAdapter" - -#include <inttypes.h> -#include <sys/stat.h> -#include <errno.h> -#include <ctype.h> -#include <cutils/properties.h> -#include <math.h> -#include <arpa/inet.h> -#include <netinet/in.h> -#include <netdb.h> -#include <GnssAdapter.h> -#include <string> -#include <loc_log.h> -#include <loc_nmea.h> -#include <Agps.h> -#include <SystemStatus.h> - -#include <vector> - -#define RAD2DEG (180.0 / M_PI) - -using namespace loc_core; - -/* Method to fetch status cb from loc_net_iface library */ -typedef AgpsCbInfo& (*LocAgpsGetAgpsCbInfo)(LocAgpsOpenResultCb openResultCb, - LocAgpsCloseResultCb closeResultCb, void* userDataPtr); - -static void agpsOpenResultCb (bool isSuccess, AGpsExtType agpsType, const char* apn, - AGpsBearerType bearerType, void* userDataPtr); -static void agpsCloseResultCb (bool isSuccess, AGpsExtType agpsType, void* userDataPtr); - -GnssAdapter::GnssAdapter() : - LocAdapterBase(0, - LocDualContext::getLocFgContext(NULL, - NULL, - LocDualContext::mLocationHalName, - false)), - mUlpProxy(new UlpProxyBase()), - mUlpPositionMode(), - mGnssSvIdUsedInPosition(), - mGnssSvIdUsedInPosAvail(false), - mControlCallbacks(), - mPowerVoteId(0), - mNmeaMask(0), - mNiData(), - mAgpsManager(), - mAgpsCbInfo(), - mOdcpiRequestCb(nullptr), - mOdcpiRequestActive(false), - mOdcpiTimer(this), - mOdcpiRequest(), - mSystemStatus(SystemStatus::getInstance(mMsgTask)), - mServerUrl(":"), - mXtraObserver(mSystemStatus->getOsObserver(), mMsgTask) -{ - LOC_LOGD("%s]: Constructor %p", __func__, this); - mUlpPositionMode.mode = LOC_POSITION_MODE_INVALID; - - pthread_condattr_t condAttr; - pthread_condattr_init(&condAttr); - pthread_condattr_setclock(&condAttr, CLOCK_MONOTONIC); - pthread_cond_init(&mNiData.session.tCond, &condAttr); - pthread_cond_init(&mNiData.sessionEs.tCond, &condAttr); - pthread_condattr_destroy(&condAttr); - - /* Set ATL open/close callbacks */ - AgpsAtlOpenStatusCb atlOpenStatusCb = - [this](int handle, int isSuccess, char* apn, - AGpsBearerType bearerType, AGpsExtType agpsType) { - - mLocApi->atlOpenStatus( - handle, isSuccess, apn, bearerType, agpsType); - }; - AgpsAtlCloseStatusCb atlCloseStatusCb = - [this](int handle, int isSuccess) { - - mLocApi->atlCloseStatus(handle, isSuccess); - }; - - /* Register DS Client APIs */ - AgpsDSClientInitFn dsClientInitFn = - [this](bool isDueToSSR) { - - return mLocApi->initDataServiceClient(isDueToSSR); - }; - - AgpsDSClientOpenAndStartDataCallFn dsClientOpenAndStartDataCallFn = - [this] { - - return mLocApi->openAndStartDataCall(); - }; - - AgpsDSClientStopDataCallFn dsClientStopDataCallFn = - [this] { - - mLocApi->stopDataCall(); - }; - - AgpsDSClientCloseDataCallFn dsClientCloseDataCallFn = - [this] { - - mLocApi->closeDataCall(); - }; - - AgpsDSClientReleaseFn dsClientReleaseFn = - [this] { - - mLocApi->releaseDataServiceClient(); - }; - - /* Send Msg function */ - SendMsgToAdapterMsgQueueFn sendMsgFn = - [this](LocMsg* msg) { - - sendMsg(msg); - }; - mAgpsManager.registerATLCallbacks(atlOpenStatusCb, atlCloseStatusCb, - dsClientInitFn, dsClientOpenAndStartDataCallFn, dsClientStopDataCallFn, - dsClientCloseDataCallFn, dsClientReleaseFn, sendMsgFn); - - readConfigCommand(); - setConfigCommand(); - initDefaultAgpsCommand(); -} - -void -GnssAdapter::setControlCallbacksCommand(LocationControlCallbacks& controlCallbacks) -{ - struct MsgSetControlCallbacks : public LocMsg { - GnssAdapter& mAdapter; - const LocationControlCallbacks mControlCallbacks; - inline MsgSetControlCallbacks(GnssAdapter& adapter, - LocationControlCallbacks& controlCallbacks) : - LocMsg(), - mAdapter(adapter), - mControlCallbacks(controlCallbacks) {} - inline virtual void proc() const { - mAdapter.setControlCallbacks(mControlCallbacks); - } - }; - - sendMsg(new MsgSetControlCallbacks(*this, controlCallbacks)); -} - -void -GnssAdapter::convertOptions(LocPosMode& out, const LocationOptions& options) -{ - LocPosMode locPosMode = {}; - switch (options.mode) { - case GNSS_SUPL_MODE_MSB: - out.mode = LOC_POSITION_MODE_MS_BASED; - break; - case GNSS_SUPL_MODE_MSA: - out.mode = LOC_POSITION_MODE_MS_ASSISTED; - break; - default: - out.mode = LOC_POSITION_MODE_STANDALONE; - break; - } - out.share_position = true; - out.min_interval = options.minInterval; -} - -void -GnssAdapter::convertLocation(Location& out, const LocGpsLocation& locGpsLocation, - const GpsLocationExtended& locationExtended, - const LocPosTechMask techMask) -{ - memset(&out, 0, sizeof(Location)); - out.size = sizeof(Location); - if (LOC_GPS_LOCATION_HAS_LAT_LONG & locGpsLocation.flags) { - out.flags |= LOCATION_HAS_LAT_LONG_BIT; - out.latitude = locGpsLocation.latitude; - out.longitude = locGpsLocation.longitude; - } - if (LOC_GPS_LOCATION_HAS_ALTITUDE & locGpsLocation.flags) { - out.flags |= LOCATION_HAS_ALTITUDE_BIT; - out.altitude = locGpsLocation.altitude; - } - if (LOC_GPS_LOCATION_HAS_SPEED & locGpsLocation.flags) { - out.flags |= LOCATION_HAS_SPEED_BIT; - out.speed = locGpsLocation.speed; - } - if (LOC_GPS_LOCATION_HAS_BEARING & locGpsLocation.flags) { - out.flags |= LOCATION_HAS_BEARING_BIT; - out.bearing = locGpsLocation.bearing; - } - if (LOC_GPS_LOCATION_HAS_ACCURACY & locGpsLocation.flags) { - out.flags |= LOCATION_HAS_ACCURACY_BIT; - out.accuracy = locGpsLocation.accuracy; - } - if (GPS_LOCATION_EXTENDED_HAS_VERT_UNC & locationExtended.flags) { - out.flags |= LOCATION_HAS_VERTICAL_ACCURACY_BIT; - out.verticalAccuracy = locationExtended.vert_unc; - } - if (GPS_LOCATION_EXTENDED_HAS_SPEED_UNC & locationExtended.flags) { - out.flags |= LOCATION_HAS_SPEED_ACCURACY_BIT; - out.speedAccuracy = locationExtended.speed_unc; - } - if (GPS_LOCATION_EXTENDED_HAS_BEARING_UNC & locationExtended.flags) { - out.flags |= LOCATION_HAS_BEARING_ACCURACY_BIT; - out.bearingAccuracy = locationExtended.bearing_unc; - } - out.timestamp = locGpsLocation.timestamp; - if (LOC_POS_TECH_MASK_SATELLITE & techMask) { - out.techMask |= LOCATION_TECHNOLOGY_GNSS_BIT; - } - if (LOC_POS_TECH_MASK_CELLID & techMask) { - out.techMask |= LOCATION_TECHNOLOGY_CELL_BIT; - } - if (LOC_POS_TECH_MASK_WIFI & techMask) { - out.techMask |= LOCATION_TECHNOLOGY_WIFI_BIT; - } - if (LOC_POS_TECH_MASK_SENSORS & techMask) { - out.techMask |= LOCATION_TECHNOLOGY_SENSORS_BIT; - } -} - -void -GnssAdapter::convertLocationInfo(GnssLocationInfoNotification& out, - const GpsLocationExtended& locationExtended) -{ - out.size = sizeof(GnssLocationInfoNotification); - if (GPS_LOCATION_EXTENDED_HAS_ALTITUDE_MEAN_SEA_LEVEL & locationExtended.flags) { - out.flags |= GNSS_LOCATION_INFO_ALTITUDE_MEAN_SEA_LEVEL_BIT; - out.altitudeMeanSeaLevel = locationExtended.altitudeMeanSeaLevel; - } - if (GPS_LOCATION_EXTENDED_HAS_DOP & locationExtended.flags) { - out.flags |= GNSS_LOCATION_INFO_DOP_BIT; - out.pdop = locationExtended.pdop; - out.hdop = locationExtended.hdop; - out.vdop = locationExtended.vdop; - } - if (GPS_LOCATION_EXTENDED_HAS_MAG_DEV & locationExtended.flags) { - out.flags |= GNSS_LOCATION_INFO_MAGNETIC_DEVIATION_BIT; - out.magneticDeviation = locationExtended.magneticDeviation; - } - if (GPS_LOCATION_EXTENDED_HAS_HOR_RELIABILITY & locationExtended.flags) { - out.flags |= GNSS_LOCATION_INFO_HOR_RELIABILITY_BIT; - switch (locationExtended.horizontal_reliability) { - case LOC_RELIABILITY_VERY_LOW: - out.horReliability = LOCATION_RELIABILITY_VERY_LOW; - break; - case LOC_RELIABILITY_LOW: - out.horReliability = LOCATION_RELIABILITY_LOW; - break; - case LOC_RELIABILITY_MEDIUM: - out.horReliability = LOCATION_RELIABILITY_MEDIUM; - break; - case LOC_RELIABILITY_HIGH: - out.horReliability = LOCATION_RELIABILITY_HIGH; - break; - default: - out.horReliability = LOCATION_RELIABILITY_NOT_SET; - break; - } - } - if (GPS_LOCATION_EXTENDED_HAS_VERT_RELIABILITY & locationExtended.flags) { - out.flags |= GNSS_LOCATION_INFO_VER_RELIABILITY_BIT; - switch (locationExtended.vertical_reliability) { - case LOC_RELIABILITY_VERY_LOW: - out.verReliability = LOCATION_RELIABILITY_VERY_LOW; - break; - case LOC_RELIABILITY_LOW: - out.verReliability = LOCATION_RELIABILITY_LOW; - break; - case LOC_RELIABILITY_MEDIUM: - out.verReliability = LOCATION_RELIABILITY_MEDIUM; - break; - case LOC_RELIABILITY_HIGH: - out.verReliability = LOCATION_RELIABILITY_HIGH; - break; - default: - out.verReliability = LOCATION_RELIABILITY_NOT_SET; - break; - } - } - if (GPS_LOCATION_EXTENDED_HAS_HOR_ELIP_UNC_MAJOR & locationExtended.flags) { - out.flags |= GNSS_LOCATION_INFO_HOR_ACCURACY_ELIP_SEMI_MAJOR_BIT; - out.horUncEllipseSemiMajor = locationExtended.horUncEllipseSemiMajor; - } - if (GPS_LOCATION_EXTENDED_HAS_HOR_ELIP_UNC_MINOR & locationExtended.flags) { - out.flags |= GNSS_LOCATION_INFO_HOR_ACCURACY_ELIP_SEMI_MINOR_BIT; - out.horUncEllipseSemiMinor = locationExtended.horUncEllipseSemiMinor; - } - if (GPS_LOCATION_EXTENDED_HAS_HOR_ELIP_UNC_AZIMUTH & locationExtended.flags) { - out.flags |= GNSS_LOCATION_INFO_HOR_ACCURACY_ELIP_AZIMUTH_BIT; - out.horUncEllipseOrientAzimuth = locationExtended.horUncEllipseOrientAzimuth; - } -} - -inline uint32_t -GnssAdapter::convertGpsLock(const GnssConfigGpsLock gpsLock) -{ - switch (gpsLock) { - case GNSS_CONFIG_GPS_LOCK_MO: - return 1; - case GNSS_CONFIG_GPS_LOCK_NI: - return 2; - case GNSS_CONFIG_GPS_LOCK_MO_AND_NI: - return 3; - case GNSS_CONFIG_GPS_LOCK_NONE: - default: - return 0; - } -} - -inline GnssConfigGpsLock -GnssAdapter::convertGpsLock(const uint32_t gpsLock) -{ - switch (gpsLock) { - case 1: - return GNSS_CONFIG_GPS_LOCK_MO; - case 2: - return GNSS_CONFIG_GPS_LOCK_NI; - case 3: - return GNSS_CONFIG_GPS_LOCK_MO_AND_NI; - case 0: - default: - return GNSS_CONFIG_GPS_LOCK_NONE; - } -} - -inline uint32_t -GnssAdapter::convertSuplVersion(const GnssConfigSuplVersion suplVersion) -{ - switch (suplVersion) { - case GNSS_CONFIG_SUPL_VERSION_2_0_0: - return 0x00020000; - case GNSS_CONFIG_SUPL_VERSION_2_0_2: - return 0x00020002; - case GNSS_CONFIG_SUPL_VERSION_1_0_0: - default: - return 0x00010000; - } -} - -inline GnssConfigSuplVersion -GnssAdapter::convertSuplVersion(const uint32_t suplVersion) -{ - switch (suplVersion) { - case 0x00020000: - return GNSS_CONFIG_SUPL_VERSION_2_0_0; - case 0x00020002: - return GNSS_CONFIG_SUPL_VERSION_2_0_2; - case 0x00010000: - default: - return GNSS_CONFIG_SUPL_VERSION_1_0_0; - } -} - -inline uint32_t -GnssAdapter::convertLppProfile(const GnssConfigLppProfile lppProfile) -{ - switch (lppProfile) { - case GNSS_CONFIG_LPP_PROFILE_USER_PLANE: - return 1; - case GNSS_CONFIG_LPP_PROFILE_CONTROL_PLANE: - return 2; - case GNSS_CONFIG_LPP_PROFILE_USER_PLANE_AND_CONTROL_PLANE: - return 3; - case GNSS_CONFIG_LPP_PROFILE_RRLP_ON_LTE: - default: - return 0; - } -} - -inline GnssConfigLppProfile -GnssAdapter::convertLppProfile(const uint32_t lppProfile) -{ - switch (lppProfile) { - case 1: - return GNSS_CONFIG_LPP_PROFILE_USER_PLANE; - case 2: - return GNSS_CONFIG_LPP_PROFILE_CONTROL_PLANE; - case 3: - return GNSS_CONFIG_LPP_PROFILE_USER_PLANE_AND_CONTROL_PLANE; - case 0: - default: - return GNSS_CONFIG_LPP_PROFILE_RRLP_ON_LTE; - } -} - -uint32_t -GnssAdapter::convertLppeCp(const GnssConfigLppeControlPlaneMask lppeControlPlaneMask) -{ - uint32_t mask = 0; - if (GNSS_CONFIG_LPPE_CONTROL_PLANE_DBH_BIT & lppeControlPlaneMask) { - mask |= (1<<0); - } - if (GNSS_CONFIG_LPPE_CONTROL_PLANE_WLAN_AP_MEASUREMENTS_BIT & lppeControlPlaneMask) { - mask |= (1<<1); - } - if (GNSS_CONFIG_LPPE_CONTROL_PLANE_SRN_AP_MEASUREMENTS_BIT & lppeControlPlaneMask) { - mask |= (1<<2); - } - if (GNSS_CONFIG_LPPE_CONTROL_PLANE_SENSOR_BARO_MEASUREMENTS_BIT & lppeControlPlaneMask) { - mask |= (1<<3); - } - return mask; -} - -GnssConfigLppeControlPlaneMask -GnssAdapter::convertLppeCp(const uint32_t lppeControlPlaneMask) -{ - GnssConfigLppeControlPlaneMask mask = 0; - if ((1<<0) & lppeControlPlaneMask) { - mask |= GNSS_CONFIG_LPPE_CONTROL_PLANE_DBH_BIT; - } - if ((1<<1) & lppeControlPlaneMask) { - mask |= GNSS_CONFIG_LPPE_CONTROL_PLANE_WLAN_AP_MEASUREMENTS_BIT; - } - if ((1<<2) & lppeControlPlaneMask) { - mask |= GNSS_CONFIG_LPPE_CONTROL_PLANE_SRN_AP_MEASUREMENTS_BIT; - } - if ((1<<3) & lppeControlPlaneMask) { - mask |= GNSS_CONFIG_LPPE_CONTROL_PLANE_SENSOR_BARO_MEASUREMENTS_BIT; - } - return mask; -} - - -uint32_t -GnssAdapter::convertLppeUp(const GnssConfigLppeUserPlaneMask lppeUserPlaneMask) -{ - uint32_t mask = 0; - if (GNSS_CONFIG_LPPE_USER_PLANE_DBH_BIT & lppeUserPlaneMask) { - mask |= (1<<0); - } - if (GNSS_CONFIG_LPPE_USER_PLANE_WLAN_AP_MEASUREMENTS_BIT & lppeUserPlaneMask) { - mask |= (1<<1); - } - if (GNSS_CONFIG_LPPE_USER_PLANE_SRN_AP_MEASUREMENTS_BIT & lppeUserPlaneMask) { - mask |= (1<<2); - } - if (GNSS_CONFIG_LPPE_USER_PLANE_SENSOR_BARO_MEASUREMENTS_BIT & lppeUserPlaneMask) { - mask |= (1<<3); - } - return mask; -} - -GnssConfigLppeUserPlaneMask -GnssAdapter::convertLppeUp(const uint32_t lppeUserPlaneMask) -{ - GnssConfigLppeUserPlaneMask mask = 0; - if ((1<<0) & lppeUserPlaneMask) { - mask |= GNSS_CONFIG_LPPE_USER_PLANE_DBH_BIT; - } - if ((1<<1) & lppeUserPlaneMask) { - mask |= GNSS_CONFIG_LPPE_USER_PLANE_WLAN_AP_MEASUREMENTS_BIT; - } - if ((1<<2) & lppeUserPlaneMask) { - mask |= GNSS_CONFIG_LPPE_USER_PLANE_SRN_AP_MEASUREMENTS_BIT; - } - if ((1<<3) & lppeUserPlaneMask) { - mask |= GNSS_CONFIG_LPPE_USER_PLANE_SENSOR_BARO_MEASUREMENTS_BIT; - } - return mask; -} - -uint32_t -GnssAdapter::convertAGloProt(const GnssConfigAGlonassPositionProtocolMask aGloPositionProtocolMask) -{ - uint32_t mask = 0; - if (GNSS_CONFIG_RRC_CONTROL_PLANE_BIT & aGloPositionProtocolMask) { - mask |= (1<<0); - } - if (GNSS_CONFIG_RRLP_USER_PLANE_BIT & aGloPositionProtocolMask) { - mask |= (1<<1); - } - if (GNSS_CONFIG_LLP_USER_PLANE_BIT & aGloPositionProtocolMask) { - mask |= (1<<2); - } - if (GNSS_CONFIG_LLP_CONTROL_PLANE_BIT & aGloPositionProtocolMask) { - mask |= (1<<3); - } - return mask; -} - -uint32_t -GnssAdapter::convertEP4ES(const GnssConfigEmergencyPdnForEmergencySupl emergencyPdnForEmergencySupl) -{ - switch (emergencyPdnForEmergencySupl) { - case GNSS_CONFIG_EMERGENCY_PDN_FOR_EMERGENCY_SUPL_YES: - return 1; - case GNSS_CONFIG_EMERGENCY_PDN_FOR_EMERGENCY_SUPL_NO: - default: - return 0; - } -} - -uint32_t -GnssAdapter::convertSuplEs(const GnssConfigSuplEmergencyServices suplEmergencyServices) -{ - switch (suplEmergencyServices) { - case GNSS_CONFIG_SUPL_EMERGENCY_SERVICES_YES: - return 1; - case GNSS_CONFIG_SUPL_EMERGENCY_SERVICES_NO: - default: - return 0; - } -} - -uint32_t -GnssAdapter::convertSuplMode(const GnssConfigSuplModeMask suplModeMask) -{ - uint32_t mask = 0; - if (GNSS_CONFIG_SUPL_MODE_MSB_BIT & suplModeMask) { - mask |= (1<<0); - } - if (GNSS_CONFIG_SUPL_MODE_MSA_BIT & suplModeMask) { - mask |= (1<<1); - } - return mask; -} - -bool -GnssAdapter::resolveInAddress(const char* hostAddress, struct in_addr* inAddress) -{ - bool ret = true; - - struct hostent* hp; - hp = gethostbyname(hostAddress); - if (hp != NULL) { /* DNS OK */ - memcpy(inAddress, hp->h_addr_list[0], hp->h_length); - } else { - /* Try IP representation */ - if (inet_aton(hostAddress, inAddress) == 0) { - /* IP not valid */ - LOC_LOGE("%s]: DNS query on '%s' failed", __func__, hostAddress); - ret = false; - } - } - - return ret; -} - -void -GnssAdapter::readConfigCommand() -{ - LOC_LOGD("%s]: ", __func__); - - struct MsgReadConfig : public LocMsg { - GnssAdapter* mAdapter; - ContextBase& mContext; - inline MsgReadConfig(GnssAdapter* adapter, - ContextBase& context) : - LocMsg(), - mAdapter(adapter), - mContext(context) {} - inline virtual void proc() const { - // reads config into mContext->mGps_conf - mContext.readConfig(); - mContext.requestUlp((LocAdapterBase*)mAdapter, mContext.getCarrierCapabilities()); - } - }; - - if (mContext != NULL) { - sendMsg(new MsgReadConfig(this, *mContext)); - } -} - -LocationError -GnssAdapter::setSuplHostServer(const char* server, int port) -{ - LocationError locErr = LOCATION_ERROR_SUCCESS; - if (ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { - char serverUrl[MAX_URL_LEN] = {}; - int32_t length = -1; - const char noHost[] = "NONE"; - - locErr = LOCATION_ERROR_INVALID_PARAMETER; - - if ((NULL == server) || (server[0] == 0) || - (strncasecmp(noHost, server, sizeof(noHost)) == 0)) { - serverUrl[0] = '\0'; - length = 0; - } else if (port > 0) { - length = snprintf(serverUrl, sizeof(serverUrl), "%s:%u", server, port); - } - - if (length >= 0 && strncasecmp(getServerUrl().c_str(), - serverUrl, sizeof(serverUrl)) != 0) { - setServerUrl(serverUrl); - locErr = mLocApi->setServer(serverUrl, length); - if (locErr != LOCATION_ERROR_SUCCESS) { - LOC_LOGE("%s]:Error while setting SUPL_HOST server:%s", - __func__, serverUrl); - } - } - } - return locErr; -} - -void -GnssAdapter::setConfigCommand() -{ - LOC_LOGD("%s]: ", __func__); - - struct MsgSetConfig : public LocMsg { - GnssAdapter& mAdapter; - LocApiBase& mApi; - inline MsgSetConfig(GnssAdapter& adapter, - LocApiBase& api) : - LocMsg(), - mAdapter(adapter), - mApi(api) {} - inline virtual void proc() const { - if (ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { - mApi.setSUPLVersion(mAdapter.convertSuplVersion(ContextBase::mGps_conf.SUPL_VER)); - mApi.setLPPConfig(mAdapter.convertLppProfile(ContextBase::mGps_conf.LPP_PROFILE)); - mApi.setAGLONASSProtocol(ContextBase::mGps_conf.A_GLONASS_POS_PROTOCOL_SELECT); - } - mAdapter.setSuplHostServer(ContextBase::mGps_conf.SUPL_HOST, - ContextBase::mGps_conf.SUPL_PORT); - mApi.setSensorControlConfig(ContextBase::mSap_conf.SENSOR_USAGE, - ContextBase::mSap_conf.SENSOR_PROVIDER); - mApi.setLPPeProtocolCp( - mAdapter.convertLppeCp(ContextBase::mGps_conf.LPPE_CP_TECHNOLOGY)); - mApi.setLPPeProtocolUp( - mAdapter.convertLppeUp(ContextBase::mGps_conf.LPPE_UP_TECHNOLOGY)); - - // set nmea mask type - uint32_t mask = 0; - if (NMEA_PROVIDER_MP == ContextBase::mGps_conf.NMEA_PROVIDER) { - mask |= LOC_NMEA_ALL_GENERAL_SUPPORTED_MASK; - } - if (mApi.isFeatureSupported(LOC_SUPPORTED_FEATURE_DEBUG_NMEA_V02)) { - mask |= LOC_NMEA_MASK_DEBUG_V02; - } - if (mask != 0) { - mApi.setNMEATypes(mask); - } - mAdapter.mNmeaMask= mask; - - mApi.setXtraVersionCheck(ContextBase::mGps_conf.XTRA_VERSION_CHECK); - if (ContextBase::mSap_conf.GYRO_BIAS_RANDOM_WALK_VALID || - ContextBase::mSap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID || - ContextBase::mSap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID || - ContextBase::mSap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID || - ContextBase::mSap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID ) { - mApi.setSensorProperties( - ContextBase::mSap_conf.GYRO_BIAS_RANDOM_WALK_VALID, - ContextBase::mSap_conf.GYRO_BIAS_RANDOM_WALK, - ContextBase::mSap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID, - ContextBase::mSap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY, - ContextBase::mSap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID, - ContextBase::mSap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY, - ContextBase::mSap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID, - ContextBase::mSap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY, - ContextBase::mSap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID, - ContextBase::mSap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY); - } - mApi.setSensorPerfControlConfig( - ContextBase::mSap_conf.SENSOR_CONTROL_MODE, - ContextBase::mSap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH, - ContextBase::mSap_conf.SENSOR_ACCEL_BATCHES_PER_SEC, - ContextBase::mSap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH, - ContextBase::mSap_conf.SENSOR_GYRO_BATCHES_PER_SEC, - ContextBase::mSap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH, - ContextBase::mSap_conf.SENSOR_ACCEL_BATCHES_PER_SEC_HIGH, - ContextBase::mSap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH, - ContextBase::mSap_conf.SENSOR_GYRO_BATCHES_PER_SEC_HIGH, - ContextBase::mSap_conf.SENSOR_ALGORITHM_CONFIG_MASK); - } - }; - - sendMsg(new MsgSetConfig(*this, *mLocApi)); -} - -uint32_t* -GnssAdapter::gnssUpdateConfigCommand(GnssConfig config) -{ - // count the number of bits set - GnssConfigFlagsMask flagsCopy = config.flags; - size_t count = 0; - while (flagsCopy > 0) { - if (flagsCopy & 1) { - count++; - } - flagsCopy >>= 1; - } - std::string idsString = "["; - uint32_t* ids = NULL; - if (count > 0) { - ids = new uint32_t[count]; - if (ids == nullptr) { - LOC_LOGE("%s] new allocation failed, fatal error.", __func__); - return nullptr; - } - for (size_t i=0; i < count; ++i) { - ids[i] = generateSessionId(); - IF_LOC_LOGD { - idsString += std::to_string(ids[i]) + " "; - } - } - } - idsString += "]"; - - LOC_LOGD("%s]: ids %s flags 0x%X", __func__, idsString.c_str(), config.flags); - - struct MsgGnssUpdateConfig : public LocMsg { - GnssAdapter& mAdapter; - LocApiBase& mApi; - GnssConfig mConfig; - uint32_t* mIds; - size_t mCount; - inline MsgGnssUpdateConfig(GnssAdapter& adapter, - LocApiBase& api, - GnssConfig config, - uint32_t* ids, - size_t count) : - LocMsg(), - mAdapter(adapter), - mApi(api), - mConfig(config), - mIds(ids), - mCount(count) {} - inline virtual ~MsgGnssUpdateConfig() - { - delete[] mIds; - } - inline virtual void proc() const { - LocationError* errs = new LocationError[mCount]; - LocationError err = LOCATION_ERROR_SUCCESS; - uint32_t index = 0; - - if (errs == nullptr) { - LOC_LOGE("%s] new allocation failed, fatal error.", __func__); - return; - } - - if (mConfig.flags & GNSS_CONFIG_FLAGS_GPS_LOCK_VALID_BIT) { - uint32_t newGpsLock = mAdapter.convertGpsLock(mConfig.gpsLock); - ContextBase::mGps_conf.GPS_LOCK = newGpsLock; - if (0 == mAdapter.getPowerVoteId()) { - err = mApi.setGpsLock(mConfig.gpsLock); - } - if (index < mCount) { - errs[index] = err; - } - index++; - } - if (mConfig.flags & GNSS_CONFIG_FLAGS_SUPL_VERSION_VALID_BIT) { - uint32_t newSuplVersion = mAdapter.convertSuplVersion(mConfig.suplVersion); - if (newSuplVersion != ContextBase::mGps_conf.SUPL_VER && - ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { - ContextBase::mGps_conf.SUPL_VER = newSuplVersion; - err = mApi.setSUPLVersion(mConfig.suplVersion); - } else { - err = LOCATION_ERROR_SUCCESS; - } - if (index < mCount) { - errs[index] = err; - } - index++; - } - if (mConfig.flags & GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT) { - if (GNSS_ASSISTANCE_TYPE_SUPL == mConfig.assistanceServer.type) { - err = mAdapter.setSuplHostServer(mConfig.assistanceServer.hostName, - mConfig.assistanceServer.port); - } else if (GNSS_ASSISTANCE_TYPE_C2K == mConfig.assistanceServer.type) { - if (ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { - struct in_addr addr; - if (!mAdapter.resolveInAddress(mConfig.assistanceServer.hostName, - &addr)) { - LOC_LOGE("%s]: hostName %s cannot be resolved", - __func__, mConfig.assistanceServer.hostName); - err = LOCATION_ERROR_INVALID_PARAMETER; - } else { - unsigned int ip = htonl(addr.s_addr); - err = mApi.setServer(ip, mConfig.assistanceServer.port, - LOC_AGPS_CDMA_PDE_SERVER); - } - } else { - err = LOCATION_ERROR_SUCCESS; - } - } else { - LOC_LOGE("%s]: Not a valid gnss assistance type %u", - __func__, mConfig.assistanceServer.type); - err = LOCATION_ERROR_INVALID_PARAMETER; - } - if (index < mCount) { - errs[index] = err; - } - index++; - } - if (mConfig.flags & GNSS_CONFIG_FLAGS_LPP_PROFILE_VALID_BIT) { - uint32_t newLppProfile = mAdapter.convertLppProfile(mConfig.lppProfile); - if (newLppProfile != ContextBase::mGps_conf.LPP_PROFILE && - ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { - ContextBase::mGps_conf.LPP_PROFILE = newLppProfile; - err = mApi.setLPPConfig(mConfig.lppProfile); - } else { - err = LOCATION_ERROR_SUCCESS; - } - if (index < mCount) { - errs[index] = err; - } - index++; - } - if (mConfig.flags & GNSS_CONFIG_FLAGS_LPPE_CONTROL_PLANE_VALID_BIT) { - uint32_t newLppeControlPlaneMask = - mAdapter.convertLppeCp(mConfig.lppeControlPlaneMask); - if (newLppeControlPlaneMask != ContextBase::mGps_conf.LPPE_CP_TECHNOLOGY) { - ContextBase::mGps_conf.LPPE_CP_TECHNOLOGY = newLppeControlPlaneMask; - err = mApi.setLPPeProtocolCp(mConfig.lppeControlPlaneMask); - } else { - err = LOCATION_ERROR_SUCCESS; - } - if (index < mCount) { - errs[index] = err; - } - index++; - } - if (mConfig.flags & GNSS_CONFIG_FLAGS_LPPE_USER_PLANE_VALID_BIT) { - uint32_t newLppeUserPlaneMask = - mAdapter.convertLppeUp(mConfig.lppeUserPlaneMask); - if (newLppeUserPlaneMask != ContextBase::mGps_conf.LPPE_UP_TECHNOLOGY) { - ContextBase::mGps_conf.LPPE_UP_TECHNOLOGY = newLppeUserPlaneMask; - err = mApi.setLPPeProtocolUp(mConfig.lppeUserPlaneMask); - } else { - err = LOCATION_ERROR_SUCCESS; - } - if (index < mCount) { - errs[index] = err; - } - index++; - } - if (mConfig.flags & GNSS_CONFIG_FLAGS_AGLONASS_POSITION_PROTOCOL_VALID_BIT) { - uint32_t newAGloProtMask = - mAdapter.convertAGloProt(mConfig.aGlonassPositionProtocolMask); - if (newAGloProtMask != ContextBase::mGps_conf.A_GLONASS_POS_PROTOCOL_SELECT && - ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { - ContextBase::mGps_conf.A_GLONASS_POS_PROTOCOL_SELECT = newAGloProtMask; - err = mApi.setAGLONASSProtocol(mConfig.aGlonassPositionProtocolMask); - } else { - err = LOCATION_ERROR_SUCCESS; - } - if (index < mCount) { - errs[index] = err; - } - index++; - } - if (mConfig.flags & GNSS_CONFIG_FLAGS_EM_PDN_FOR_EM_SUPL_VALID_BIT) { - uint32_t newEP4ES = mAdapter.convertEP4ES(mConfig.emergencyPdnForEmergencySupl); - if (newEP4ES != ContextBase::mGps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL) { - ContextBase::mGps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL = newEP4ES; - } - err = LOCATION_ERROR_SUCCESS; - if (index < mCount) { - errs[index] = err; - } - index++; - } - if (mConfig.flags & GNSS_CONFIG_FLAGS_SUPL_EM_SERVICES_BIT) { - uint32_t newSuplEs = mAdapter.convertSuplEs(mConfig.suplEmergencyServices); - if (newSuplEs != ContextBase::mGps_conf.SUPL_ES) { - ContextBase::mGps_conf.SUPL_ES = newSuplEs; - } - err = LOCATION_ERROR_SUCCESS; - if (index < mCount) { - errs[index] = err; - } - index++; - } - if (mConfig.flags & GNSS_CONFIG_FLAGS_SUPL_MODE_BIT) { - uint32_t newSuplMode = mAdapter.convertSuplMode(mConfig.suplModeMask); - if (newSuplMode != ContextBase::mGps_conf.SUPL_MODE) { - ContextBase::mGps_conf.SUPL_MODE = newSuplMode; - mAdapter.getUlpProxy()->setCapabilities( - ContextBase::getCarrierCapabilities()); - mAdapter.broadcastCapabilities(mAdapter.getCapabilities()); - } - err = LOCATION_ERROR_SUCCESS; - if (index < mCount) { - errs[index] = err; - } - index++; - } - - mAdapter.reportResponse(index, errs, mIds); - delete[] errs; - } - }; - - if (NULL != ids) { - sendMsg(new MsgGnssUpdateConfig(*this, *mLocApi, config, ids, count)); - } else { - LOC_LOGE("%s]: No GNSS config items to update", __func__); - } - - return ids; -} - -uint32_t -GnssAdapter::gnssDeleteAidingDataCommand(GnssAidingData& data) -{ - uint32_t sessionId = generateSessionId(); - LOC_LOGD("%s]: id %u", __func__, sessionId); - - struct MsgDeleteAidingData : public LocMsg { - GnssAdapter& mAdapter; - LocApiBase& mApi; - uint32_t mSessionId; - GnssAidingData mData; - inline MsgDeleteAidingData(GnssAdapter& adapter, - LocApiBase& api, - uint32_t sessionId, - GnssAidingData& data) : - LocMsg(), - mAdapter(adapter), - mApi(api), - mSessionId(sessionId), - mData(data) {} - inline virtual void proc() const { - LocationError err = LOCATION_ERROR_SUCCESS; - err = mApi.deleteAidingData(mData); - mAdapter.reportResponse(err, mSessionId); - SystemStatus* s = mAdapter.getSystemStatus(); - if ((nullptr != s) && (mData.deleteAll)) { - s->setDefaultGnssEngineStates(); - } - } - }; - - sendMsg(new MsgDeleteAidingData(*this, *mLocApi, sessionId, data)); - return sessionId; -} - -void -GnssAdapter::gnssUpdateXtraThrottleCommand(const bool enabled) -{ - LOC_LOGD("%s] enabled:%d", __func__, enabled); - - struct UpdateXtraThrottleMsg : public LocMsg { - GnssAdapter& mAdapter; - const bool mEnabled; - inline UpdateXtraThrottleMsg(GnssAdapter& adapter, const bool enabled) : - LocMsg(), - mAdapter(adapter), - mEnabled(enabled) {} - inline virtual void proc() const { - mAdapter.mXtraObserver.updateXtraThrottle(mEnabled); - } - }; - - sendMsg(new UpdateXtraThrottleMsg(*this, enabled)); -} - -void -GnssAdapter::injectLocationCommand(double latitude, double longitude, float accuracy) -{ - LOC_LOGD("%s]: latitude %8.4f longitude %8.4f accuracy %8.4f", - __func__, latitude, longitude, accuracy); - - struct MsgInjectLocation : public LocMsg { - LocApiBase& mApi; - ContextBase& mContext; - double mLatitude; - double mLongitude; - float mAccuracy; - inline MsgInjectLocation(LocApiBase& api, - ContextBase& context, - double latitude, - double longitude, - float accuracy) : - LocMsg(), - mApi(api), - mContext(context), - mLatitude(latitude), - mLongitude(longitude), - mAccuracy(accuracy) {} - inline virtual void proc() const { - if (!mContext.hasCPIExtendedCapabilities()) { - mApi.injectPosition(mLatitude, mLongitude, mAccuracy); - } - } - }; - - sendMsg(new MsgInjectLocation(*mLocApi, *mContext, latitude, longitude, accuracy)); -} - -void -GnssAdapter::injectTimeCommand(int64_t time, int64_t timeReference, int32_t uncertainty) -{ - LOC_LOGD("%s]: time %lld timeReference %lld uncertainty %d", - __func__, (long long)time, (long long)timeReference, uncertainty); - - struct MsgInjectTime : public LocMsg { - LocApiBase& mApi; - ContextBase& mContext; - int64_t mTime; - int64_t mTimeReference; - int32_t mUncertainty; - inline MsgInjectTime(LocApiBase& api, - ContextBase& context, - int64_t time, - int64_t timeReference, - int32_t uncertainty) : - LocMsg(), - mApi(api), - mContext(context), - mTime(time), - mTimeReference(timeReference), - mUncertainty(uncertainty) {} - inline virtual void proc() const { - mApi.setTime(mTime, mTimeReference, mUncertainty); - } - }; - - sendMsg(new MsgInjectTime(*mLocApi, *mContext, time, timeReference, uncertainty)); -} - -void -GnssAdapter::setUlpProxyCommand(UlpProxyBase* ulp) -{ - LOC_LOGD("%s]: ", __func__); - - struct MsgSetUlpProxy : public LocMsg { - GnssAdapter& mAdapter; - UlpProxyBase* mUlp; - inline MsgSetUlpProxy(GnssAdapter& adapter, - UlpProxyBase* ulp) : - LocMsg(), - mAdapter(adapter), - mUlp(ulp) {} - inline virtual void proc() const { - mAdapter.setUlpProxy(mUlp); - if (mUlp) { - mUlp->setCapabilities(ContextBase::getCarrierCapabilities()); - } - } - }; - - sendMsg(new MsgSetUlpProxy(*this, ulp)); -} - -void -GnssAdapter::setUlpProxy(UlpProxyBase* ulp) -{ - if (ulp == mUlpProxy) { - //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]: ulp pointer is NULL", __func__); - ulp = new UlpProxyBase(); - } - - if (LOC_POSITION_MODE_INVALID != mUlpProxy->mPosMode.mode) { - // need to send this mode and start msg to ULP - ulp->sendFixMode(mUlpProxy->mPosMode); - } - - if (mUlpProxy->mFixSet) { - ulp->sendStartFix(); - } - - delete mUlpProxy; - mUlpProxy = ulp; -} - -void -GnssAdapter::addClientCommand(LocationAPI* client, const LocationCallbacks& callbacks) -{ - LOC_LOGD("%s]: client %p", __func__, client); - - struct MsgAddClient : public LocMsg { - GnssAdapter& mAdapter; - LocationAPI* mClient; - const LocationCallbacks mCallbacks; - inline MsgAddClient(GnssAdapter& adapter, - LocationAPI* client, - const LocationCallbacks& callbacks) : - LocMsg(), - mAdapter(adapter), - mClient(client), - mCallbacks(callbacks) {} - inline virtual void proc() const { - mAdapter.saveClient(mClient, mCallbacks); - } - }; - - sendMsg(new MsgAddClient(*this, client, callbacks)); -} - -void -GnssAdapter::removeClientCommand(LocationAPI* client) -{ - LOC_LOGD("%s]: client %p", __func__, client); - - struct MsgRemoveClient : public LocMsg { - GnssAdapter& mAdapter; - LocationAPI* mClient; - inline MsgRemoveClient(GnssAdapter& adapter, - LocationAPI* client) : - LocMsg(), - mAdapter(adapter), - mClient(client) {} - inline virtual void proc() const { - mAdapter.stopClientSessions(mClient); - mAdapter.eraseClient(mClient); - } - }; - - sendMsg(new MsgRemoveClient(*this, client)); -} - -void -GnssAdapter::stopClientSessions(LocationAPI* client) -{ - LOC_LOGD("%s]: client %p", __func__, client); - for (auto it = mTrackingSessions.begin(); it != mTrackingSessions.end();) { - if (client == it->first.client) { - LocationError err = stopTrackingMultiplex(it->first.client, it->first.id); - if (LOCATION_ERROR_SUCCESS == err) { - it = mTrackingSessions.erase(it); - continue; - } - } - ++it; // increment only when not erasing an iterator - } - -} - -void -GnssAdapter::updateClientsEventMask() -{ - LOC_API_ADAPTER_EVENT_MASK_T mask = 0; - for (auto it=mClientData.begin(); it != mClientData.end(); ++it) { - if (it->second.trackingCb != nullptr) { - mask |= LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT; - } - if (it->second.gnssNiCb != nullptr) { - mask |= LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST; - } - if (it->second.gnssSvCb != nullptr) { - mask |= LOC_API_ADAPTER_BIT_SATELLITE_REPORT; - } - if ((it->second.gnssNmeaCb != nullptr) && (mNmeaMask)) { - mask |= LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT; - } - if (it->second.gnssMeasurementsCb != nullptr) { - mask |= LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT; - } - } - - /* - ** For Automotive use cases we need to enable MEASUREMENT and POLY - ** when QDR is enabled - */ - if(1 == ContextBase::mGps_conf.EXTERNAL_DR_ENABLED) { - mask |= LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT; - mask |= LOC_API_ADAPTER_BIT_GNSS_SV_POLYNOMIAL_REPORT; - - LOC_LOGD("%s]: Auto usecase, Enable MEAS/POLY - mask 0x%" PRIu64 "", __func__, mask); - } - - if (mAgpsCbInfo.statusV4Cb != NULL) { - mask |= LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST; - } - - // Add ODCPI handling - if (nullptr != mOdcpiRequestCb) { - mask |= LOC_API_ADAPTER_BIT_REQUEST_WIFI; - } - - updateEvtMask(mask, LOC_REGISTRATION_MASK_SET); -} - -void -GnssAdapter::handleEngineUpEvent() -{ - struct MsgRestartSessions : public LocMsg { - GnssAdapter& mAdapter; - inline MsgRestartSessions(GnssAdapter& adapter) : - LocMsg(), - mAdapter(adapter) {} - virtual void proc() const { - mAdapter.restartSessions(); - } - }; - - setConfigCommand(); - sendMsg(new MsgRestartSessions(*this)); -} - -void -GnssAdapter::restartSessions() -{ - LOC_LOGD("%s]: ", __func__); - - // odcpi session is no longer active after restart - mOdcpiRequestActive = false; - - if (mTrackingSessions.empty()) { - return; - } - - // get the LocationOptions that has the smallest interval, which should be the active one - LocationOptions smallestIntervalOptions = {}; // size is zero until set for the first time - for (auto it = mTrackingSessions.begin(); it != mTrackingSessions.end(); ++it) { - if (0 == smallestIntervalOptions.size || //size of zero means we havent set it yet - it->second.minInterval < smallestIntervalOptions.minInterval) { - smallestIntervalOptions = it->second; - } - } - - LocPosMode locPosMode = {}; - convertOptions(locPosMode, smallestIntervalOptions); - mLocApi->startFix(locPosMode); -} - -void -GnssAdapter::requestCapabilitiesCommand(LocationAPI* client) -{ - LOC_LOGD("%s]: ", __func__); - - struct MsgRequestCapabilities : public LocMsg { - GnssAdapter& mAdapter; - LocationAPI* mClient; - inline MsgRequestCapabilities(GnssAdapter& adapter, - LocationAPI* client) : - LocMsg(), - mAdapter(adapter), - mClient(client) {} - inline virtual void proc() const { - LocationCallbacks callbacks = mAdapter.getClientCallbacks(mClient); - if (callbacks.capabilitiesCb == nullptr) { - LOC_LOGE("%s]: capabilitiesCb is NULL", __func__); - return; - } - - LocationCapabilitiesMask mask = mAdapter.getCapabilities(); - callbacks.capabilitiesCb(mask); - } - }; - - sendMsg(new MsgRequestCapabilities(*this, client)); -} - -LocationCapabilitiesMask -GnssAdapter::getCapabilities() -{ - LocationCapabilitiesMask mask = 0; - uint32_t carrierCapabilities = ContextBase::getCarrierCapabilities(); - // time based tracking always supported - mask |= LOCATION_CAPABILITIES_TIME_BASED_TRACKING_BIT; - // geofence always supported - mask |= LOCATION_CAPABILITIES_GEOFENCE_BIT; - if (carrierCapabilities & LOC_GPS_CAPABILITY_MSB) { - mask |= LOCATION_CAPABILITIES_GNSS_MSB_BIT; - } - if (LOC_GPS_CAPABILITY_MSA & carrierCapabilities) { - mask |= LOCATION_CAPABILITIES_GNSS_MSA_BIT; - } - if (mLocApi == nullptr) - return mask; - if (mLocApi->isMessageSupported(LOC_API_ADAPTER_MESSAGE_DISTANCE_BASE_LOCATION_BATCHING)) { - mask |= LOCATION_CAPABILITIES_TIME_BASED_BATCHING_BIT | - LOCATION_CAPABILITIES_DISTANCE_BASED_BATCHING_BIT; - } - if (mLocApi->isMessageSupported(LOC_API_ADAPTER_MESSAGE_DISTANCE_BASE_TRACKING)) { - mask |= LOCATION_CAPABILITIES_DISTANCE_BASED_TRACKING_BIT; - } - if (mLocApi->isMessageSupported(LOC_API_ADAPTER_MESSAGE_OUTDOOR_TRIP_BATCHING)) { - mask |= LOCATION_CAPABILITIES_OUTDOOR_TRIP_BATCHING_BIT; - } - if (mLocApi->gnssConstellationConfig()) { - mask |= LOCATION_CAPABILITIES_GNSS_MEASUREMENTS_BIT; - } - if (mLocApi->isFeatureSupported(LOC_SUPPORTED_FEATURE_DEBUG_NMEA_V02)) { - mask |= LOCATION_CAPABILITIES_DEBUG_NMEA_BIT; - } - return mask; -} - -void -GnssAdapter::broadcastCapabilities(LocationCapabilitiesMask mask) -{ - for (auto it = mClientData.begin(); it != mClientData.end(); ++it) { - if (nullptr != it->second.capabilitiesCb) { - it->second.capabilitiesCb(mask); - } - } -} - -LocationCallbacks -GnssAdapter::getClientCallbacks(LocationAPI* client) -{ - LocationCallbacks callbacks = {}; - auto it = mClientData.find(client); - if (it != mClientData.end()) { - callbacks = it->second; - } - return callbacks; -} - -void -GnssAdapter::saveClient(LocationAPI* client, const LocationCallbacks& callbacks) -{ - mClientData[client] = callbacks; - updateClientsEventMask(); -} - -void -GnssAdapter::eraseClient(LocationAPI* client) -{ - auto it = mClientData.find(client); - if (it != mClientData.end()) { - mClientData.erase(it); - } - updateClientsEventMask(); -} - -bool -GnssAdapter::hasTrackingCallback(LocationAPI* client) -{ - auto it = mClientData.find(client); - return (it != mClientData.end() && it->second.trackingCb); -} - -bool -GnssAdapter::hasMeasurementsCallback(LocationAPI* client) -{ - auto it = mClientData.find(client); - return (it != mClientData.end() && it->second.gnssMeasurementsCb); -} - -bool -GnssAdapter::isTrackingSession(LocationAPI* client, uint32_t sessionId) -{ - LocationSessionKey key(client, sessionId); - return (mTrackingSessions.find(key) != mTrackingSessions.end()); -} - -void -GnssAdapter::saveTrackingSession(LocationAPI* client, uint32_t sessionId, - const LocationOptions& options) -{ - LocationSessionKey key(client, sessionId); - mTrackingSessions[key] = options; -} - -void -GnssAdapter::eraseTrackingSession(LocationAPI* client, uint32_t sessionId) -{ - LocationSessionKey key(client, sessionId); - auto it = mTrackingSessions.find(key); - if (it != mTrackingSessions.end()) { - mTrackingSessions.erase(it); - } - -} - -bool GnssAdapter::setUlpPositionMode(const LocPosMode& mode) { - if (!mUlpPositionMode.equals(mode)) { - mUlpPositionMode = mode; - return true; - } else { - return false; - } -} - -void -GnssAdapter::reportResponse(LocationAPI* client, LocationError err, uint32_t sessionId) -{ - LOC_LOGD("%s]: client %p id %u err %u", __func__, client, sessionId, err); - - auto it = mClientData.find(client); - if (it != mClientData.end() && - it->second.responseCb != nullptr) { - it->second.responseCb(err, sessionId); - } else { - LOC_LOGW("%s]: client %p id %u not found in data", __func__, client, sessionId); - } -} - -void -GnssAdapter::reportResponse(LocationError err, uint32_t sessionId) -{ - LOC_LOGD("%s]: id %u err %u", __func__, sessionId, err); - - if (mControlCallbacks.size > 0 && mControlCallbacks.responseCb != nullptr) { - mControlCallbacks.responseCb(err, sessionId); - } else { - LOC_LOGW("%s]: control client response callback not found", __func__); - } -} - -void -GnssAdapter::reportResponse(size_t count, LocationError* errs, uint32_t* ids) -{ - IF_LOC_LOGD { - std::string idsString = "["; - std::string errsString = "["; - if (NULL != ids && NULL != errs) { - for (size_t i=0; i < count; ++i) { - idsString += std::to_string(ids[i]) + " "; - errsString += std::to_string(errs[i]) + " "; - } - } - idsString += "]"; - errsString += "]"; - - LOC_LOGD("%s]: ids %s errs %s", - __func__, idsString.c_str(), errsString.c_str()); - } - - if (mControlCallbacks.size > 0 && mControlCallbacks.collectiveResponseCb != nullptr) { - mControlCallbacks.collectiveResponseCb(count, errs, ids); - } else { - LOC_LOGW("%s]: control client callback not found", __func__); - } -} - -uint32_t -GnssAdapter::startTrackingCommand(LocationAPI* client, LocationOptions& options) -{ - uint32_t sessionId = generateSessionId(); - LOC_LOGD("%s]: client %p id %u minInterval %u mode %u", - __func__, client, sessionId, options.minInterval, options.mode); - - struct MsgStartTracking : public LocMsg { - GnssAdapter& mAdapter; - LocApiBase& mApi; - LocationAPI* mClient; - uint32_t mSessionId; - LocationOptions mOptions; - inline MsgStartTracking(GnssAdapter& adapter, - LocApiBase& api, - LocationAPI* client, - uint32_t sessionId, - LocationOptions options) : - LocMsg(), - mAdapter(adapter), - mApi(api), - mClient(client), - mSessionId(sessionId), - mOptions(options) {} - inline virtual void proc() const { - LocationError err = LOCATION_ERROR_SUCCESS; - if (!mAdapter.hasTrackingCallback(mClient) && - !mAdapter.hasMeasurementsCallback(mClient)) { - err = LOCATION_ERROR_CALLBACK_MISSING; - } else if (0 == mOptions.size) { - err = LOCATION_ERROR_INVALID_PARAMETER; - } else { - // Api doesn't support multiple clients for time based tracking, so mutiplex - err = mAdapter.startTrackingMultiplex(mOptions); - if (LOCATION_ERROR_SUCCESS == err) { - mAdapter.saveTrackingSession(mClient, mSessionId, mOptions); - } - } - mAdapter.reportResponse(mClient, err, mSessionId); - } - }; - - sendMsg(new MsgStartTracking(*this, *mLocApi, client, sessionId, options)); - return sessionId; - -} - -LocationError -GnssAdapter::startTrackingMultiplex(const LocationOptions& options) -{ - LocationError err = LOCATION_ERROR_SUCCESS; - - if (mTrackingSessions.empty()) { - err = startTracking(options); - } else { - // get the LocationOptions that has the smallest interval, which should be the active one - LocationOptions smallestIntervalOptions = {}; // size is zero until set for the first time - for (auto it = mTrackingSessions.begin(); it != mTrackingSessions.end(); ++it) { - if (0 == smallestIntervalOptions.size || //size of zero means we havent set it yet - it->second.minInterval < smallestIntervalOptions.minInterval) { - smallestIntervalOptions = it->second; - } - } - // if new session's minInterval is smaller than any in other sessions - if (options.minInterval < smallestIntervalOptions.minInterval) { - // restart time based tracking with new options - err = startTracking(options); - } - } - - return err; -} - -LocationError -GnssAdapter::startTracking(const LocationOptions& options) -{ - LocationError err = LOCATION_ERROR_SUCCESS; - LocPosMode locPosMode = {}; - convertOptions(locPosMode, options); - if (!mUlpProxy->sendFixMode(locPosMode)) { - // do nothing - } - if (!mUlpProxy->sendStartFix()) { - loc_api_adapter_err apiErr = mLocApi->startFix(locPosMode); - if (LOC_API_ADAPTER_ERR_SUCCESS == apiErr) { - err = LOCATION_ERROR_SUCCESS; - } else { - err = LOCATION_ERROR_GENERAL_FAILURE; - } - } - - return err; -} - -void -GnssAdapter::setPositionModeCommand(LocPosMode& locPosMode) -{ - LOC_LOGD("%s]: min_interval %u mode %u", - __func__, locPosMode.min_interval, locPosMode.mode); - - struct MsgSetPositionMode : public LocMsg { - GnssAdapter& mAdapter; - LocApiBase& mApi; - LocPosMode mLocPosMode; - inline MsgSetPositionMode(GnssAdapter& adapter, - LocApiBase& api, - LocPosMode& locPosMode) : - LocMsg(), - mAdapter(adapter), - mApi(api), - mLocPosMode(locPosMode) {} - inline virtual void proc() const { - // saves the mode in adapter to be used when startTrackingCommand is called from ULP - if (mAdapter.setUlpPositionMode(mLocPosMode)) { - mApi.setPositionMode(mLocPosMode); - } - } - }; - - sendMsg(new MsgSetPositionMode(*this, *mLocApi, locPosMode)); -} - -void -GnssAdapter::startTrackingCommand() -{ - LOC_LOGD("%s]: ", __func__); - - struct MsgStartTracking : public LocMsg { - GnssAdapter& mAdapter; - LocApiBase& mApi; - inline MsgStartTracking(GnssAdapter& adapter, - LocApiBase& api) : - LocMsg(), - mAdapter(adapter), - mApi(api) {} - inline virtual void proc() const { - // we get this call from ULP, so just call LocApi without multiplexing because - // ulp would be doing the multiplexing for us if it is present - if (!mAdapter.isInSession()) { - LocPosMode& ulpPositionMode = mAdapter.getUlpPositionMode(); - mApi.startFix(ulpPositionMode); - } - } - }; - - sendMsg(new MsgStartTracking(*this, *mLocApi)); -} - -void -GnssAdapter::updateTrackingOptionsCommand(LocationAPI* client, uint32_t id, - LocationOptions& options) -{ - LOC_LOGD("%s]: client %p id %u minInterval %u mode %u", - __func__, client, id, options.minInterval, options.mode); - - struct MsgUpdateTracking : public LocMsg { - GnssAdapter& mAdapter; - LocApiBase& mApi; - LocationAPI* mClient; - uint32_t mSessionId; - LocationOptions mOptions; - inline MsgUpdateTracking(GnssAdapter& adapter, - LocApiBase& api, - LocationAPI* client, - uint32_t sessionId, - LocationOptions options) : - LocMsg(), - mAdapter(adapter), - mApi(api), - mClient(client), - mSessionId(sessionId), - mOptions(options) {} - inline virtual void proc() const { - if (mAdapter.isTrackingSession(mClient, mSessionId)) { - LocationError err = LOCATION_ERROR_SUCCESS; - if (0 == mOptions.size) { - err = LOCATION_ERROR_INVALID_PARAMETER; - } else { - // Api doesn't support multiple clients for time based tracking, so mutiplex - err = mAdapter.updateTrackingMultiplex(mClient, mSessionId, mOptions); - if (LOCATION_ERROR_SUCCESS == err) { - mAdapter.saveTrackingSession(mClient, mSessionId, mOptions); - } - } - mAdapter.reportResponse(mClient, err, mSessionId); - } - // we do not reportResponse for the case where there is no existing tracking session - // for the client and id being used, since updateTrackingCommand can be sent to both - // GnssAdapter & FlpAdapter by LocationAPI and we want to avoid incorrect error response - } - }; - - sendMsg(new MsgUpdateTracking(*this, *mLocApi, client, id, options)); -} - -LocationError -GnssAdapter::updateTrackingMultiplex(LocationAPI* client, uint32_t id, - const LocationOptions& options) -{ - LocationError err = LOCATION_ERROR_SUCCESS; - - if (1 == mTrackingSessions.size()) { - err = startTracking(options); - } else { - LocationSessionKey key(client, id); - - // get the session we are updating - auto it = mTrackingSessions.find(key); - if (it != mTrackingSessions.end()) { - // find the smallest interval, other than the session we are updating - LocationOptions smallestIntervalOptions = {}; // size is 0 until set for the first time - for (auto it2 = mTrackingSessions.begin(); it2 != mTrackingSessions.end(); ++it2) { - // if session is not the one we are updating and either smallest interval is not set - // or there is a new smallest interval, then set the new smallest interval - if (it2->first != key && (0 == smallestIntervalOptions.size || - it2->second.minInterval < smallestIntervalOptions.minInterval)) { - smallestIntervalOptions = it2->second; - } - } - // if session we are updating has smaller interval then next smallest - if (options.minInterval < smallestIntervalOptions.minInterval) { - // restart time based tracking with the newly updated interval - err = startTracking(options); - // else if the session we are updating used to be the smallest - } else if (it->second.minInterval < smallestIntervalOptions.minInterval) { - // restart time based tracking with the next smallest - err = startTracking(smallestIntervalOptions); - } - } - } - - return err; -} - -void -GnssAdapter::stopTrackingCommand(LocationAPI* client, uint32_t id) -{ - LOC_LOGD("%s]: client %p id %u", __func__, client, id); - - struct MsgStopTracking : public LocMsg { - GnssAdapter& mAdapter; - LocApiBase& mApi; - LocationAPI* mClient; - uint32_t mSessionId; - inline MsgStopTracking(GnssAdapter& adapter, - LocApiBase& api, - LocationAPI* client, - uint32_t sessionId) : - LocMsg(), - mAdapter(adapter), - mApi(api), - mClient(client), - mSessionId(sessionId) {} - inline virtual void proc() const { - if (mAdapter.isTrackingSession(mClient, mSessionId)) { - LocationError err = LOCATION_ERROR_SUCCESS; - // Api doesn't support multiple clients for time based tracking, so mutiplex - err = mAdapter.stopTrackingMultiplex(mClient, mSessionId); - if (LOCATION_ERROR_SUCCESS == err) { - mAdapter.eraseTrackingSession(mClient, mSessionId); - } - mAdapter.reportResponse(mClient, err, mSessionId); - } - // we do not reportResponse for the case where there is no existing tracking session - // for the client and id being used, since stopTrackingCommand can be sent to both - // GnssAdapter & FlpAdapter by LocationAPI and we want to avoid incorrect error response - - } - }; - - sendMsg(new MsgStopTracking(*this, *mLocApi, client, id)); -} - -LocationError -GnssAdapter::stopTrackingMultiplex(LocationAPI* client, uint32_t id) -{ - LocationError err = LOCATION_ERROR_SUCCESS; - - if (1 == mTrackingSessions.size()) { - err = stopTracking(); - } else { - LocationSessionKey key(client, id); - - // get the session we are stopping - auto it = mTrackingSessions.find(key); - if (it != mTrackingSessions.end()) { - // find the next smallest interval, other than the session we are stopping - LocationOptions smallestIntervalOptions = {}; // size is 0 until set for the first time - for (auto it2 = mTrackingSessions.begin(); it2 != mTrackingSessions.end(); ++it2) { - // if session is not the one we are stopping and either smallest interval is not set - // or there is a new smallest interval, then set the new smallest interval - if (it2->first != key && (0 == smallestIntervalOptions.size || - it2->second.minInterval < smallestIntervalOptions.minInterval)) { - smallestIntervalOptions = it2->second; - } - } - // if session we are stopping has smaller interval then next smallest - if (it->second.minInterval < smallestIntervalOptions.minInterval) { - // restart time based tracking with next smallest interval - err = startTracking(smallestIntervalOptions); - } - } - } - - return err; -} - -LocationError -GnssAdapter::stopTracking() -{ - LocationError err = LOCATION_ERROR_SUCCESS; - if (!mUlpProxy->sendStopFix()) { - loc_api_adapter_err apiErr = mLocApi->stopFix(); - if (LOC_API_ADAPTER_ERR_SUCCESS == apiErr) { - err = LOCATION_ERROR_SUCCESS; - } else { - err = LOCATION_ERROR_GENERAL_FAILURE; - } - } - - return err; -} - -void -GnssAdapter::stopTrackingCommand() -{ - LOC_LOGD("%s]: ", __func__); - - struct MsgStopTracking : public LocMsg { - GnssAdapter& mAdapter; - LocApiBase& mApi; - inline MsgStopTracking(GnssAdapter& adapter, - LocApiBase& api) : - LocMsg(), - mAdapter(adapter), - mApi(api) {} - inline virtual void proc() const { - // clear the position mode - LocPosMode mLocPosMode = {}; - mLocPosMode.mode = LOC_POSITION_MODE_INVALID; - mAdapter.setUlpPositionMode(mLocPosMode); - // don't need to multiplex because ULP will do that for us if it is present - mApi.stopFix(); - } - }; - - sendMsg(new MsgStopTracking(*this, *mLocApi)); -} - -void -GnssAdapter::getZppCommand() -{ - LOC_LOGD("%s]: ", __func__); - - struct MsgGetZpp : public LocMsg { - GnssAdapter& mAdapter; - LocApiBase& mApi; - inline MsgGetZpp(GnssAdapter& adapter, - LocApiBase& api) : - LocMsg(), - mAdapter(adapter), - mApi(api) {} - inline virtual void proc() const { - UlpLocation location = {}; - LocPosTechMask techMask = LOC_POS_TECH_MASK_DEFAULT; - GpsLocationExtended locationExtended = {}; - locationExtended.size = sizeof(locationExtended); - - mApi.getBestAvailableZppFix(location.gpsLocation, locationExtended, - techMask); - //Mark the location source as from ZPP - location.gpsLocation.flags |= LOCATION_HAS_SOURCE_INFO; - location.position_source = ULP_LOCATION_IS_FROM_ZPP; - - mAdapter.getUlpProxy()->reportPosition(location, - locationExtended, - LOC_SESS_SUCCESS, - techMask); - } - }; - - sendMsg(new MsgGetZpp(*this, *mLocApi)); -} - -bool -GnssAdapter::hasNiNotifyCallback(LocationAPI* client) -{ - auto it = mClientData.find(client); - return (it != mClientData.end() && it->second.gnssNiCb); -} - -void -GnssAdapter::gnssNiResponseCommand(LocationAPI* client, - uint32_t id, - GnssNiResponse response) -{ - LOC_LOGD("%s]: client %p id %u response %u", __func__, client, id, response); - - struct MsgGnssNiResponse : public LocMsg { - GnssAdapter& mAdapter; - LocationAPI* mClient; - uint32_t mSessionId; - GnssNiResponse mResponse; - inline MsgGnssNiResponse(GnssAdapter& adapter, - LocationAPI* client, - uint32_t sessionId, - GnssNiResponse response) : - LocMsg(), - mAdapter(adapter), - mClient(client), - mSessionId(sessionId), - mResponse(response) {} - inline virtual void proc() const { - NiData& niData = mAdapter.getNiData(); - LocationError err = LOCATION_ERROR_SUCCESS; - if (!mAdapter.hasNiNotifyCallback(mClient)) { - err = LOCATION_ERROR_ID_UNKNOWN; - } else { - NiSession* pSession = NULL; - if (mSessionId == niData.sessionEs.reqID && - NULL != niData.sessionEs.rawRequest) { - pSession = &niData.sessionEs; - // ignore any SUPL NI non-Es session if a SUPL NI ES is accepted - if (mResponse == GNSS_NI_RESPONSE_ACCEPT && - NULL != niData.session.rawRequest) { - pthread_mutex_lock(&niData.session.tLock); - niData.session.resp = GNSS_NI_RESPONSE_IGNORE; - niData.session.respRecvd = true; - pthread_cond_signal(&niData.session.tCond); - pthread_mutex_unlock(&niData.session.tLock); - } - } else if (mSessionId == niData.session.reqID && - NULL != niData.session.rawRequest) { - pSession = &niData.session; - } - - if (pSession) { - LOC_LOGI("%s]: gnssNiResponseCommand: send user mResponse %u for id %u", - __func__, mResponse, mSessionId); - pthread_mutex_lock(&pSession->tLock); - pSession->resp = mResponse; - pSession->respRecvd = true; - pthread_cond_signal(&pSession->tCond); - pthread_mutex_unlock(&pSession->tLock); - } else { - err = LOCATION_ERROR_ID_UNKNOWN; - LOC_LOGE("%s]: gnssNiResponseCommand: id %u not an active session", - __func__, mSessionId); - } - } - mAdapter.reportResponse(mClient, err, mSessionId); - } - }; - - sendMsg(new MsgGnssNiResponse(*this, client, id, response)); - -} - -void -GnssAdapter::gnssNiResponseCommand(GnssNiResponse response, void* rawRequest) -{ - LOC_LOGD("%s]: response %u", __func__, response); - - struct MsgGnssNiResponse : public LocMsg { - LocApiBase& mApi; - const GnssNiResponse mResponse; - const void* mPayload; - inline MsgGnssNiResponse(LocApiBase& api, - const GnssNiResponse response, - const void* rawRequest) : - LocMsg(), - mApi(api), - mResponse(response), - mPayload(rawRequest) {} - inline virtual ~MsgGnssNiResponse() { - // 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 { - mApi.informNiResponse(mResponse, mPayload); - } - }; - - sendMsg(new MsgGnssNiResponse(*mLocApi, response, rawRequest)); - -} - -uint32_t -GnssAdapter::enableCommand(LocationTechnologyType techType) -{ - uint32_t sessionId = generateSessionId(); - LOC_LOGD("%s]: id %u techType %u", __func__, sessionId, techType); - - struct MsgEnableGnss : public LocMsg { - GnssAdapter& mAdapter; - LocApiBase& mApi; - ContextBase& mContext; - uint32_t mSessionId; - LocationTechnologyType mTechType; - inline MsgEnableGnss(GnssAdapter& adapter, - LocApiBase& api, - ContextBase& context, - uint32_t sessionId, - LocationTechnologyType techType) : - LocMsg(), - mAdapter(adapter), - mApi(api), - mContext(context), - mSessionId(sessionId), - mTechType(techType) {} - inline virtual void proc() const { - LocationError err = LOCATION_ERROR_SUCCESS; - uint32_t powerVoteId = mAdapter.getPowerVoteId(); - if (mTechType != LOCATION_TECHNOLOGY_TYPE_GNSS) { - err = LOCATION_ERROR_INVALID_PARAMETER; - } else if (powerVoteId > 0) { - err = LOCATION_ERROR_ALREADY_STARTED; - } else { - mAdapter.setPowerVoteId(mSessionId); - mApi.setGpsLock(GNSS_CONFIG_GPS_LOCK_NONE); - mAdapter.mXtraObserver.updateLockStatus( - mAdapter.convertGpsLock(GNSS_CONFIG_GPS_LOCK_NONE)); - } - mAdapter.reportResponse(err, mSessionId); - } - }; - - if (mContext != NULL) { - sendMsg(new MsgEnableGnss(*this, *mLocApi, *mContext, sessionId, techType)); - mContext->modemPowerVote(true); - } else { - LOC_LOGE("%s]: Context is NULL", __func__); - } - - return sessionId; -} - -void -GnssAdapter::disableCommand(uint32_t id) -{ - LOC_LOGD("%s]: id %u", __func__, id); - - struct MsgDisableGnss : public LocMsg { - GnssAdapter& mAdapter; - LocApiBase& mApi; - ContextBase& mContext; - uint32_t mSessionId; - inline MsgDisableGnss(GnssAdapter& adapter, - LocApiBase& api, - ContextBase& context, - uint32_t sessionId) : - LocMsg(), - mAdapter(adapter), - mApi(api), - mContext(context), - mSessionId(sessionId) {} - inline virtual void proc() const { - LocationError err = LOCATION_ERROR_SUCCESS; - uint32_t powerVoteId = mAdapter.getPowerVoteId(); - if (powerVoteId != mSessionId) { - err = LOCATION_ERROR_ID_UNKNOWN; - } else { - mAdapter.setPowerVoteId(0); - mApi.setGpsLock(mAdapter.convertGpsLock(ContextBase::mGps_conf.GPS_LOCK)); - mAdapter.mXtraObserver.updateLockStatus( - mAdapter.convertGpsLock(ContextBase::mGps_conf.GPS_LOCK)); - } - mAdapter.reportResponse(err, mSessionId); - } - }; - - if (mContext != NULL) { - sendMsg(new MsgDisableGnss(*this, *mLocApi, *mContext, id)); - mContext->modemPowerVote(false); - } - -} - -void -GnssAdapter::reportPositionEvent(const UlpLocation& ulpLocation, - const GpsLocationExtended& locationExtended, - enum loc_sess_status status, - LocPosTechMask techMask, - bool fromUlp) -{ - LOC_LOGD("%s]: fromUlp %u status %u", __func__, fromUlp, status); - - // if this event is not called from ULP, then try to call into ULP and return if successfull - if (!fromUlp) { - if (mUlpProxy->reportPosition(ulpLocation, locationExtended, - status, techMask)) { - return; - } - } - - struct MsgReportPosition : public LocMsg { - GnssAdapter& mAdapter; - const UlpLocation mUlpLocation; - const GpsLocationExtended mLocationExtended; - loc_sess_status mStatus; - LocPosTechMask mTechMask; - inline MsgReportPosition(GnssAdapter& adapter, - const UlpLocation& ulpLocation, - const GpsLocationExtended& locationExtended, - loc_sess_status status, - LocPosTechMask techMask) : - LocMsg(), - mAdapter(adapter), - mUlpLocation(ulpLocation), - mLocationExtended(locationExtended), - mStatus(status), - mTechMask(techMask) {} - inline virtual void proc() const { - // extract bug report info - this returns true if consumed by systemstatus - SystemStatus* s = mAdapter.getSystemStatus(); - if ((nullptr != s) && - ((LOC_SESS_SUCCESS == mStatus) || (LOC_SESS_INTERMEDIATE == mStatus))){ - s->eventPosition(mUlpLocation, mLocationExtended); - } - mAdapter.reportPosition(mUlpLocation, mLocationExtended, mStatus, mTechMask); - } - }; - - sendMsg(new MsgReportPosition(*this, ulpLocation, locationExtended, status, techMask)); -} - -bool -GnssAdapter::needReport(const UlpLocation& ulpLocation, - enum loc_sess_status status, - LocPosTechMask techMask) { - bool reported = false; - if (LOC_SESS_SUCCESS == status) { - // this is a final fix - LocPosTechMask mask = - LOC_POS_TECH_MASK_SATELLITE | LOC_POS_TECH_MASK_SENSORS | LOC_POS_TECH_MASK_HYBRID; - // it is a Satellite fix or a sensor fix - reported = (mask & techMask); - } else if (LOC_SESS_INTERMEDIATE == status && - LOC_SESS_INTERMEDIATE == ContextBase::mGps_conf.INTERMEDIATE_POS) { - // this is a intermediate fix and we accepte intermediate - - // it is NOT the case that - // there is inaccuracy; and - // we care about inaccuracy; and - // the inaccuracy exceeds our tolerance - reported = !((ulpLocation.gpsLocation.flags & LOC_GPS_LOCATION_HAS_ACCURACY) && - (ContextBase::mGps_conf.ACCURACY_THRES != 0) && - (ulpLocation.gpsLocation.accuracy > ContextBase::mGps_conf.ACCURACY_THRES)); - } - - return reported; -} - -void -GnssAdapter::reportPosition(const UlpLocation& ulpLocation, - const GpsLocationExtended& locationExtended, - enum loc_sess_status status, - LocPosTechMask techMask) -{ - bool reported = needReport(ulpLocation, status, techMask); - if (reported) { - if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_GNSS_SV_USED_DATA) { - mGnssSvIdUsedInPosAvail = true; - mGnssSvIdUsedInPosition = locationExtended.gnss_sv_used_ids; - } - for (auto it=mClientData.begin(); it != mClientData.end(); ++it) { - if (nullptr != it->second.trackingCb) { - Location location = {}; - convertLocation(location, ulpLocation.gpsLocation, locationExtended, techMask); - it->second.trackingCb(location); - } - if (nullptr != it->second.gnssLocationInfoCb) { - GnssLocationInfoNotification locationInfo = {}; - convertLocationInfo(locationInfo, locationExtended); - it->second.gnssLocationInfoCb(locationInfo); - } - } - } - - if (NMEA_PROVIDER_AP == ContextBase::mGps_conf.NMEA_PROVIDER && !mTrackingSessions.empty()) { - /*Only BlankNMEA sentence needs to be processed and sent, if both lat, long is 0 & - horReliability is not set. */ - bool blank_fix = ((0 == ulpLocation.gpsLocation.latitude) && - (0 == ulpLocation.gpsLocation.longitude) && - (LOC_RELIABILITY_NOT_SET == locationExtended.horizontal_reliability)); - uint8_t generate_nmea = (reported && status != LOC_SESS_FAILURE && !blank_fix); - std::vector<std::string> nmeaArraystr; - loc_nmea_generate_pos(ulpLocation, locationExtended, generate_nmea, nmeaArraystr); - for (auto sentence : nmeaArraystr) { - reportNmea(sentence.c_str(), sentence.length()); - } - } - - // Free the allocated memory for rawData - UlpLocation* gp = (UlpLocation*)&(ulpLocation); - if (gp != NULL && gp->rawData != NULL) - { - delete (char*)gp->rawData; - gp->rawData = NULL; - gp->rawDataSize = 0; - } -} - -void -GnssAdapter::reportSvEvent(const GnssSvNotification& svNotify, - bool fromUlp) -{ - LOC_LOGD("%s]: fromUlp %u", __func__, fromUlp); - - // if this event is not called from ULP, then try to call into ULP and return if successfull - if (!fromUlp) { - if (mUlpProxy->reportSv(svNotify)) { - return; - } - } - - struct MsgReportSv : public LocMsg { - GnssAdapter& mAdapter; - const GnssSvNotification mSvNotify; - inline MsgReportSv(GnssAdapter& adapter, - const GnssSvNotification& svNotify) : - LocMsg(), - mAdapter(adapter), - mSvNotify(svNotify) {} - inline virtual void proc() const { - mAdapter.reportSv((GnssSvNotification&)mSvNotify); - } - }; - - sendMsg(new MsgReportSv(*this, svNotify)); -} - -void -GnssAdapter::reportSv(GnssSvNotification& svNotify) -{ - int numSv = svNotify.count; - int16_t gnssSvId = 0; - uint64_t svUsedIdMask = 0; - for (int i=0; i < numSv; i++) { - svUsedIdMask = 0; - gnssSvId = svNotify.gnssSvs[i].svId; - switch (svNotify.gnssSvs[i].type) { - case GNSS_SV_TYPE_GPS: - if (mGnssSvIdUsedInPosAvail) { - svUsedIdMask = mGnssSvIdUsedInPosition.gps_sv_used_ids_mask; - } - break; - case GNSS_SV_TYPE_GLONASS: - if (mGnssSvIdUsedInPosAvail) { - svUsedIdMask = mGnssSvIdUsedInPosition.glo_sv_used_ids_mask; - } - break; - case GNSS_SV_TYPE_BEIDOU: - if (mGnssSvIdUsedInPosAvail) { - svUsedIdMask = mGnssSvIdUsedInPosition.bds_sv_used_ids_mask; - } - break; - case GNSS_SV_TYPE_GALILEO: - if (mGnssSvIdUsedInPosAvail) { - svUsedIdMask = mGnssSvIdUsedInPosition.gal_sv_used_ids_mask; - } - break; - case GNSS_SV_TYPE_QZSS: - if (mGnssSvIdUsedInPosAvail) { - svUsedIdMask = mGnssSvIdUsedInPosition.qzss_sv_used_ids_mask; - } - // QZSS SV id's need to reported as it is to framework, since - // framework expects it as it is. See GnssStatus.java. - // SV id passed to here by LocApi is 1-based. - svNotify.gnssSvs[i].svId += (QZSS_SV_PRN_MIN - 1); - break; - default: - svUsedIdMask = 0; - break; - } - - // If SV ID was used in previous position fix, then set USED_IN_FIX - // flag, else clear the USED_IN_FIX flag. - if (svUsedIdMask & (1 << (gnssSvId - 1))) { - svNotify.gnssSvs[i].gnssSvOptionsMask |= GNSS_SV_OPTIONS_USED_IN_FIX_BIT; - } - } - - for (auto it=mClientData.begin(); it != mClientData.end(); ++it) { - if (nullptr != it->second.gnssSvCb) { - it->second.gnssSvCb(svNotify); - } - } - - if (NMEA_PROVIDER_AP == ContextBase::mGps_conf.NMEA_PROVIDER && !mTrackingSessions.empty()) { - std::vector<std::string> nmeaArraystr; - loc_nmea_generate_sv(svNotify, nmeaArraystr); - for (auto sentence : nmeaArraystr) { - reportNmea(sentence.c_str(), sentence.length()); - } - } - - mGnssSvIdUsedInPosAvail = false; -} - -void -GnssAdapter::reportNmeaEvent(const char* nmea, size_t length, bool fromUlp) -{ - // if this event is not called from ULP, then try to call into ULP and return if successfull - if (!fromUlp && !loc_nmea_is_debug(nmea, length)) { - if (mUlpProxy->reportNmea(nmea, length)) { - return; - } - } - - struct MsgReportNmea : public LocMsg { - GnssAdapter& mAdapter; - const char* mNmea; - size_t mLength; - inline MsgReportNmea(GnssAdapter& adapter, - const char* nmea, - size_t length) : - LocMsg(), - mAdapter(adapter), - mNmea(new char[length+1]), - mLength(length) { - if (mNmea == nullptr) { - LOC_LOGE("%s] new allocation failed, fatal error.", __func__); - return; - } - strlcpy((char*)mNmea, nmea, length+1); - } - inline virtual ~MsgReportNmea() - { - delete[] mNmea; - } - inline virtual void proc() const { - // extract bug report info - this returns true if consumed by systemstatus - bool ret = false; - SystemStatus* s = mAdapter.getSystemStatus(); - if (nullptr != s) { - ret = s->setNmeaString(mNmea, mLength); - } - if (false == ret) { - // forward NMEA message to upper layer - mAdapter.reportNmea(mNmea, mLength); - } - } - }; - - sendMsg(new MsgReportNmea(*this, nmea, length)); -} - -void -GnssAdapter::reportNmea(const char* nmea, size_t length) -{ - GnssNmeaNotification nmeaNotification = {}; - nmeaNotification.size = sizeof(GnssNmeaNotification); - - struct timeval tv; - gettimeofday(&tv, (struct timezone *) NULL); - int64_t now = tv.tv_sec * 1000LL + tv.tv_usec / 1000; - nmeaNotification.timestamp = now; - nmeaNotification.nmea = nmea; - nmeaNotification.length = length; - - for (auto it=mClientData.begin(); it != mClientData.end(); ++it) { - if (nullptr != it->second.gnssNmeaCb) { - it->second.gnssNmeaCb(nmeaNotification); - } - } -} - -bool -GnssAdapter::requestNiNotifyEvent(const GnssNiNotification ¬ify, const void* data) -{ - LOC_LOGI("%s]: notif_type: %d, timeout: %d, default_resp: %d" - "requestor_id: %s (encoding: %d) text: %s text (encoding: %d) extras: %s", - __func__, notify.type, notify.timeout, notify.timeoutResponse, - notify.requestor, notify.requestorEncoding, - notify.message, notify.messageEncoding, notify.extras); - - struct MsgReportNiNotify : public LocMsg { - GnssAdapter& mAdapter; - const GnssNiNotification mNotify; - const void* mData; - inline MsgReportNiNotify(GnssAdapter& adapter, - const GnssNiNotification& notify, - const void* data) : - LocMsg(), - mAdapter(adapter), - mNotify(notify), - mData(data) {} - inline virtual void proc() const { - mAdapter.requestNiNotify(mNotify, mData); - } - }; - - sendMsg(new MsgReportNiNotify(*this, notify, data)); - - return true; -} - -static void* niThreadProc(void *args) -{ - NiSession* pSession = (NiSession*)args; - int rc = 0; /* return code from pthread calls */ - - struct timespec present_time; - struct timespec expire_time; - - pthread_mutex_lock(&pSession->tLock); - /* Calculate absolute expire time */ - clock_gettime(CLOCK_MONOTONIC, &present_time); - expire_time.tv_sec = present_time.tv_sec + pSession->respTimeLeft; - expire_time.tv_nsec = present_time.tv_nsec; - LOC_LOGD("%s]: time out set for abs time %ld with delay %d sec", - __func__, (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 = GNSS_NI_RESPONSE_NO_RESPONSE; - LOC_LOGD("%s]: time out after valting for specified time. Ret Val %d", - __func__, rc); - break; - } - } - LOC_LOGD("%s]: Java layer has sent us a user response and return value from " - "pthread_cond_timedwait = %d pSession->resp is %u", __func__, rc, pSession->resp); - pSession->respRecvd = false; /* Reset the user response flag for the next session*/ - - // adding this check to support modem restart, in which case, we need the thread - // to exit without calling sending data. We made sure that rawRequest is NULL in - // loc_eng_ni_reset_on_engine_restart() - GnssAdapter* adapter = pSession->adapter; - GnssNiResponse resp; - void* rawRequest = NULL; - bool sendResponse = false; - - if (NULL != pSession->rawRequest) { - if (pSession->resp != GNSS_NI_RESPONSE_IGNORE) { - resp = pSession->resp; - rawRequest = pSession->rawRequest; - sendResponse = true; - } else { - free(pSession->rawRequest); - } - pSession->rawRequest = NULL; - } - pthread_mutex_unlock(&pSession->tLock); - - pSession->respTimeLeft = 0; - pSession->reqID = 0; - - if (sendResponse) { - adapter->gnssNiResponseCommand(resp, rawRequest); - } - - return NULL; -} - -bool -GnssAdapter::requestNiNotify(const GnssNiNotification& notify, const void* data) -{ - NiSession* pSession = NULL; - gnssNiCallback gnssNiCb = nullptr; - - for (auto it=mClientData.begin(); it != mClientData.end(); ++it) { - if (nullptr != it->second.gnssNiCb) { - gnssNiCb = it->second.gnssNiCb; - break; - } - } - if (nullptr == gnssNiCb) { - EXIT_LOG(%s, "no clients with gnssNiCb."); - return false; - } - - if (notify.type == GNSS_NI_TYPE_EMERGENCY_SUPL) { - if (NULL != mNiData.sessionEs.rawRequest) { - LOC_LOGI("%s]: supl es NI in progress, new supl es NI ignored, type: %d", - __func__, notify.type); - if (NULL != data) { - free((void*)data); - } - } else { - pSession = &mNiData.sessionEs; - } - } else { - if (NULL != mNiData.session.rawRequest || - NULL != mNiData.sessionEs.rawRequest) { - LOC_LOGI("%s]: supl NI in progress, new supl NI ignored, type: %d", - __func__, notify.type); - if (NULL != data) { - free((void*)data); - } - } else { - pSession = &mNiData.session; - } - } - - if (pSession) { - /* Save request */ - pSession->rawRequest = (void*)data; - pSession->reqID = ++mNiData.reqIDCounter; - pSession->adapter = this; - - int sessionId = pSession->reqID; - - /* 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 + (notify.timeout != 0 ? notify.timeout : LOC_NI_NO_RESPONSE_TIME); - - int rc = 0; - rc = pthread_create(&pSession->thread, NULL, niThreadProc, pSession); - if (rc) { - LOC_LOGE("%s]: Loc NI thread is not created.", __func__); - } - rc = pthread_detach(pSession->thread); - if (rc) { - LOC_LOGE("%s]: Loc NI thread is not detached.", __func__); - } - - if (nullptr != gnssNiCb) { - gnssNiCb(sessionId, notify); - } - } - - return true; -} - -void -GnssAdapter::reportGnssMeasurementDataEvent(const GnssMeasurementsNotification& measurements, - int msInWeek) -{ - LOC_LOGD("%s]: msInWeek=%d", __func__, msInWeek); - - struct MsgReportGnssMeasurementData : public LocMsg { - GnssAdapter& mAdapter; - GnssMeasurementsNotification mMeasurementsNotify; - inline MsgReportGnssMeasurementData(GnssAdapter& adapter, - const GnssMeasurementsNotification& measurements, - int msInWeek) : - LocMsg(), - mAdapter(adapter), - mMeasurementsNotify(measurements) { - if (-1 != msInWeek) { - mAdapter.getAgcInformation(mMeasurementsNotify, msInWeek); - } - } - inline virtual void proc() const { - mAdapter.reportGnssMeasurementData(mMeasurementsNotify); - } - }; - - sendMsg(new MsgReportGnssMeasurementData(*this, measurements, msInWeek)); -} - -void -GnssAdapter::reportGnssMeasurementData(const GnssMeasurementsNotification& measurements) -{ - for (auto it=mClientData.begin(); it != mClientData.end(); ++it) { - if (nullptr != it->second.gnssMeasurementsCb) { - it->second.gnssMeasurementsCb(measurements); - } - } -} - -void -GnssAdapter::reportSvMeasurementEvent(GnssSvMeasurementSet &svMeasurementSet) -{ - LOC_LOGD("%s]: ", __func__); - - // We send SvMeasurementSet to AmtProxy/ULPProxy to be forwarded as necessary. - mUlpProxy->reportSvMeasurement(svMeasurementSet); -} - -void -GnssAdapter::reportSvPolynomialEvent(GnssSvPolynomial &svPolynomial) -{ - LOC_LOGD("%s]: ", __func__); - - // We send SvMeasurementSet to AmtProxy/ULPProxy to be forwarded as necessary. - mUlpProxy->reportSvPolynomial(svPolynomial); -} - -bool -GnssAdapter::reportOdcpiRequestEvent(OdcpiRequestInfo& request) -{ - struct MsgReportOdcpiRequest : public LocMsg { - GnssAdapter& mAdapter; - OdcpiRequestInfo mOdcpiRequest; - inline MsgReportOdcpiRequest(GnssAdapter& adapter, OdcpiRequestInfo& request) : - LocMsg(), - mAdapter(adapter), - mOdcpiRequest(request) {} - inline virtual void proc() const { - mAdapter.reportOdcpiRequest(mOdcpiRequest); - } - }; - - sendMsg(new MsgReportOdcpiRequest(*this, request)); - return true; -} - -void GnssAdapter::reportOdcpiRequest(const OdcpiRequestInfo& request) -{ - if (nullptr != mOdcpiRequestCb) { - LOC_LOGd("request: type %d, tbf %d, isEmergency %d" - " requestActive: %d timerActive: %d", - request.type, request.tbfMillis, request.isEmergencyMode, - mOdcpiRequestActive, mOdcpiTimer.isActive()); - // ODCPI START and ODCPI STOP from modem can come in quick succession - // so the mOdcpiTimer helps avoid spamming the framework as well as - // extending the odcpi session past 30 seconds if needed - if (ODCPI_REQUEST_TYPE_START == request.type) { - if (false == mOdcpiRequestActive && false == mOdcpiTimer.isActive()) { - mOdcpiRequestCb(request); - mOdcpiRequestActive = true; - mOdcpiTimer.start(); - // if the current active odcpi session is non-emergency, and the new - // odcpi request is emergency, replace the odcpi request with new request - // and restart the timer - } else if (false == mOdcpiRequest.isEmergencyMode && - true == request.isEmergencyMode) { - mOdcpiRequestCb(request); - mOdcpiRequestActive = true; - if (true == mOdcpiTimer.isActive()) { - mOdcpiTimer.restart(); - } else { - mOdcpiTimer.start(); - } - // if ODCPI request is not active but the timer is active, then - // just update the active state and wait for timer to expire - // before requesting new ODCPI to avoid spamming ODCPI requests - } else if (false == mOdcpiRequestActive && true == mOdcpiTimer.isActive()) { - mOdcpiRequestActive = true; - } - mOdcpiRequest = request; - // the request is being stopped, but allow timer to expire first - // before stopping the timer just in case more ODCPI requests come - // to avoid spamming more odcpi requests to the framework - } else { - mOdcpiRequestActive = false; - } - } else { - LOC_LOGw("ODCPI request not supported"); - } -} - -void GnssAdapter::initOdcpiCommand(const OdcpiRequestCallback& callback) -{ - struct MsgInitOdcpi : public LocMsg { - GnssAdapter& mAdapter; - OdcpiRequestCallback mOdcpiCb; - inline MsgInitOdcpi(GnssAdapter& adapter, - const OdcpiRequestCallback& callback) : - LocMsg(), - mAdapter(adapter), - mOdcpiCb(callback) {} - inline virtual void proc() const { - mAdapter.initOdcpi(mOdcpiCb); - } - }; - - sendMsg(new MsgInitOdcpi(*this, callback)); -} - -void GnssAdapter::initOdcpi(const OdcpiRequestCallback& callback) -{ - mOdcpiRequestCb = callback; - - /* Register for WIFI request */ - updateEvtMask(LOC_API_ADAPTER_BIT_REQUEST_WIFI, - LOC_REGISTRATION_MASK_ENABLED); -} - -void GnssAdapter::injectOdcpiCommand(const Location& location) -{ - struct MsgInjectOdcpi : public LocMsg { - GnssAdapter& mAdapter; - Location mLocation; - inline MsgInjectOdcpi(GnssAdapter& adapter, const Location& location) : - LocMsg(), - mAdapter(adapter), - mLocation(location) {} - inline virtual void proc() const { - mAdapter.injectOdcpi(mLocation); - } - }; - - sendMsg(new MsgInjectOdcpi(*this, location)); -} - -void GnssAdapter::injectOdcpi(const Location& location) -{ - LOC_LOGd("ODCPI Injection: requestActive: %d timerActive: %d" - "lat %.7f long %.7f", - mOdcpiRequestActive, mOdcpiTimer.isActive(), - location.latitude, location.longitude); - - loc_api_adapter_err err = mLocApi->injectPosition(location); - if (LOC_API_ADAPTER_ERR_SUCCESS != err) { - LOC_LOGe("Inject Position API error %d", err); - } -} - -// Called in the context of LocTimer thread -void OdcpiTimer::timeOutCallback() -{ - if (nullptr != mAdapter) { - mAdapter->odcpiTimerExpireEvent(); - } -} - -// Called in the context of LocTimer thread -void GnssAdapter::odcpiTimerExpireEvent() -{ - struct MsgOdcpiTimerExpire : public LocMsg { - GnssAdapter& mAdapter; - inline MsgOdcpiTimerExpire(GnssAdapter& adapter) : - LocMsg(), - mAdapter(adapter) {} - inline virtual void proc() const { - mAdapter.odcpiTimerExpire(); - } - }; - sendMsg(new MsgOdcpiTimerExpire(*this)); -} -void GnssAdapter::odcpiTimerExpire() -{ - LOC_LOGd("requestActive: %d timerActive: %d", - mOdcpiRequestActive, mOdcpiTimer.isActive()); - - // if ODCPI request is still active after timer - // expires, request again and restart timer - if (mOdcpiRequestActive) { - mOdcpiRequestCb(mOdcpiRequest); - mOdcpiTimer.restart(); - } else { - mOdcpiTimer.stop(); - } -} - -void GnssAdapter::initDefaultAgps() { - LOC_LOGD("%s]: ", __func__); - - void *handle = nullptr; - if ((handle = dlopen("libloc_net_iface.so", RTLD_NOW)) == nullptr) { - LOC_LOGD("%s]: libloc_net_iface.so not found !", __func__); - return; - } - - LocAgpsGetAgpsCbInfo getAgpsCbInfo = (LocAgpsGetAgpsCbInfo) - dlsym(handle, "LocNetIfaceAgps_getAgpsCbInfo"); - if (getAgpsCbInfo == nullptr) { - LOC_LOGE("%s]: Failed to get method LocNetIfaceAgps_getStatusCb", __func__); - return; - } - - AgpsCbInfo& cbInfo = getAgpsCbInfo(agpsOpenResultCb, agpsCloseResultCb, this); - - if (cbInfo.statusV4Cb == nullptr) { - LOC_LOGE("%s]: statusV4Cb is nullptr!", __func__); - return; - } - - initAgps(cbInfo); -} - -void GnssAdapter::initDefaultAgpsCommand() { - LOC_LOGD("%s]: ", __func__); - - struct MsgInitDefaultAgps : public LocMsg { - GnssAdapter& mAdapter; - inline MsgInitDefaultAgps(GnssAdapter& adapter) : - LocMsg(), - mAdapter(adapter) { - } - inline virtual void proc() const { - mAdapter.initDefaultAgps(); - } - }; - - sendMsg(new MsgInitDefaultAgps(*this)); -} - -/* INIT LOC AGPS MANAGER */ - -void GnssAdapter::initAgps(const AgpsCbInfo& cbInfo) { - LOC_LOGD("%s]: mAgpsCbInfo.cbPriority - %d; cbInfo.cbPriority - %d", - __func__, mAgpsCbInfo.cbPriority, cbInfo.cbPriority) - - if (!((ContextBase::mGps_conf.CAPABILITIES & LOC_GPS_CAPABILITY_MSB) || - (ContextBase::mGps_conf.CAPABILITIES & LOC_GPS_CAPABILITY_MSA))) { - return; - } - - if (mAgpsCbInfo.cbPriority > cbInfo.cbPriority) { - return; - } else { - mAgpsCbInfo = cbInfo; - - mAgpsManager.registerFrameworkStatusCallback((AgnssStatusIpV4Cb)cbInfo.statusV4Cb); - - mAgpsManager.createAgpsStateMachines(); - - /* Register for AGPS event mask */ - updateEvtMask(LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST, - LOC_REGISTRATION_MASK_ENABLED); - } -} - -void GnssAdapter::initAgpsCommand(const AgpsCbInfo& cbInfo){ - LOC_LOGI("GnssAdapter::initAgpsCommand"); - - /* Message to initialize AGPS module */ - struct AgpsMsgInit: public LocMsg { - const AgpsCbInfo mCbInfo; - GnssAdapter& mAdapter; - - inline AgpsMsgInit(const AgpsCbInfo& cbInfo, - GnssAdapter& adapter) : - LocMsg(), mCbInfo(cbInfo), mAdapter(adapter) { - LOC_LOGV("AgpsMsgInit"); - } - - inline virtual void proc() const { - LOC_LOGV("AgpsMsgInit::proc()"); - mAdapter.initAgps(mCbInfo); - } - }; - - /* Send message to initialize AGPS Manager */ - sendMsg(new AgpsMsgInit(cbInfo, *this)); -} - -/* GnssAdapter::requestATL - * Method triggered in QMI thread as part of handling below message: - * eQMI_LOC_SERVER_REQUEST_OPEN_V02 - * Triggers the AGPS state machine to setup AGPS call for below WWAN types: - * eQMI_LOC_WWAN_TYPE_INTERNET_V02 - * eQMI_LOC_WWAN_TYPE_AGNSS_V02 */ -bool GnssAdapter::requestATL(int connHandle, LocAGpsType agpsType){ - - LOC_LOGI("GnssAdapter::requestATL"); - - sendMsg( new AgpsMsgRequestATL( - &mAgpsManager, connHandle, (AGpsExtType)agpsType)); - - return true; -} - -/* GnssAdapter::requestSuplES - * Method triggered in QMI thread as part of handling below message: - * eQMI_LOC_SERVER_REQUEST_OPEN_V02 - * Triggers the AGPS state machine to setup AGPS call for below WWAN types: - * eQMI_LOC_WWAN_TYPE_AGNSS_EMERGENCY_V02 */ -bool GnssAdapter::requestSuplES(int connHandle){ - - LOC_LOGI("GnssAdapter::requestSuplES"); - - sendMsg( new AgpsMsgRequestATL( - &mAgpsManager, connHandle, LOC_AGPS_TYPE_SUPL_ES)); - - return true; -} - -/* GnssAdapter::releaseATL - * Method triggered in QMI thread as part of handling below message: - * eQMI_LOC_SERVER_REQUEST_CLOSE_V02 - * Triggers teardown of an existing AGPS call */ -bool GnssAdapter::releaseATL(int connHandle){ - - LOC_LOGI("GnssAdapter::releaseATL"); - - /* Release SUPL/INTERNET/SUPL_ES ATL */ - struct AgpsMsgReleaseATL: public LocMsg { - - AgpsManager* mAgpsManager; - int mConnHandle; - - inline AgpsMsgReleaseATL(AgpsManager* agpsManager, int connHandle) : - LocMsg(), mAgpsManager(agpsManager), mConnHandle(connHandle) { - - LOC_LOGV("AgpsMsgReleaseATL"); - } - - inline virtual void proc() const { - - LOC_LOGV("AgpsMsgReleaseATL::proc()"); - mAgpsManager->releaseATL(mConnHandle); - } - }; - - sendMsg( new AgpsMsgReleaseATL(&mAgpsManager, connHandle)); - - return true; -} - -/* GnssAdapter::reportDataCallOpened - * DS Client data call opened successfully. - * Send message to AGPS Manager to handle. */ -bool GnssAdapter::reportDataCallOpened(){ - - LOC_LOGI("GnssAdapter::reportDataCallOpened"); - - struct AgpsMsgSuplEsOpened: public LocMsg { - - AgpsManager* mAgpsManager; - - inline AgpsMsgSuplEsOpened(AgpsManager* agpsManager) : - LocMsg(), mAgpsManager(agpsManager) { - - LOC_LOGV("AgpsMsgSuplEsOpened"); - } - - inline virtual void proc() const { - - LOC_LOGV("AgpsMsgSuplEsOpened::proc()"); - mAgpsManager->reportDataCallOpened(); - } - }; - - sendMsg( new AgpsMsgSuplEsOpened(&mAgpsManager)); - - return true; -} - -/* GnssAdapter::reportDataCallClosed - * DS Client data call closed. - * Send message to AGPS Manager to handle. */ -bool GnssAdapter::reportDataCallClosed(){ - - LOC_LOGI("GnssAdapter::reportDataCallClosed"); - - struct AgpsMsgSuplEsClosed: public LocMsg { - - AgpsManager* mAgpsManager; - - inline AgpsMsgSuplEsClosed(AgpsManager* agpsManager) : - LocMsg(), mAgpsManager(agpsManager) { - - LOC_LOGV("AgpsMsgSuplEsClosed"); - } - - inline virtual void proc() const { - - LOC_LOGV("AgpsMsgSuplEsClosed::proc()"); - mAgpsManager->reportDataCallClosed(); - } - }; - - sendMsg( new AgpsMsgSuplEsClosed(&mAgpsManager)); - - return true; -} - -void GnssAdapter::dataConnOpenCommand( - AGpsExtType agpsType, - const char* apnName, int apnLen, AGpsBearerType bearerType){ - - LOC_LOGI("GnssAdapter::frameworkDataConnOpen"); - - struct AgpsMsgAtlOpenSuccess: public LocMsg { - - AgpsManager* mAgpsManager; - AGpsExtType mAgpsType; - char* mApnName; - int mApnLen; - AGpsBearerType mBearerType; - - inline AgpsMsgAtlOpenSuccess(AgpsManager* agpsManager, AGpsExtType agpsType, - const char* apnName, int apnLen, AGpsBearerType bearerType) : - LocMsg(), mAgpsManager(agpsManager), mAgpsType(agpsType), mApnName( - new char[apnLen + 1]), mApnLen(apnLen), mBearerType(bearerType) { - - LOC_LOGV("AgpsMsgAtlOpenSuccess"); - if (mApnName == nullptr) { - LOC_LOGE("%s] new allocation failed, fatal error.", __func__); - return; - } - memcpy(mApnName, apnName, apnLen); - mApnName[apnLen] = 0; - } - - inline ~AgpsMsgAtlOpenSuccess() { - delete[] mApnName; - } - - inline virtual void proc() const { - - LOC_LOGV("AgpsMsgAtlOpenSuccess::proc()"); - mAgpsManager->reportAtlOpenSuccess(mAgpsType, mApnName, mApnLen, mBearerType); - } - }; - - sendMsg( new AgpsMsgAtlOpenSuccess( - &mAgpsManager, agpsType, apnName, apnLen, bearerType)); -} - -void GnssAdapter::dataConnClosedCommand(AGpsExtType agpsType){ - - LOC_LOGI("GnssAdapter::frameworkDataConnClosed"); - - struct AgpsMsgAtlClosed: public LocMsg { - - AgpsManager* mAgpsManager; - AGpsExtType mAgpsType; - - inline AgpsMsgAtlClosed(AgpsManager* agpsManager, AGpsExtType agpsType) : - LocMsg(), mAgpsManager(agpsManager), mAgpsType(agpsType) { - - LOC_LOGV("AgpsMsgAtlClosed"); - } - - inline virtual void proc() const { - - LOC_LOGV("AgpsMsgAtlClosed::proc()"); - mAgpsManager->reportAtlClosed(mAgpsType); - } - }; - - sendMsg( new AgpsMsgAtlClosed(&mAgpsManager, (AGpsExtType)agpsType)); -} - -void GnssAdapter::dataConnFailedCommand(AGpsExtType agpsType){ - - LOC_LOGI("GnssAdapter::frameworkDataConnFailed"); - - struct AgpsMsgAtlOpenFailed: public LocMsg { - - AgpsManager* mAgpsManager; - AGpsExtType mAgpsType; - - inline AgpsMsgAtlOpenFailed(AgpsManager* agpsManager, AGpsExtType agpsType) : - LocMsg(), mAgpsManager(agpsManager), mAgpsType(agpsType) { - - LOC_LOGV("AgpsMsgAtlOpenFailed"); - } - - inline virtual void proc() const { - - LOC_LOGV("AgpsMsgAtlOpenFailed::proc()"); - mAgpsManager->reportAtlOpenFailed(mAgpsType); - } - }; - - sendMsg( new AgpsMsgAtlOpenFailed(&mAgpsManager, (AGpsExtType)agpsType)); -} - -void GnssAdapter::convertSatelliteInfo(std::vector<GnssDebugSatelliteInfo>& out, - const GnssSvType& in_constellation, - const SystemStatusReports& in) -{ - uint64_t sv_mask = 0ULL; - uint32_t svid_min = 0; - uint32_t svid_num = 0; - uint32_t svid_idx = 0; - - uint64_t eph_health_good_mask = 0ULL; - uint64_t eph_health_bad_mask = 0ULL; - uint64_t server_perdiction_available_mask = 0ULL; - float server_perdiction_age = 0.0f; - - // set constellationi based parameters - switch (in_constellation) { - case GNSS_SV_TYPE_GPS: - svid_min = GNSS_BUGREPORT_GPS_MIN; - svid_num = GPS_NUM; - svid_idx = 0; - if (!in.mSvHealth.empty()) { - eph_health_good_mask = in.mSvHealth.back().mGpsGoodMask; - eph_health_bad_mask = in.mSvHealth.back().mGpsBadMask; - } - if (!in.mXtra.empty()) { - server_perdiction_available_mask = in.mXtra.back().mGpsXtraValid; - server_perdiction_age = (float)(in.mXtra.back().mGpsXtraAge); - } - break; - case GNSS_SV_TYPE_GLONASS: - svid_min = GNSS_BUGREPORT_GLO_MIN; - svid_num = GLO_NUM; - svid_idx = GPS_NUM; - if (!in.mSvHealth.empty()) { - eph_health_good_mask = in.mSvHealth.back().mGloGoodMask; - eph_health_bad_mask = in.mSvHealth.back().mGloBadMask; - } - if (!in.mXtra.empty()) { - server_perdiction_available_mask = in.mXtra.back().mGloXtraValid; - server_perdiction_age = (float)(in.mXtra.back().mGloXtraAge); - } - break; - case GNSS_SV_TYPE_QZSS: - svid_min = GNSS_BUGREPORT_QZSS_MIN; - svid_num = QZSS_NUM; - svid_idx = GPS_NUM+GLO_NUM+BDS_NUM+GAL_NUM; - if (!in.mSvHealth.empty()) { - eph_health_good_mask = in.mSvHealth.back().mQzssGoodMask; - eph_health_bad_mask = in.mSvHealth.back().mQzssBadMask; - } - if (!in.mXtra.empty()) { - server_perdiction_available_mask = in.mXtra.back().mQzssXtraValid; - server_perdiction_age = (float)(in.mXtra.back().mQzssXtraAge); - } - break; - case GNSS_SV_TYPE_BEIDOU: - svid_min = GNSS_BUGREPORT_BDS_MIN; - svid_num = BDS_NUM; - svid_idx = GPS_NUM+GLO_NUM; - if (!in.mSvHealth.empty()) { - eph_health_good_mask = in.mSvHealth.back().mBdsGoodMask; - eph_health_bad_mask = in.mSvHealth.back().mBdsBadMask; - } - if (!in.mXtra.empty()) { - server_perdiction_available_mask = in.mXtra.back().mBdsXtraValid; - server_perdiction_age = (float)(in.mXtra.back().mBdsXtraAge); - } - break; - case GNSS_SV_TYPE_GALILEO: - svid_min = GNSS_BUGREPORT_GAL_MIN; - svid_num = GAL_NUM; - svid_idx = GPS_NUM+GLO_NUM+BDS_NUM; - if (!in.mSvHealth.empty()) { - eph_health_good_mask = in.mSvHealth.back().mGalGoodMask; - eph_health_bad_mask = in.mSvHealth.back().mGalBadMask; - } - if (!in.mXtra.empty()) { - server_perdiction_available_mask = in.mXtra.back().mGalXtraValid; - server_perdiction_age = (float)(in.mXtra.back().mGalXtraAge); - } - break; - default: - return; - } - - // extract each sv info from systemstatus report - for(uint32_t i=0; i<svid_num && (svid_idx+i)<SV_ALL_NUM; i++) { - - GnssDebugSatelliteInfo s = {}; - s.size = sizeof(s); - s.svid = i + svid_min; - s.constellation = in_constellation; - - if (!in.mNavData.empty()) { - s.mEphemerisType = in.mNavData.back().mNav[svid_idx+i].mType; - s.mEphemerisSource = in.mNavData.back().mNav[svid_idx+i].mSource; - } - else { - s.mEphemerisType = GNSS_EPH_TYPE_UNKNOWN; - s.mEphemerisSource = GNSS_EPH_SOURCE_UNKNOWN; - } - - sv_mask = 0x1ULL << i; - if (eph_health_good_mask & sv_mask) { - s.mEphemerisHealth = GNSS_EPH_HEALTH_GOOD; - } - else if (eph_health_bad_mask & sv_mask) { - s.mEphemerisHealth = GNSS_EPH_HEALTH_BAD; - } - else { - s.mEphemerisHealth = GNSS_EPH_HEALTH_UNKNOWN; - } - - if (!in.mNavData.empty()) { - s.ephemerisAgeSeconds = - (float)(in.mNavData.back().mNav[svid_idx+i].mAgeSec); - } - else { - s.ephemerisAgeSeconds = 0.0f; - } - - if (server_perdiction_available_mask & sv_mask) { - s.serverPredictionIsAvailable = true; - } - else { - s.serverPredictionIsAvailable = false; - } - - s.serverPredictionAgeSeconds = server_perdiction_age; - out.push_back(s); - } - - return; -} - -bool GnssAdapter::getDebugReport(GnssDebugReport& r) -{ - LOC_LOGD("%s]: ", __func__); - - SystemStatus* systemstatus = getSystemStatus(); - if (nullptr == systemstatus) { - return false; - } - - SystemStatusReports reports = {}; - systemstatus->getReport(reports, true); - - r.size = sizeof(r); - - // location block - r.mLocation.size = sizeof(r.mLocation); - if(!reports.mLocation.empty() && reports.mLocation.back().mValid) { - r.mLocation.mValid = true; - r.mLocation.mLocation.latitude = - reports.mLocation.back().mLocation.gpsLocation.latitude; - r.mLocation.mLocation.longitude = - reports.mLocation.back().mLocation.gpsLocation.longitude; - r.mLocation.mLocation.altitude = - reports.mLocation.back().mLocation.gpsLocation.altitude; - r.mLocation.mLocation.speed = - (double)(reports.mLocation.back().mLocation.gpsLocation.speed); - r.mLocation.mLocation.bearing = - (double)(reports.mLocation.back().mLocation.gpsLocation.bearing); - r.mLocation.mLocation.accuracy = - (double)(reports.mLocation.back().mLocation.gpsLocation.accuracy); - - r.mLocation.verticalAccuracyMeters = - reports.mLocation.back().mLocationEx.vert_unc; - r.mLocation.speedAccuracyMetersPerSecond = - reports.mLocation.back().mLocationEx.speed_unc; - r.mLocation.bearingAccuracyDegrees = - reports.mLocation.back().mLocationEx.bearing_unc; - - r.mLocation.mUtcReported = - reports.mLocation.back().mUtcReported; - } - else if(!reports.mBestPosition.empty() && reports.mBestPosition.back().mValid) { - r.mLocation.mValid = true; - r.mLocation.mLocation.latitude = - (double)(reports.mBestPosition.back().mBestLat) * RAD2DEG; - r.mLocation.mLocation.longitude = - (double)(reports.mBestPosition.back().mBestLon) * RAD2DEG; - r.mLocation.mLocation.altitude = reports.mBestPosition.back().mBestAlt; - r.mLocation.mLocation.accuracy = - (double)(reports.mBestPosition.back().mBestHepe); - - r.mLocation.mUtcReported = reports.mBestPosition.back().mUtcReported; - } - else { - r.mLocation.mValid = false; - } - - if (r.mLocation.mValid) { - LOC_LOGV("getDebugReport - lat=%f lon=%f alt=%f speed=%f", - r.mLocation.mLocation.latitude, - r.mLocation.mLocation.longitude, - r.mLocation.mLocation.altitude, - r.mLocation.mLocation.speed); - } - - // time block - r.mTime.size = sizeof(r.mTime); - if(!reports.mTimeAndClock.empty() && reports.mTimeAndClock.back().mTimeValid) { - r.mTime.mValid = true; - r.mTime.timeEstimate = - (((int64_t)(reports.mTimeAndClock.back().mGpsWeek)*7 + - GNSS_UTC_TIME_OFFSET)*24*60*60 - - (int64_t)(reports.mTimeAndClock.back().mLeapSeconds))*1000ULL + - (int64_t)(reports.mTimeAndClock.back().mGpsTowMs); - - r.mTime.timeUncertaintyNs = - ((float)(reports.mTimeAndClock.back().mTimeUnc) + - (float)(reports.mTimeAndClock.back().mLeapSecUnc))*1000.0f; - r.mTime.frequencyUncertaintyNsPerSec = - (float)(reports.mTimeAndClock.back().mClockFreqBiasUnc); - LOC_LOGV("getDebugReport - timeestimate=%" PRIu64 " unc=%f frequnc=%f", - r.mTime.timeEstimate, - r.mTime.timeUncertaintyNs, r.mTime.frequencyUncertaintyNsPerSec); - } - else { - r.mTime.mValid = false; - } - - // satellite info block - convertSatelliteInfo(r.mSatelliteInfo, GNSS_SV_TYPE_GPS, reports); - convertSatelliteInfo(r.mSatelliteInfo, GNSS_SV_TYPE_GLONASS, reports); - convertSatelliteInfo(r.mSatelliteInfo, GNSS_SV_TYPE_QZSS, reports); - convertSatelliteInfo(r.mSatelliteInfo, GNSS_SV_TYPE_BEIDOU, reports); - convertSatelliteInfo(r.mSatelliteInfo, GNSS_SV_TYPE_GALILEO, reports); - LOC_LOGV("getDebugReport - satellite=%zu", r.mSatelliteInfo.size()); - - return true; -} - -/* get AGC information from system status and fill it */ -void -GnssAdapter::getAgcInformation(GnssMeasurementsNotification& measurements, int msInWeek) -{ - SystemStatus* systemstatus = getSystemStatus(); - - if (nullptr != systemstatus) { - SystemStatusReports reports = {}; - systemstatus->getReport(reports, true); - - if ((!reports.mRfAndParams.empty()) && (!reports.mTimeAndClock.empty()) && - (abs(msInWeek - (int)reports.mTimeAndClock.back().mGpsTowMs) < 2000)) { - - for (size_t i = 0; i < measurements.count; i++) { - switch (measurements.measurements[i].svType) { - case GNSS_SV_TYPE_GPS: - case GNSS_SV_TYPE_QZSS: - measurements.measurements[i].agcLevelDb = - reports.mRfAndParams.back().mAgcGps; - measurements.measurements[i].flags |= - GNSS_MEASUREMENTS_DATA_AUTOMATIC_GAIN_CONTROL_BIT; - break; - - case GNSS_SV_TYPE_GALILEO: - measurements.measurements[i].agcLevelDb = - reports.mRfAndParams.back().mAgcGal; - measurements.measurements[i].flags |= - GNSS_MEASUREMENTS_DATA_AUTOMATIC_GAIN_CONTROL_BIT; - break; - - case GNSS_SV_TYPE_GLONASS: - measurements.measurements[i].agcLevelDb = - reports.mRfAndParams.back().mAgcGlo; - measurements.measurements[i].flags |= - GNSS_MEASUREMENTS_DATA_AUTOMATIC_GAIN_CONTROL_BIT; - break; - - case GNSS_SV_TYPE_BEIDOU: - measurements.measurements[i].agcLevelDb = - reports.mRfAndParams.back().mAgcBds; - measurements.measurements[i].flags |= - GNSS_MEASUREMENTS_DATA_AUTOMATIC_GAIN_CONTROL_BIT; - break; - - case GNSS_SV_TYPE_SBAS: - case GNSS_SV_TYPE_UNKNOWN: - default: - break; - } - } - } - } -} - -/* Callbacks registered with loc_net_iface library */ -static void agpsOpenResultCb (bool isSuccess, AGpsExtType agpsType, const char* apn, - AGpsBearerType bearerType, void* userDataPtr) { - LOC_LOGD("%s]: ", __func__); - if (userDataPtr == nullptr) { - LOC_LOGE("%s]: userDataPtr is nullptr.", __func__); - return; - } - if (apn == nullptr) { - LOC_LOGE("%s]: apn is nullptr.", __func__); - return; - } - GnssAdapter* adapter = (GnssAdapter*)userDataPtr; - if (isSuccess) { - adapter->dataConnOpenCommand(agpsType, apn, strlen(apn), bearerType); - } else { - adapter->dataConnFailedCommand(agpsType); - } -} - -static void agpsCloseResultCb (bool isSuccess, AGpsExtType agpsType, void* userDataPtr) { - LOC_LOGD("%s]: ", __func__); - if (userDataPtr == nullptr) { - LOC_LOGE("%s]: userDataPtr is nullptr.", __func__); - return; - } - GnssAdapter* adapter = (GnssAdapter*)userDataPtr; - if (isSuccess) { - adapter->dataConnClosedCommand(agpsType); - } else { - adapter->dataConnFailedCommand(agpsType); - } -} diff --git a/gps/gnss/GnssAdapter.h b/gps/gnss/GnssAdapter.h deleted file mode 100644 index 0609e6d..0000000 --- a/gps/gnss/GnssAdapter.h +++ /dev/null @@ -1,341 +0,0 @@ -/* Copyright (c) 2017, 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 GNSS_ADAPTER_H -#define GNSS_ADAPTER_H - -#include <LocAdapterBase.h> -#include <LocDualContext.h> -#include <UlpProxyBase.h> -#include <LocationAPI.h> -#include <Agps.h> -#include <SystemStatus.h> -#include <XtraSystemStatusObserver.h> - -#define MAX_URL_LEN 256 -#define NMEA_SENTENCE_MAX_LENGTH 200 -#define GLONASS_SV_ID_OFFSET 64 -#define MAX_SATELLITES_IN_USE 12 -#define LOC_NI_NO_RESPONSE_TIME 20 -#define LOC_GPS_NI_RESPONSE_IGNORE 4 -#define ODCPI_EXPECTED_INJECTION_TIME_MS 10000 - -class GnssAdapter; - -class OdcpiTimer : public LocTimer { -public: - OdcpiTimer(GnssAdapter* adapter) : - LocTimer(), mAdapter(adapter), mActive(false) {} - - inline void start() { - mActive = true; - LocTimer::start(ODCPI_EXPECTED_INJECTION_TIME_MS, false); - } - inline void stop() { - mActive = false; - LocTimer::stop(); - } - inline void restart() { - stop(); - start(); - } - inline bool isActive() { - return mActive; - } - -private: - // Override - virtual void timeOutCallback() override; - - GnssAdapter* mAdapter; - bool mActive; -}; - -typedef struct { - pthread_t thread; /* NI thread */ - uint32_t respTimeLeft; /* examine time for NI response */ - bool respRecvd; /* NI User reponse received or not from Java layer*/ - void* rawRequest; - uint32_t reqID; /* ID to check against response */ - GnssNiResponse resp; - pthread_cond_t tCond; - pthread_mutex_t tLock; - GnssAdapter* adapter; -} NiSession; -typedef struct { - NiSession session; /* SUPL NI Session */ - NiSession sessionEs; /* Emergency SUPL NI Session */ - uint32_t reqIDCounter; -} NiData; - -typedef enum { - NMEA_PROVIDER_AP = 0, // Application Processor Provider of NMEA - NMEA_PROVIDER_MP // Modem Processor Provider of NMEA -} NmeaProviderType; -typedef struct { - GnssSvType svType; - const char* talker; - uint64_t mask; - uint32_t svIdOffset; -} NmeaSvMeta; - -using namespace loc_core; - -namespace loc_core { - class SystemStatus; -} - -class GnssAdapter : public LocAdapterBase { - - /* ==== ULP ============================================================================ */ - UlpProxyBase* mUlpProxy; - - /* ==== CLIENT ========================================================================= */ - typedef std::map<LocationAPI*, LocationCallbacks> ClientDataMap; - ClientDataMap mClientData; - - /* ==== TRACKING ======================================================================= */ - LocationSessionMap mTrackingSessions; - LocPosMode mUlpPositionMode; - GnssSvUsedInPosition mGnssSvIdUsedInPosition; - bool mGnssSvIdUsedInPosAvail; - - /* ==== CONTROL ======================================================================== */ - LocationControlCallbacks mControlCallbacks; - uint32_t mPowerVoteId; - uint32_t mNmeaMask; - - /* ==== NI ============================================================================= */ - NiData mNiData; - - /* ==== AGPS =========================================================================== */ - // This must be initialized via initAgps() - AgpsManager mAgpsManager; - AgpsCbInfo mAgpsCbInfo; - void initAgps(const AgpsCbInfo& cbInfo); - - /* ==== ODCPI ========================================================================== */ - OdcpiRequestCallback mOdcpiRequestCb; - bool mOdcpiRequestActive; - OdcpiTimer mOdcpiTimer; - OdcpiRequestInfo mOdcpiRequest; - void odcpiTimerExpire(); - - /* === SystemStatus ===================================================================== */ - SystemStatus* mSystemStatus; - std::string mServerUrl; - XtraSystemStatusObserver mXtraObserver; - - /*==== CONVERSION ===================================================================*/ - static void convertOptions(LocPosMode& out, const LocationOptions& options); - static void convertLocation(Location& out, const LocGpsLocation& locGpsLocation, - const GpsLocationExtended& locationExtended, - const LocPosTechMask techMask); - static void convertLocationInfo(GnssLocationInfoNotification& out, - const GpsLocationExtended& locationExtended); - -public: - - GnssAdapter(); - virtual inline ~GnssAdapter() { delete mUlpProxy; } - - /* ==== SSR ============================================================================ */ - /* ======== EVENTS ====(Called from QMI Thread)========================================= */ - virtual void handleEngineUpEvent(); - /* ======== UTILITIES ================================================================== */ - void restartSessions(); - - /* ==== ULP ============================================================================ */ - /* ======== COMMANDS ====(Called from ULP Thread)==================================== */ - virtual void setUlpProxyCommand(UlpProxyBase* ulp); - /* ======== UTILITIES ================================================================== */ - void setUlpProxy(UlpProxyBase* ulp); - inline UlpProxyBase* getUlpProxy() { return mUlpProxy; } - - /* ==== CLIENT ========================================================================= */ - /* ======== COMMANDS ====(Called from Client Thread)==================================== */ - void addClientCommand(LocationAPI* client, const LocationCallbacks& callbacks); - void removeClientCommand(LocationAPI* client); - void requestCapabilitiesCommand(LocationAPI* client); - /* ======== UTILITIES ================================================================== */ - void saveClient(LocationAPI* client, const LocationCallbacks& callbacks); - void eraseClient(LocationAPI* client); - void updateClientsEventMask(); - void stopClientSessions(LocationAPI* client); - LocationCallbacks getClientCallbacks(LocationAPI* client); - LocationCapabilitiesMask getCapabilities(); - void broadcastCapabilities(LocationCapabilitiesMask); - LocationError setSuplHostServer(const char* server, int port); - - /* ==== TRACKING ======================================================================= */ - /* ======== COMMANDS ====(Called from Client Thread)==================================== */ - uint32_t startTrackingCommand(LocationAPI* client, LocationOptions& options); - void updateTrackingOptionsCommand(LocationAPI* client, uint32_t id, LocationOptions& options); - void stopTrackingCommand(LocationAPI* client, uint32_t id); - /* ======================(Called from ULP Thread)======================================= */ - virtual void setPositionModeCommand(LocPosMode& locPosMode); - virtual void startTrackingCommand(); - virtual void stopTrackingCommand(); - virtual void getZppCommand(); - /* ======== RESPONSES ================================================================== */ - void reportResponse(LocationAPI* client, LocationError err, uint32_t sessionId); - /* ======== UTILITIES ================================================================== */ - bool hasTrackingCallback(LocationAPI* client); - bool hasMeasurementsCallback(LocationAPI* client); - bool isTrackingSession(LocationAPI* client, uint32_t sessionId); - void saveTrackingSession(LocationAPI* client, uint32_t sessionId, - const LocationOptions& options); - void eraseTrackingSession(LocationAPI* client, uint32_t sessionId); - bool setUlpPositionMode(const LocPosMode& mode); - LocPosMode& getUlpPositionMode() { return mUlpPositionMode; } - LocationError startTrackingMultiplex(const LocationOptions& options); - LocationError startTracking(const LocationOptions& options); - LocationError stopTrackingMultiplex(LocationAPI* client, uint32_t id); - LocationError stopTracking(); - LocationError updateTrackingMultiplex(LocationAPI* client, uint32_t id, - const LocationOptions& options); - - /* ==== NI ============================================================================= */ - /* ======== COMMANDS ====(Called from Client Thread)==================================== */ - void gnssNiResponseCommand(LocationAPI* client, uint32_t id, GnssNiResponse response); - /* ======================(Called from NI Thread)======================================== */ - void gnssNiResponseCommand(GnssNiResponse response, void* rawRequest); - /* ======== UTILITIES ================================================================== */ - bool hasNiNotifyCallback(LocationAPI* client); - NiData& getNiData() { return mNiData; } - - /* ==== CONTROL ======================================================================== */ - /* ======== COMMANDS ====(Called from Client Thread)==================================== */ - uint32_t enableCommand(LocationTechnologyType techType); - void disableCommand(uint32_t id); - void setControlCallbacksCommand(LocationControlCallbacks& controlCallbacks); - void readConfigCommand(); - void setConfigCommand(); - uint32_t* gnssUpdateConfigCommand(GnssConfig config); - uint32_t gnssDeleteAidingDataCommand(GnssAidingData& data); - void gnssUpdateXtraThrottleCommand(const bool enabled); - - void initDefaultAgpsCommand(); - void initAgpsCommand(const AgpsCbInfo& cbInfo); - void dataConnOpenCommand(AGpsExtType agpsType, - const char* apnName, int apnLen, AGpsBearerType bearerType); - void dataConnClosedCommand(AGpsExtType agpsType); - void dataConnFailedCommand(AGpsExtType agpsType); - - /* ========= ODCPI ===================================================================== */ - /* ======== COMMANDS ====(Called from Client Thread)==================================== */ - void initOdcpiCommand(const OdcpiRequestCallback& callback); - void injectOdcpiCommand(const Location& location); - /* ======== UTILITIES ================================================================== */ - void initOdcpi(const OdcpiRequestCallback& callback); - void injectOdcpi(const Location& location); - void odcpiTimerExpireEvent(); - - /* ======== RESPONSES ================================================================== */ - void reportResponse(LocationError err, uint32_t sessionId); - void reportResponse(size_t count, LocationError* errs, uint32_t* ids); - /* ======== UTILITIES ================================================================== */ - LocationControlCallbacks& getControlCallbacks() { return mControlCallbacks; } - void setControlCallbacks(const LocationControlCallbacks& controlCallbacks) - { mControlCallbacks = controlCallbacks; } - void setPowerVoteId(uint32_t id) { mPowerVoteId = id; } - uint32_t getPowerVoteId() { return mPowerVoteId; } - bool resolveInAddress(const char* hostAddress, struct in_addr* inAddress); - virtual bool isInSession() { return !mTrackingSessions.empty(); } - void initDefaultAgps(); - - /* ==== REPORTS ======================================================================== */ - /* ======== EVENTS ====(Called from QMI/ULP Thread)===================================== */ - virtual void reportPositionEvent(const UlpLocation& ulpLocation, - const GpsLocationExtended& locationExtended, - enum loc_sess_status status, - LocPosTechMask techMask, - bool fromUlp=false); - virtual void reportSvEvent(const GnssSvNotification& svNotify, bool fromUlp=false); - virtual void reportNmeaEvent(const char* nmea, size_t length, bool fromUlp=false); - virtual bool requestNiNotifyEvent(const GnssNiNotification& notify, const void* data); - virtual void reportGnssMeasurementDataEvent(const GnssMeasurementsNotification& measurements, - int msInWeek); - virtual void reportSvMeasurementEvent(GnssSvMeasurementSet &svMeasurementSet); - virtual void reportSvPolynomialEvent(GnssSvPolynomial &svPolynomial); - - virtual bool requestATL(int connHandle, LocAGpsType agps_type); - virtual bool releaseATL(int connHandle); - virtual bool requestSuplES(int connHandle); - virtual bool reportDataCallOpened(); - virtual bool reportDataCallClosed(); - virtual bool reportOdcpiRequestEvent(OdcpiRequestInfo& request); - - /* ======== UTILITIES ================================================================= */ - bool needReport(const UlpLocation& ulpLocation, - enum loc_sess_status status, LocPosTechMask techMask); - void reportPosition(const UlpLocation &ulpLocation, - const GpsLocationExtended &locationExtended, - enum loc_sess_status status, - LocPosTechMask techMask); - void reportSv(GnssSvNotification& svNotify); - void reportNmea(const char* nmea, size_t length); - bool requestNiNotify(const GnssNiNotification& notify, const void* data); - void reportGnssMeasurementData(const GnssMeasurementsNotification& measurements); - void reportOdcpiRequest(const OdcpiRequestInfo& request); - - /*======== GNSSDEBUG ================================================================*/ - bool getDebugReport(GnssDebugReport& report); - /* get AGC information from system status and fill it */ - void getAgcInformation(GnssMeasurementsNotification& measurements, int msInWeek); - - /*==== SYSTEM STATUS ================================================================*/ - inline SystemStatus* getSystemStatus(void) { return mSystemStatus; } - std::string& getServerUrl(void) { return mServerUrl; } - void setServerUrl(const char* server) { mServerUrl.assign(server); } - - /*==== CONVERSION ===================================================================*/ - static uint32_t convertGpsLock(const GnssConfigGpsLock gpsLock); - static GnssConfigGpsLock convertGpsLock(const uint32_t gpsLock); - static uint32_t convertSuplVersion(const GnssConfigSuplVersion suplVersion); - static GnssConfigSuplVersion convertSuplVersion(const uint32_t suplVersion); - static uint32_t convertLppProfile(const GnssConfigLppProfile lppProfile); - static GnssConfigLppProfile convertLppProfile(const uint32_t lppProfile); - static uint32_t convertEP4ES(const GnssConfigEmergencyPdnForEmergencySupl); - static uint32_t convertSuplEs(const GnssConfigSuplEmergencyServices suplEmergencyServices); - static uint32_t convertLppeCp(const GnssConfigLppeControlPlaneMask lppeControlPlaneMask); - static GnssConfigLppeControlPlaneMask convertLppeCp(const uint32_t lppeControlPlaneMask); - static uint32_t convertLppeUp(const GnssConfigLppeUserPlaneMask lppeUserPlaneMask); - static GnssConfigLppeUserPlaneMask convertLppeUp(const uint32_t lppeUserPlaneMask); - static uint32_t convertAGloProt(const GnssConfigAGlonassPositionProtocolMask); - static uint32_t convertSuplMode(const GnssConfigSuplModeMask suplModeMask); - static void convertSatelliteInfo(std::vector<GnssDebugSatelliteInfo>& out, - const GnssSvType& in_constellation, - const SystemStatusReports& in); - - void injectLocationCommand(double latitude, double longitude, float accuracy); - void injectTimeCommand(int64_t time, int64_t timeReference, int32_t uncertainty); - -}; - -#endif //GNSS_ADAPTER_H diff --git a/gps/gnss/Makefile.am b/gps/gnss/Makefile.am deleted file mode 100644 index c818cae..0000000 --- a/gps/gnss/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ -AM_CFLAGS = \ - $(LOCPLA_CFLAGS) \ - $(LOCHAL_CFLAGS) \ - $(GPSUTILS_CFLAGS) \ - $(LOCCORE_CFLAGS) \ - -I./ \ - -I../utils \ - -I$(WORKSPACE)/hardware/qcom/gps/core/data-items \ - -I../location \ - -std=c++11 - -libgnss_la_SOURCES = \ - location_gnss.cpp \ - GnssAdapter.cpp \ - XtraSystemStatusObserver.cpp \ - Agps.cpp - -if USE_GLIB -libgnss_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@ -libgnss_la_LDFLAGS = -lstdc++ -Wl,-z,defs -lpthread @GLIB_LIBS@ -shared -avoid-version -libgnss_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@ -else -libgnss_la_CFLAGS = $(AM_CFLAGS) -libgnss_la_LDFLAGS = -Wl,-z,defs -lpthread -shared -version-info 1:0:0 -libgnss_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -endif - -libgnss_la_LIBADD = -lstdc++ $(GPSUTILS_LIBS) $(LOCCORE_LIBS) - -#Create and Install libraries -lib_LTLIBRARIES = libgnss.la diff --git a/gps/gnss/XtraSystemStatusObserver.cpp b/gps/gnss/XtraSystemStatusObserver.cpp deleted file mode 100644 index 91c395f..0000000 --- a/gps/gnss/XtraSystemStatusObserver.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/* Copyright (c) 2017, 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_TAG "LocSvc_XtraSystemStatusObs" - -#include <sys/stat.h> -#include <sys/un.h> -#include <errno.h> -#include <ctype.h> -#include <unistd.h> -#include <cutils/properties.h> -#include <math.h> -#include <arpa/inet.h> -#include <netinet/in.h> -#include <netdb.h> -#include <string> -#include <loc_log.h> -#include <loc_nmea.h> -#include <SystemStatus.h> -#include <vector> -#include <sstream> -#include <XtraSystemStatusObserver.h> -#include <LocAdapterBase.h> -#include <DataItemId.h> -#include <DataItemsFactoryProxy.h> -#include <DataItemConcreteTypesBase.h> - -using namespace loc_core; - -#ifdef LOG_TAG -#undef LOG_TAG -#endif -#define LOG_TAG "LocSvc_XSSO" - -bool XtraSystemStatusObserver::updateLockStatus(uint32_t lock) { - mGpsLock = lock; - - if (!mReqStatusReceived) { - return true; - } - - stringstream ss; - ss << "gpslock"; - ss << " " << lock; - return ( send(LOC_IPC_XTRA, ss.str()) ); -} - -bool XtraSystemStatusObserver::updateConnections(uint64_t allConnections) { - mIsConnectivityStatusKnown = true; - mConnections = allConnections; - - if (!mReqStatusReceived) { - return true; - } - - stringstream ss; - ss << "connection"; - ss << " " << mConnections; - return ( send(LOC_IPC_XTRA, ss.str()) ); -} - -bool XtraSystemStatusObserver::updateTac(const string& tac) { - mTac = tac; - - if (!mReqStatusReceived) { - return true; - } - - stringstream ss; - ss << "tac"; - ss << " " << tac.c_str(); - return ( send(LOC_IPC_XTRA, ss.str()) ); -} - -bool XtraSystemStatusObserver::updateMccMnc(const string& mccmnc) { - mMccmnc = mccmnc; - - if (!mReqStatusReceived) { - return true; - } - - stringstream ss; - ss << "mncmcc"; - ss << " " << mccmnc.c_str(); - return ( send(LOC_IPC_XTRA, ss.str()) ); -} - -bool XtraSystemStatusObserver::updateXtraThrottle(const bool enabled) { - mXtraThrottle = enabled; - - if (!mReqStatusReceived) { - return true; - } - - stringstream ss; - ss << "xtrathrottle"; - ss << " " << (enabled ? 1 : 0); - return ( send(LOC_IPC_XTRA, ss.str()) ); -} - -inline bool XtraSystemStatusObserver::onStatusRequested(int32_t xtraStatusUpdated) { - mReqStatusReceived = true; - - if (xtraStatusUpdated) { - return true; - } - - stringstream ss; - - ss << "respondStatus" << endl; - (mGpsLock == -1 ? ss : ss << mGpsLock) << endl << mConnections << endl - << mTac << endl << mMccmnc << endl << mIsConnectivityStatusKnown; - - return ( send(LOC_IPC_XTRA, ss.str()) ); -} - -void XtraSystemStatusObserver::onReceive(const std::string& data) { - if (!strncmp(data.c_str(), "ping", sizeof("ping") - 1)) { - LOC_LOGd("ping received"); - -#ifdef USE_GLIB - } else if (!strncmp(data.c_str(), "connectBackhaul", sizeof("connectBackhaul") - 1)) { - mSystemStatusObsrvr->connectBackhaul(); - - } else if (!strncmp(data.c_str(), "disconnectBackhaul", sizeof("disconnectBackhaul") - 1)) { - mSystemStatusObsrvr->disconnectBackhaul(); -#endif - - } else if (!strncmp(data.c_str(), "requestStatus", sizeof("requestStatus") - 1)) { - int32_t xtraStatusUpdated = 0; - sscanf(data.c_str(), "%*s %d", &xtraStatusUpdated); - - struct HandleStatusRequestMsg : public LocMsg { - XtraSystemStatusObserver& mXSSO; - int32_t mXtraStatusUpdated; - inline HandleStatusRequestMsg(XtraSystemStatusObserver& xsso, - int32_t xtraStatusUpdated) : - mXSSO(xsso), mXtraStatusUpdated(xtraStatusUpdated) {} - inline void proc() const override { mXSSO.onStatusRequested(mXtraStatusUpdated); } - }; - mMsgTask->sendMsg(new (nothrow) HandleStatusRequestMsg(*this, xtraStatusUpdated)); - - } else { - LOC_LOGw("unknown event: %s", data.c_str()); - } -} - -void XtraSystemStatusObserver::subscribe(bool yes) -{ - // Subscription data list - list<DataItemId> subItemIdList; - subItemIdList.push_back(NETWORKINFO_DATA_ITEM_ID); - subItemIdList.push_back(MCCMNC_DATA_ITEM_ID); - - if (yes) { - mSystemStatusObsrvr->subscribe(subItemIdList, this); - - list<DataItemId> reqItemIdList; - reqItemIdList.push_back(TAC_DATA_ITEM_ID); - - mSystemStatusObsrvr->requestData(reqItemIdList, this); - - } else { - mSystemStatusObsrvr->unsubscribe(subItemIdList, this); - } -} - -// IDataItemObserver overrides -void XtraSystemStatusObserver::getName(string& name) -{ - name = "XtraSystemStatusObserver"; -} - -void XtraSystemStatusObserver::notify(const list<IDataItemCore*>& dlist) -{ - struct HandleOsObserverUpdateMsg : public LocMsg { - XtraSystemStatusObserver* mXtraSysStatObj; - list <IDataItemCore*> mDataItemList; - - inline HandleOsObserverUpdateMsg(XtraSystemStatusObserver* xtraSysStatObs, - const list<IDataItemCore*>& dataItemList) : - mXtraSysStatObj(xtraSysStatObs) { - for (auto eachItem : dataItemList) { - IDataItemCore* dataitem = DataItemsFactoryProxy::createNewDataItem( - eachItem->getId()); - if (NULL == dataitem) { - break; - } - // Copy the contents of the data item - dataitem->copy(eachItem); - - mDataItemList.push_back(dataitem); - } - } - - inline ~HandleOsObserverUpdateMsg() { - for (auto each : mDataItemList) { - delete each; - } - } - - inline void proc() const { - for (auto each : mDataItemList) { - switch (each->getId()) - { - case NETWORKINFO_DATA_ITEM_ID: - { - NetworkInfoDataItemBase* networkInfo = - static_cast<NetworkInfoDataItemBase*>(each); - mXtraSysStatObj->updateConnections(networkInfo->getAllTypes()); - } - break; - - case TAC_DATA_ITEM_ID: - { - TacDataItemBase* tac = - static_cast<TacDataItemBase*>(each); - mXtraSysStatObj->updateTac(tac->mValue); - } - break; - - case MCCMNC_DATA_ITEM_ID: - { - MccmncDataItemBase* mccmnc = - static_cast<MccmncDataItemBase*>(each); - mXtraSysStatObj->updateMccMnc(mccmnc->mValue); - } - break; - - default: - break; - } - } - } - }; - mMsgTask->sendMsg(new (nothrow) HandleOsObserverUpdateMsg(this, dlist)); -} diff --git a/gps/gnss/XtraSystemStatusObserver.h b/gps/gnss/XtraSystemStatusObserver.h deleted file mode 100644 index af0789b..0000000 --- a/gps/gnss/XtraSystemStatusObserver.h +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (c) 2017, 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 XTRA_SYSTEM_STATUS_OBS_H -#define XTRA_SYSTEM_STATUS_OBS_H - -#include <cinttypes> -#include <MsgTask.h> -#include <LocIpc.h> -#include <LocTimer.h> - -using namespace std; -using loc_core::IOsObserver; -using loc_core::IDataItemObserver; -using loc_core::IDataItemCore; -using loc_util::LocIpc; - -class XtraSystemStatusObserver : public IDataItemObserver, public LocIpc{ -public : - // constructor & destructor - inline XtraSystemStatusObserver(IOsObserver* sysStatObs, const MsgTask* msgTask): - mSystemStatusObsrvr(sysStatObs), mMsgTask(msgTask), - mGpsLock(-1), mConnections(0), mXtraThrottle(true), mReqStatusReceived(false), - mDelayLocTimer(*this), mIsConnectivityStatusKnown (false) { - subscribe(true); - startListeningNonBlocking(LOC_IPC_HAL); - mDelayLocTimer.start(100 /*.1 sec*/, false); - } - inline virtual ~XtraSystemStatusObserver() { - subscribe(false); - stopListening(); - } - - // IDataItemObserver overrides - inline virtual void getName(string& name); - virtual void notify(const list<IDataItemCore*>& dlist); - - bool updateLockStatus(uint32_t lock); - bool updateConnections(uint64_t allConnections); - bool updateTac(const string& tac); - bool updateMccMnc(const string& mccmnc); - bool updateXtraThrottle(const bool enabled); - inline const MsgTask* getMsgTask() { return mMsgTask; } - void subscribe(bool yes); - -protected: - void onReceive(const std::string& data) override; - -private: - IOsObserver* mSystemStatusObsrvr; - const MsgTask* mMsgTask; - int32_t mGpsLock; - uint64_t mConnections; - string mTac; - string mMccmnc; - bool mXtraThrottle; - bool mReqStatusReceived; - bool mIsConnectivityStatusKnown; - - class DelayLocTimer : public LocTimer { - XtraSystemStatusObserver& mXSSO; - public: - DelayLocTimer(XtraSystemStatusObserver& xsso) : mXSSO(xsso) {} - void timeOutCallback() override { - mXSSO.send(LOC_IPC_XTRA, "halinit"); - } - } mDelayLocTimer; - - bool onStatusRequested(int32_t xtraStatusUpdated); -}; - -#endif diff --git a/gps/gnss/location_gnss.cpp b/gps/gnss/location_gnss.cpp deleted file mode 100644 index 21763dd..0000000 --- a/gps/gnss/location_gnss.cpp +++ /dev/null @@ -1,287 +0,0 @@ -/* Copyright (c) 2017, 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 "GnssAdapter.h" -#include "location_interface.h" - -static GnssAdapter* gGnssAdapter = NULL; - -static void initialize(); -static void deinitialize(); - -static void addClient(LocationAPI* client, const LocationCallbacks& callbacks); -static void removeClient(LocationAPI* client); -static void requestCapabilities(LocationAPI* client); - -static uint32_t startTracking(LocationAPI* client, LocationOptions& options); -static void updateTrackingOptions(LocationAPI* client, uint32_t id, LocationOptions& options); -static void stopTracking(LocationAPI* client, uint32_t id); - -static void gnssNiResponse(LocationAPI* client, uint32_t id, GnssNiResponse response); -static uint32_t gnssDeleteAidingData(GnssAidingData& data); -static void gnssUpdateXtraThrottle(const bool enabled); - -static void setControlCallbacks(LocationControlCallbacks& controlCallbacks); -static uint32_t enable(LocationTechnologyType techType); -static void disable(uint32_t id); -static uint32_t* gnssUpdateConfig(GnssConfig config); - -static void injectLocation(double latitude, double longitude, float accuracy); -static void injectTime(int64_t time, int64_t timeReference, int32_t uncertainty); - -static void agpsInit(const AgpsCbInfo& cbInfo); -static void agpsDataConnOpen(AGpsExtType agpsType, const char* apnName, int apnLen, int ipType); -static void agpsDataConnClosed(AGpsExtType agpsType); -static void agpsDataConnFailed(AGpsExtType agpsType); -static void getDebugReport(GnssDebugReport& report); -static void updateConnectionStatus(bool connected, int8_t type); - -static void odcpiInit(const OdcpiRequestCallback& callback); -static void odcpiInject(const Location& location); - -static const GnssInterface gGnssInterface = { - sizeof(GnssInterface), - initialize, - deinitialize, - addClient, - removeClient, - requestCapabilities, - startTracking, - updateTrackingOptions, - stopTracking, - gnssNiResponse, - setControlCallbacks, - enable, - disable, - gnssUpdateConfig, - gnssDeleteAidingData, - gnssUpdateXtraThrottle, - injectLocation, - injectTime, - agpsInit, - agpsDataConnOpen, - agpsDataConnClosed, - agpsDataConnFailed, - getDebugReport, - updateConnectionStatus, - odcpiInit, - odcpiInject, -}; - -#ifndef DEBUG_X86 -extern "C" const GnssInterface* getGnssInterface() -#else -const GnssInterface* getGnssInterface() -#endif // DEBUG_X86 -{ - return &gGnssInterface; -} - -static void initialize() -{ - if (NULL == gGnssAdapter) { - gGnssAdapter = new GnssAdapter(); - } -} - -static void deinitialize() -{ - if (NULL != gGnssAdapter) { - delete gGnssAdapter; - gGnssAdapter = NULL; - } -} - -static void addClient(LocationAPI* client, const LocationCallbacks& callbacks) -{ - if (NULL != gGnssAdapter) { - gGnssAdapter->addClientCommand(client, callbacks); - } -} - -static void removeClient(LocationAPI* client) -{ - if (NULL != gGnssAdapter) { - gGnssAdapter->removeClientCommand(client); - } -} - -static void requestCapabilities(LocationAPI* client) -{ - if (NULL != gGnssAdapter) { - gGnssAdapter->requestCapabilitiesCommand(client); - } -} - -static uint32_t startTracking(LocationAPI* client, LocationOptions& options) -{ - if (NULL != gGnssAdapter) { - return gGnssAdapter->startTrackingCommand(client, options); - } else { - return 0; - } -} - -static void updateTrackingOptions(LocationAPI* client, uint32_t id, LocationOptions& options) -{ - if (NULL != gGnssAdapter) { - gGnssAdapter->updateTrackingOptionsCommand(client, id, options); - } -} - -static void stopTracking(LocationAPI* client, uint32_t id) -{ - if (NULL != gGnssAdapter) { - gGnssAdapter->stopTrackingCommand(client, id); - } -} - -static void gnssNiResponse(LocationAPI* client, uint32_t id, GnssNiResponse response) -{ - if (NULL != gGnssAdapter) { - gGnssAdapter->gnssNiResponseCommand(client, id, response); - } -} - -static void setControlCallbacks(LocationControlCallbacks& controlCallbacks) -{ - if (NULL != gGnssAdapter) { - return gGnssAdapter->setControlCallbacksCommand(controlCallbacks); - } -} - -static uint32_t enable(LocationTechnologyType techType) -{ - if (NULL != gGnssAdapter) { - return gGnssAdapter->enableCommand(techType); - } else { - return 0; - } -} - -static void disable(uint32_t id) -{ - if (NULL != gGnssAdapter) { - return gGnssAdapter->disableCommand(id); - } -} - -static uint32_t* gnssUpdateConfig(GnssConfig config) -{ - if (NULL != gGnssAdapter) { - return gGnssAdapter->gnssUpdateConfigCommand(config); - } else { - return NULL; - } -} - -static uint32_t gnssDeleteAidingData(GnssAidingData& data) -{ - if (NULL != gGnssAdapter) { - return gGnssAdapter->gnssDeleteAidingDataCommand(data); - } else { - return 0; - } -} - -static void gnssUpdateXtraThrottle(const bool enabled) -{ - if (NULL != gGnssAdapter) { - gGnssAdapter->gnssUpdateXtraThrottleCommand(enabled); - } -} - -static void injectLocation(double latitude, double longitude, float accuracy) -{ - if (NULL != gGnssAdapter) { - gGnssAdapter->injectLocationCommand(latitude, longitude, accuracy); - } -} - -static void injectTime(int64_t time, int64_t timeReference, int32_t uncertainty) -{ - if (NULL != gGnssAdapter) { - gGnssAdapter->injectTimeCommand(time, timeReference, uncertainty); - } -} - -static void agpsInit(const AgpsCbInfo& cbInfo) { - - if (NULL != gGnssAdapter) { - gGnssAdapter->initAgpsCommand(cbInfo); - } -} -static void agpsDataConnOpen( - AGpsExtType agpsType, const char* apnName, int apnLen, int ipType) { - - if (NULL != gGnssAdapter) { - gGnssAdapter->dataConnOpenCommand( - agpsType, apnName, apnLen, (AGpsBearerType)ipType); - } -} -static void agpsDataConnClosed(AGpsExtType agpsType) { - - if (NULL != gGnssAdapter) { - gGnssAdapter->dataConnClosedCommand(agpsType); - } -} -static void agpsDataConnFailed(AGpsExtType agpsType) { - - if (NULL != gGnssAdapter) { - gGnssAdapter->dataConnFailedCommand(agpsType); - } -} - -static void getDebugReport(GnssDebugReport& report) { - - if (NULL != gGnssAdapter) { - gGnssAdapter->getDebugReport(report); - } -} - -static void updateConnectionStatus(bool connected, int8_t type) { - if (NULL != gGnssAdapter) { - gGnssAdapter->getSystemStatus()->eventConnectionStatus(connected, type); - } -} - -static void odcpiInit(const OdcpiRequestCallback& callback) -{ - if (NULL != gGnssAdapter) { - gGnssAdapter->initOdcpiCommand(callback); - } -} - -static void odcpiInject(const Location& location) -{ - if (NULL != gGnssAdapter) { - gGnssAdapter->injectOdcpiCommand(location); - } -} - diff --git a/gps/gnsspps/Android.mk b/gps/gnsspps/Android.mk deleted file mode 100644 index f87b674..0000000 --- a/gps/gnsspps/Android.mk +++ /dev/null @@ -1,36 +0,0 @@ -ifneq ($(BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE),) -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_MODULE := libgnsspps -LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib -LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64 -LOCAL_MODULE_TAGS := optional - -LOCAL_SHARED_LIBRARIES := \ - libutils \ - libcutils \ - libgps.utils \ - liblog - -LOCAL_SRC_FILES += \ - gnsspps.c - -LOCAL_CFLAGS += \ - -fno-short-enums \ - -D_ANDROID_ - -## Includes -LOCAL_HEADER_LIBRARIES := \ - libgps.utils_headers \ - libloc_pla_headers -LOCAL_CFLAGS += $(GNSS_CFLAGS) -include $(BUILD_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := libgnsspps_headers -LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH) -include $(BUILD_HEADER_LIBRARY) - -endif diff --git a/gps/gnsspps/Makefile.am b/gps/gnsspps/Makefile.am deleted file mode 100644 index c990be0..0000000 --- a/gps/gnsspps/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -AM_CFLAGS = \ - $(LOCPLA_CFLAGS) \ - $(GPSUTILS_CFLAGS) \ - -I$(WORKSPACE)/system/core/include \ - -I./ - -ACLOCAL_AMFLAGS = -I m4 - -libgnsspps_la_SOURCES = \ - gnsspps.c - -if USE_GLIB -libgnsspps_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@ -libgnsspps_la_LDFLAGS = -lstdc++ -Wl,-z,defs -lpthread @GLIB_LIBS@ -shared -version-info 1:0:0 -libgnsspps_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@ -else -libgnsspps_la_CFLAGS = $(AM_CFLAGS) -libgnsspps_la_LDFLAGS = -Wl,-z,defs -lpthread -shared -version-info 1:0:0 -libgnsspps_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -endif - -libgnsspps_la_LIBADD = -lstdc++ $(GPSUTILS_LIBS) - -library_include_HEADERS = \ - gnsspps.h - -#Create and Install libraries -lib_LTLIBRARIES = libgnsspps.la - -library_includedir = $(pkgincludedir) -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = gnsspps.pc -EXTRA_DIST = $(pkgconfig_DATA) - - - - diff --git a/gps/gnsspps/configure.ac b/gps/gnsspps/configure.ac deleted file mode 100644 index eb87bc1..0000000 --- a/gps/gnsspps/configure.ac +++ /dev/null @@ -1,70 +0,0 @@ -# configure.ac -- Autoconf script for gps lbs-core -# -# Process this file with autoconf to produce a configure script - -# Requires autoconf tool later than 2.61 -AC_PREREQ(2.61) -# Initialize the gps lbs-core package version 1.0.0 -AC_INIT([gnsspps],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([Makefile.am]) -# 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([GPSUTILS], [gps-utils]) -AC_SUBST([GPSUTILS_CFLAGS]) -AC_SUBST([GPSUTILS_LIBS]) - -AC_ARG_WITH([locpla_includes], - AC_HELP_STRING([--with-locpla-includes=@<:@dir@:>@], - [Specify the path to locpla-includes in loc-pla_git.bb]), - [locpla_incdir=$withval], - with_locpla_includes=no) - -if test "x${with_locpla_includes}" != "xno"; then - AC_SUBST(LOCPLA_CFLAGS, "-I${locpla_incdir}") -fi - -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 \ - gnsspps.pc - ]) - -AC_OUTPUT diff --git a/gps/gnsspps/gnsspps.c b/gps/gnsspps/gnsspps.c deleted file mode 100644 index 70b23f5..0000000 --- a/gps/gnsspps/gnsspps.c +++ /dev/null @@ -1,194 +0,0 @@ -/* 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 Foundatoin, 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 <log_util.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <pthread.h> -#include <timepps.h> -#include <linux/types.h> - -//DRsync kernel timestamp -static struct timespec drsyncKernelTs = {0,0}; -//DRsync userspace timestamp -static struct timespec drsyncUserTs = {0,0}; -//flag to stop fetching timestamp -static int isActive = 0; -static pps_handle handle; - -static pthread_mutex_t ts_lock; - - /* checks the PPS source and opens it */ -int check_device(char *path, pps_handle *handle) -{ - int ret; - - /* Try to find the source by using the supplied "path" name */ - ret = open(path, O_RDWR); - if (ret < 0) - { - LOC_LOGV("%s:%d unable to open device %s", __func__, __LINE__, path); - return ret; - } - - /* Open the PPS source */ - ret = pps_create(ret, handle); - if (ret < 0) - { - LOC_LOGV( "%s:%d cannot create a PPS source from device %s", __func__, __LINE__, path); - return -1; - } - return 0; -} - -/* fetches the timestamp from the PPS source */ -int read_pps(pps_handle *handle) -{ - struct timespec timeout; - pps_info infobuf; - int ret; - // 3sec timeout - timeout.tv_sec = 3; - timeout.tv_nsec = 0; - - ret = pps_fetch(*handle, PPS_TSFMT_TSPEC, &infobuf,&timeout); - - if (ret < 0 && ret !=-EINTR) - { - LOC_LOGV("%s:%d pps_fetch() error %d", __func__, __LINE__, ret); - return -1; - } - - pthread_mutex_lock(&ts_lock); - drsyncKernelTs.tv_sec = infobuf.tv_sec; - drsyncKernelTs.tv_nsec = infobuf.tv_nsec; - ret = clock_gettime(CLOCK_BOOTTIME,&drsyncUserTs); - pthread_mutex_unlock(&ts_lock); - - if(ret != 0) - { - LOC_LOGV("%s:%d clock_gettime() error",__func__,__LINE__); - } - return 0; -} - -#ifdef __cplusplus -extern "C" { -#endif -/* infinitely calls read_pps() */ -void *thread_handle(void *input) -{ - int ret; - if(input != NULL) - { - LOC_LOGV("%s:%d Thread Input is present", __func__, __LINE__); - } - while(isActive) - { - ret = read_pps(&handle); - - if (ret == -1 && errno != ETIMEDOUT ) - { - LOC_LOGV("%s:%d Could not fetch PPS source", __func__, __LINE__); - } - } - return NULL; -} - -/* opens the device and fetches from PPS source */ -int initPPS(char *devname) -{ - int ret,pid; - pthread_t thread; - isActive = 1; - - ret = check_device(devname, &handle); - if (ret < 0) - { - LOC_LOGV("%s:%d Could not find PPS source", __func__, __LINE__); - return 0; - } - - pthread_mutex_init(&ts_lock,NULL); - - pid = pthread_create(&thread,NULL,&thread_handle,NULL); - if(pid != 0) - { - LOC_LOGV("%s:%d Could not create thread in InitPPS", __func__, __LINE__); - return 0; - } - return 1; -} - -/* stops fetching and closes the device */ -void deInitPPS() -{ - pthread_mutex_lock(&ts_lock); - isActive = 0; - pthread_mutex_unlock(&ts_lock); - - pthread_mutex_destroy(&ts_lock); - pps_destroy(handle); -} - -/* retrieves DRsync kernel timestamp,DRsync userspace timestamp - and updates current timestamp */ -/* Returns: - * 1. @Param out DRsync kernel timestamp - * 2. @Param out DRsync userspace timestamp - * 3. @Param out current timestamp - */ -int getPPS(struct timespec *fineKernelTs ,struct timespec *currentTs, - struct timespec *fineUserTs) -{ - int ret; - - pthread_mutex_lock(&ts_lock); - fineKernelTs->tv_sec = drsyncKernelTs.tv_sec; - fineKernelTs->tv_nsec = drsyncKernelTs.tv_nsec; - - fineUserTs->tv_sec = drsyncUserTs.tv_sec; - fineUserTs->tv_nsec = drsyncUserTs.tv_nsec; - - ret = clock_gettime(CLOCK_BOOTTIME,currentTs); - pthread_mutex_unlock(&ts_lock); - if(ret != 0) - { - LOC_LOGV("%s:%d clock_gettime() error",__func__,__LINE__); - return 0; - } - return 1; -} - -#ifdef __cplusplus -} -#endif - diff --git a/gps/gnsspps/gnsspps.h b/gps/gnsspps/gnsspps.h deleted file mode 100644 index 3642f3b..0000000 --- a/gps/gnsspps/gnsspps.h +++ /dev/null @@ -1,45 +0,0 @@ -/* 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 Foundatoin, 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 _GNSSPPS_H -#define _GNSSPPS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* opens the device and fetches from PPS source */ -int initPPS(char *devname); -/* updates the fine time stamp */ -int getPPS(struct timespec *current_ts, struct timespec *current_boottime, struct timespec *last_boottime); -/* stops fetching and closes the device */ -void deInitPPS(); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/gps/gnsspps/gnsspps.pc.in b/gps/gnsspps/gnsspps.pc.in deleted file mode 100644 index 8931ebd..0000000 --- a/gps/gnsspps/gnsspps.pc.in +++ /dev/null @@ -1,10 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: gnsspps -Description: QTI GPS gnsspps -Version: @VERSION -Libs: -L${libdir} -lgnsspps -Cflags: -I${includedir}/gnsspps diff --git a/gps/gnsspps/timepps.h b/gps/gnsspps/timepps.h deleted file mode 100644 index fe0d8f0..0000000 --- a/gps/gnsspps/timepps.h +++ /dev/null @@ -1,106 +0,0 @@ -/* 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 Foundatoin, 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 <errno.h> -#include <sys/time.h> -#include <sys/ioctl.h> -#include <linux/types.h> -#include <linux/pps.h> - -#ifndef _TIMEPPS_H -#define _TIMEPPS_H - -#ifdef __cplusplus -extern "C" { -#endif -/* time of assert event */ -typedef struct timespec pps_info; -/* represents pps source */ -typedef int pps_handle; - - /* Open the PPS source */ -static __inline int pps_create(int source, pps_handle *handle) -{ - int ret; - struct pps_kparams dummy; - - if (!handle) - { - errno = EINVAL; - return -1; - } - /* check if current device is valid pps */ - ret = ioctl(source, PPS_GETPARAMS, &dummy); - if (ret) - { - errno = EOPNOTSUPP; - return -1; - } - *handle = source; - - return 0; -} -/* close the pps source */ -static __inline int pps_destroy(pps_handle handle) -{ - return close(handle); -} -/*reads timestamp from pps device*/ -static __inline int pps_fetch(pps_handle handle, const int tsformat, - pps_info *ppsinfobuf, - const struct timespec *timeout) -{ - struct pps_fdata fdata; - int ret; - - if (tsformat != PPS_TSFMT_TSPEC) - { - errno = EINVAL; - return -1; - } - if (timeout) - { - fdata.timeout.sec = timeout->tv_sec; - fdata.timeout.nsec = timeout->tv_nsec; - fdata.timeout.flags = ~PPS_TIME_INVALID; - } - else - { - fdata.timeout.flags = PPS_TIME_INVALID; - } - ret = ioctl(handle, PPS_FETCH, &fdata); - - ppsinfobuf->tv_sec = fdata.info.assert_tu.sec; - ppsinfobuf->tv_nsec = fdata.info.assert_tu.nsec; - - return ret; -} - -#ifdef __cplusplus -} -#endif -#endif diff --git a/gps/loc-hal.pc.in b/gps/loc-hal.pc.in deleted file mode 100644 index 22d174b..0000000 --- a/gps/loc-hal.pc.in +++ /dev/null @@ -1,10 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: loc-hal -Description: QTI GPS Loc HAL -Version: @VERSION -Libs: -L${libdir} -lgnss -Cflags: -I${includedir} -I${includedir}/utils -I${includedir}/core -I${includedir}/loc-hal diff --git a/gps/location/Android.mk b/gps/location/Android.mk deleted file mode 100644 index bbd6fbd..0000000 --- a/gps/location/Android.mk +++ /dev/null @@ -1,41 +0,0 @@ -ifneq ($(BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE),) -ifneq ($(BUILD_TINY_ANDROID),true) - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_MODULE := liblocation_api -LOCAL_VENDOR_MODULE := true -LOCAL_MODULE_TAGS := optional - -LOCAL_SHARED_LIBRARIES := \ - libutils \ - libcutils \ - libgps.utils \ - libdl \ - liblog - -LOCAL_SRC_FILES += \ - LocationAPI.cpp \ - LocationAPIClientBase.cpp - -LOCAL_CFLAGS += \ - -fno-short-enums - -LOCAL_HEADER_LIBRARIES := \ - libloc_pla_headers \ - libgps.utils_headers - -LOCAL_PRELINK_MODULE := false - -LOCAL_CFLAGS += $(GNSS_CFLAGS) -include $(BUILD_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := liblocation_api_headers -LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH) -include $(BUILD_HEADER_LIBRARY) - -endif # not BUILD_TINY_ANDROID -endif # BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE diff --git a/gps/location/LocationAPI.cpp b/gps/location/LocationAPI.cpp deleted file mode 100644 index 0111a9c..0000000 --- a/gps/location/LocationAPI.cpp +++ /dev/null @@ -1,645 +0,0 @@ -/* Copyright (c) 2017 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_TAG "LocSvc_LocationAPI" - -#include <location_interface.h> -#include <dlfcn.h> -#include <loc_pla.h> -#include <log_util.h> -#include <pthread.h> -#include <map> - -typedef void* (getLocationInterface)(); -typedef std::map<LocationAPI*, LocationCallbacks> LocationClientMap; -typedef struct { - LocationClientMap clientData; - LocationControlAPI* controlAPI; - LocationControlCallbacks controlCallbacks; - GnssInterface* gnssInterface; - GeofenceInterface* geofenceInterface; - FlpInterface* flpInterface; -} LocationAPIData; -static LocationAPIData gData = {}; -static pthread_mutex_t gDataMutex = PTHREAD_MUTEX_INITIALIZER; -static bool gGnssLoadFailed = false; -static bool gFlpLoadFailed = false; -static bool gGeofenceLoadFailed = false; - -static bool needsGnssTrackingInfo(LocationCallbacks& locationCallbacks) -{ - return (locationCallbacks.gnssLocationInfoCb != nullptr || - locationCallbacks.gnssSvCb != nullptr || - locationCallbacks.gnssNmeaCb != nullptr || - locationCallbacks.gnssMeasurementsCb != nullptr); -} - -static bool isGnssClient(LocationCallbacks& locationCallbacks) -{ - return (locationCallbacks.gnssNiCb != nullptr || - locationCallbacks.trackingCb != nullptr || - locationCallbacks.gnssMeasurementsCb != nullptr); -} - -static bool isFlpClient(LocationCallbacks& locationCallbacks) -{ - return (locationCallbacks.trackingCb != nullptr || - locationCallbacks.batchingCb != nullptr); -} - -static bool isGeofenceClient(LocationCallbacks& locationCallbacks) -{ - return (locationCallbacks.geofenceBreachCb != nullptr || - locationCallbacks.geofenceStatusCb != nullptr); -} - -static void* loadLocationInterface(const char* library, const char* name) { - LOC_LOGD("%s]: loading %s::%s ...", __func__, library, name); - if (NULL == library || NULL == name) { - return NULL; - } - getLocationInterface* getter = NULL; - const char *error = NULL; - dlerror(); - void *handle = dlopen(library, RTLD_NOW); - if (NULL == handle || (error = dlerror()) != NULL) { - LOC_LOGW("dlopen for %s failed, error = %s", library, error); - } else { - getter = (getLocationInterface*)dlsym(handle, name); - if ((error = dlerror()) != NULL) { - LOC_LOGW("dlsym for %s::%s failed, error = %s", library, name, error); - getter = NULL; - } - } - - if (NULL == getter) { - return (void*)getter; - } else { - return (*getter)(); - } -} - -LocationAPI* -LocationAPI::createInstance(LocationCallbacks& locationCallbacks) -{ - if (nullptr == locationCallbacks.capabilitiesCb || - nullptr == locationCallbacks.responseCb || - nullptr == locationCallbacks.collectiveResponseCb) { - return NULL; - } - - LocationAPI* newLocationAPI = new LocationAPI(); - bool requestedCapabilities = false; - - pthread_mutex_lock(&gDataMutex); - - if (isGnssClient(locationCallbacks)) { - if (NULL == gData.gnssInterface && !gGnssLoadFailed) { - gData.gnssInterface = - (GnssInterface*)loadLocationInterface("libgnss.so", "getGnssInterface"); - if (NULL == gData.gnssInterface) { - gGnssLoadFailed = true; - LOC_LOGW("%s:%d]: No gnss interface available", __func__, __LINE__); - } else { - gData.gnssInterface->initialize(); - } - } - if (NULL != gData.gnssInterface) { - gData.gnssInterface->addClient(newLocationAPI, locationCallbacks); - if (!requestedCapabilities) { - gData.gnssInterface->requestCapabilities(newLocationAPI); - requestedCapabilities = true; - } - } - } - - if (isFlpClient(locationCallbacks)) { - if (NULL == gData.flpInterface && !gFlpLoadFailed) { - gData.flpInterface = - (FlpInterface*)loadLocationInterface("libflp.so", "getFlpInterface"); - if (NULL == gData.flpInterface) { - gFlpLoadFailed = true; - LOC_LOGW("%s:%d]: No flp interface available", __func__, __LINE__); - } else { - gData.flpInterface->initialize(); - } - } - if (NULL != gData.flpInterface) { - gData.flpInterface->addClient(newLocationAPI, locationCallbacks); - if (!requestedCapabilities) { - gData.flpInterface->requestCapabilities(newLocationAPI); - requestedCapabilities = true; - } - } - } - - if (isGeofenceClient(locationCallbacks)) { - if (NULL == gData.geofenceInterface && !gGeofenceLoadFailed) { - gData.geofenceInterface = - (GeofenceInterface*)loadLocationInterface("libgeofence.so", "getGeofenceInterface"); - if (NULL == gData.geofenceInterface) { - gGeofenceLoadFailed = true; - LOC_LOGW("%s:%d]: No geofence interface available", __func__, __LINE__); - } else { - gData.geofenceInterface->initialize(); - } - } - if (NULL != gData.geofenceInterface) { - gData.geofenceInterface->addClient(newLocationAPI, locationCallbacks); - if (!requestedCapabilities) { - gData.geofenceInterface->requestCapabilities(newLocationAPI); - requestedCapabilities = true; - } - } - } - - gData.clientData[newLocationAPI] = locationCallbacks; - - pthread_mutex_unlock(&gDataMutex); - - return newLocationAPI; -} - -void -LocationAPI::destroy() -{ - delete this; -} - -LocationAPI::LocationAPI() -{ - LOC_LOGD("LOCATION API CONSTRUCTOR"); -} - -LocationAPI::~LocationAPI() -{ - LOC_LOGD("LOCATION API DESTRUCTOR"); - pthread_mutex_lock(&gDataMutex); - - auto it = gData.clientData.find(this); - if (it != gData.clientData.end()) { - if (isGnssClient(it->second) && NULL != gData.gnssInterface) { - gData.gnssInterface->removeClient(it->first); - } - if (isFlpClient(it->second) && NULL != gData.flpInterface) { - gData.flpInterface->removeClient(it->first); - } - if (isGeofenceClient(it->second) && NULL != gData.geofenceInterface) { - gData.geofenceInterface->removeClient(it->first); - } - gData.clientData.erase(it); - } else { - LOC_LOGE("%s:%d]: Location API client %p not found in client data", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); -} - -void -LocationAPI::updateCallbacks(LocationCallbacks& locationCallbacks) -{ - if (nullptr == locationCallbacks.capabilitiesCb || - nullptr == locationCallbacks.responseCb || - nullptr == locationCallbacks.collectiveResponseCb) { - return; - } - - pthread_mutex_lock(&gDataMutex); - - if (isGnssClient(locationCallbacks)) { - if (NULL == gData.gnssInterface && !gGnssLoadFailed) { - gData.gnssInterface = - (GnssInterface*)loadLocationInterface("libgnss.so", "getGnssInterface"); - if (NULL == gData.gnssInterface) { - gGnssLoadFailed = true; - LOC_LOGW("%s:%d]: No gnss interface available", __func__, __LINE__); - } else { - gData.gnssInterface->initialize(); - } - } - if (NULL != gData.gnssInterface) { - // either adds new Client or updates existing Client - gData.gnssInterface->addClient(this, locationCallbacks); - } - } - - if (isFlpClient(locationCallbacks)) { - if (NULL == gData.flpInterface && !gFlpLoadFailed) { - gData.flpInterface = - (FlpInterface*)loadLocationInterface("libflp.so", "getFlpInterface"); - if (NULL == gData.flpInterface) { - gFlpLoadFailed = true; - LOC_LOGW("%s:%d]: No flp interface available", __func__, __LINE__); - } else { - gData.flpInterface->initialize(); - } - } - if (NULL != gData.flpInterface) { - // either adds new Client or updates existing Client - gData.flpInterface->addClient(this, locationCallbacks); - } - } - - if (isGeofenceClient(locationCallbacks)) { - if (NULL == gData.geofenceInterface && !gGeofenceLoadFailed) { - gData.geofenceInterface = - (GeofenceInterface*)loadLocationInterface("libgeofence.so", "getGeofenceInterface"); - if (NULL == gData.geofenceInterface) { - gGeofenceLoadFailed = true; - LOC_LOGW("%s:%d]: No geofence interface available", __func__, __LINE__); - } else { - gData.geofenceInterface->initialize(); - } - } - if (NULL != gData.geofenceInterface) { - // either adds new Client or updates existing Client - gData.geofenceInterface->addClient(this, locationCallbacks); - } - } - - gData.clientData[this] = locationCallbacks; - - pthread_mutex_unlock(&gDataMutex); -} - -uint32_t -LocationAPI::startTracking(LocationOptions& locationOptions) -{ - uint32_t id = 0; - pthread_mutex_lock(&gDataMutex); - - auto it = gData.clientData.find(this); - if (it != gData.clientData.end()) { - if (gData.flpInterface != NULL && locationOptions.minDistance > 0) { - id = gData.flpInterface->startTracking(this, locationOptions); - } else if (gData.gnssInterface != NULL && needsGnssTrackingInfo(it->second)) { - id = gData.gnssInterface->startTracking(this, locationOptions); - } else if (gData.flpInterface != NULL) { - id = gData.flpInterface->startTracking(this, locationOptions); - } else if (gData.gnssInterface != NULL) { - id = gData.gnssInterface->startTracking(this, locationOptions); - } else { - LOC_LOGE("%s:%d]: No gnss/flp interface available for Location API client %p ", - __func__, __LINE__, this); - } - } else { - LOC_LOGE("%s:%d]: Location API client %p not found in client data", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); - return id; -} - -void -LocationAPI::stopTracking(uint32_t id) -{ - pthread_mutex_lock(&gDataMutex); - - auto it = gData.clientData.find(this); - if (it != gData.clientData.end()) { - // we don't know if tracking was started on flp or gnss, so we call stop on both, where - // stopTracking call to the incorrect interface will fail without response back to client - if (gData.gnssInterface != NULL) { - gData.gnssInterface->stopTracking(this, id); - } - if (gData.flpInterface != NULL) { - gData.flpInterface->stopTracking(this, id); - } - if (gData.flpInterface == NULL && gData.gnssInterface == NULL) { - LOC_LOGE("%s:%d]: No gnss/flp interface available for Location API client %p ", - __func__, __LINE__, this); - } - } else { - LOC_LOGE("%s:%d]: Location API client %p not found in client data", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); -} - -void -LocationAPI::updateTrackingOptions(uint32_t id, LocationOptions& locationOptions) -{ - pthread_mutex_lock(&gDataMutex); - - auto it = gData.clientData.find(this); - if (it != gData.clientData.end()) { - // we don't know if tracking was started on flp or gnss, so we call update on both, where - // updateTracking call to the incorrect interface will fail without response back to client - if (gData.gnssInterface != NULL) { - gData.gnssInterface->updateTrackingOptions(this, id, locationOptions); - } - if (gData.flpInterface != NULL) { - gData.flpInterface->updateTrackingOptions(this, id, locationOptions); - } - if (gData.flpInterface == NULL && gData.gnssInterface == NULL) { - LOC_LOGE("%s:%d]: No gnss/flp interface available for Location API client %p ", - __func__, __LINE__, this); - } - } else { - LOC_LOGE("%s:%d]: Location API client %p not found in client data", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); -} - -uint32_t -LocationAPI::startBatching(LocationOptions& locationOptions, BatchingOptions &batchingOptions) -{ - uint32_t id = 0; - pthread_mutex_lock(&gDataMutex); - - if (gData.flpInterface != NULL) { - id = gData.flpInterface->startBatching(this, locationOptions, batchingOptions); - } else { - LOC_LOGE("%s:%d]: No flp interface available for Location API client %p ", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); - return id; -} - -void -LocationAPI::stopBatching(uint32_t id) -{ - pthread_mutex_lock(&gDataMutex); - - if (gData.flpInterface != NULL) { - gData.flpInterface->stopBatching(this, id); - } else { - LOC_LOGE("%s:%d]: No flp interface available for Location API client %p ", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); -} - -void -LocationAPI::updateBatchingOptions(uint32_t id, - LocationOptions& locationOptions, BatchingOptions& batchOptions) -{ - pthread_mutex_lock(&gDataMutex); - - if (gData.flpInterface != NULL) { - gData.flpInterface->updateBatchingOptions(this, - id, - locationOptions, - batchOptions); - } else { - LOC_LOGE("%s:%d]: No flp interface available for Location API client %p ", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); -} - -void -LocationAPI::getBatchedLocations(uint32_t id, size_t count) -{ - pthread_mutex_lock(&gDataMutex); - - if (gData.flpInterface != NULL) { - gData.flpInterface->getBatchedLocations(this, id, count); - } else { - LOC_LOGE("%s:%d]: No flp interface available for Location API client %p ", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); -} - -uint32_t* -LocationAPI::addGeofences(size_t count, GeofenceOption* options, GeofenceInfo* info) -{ - uint32_t* ids = NULL; - pthread_mutex_lock(&gDataMutex); - - if (gData.geofenceInterface != NULL) { - ids = gData.geofenceInterface->addGeofences(this, count, options, info); - } else { - LOC_LOGE("%s:%d]: No geofence interface available for Location API client %p ", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); - return ids; -} - -void -LocationAPI::removeGeofences(size_t count, uint32_t* ids) -{ - pthread_mutex_lock(&gDataMutex); - - if (gData.geofenceInterface != NULL) { - gData.geofenceInterface->removeGeofences(this, count, ids); - } else { - LOC_LOGE("%s:%d]: No geofence interface available for Location API client %p ", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); -} - -void -LocationAPI::modifyGeofences(size_t count, uint32_t* ids, GeofenceOption* options) -{ - pthread_mutex_lock(&gDataMutex); - - if (gData.geofenceInterface != NULL) { - gData.geofenceInterface->modifyGeofences(this, count, ids, options); - } else { - LOC_LOGE("%s:%d]: No geofence interface available for Location API client %p ", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); -} - -void -LocationAPI::pauseGeofences(size_t count, uint32_t* ids) -{ - pthread_mutex_lock(&gDataMutex); - - if (gData.geofenceInterface != NULL) { - gData.geofenceInterface->pauseGeofences(this, count, ids); - } else { - LOC_LOGE("%s:%d]: No geofence interface available for Location API client %p ", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); -} - -void -LocationAPI::resumeGeofences(size_t count, uint32_t* ids) -{ - pthread_mutex_lock(&gDataMutex); - - if (gData.geofenceInterface != NULL) { - gData.geofenceInterface->resumeGeofences(this, count, ids); - } else { - LOC_LOGE("%s:%d]: No geofence interface available for Location API client %p ", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); -} - -void -LocationAPI::gnssNiResponse(uint32_t id, GnssNiResponse response) -{ - pthread_mutex_lock(&gDataMutex); - - if (gData.gnssInterface != NULL) { - gData.gnssInterface->gnssNiResponse(this, id, response); - } else { - LOC_LOGE("%s:%d]: No gnss interface available for Location API client %p ", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); -} - -LocationControlAPI* -LocationControlAPI::createInstance(LocationControlCallbacks& locationControlCallbacks) -{ - LocationControlAPI* controlAPI = NULL; - pthread_mutex_lock(&gDataMutex); - - if (nullptr != locationControlCallbacks.responseCb && NULL == gData.controlAPI) { - if (NULL == gData.gnssInterface && !gGnssLoadFailed) { - gData.gnssInterface = - (GnssInterface*)loadLocationInterface("libgnss.so", "getGnssInterface"); - if (NULL == gData.gnssInterface) { - gGnssLoadFailed = true; - LOC_LOGW("%s:%d]: No gnss interface available", __func__, __LINE__); - } else { - gData.gnssInterface->initialize(); - } - } - if (NULL != gData.gnssInterface) { - gData.controlAPI = new LocationControlAPI(); - gData.controlCallbacks = locationControlCallbacks; - gData.gnssInterface->setControlCallbacks(locationControlCallbacks); - controlAPI = gData.controlAPI; - } - } - - pthread_mutex_unlock(&gDataMutex); - return controlAPI; -} - -void -LocationControlAPI::destroy() -{ - delete this; -} - -LocationControlAPI::LocationControlAPI() -{ - LOC_LOGD("LOCATION CONTROL API CONSTRUCTOR"); -} - -LocationControlAPI::~LocationControlAPI() -{ - LOC_LOGD("LOCATION CONTROL API DESTRUCTOR"); - pthread_mutex_lock(&gDataMutex); - - gData.controlAPI = NULL; - - pthread_mutex_unlock(&gDataMutex); -} - -uint32_t -LocationControlAPI::enable(LocationTechnologyType techType) -{ - uint32_t id = 0; - pthread_mutex_lock(&gDataMutex); - - if (gData.gnssInterface != NULL) { - id = gData.gnssInterface->enable(techType); - } else { - LOC_LOGE("%s:%d]: No gnss interface available for Location Control API client %p ", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); - return id; -} - -void -LocationControlAPI::disable(uint32_t id) -{ - pthread_mutex_lock(&gDataMutex); - - if (gData.gnssInterface != NULL) { - gData.gnssInterface->disable(id); - } else { - LOC_LOGE("%s:%d]: No gnss interface available for Location Control API client %p ", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); -} - -uint32_t* -LocationControlAPI::gnssUpdateConfig(GnssConfig config) -{ - uint32_t* ids = NULL; - pthread_mutex_lock(&gDataMutex); - - if (gData.gnssInterface != NULL) { - ids = gData.gnssInterface->gnssUpdateConfig(config); - } else { - LOC_LOGE("%s:%d]: No gnss interface available for Location Control API client %p ", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); - return ids; -} - -uint32_t -LocationControlAPI::gnssDeleteAidingData(GnssAidingData& data) -{ - uint32_t id = 0; - pthread_mutex_lock(&gDataMutex); - - if (gData.gnssInterface != NULL) { - id = gData.gnssInterface->gnssDeleteAidingData(data); - } else { - LOC_LOGE("%s:%d]: No gnss interface available for Location Control API client %p ", - __func__, __LINE__, this); - } - - pthread_mutex_unlock(&gDataMutex); - return id; -} diff --git a/gps/location/LocationAPI.h b/gps/location/LocationAPI.h deleted file mode 100644 index 530b1b0..0000000 --- a/gps/location/LocationAPI.h +++ /dev/null @@ -1,974 +0,0 @@ -/* Copyright (c) 2017 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 LOCATION_H -#define LOCATION_H - -#include <vector> -#include <stdint.h> -#include <functional> -#include <list> - -#define GNSS_NI_REQUESTOR_MAX 256 -#define GNSS_NI_MESSAGE_ID_MAX 2048 -#define GNSS_SV_MAX 64 -#define GNSS_MEASUREMENTS_MAX 64 -#define GNSS_UTC_TIME_OFFSET (3657) - -#define GNSS_BUGREPORT_GPS_MIN (1) -#define GNSS_BUGREPORT_SBAS_MIN (120) -#define GNSS_BUGREPORT_GLO_MIN (1) -#define GNSS_BUGREPORT_QZSS_MIN (193) -#define GNSS_BUGREPORT_BDS_MIN (1) -#define GNSS_BUGREPORT_GAL_MIN (1) - -typedef enum { - LOCATION_ERROR_SUCCESS = 0, - LOCATION_ERROR_GENERAL_FAILURE, - LOCATION_ERROR_CALLBACK_MISSING, - LOCATION_ERROR_INVALID_PARAMETER, - LOCATION_ERROR_ID_EXISTS, - LOCATION_ERROR_ID_UNKNOWN, - LOCATION_ERROR_ALREADY_STARTED, - LOCATION_ERROR_GEOFENCES_AT_MAX, - LOCATION_ERROR_NOT_SUPPORTED -} LocationError; - -// Flags to indicate which values are valid in a Location -typedef uint16_t LocationFlagsMask; -typedef enum { - LOCATION_HAS_LAT_LONG_BIT = (1<<0), // location has valid latitude and longitude - LOCATION_HAS_ALTITUDE_BIT = (1<<1), // location has valid altitude - LOCATION_HAS_SPEED_BIT = (1<<2), // location has valid speed - LOCATION_HAS_BEARING_BIT = (1<<3), // location has valid bearing - LOCATION_HAS_ACCURACY_BIT = (1<<4), // location has valid accuracy - LOCATION_HAS_VERTICAL_ACCURACY_BIT = (1<<5), // location has valid vertical accuracy - LOCATION_HAS_SPEED_ACCURACY_BIT = (1<<6), // location has valid speed accuracy - LOCATION_HAS_BEARING_ACCURACY_BIT = (1<<7), // location has valid bearing accuracy -} LocationFlagsBits; - -typedef uint16_t LocationTechnologyMask; -typedef enum { - LOCATION_TECHNOLOGY_GNSS_BIT = (1<<0), // location was calculated using GNSS - LOCATION_TECHNOLOGY_CELL_BIT = (1<<1), // location was calculated using Cell - LOCATION_TECHNOLOGY_WIFI_BIT = (1<<2), // location was calculated using WiFi - LOCATION_TECHNOLOGY_SENSORS_BIT = (1<<3), // location was calculated using Sensors -} LocationTechnologyBits; - -typedef enum { - LOCATION_RELIABILITY_NOT_SET = 0, - LOCATION_RELIABILITY_VERY_LOW, - LOCATION_RELIABILITY_LOW, - LOCATION_RELIABILITY_MEDIUM, - LOCATION_RELIABILITY_HIGH, -} LocationReliability; - -typedef uint32_t GnssLocationInfoFlagMask; -typedef enum { - GNSS_LOCATION_INFO_ALTITUDE_MEAN_SEA_LEVEL_BIT = (1<<0), // valid altitude mean sea level - GNSS_LOCATION_INFO_DOP_BIT = (1<<1), // valid pdop, hdop, and vdop - GNSS_LOCATION_INFO_MAGNETIC_DEVIATION_BIT = (1<<2), // valid magnetic deviation - GNSS_LOCATION_INFO_HOR_RELIABILITY_BIT = (1<<3), // valid horizontal reliability - GNSS_LOCATION_INFO_VER_RELIABILITY_BIT = (1<<4), // valid vertical reliability - GNSS_LOCATION_INFO_HOR_ACCURACY_ELIP_SEMI_MAJOR_BIT = (1<<5), // valid elipsode semi major - GNSS_LOCATION_INFO_HOR_ACCURACY_ELIP_SEMI_MINOR_BIT = (1<<6), // valid elipsode semi minor - GNSS_LOCATION_INFO_HOR_ACCURACY_ELIP_AZIMUTH_BIT = (1<<7),// valid accuracy elipsode azimuth -} GnssLocationInfoFlagBits; - -typedef enum { - GEOFENCE_BREACH_ENTER = 0, - GEOFENCE_BREACH_EXIT, - GEOFENCE_BREACH_DWELL_IN, - GEOFENCE_BREACH_DWELL_OUT, - GEOFENCE_BREACH_UNKNOWN, -} GeofenceBreachType; - -typedef uint16_t GeofenceBreachTypeMask; -typedef enum { - GEOFENCE_BREACH_ENTER_BIT = (1<<0), - GEOFENCE_BREACH_EXIT_BIT = (1<<1), - GEOFENCE_BREACH_DWELL_IN_BIT = (1<<2), - GEOFENCE_BREACH_DWELL_OUT_BIT = (1<<3), -} GeofenceBreachTypeBits; - -typedef enum { - GEOFENCE_STATUS_AVAILABILE_NO = 0, - GEOFENCE_STATUS_AVAILABILE_YES, -} GeofenceStatusAvailable; - -typedef uint32_t LocationCapabilitiesMask; -typedef enum { - // supports startTracking API with minInterval param - LOCATION_CAPABILITIES_TIME_BASED_TRACKING_BIT = (1<<0), - // supports startBatching API with minInterval param - LOCATION_CAPABILITIES_TIME_BASED_BATCHING_BIT = (1<<1), - // supports startTracking API with minDistance param - LOCATION_CAPABILITIES_DISTANCE_BASED_TRACKING_BIT = (1<<2), - // supports startBatching API with minDistance param - LOCATION_CAPABILITIES_DISTANCE_BASED_BATCHING_BIT = (1<<3), - // supports addGeofences API - LOCATION_CAPABILITIES_GEOFENCE_BIT = (1<<4), - // supports GnssMeasurementsCallback - LOCATION_CAPABILITIES_GNSS_MEASUREMENTS_BIT = (1<<5), - // supports startTracking/startBatching API with LocationOptions.mode of MSB (Ms Based) - LOCATION_CAPABILITIES_GNSS_MSB_BIT = (1<<6), - // supports startTracking/startBatching API with LocationOptions.mode of MSA (MS Assisted) - LOCATION_CAPABILITIES_GNSS_MSA_BIT = (1<<7), - // supports debug nmea sentences in the debugNmeaCallback - LOCATION_CAPABILITIES_DEBUG_NMEA_BIT = (1<<8), - // support outdoor trip batching - LOCATION_CAPABILITIES_OUTDOOR_TRIP_BATCHING_BIT = (1<<9) -} LocationCapabilitiesBits; - -typedef enum { - LOCATION_TECHNOLOGY_TYPE_GNSS = 0, -} LocationTechnologyType; - -// Configures how GPS is locked when GPS is disabled (through GnssDisable) -typedef enum { - GNSS_CONFIG_GPS_LOCK_NONE = 0, // gps is not locked when GPS is disabled (GnssDisable) - GNSS_CONFIG_GPS_LOCK_MO, // gps mobile originated (MO) is locked when GPS is disabled - GNSS_CONFIG_GPS_LOCK_NI, // gps network initiated (NI) is locked when GPS is disabled - GNSS_CONFIG_GPS_LOCK_MO_AND_NI,// gps MO and NI is locked when GPS is disabled -} GnssConfigGpsLock; - -// SUPL version -typedef enum { - GNSS_CONFIG_SUPL_VERSION_1_0_0 = 1, - GNSS_CONFIG_SUPL_VERSION_2_0_0, - GNSS_CONFIG_SUPL_VERSION_2_0_2, -} GnssConfigSuplVersion; - -// LTE Positioning Profile -typedef enum { - GNSS_CONFIG_LPP_PROFILE_RRLP_ON_LTE = 0, // RRLP on LTE (Default) - GNSS_CONFIG_LPP_PROFILE_USER_PLANE, // LPP User Plane (UP) on LTE - GNSS_CONFIG_LPP_PROFILE_CONTROL_PLANE, // LPP_Control_Plane (CP) - GNSS_CONFIG_LPP_PROFILE_USER_PLANE_AND_CONTROL_PLANE, // Both LPP UP and CP -} GnssConfigLppProfile; - -// Technology for LPPe Control Plane -typedef uint16_t GnssConfigLppeControlPlaneMask; -typedef enum { - GNSS_CONFIG_LPPE_CONTROL_PLANE_DBH_BIT = (1<<0), // DBH - GNSS_CONFIG_LPPE_CONTROL_PLANE_WLAN_AP_MEASUREMENTS_BIT = (1<<1), // WLAN_AP_MEASUREMENTS - GNSS_CONFIG_LPPE_CONTROL_PLANE_SRN_AP_MEASUREMENTS_BIT = (1<<2), // SRN_AP_MEASUREMENTS - GNSS_CONFIG_LPPE_CONTROL_PLANE_SENSOR_BARO_MEASUREMENTS_BIT = (1<<3), - // SENSOR_BARO_MEASUREMENTS -} GnssConfigLppeControlPlaneBits; - -// Technology for LPPe User Plane -typedef uint16_t GnssConfigLppeUserPlaneMask; -typedef enum { - GNSS_CONFIG_LPPE_USER_PLANE_DBH_BIT = (1<<0), // DBH - GNSS_CONFIG_LPPE_USER_PLANE_WLAN_AP_MEASUREMENTS_BIT = (1<<1), // WLAN_AP_MEASUREMENTS - GNSS_CONFIG_LPPE_USER_PLANE_SRN_AP_MEASUREMENTS_BIT = (1<<2), // SRN_AP_MEASUREMENTS - GNSS_CONFIG_LPPE_USER_PLANE_SENSOR_BARO_MEASUREMENTS_BIT = (1<<3), - // SENSOR_BARO_MEASUREMENTS -} GnssConfigLppeUserPlaneBits; - -// Positioning Protocol on A-GLONASS system -typedef uint16_t GnssConfigAGlonassPositionProtocolMask; -typedef enum { - GNSS_CONFIG_RRC_CONTROL_PLANE_BIT = (1<<0), // RRC Control Plane - GNSS_CONFIG_RRLP_USER_PLANE_BIT = (1<<1), // RRLP User Plane - GNSS_CONFIG_LLP_USER_PLANE_BIT = (1<<2), // LPP User Plane - GNSS_CONFIG_LLP_CONTROL_PLANE_BIT = (1<<3), // LPP Control Plane -} GnssConfigAGlonassPositionProtocolBits; - -typedef enum { - GNSS_CONFIG_EMERGENCY_PDN_FOR_EMERGENCY_SUPL_NO = 0, - GNSS_CONFIG_EMERGENCY_PDN_FOR_EMERGENCY_SUPL_YES, -} GnssConfigEmergencyPdnForEmergencySupl; - -typedef enum { - GNSS_CONFIG_SUPL_EMERGENCY_SERVICES_NO = 0, - GNSS_CONFIG_SUPL_EMERGENCY_SERVICES_YES, -} GnssConfigSuplEmergencyServices; - -typedef uint16_t GnssConfigSuplModeMask; -typedef enum { - GNSS_CONFIG_SUPL_MODE_MSB_BIT = (1<<0), - GNSS_CONFIG_SUPL_MODE_MSA_BIT = (1<<1), -} GnssConfigSuplModeBits; - -typedef uint32_t GnssConfigFlagsMask; -typedef enum { - GNSS_CONFIG_FLAGS_GPS_LOCK_VALID_BIT = (1<<0), - GNSS_CONFIG_FLAGS_SUPL_VERSION_VALID_BIT = (1<<1), - GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT = (1<<2), - GNSS_CONFIG_FLAGS_LPP_PROFILE_VALID_BIT = (1<<3), - GNSS_CONFIG_FLAGS_LPPE_CONTROL_PLANE_VALID_BIT = (1<<4), - GNSS_CONFIG_FLAGS_LPPE_USER_PLANE_VALID_BIT = (1<<5), - GNSS_CONFIG_FLAGS_AGLONASS_POSITION_PROTOCOL_VALID_BIT = (1<<6), - GNSS_CONFIG_FLAGS_EM_PDN_FOR_EM_SUPL_VALID_BIT = (1<<7), - GNSS_CONFIG_FLAGS_SUPL_EM_SERVICES_BIT = (1<<8), - GNSS_CONFIG_FLAGS_SUPL_MODE_BIT = (1<<9), -} GnssConfigFlagsBits; - -typedef enum { - GNSS_NI_ENCODING_TYPE_NONE = 0, - GNSS_NI_ENCODING_TYPE_GSM_DEFAULT, - GNSS_NI_ENCODING_TYPE_UTF8, - GNSS_NI_ENCODING_TYPE_UCS2, -} GnssNiEncodingType; - -typedef enum { - GNSS_NI_TYPE_VOICE = 0, - GNSS_NI_TYPE_SUPL, - GNSS_NI_TYPE_CONTROL_PLANE, - GNSS_NI_TYPE_EMERGENCY_SUPL -} GnssNiType; - -typedef uint16_t GnssNiOptionsMask; -typedef enum { - GNSS_NI_OPTIONS_NOTIFICATION_BIT = (1<<0), - GNSS_NI_OPTIONS_VERIFICATION_BIT = (1<<1), - GNSS_NI_OPTIONS_PRIVACY_OVERRIDE_BIT = (1<<2), -} GnssNiOptionsBits; - -typedef enum { - GNSS_NI_RESPONSE_ACCEPT = 1, - GNSS_NI_RESPONSE_DENY, - GNSS_NI_RESPONSE_NO_RESPONSE, - GNSS_NI_RESPONSE_IGNORE, -} GnssNiResponse; - -typedef enum { - GNSS_SV_TYPE_UNKNOWN = 0, - GNSS_SV_TYPE_GPS, - GNSS_SV_TYPE_SBAS, - GNSS_SV_TYPE_GLONASS, - GNSS_SV_TYPE_QZSS, - GNSS_SV_TYPE_BEIDOU, - GNSS_SV_TYPE_GALILEO, -} GnssSvType; - -typedef enum { - GNSS_EPH_TYPE_UNKNOWN = 0, - GNSS_EPH_TYPE_EPHEMERIS, - GNSS_EPH_TYPE_ALMANAC, -} GnssEphemerisType; - -typedef enum { - GNSS_EPH_SOURCE_UNKNOWN = 0, - GNSS_EPH_SOURCE_DEMODULATED, - GNSS_EPH_SOURCE_SUPL_PROVIDED, - GNSS_EPH_SOURCE_OTHER_SERVER_PROVIDED, - GNSS_EPH_SOURCE_LOCAL, -} GnssEphemerisSource; - -typedef enum { - GNSS_EPH_HEALTH_UNKNOWN = 0, - GNSS_EPH_HEALTH_GOOD, - GNSS_EPH_HEALTH_BAD, -} GnssEphemerisHealth; - -typedef uint16_t GnssSvOptionsMask; -typedef enum { - GNSS_SV_OPTIONS_HAS_EPHEMER_BIT = (1<<0), - GNSS_SV_OPTIONS_HAS_ALMANAC_BIT = (1<<1), - GNSS_SV_OPTIONS_USED_IN_FIX_BIT = (1<<2), -} GnssSvOptionsBits; - -typedef enum { - GNSS_ASSISTANCE_TYPE_SUPL = 0, - GNSS_ASSISTANCE_TYPE_C2K, -} GnssAssistanceType; - -typedef enum { - GNSS_SUPL_MODE_STANDALONE = 0, - GNSS_SUPL_MODE_MSB, - GNSS_SUPL_MODE_MSA, -} GnssSuplMode; - -typedef enum { - BATCHING_MODE_ROUTINE = 0, // positions are reported when batched positions memory is full - BATCHING_MODE_TRIP, // positions are reported when a certain distance is covered - BATCHING_MODE_NO_AUTO_REPORT // no report of positions automatically, instead queried on demand -} BatchingMode; - -typedef enum { - BATCHING_STATUS_TRIP_COMPLETED = 0, - BATCHING_STATUS_POSITION_AVAILABE, - BATCHING_STATUS_POSITION_UNAVAILABLE -} BatchingStatus; - -typedef uint16_t GnssMeasurementsAdrStateMask; -typedef enum { - GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_UNKNOWN = 0, - GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_VALID_BIT = (1<<0), - GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_RESET_BIT = (1<<1), - GNSS_MEASUREMENTS_ACCUMULATED_DELTA_RANGE_STATE_CYCLE_SLIP_BIT = (1<<2), -} GnssMeasurementsAdrStateBits; - -typedef uint32_t GnssMeasurementsDataFlagsMask; -typedef enum { - GNSS_MEASUREMENTS_DATA_SV_ID_BIT = (1<<0), - GNSS_MEASUREMENTS_DATA_SV_TYPE_BIT = (1<<1), - GNSS_MEASUREMENTS_DATA_STATE_BIT = (1<<2), - GNSS_MEASUREMENTS_DATA_RECEIVED_SV_TIME_BIT = (1<<3), - GNSS_MEASUREMENTS_DATA_RECEIVED_SV_TIME_UNCERTAINTY_BIT = (1<<4), - GNSS_MEASUREMENTS_DATA_CARRIER_TO_NOISE_BIT = (1<<5), - GNSS_MEASUREMENTS_DATA_PSEUDORANGE_RATE_BIT = (1<<6), - GNSS_MEASUREMENTS_DATA_PSEUDORANGE_RATE_UNCERTAINTY_BIT = (1<<7), - GNSS_MEASUREMENTS_DATA_ADR_STATE_BIT = (1<<8), - GNSS_MEASUREMENTS_DATA_ADR_BIT = (1<<9), - GNSS_MEASUREMENTS_DATA_ADR_UNCERTAINTY_BIT = (1<<10), - GNSS_MEASUREMENTS_DATA_CARRIER_FREQUENCY_BIT = (1<<11), - GNSS_MEASUREMENTS_DATA_CARRIER_CYCLES_BIT = (1<<12), - GNSS_MEASUREMENTS_DATA_CARRIER_PHASE_BIT = (1<<13), - GNSS_MEASUREMENTS_DATA_CARRIER_PHASE_UNCERTAINTY_BIT = (1<<14), - GNSS_MEASUREMENTS_DATA_MULTIPATH_INDICATOR_BIT = (1<<15), - GNSS_MEASUREMENTS_DATA_SIGNAL_TO_NOISE_RATIO_BIT = (1<<16), - GNSS_MEASUREMENTS_DATA_AUTOMATIC_GAIN_CONTROL_BIT = (1<<17), -} GnssMeasurementsDataFlagsBits; - -typedef uint32_t GnssMeasurementsStateMask; -typedef enum { - GNSS_MEASUREMENTS_STATE_UNKNOWN_BIT = 0, - GNSS_MEASUREMENTS_STATE_CODE_LOCK_BIT = (1<<0), - GNSS_MEASUREMENTS_STATE_BIT_SYNC_BIT = (1<<1), - GNSS_MEASUREMENTS_STATE_SUBFRAME_SYNC_BIT = (1<<2), - GNSS_MEASUREMENTS_STATE_TOW_DECODED_BIT = (1<<3), - GNSS_MEASUREMENTS_STATE_MSEC_AMBIGUOUS_BIT = (1<<4), - GNSS_MEASUREMENTS_STATE_SYMBOL_SYNC_BIT = (1<<5), - GNSS_MEASUREMENTS_STATE_GLO_STRING_SYNC_BIT = (1<<6), - GNSS_MEASUREMENTS_STATE_GLO_TOD_DECODED_BIT = (1<<7), - GNSS_MEASUREMENTS_STATE_BDS_D2_BIT_SYNC_BIT = (1<<8), - GNSS_MEASUREMENTS_STATE_BDS_D2_SUBFRAME_SYNC_BIT = (1<<9), - GNSS_MEASUREMENTS_STATE_GAL_E1BC_CODE_LOCK_BIT = (1<<10), - GNSS_MEASUREMENTS_STATE_GAL_E1C_2ND_CODE_LOCK_BIT = (1<<11), - GNSS_MEASUREMENTS_STATE_GAL_E1B_PAGE_SYNC_BIT = (1<<12), - GNSS_MEASUREMENTS_STATE_SBAS_SYNC_BIT = (1<<13), -} GnssMeasurementsStateBits; - -typedef enum { - GNSS_MEASUREMENTS_MULTIPATH_INDICATOR_UNKNOWN = 0, - GNSS_MEASUREMENTS_MULTIPATH_INDICATOR_PRESENT, - GNSS_MEASUREMENTS_MULTIPATH_INDICATOR_NOT_PRESENT, -} GnssMeasurementsMultipathIndicator; - -typedef uint32_t GnssMeasurementsClockFlagsMask; -typedef enum { - GNSS_MEASUREMENTS_CLOCK_FLAGS_LEAP_SECOND_BIT = (1<<0), - GNSS_MEASUREMENTS_CLOCK_FLAGS_TIME_BIT = (1<<1), - GNSS_MEASUREMENTS_CLOCK_FLAGS_TIME_UNCERTAINTY_BIT = (1<<2), - GNSS_MEASUREMENTS_CLOCK_FLAGS_FULL_BIAS_BIT = (1<<3), - GNSS_MEASUREMENTS_CLOCK_FLAGS_BIAS_BIT = (1<<4), - GNSS_MEASUREMENTS_CLOCK_FLAGS_BIAS_UNCERTAINTY_BIT = (1<<5), - GNSS_MEASUREMENTS_CLOCK_FLAGS_DRIFT_BIT = (1<<6), - GNSS_MEASUREMENTS_CLOCK_FLAGS_DRIFT_UNCERTAINTY_BIT = (1<<7), - GNSS_MEASUREMENTS_CLOCK_FLAGS_HW_CLOCK_DISCONTINUITY_COUNT_BIT = (1<<8), -} GnssMeasurementsClockFlagsBits; - -typedef uint32_t GnssAidingDataSvMask; -typedef enum { - GNSS_AIDING_DATA_SV_EPHEMERIS_BIT = (1<<0), // ephemeris - GNSS_AIDING_DATA_SV_ALMANAC_BIT = (1<<1), // almanac - GNSS_AIDING_DATA_SV_HEALTH_BIT = (1<<2), // health - GNSS_AIDING_DATA_SV_DIRECTION_BIT = (1<<3), // direction - GNSS_AIDING_DATA_SV_STEER_BIT = (1<<4), // steer - GNSS_AIDING_DATA_SV_ALMANAC_CORR_BIT = (1<<5), // almanac correction - GNSS_AIDING_DATA_SV_BLACKLIST_BIT = (1<<6), // blacklist SVs - GNSS_AIDING_DATA_SV_SA_DATA_BIT = (1<<7), // sensitivity assistance data - GNSS_AIDING_DATA_SV_NO_EXIST_BIT = (1<<8), // SV does not exist - GNSS_AIDING_DATA_SV_IONOSPHERE_BIT = (1<<9), // ionosphere correction - GNSS_AIDING_DATA_SV_TIME_BIT = (1<<10),// reset satellite time -} GnssAidingDataSvBits; - -typedef uint32_t GnssAidingDataSvTypeMask; -typedef enum { - GNSS_AIDING_DATA_SV_TYPE_GPS_BIT = (1<<0), - GNSS_AIDING_DATA_SV_TYPE_GLONASS_BIT = (1<<1), - GNSS_AIDING_DATA_SV_TYPE_QZSS_BIT = (1<<2), - GNSS_AIDING_DATA_SV_TYPE_BEIDOU_BIT = (1<<3), - GNSS_AIDING_DATA_SV_TYPE_GALILEO_BIT = (1<<4), -} GnssAidingDataSvTypeBits; - -typedef struct { - GnssAidingDataSvMask svMask; // bitwise OR of GnssAidingDataSvBits - GnssAidingDataSvTypeMask svTypeMask; // bitwise OR of GnssAidingDataSvTypeBits -} GnssAidingDataSv; - -typedef uint32_t GnssAidingDataCommonMask; -typedef enum { - GNSS_AIDING_DATA_COMMON_POSITION_BIT = (1<<0), // position estimate - GNSS_AIDING_DATA_COMMON_TIME_BIT = (1<<1), // reset all clock values - GNSS_AIDING_DATA_COMMON_UTC_BIT = (1<<2), // UTC estimate - GNSS_AIDING_DATA_COMMON_RTI_BIT = (1<<3), // RTI - GNSS_AIDING_DATA_COMMON_FREQ_BIAS_EST_BIT = (1<<4), // frequency bias estimate - GNSS_AIDING_DATA_COMMON_CELLDB_BIT = (1<<5), // all celldb info -} GnssAidingDataCommonBits; - -typedef struct { - GnssAidingDataCommonMask mask; // bitwise OR of GnssAidingDataCommonBits -} GnssAidingDataCommon; - -typedef struct { - bool deleteAll; // if true, delete all aiding data and ignore other params - GnssAidingDataSv sv; // SV specific aiding data - GnssAidingDataCommon common; // common aiding data -} GnssAidingData; - -typedef struct { - size_t size; // set to sizeof(Location) - LocationFlagsMask flags; // bitwise OR of LocationFlagsBits to mark which params are valid - uint64_t timestamp; // UTC timestamp for location fix, milliseconds since January 1, 1970 - double latitude; // in degrees - double longitude; // in degrees - double altitude; // in meters above the WGS 84 reference ellipsoid - float speed; // in meters per second - float bearing; // in degrees; range [0, 360) - float accuracy; // in meters - float verticalAccuracy; // in meters - float speedAccuracy; // in meters/second - float bearingAccuracy; // in degrees (0 to 359.999) - LocationTechnologyMask techMask; -} Location; - -typedef struct { - size_t size; // set to sizeof(LocationOptions) - uint32_t minInterval; // in milliseconds - uint32_t minDistance; // in meters. if minDistance > 0, gnssSvCallback/gnssNmeaCallback/ - // gnssMeasurementsCallback may not be called - GnssSuplMode mode; // Standalone/MS-Based/MS-Assisted -} LocationOptions; - -typedef struct { - size_t size; - BatchingMode batchingMode; -} BatchingOptions; - -typedef struct { - size_t size; - BatchingStatus batchingStatus; -} BatchingStatusInfo; - -typedef struct { - size_t size; // set to sizeof(GeofenceOption) - GeofenceBreachTypeMask breachTypeMask; // bitwise OR of GeofenceBreachTypeBits - uint32_t responsiveness; // in milliseconds - uint32_t dwellTime; // in seconds -} GeofenceOption; - -typedef struct { - size_t size; // set to sizeof(GeofenceInfo) - double latitude; // in degrees - double longitude; // in degrees - double radius; // in meters -} GeofenceInfo; - -typedef struct { - size_t size; // set to sizeof(GeofenceBreachNotification) - size_t count; // number of ids in array - uint32_t* ids; // array of ids that have breached - Location location; // location associated with breach - GeofenceBreachType type; // type of breach - uint64_t timestamp; // timestamp of breach -} GeofenceBreachNotification; - -typedef struct { - size_t size; // set to sizeof(GeofenceBreachNotification) - GeofenceStatusAvailable available; // GEOFENCE_STATUS_AVAILABILE_NO/_YES - LocationTechnologyType techType; // GNSS -} GeofenceStatusNotification; - -typedef struct { - size_t size; // set to sizeof(GnssLocationInfo) - GnssLocationInfoFlagMask flags; // bitwise OR of GnssLocationInfoBits for param validity - float altitudeMeanSeaLevel; // altitude wrt mean sea level - float pdop; // position dilusion of precision - float hdop; // horizontal dilusion of precision - float vdop; // vertical dilusion of precision - float magneticDeviation; // magnetic deviation - LocationReliability horReliability; // horizontal reliability - LocationReliability verReliability; // vertical reliability - float horUncEllipseSemiMajor; // horizontal elliptical accuracy semi-major axis - float horUncEllipseSemiMinor; // horizontal elliptical accuracy semi-minor axis - float horUncEllipseOrientAzimuth; // horizontal elliptical accuracy azimuth -} GnssLocationInfoNotification; - -typedef struct { - size_t size; // set to sizeof(GnssNiNotification) - GnssNiType type; // type of NI (Voice, SUPL, Control Plane) - GnssNiOptionsMask options; // bitwise OR of GnssNiOptionsBits - uint32_t timeout; // time (seconds) to wait for user input - GnssNiResponse timeoutResponse; // the response that should be sent when timeout expires - char requestor[GNSS_NI_REQUESTOR_MAX]; // the requestor that is making the request - GnssNiEncodingType requestorEncoding; // the encoding type for requestor - char message[GNSS_NI_MESSAGE_ID_MAX]; // the message to show user - GnssNiEncodingType messageEncoding; // the encoding type for message - char extras[GNSS_NI_MESSAGE_ID_MAX]; -} GnssNiNotification; - -typedef struct { - size_t size; // set to sizeof(GnssSv) - uint16_t svId; // Unique Identifier - GnssSvType type; // type of SV (GPS, SBAS, GLONASS, QZSS, BEIDOU, GALILEO) - float cN0Dbhz; // signal strength - float elevation; // elevation of SV (in degrees) - float azimuth; // azimuth of SV (in degrees) - GnssSvOptionsMask gnssSvOptionsMask; // Bitwise OR of GnssSvOptionsBits -} GnssSv; - -typedef struct { - size_t size; // set to sizeof(GnssConfigSetAssistanceServer) - GnssAssistanceType type; // SUPL or C2K - const char* hostName; // null terminated string - uint32_t port; // port of server -} GnssConfigSetAssistanceServer; - -typedef struct { - size_t size; // set to sizeof(GnssMeasurementsData) - GnssMeasurementsDataFlagsMask flags; // bitwise OR of GnssMeasurementsDataFlagsBits - int16_t svId; - GnssSvType svType; - double timeOffsetNs; - GnssMeasurementsStateMask stateMask; // bitwise OR of GnssMeasurementsStateBits - int64_t receivedSvTimeNs; - int64_t receivedSvTimeUncertaintyNs; - double carrierToNoiseDbHz; - double pseudorangeRateMps; - double pseudorangeRateUncertaintyMps; - GnssMeasurementsAdrStateMask adrStateMask; // bitwise OR of GnssMeasurementsAdrStateBits - double adrMeters; - double adrUncertaintyMeters; - float carrierFrequencyHz; - int64_t carrierCycles; - double carrierPhase; - double carrierPhaseUncertainty; - GnssMeasurementsMultipathIndicator multipathIndicator; - double signalToNoiseRatioDb; - double agcLevelDb; -} GnssMeasurementsData; - -typedef struct { - size_t size; // set to sizeof(GnssMeasurementsClock) - GnssMeasurementsClockFlagsMask flags; // bitwise OR of GnssMeasurementsClockFlagsBits - int16_t leapSecond; - int64_t timeNs; - double timeUncertaintyNs; - int64_t fullBiasNs; - double biasNs; - double biasUncertaintyNs; - double driftNsps; - double driftUncertaintyNsps; - uint32_t hwClockDiscontinuityCount; -} GnssMeasurementsClock; - -typedef struct { - size_t size; // set to sizeof(GnssSvNotification) - size_t count; // number of SVs in the GnssSv array - GnssSv gnssSvs[GNSS_SV_MAX]; // information on a number of SVs -} GnssSvNotification; - -typedef struct { - size_t size; // set to sizeof(GnssNmeaNotification) - uint64_t timestamp; // timestamp - const char* nmea; // nmea text - size_t length; // length of the nmea text -} GnssNmeaNotification; - -typedef struct { - size_t size; // set to sizeof(GnssMeasurementsNotification) - size_t count; // number of items in GnssMeasurements array - GnssMeasurementsData measurements[GNSS_MEASUREMENTS_MAX]; - GnssMeasurementsClock clock; // clock -} GnssMeasurementsNotification; - -typedef struct { - size_t size; // set to sizeof(GnssConfig) - GnssConfigFlagsMask flags; // bitwise OR of GnssConfigFlagsBits to mark which params are valid - GnssConfigGpsLock gpsLock; - GnssConfigSuplVersion suplVersion; - GnssConfigSetAssistanceServer assistanceServer; - GnssConfigLppProfile lppProfile; - GnssConfigLppeControlPlaneMask lppeControlPlaneMask; - GnssConfigLppeUserPlaneMask lppeUserPlaneMask; - GnssConfigAGlonassPositionProtocolMask aGlonassPositionProtocolMask; - GnssConfigEmergencyPdnForEmergencySupl emergencyPdnForEmergencySupl; - GnssConfigSuplEmergencyServices suplEmergencyServices; - GnssConfigSuplModeMask suplModeMask; //bitwise OR of GnssConfigSuplModeBits -} GnssConfig; - -typedef struct { - size_t size; // set to sizeof - bool mValid; - Location mLocation; - double verticalAccuracyMeters; - double speedAccuracyMetersPerSecond; - double bearingAccuracyDegrees; - timespec mUtcReported; -} GnssDebugLocation; - -typedef struct { - size_t size; // set to sizeof - bool mValid; - int64_t timeEstimate; - float timeUncertaintyNs; - float frequencyUncertaintyNsPerSec; -} GnssDebugTime; - -typedef struct { - size_t size; // set to sizeof - uint32_t svid; - GnssSvType constellation; - GnssEphemerisType mEphemerisType; - GnssEphemerisSource mEphemerisSource; - GnssEphemerisHealth mEphemerisHealth; - float ephemerisAgeSeconds; - bool serverPredictionIsAvailable; - float serverPredictionAgeSeconds; -} GnssDebugSatelliteInfo; - -typedef struct { - size_t size; // set to sizeof - GnssDebugLocation mLocation; - GnssDebugTime mTime; - std::vector<GnssDebugSatelliteInfo> mSatelliteInfo; -} GnssDebugReport; - -/* Provides the capabilities of the system - capabilities callback is called once soon after createInstance is called */ -typedef std::function<void( - LocationCapabilitiesMask capabilitiesMask // bitwise OR of LocationCapabilitiesBits -)> capabilitiesCallback; - -/* Used by tracking, batching, and miscellanous APIs - responseCallback is called for every Tracking, Batching API, and Miscellanous API */ -typedef std::function<void( - LocationError err, // if not SUCCESS, then id is not valid - uint32_t id // id to be associated to the request -)> responseCallback; - -/* Used by APIs that gets more than one LocationError in it's response - collectiveResponseCallback is called for every geofence API call. - ids array and LocationError array are only valid until collectiveResponseCallback returns. */ -typedef std::function<void( - size_t count, // number of locations in arrays - LocationError* errs, // array of LocationError associated to the request - uint32_t* ids // array of ids to be associated to the request -)> collectiveResponseCallback; - -/* Used for startTracking API, optional can be NULL - trackingCallback is called when delivering a location in a tracking session - broadcasted to all clients, no matter if a session has started by client */ -typedef std::function<void( - Location location -)> trackingCallback; - -/* Used for startBatching API, optional can be NULL - batchingCallback is called when delivering locations in a batching session. - broadcasted to all clients, no matter if a session has started by client */ -typedef std::function<void( - size_t count, // number of locations in array - Location* location, // array of locations - BatchingOptions batchingOptions // Batching options -)> batchingCallback; - -typedef std::function<void( - BatchingStatusInfo batchingStatus, // batch status - std::list<uint32_t> & listOfCompletedTrips -)> batchingStatusCallback; - -/* Gives GNSS Location information, optional can be NULL - gnssLocationInfoCallback is called only during a tracking session - broadcasted to all clients, no matter if a session has started by client */ -typedef std::function<void( - GnssLocationInfoNotification gnssLocationInfoNotification -)> gnssLocationInfoCallback; - -/* Used for addGeofences API, optional can be NULL - geofenceBreachCallback is called when any number of geofences have a state change */ -typedef std::function<void( - GeofenceBreachNotification geofenceBreachNotification -)> geofenceBreachCallback; - -/* Used for addGeofences API, optional can be NULL - geofenceStatusCallback is called when any number of geofences have a status change */ -typedef std::function<void( - GeofenceStatusNotification geofenceStatusNotification -)> geofenceStatusCallback; - -/* Network Initiated request, optional can be NULL - This callback should be responded to by calling gnssNiResponse */ -typedef std::function<void( - uint32_t id, // id that should be used to respond by calling gnssNiResponse - GnssNiNotification gnssNiNotification -)> gnssNiCallback; - -/* Gives GNSS SV information, optional can be NULL - gnssSvCallback is called only during a tracking session - broadcasted to all clients, no matter if a session has started by client */ -typedef std::function<void( - GnssSvNotification gnssSvNotification -)> gnssSvCallback; - -/* Gives GNSS NMEA data, optional can be NULL - gnssNmeaCallback is called only during a tracking session - broadcasted to all clients, no matter if a session has started by client */ -typedef std::function<void( - GnssNmeaNotification gnssNmeaNotification -)> gnssNmeaCallback; - -/* Gives GNSS Measurements information, optional can be NULL - gnssMeasurementsCallback is called only during a tracking session - broadcasted to all clients, no matter if a session has started by client */ -typedef std::function<void( - GnssMeasurementsNotification gnssMeasurementsNotification -)> gnssMeasurementsCallback; - -typedef struct { - size_t size; // set to sizeof(LocationCallbacks) - capabilitiesCallback capabilitiesCb; // mandatory - responseCallback responseCb; // mandatory - collectiveResponseCallback collectiveResponseCb; // mandatory - trackingCallback trackingCb; // optional - batchingCallback batchingCb; // optional - geofenceBreachCallback geofenceBreachCb; // optional - geofenceStatusCallback geofenceStatusCb; // optional - gnssLocationInfoCallback gnssLocationInfoCb; // optional - gnssNiCallback gnssNiCb; // optional - gnssSvCallback gnssSvCb; // optional - gnssNmeaCallback gnssNmeaCb; // optional - gnssMeasurementsCallback gnssMeasurementsCb; // optional - batchingStatusCallback batchingStatusCb; // optional -} LocationCallbacks; - -class LocationAPI -{ -private: - LocationAPI(); - ~LocationAPI(); - -public: - /* creates an instance to LocationAPI object. - Will return NULL if mandatory parameters are invalid or if the maximum number - of instances have been reached */ - static LocationAPI* createInstance(LocationCallbacks&); - - /* destroy/cleans up the instance, which should be called when LocationAPI object is - no longer needed. LocationAPI* returned from createInstance will no longer valid - after destroy is called */ - void destroy(); - - /* updates/changes the callbacks that will be called. - mandatory callbacks must be present for callbacks to be successfully updated - no return value */ - void updateCallbacks(LocationCallbacks&); - - /* ================================== TRACKING ================================== */ - - /* startTracking starts a tracking session, which returns a session id that will be - used by the other tracking APIs and also in the responseCallback to match command - with response. locations are reported on the trackingCallback passed in createInstance - periodically according to LocationOptions. - responseCallback returns: - LOCATION_ERROR_SUCCESS if session was successfully started - LOCATION_ERROR_ALREADY_STARTED if a startTracking session is already in progress - LOCATION_ERROR_CALLBACK_MISSING if no trackingCallback was passed in createInstance - LOCATION_ERROR_INVALID_PARAMETER if LocationOptions parameter is invalid */ - uint32_t startTracking(LocationOptions&); // returns session id - - /* stopTracking stops a tracking session associated with id parameter. - responseCallback returns: - LOCATION_ERROR_SUCCESS if successful - LOCATION_ERROR_ID_UNKNOWN if id is not associated with a tracking session */ - void stopTracking(uint32_t id); - - /* updateTrackingOptions changes the LocationOptions of a tracking session associated with id - responseCallback returns: - LOCATION_ERROR_SUCCESS if successful - LOCATION_ERROR_INVALID_PARAMETER if LocationOptions parameters are invalid - LOCATION_ERROR_ID_UNKNOWN if id is not associated with a tracking session */ - void updateTrackingOptions(uint32_t id, LocationOptions&); - - /* ================================== BATCHING ================================== */ - - /* startBatching starts a batching session, which returns a session id that will be - used by the other batching APIs and also in the responseCallback to match command - with response. locations are reported on the batchingCallback passed in createInstance - periodically according to LocationOptions. A batching session starts tracking on - the low power processor and delivers them in batches by the batchingCallback when - the batch is full or when getBatchedLocations is called. This allows for the processor - that calls this API to sleep when the low power processor can batch locations in the - backgroup and wake up the processor calling the API only when the batch is full, thus - saving power - responseCallback returns: - LOCATION_ERROR_SUCCESS if session was successful - LOCATION_ERROR_ALREADY_STARTED if a startBatching session is already in progress - LOCATION_ERROR_CALLBACK_MISSING if no batchingCallback was passed in createInstance - LOCATION_ERROR_INVALID_PARAMETER if a parameter is invalid - LOCATION_ERROR_NOT_SUPPORTED if batching is not supported */ - uint32_t startBatching(LocationOptions&, BatchingOptions&); // returns session id - - /* stopBatching stops a batching session associated with id parameter. - responseCallback returns: - LOCATION_ERROR_SUCCESS if successful - LOCATION_ERROR_ID_UNKNOWN if id is not associated with batching session */ - void stopBatching(uint32_t id); - - /* updateBatchingOptions changes the LocationOptions of a batching session associated with id - responseCallback returns: - LOCATION_ERROR_SUCCESS if successful - LOCATION_ERROR_INVALID_PARAMETER if LocationOptions parameters are invalid - LOCATION_ERROR_ID_UNKNOWN if id is not associated with a batching session */ - void updateBatchingOptions(uint32_t id, LocationOptions&, BatchingOptions&); - - /* getBatchedLocations gets a number of locations that are currently stored/batched - on the low power processor, delivered by the batchingCallback passed in createInstance. - Location are then deleted from the batch stored on the low power processor. - responseCallback returns: - LOCATION_ERROR_SUCCESS if successful, will be followed by batchingCallback call - LOCATION_ERROR_CALLBACK_MISSING if no batchingCallback was passed in createInstance - LOCATION_ERROR_ID_UNKNOWN if id is not associated with a batching session */ - void getBatchedLocations(uint32_t id, size_t count); - - /* ================================== GEOFENCE ================================== */ - - /* addGeofences adds any number of geofences and returns an array of geofence ids that - will be used by the other geofence APIs and also in the collectiveResponseCallback to - match command with response. The geofenceBreachCallback will deliver the status of each - geofence according to the GeofenceOption for each. The geofence id array returned will - be valid until the collectiveResponseCallback is called and has returned. - collectiveResponseCallback returns: - LOCATION_ERROR_SUCCESS if session was successful - LOCATION_ERROR_CALLBACK_MISSING if no geofenceBreachCallback - LOCATION_ERROR_INVALID_PARAMETER if any parameters are invalid - LOCATION_ERROR_NOT_SUPPORTED if geofence is not supported */ - uint32_t* addGeofences(size_t count, GeofenceOption*, GeofenceInfo*); // returns id array - - /* removeGeofences removes any number of geofences. Caller should delete ids array after - removeGeofences returneds. - collectiveResponseCallback returns: - LOCATION_ERROR_SUCCESS if successful - LOCATION_ERROR_ID_UNKNOWN if id is not associated with a geofence session */ - void removeGeofences(size_t count, uint32_t* ids); - - /* modifyGeofences modifies any number of geofences. Caller should delete ids array after - modifyGeofences returns. - collectiveResponseCallback returns: - LOCATION_ERROR_SUCCESS if successful - LOCATION_ERROR_ID_UNKNOWN if id is not associated with a geofence session - LOCATION_ERROR_INVALID_PARAMETER if any parameters are invalid */ - void modifyGeofences(size_t count, uint32_t* ids, GeofenceOption* options); - - /* pauseGeofences pauses any number of geofences, which is similar to removeGeofences, - only that they can be resumed at any time. Caller should delete ids array after - pauseGeofences returns. - collectiveResponseCallback returns: - LOCATION_ERROR_SUCCESS if successful - LOCATION_ERROR_ID_UNKNOWN if id is not associated with a geofence session */ - void pauseGeofences(size_t count, uint32_t* ids); - - /* resumeGeofences resumes any number of geofences that are currently paused. Caller should - delete ids array after resumeGeofences returns. - collectiveResponseCallback returns: - LOCATION_ERROR_SUCCESS if successful - LOCATION_ERROR_ID_UNKNOWN if id is not associated with a geofence session */ - void resumeGeofences(size_t count, uint32_t* ids); - - /* ================================== GNSS ====================================== */ - - /* gnssNiResponse is called in response to a gnssNiCallback. - responseCallback returns: - LOCATION_ERROR_SUCCESS if session was successful - LOCATION_ERROR_INVALID_PARAMETER if any parameters in GnssNiResponse are invalid - LOCATION_ERROR_ID_UNKNOWN if id does not match a gnssNiCallback */ - void gnssNiResponse(uint32_t id, GnssNiResponse response); -}; - -typedef struct { - size_t size; // set to sizeof(LocationControlCallbacks) - responseCallback responseCb; // mandatory - collectiveResponseCallback collectiveResponseCb; // mandatory -} LocationControlCallbacks; - -class LocationControlAPI -{ -private: - LocationControlAPI(); - ~LocationControlAPI(); - -public: - /* creates an instance to LocationControlAPI object. - Will return NULL if mandatory parameters are invalid or if the maximum number - of instances have been reached. Only once instance allowed */ - static LocationControlAPI* createInstance(LocationControlCallbacks&); - - /* destroy/cleans up the instance, which should be called when LocationControlAPI object is - no longer needed. LocationControlAPI* returned from createInstance will no longer valid - after destroy is called */ - void destroy(); - - /* enable will enable specific location technology to be used for calculation locations and - will effectively start a control session if call is successful, which returns a session id - that will be returned in responseCallback to match command with response. The session id is - also needed to call the disable command. - This effect is global for all clients of LocationAPI - responseCallback returns: - LOCATION_ERROR_SUCCESS if successful - LOCATION_ERROR_ALREADY_STARTED if an enable was already called for this techType - LOCATION_ERROR_INVALID_PARAMETER if any parameters are invalid - LOCATION_ERROR_GENERAL_FAILURE if failure for any other reason */ - uint32_t enable(LocationTechnologyType techType); - - /* disable will disable specific location technology to be used for calculation locations and - effectively ends the control session if call is successful. - id parameter is the session id that was returned in enable responseCallback for techType. - The session id is no longer valid after disable's responseCallback returns success. - This effect is global for all clients of LocationAPI - responseCallback returns: - LOCATION_ERROR_SUCCESS if successful - LOCATION_ERROR_ID_UNKNOWN if id was not returned from responseCallback from enable - LOCATION_ERROR_GENERAL_FAILURE if failure for any other reason */ - void disable(uint32_t id); - - /* gnssUpdateConfig updates the gnss specific configuration, which returns a session id array - with an id for each of the bits set in GnssConfig.flags, order from low bits to high bits. - The response for each config that is set will be returned in collectiveResponseCallback. - The session id array returned will be valid until the collectiveResponseCallback is called - and has returned. This effect is global for all clients of LocationAPI - collectiveResponseCallback returns: - LOCATION_ERROR_SUCCESS if session was successful - LOCATION_ERROR_INVALID_PARAMETER if any other parameters are invalid - LOCATION_ERROR_GENERAL_FAILURE if failure for any other reason */ - uint32_t* gnssUpdateConfig(GnssConfig config); - - /* delete specific gnss aiding data for testing, which returns a session id - that will be returned in responseCallback to match command with response. - Only allowed in userdebug builds. This effect is global for all clients of LocationAPI - responseCallback returns: - LOCATION_ERROR_SUCCESS if successful - LOCATION_ERROR_INVALID_PARAMETER if any parameters are invalid - LOCATION_ERROR_NOT_SUPPORTED if build is not userdebug */ - uint32_t gnssDeleteAidingData(GnssAidingData& data); -}; - -#endif /* LOCATION_H */ diff --git a/gps/location/LocationAPIClientBase.cpp b/gps/location/LocationAPIClientBase.cpp deleted file mode 100644 index 626968c..0000000 --- a/gps/location/LocationAPIClientBase.cpp +++ /dev/null @@ -1,914 +0,0 @@ -/* Copyright (c) 2017 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_APIClientBase" - -#include <loc_pla.h> -#include <log_util.h> -#include <inttypes.h> -#include <loc_cfg.h> -#include "LocationAPIClientBase.h" - -#define GEOFENCE_SESSION_ID 0xFFFFFFFF -#define CONFIG_SESSION_ID 0xFFFFFFFF - -// LocationAPIControlClient -LocationAPIControlClient::LocationAPIControlClient() : - mEnabled(false) -{ - pthread_mutex_init(&mMutex, nullptr); - - for (int i = 0; i < CTRL_REQUEST_MAX; i++) { - mRequestQueues[i].reset(0); - } - - memset(&mConfig, 0, sizeof(GnssConfig)); - - LocationControlCallbacks locationControlCallbacks; - locationControlCallbacks.size = sizeof(LocationControlCallbacks); - - locationControlCallbacks.responseCb = - [this](LocationError error, uint32_t id) { - onCtrlResponseCb(error, id); - }; - locationControlCallbacks.collectiveResponseCb = - [this](size_t count, LocationError* errors, uint32_t* ids) { - onCtrlCollectiveResponseCb(count, errors, ids); - }; - - mLocationControlAPI = LocationControlAPI::createInstance(locationControlCallbacks); -} - -LocationAPIControlClient::~LocationAPIControlClient() -{ - pthread_mutex_lock(&mMutex); - - if (mLocationControlAPI) { - mLocationControlAPI->destroy(); - mLocationControlAPI = nullptr; - } - - for (int i = 0; i < CTRL_REQUEST_MAX; i++) { - mRequestQueues[i].reset(0); - } - - pthread_mutex_unlock(&mMutex); - - pthread_mutex_destroy(&mMutex); -} - -uint32_t LocationAPIControlClient::locAPIGnssDeleteAidingData(GnssAidingData& data) -{ - uint32_t retVal = LOCATION_ERROR_GENERAL_FAILURE; - pthread_mutex_lock(&mMutex); - if (mLocationControlAPI) { - uint32_t session = mLocationControlAPI->gnssDeleteAidingData(data); - LOC_LOGI("%s:%d] start new session: %d", __FUNCTION__, __LINE__, session); - mRequestQueues[CTRL_REQUEST_DELETEAIDINGDATA].reset(session); - mRequestQueues[CTRL_REQUEST_DELETEAIDINGDATA].push(new GnssDeleteAidingDataRequest(*this)); - - retVal = LOCATION_ERROR_SUCCESS; - } - pthread_mutex_unlock(&mMutex); - - return retVal; -} - -uint32_t LocationAPIControlClient::locAPIEnable(LocationTechnologyType techType) -{ - uint32_t retVal = LOCATION_ERROR_GENERAL_FAILURE; - pthread_mutex_lock(&mMutex); - if (mEnabled) { - // just return success if already enabled - retVal = LOCATION_ERROR_SUCCESS; - } else if (mLocationControlAPI) { - uint32_t session = mLocationControlAPI->enable(techType); - LOC_LOGI("%s:%d] start new session: %d", __FUNCTION__, __LINE__, session); - mRequestQueues[CTRL_REQUEST_CONTROL].reset(session); - mRequestQueues[CTRL_REQUEST_CONTROL].push(new EnableRequest(*this)); - retVal = LOCATION_ERROR_SUCCESS; - mEnabled = true; - } else { - LOC_LOGE("%s:%d] failed.", __FUNCTION__, __LINE__); - } - pthread_mutex_unlock(&mMutex); - - return retVal; -} - -void LocationAPIControlClient::locAPIDisable() -{ - pthread_mutex_lock(&mMutex); - if (mEnabled && mLocationControlAPI) { - uint32_t session = 0; - session = mRequestQueues[CTRL_REQUEST_CONTROL].getSession(); - if (session > 0) { - mRequestQueues[CTRL_REQUEST_CONTROL].push(new DisableRequest(*this)); - mLocationControlAPI->disable(session); - mEnabled = false; - } else { - LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__, session); - } - } - pthread_mutex_unlock(&mMutex); -} - -uint32_t LocationAPIControlClient::locAPIGnssUpdateConfig(GnssConfig config) -{ - uint32_t retVal = LOCATION_ERROR_GENERAL_FAILURE; - if (memcmp(&mConfig, &config, sizeof(GnssConfig)) == 0) { - LOC_LOGV("%s:%d] GnssConfig is identical to previous call", __FUNCTION__, __LINE__); - retVal = LOCATION_ERROR_SUCCESS; - return retVal; - } - - pthread_mutex_lock(&mMutex); - if (mLocationControlAPI) { - - memcpy(&mConfig, &config, sizeof(GnssConfig)); - - uint32_t* idArray = mLocationControlAPI->gnssUpdateConfig(config); - LOC_LOGV("%s:%d] gnssUpdateConfig return array: %p", __FUNCTION__, __LINE__, idArray); - if (idArray != nullptr) { - if (mRequestQueues[CTRL_REQUEST_CONFIG].getSession() != CONFIG_SESSION_ID) { - mRequestQueues[CTRL_REQUEST_CONFIG].reset(CONFIG_SESSION_ID); - } - mRequestQueues[CTRL_REQUEST_CONFIG].push(new GnssUpdateConfigRequest(*this)); - retVal = LOCATION_ERROR_SUCCESS; - } - } - pthread_mutex_unlock(&mMutex); - return retVal; -} - -void LocationAPIControlClient::onCtrlResponseCb(LocationError error, uint32_t id) -{ - if (error != LOCATION_ERROR_SUCCESS) { - LOC_LOGE("%s:%d] ERROR: %d ID: %d", __FUNCTION__, __LINE__, error, id); - } else { - LOC_LOGV("%s:%d] SUCCESS: %d id: %d", __FUNCTION__, __LINE__, error, id); - } - LocationAPIRequest* request = getRequestBySession(id); - if (request) { - request->onResponse(error, id); - delete request; - } -} - -void LocationAPIControlClient::onCtrlCollectiveResponseCb( - size_t count, LocationError* errors, uint32_t* ids) -{ - for (size_t i = 0; i < count; i++) { - if (errors[i] != LOCATION_ERROR_SUCCESS) { - LOC_LOGE("%s:%d] ERROR: %d ID: %d", __FUNCTION__, __LINE__, errors[i], ids[i]); - } else { - LOC_LOGV("%s:%d] SUCCESS: %d id: %d", __FUNCTION__, __LINE__, errors[i], ids[i]); - } - } - LocationAPIRequest* request = nullptr; - pthread_mutex_lock(&mMutex); - if (mRequestQueues[CTRL_REQUEST_CONFIG].getSession() == CONFIG_SESSION_ID) { - request = mRequestQueues[CTRL_REQUEST_CONFIG].pop(); - } - pthread_mutex_unlock(&mMutex); - if (request) { - request->onCollectiveResponse(count, errors, ids); - delete request; - } -} - -LocationAPIRequest* LocationAPIControlClient::getRequestBySession(uint32_t session) -{ - pthread_mutex_lock(&mMutex); - LocationAPIRequest* request = nullptr; - for (int i = 0; i < CTRL_REQUEST_MAX; i++) { - if (i != CTRL_REQUEST_CONFIG && - mRequestQueues[i].getSession() == session) { - request = mRequestQueues[i].pop(); - break; - } - } - pthread_mutex_unlock(&mMutex); - return request; -} - -// LocationAPIClientBase -LocationAPIClientBase::LocationAPIClientBase() : - mGeofenceBreachCallback(nullptr), - mBatchingStatusCallback(nullptr), - mLocationAPI(nullptr), - mBatchSize(-1), - mTracking(false) -{ - - // use recursive mutex, in case callback come from the same thread - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); - pthread_mutex_init(&mMutex, &attr); - - for (int i = 0; i < REQUEST_MAX; i++) { - mRequestQueues[i].reset(0); - } -} - -void LocationAPIClientBase::locAPISetCallbacks(LocationCallbacks& locationCallbacks) -{ - pthread_mutex_lock(&mMutex); - - if (locationCallbacks.geofenceBreachCb != nullptr) { - mGeofenceBreachCallback = locationCallbacks.geofenceBreachCb; - locationCallbacks.geofenceBreachCb = - [this](GeofenceBreachNotification geofenceBreachNotification) { - beforeGeofenceBreachCb(geofenceBreachNotification); - }; - } - - locationCallbacks.capabilitiesCb = - [this](LocationCapabilitiesMask capabilitiesMask) { - onCapabilitiesCb(capabilitiesMask); - }; - locationCallbacks.responseCb = [this](LocationError error, uint32_t id) { - onResponseCb(error, id); - }; - locationCallbacks.collectiveResponseCb = - [this](size_t count, LocationError* errors, uint32_t* ids) { - onCollectiveResponseCb(count, errors, ids); - }; - - if (locationCallbacks.batchingStatusCb != nullptr) { - mBatchingStatusCallback = locationCallbacks.batchingStatusCb; - locationCallbacks.batchingStatusCb = - [this](BatchingStatusInfo batchStatus, std::list<uint32_t> & tripCompletedList) { - beforeBatchingStatusCb(batchStatus, tripCompletedList); - }; - } - - if (mLocationAPI == nullptr ) { - mLocationAPI = LocationAPI::createInstance(locationCallbacks); - } else { - mLocationAPI->updateCallbacks(locationCallbacks); - } - - pthread_mutex_unlock(&mMutex); -} - -LocationAPIClientBase::~LocationAPIClientBase() -{ - pthread_mutex_lock(&mMutex); - - mGeofenceBreachCallback = nullptr; - - if (mLocationAPI) { - mLocationAPI->destroy(); - mLocationAPI = nullptr; - } - - for (int i = 0; i < REQUEST_MAX; i++) { - mRequestQueues[i].reset(0); - } - - pthread_mutex_unlock(&mMutex); - - pthread_mutex_destroy(&mMutex); -} - -uint32_t LocationAPIClientBase::locAPIStartTracking(LocationOptions& options) -{ - uint32_t retVal = LOCATION_ERROR_GENERAL_FAILURE; - pthread_mutex_lock(&mMutex); - if (mLocationAPI) { - if (mTracking) { - LOC_LOGW("%s:%d] Existing tracking session present", __FUNCTION__, __LINE__); - } else { - uint32_t session = mLocationAPI->startTracking(options); - LOC_LOGI("%s:%d] start new session: %d", __FUNCTION__, __LINE__, session); - // onResponseCb might be called from other thread immediately after - // startTracking returns, so we are not going to unlock mutex - // until StartTrackingRequest is pushed into mRequestQueues[REQUEST_TRACKING] - mRequestQueues[REQUEST_TRACKING].reset(session); - mRequestQueues[REQUEST_TRACKING].push(new StartTrackingRequest(*this)); - mTracking = true; - } - - retVal = LOCATION_ERROR_SUCCESS; - } - pthread_mutex_unlock(&mMutex); - - return retVal; -} - -void LocationAPIClientBase::locAPIStopTracking() -{ - pthread_mutex_lock(&mMutex); - if (mLocationAPI) { - uint32_t session = 0; - session = mRequestQueues[REQUEST_TRACKING].getSession(); - if (session > 0) { - mRequestQueues[REQUEST_TRACKING].push(new StopTrackingRequest(*this)); - mLocationAPI->stopTracking(session); - mTracking = false; - } else { - LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__, session); - } - } - pthread_mutex_unlock(&mMutex); -} - -void LocationAPIClientBase::locAPIUpdateTrackingOptions(LocationOptions& options) -{ - pthread_mutex_lock(&mMutex); - if (mLocationAPI) { - uint32_t session = 0; - session = mRequestQueues[REQUEST_TRACKING].getSession(); - if (session > 0) { - mRequestQueues[REQUEST_TRACKING].push(new UpdateTrackingOptionsRequest(*this)); - mLocationAPI->updateTrackingOptions(session, options); - } else { - LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__, session); - } - } - pthread_mutex_unlock(&mMutex); -} - -int32_t LocationAPIClientBase::locAPIGetBatchSize() -{ - if (mBatchSize == -1) { - const loc_param_s_type flp_conf_param_table[] = - { - {"BATCH_SIZE", &mBatchSize, nullptr, 'n'}, - }; - UTIL_READ_CONF(LOC_PATH_FLP_CONF, flp_conf_param_table); - if (mBatchSize < 0) { - // set mBatchSize to 0 if we got an illegal value from config file - mBatchSize = 0; - } - } - return mBatchSize; -} - - -uint32_t LocationAPIClientBase::locAPIStartSession(uint32_t id, uint32_t sessionMode, - LocationOptions& locationOptions) -{ - uint32_t retVal = LOCATION_ERROR_GENERAL_FAILURE; - pthread_mutex_lock(&mMutex); - if (mLocationAPI) { - - if (mSessionBiDict.hasId(id)) { - LOC_LOGE("%s:%d] session %d has already started.", __FUNCTION__, __LINE__, id); - retVal = LOCATION_ERROR_ALREADY_STARTED; - } else { - uint32_t trackingSession = 0; - uint32_t batchingSession = 0; - - if (sessionMode == SESSION_MODE_ON_FIX) { - trackingSession = mLocationAPI->startTracking(locationOptions); - LOC_LOGI("%s:%d] start new session: %d", __FUNCTION__, __LINE__, trackingSession); - mRequestQueues[REQUEST_SESSION].push(new StartTrackingRequest(*this)); - } else { - // Fill in the batch mode - BatchingOptions batchOptions = {}; - batchOptions.size = sizeof(BatchingOptions); - switch (sessionMode) { - case SESSION_MODE_ON_FULL: - batchOptions.batchingMode = BATCHING_MODE_ROUTINE; - break; - case SESSION_MODE_ON_TRIP_COMPLETED: - batchOptions.batchingMode = BATCHING_MODE_TRIP; - break; - default: - batchOptions.batchingMode = BATCHING_MODE_NO_AUTO_REPORT; - break; - } - - batchingSession = mLocationAPI->startBatching(locationOptions, batchOptions); - LOC_LOGI("%s:%d] start new session: %d", __FUNCTION__, __LINE__, batchingSession); - mRequestQueues[REQUEST_SESSION].setSession(batchingSession); - mRequestQueues[REQUEST_SESSION].push(new StartBatchingRequest(*this)); - } - - uint32_t session = ((sessionMode != SESSION_MODE_ON_FIX) ? - batchingSession : trackingSession); - - SessionEntity entity; - entity.id = id; - entity.trackingSession = trackingSession; - entity.batchingSession = batchingSession; - entity.sessionMode = sessionMode; - mSessionBiDict.set(id, session, entity); - - retVal = LOCATION_ERROR_SUCCESS; - } - - } - pthread_mutex_unlock(&mMutex); - - return retVal; -} - -uint32_t LocationAPIClientBase::locAPIStopSession(uint32_t id) -{ - uint32_t retVal = LOCATION_ERROR_GENERAL_FAILURE; - pthread_mutex_lock(&mMutex); - if (mLocationAPI) { - - if (mSessionBiDict.hasId(id)) { - SessionEntity entity = mSessionBiDict.getExtById(id); - - uint32_t trackingSession = entity.trackingSession; - uint32_t batchingSession = entity.batchingSession; - uint32_t sMode = entity.sessionMode; - - if (sMode == SESSION_MODE_ON_FIX) { - mRequestQueues[REQUEST_SESSION].push(new StopTrackingRequest(*this)); - mLocationAPI->stopTracking(trackingSession); - } else { - mRequestQueues[REQUEST_SESSION].push(new StopBatchingRequest(*this)); - mLocationAPI->stopBatching(batchingSession); - } - - retVal = LOCATION_ERROR_SUCCESS; - } else { - retVal = LOCATION_ERROR_ID_UNKNOWN; - LOC_LOGE("%s:%d] session %d is not exist.", __FUNCTION__, __LINE__, id); - } - - } - pthread_mutex_unlock(&mMutex); - return retVal; -} - -uint32_t LocationAPIClientBase::locAPIUpdateSessionOptions(uint32_t id, uint32_t sessionMode, - LocationOptions& options) -{ - uint32_t retVal = LOCATION_ERROR_GENERAL_FAILURE; - pthread_mutex_lock(&mMutex); - if (mLocationAPI) { - - if (mSessionBiDict.hasId(id)) { - SessionEntity entity = mSessionBiDict.getExtById(id); - - uint32_t trackingSession = entity.trackingSession; - uint32_t batchingSession = entity.batchingSession; - uint32_t sMode = entity.sessionMode; - - if (sessionMode == SESSION_MODE_ON_FIX) { - // we only add an UpdateTrackingOptionsRequest to mRequestQueues[REQUEST_SESSION], - // even if this update request will stop batching and then start tracking. - mRequestQueues[REQUEST_SESSION].push(new UpdateTrackingOptionsRequest(*this)); - if (sMode == SESSION_MODE_ON_FIX) { - mLocationAPI->updateTrackingOptions(trackingSession, options); - } else { - // stop batching - // batchingSession will be removed from mSessionBiDict soon, - // so we don't need to add a new request to mRequestQueues[REQUEST_SESSION]. - mLocationAPI->stopBatching(batchingSession); - batchingSession = 0; - mRequestQueues[REQUEST_SESSION].setSession(batchingSession); - - // start tracking - trackingSession = mLocationAPI->startTracking(options); - LOC_LOGI("%s:%d] start new session: %d", - __FUNCTION__, __LINE__, trackingSession); - } - } else { - // we only add an UpdateBatchingOptionsRequest to mRequestQueues[REQUEST_SESSION], - // even if this update request will stop tracking and then start batching. - mRequestQueues[REQUEST_SESSION].push(new UpdateBatchingOptionsRequest(*this)); - BatchingOptions batchOptions = {}; - batchOptions.size = sizeof(BatchingOptions); - switch (sessionMode) { - case SESSION_MODE_ON_FULL: - batchOptions.batchingMode = BATCHING_MODE_ROUTINE; - break; - case SESSION_MODE_ON_TRIP_COMPLETED: - batchOptions.batchingMode = BATCHING_MODE_TRIP; - break; - default: - batchOptions.batchingMode = BATCHING_MODE_NO_AUTO_REPORT; - break; - } - - if (sMode == SESSION_MODE_ON_FIX) { - // stop tracking - // trackingSession will be removed from mSessionBiDict soon, - // so we don't need to add a new request to mRequestQueues[REQUEST_SESSION]. - mLocationAPI->stopTracking(trackingSession); - trackingSession = 0; - - // start batching - batchingSession = mLocationAPI->startBatching(options, batchOptions); - LOC_LOGI("%s:%d] start new session: %d", - __FUNCTION__, __LINE__, batchingSession); - mRequestQueues[REQUEST_SESSION].setSession(batchingSession); - } else { - mLocationAPI->updateBatchingOptions(batchingSession, options, batchOptions); - } - - } - - uint32_t session = ((sessionMode != SESSION_MODE_ON_FIX) ? - batchingSession : trackingSession); - - entity.trackingSession = trackingSession; - entity.batchingSession = batchingSession; - entity.sessionMode = sessionMode; - // remove the old values from mSessionBiDict before we add a new one. - mSessionBiDict.rmById(id); - mSessionBiDict.set(id, session, entity); - - retVal = LOCATION_ERROR_SUCCESS; - } else { - retVal = LOCATION_ERROR_ID_UNKNOWN; - LOC_LOGE("%s:%d] session %d is not exist.", __FUNCTION__, __LINE__, id); - } - } - pthread_mutex_unlock(&mMutex); - return retVal; -} - -uint32_t LocationAPIClientBase::locAPIGetBatchedLocations(uint32_t id, size_t count) -{ - uint32_t retVal = LOCATION_ERROR_GENERAL_FAILURE; - pthread_mutex_lock(&mMutex); - if (mLocationAPI) { - if (mSessionBiDict.hasId(id)) { - SessionEntity entity = mSessionBiDict.getExtById(id); - if (entity.sessionMode != SESSION_MODE_ON_FIX) { - uint32_t batchingSession = entity.batchingSession; - mRequestQueues[REQUEST_SESSION].push(new GetBatchedLocationsRequest(*this)); - mLocationAPI->getBatchedLocations(batchingSession, count); - retVal = LOCATION_ERROR_SUCCESS; - } else { - LOC_LOGE("%s:%d] Unsupported for session id: %d, mode is SESSION_MODE_ON_FIX", - __FUNCTION__, __LINE__, id); - retVal = LOCATION_ERROR_NOT_SUPPORTED; - } - } else { - retVal = LOCATION_ERROR_ID_UNKNOWN; - LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__, id); - } - } - pthread_mutex_unlock(&mMutex); - - return retVal; -} - -uint32_t LocationAPIClientBase::locAPIAddGeofences( - size_t count, uint32_t* ids, GeofenceOption* options, GeofenceInfo* data) -{ - uint32_t retVal = LOCATION_ERROR_GENERAL_FAILURE; - pthread_mutex_lock(&mMutex); - if (mLocationAPI) { - if (mRequestQueues[REQUEST_GEOFENCE].getSession() != GEOFENCE_SESSION_ID) { - mRequestQueues[REQUEST_GEOFENCE].reset(GEOFENCE_SESSION_ID); - } - uint32_t* sessions = mLocationAPI->addGeofences(count, options, data); - if (sessions) { - LOC_LOGI("%s:%d] start new sessions: %p", __FUNCTION__, __LINE__, sessions); - mRequestQueues[REQUEST_GEOFENCE].push(new AddGeofencesRequest(*this)); - - for (size_t i = 0; i < count; i++) { - mGeofenceBiDict.set(ids[i], sessions[i], options[i].breachTypeMask); - } - retVal = LOCATION_ERROR_SUCCESS; - } - } - pthread_mutex_unlock(&mMutex); - - return retVal; -} - -void LocationAPIClientBase::locAPIRemoveGeofences(size_t count, uint32_t* ids) -{ - pthread_mutex_lock(&mMutex); - if (mLocationAPI) { - uint32_t* sessions = (uint32_t*)malloc(sizeof(uint32_t) * count); - if (sessions == NULL) { - LOC_LOGE("%s:%d] Failed to allocate %zu bytes !", - __FUNCTION__, __LINE__, sizeof(uint32_t) * count); - pthread_mutex_unlock(&mMutex); - return; - } - - if (mRequestQueues[REQUEST_GEOFENCE].getSession() == GEOFENCE_SESSION_ID) { - BiDict<GeofenceBreachTypeMask>* removedGeofenceBiDict = - new BiDict<GeofenceBreachTypeMask>(); - size_t j = 0; - for (size_t i = 0; i < count; i++) { - sessions[j] = mGeofenceBiDict.getSession(ids[i]); - if (sessions[j] > 0) { - GeofenceBreachTypeMask type = mGeofenceBiDict.getExtBySession(sessions[j]); - mGeofenceBiDict.rmBySession(sessions[j]); - removedGeofenceBiDict->set(ids[i], sessions[j], type); - j++; - } - } - if (j > 0) { - mRequestQueues[REQUEST_GEOFENCE].push(new RemoveGeofencesRequest(*this, - removedGeofenceBiDict)); - mLocationAPI->removeGeofences(j, sessions); - } else { - delete(removedGeofenceBiDict); - } - } else { - LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__, - mRequestQueues[REQUEST_GEOFENCE].getSession()); - } - - free(sessions); - } - pthread_mutex_unlock(&mMutex); -} - -void LocationAPIClientBase::locAPIModifyGeofences( - size_t count, uint32_t* ids, GeofenceOption* options) -{ - pthread_mutex_lock(&mMutex); - if (mLocationAPI) { - uint32_t* sessions = (uint32_t*)malloc(sizeof(uint32_t) * count); - if (sessions == NULL) { - LOC_LOGE("%s:%d] Failed to allocate %zu bytes !", - __FUNCTION__, __LINE__, sizeof(uint32_t) * count); - pthread_mutex_unlock(&mMutex); - return; - } - - if (mRequestQueues[REQUEST_GEOFENCE].getSession() == GEOFENCE_SESSION_ID) { - size_t j = 0; - for (size_t i = 0; i < count; i++) { - sessions[j] = mGeofenceBiDict.getSession(ids[i]); - if (sessions[j] > 0) { - mGeofenceBiDict.set(ids[i], sessions[j], options[i].breachTypeMask); - j++; - } - } - if (j > 0) { - mRequestQueues[REQUEST_GEOFENCE].push(new ModifyGeofencesRequest(*this)); - mLocationAPI->modifyGeofences(j, sessions, options); - } - } else { - LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__, - mRequestQueues[REQUEST_GEOFENCE].getSession()); - } - - free(sessions); - } - pthread_mutex_unlock(&mMutex); -} - -void LocationAPIClientBase::locAPIPauseGeofences(size_t count, uint32_t* ids) -{ - pthread_mutex_lock(&mMutex); - if (mLocationAPI) { - uint32_t* sessions = (uint32_t*)malloc(sizeof(uint32_t) * count); - if (sessions == NULL) { - LOC_LOGE("%s:%d] Failed to allocate %zu bytes !", - __FUNCTION__, __LINE__, sizeof(uint32_t) * count); - pthread_mutex_unlock(&mMutex); - return; - } - - if (mRequestQueues[REQUEST_GEOFENCE].getSession() == GEOFENCE_SESSION_ID) { - size_t j = 0; - for (size_t i = 0; i < count; i++) { - sessions[j] = mGeofenceBiDict.getSession(ids[i]); - if (sessions[j] > 0) { - j++; - } - } - if (j > 0) { - mRequestQueues[REQUEST_GEOFENCE].push(new PauseGeofencesRequest(*this)); - mLocationAPI->pauseGeofences(j, sessions); - } - } else { - LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__, - mRequestQueues[REQUEST_GEOFENCE].getSession()); - } - - free(sessions); - } - pthread_mutex_unlock(&mMutex); -} - -void LocationAPIClientBase::locAPIResumeGeofences( - size_t count, uint32_t* ids, GeofenceBreachTypeMask* mask) -{ - pthread_mutex_lock(&mMutex); - if (mLocationAPI) { - uint32_t* sessions = (uint32_t*)malloc(sizeof(uint32_t) * count); - if (sessions == NULL) { - LOC_LOGE("%s:%d] Failed to allocate %zu bytes !", - __FUNCTION__, __LINE__, sizeof(uint32_t) * count); - pthread_mutex_unlock(&mMutex); - return; - } - - if (mRequestQueues[REQUEST_GEOFENCE].getSession() == GEOFENCE_SESSION_ID) { - size_t j = 0; - for (size_t i = 0; i < count; i++) { - sessions[j] = mGeofenceBiDict.getSession(ids[i]); - if (sessions[j] > 0) { - if (mask) { - mGeofenceBiDict.set(ids[i], sessions[j], mask[i]); - } - j++; - } - } - if (j > 0) { - mRequestQueues[REQUEST_GEOFENCE].push(new ResumeGeofencesRequest(*this)); - mLocationAPI->resumeGeofences(j, sessions); - } - } else { - LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__, - mRequestQueues[REQUEST_GEOFENCE].getSession()); - } - - free(sessions); - } - pthread_mutex_unlock(&mMutex); -} - -void LocationAPIClientBase::locAPIRemoveAllGeofences() -{ - std::vector<uint32_t> sessionsVec = mGeofenceBiDict.getAllSessions(); - locAPIRemoveGeofences(sessionsVec.size(), &sessionsVec[0]); -} - -void LocationAPIClientBase::locAPIGnssNiResponse(uint32_t id, GnssNiResponse response) -{ - pthread_mutex_lock(&mMutex); - if (mLocationAPI) { - uint32_t session = id; - mLocationAPI->gnssNiResponse(id, response); - LOC_LOGI("%s:%d] start new session: %d", __FUNCTION__, __LINE__, session); - mRequestQueues[REQUEST_NIRESPONSE].reset(session); - mRequestQueues[REQUEST_NIRESPONSE].push(new GnssNiResponseRequest(*this)); - } - pthread_mutex_unlock(&mMutex); -} - -void LocationAPIClientBase::beforeGeofenceBreachCb( - GeofenceBreachNotification geofenceBreachNotification) -{ - uint32_t* ids = (uint32_t*)malloc(sizeof(uint32_t) * geofenceBreachNotification.count); - uint32_t* backup = geofenceBreachNotification.ids; - size_t n = geofenceBreachNotification.count; - geofenceBreachCallback genfenceCallback = nullptr; - - if (ids == NULL) { - LOC_LOGE("%s:%d] Failed to alloc %zu bytes", - __FUNCTION__, __LINE__, - sizeof(uint32_t) * geofenceBreachNotification.count); - return; - } - - pthread_mutex_lock(&mMutex); - if (mGeofenceBreachCallback != nullptr) { - size_t count = 0; - for (size_t i = 0; i < n; i++) { - uint32_t id = mGeofenceBiDict.getId(geofenceBreachNotification.ids[i]); - GeofenceBreachTypeMask type = - mGeofenceBiDict.getExtBySession(geofenceBreachNotification.ids[i]); - // if type == 0, we will not head into the fllowing block anyway. - // so we don't need to check id and type - if ((geofenceBreachNotification.type == GEOFENCE_BREACH_ENTER && - (type & GEOFENCE_BREACH_ENTER_BIT)) || - (geofenceBreachNotification.type == GEOFENCE_BREACH_EXIT && - (type & GEOFENCE_BREACH_EXIT_BIT)) - ) { - ids[count] = id; - count++; - } - } - geofenceBreachNotification.count = count; - geofenceBreachNotification.ids = ids; - - genfenceCallback = mGeofenceBreachCallback; - } - pthread_mutex_unlock(&mMutex); - - if (genfenceCallback != nullptr) { - genfenceCallback(geofenceBreachNotification); - } - - // restore ids - geofenceBreachNotification.ids = backup; - geofenceBreachNotification.count = n; - free(ids); -} - -void LocationAPIClientBase::beforeBatchingStatusCb(BatchingStatusInfo batchStatus, - std::list<uint32_t> & tripCompletedList) { - - // map the trip ids to the client ids - std::list<uint32_t> tripCompletedClientIdList; - tripCompletedClientIdList.clear(); - - if (batchStatus.batchingStatus == BATCHING_STATUS_TRIP_COMPLETED) { - for (auto itt = tripCompletedList.begin(); itt != tripCompletedList.end(); itt++) { - if (mSessionBiDict.hasSession(*itt)) { - SessionEntity sessEntity = mSessionBiDict.getExtBySession(*itt); - - if (sessEntity.sessionMode == SESSION_MODE_ON_TRIP_COMPLETED) { - tripCompletedClientIdList.push_back(sessEntity.id); - mSessionBiDict.rmBySession(*itt); - } - } - } - } - - mBatchingStatusCallback(batchStatus, tripCompletedClientIdList); -} - -void LocationAPIClientBase::onResponseCb(LocationError error, uint32_t id) -{ - if (error != LOCATION_ERROR_SUCCESS) { - LOC_LOGE("%s:%d] ERROR: %d ID: %d", __FUNCTION__, __LINE__, error, id); - } else { - LOC_LOGV("%s:%d] SUCCESS: %d id: %d", __FUNCTION__, __LINE__, error, id); - } - LocationAPIRequest* request = getRequestBySession(id); - if (request) { - request->onResponse(error, id); - delete request; - } -} - -void LocationAPIClientBase::onCollectiveResponseCb( - size_t count, LocationError* errors, uint32_t* ids) -{ - for (size_t i = 0; i < count; i++) { - if (errors[i] != LOCATION_ERROR_SUCCESS) { - LOC_LOGE("%s:%d] ERROR: %d ID: %d", __FUNCTION__, __LINE__, errors[i], ids[i]); - } else { - LOC_LOGV("%s:%d] SUCCESS: %d id: %d", __FUNCTION__, __LINE__, errors[i], ids[i]); - } - } - LocationAPIRequest* request = nullptr; - pthread_mutex_lock(&mMutex); - if (mRequestQueues[REQUEST_GEOFENCE].getSession() == GEOFENCE_SESSION_ID) { - request = mRequestQueues[REQUEST_GEOFENCE].pop(); - } - pthread_mutex_unlock(&mMutex); - if (request) { - request->onCollectiveResponse(count, errors, ids); - delete request; - } -} - -void LocationAPIClientBase::removeSession(uint32_t session) { - if (mSessionBiDict.hasSession(session)) { - mSessionBiDict.rmBySession(session); - } -} - -LocationAPIRequest* LocationAPIClientBase::getRequestBySession(uint32_t session) -{ - pthread_mutex_lock(&mMutex); - LocationAPIRequest* request = nullptr; - for (int i = 0; i < REQUEST_MAX; i++) { - if (i != REQUEST_GEOFENCE && - i != REQUEST_SESSION && - mRequestQueues[i].getSession() == session) { - request = mRequestQueues[i].pop(); - break; - } - } - if (request == nullptr) { - // Can't find a request with correct session, - // try to find it from mSessionBiDict - if (mSessionBiDict.hasSession(session)) { - request = mRequestQueues[REQUEST_SESSION].pop(); - } - } - pthread_mutex_unlock(&mMutex); - return request; -} diff --git a/gps/location/LocationAPIClientBase.h b/gps/location/LocationAPIClientBase.h deleted file mode 100644 index 4bd1466..0000000 --- a/gps/location/LocationAPIClientBase.h +++ /dev/null @@ -1,560 +0,0 @@ -/* Copyright (c) 2017 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 LOCATION_API_CLINET_BASE_H -#define LOCATION_API_CLINET_BASE_H - -#include <stdint.h> -#include <stdlib.h> -#include <pthread.h> -#include <queue> -#include <map> - -#include "LocationAPI.h" -#include <loc_pla.h> -#include <log_util.h> - -enum SESSION_MODE { - SESSION_MODE_NONE = 0, - SESSION_MODE_ON_FULL, - SESSION_MODE_ON_FIX, - SESSION_MODE_ON_TRIP_COMPLETED -}; - -enum REQUEST_TYPE { - REQUEST_TRACKING = 0, - REQUEST_SESSION, - REQUEST_GEOFENCE, - REQUEST_NIRESPONSE, - REQUEST_MAX, -}; - -enum CTRL_REQUEST_TYPE { - CTRL_REQUEST_DELETEAIDINGDATA = 0, - CTRL_REQUEST_CONTROL, - CTRL_REQUEST_CONFIG, - CTRL_REQUEST_MAX, -}; - -class LocationAPIClientBase; - -class LocationAPIRequest { -public: - LocationAPIRequest() {} - virtual ~LocationAPIRequest() {} - virtual void onResponse(LocationError /*error*/, uint32_t /*id*/) {} - virtual void onCollectiveResponse( - size_t /*count*/, LocationError* /*errors*/, uint32_t* /*ids*/) {} -}; - -class RequestQueue { -public: - RequestQueue(): mSession(0) { - } - virtual ~RequestQueue() { - reset(0); - } - void inline setSession(uint32_t session) { mSession = session; } - void reset(uint32_t session) { - LocationAPIRequest* request = nullptr; - while (!mQueue.empty()) { - request = mQueue.front(); - mQueue.pop(); - delete request; - } - mSession = session; - } - void push(LocationAPIRequest* request) { - mQueue.push(request); - } - LocationAPIRequest* pop() { - LocationAPIRequest* request = nullptr; - if (!mQueue.empty()) { - request = mQueue.front(); - mQueue.pop(); - } - return request; - } - uint32_t getSession() { return mSession; } -private: - uint32_t mSession; - std::queue<LocationAPIRequest*> mQueue; -}; - -class LocationAPIControlClient { -public: - LocationAPIControlClient(); - virtual ~LocationAPIControlClient(); - LocationAPIControlClient(const LocationAPIControlClient&) = delete; - LocationAPIControlClient& operator=(const LocationAPIControlClient&) = delete; - - LocationAPIRequest* getRequestBySession(uint32_t session); - - // LocationControlAPI - uint32_t locAPIGnssDeleteAidingData(GnssAidingData& data); - uint32_t locAPIEnable(LocationTechnologyType techType); - void locAPIDisable(); - uint32_t locAPIGnssUpdateConfig(GnssConfig config); - - // callbacks - void onCtrlResponseCb(LocationError error, uint32_t id); - void onCtrlCollectiveResponseCb(size_t count, LocationError* errors, uint32_t* ids); - - inline virtual void onGnssDeleteAidingDataCb(LocationError /*error*/) {} - inline virtual void onEnableCb(LocationError /*error*/) {} - inline virtual void onDisableCb(LocationError /*error*/) {} - inline virtual void onGnssUpdateConfigCb( - size_t /*count*/, LocationError* /*errors*/, uint32_t* /*ids*/) {} - - class GnssDeleteAidingDataRequest : public LocationAPIRequest { - public: - GnssDeleteAidingDataRequest(LocationAPIControlClient& API) : mAPI(API) {} - inline void onResponse(LocationError error, uint32_t /*id*/) { - mAPI.onGnssDeleteAidingDataCb(error); - } - LocationAPIControlClient& mAPI; - }; - - class EnableRequest : public LocationAPIRequest { - public: - EnableRequest(LocationAPIControlClient& API) : mAPI(API) {} - inline void onResponse(LocationError error, uint32_t /*id*/) { - mAPI.onEnableCb(error); - } - LocationAPIControlClient& mAPI; - }; - - class DisableRequest : public LocationAPIRequest { - public: - DisableRequest(LocationAPIControlClient& API) : mAPI(API) {} - inline void onResponse(LocationError error, uint32_t /*id*/) { - mAPI.onDisableCb(error); - } - LocationAPIControlClient& mAPI; - }; - - class GnssUpdateConfigRequest : public LocationAPIRequest { - public: - GnssUpdateConfigRequest(LocationAPIControlClient& API) : mAPI(API) {} - inline void onCollectiveResponse(size_t count, LocationError* errors, uint32_t* ids) { - mAPI.onGnssUpdateConfigCb(count, errors, ids); - } - LocationAPIControlClient& mAPI; - }; - -private: - pthread_mutex_t mMutex; - LocationControlAPI* mLocationControlAPI; - RequestQueue mRequestQueues[CTRL_REQUEST_MAX]; - bool mEnabled; - GnssConfig mConfig; -}; - -class LocationAPIClientBase { -public: - LocationAPIClientBase(); - virtual ~LocationAPIClientBase(); - LocationAPIClientBase(const LocationAPIClientBase&) = delete; - LocationAPIClientBase& operator=(const LocationAPIClientBase&) = delete; - - void locAPISetCallbacks(LocationCallbacks& locationCallbacks); - void removeSession(uint32_t session); - LocationAPIRequest* getRequestBySession(uint32_t session); - - // LocationAPI - uint32_t locAPIStartTracking(LocationOptions& options); - void locAPIStopTracking(); - void locAPIUpdateTrackingOptions(LocationOptions& options); - - int32_t locAPIGetBatchSize(); - uint32_t locAPIStartSession(uint32_t id, uint32_t sessionMode, - LocationOptions& options); - uint32_t locAPIStopSession(uint32_t id); - uint32_t locAPIUpdateSessionOptions(uint32_t id, uint32_t sessionMode, - LocationOptions& options); - uint32_t locAPIGetBatchedLocations(uint32_t id, size_t count); - - uint32_t locAPIAddGeofences(size_t count, uint32_t* ids, - GeofenceOption* options, GeofenceInfo* data); - void locAPIRemoveGeofences(size_t count, uint32_t* ids); - void locAPIModifyGeofences(size_t count, uint32_t* ids, GeofenceOption* options); - void locAPIPauseGeofences(size_t count, uint32_t* ids); - void locAPIResumeGeofences(size_t count, uint32_t* ids, GeofenceBreachTypeMask* mask); - void locAPIRemoveAllGeofences(); - - void locAPIGnssNiResponse(uint32_t id, GnssNiResponse response); - - // callbacks - void onResponseCb(LocationError error, uint32_t id); - void onCollectiveResponseCb(size_t count, LocationError* errors, uint32_t* ids); - - void beforeGeofenceBreachCb(GeofenceBreachNotification geofenceBreachNotification); - - inline virtual void onCapabilitiesCb(LocationCapabilitiesMask /*capabilitiesMask*/) {} - inline virtual void onGnssNmeaCb(GnssNmeaNotification /*gnssNmeaNotification*/) {} - inline virtual void onGnssMeasurementsCb( - GnssMeasurementsNotification /*gnssMeasurementsNotification*/) {} - - inline virtual void onTrackingCb(Location /*location*/) {} - inline virtual void onGnssSvCb(GnssSvNotification /*gnssSvNotification*/) {} - inline virtual void onStartTrackingCb(LocationError /*error*/) {} - inline virtual void onStopTrackingCb(LocationError /*error*/) {} - inline virtual void onUpdateTrackingOptionsCb(LocationError /*error*/) {} - - inline virtual void onGnssLocationInfoCb( - GnssLocationInfoNotification /*gnssLocationInfoNotification*/) {} - - inline virtual void onBatchingCb(size_t /*count*/, Location* /*location*/, - BatchingOptions /*batchingOptions*/) {} - inline virtual void onBatchingStatusCb(BatchingStatusInfo /*batchingStatus*/, - std::list<uint32_t> &/*listOfCompletedTrips*/) {} - void beforeBatchingStatusCb(BatchingStatusInfo batchStatus, - std::list<uint32_t> & tripCompletedList); - inline virtual void onStartBatchingCb(LocationError /*error*/) {} - inline virtual void onStopBatchingCb(LocationError /*error*/) {} - inline virtual void onUpdateBatchingOptionsCb(LocationError /*error*/) {} - inline virtual void onGetBatchedLocationsCb(LocationError /*error*/) {} - - inline virtual void onGeofenceBreachCb( - GeofenceBreachNotification /*geofenceBreachNotification*/) {} - inline virtual void onGeofenceStatusCb( - GeofenceStatusNotification /*geofenceStatusNotification*/) {} - inline virtual void onAddGeofencesCb( - size_t /*count*/, LocationError* /*errors*/, uint32_t* /*ids*/) {} - inline virtual void onRemoveGeofencesCb( - size_t /*count*/, LocationError* /*errors*/, uint32_t* /*ids*/) {} - inline virtual void onModifyGeofencesCb( - size_t /*count*/, LocationError* /*errors*/, uint32_t* /*ids*/) {} - inline virtual void onPauseGeofencesCb( - size_t /*count*/, LocationError* /*errors*/, uint32_t* /*ids*/) {} - inline virtual void onResumeGeofencesCb( - size_t /*count*/, LocationError* /*errors*/, uint32_t* /*ids*/) {} - - inline virtual void onGnssNiCb(uint32_t /*id*/, GnssNiNotification /*gnssNiNotification*/) {} - inline virtual void onGnssNiResponseCb(LocationError /*error*/) {} - -private: - // private inner classes - typedef struct { - uint32_t id; - uint32_t trackingSession; - uint32_t batchingSession; - uint32_t sessionMode; - } SessionEntity; - - template<typename T> - class BiDict { - public: - BiDict() { - pthread_mutex_init(&mBiDictMutex, nullptr); - } - virtual ~BiDict() { - pthread_mutex_destroy(&mBiDictMutex); - } - bool hasId(uint32_t id) { - pthread_mutex_lock(&mBiDictMutex); - bool ret = (mForwardMap.find(id) != mForwardMap.end()); - pthread_mutex_unlock(&mBiDictMutex); - return ret; - } - bool hasSession(uint32_t session) { - pthread_mutex_lock(&mBiDictMutex); - bool ret = (mBackwardMap.find(session) != mBackwardMap.end()); - pthread_mutex_unlock(&mBiDictMutex); - return ret; - } - void set(uint32_t id, uint32_t session, T& ext) { - pthread_mutex_lock(&mBiDictMutex); - mForwardMap[id] = session; - mBackwardMap[session] = id; - mExtMap[session] = ext; - pthread_mutex_unlock(&mBiDictMutex); - } - void clear() { - pthread_mutex_lock(&mBiDictMutex); - mForwardMap.clear(); - mBackwardMap.clear(); - mExtMap.clear(); - pthread_mutex_unlock(&mBiDictMutex); - } - void rmById(uint32_t id) { - pthread_mutex_lock(&mBiDictMutex); - mBackwardMap.erase(mForwardMap[id]); - mExtMap.erase(mForwardMap[id]); - mForwardMap.erase(id); - pthread_mutex_unlock(&mBiDictMutex); - } - void rmBySession(uint32_t session) { - pthread_mutex_lock(&mBiDictMutex); - mForwardMap.erase(mBackwardMap[session]); - mBackwardMap.erase(session); - mExtMap.erase(session); - pthread_mutex_unlock(&mBiDictMutex); - } - uint32_t getId(uint32_t session) { - pthread_mutex_lock(&mBiDictMutex); - uint32_t ret = 0; - auto it = mBackwardMap.find(session); - if (it != mBackwardMap.end()) { - ret = it->second; - } - pthread_mutex_unlock(&mBiDictMutex); - return ret; - } - uint32_t getSession(uint32_t id) { - pthread_mutex_lock(&mBiDictMutex); - uint32_t ret = 0; - auto it = mForwardMap.find(id); - if (it != mForwardMap.end()) { - ret = it->second; - } - pthread_mutex_unlock(&mBiDictMutex); - return ret; - } - T getExtById(uint32_t id) { - pthread_mutex_lock(&mBiDictMutex); - T ret; - memset(&ret, 0, sizeof(T)); - uint32_t session = mForwardMap[id]; - if (session > 0) { - auto it = mExtMap.find(session); - if (it != mExtMap.end()) { - ret = it->second; - } - } - pthread_mutex_unlock(&mBiDictMutex); - return ret; - } - T getExtBySession(uint32_t session) { - pthread_mutex_lock(&mBiDictMutex); - T ret; - memset(&ret, 0, sizeof(T)); - auto it = mExtMap.find(session); - if (it != mExtMap.end()) { - ret = it->second; - } - pthread_mutex_unlock(&mBiDictMutex); - return ret; - } - std::vector<uint32_t> getAllSessions() { - std::vector<uint32_t> ret; - pthread_mutex_lock(&mBiDictMutex); - for (auto it = mBackwardMap.begin(); it != mBackwardMap.end(); it++) { - ret.push_back(it->first); - } - pthread_mutex_unlock(&mBiDictMutex); - return ret; - } - private: - pthread_mutex_t mBiDictMutex; - // mForwarMap mapping id->session - std::map<uint32_t, uint32_t> mForwardMap; - // mBackwardMap mapping session->id - std::map<uint32_t, uint32_t> mBackwardMap; - // mExtMap mapping session->ext - std::map<uint32_t, T> mExtMap; - }; - - class StartTrackingRequest : public LocationAPIRequest { - public: - StartTrackingRequest(LocationAPIClientBase& API) : mAPI(API) {} - inline void onResponse(LocationError error, uint32_t id) { - if (error != LOCATION_ERROR_SUCCESS) { - mAPI.removeSession(id); - } - mAPI.onStartTrackingCb(error); - } - LocationAPIClientBase& mAPI; - }; - - class StopTrackingRequest : public LocationAPIRequest { - public: - StopTrackingRequest(LocationAPIClientBase& API) : mAPI(API) {} - inline void onResponse(LocationError error, uint32_t id) { - mAPI.onStopTrackingCb(error); - if (error == LOCATION_ERROR_SUCCESS) { - mAPI.removeSession(id); - } - } - LocationAPIClientBase& mAPI; - }; - - class UpdateTrackingOptionsRequest : public LocationAPIRequest { - public: - UpdateTrackingOptionsRequest(LocationAPIClientBase& API) : mAPI(API) {} - inline void onResponse(LocationError error, uint32_t /*id*/) { - mAPI.onUpdateTrackingOptionsCb(error); - } - LocationAPIClientBase& mAPI; - }; - - class StartBatchingRequest : public LocationAPIRequest { - public: - StartBatchingRequest(LocationAPIClientBase& API) : mAPI(API) {} - inline void onResponse(LocationError error, uint32_t id) { - if (error != LOCATION_ERROR_SUCCESS) { - mAPI.removeSession(id); - } - mAPI.onStartBatchingCb(error); - } - LocationAPIClientBase& mAPI; - }; - - class StopBatchingRequest : public LocationAPIRequest { - public: - StopBatchingRequest(LocationAPIClientBase& API) : mAPI(API) {} - inline void onResponse(LocationError error, uint32_t id) { - mAPI.onStopBatchingCb(error); - if (error == LOCATION_ERROR_SUCCESS) { - mAPI.removeSession(id); - } - } - LocationAPIClientBase& mAPI; - }; - - class UpdateBatchingOptionsRequest : public LocationAPIRequest { - public: - UpdateBatchingOptionsRequest(LocationAPIClientBase& API) : mAPI(API) {} - inline void onResponse(LocationError error, uint32_t /*id*/) { - mAPI.onUpdateBatchingOptionsCb(error); - } - LocationAPIClientBase& mAPI; - }; - - class GetBatchedLocationsRequest : public LocationAPIRequest { - public: - GetBatchedLocationsRequest(LocationAPIClientBase& API) : mAPI(API) {} - inline void onResponse(LocationError error, uint32_t /*id*/) { - mAPI.onGetBatchedLocationsCb(error); - } - LocationAPIClientBase& mAPI; - }; - - class AddGeofencesRequest : public LocationAPIRequest { - public: - AddGeofencesRequest(LocationAPIClientBase& API) : mAPI(API) {} - inline void onCollectiveResponse(size_t count, LocationError* errors, uint32_t* sessions) { - uint32_t *ids = (uint32_t*)malloc(sizeof(uint32_t) * count); - for (size_t i = 0; i < count; i++) { - ids[i] = mAPI.mGeofenceBiDict.getId(sessions[i]); - } - mAPI.onAddGeofencesCb(count, errors, ids); - free(ids); - } - LocationAPIClientBase& mAPI; - }; - - class RemoveGeofencesRequest : public LocationAPIRequest { - public: - RemoveGeofencesRequest(LocationAPIClientBase& API, - BiDict<GeofenceBreachTypeMask>* removedGeofenceBiDict) : - mAPI(API), mRemovedGeofenceBiDict(removedGeofenceBiDict) {} - inline void onCollectiveResponse(size_t count, LocationError* errors, uint32_t* sessions) { - if (nullptr != mRemovedGeofenceBiDict) { - uint32_t *ids = (uint32_t*)malloc(sizeof(uint32_t) * count); - for (size_t i = 0; i < count; i++) { - ids[i] = mRemovedGeofenceBiDict->getId(sessions[i]); - } - mAPI.onRemoveGeofencesCb(count, errors, ids); - free(ids); - delete(mRemovedGeofenceBiDict); - } else { - LOC_LOGE("%s:%d] Unable to access removed geofences data.", __FUNCTION__, __LINE__); - } - } - LocationAPIClientBase& mAPI; - BiDict<GeofenceBreachTypeMask>* mRemovedGeofenceBiDict; - }; - - class ModifyGeofencesRequest : public LocationAPIRequest { - public: - ModifyGeofencesRequest(LocationAPIClientBase& API) : mAPI(API) {} - inline void onCollectiveResponse(size_t count, LocationError* errors, uint32_t* sessions) { - uint32_t *ids = (uint32_t*)malloc(sizeof(uint32_t) * count); - for (size_t i = 0; i < count; i++) { - ids[i] = mAPI.mGeofenceBiDict.getId(sessions[i]); - } - mAPI.onModifyGeofencesCb(count, errors, ids); - free(ids); - } - LocationAPIClientBase& mAPI; - }; - - class PauseGeofencesRequest : public LocationAPIRequest { - public: - PauseGeofencesRequest(LocationAPIClientBase& API) : mAPI(API) {} - inline void onCollectiveResponse(size_t count, LocationError* errors, uint32_t* sessions) { - uint32_t *ids = (uint32_t*)malloc(sizeof(uint32_t) * count); - for (size_t i = 0; i < count; i++) { - ids[i] = mAPI.mGeofenceBiDict.getId(sessions[i]); - } - mAPI.onPauseGeofencesCb(count, errors, ids); - free(ids); - } - LocationAPIClientBase& mAPI; - }; - - class ResumeGeofencesRequest : public LocationAPIRequest { - public: - ResumeGeofencesRequest(LocationAPIClientBase& API) : mAPI(API) {} - inline void onCollectiveResponse(size_t count, LocationError* errors, uint32_t* sessions) { - uint32_t *ids = (uint32_t*)malloc(sizeof(uint32_t) * count); - for (size_t i = 0; i < count; i++) { - ids[i] = mAPI.mGeofenceBiDict.getId(sessions[i]); - } - mAPI.onResumeGeofencesCb(count, errors, ids); - free(ids); - } - LocationAPIClientBase& mAPI; - }; - - class GnssNiResponseRequest : public LocationAPIRequest { - public: - GnssNiResponseRequest(LocationAPIClientBase& API) : mAPI(API) {} - inline void onResponse(LocationError error, uint32_t /*id*/) { - mAPI.onGnssNiResponseCb(error); - } - LocationAPIClientBase& mAPI; - }; - -private: - pthread_mutex_t mMutex; - - geofenceBreachCallback mGeofenceBreachCallback; - batchingStatusCallback mBatchingStatusCallback; - - LocationAPI* mLocationAPI; - - RequestQueue mRequestQueues[REQUEST_MAX]; - BiDict<GeofenceBreachTypeMask> mGeofenceBiDict; - BiDict<SessionEntity> mSessionBiDict; - int32_t mBatchSize; - bool mTracking; -}; - -#endif /* LOCATION_API_CLINET_BASE_H */ diff --git a/gps/location/Makefile.am b/gps/location/Makefile.am deleted file mode 100644 index 3688cc8..0000000 --- a/gps/location/Makefile.am +++ /dev/null @@ -1,38 +0,0 @@ -ACLOCAL_AMFLAGS = -I m4 - -AM_CFLAGS = \ - -I./ \ - -I../utils \ - $(LOCPLA_CFLAGS) \ - $(GPSUTILS_CFLAGS) \ - -std=c++11 - -liblocation_api_la_SOURCES = \ - LocationAPI.cpp \ - LocationAPIClientBase.cpp - -if USE_GLIB -liblocation_api_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@ -liblocation_api_la_LDFLAGS = -lstdc++ -Wl,-z,defs -lpthread @GLIB_LIBS@ -shared -version-info 1:0:0 -liblocation_api_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@ -else -liblocation_api_la_CFLAGS = $(AM_CFLAGS) -liblocation_api_la_LDFLAGS = -Wl,-z,defs -lpthread -shared -version-info 1:0:0 -liblocation_api_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -endif - -liblocation_api_la_LIBADD = -lstdc++ -ldl $(GPSUTILS_LIBS) - -library_include_HEADERS = \ - LocationAPI.h \ - LocationAPIClientBase.h \ - location_interface.h - -#Create and Install libraries -lib_LTLIBRARIES = liblocation_api.la - -library_includedir = $(pkgincludedir) - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = location-api.pc -EXTRA_DIST = $(pkgconfig_DATA) diff --git a/gps/location/configure.ac b/gps/location/configure.ac deleted file mode 100644 index 6391d65..0000000 --- a/gps/location/configure.ac +++ /dev/null @@ -1,82 +0,0 @@ -# configure.ac -- Autoconf script for gps location-api-iface -# -# Process this file with autoconf to produce a configure script - -# Requires autoconf tool later than 2.61 -AC_PREREQ(2.61) -# Initialize the gps location-api-iface package version 1.0.0 -AC_INIT([location-api-iface],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([location-api.pc.in]) -# 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([GPSUTILS], [gps-utils]) -AC_SUBST([GPSUTILS_CFLAGS]) -AC_SUBST([GPSUTILS_LIBS]) - -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_ARG_WITH([locpla_includes], - AC_HELP_STRING([--with-locpla-includes=@<:@dir@:>@], - [Specify the path to locpla-includes in loc-pla_git.bb]), - [locpla_incdir=$withval], - with_locpla_includes=no) - -if test "x${with_locpla_includes}" != "xno"; then - AC_SUBST(LOCPLA_CFLAGS, "-I${locpla_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 \ - location-api.pc \ - ]) - -AC_OUTPUT diff --git a/gps/location/location-api.pc.in b/gps/location/location-api.pc.in deleted file mode 100644 index c7b146a..0000000 --- a/gps/location/location-api.pc.in +++ /dev/null @@ -1,10 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: location-api -Description: Location API -Version: @VERSION -Libs: -L${libdir} -llocation_api -Cflags: -I${includedir}/location-api diff --git a/gps/location/location_interface.h b/gps/location/location_interface.h deleted file mode 100644 index 9229052..0000000 --- a/gps/location/location_interface.h +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (c) 2017 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 LOCATION_INTERFACE_H -#define LOCATION_INTERFACE_H - -#include <LocationAPI.h> -#include <gps_extended_c.h> - -struct GnssInterface { - size_t size; - void (*initialize)(void); - void (*deinitialize)(void); - void (*addClient)(LocationAPI* client, const LocationCallbacks& callbacks); - void (*removeClient)(LocationAPI* client); - void (*requestCapabilities)(LocationAPI* client); - uint32_t (*startTracking)(LocationAPI* client, LocationOptions& options); - void (*updateTrackingOptions)(LocationAPI* client, uint32_t id, LocationOptions& options); - void (*stopTracking)(LocationAPI* client, uint32_t id); - void (*gnssNiResponse)(LocationAPI* client, uint32_t id, GnssNiResponse response); - void (*setControlCallbacks)(LocationControlCallbacks& controlCallbacks); - uint32_t (*enable)(LocationTechnologyType techType); - void (*disable)(uint32_t id); - uint32_t* (*gnssUpdateConfig)(GnssConfig config); - uint32_t (*gnssDeleteAidingData)(GnssAidingData& data); - void (*gnssUpdateXtraThrottle)(const bool enabled); - void (*injectLocation)(double latitude, double longitude, float accuracy); - void (*injectTime)(int64_t time, int64_t timeReference, int32_t uncertainty); - void (*agpsInit)(const AgpsCbInfo& cbInfo); - void (*agpsDataConnOpen)(AGpsExtType agpsType, const char* apnName, int apnLen, int ipType); - void (*agpsDataConnClosed)(AGpsExtType agpsType); - void (*agpsDataConnFailed)(AGpsExtType agpsType); - void (*getDebugReport)(GnssDebugReport& report); - void (*updateConnectionStatus)(bool connected, int8_t type); - void (*odcpiInit)(const OdcpiRequestCallback& callback); - void (*odcpiInject)(const Location& location); -}; - -struct FlpInterface { - size_t size; - void (*initialize)(void); - void (*deinitialize)(void); - void (*addClient)(LocationAPI* client, const LocationCallbacks& callbacks); - void (*removeClient)(LocationAPI* client); - void (*requestCapabilities)(LocationAPI* client); - uint32_t (*startTracking)(LocationAPI* client, LocationOptions& options); - void (*updateTrackingOptions)(LocationAPI* client, uint32_t id, LocationOptions& options); - void (*stopTracking)(LocationAPI* client, uint32_t id); - uint32_t (*startBatching)(LocationAPI* client, LocationOptions&, BatchingOptions&); - void (*stopBatching)(LocationAPI* client, uint32_t id); - void (*updateBatchingOptions)(LocationAPI* client, uint32_t id, LocationOptions&, - BatchingOptions&); - void (*getBatchedLocations)(LocationAPI* client, uint32_t id, size_t count); - void (*getPowerStateChanges)(void* powerStateCb); -}; - -struct GeofenceInterface { - size_t size; - void (*initialize)(void); - void (*deinitialize)(void); - void (*addClient)(LocationAPI* client, const LocationCallbacks& callbacks); - void (*removeClient)(LocationAPI* client); - void (*requestCapabilities)(LocationAPI* client); - uint32_t* (*addGeofences)(LocationAPI* client, size_t count, GeofenceOption*, GeofenceInfo*); - void (*removeGeofences)(LocationAPI* client, size_t count, uint32_t* ids); - void (*modifyGeofences)(LocationAPI* client, size_t count, uint32_t* ids, - GeofenceOption* options); - void (*pauseGeofences)(LocationAPI* client, size_t count, uint32_t* ids); - void (*resumeGeofences)(LocationAPI* client, size_t count, uint32_t* ids); -}; - -#endif /* LOCATION_INTERFACE_H */ diff --git a/gps/pla/Android.mk b/gps/pla/Android.mk deleted file mode 100644 index ce062bb..0000000 --- a/gps/pla/Android.mk +++ /dev/null @@ -1,30 +0,0 @@ -GNSS_CFLAGS := \ - -Werror \ - -Wno-error=unused-parameter \ - -Wno-error=format \ - -Wno-error=macro-redefined \ - -Wno-error=reorder \ - -Wno-error=missing-braces \ - -Wno-error=self-assign \ - -Wno-error=enum-conversion \ - -Wno-error=logical-op-parentheses \ - -Wno-error=null-arithmetic \ - -Wno-error=null-conversion \ - -Wno-error=parentheses-equality \ - -Wno-error=undefined-bool-conversion \ - -Wno-error=tautological-compare \ - -Wno-error=switch \ - -Wno-error=date-time - -ifneq ($(BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE),) -ifneq ($(BUILD_TINY_ANDROID),true) - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_MODULE := libloc_pla_headers -LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/android -include $(BUILD_HEADER_LIBRARY) - -endif # not BUILD_TINY_ANDROID -endif # BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE diff --git a/gps/pla/android/loc_pla.h b/gps/pla/android/loc_pla.h deleted file mode 100644 index 9caae73..0000000 --- a/gps/pla/android/loc_pla.h +++ /dev/null @@ -1,58 +0,0 @@ -/* 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_PLA__ -#define __LOC_PLA__ - -#ifdef __cplusplus -#include <utils/SystemClock.h> -#define uptimeMillis android::uptimeMillis -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#include <cutils/properties.h> -#include <cutils/threads.h> -#include <cutils/sched_policy.h> - -#define LOC_PATH_GPS_CONF_STR "/vendor/etc/gps.conf" -#define LOC_PATH_IZAT_CONF_STR "/vendor/etc/izat.conf" -#define LOC_PATH_FLP_CONF_STR "/vendor/etc/flp.conf" -#define LOC_PATH_LOWI_CONF_STR "/vendor/etc/lowi.conf" -#define LOC_PATH_SAP_CONF_STR "/vendor/etc/sap.conf" -#define LOC_PATH_APDR_CONF_STR "/vendor/etc/apdr.conf" -#define LOC_PATH_XTWIFI_CONF_STR "/vendor/etc/xtwifi.conf" -#define LOC_PATH_QUIPC_CONF_STR "/vendor/etc/quipc.conf" - -#ifdef __cplusplus -} -#endif /*__cplusplus */ - -#endif /* __LOC_PLA__ */ diff --git a/gps/pla/oe/loc_pla.h b/gps/pla/oe/loc_pla.h deleted file mode 100644 index 3ca1964..0000000 --- a/gps/pla/oe/loc_pla.h +++ /dev/null @@ -1,67 +0,0 @@ -/* 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_PLA__ -#define __LOC_PLA__ - -#ifdef __cplusplus -#include <utils/SystemClock.h> -#define uptimeMillis android::uptimeMillis - -extern "C" { -#endif - -#include <cutils/properties.h> -#include <cutils/threads.h> -#include <cutils/sched_policy.h> -#include <sys/time.h> -#include <string.h> -#include <stdlib.h> -#ifndef OFF_TARGET -#include <glib.h> -#define strlcat g_strlcat -#define strlcpy g_strlcpy -#else -#define strlcat strncat -#define strlcpy strncpy -#endif - -#define LOC_PATH_GPS_CONF_STR "/etc/gps.conf" -#define LOC_PATH_IZAT_CONF_STR "/etc/izat.conf" -#define LOC_PATH_FLP_CONF_STR "/etc/flp.conf" -#define LOC_PATH_LOWI_CONF_STR "/etc/lowi.conf" -#define LOC_PATH_SAP_CONF_STR "/etc/sap.conf" -#define LOC_PATH_APDR_CONF_STR "/etc/apdr.conf" -#define LOC_PATH_XTWIFI_CONF_STR "/etc/xtwifi.conf" -#define LOC_PATH_QUIPC_CONF_STR "/etc/quipc.conf" - -#ifdef __cplusplus -} -#endif /*__cplusplus */ - -#endif /* __LOC_PLA__ */ diff --git a/gps/utils/Android.mk b/gps/utils/Android.mk deleted file mode 100644 index b8320de..0000000 --- a/gps/utils/Android.mk +++ /dev/null @@ -1,63 +0,0 @@ -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 \ - LocHeap.cpp \ - LocTimer.cpp \ - LocThread.cpp \ - MsgTask.cpp \ - loc_misc_utils.cpp \ - loc_nmea.cpp \ - LocIpc.cpp - -# Flag -std=c++11 is not accepted by compiler when LOCAL_CLANG is set to true -LOCAL_CFLAGS += \ - -fno-short-enums \ - -D_ANDROID_ - -ifeq ($(TARGET_BUILD_VARIANT),user) - LOCAL_CFLAGS += -DTARGET_BUILD_VARIANT_USER -endif - -LOCAL_LDFLAGS += -Wl,--export-dynamic - -## Includes -LOCAL_HEADER_LIBRARIES := \ - libutils_headers \ - libloc_pla_headers \ - liblocation_api_headers - -LOCAL_MODULE := libgps.utils -LOCAL_VENDOR_MODULE := true -LOCAL_MODULE_TAGS := optional - -LOCAL_PRELINK_MODULE := false - -LOCAL_CFLAGS += $(GNSS_CFLAGS) - -include $(BUILD_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := libgps.utils_headers -LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH) -include $(BUILD_HEADER_LIBRARY) - -endif # not BUILD_TINY_ANDROID -endif # BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE diff --git a/gps/utils/LocHeap.cpp b/gps/utils/LocHeap.cpp deleted file mode 100644 index d667f14..0000000 --- a/gps/utils/LocHeap.cpp +++ /dev/null @@ -1,354 +0,0 @@ -/* 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 diff --git a/gps/utils/LocHeap.h b/gps/utils/LocHeap.h deleted file mode 100644 index b491948..0000000 --- a/gps/utils/LocHeap.h +++ /dev/null @@ -1,96 +0,0 @@ -/* 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__ diff --git a/gps/utils/LocIpc.cpp b/gps/utils/LocIpc.cpp deleted file mode 100644 index 675664a..0000000 --- a/gps/utils/LocIpc.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/* Copyright (c) 2017-2018 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 <sys/types.h> -#include <sys/stat.h> -#include <errno.h> -#include <log_util.h> -#include "LocIpc.h" - -namespace loc_util { - -#ifdef LOG_TAG -#undef LOG_TAG -#endif -#define LOG_TAG "LocSvc_LocIpc" - -#define LOC_MSG_BUF_LEN 8192 -#define LOC_MSG_HEAD "$MSGLEN$" -#define LOC_MSG_ABORT "LocIpcMsg::ABORT" - -class LocIpcRunnable : public LocRunnable { -friend LocIpc; -public: - LocIpcRunnable(LocIpc& locIpc, const std::string& ipcName) - : mLocIpc(locIpc), mIpcName(ipcName) {} - bool run() override { - if (!mLocIpc.startListeningBlocking(mIpcName)) { - LOC_LOGe("listen to socket failed"); - } - - return false; - } -private: - LocIpc& mLocIpc; - const std::string mIpcName; -}; - -bool LocIpc::startListeningNonBlocking(const std::string& name) { - mRunnable = new LocIpcRunnable(*this, name); - std::string threadName("LocIpc-"); - threadName.append(name); - return mThread.start(threadName.c_str(), mRunnable); -} - -bool LocIpc::startListeningBlocking(const std::string& name) { - - int fd = socket(AF_UNIX, SOCK_DGRAM, 0); - if (fd < 0) { - LOC_LOGe("create socket error. reason:%s", strerror(errno)); - return false; - } - - if ((unlink(name.c_str()) < 0) && (errno != ENOENT)) { - LOC_LOGw("unlink socket error. reason:%s", strerror(errno)); - } - - struct sockaddr_un addr = { .sun_family = AF_UNIX }; - snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", name.c_str()); - - umask(0157); - - if (::bind(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) { - LOC_LOGe("bind socket error. reason:%s", strerror(errno)); - ::close(fd); - fd = -1; - return false; - } - - mIpcFd = fd; - - // inform that the socket is ready to receive message - onListenerReady(); - - ssize_t nBytes = 0; - std::string msg = ""; - std::string abort = LOC_MSG_ABORT; - while (1) { - msg.resize(LOC_MSG_BUF_LEN); - nBytes = ::recvfrom(mIpcFd, (void*)(msg.data()), msg.size(), 0, NULL, NULL); - if (nBytes < 0) { - break; - } else if (nBytes == 0) { - continue; - } - - if (strncmp(msg.data(), abort.c_str(), abort.length()) == 0) { - LOC_LOGi("recvd abort msg.data %s", msg.data()); - break; - } - - if (strncmp(msg.data(), LOC_MSG_HEAD, sizeof(LOC_MSG_HEAD) - 1)) { - // short message - msg.resize(nBytes); - onReceive(msg); - } else { - // long message - size_t msgLen = 0; - sscanf(msg.data(), LOC_MSG_HEAD"%zu", &msgLen); - msg.resize(msgLen); - size_t msgLenReceived = 0; - while ((msgLenReceived < msgLen) && (nBytes > 0)) { - nBytes = recvfrom(mIpcFd, (void*)&(msg[msgLenReceived]), - msg.size() - msgLenReceived, 0, NULL, NULL); - msgLenReceived += nBytes; - } - if (nBytes > 0) { - onReceive(msg); - } else { - break; - } - } - } - - if (mStopRequested) { - mStopRequested = false; - return true; - } else { - LOC_LOGe("cannot read socket. reason:%s", strerror(errno)); - (void)::close(mIpcFd); - mIpcFd = -1; - return false; - } -} - -void LocIpc::stopListening() { - - const char *socketName = nullptr; - mStopRequested = true; - - if (mRunnable) { - std::string abort = LOC_MSG_ABORT; - socketName = (reinterpret_cast<LocIpcRunnable *>(mRunnable))->mIpcName.c_str(); - send(socketName, abort); - mRunnable = nullptr; - } - - if (mIpcFd >= 0) { - if (::close(mIpcFd)) { - LOC_LOGe("cannot close socket:%s", strerror(errno)); - } - mIpcFd = -1; - } - - //delete from the file system at the end - if (socketName) { - unlink(socketName); - } -} - -bool LocIpc::send(const char name[], const std::string& data) { - return send(name, (const uint8_t*)data.c_str(), data.length()); -} - -bool LocIpc::send(const char name[], const uint8_t data[], uint32_t length) { - - bool result = true; - int fd = ::socket(AF_UNIX, SOCK_DGRAM, 0); - if (fd < 0) { - LOC_LOGe("create socket error. reason:%s", strerror(errno)); - return false; - } - - struct sockaddr_un addr = { .sun_family = AF_UNIX }; - snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", name); - - result = sendData(fd, addr, data, length); - - (void)::close(fd); - return result; -} - - -bool LocIpc::sendData(int fd, const sockaddr_un &addr, const uint8_t data[], uint32_t length) { - - bool result = true; - - if (length <= LOC_MSG_BUF_LEN) { - if (::sendto(fd, data, length, 0, - (struct sockaddr*)&addr, sizeof(addr)) < 0) { - LOC_LOGe("cannot send to socket. reason:%s", strerror(errno)); - result = false; - } - } else { - std::string head = LOC_MSG_HEAD; - head.append(std::to_string(length)); - if (::sendto(fd, head.c_str(), head.length(), 0, - (struct sockaddr*)&addr, sizeof(addr)) < 0) { - LOC_LOGe("cannot send to socket. reason:%s", strerror(errno)); - result = false; - } else { - size_t sentBytes = 0; - while(sentBytes < length) { - size_t partLen = length - sentBytes; - if (partLen > LOC_MSG_BUF_LEN) { - partLen = LOC_MSG_BUF_LEN; - } - ssize_t rv = ::sendto(fd, data + sentBytes, partLen, 0, - (struct sockaddr*)&addr, sizeof(addr)); - if (rv < 0) { - LOC_LOGe("cannot send to socket. reason:%s", strerror(errno)); - result = false; - break; - } - sentBytes += rv; - } - } - } - return result; -} - -} diff --git a/gps/utils/LocIpc.h b/gps/utils/LocIpc.h deleted file mode 100644 index 364093b..0000000 --- a/gps/utils/LocIpc.h +++ /dev/null @@ -1,153 +0,0 @@ -/* Copyright (c) 2017-2018 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_SOCKET__ -#define __LOC_SOCKET__ - -#include <string> -#include <memory> -#include <unistd.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <LocThread.h> - -namespace loc_util { - -class LocIpcSender; - -class LocIpc { -friend LocIpcSender; -public: - inline LocIpc() : mIpcFd(-1), mStopRequested(false), mRunnable(nullptr) {} - inline virtual ~LocIpc() { stopListening(); } - - // Listen for new messages in current thread. Calling this funciton will - // block current thread. The listening can be stopped by calling stopListening(). - // - // Argument name is the path of the unix local socket to be listened. - // The function will return true on success, and false on failure. - bool startListeningBlocking(const std::string& name); - - // Create a new LocThread and listen for new messages in it. - // Calling this function will return immediately and won't block current thread. - // The listening can be stopped by calling stopListening(). - // - // Argument name is the path of the unix local socket to be be listened. - // The function will return true on success, and false on failure. - bool startListeningNonBlocking(const std::string& name); - - // Stop listening to new messages. - void stopListening(); - - // Send out a message. - // Call this function to send a message in argument data to socket in argument name. - // - // Argument name contains the name of the target unix socket. data contains the - // message to be sent out. Convert your message to a string before calling this function. - // The function will return true on success, and false on failure. - static bool send(const char name[], const std::string& data); - static bool send(const char name[], const uint8_t data[], uint32_t length); - -protected: - // Callback function for receiving incoming messages. - // Override this function in your derived class to process incoming messages. - // For each received message, this callback function will be called once. - // This callback function will be called in the calling thread of startListeningBlocking - // or in the new LocThread created by startListeningNonBlocking. - // - // Argument data contains the received message. You need to parse it. - inline virtual void onReceive(const std::string& /*data*/) {} - - // LocIpc client can overwrite this function to get notification - // when the socket for LocIpc is ready to receive messages. - inline virtual void onListenerReady() {} - -private: - static bool sendData(int fd, const sockaddr_un& addr, - const uint8_t data[], uint32_t length); - - int mIpcFd; - bool mStopRequested; - LocThread mThread; - LocRunnable *mRunnable; -}; - -class LocIpcSender { -public: - // Constructor of LocIpcSender class - // - // Argument destSocket contains the full path name of destination socket. - // This class hides generated fd and destination address object from user. - inline LocIpcSender(const char* destSocket): - LocIpcSender(std::make_shared<int>(::socket(AF_UNIX, SOCK_DGRAM, 0)), destSocket) { - if (-1 == *mSocket) { - mSocket = nullptr; - } - } - - // Replicate a new LocIpcSender object with new destination socket. - inline LocIpcSender* replicate(const char* destSocket) { - return (nullptr == mSocket) ? nullptr : new LocIpcSender(mSocket, destSocket); - } - - inline ~LocIpcSender() { - if (nullptr != mSocket && mSocket.unique()) { - ::close(*mSocket); - } - } - - // Send out a message. - // Call this function to send a message - // - // Argument data and length contains the message to be sent out. - // Return true when succeeded - inline bool send(const uint8_t data[], uint32_t length) { - bool rtv = false; - if (nullptr != mSocket && nullptr != data) { - rtv = LocIpc::sendData(*mSocket, mDestAddr, data, length); - } - return rtv; - } - -private: - std::shared_ptr<int> mSocket; - struct sockaddr_un mDestAddr; - - inline LocIpcSender( - const std::shared_ptr<int>& mySocket, const char* destSocket) : mSocket(mySocket) { - if ((nullptr != mSocket) && (-1 != *mSocket) && (nullptr != destSocket)) { - mDestAddr.sun_family = AF_UNIX; - snprintf(mDestAddr.sun_path, sizeof(mDestAddr.sun_path), "%s", destSocket); - } - } -}; - -} - -#endif //__LOC_SOCKET__ diff --git a/gps/utils/LocSharedLock.h b/gps/utils/LocSharedLock.h deleted file mode 100644 index 7fe6237..0000000 --- a/gps/utils/LocSharedLock.h +++ /dev/null @@ -1,59 +0,0 @@ -/* 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__ diff --git a/gps/utils/LocThread.cpp b/gps/utils/LocThread.cpp deleted file mode 100644 index c1052cb..0000000 --- a/gps/utils/LocThread.cpp +++ /dev/null @@ -1,266 +0,0 @@ -/* 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> -#include <loc_pla.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((pthread_t)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 = (pthread_t)NULL; - } - - if (mThandle) { - // set thread name - char lname[16]; - int len = (sizeof(lname)>sizeof(threadName)) ? - (sizeof(threadName) -1):(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 diff --git a/gps/utils/LocThread.h b/gps/utils/LocThread.h deleted file mode 100644 index 2a65d8f..0000000 --- a/gps/utils/LocThread.h +++ /dev/null @@ -1,92 +0,0 @@ -/* 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__ diff --git a/gps/utils/LocTimer.cpp b/gps/utils/LocTimer.cpp deleted file mode 100644 index 93775d0..0000000 --- a/gps/utils/LocTimer.cpp +++ /dev/null @@ -1,753 +0,0 @@ -/* 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 <unistd.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <errno.h> -#include <sys/timerfd.h> -#include <sys/epoll.h> -#include <log_util.h> -#include <loc_timer.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, LocTimerContainer* container); - 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; - memset(&delay, 0, sizeof(struct itimerspec)); - 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; - memset(&delay, 0, sizeof(struct itimerspec)); - 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, - LocTimerContainer* container) - : mClient(&client), - mLock(mClient->mLock->share()), - mFutureTime(futureTime), - mContainer(container) { - // 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/tv_nsec, this obj outRanks higher - rank = timer->mFutureTime.tv_sec - mFutureTime.tv_sec; - if(0 == rank) - { - //rank against tv_nsec for msec accuracy - rank = (int)(timer->mFutureTime.tv_nsec - mFutureTime.tv_nsec); - } - } - 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; - } - - LocTimerContainer* container; - container = LocTimerContainer::get(wakeOnExpire); - if (NULL != container) { - mTimer = new LocTimerDelegate(*this, futureTime, container); - // 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 diff --git a/gps/utils/LocTimer.h b/gps/utils/LocTimer.h deleted file mode 100644 index abc7f64..0000000 --- a/gps/utils/LocTimer.h +++ /dev/null @@ -1,74 +0,0 @@ -/* 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 <loc_pla.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__ diff --git a/gps/utils/LocUnorderedSetMap.h b/gps/utils/LocUnorderedSetMap.h deleted file mode 100644 index 8748134..0000000 --- a/gps/utils/LocUnorderedSetMap.h +++ /dev/null @@ -1,192 +0,0 @@ -/* Copyright (c) 2015, 2017 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_UNORDERDED_SETMAP_H__ -#define __LOC_UNORDERDED_SETMAP_H__ - -#include <algorithm> -#include <unordered_set> -#include <unordered_map> - -using std::unordered_set; -using std::unordered_map; - -namespace loc_util { - -// Trim from *fromSet* any elements that also exist in *rVals*. -// The optional *goneVals*, if not null, will be populated with removed elements. -template <typename T> -inline static void trimSet(unordered_set<T>& fromSet, const unordered_set<T>& rVals, - unordered_set<T>* goneVals) { - for (auto val : rVals) { - if (fromSet.erase(val) > 0 && nullptr != goneVals) { - goneVals->insert(val); - } - } -} - -// this method is destructive to the input unordered_sets. -// the return set is the interset extracted out from the two input sets, *s1* and *s2*. -// *s1* and *s2* will be left with the intersect removed from them. -template <typename T> -static unordered_set<T> removeAndReturnInterset(unordered_set<T>& s1, unordered_set<T>& s2) { - unordered_set<T> common(0); - for (auto b = s2.begin(); b != s2.end(); b++) { - auto a = find(s1.begin(), s1.end(), *b); - if (a != s1.end()) { - // this is a common item of both l1 and l2, remove from both - // but after we add to common - common.insert(*a); - s1.erase(a); - s2.erase(b); - } - } - return common; -} - -template <typename KEY, typename VAL> -class LocUnorderedSetMap { - unordered_map<KEY, unordered_set<VAL>> mMap; - - - // Trim the VALs pointed to by *iter*, with everything that also exist in *rVals*. - // If the set becomes empty, remove the map entry. *goneVals*, if not null, records - // the trimmed VALs. - bool trimOrRemove(typename unordered_map<KEY, unordered_set<VAL>>::iterator iter, - const unordered_set<VAL>& rVals, unordered_set<VAL>* goneVals) { - trimSet<VAL>(iter->second, rVals, goneVals); - bool removeEntry = (iter->second.empty()); - if (removeEntry) { - mMap.erase(iter); - } - return removeEntry; - } - -public: - inline LocUnorderedSetMap() {} - inline LocUnorderedSetMap(size_t size) : mMap(size) {} - - inline bool empty() { return mMap.empty(); } - - // This gets the raw pointer to the VALs pointed to by *key* - // If the entry is not in the map, nullptr will be returned. - inline unordered_set<VAL>* getValSetPtr(const KEY& key) { - auto entry = mMap.find(key); - return (entry != mMap.end()) ? &(entry->second) : nullptr; - } - - // This gets a copy of VALs pointed to by *key* - // If the entry is not in the map, an empty set will be returned. - inline unordered_set<VAL> getValSet(const KEY& key) { - auto entry = mMap.find(key); - return (entry != mMap.end()) ? entry->second : unordered_set<VAL>(0); - } - - // This gets all the KEYs from the map - inline unordered_set<KEY> getKeys() { - unordered_set<KEY> keys(0); - for (auto entry : mMap) { - keys.insert(entry.first); - } - return keys; - } - - inline bool remove(const KEY& key) { - return mMap.erase(key) > 0; - } - - // This looks into all the entries keyed by *keys*. Remove any VALs from the entries - // that also exist in *rVals*. If the entry is left with an empty set, the entry will - // be removed. The optional parameters *goneKeys* and *goneVals* will record the KEYs - // (or entries) and the collapsed VALs removed from the map, respectively. - inline void trimOrRemove(unordered_set<KEY>&& keys, const unordered_set<VAL>& rVals, - unordered_set<KEY>* goneKeys, unordered_set<VAL>* goneVals) { - trimOrRemove(keys, rVals, goneKeys, goneVals); - } - inline void trimOrRemove(unordered_set<KEY>& keys, const unordered_set<VAL>& rVals, - unordered_set<KEY>* goneKeys, unordered_set<VAL>* goneVals) { - for (auto key : keys) { - auto iter = mMap.find(key); - if (iter != mMap.end() && trimOrRemove(iter, rVals, goneVals) && nullptr != goneKeys) { - goneKeys->insert(iter->first); - } - } - } - - // This adds all VALs from *newVals* to the map entry keyed by *key*. Or if it - // doesn't exist yet, add the set to the map. - bool add(const KEY& key, const unordered_set<VAL>& newVals) { - bool newEntryAdded = false; - if (!newVals.empty()) { - auto iter = mMap.find(key); - if (iter != mMap.end()) { - iter->second.insert(newVals.begin(), newVals.end()); - } else { - mMap[key] = newVals; - newEntryAdded = true; - } - } - return newEntryAdded; - } - - // This adds to each of entries in the map keyed by *keys* with the VALs in the - // *enwVals*. If there new entries added (new key in *keys*), *newKeys*, if not - // null, would be populated with those keys. - inline void add(const unordered_set<KEY>& keys, const unordered_set<VAL>&& newVals, - unordered_set<KEY>* newKeys) { - add(keys, newVals, newKeys); - } - inline void add(const unordered_set<KEY>& keys, const unordered_set<VAL>& newVals, - unordered_set<KEY>* newKeys) { - for (auto key : keys) { - if (add(key, newVals) && nullptr != newKeys) { - newKeys->insert(key); - } - } - } - - // This puts *newVals* into the map keyed by *key*, and returns the VALs that are - // in effect removed from the keyed VAL set in the map entry. - // This call would also remove those same VALs from *newVals*. - inline unordered_set<VAL> update(const KEY& key, unordered_set<VAL>& newVals) { - unordered_set<VAL> goneVals(0); - - if (newVals.empty()) { - mMap.erase(key); - } else { - auto curVals = mMap[key]; - mMap[key] = newVals; - goneVals = removeAndReturnInterset(curVals, newVals); - } - return goneVals; - } -}; - -} // namespace loc_util - -#endif // #ifndef __LOC_UNORDERDED_SETMAP_H__ diff --git a/gps/utils/Makefile.am b/gps/utils/Makefile.am deleted file mode 100644 index 3801fdd..0000000 --- a/gps/utils/Makefile.am +++ /dev/null @@ -1,70 +0,0 @@ -ACLOCAL_AMFLAGS = -I m4 - -AM_CFLAGS = -Wundef \ - -MD \ - -Wno-trigraphs \ - -g -O0 \ - -fno-inline \ - -fno-short-enums \ - -fpic \ - -I./ \ - -std=c++11 \ - $(LOCPLA_CFLAGS) - -libgps_utils_la_h_sources = \ - msg_q.h \ - linked_list.h \ - loc_cfg.h \ - loc_log.h \ - loc_target.h \ - loc_timer.h \ - MsgTask.h \ - LocHeap.h \ - LocThread.h \ - LocTimer.h \ - LocIpc.h \ - loc_misc_utils.h \ - loc_nmea.h \ - gps_extended_c.h \ - gps_extended.h \ - loc_gps.h \ - log_util.h - -libgps_utils_la_c_sources = \ - linked_list.c \ - msg_q.c \ - loc_cfg.cpp \ - loc_log.cpp \ - loc_target.cpp \ - LocHeap.cpp \ - LocTimer.cpp \ - LocThread.cpp \ - LocIpc.cpp \ - MsgTask.cpp \ - loc_misc_utils.cpp \ - loc_nmea.cpp - -library_includedir = $(pkgincludedir) - -library_include_HEADERS = $(libgps_utils_la_h_sources) - -libgps_utils_la_SOURCES = $(libgps_utils_la_c_sources) - -if USE_GLIB -libgps_utils_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@ -libgps_utils_la_LDFLAGS = -lstdc++ -Wl,-z,defs -lpthread @GLIB_LIBS@ -shared -version-info 1:0:0 -libgps_utils_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@ -else -libgps_utils_la_CFLAGS = $(AM_CFLAGS) -libgps_utils_la_LDFLAGS = -Wl,-z,defs -lpthread -shared -version-info 1:0:0 -libgps_utils_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -endif - -libgps_utils_la_LIBADD = $(CUTILS_LIBS) - -#Create and Install libraries -lib_LTLIBRARIES = libgps_utils.la - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = gps-utils.pc -EXTRA_DIST = $(pkgconfig_DATA) diff --git a/gps/utils/MsgTask.cpp b/gps/utils/MsgTask.cpp deleted file mode 100644 index eaead5c..0000000 --- a/gps/utils/MsgTask.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/* Copyright (c) 2011-2013, 2015, 2017The 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_NDEBUG 0 -#define LOG_TAG "LocSvc_MsgTask" - -#include <unistd.h> -#include <MsgTask.h> -#include <msg_q.h> -#include <log_util.h> -#include <loc_log.h> -#include <loc_pla.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() { - LocThread* thread = mThread; - msg_q_unblock((void*)mQ); - if (thread) { - mThread = NULL; - delete thread; - } else { - delete this; - } -} - -void MsgTask::sendMsg(const LocMsg* msg) const { - if (msg) { - msg_q_snd((void*)mQ, (void*)msg, LocMsgDestroy); - } else { - LOC_LOGE("%s: msg is NULL", __func__); - } -} - -void MsgTask::prerun() { - // make sure we do not run in background scheduling group - set_sched_policy(gettid(), SP_FOREGROUND); -} - -bool MsgTask::run() { - 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; -} diff --git a/gps/utils/MsgTask.h b/gps/utils/MsgTask.h deleted file mode 100644 index 9eb1f56..0000000 --- a/gps/utils/MsgTask.h +++ /dev/null @@ -1,67 +0,0 @@ -/* 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__ diff --git a/gps/utils/configure.ac b/gps/utils/configure.ac deleted file mode 100644 index 639f8c4..0000000 --- a/gps/utils/configure.ac +++ /dev/null @@ -1,82 +0,0 @@ -# configure.ac -- Autoconf script for gps gps-utils -# -# Process this file with autoconf to produce a configure script - -# Requires autoconf tool later than 2.61 -AC_PREREQ(2.61) -# Initialize the gps gps-utils package version 1.0.0 -AC_INIT([gps-utils],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([Makefile.am]) -# 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([CUTILS], [libcutils]) -AC_SUBST([CUTILS_CFLAGS]) -AC_SUBST([CUTILS_LIBS]) - -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_ARG_WITH([locpla_includes], - AC_HELP_STRING([--with-locpla-includes=@<:@dir@:>@], - [specify the path to locpla-includes in loc-pla_git.bb]), - [locpla_incdir=$withval], - with_locpla_includes=no) - -if test "x$with_locpla_includes" != "xno"; then - AC_SUBST(LOCPLA_CFLAGS, "-I${locpla_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 \ - gps-utils.pc - ]) - -AC_OUTPUT diff --git a/gps/utils/gps-utils.pc.in b/gps/utils/gps-utils.pc.in deleted file mode 100644 index a988731..0000000 --- a/gps/utils/gps-utils.pc.in +++ /dev/null @@ -1,10 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: gps-utils -Description: QTI GPS Location utils -Version: @VERSION -Libs: -L${libdir} -lgps_utils -Cflags: -I${includedir}/gps-utils diff --git a/gps/utils/gps_extended.h b/gps/utils/gps_extended.h deleted file mode 100644 index dc6ad1e..0000000 --- a/gps/utils/gps_extended.h +++ /dev/null @@ -1,106 +0,0 @@ -/* Copyright (c) 2013-2017 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 - -/** - * @file - * @brief C++ declarations for GPS types - */ - -#include <gps_extended_c.h> -#if defined(USE_GLIB) || defined(OFF_TARGET) -#include <string.h> -#endif - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - - -struct LocPosMode -{ - LocPositionMode mode; - LocGpsPositionRecurrence recurrence; - uint32_t min_interval; - uint32_t preferred_accuracy; - uint32_t preferred_time; - bool share_position; - char credentials[14]; - char provider[8]; - LocPosMode(LocPositionMode m, LocGpsPositionRecurrence recr, - uint32_t gap, uint32_t accu, uint32_t time, - bool sp, const char* cred, const char* prov) : - mode(m), recurrence(recr), - min_interval(gap < GPS_MIN_POSSIBLE_FIX_INTERVAL_MS ? - GPS_MIN_POSSIBLE_FIX_INTERVAL_MS : gap), - preferred_accuracy(accu), preferred_time(time), - share_position(sp) { - 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(LOC_GPS_POSITION_RECURRENCE_PERIODIC), - min_interval(GPS_DEFAULT_FIX_INTERVAL_MS), - preferred_accuracy(50), preferred_time(120000), - share_position(true) { - 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 */ - diff --git a/gps/utils/gps_extended_c.h b/gps/utils/gps_extended_c.h deleted file mode 100644 index 5479bec..0000000 --- a/gps/utils/gps_extended_c.h +++ /dev/null @@ -1,1342 +0,0 @@ -/* Copyright (c) 2013-2017 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 - -#include <ctype.h> -#include <stdbool.h> -#include <stdlib.h> -#include <string.h> -#include <loc_gps.h> -#include <LocationAPI.h> -#include <time.h> - -/** - * @file - * @brief C++ declarations for GPS types - */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** Location has valid source information. */ -#define LOCATION_HAS_SOURCE_INFO 0x0020 -/** LocGpsLocation has valid "is indoor?" flag */ -#define LOC_GPS_LOCATION_HAS_IS_INDOOR 0x0040 -/** LocGpsLocation has valid floor number */ -#define LOC_GPS_LOCATION_HAS_FLOOR_NUMBER 0x0080 -/** LocGpsLocation has valid map URL*/ -#define LOC_GPS_LOCATION_HAS_MAP_URL 0x0100 -/** LocGpsLocation has valid map index */ -#define LOC_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 -/** Position is from external DR solution*/ -#define ULP_LOCATION_IS_FROM_EXT_DR 0X0080 -/** Raw GNSS position fixes */ -#define ULP_LOCATION_IS_FROM_GNSS_RAW 0X0100 - -typedef uint32_t LocSvInfoSource; -/** SVinfo source is GNSS/DR */ -#define ULP_SVINFO_IS_FROM_GNSS ((LocSvInfoSource)0x0001) -/** Raw SVinfo from GNSS */ -#define ULP_SVINFO_IS_FROM_DR ((LocSvInfoSource)0x0002) - -#define ULP_MIN_INTERVAL_INVALID 0xffffffff -#define ULP_MAX_NMEA_STRING_SIZE 201 - -/*Emergency SUPL*/ -#define LOC_GPS_NI_TYPE_EMERGENCY_SUPL 4 - -#define LOC_AGPS_CERTIFICATE_MAX_LENGTH 2000 -#define LOC_AGPS_CERTIFICATE_MAX_SLOTS 10 - -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) - -enum loc_registration_mask_status { - LOC_REGISTRATION_MASK_ENABLED, - LOC_REGISTRATION_MASK_DISABLED, - LOC_REGISTRATION_MASK_SET -}; - -typedef enum { - LOC_SUPPORTED_FEATURE_ODCPI_2_V02 = 0, /**< Support ODCPI version 2 feature */ - LOC_SUPPORTED_FEATURE_WIFI_AP_DATA_INJECT_2_V02, /**< Support Wifi AP data inject version 2 feature */ - LOC_SUPPORTED_FEATURE_DEBUG_NMEA_V02, /**< Support debug NMEA feature */ - LOC_SUPPORTED_FEATURE_GNSS_ONLY_POSITION_REPORT, /**< Support GNSS Only position reports */ - LOC_SUPPORTED_FEATURE_FDCL /**< Support FDCL */ -} loc_supported_feature_enum; - -typedef struct { - /** set to sizeof(UlpLocation) */ - size_t size; - LocGpsLocation gpsLocation; - /* Provider indicator for HYBRID or GPS */ - uint16_t position_source; - LocPosTechMask tech_mask; - /*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; - -typedef struct { - /** set to sizeof(UlpNmea) */ - size_t size; - char nmea_str[ULP_MAX_NMEA_STRING_SIZE]; - unsigned int len; -} UlpNmea; - - -/** AGPS type */ -typedef int8_t AGpsExtType; -#define LOC_AGPS_TYPE_INVALID -1 -#define LOC_AGPS_TYPE_ANY 0 -#define LOC_AGPS_TYPE_SUPL 1 -#define LOC_AGPS_TYPE_C2K 2 -#define LOC_AGPS_TYPE_WWAN_ANY 3 -#define LOC_AGPS_TYPE_WIFI 4 -#define LOC_AGPS_TYPE_SUPL_ES 5 - -/** SSID length */ -#define SSID_BUF_SIZE (32+1) - -typedef int16_t AGpsBearerType; -#define AGPS_APN_BEARER_INVALID 0 -#define AGPS_APN_BEARER_IPV4 1 -#define AGPS_APN_BEARER_IPV6 2 -#define AGPS_APN_BEARER_IPV4V6 3 - -typedef enum { - AGPS_CB_PRIORITY_LOW = 1, - AGPS_CB_PRIORITY_MED = 2, - AGPS_CB_PRIORITY_HIGH = 3 -} AgpsCbPriority; - -typedef struct { - void* statusV4Cb; - AgpsCbPriority cbPriority; -} AgpsCbInfo; - -/** GPS extended callback structure. */ -typedef struct { - /** set to sizeof(LocGpsCallbacks) */ - size_t size; - loc_gps_set_capabilities set_capabilities_cb; - loc_gps_acquire_wakelock acquire_wakelock_cb; - loc_gps_release_wakelock release_wakelock_cb; - loc_gps_create_thread create_thread_cb; - loc_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 { - loc_gps_xtra_download_request download_request_cb; - loc_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; - LocAGpsStatusValue 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; - loc_gps_create_thread create_thread_cb; -} AGpsExtCallbacks; - - -typedef void (*loc_ni_notify_callback)(LocGpsNiNotification *notification, bool esEnalbed); -/** GPS NI callback structure. */ -typedef struct -{ - /** - * Sends the notification request from HAL to GPSLocationProvider. - */ - loc_ni_notify_callback notify_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; - -/** - * @brief Minimum allowed value for fix interval. - * - * This value is a sanity limit in GPS framework. The hardware has own internal - * limits that may not match this value - * - * @sa GPS_DEFAULT_FIX_INTERVAL_MS - */ - -#define GPS_MIN_POSSIBLE_FIX_INTERVAL_MS 100 -/** - * @brief Default value for fix interval. - * - * This value is used by default whenever appropriate. - * - * @sa GPS_MIN_POSSIBLE_FIX_INTERVAL_MS - */ -#define GPS_DEFAULT_FIX_INTERVAL_MS 1000 - -/** Flags to indicate which values are valid in a GpsLocationExtended. */ -typedef uint32_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 -/** GpsLocationExtended has valid Horizontal Elliptical Uncertainty (Semi-Major Axis) */ -#define GPS_LOCATION_EXTENDED_HAS_HOR_ELIP_UNC_MAJOR 0x0200 -/** GpsLocationExtended has valid Horizontal Elliptical Uncertainty (Semi-Minor Axis) */ -#define GPS_LOCATION_EXTENDED_HAS_HOR_ELIP_UNC_MINOR 0x0400 -/** GpsLocationExtended has valid Elliptical Horizontal Uncertainty Azimuth */ -#define GPS_LOCATION_EXTENDED_HAS_HOR_ELIP_UNC_AZIMUTH 0x0800 -/** GpsLocationExtended has valid gnss sv used in position data */ -#define GPS_LOCATION_EXTENDED_HAS_GNSS_SV_USED_DATA 0x1000 -/** GpsLocationExtended has valid navSolutionMask */ -#define GPS_LOCATION_EXTENDED_HAS_NAV_SOLUTION_MASK 0x2000 -/** GpsLocationExtended has valid LocPosTechMask */ -#define GPS_LOCATION_EXTENDED_HAS_POS_TECH_MASK 0x4000 -/** GpsLocationExtended has valid LocSvInfoSource */ -#define GPS_LOCATION_EXTENDED_HAS_SV_SOURCE_INFO 0x8000 -/** GpsLocationExtended has valid position dynamics data */ -#define GPS_LOCATION_EXTENDED_HAS_POS_DYNAMICS_DATA 0x10000 -/** GpsLocationExtended has GPS Time */ -#define GPS_LOCATION_EXTENDED_HAS_GPS_TIME 0x20000 -/** GpsLocationExtended has Extended Dilution of Precision */ -#define GPS_LOCATION_EXTENDED_HAS_EXT_DOP 0x40000 -/** GpsLocationExtended has Elapsed Time */ -#define GPS_LOCATION_EXTENDED_HAS_ELAPSED_TIME 0x80000 - -typedef uint32_t LocNavSolutionMask; -/* Bitmask to specify whether SBAS ionospheric correction is used */ -#define LOC_NAV_MASK_SBAS_CORRECTION_IONO ((LocNavSolutionMask)0x0001) -/* Bitmask to specify whether SBAS fast correction is used */ -#define LOC_NAV_MASK_SBAS_CORRECTION_FAST ((LocNavSolutionMask)0x0002) -/**< Bitmask to specify whether SBAS long-tem correction is used */ -#define LOC_NAV_MASK_SBAS_CORRECTION_LONG ((LocNavSolutionMask)0x0004) -/**< Bitmask to specify whether SBAS integrity information is used */ -#define LOC_NAV_MASK_SBAS_INTEGRITY ((LocNavSolutionMask)0x0008) - -typedef uint32_t LocPosDataMask; -/* Bitmask to specify whether Navigation data has Forward Acceleration */ -#define LOC_NAV_DATA_HAS_LONG_ACCEL ((LocPosDataMask)0x0001) -/* Bitmask to specify whether Navigation data has Sideward Acceleration */ -#define LOC_NAV_DATA_HAS_LAT_ACCEL ((LocPosDataMask)0x0002) -/* Bitmask to specify whether Navigation data has Vertical Acceleration */ -#define LOC_NAV_DATA_HAS_VERT_ACCEL ((LocPosDataMask)0x0004) -/* Bitmask to specify whether Navigation data has Heading Rate */ -#define LOC_NAV_DATA_HAS_YAW_RATE ((LocPosDataMask)0x0008) -/* Bitmask to specify whether Navigation data has Body pitch */ -#define LOC_NAV_DATA_HAS_PITCH ((LocPosDataMask)0x0010) - -/** GPS PRN Range */ -#define GPS_SV_PRN_MIN 1 -#define GPS_SV_PRN_MAX 32 -#define GLO_SV_PRN_MIN 65 -#define GLO_SV_PRN_MAX 96 -#define QZSS_SV_PRN_MIN 193 -#define QZSS_SV_PRN_MAX 197 -#define BDS_SV_PRN_MIN 201 -#define BDS_SV_PRN_MAX 235 -#define GAL_SV_PRN_MIN 301 -#define GAL_SV_PRN_MAX 336 - -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_RELIABILITY_NOT_SET = 0, - LOC_RELIABILITY_VERY_LOW = 1, - LOC_RELIABILITY_LOW = 2, - LOC_RELIABILITY_MEDIUM = 3, - LOC_RELIABILITY_HIGH = 4 -}LocReliability; - -typedef struct { - struct timespec apTimeStamp; - /*boottime received from pps-ktimer*/ - float apTimeStampUncertaintyMs; - /* timestamp uncertainty in milli seconds */ -}Gnss_ApTimeStampStructType; - -typedef struct { - uint64_t gps_sv_used_ids_mask; - uint64_t glo_sv_used_ids_mask; - uint64_t gal_sv_used_ids_mask; - uint64_t bds_sv_used_ids_mask; - uint64_t qzss_sv_used_ids_mask; -} GnssSvUsedInPosition; - -/* Body Frame parameters */ -typedef struct { - /** Contains Body frame LocPosDataMask bits. */ - uint32_t bodyFrameDatamask; - /* Forward Acceleration in body frame (m/s2)*/ - float longAccel; - /* Sideward Acceleration in body frame (m/s2)*/ - float latAccel; - /* Vertical Acceleration in body frame (m/s2)*/ - float vertAccel; - /* Heading Rate (Radians/second) */ - float yawRate; - /* Body pitch (Radians) */ - float pitch; -}LocPositionDynamics; - -typedef struct { - - /** Position dilution of precision. - Range: 1 (highest accuracy) to 50 (lowest accuracy) */ - float PDOP; - - /** Horizontal dilution of precision. - Range: 1 (highest accuracy) to 50 (lowest accuracy) */ - float HDOP; - - /** Vertical dilution of precision. - Range: 1 (highest accuracy) to 50 (lowest accuracy) */ - float VDOP; - - /** geometric dilution of precision. - Range: 1 (highest accuracy) to 50 (lowest accuracy) */ - float GDOP; - - /** time dilution of precision. - Range: 1 (highest accuracy) to 50 (lowest accuracy) */ - float TDOP; -}LocExtDOP; - -/* GPS Time structure */ -typedef struct { - - /**< Current GPS week as calculated from midnight, Jan. 6, 1980. \n - - Units: Weeks */ - uint16_t gpsWeek; - - /**< Amount of time into the current GPS week. \n - - Units: Milliseconds */ - uint32_t gpsTimeOfWeekMs; -}GPSTimeStruct; - -/** Represents gps location extended. */ -typedef struct { - /** set to sizeof(GpsLocationExtended) */ - size_t size; - /** Contains GpsLocationExtendedFlags bits. */ - uint32_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; - /* Horizontal Elliptical Uncertainty (Semi-Major Axis) */ - float horUncEllipseSemiMajor; - /* Horizontal Elliptical Uncertainty (Semi-Minor Axis) */ - float horUncEllipseSemiMinor; - /* Elliptical Horizontal Uncertainty Azimuth */ - float horUncEllipseOrientAzimuth; - - Gnss_ApTimeStampStructType timeStamp; - /** Gnss sv used in position data */ - GnssSvUsedInPosition gnss_sv_used_ids; - /** Nav solution mask to indicate sbas corrections */ - LocNavSolutionMask navSolutionMask; - /** Position technology used in computing this fix */ - LocPosTechMask tech_mask; - /** SV Info source used in computing this fix */ - LocSvInfoSource sv_source; - /** Body Frame Dynamics: 4wayAcceleration and pitch set with validity */ - LocPositionDynamics bodyFrameData; - /** GPS Time */ - GPSTimeStruct gpsTime; - /** Elapsed Time */ - int64_t elapsedTime; - /** Dilution of precision associated with this position*/ - LocExtDOP extDOP; -} GpsLocationExtended; - -enum loc_sess_status { - LOC_SESS_SUCCESS, - LOC_SESS_INTERMEDIATE, - LOC_SESS_FAILURE -}; - -// Nmea sentence types mask -typedef uint32_t NmeaSentenceTypesMask; -#define LOC_NMEA_MASK_GGA_V02 ((NmeaSentenceTypesMask)0x00000001) /**< Enable GGA type */ -#define LOC_NMEA_MASK_RMC_V02 ((NmeaSentenceTypesMask)0x00000002) /**< Enable RMC type */ -#define LOC_NMEA_MASK_GSV_V02 ((NmeaSentenceTypesMask)0x00000004) /**< Enable GSV type */ -#define LOC_NMEA_MASK_GSA_V02 ((NmeaSentenceTypesMask)0x00000008) /**< Enable GSA type */ -#define LOC_NMEA_MASK_VTG_V02 ((NmeaSentenceTypesMask)0x00000010) /**< Enable VTG type */ -#define LOC_NMEA_MASK_PQXFI_V02 ((NmeaSentenceTypesMask)0x00000020) /**< Enable PQXFI type */ -#define LOC_NMEA_MASK_PSTIS_V02 ((NmeaSentenceTypesMask)0x00000040) /**< Enable PSTIS type */ -#define LOC_NMEA_MASK_GLGSV_V02 ((NmeaSentenceTypesMask)0x00000080) /**< Enable GLGSV type */ -#define LOC_NMEA_MASK_GNGSA_V02 ((NmeaSentenceTypesMask)0x00000100) /**< Enable GNGSA type */ -#define LOC_NMEA_MASK_GNGNS_V02 ((NmeaSentenceTypesMask)0x00000200) /**< Enable GNGNS type */ -#define LOC_NMEA_MASK_GARMC_V02 ((NmeaSentenceTypesMask)0x00000400) /**< Enable GARMC type */ -#define LOC_NMEA_MASK_GAGSV_V02 ((NmeaSentenceTypesMask)0x00000800) /**< Enable GAGSV type */ -#define LOC_NMEA_MASK_GAGSA_V02 ((NmeaSentenceTypesMask)0x00001000) /**< Enable GAGSA type */ -#define LOC_NMEA_MASK_GAVTG_V02 ((NmeaSentenceTypesMask)0x00002000) /**< Enable GAVTG type */ -#define LOC_NMEA_MASK_GAGGA_V02 ((NmeaSentenceTypesMask)0x00004000) /**< Enable GAGGA type */ -#define LOC_NMEA_MASK_PQGSA_V02 ((NmeaSentenceTypesMask)0x00008000) /**< Enable PQGSA type */ -#define LOC_NMEA_MASK_PQGSV_V02 ((NmeaSentenceTypesMask)0x00010000) /**< Enable PQGSV type */ -#define LOC_NMEA_MASK_DEBUG_V02 ((NmeaSentenceTypesMask)0x00020000) /**< Enable DEBUG type */ - -// all bitmasks of general supported NMEA sentenses - debug is not part of this -#define LOC_NMEA_ALL_GENERAL_SUPPORTED_MASK (LOC_NMEA_MASK_GGA_V02 | LOC_NMEA_MASK_RMC_V02 | \ - LOC_NMEA_MASK_GSV_V02 | LOC_NMEA_MASK_GSA_V02 | LOC_NMEA_MASK_VTG_V02 | \ - LOC_NMEA_MASK_PQXFI_V02 | LOC_NMEA_MASK_PSTIS_V02 | LOC_NMEA_MASK_GLGSV_V02 | \ - LOC_NMEA_MASK_GNGSA_V02 | LOC_NMEA_MASK_GNGNS_V02 | LOC_NMEA_MASK_GARMC_V02 | \ - LOC_NMEA_MASK_GAGSV_V02 | LOC_NMEA_MASK_GAGSA_V02 | LOC_NMEA_MASK_GAVTG_V02 | \ - LOC_NMEA_MASK_GAGGA_V02 | LOC_NMEA_MASK_PQGSA_V02 | LOC_NMEA_MASK_PQGSV_V02) - -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_GNSS_MEASUREMENT_REPORT, //GNSS Measurement Report - LOC_API_ADAPTER_GNSS_SV_POLYNOMIAL_REPORT, //GNSS SV Polynomial 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_REQUEST_SRN_DATA, // request srn data from AP - LOC_API_ADAPTER_REQUEST_POSITION_INJECTION, // Position injection request - LOC_API_ADAPTER_BATCH_STATUS, // batch status - LOC_API_ADAPTER_FDCL_SERVICE_REQ, // FDCL service request - 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_GNSS_MEASUREMENT_REPORT (1<<LOC_API_ADAPTER_GNSS_MEASUREMENT_REPORT) -#define LOC_API_ADAPTER_BIT_GNSS_SV_POLYNOMIAL_REPORT (1<<LOC_API_ADAPTER_GNSS_SV_POLYNOMIAL_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) -#define LOC_API_ADAPTER_BIT_REQUEST_SRN_DATA (1<<LOC_API_ADAPTER_REQUEST_SRN_DATA) -#define LOC_API_ADAPTER_BIT_POSITION_INJECTION_REQUEST (1<<LOC_API_ADAPTER_REQUEST_POSITION_INJECTION) -#define LOC_API_ADAPTER_BIT_BATCH_STATUS (1<<LOC_API_ADAPTER_BATCH_STATUS) -#define LOC_API_ADAPTER_BIT_FDCL_SERVICE_REQ (1ULL<<LOC_API_ADAPTER_FDCL_SERVICE_REQ) - - -typedef uint64_t 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_OUTDOOR_TRIP_BATCHING, // Outdoor Trip Batching - - 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) - -/*++ *********************************************** -** Satellite Measurement and Satellite Polynomial -** Structure definitions -** *********************************************** ---*/ -#define GNSS_SV_POLY_VELOCITY_COEF_MAX_SIZE 12 -#define GNSS_SV_POLY_XYZ_0_TH_ORDER_COEFF_MAX_SIZE 3 -#define GNSS_SV_POLY_XYZ_N_TH_ORDER_COEFF_MAX_SIZE 9 -#define GNSS_SV_POLY_SV_CLKBIAS_COEFF_MAX_SIZE 4 -#define GNSS_LOC_SV_MEAS_LIST_MAX_SIZE 16 - -enum ulp_gnss_sv_measurement_valid_flags{ - - ULP_GNSS_SV_MEAS_GPS_TIME = 0, - ULP_GNSS_SV_MEAS_PSUEDO_RANGE, - ULP_GNSS_SV_MEAS_MS_IN_WEEK, - ULP_GNSS_SV_MEAS_SUB_MSEC, - ULP_GNSS_SV_MEAS_CARRIER_PHASE, - ULP_GNSS_SV_MEAS_DOPPLER_SHIFT, - ULP_GNSS_SV_MEAS_CNO, - ULP_GNSS_SV_MEAS_LOSS_OF_LOCK, - - ULP_GNSS_SV_MEAS_MAX_VALID_FLAGS -}; - -#define ULP_GNSS_SV_MEAS_BIT_GPS_TIME (1<<ULP_GNSS_SV_MEAS_GPS_TIME) -#define ULP_GNSS_SV_MEAS_BIT_PSUEDO_RANGE (1<<ULP_GNSS_SV_MEAS_PSUEDO_RANGE) -#define ULP_GNSS_SV_MEAS_BIT_MS_IN_WEEK (1<<ULP_GNSS_SV_MEAS_MS_IN_WEEK) -#define ULP_GNSS_SV_MEAS_BIT_SUB_MSEC (1<<ULP_GNSS_SV_MEAS_SUB_MSEC) -#define ULP_GNSS_SV_MEAS_BIT_CARRIER_PHASE (1<<ULP_GNSS_SV_MEAS_CARRIER_PHASE) -#define ULP_GNSS_SV_MEAS_BIT_DOPPLER_SHIFT (1<<ULP_GNSS_SV_MEAS_DOPPLER_SHIFT) -#define ULP_GNSS_SV_MEAS_BIT_CNO (1<<ULP_GNSS_SV_MEAS_CNO) -#define ULP_GNSS_SV_MEAS_BIT_LOSS_OF_LOCK (1<<ULP_GNSS_SV_MEAS_LOSS_OF_LOCK) - -enum ulp_gnss_sv_poly_valid_flags{ - - ULP_GNSS_SV_POLY_GLO_FREQ = 0, - ULP_GNSS_SV_POLY_T0, - ULP_GNSS_SV_POLY_IODE, - ULP_GNSS_SV_POLY_FLAG, - ULP_GNSS_SV_POLY_POLYCOEFF_XYZ0, - ULP_GNSS_SV_POLY_POLYCOEFF_XYZN, - ULP_GNSS_SV_POLY_POLYCOEFF_OTHER, - ULP_GNSS_SV_POLY_SV_POSUNC, - ULP_GNSS_SV_POLY_IONODELAY, - ULP_GNSS_SV_POLY_IONODOT, - ULP_GNSS_SV_POLY_SBAS_IONODELAY, - ULP_GNSS_SV_POLY_SBAS_IONODOT, - ULP_GNSS_SV_POLY_TROPODELAY, - ULP_GNSS_SV_POLY_ELEVATION, - ULP_GNSS_SV_POLY_ELEVATIONDOT, - ULP_GNSS_SV_POLY_ELEVATIONUNC, - ULP_GNSS_SV_POLY_VELO_COEFF, - ULP_GNSS_SV_POLY_ENHANCED_IOD, - - ULP_GNSS_SV_POLY_VALID_FLAGS - -}; - -#define ULP_GNSS_SV_POLY_BIT_GLO_FREQ (1<<ULP_GNSS_SV_POLY_GLO_FREQ) -#define ULP_GNSS_SV_POLY_BIT_T0 (1<<ULP_GNSS_SV_POLY_T0) -#define ULP_GNSS_SV_POLY_BIT_IODE (1<<ULP_GNSS_SV_POLY_IODE) -#define ULP_GNSS_SV_POLY_BIT_FLAG (1<<ULP_GNSS_SV_POLY_FLAG) -#define ULP_GNSS_SV_POLY_BIT_POLYCOEFF_XYZ0 (1<<ULP_GNSS_SV_POLY_POLYCOEFF_XYZ0) -#define ULP_GNSS_SV_POLY_BIT_POLYCOEFF_XYZN (1<<ULP_GNSS_SV_POLY_POLYCOEFF_XYZN) -#define ULP_GNSS_SV_POLY_BIT_POLYCOEFF_OTHER (1<<ULP_GNSS_SV_POLY_POLYCOEFF_OTHER) -#define ULP_GNSS_SV_POLY_BIT_SV_POSUNC (1<<ULP_GNSS_SV_POLY_SV_POSUNC) -#define ULP_GNSS_SV_POLY_BIT_IONODELAY (1<<ULP_GNSS_SV_POLY_IONODELAY) -#define ULP_GNSS_SV_POLY_BIT_IONODOT (1<<ULP_GNSS_SV_POLY_IONODOT) -#define ULP_GNSS_SV_POLY_BIT_SBAS_IONODELAY (1<<ULP_GNSS_SV_POLY_SBAS_IONODELAY) -#define ULP_GNSS_SV_POLY_BIT_SBAS_IONODOT (1<<ULP_GNSS_SV_POLY_SBAS_IONODOT) -#define ULP_GNSS_SV_POLY_BIT_TROPODELAY (1<<ULP_GNSS_SV_POLY_TROPODELAY) -#define ULP_GNSS_SV_POLY_BIT_ELEVATION (1<<ULP_GNSS_SV_POLY_ELEVATION) -#define ULP_GNSS_SV_POLY_BIT_ELEVATIONDOT (1<<ULP_GNSS_SV_POLY_ELEVATIONDOT) -#define ULP_GNSS_SV_POLY_BIT_ELEVATIONUNC (1<<ULP_GNSS_SV_POLY_ELEVATIONUNC) -#define ULP_GNSS_SV_POLY_BIT_VELO_COEFF (1<<ULP_GNSS_SV_POLY_VELO_COEFF) -#define ULP_GNSS_SV_POLY_BIT_ENHANCED_IOD (1<<ULP_GNSS_SV_POLY_ENHANCED_IOD) - - -typedef enum -{ - GNSS_LOC_SV_SYSTEM_GPS = 1, - /**< GPS satellite. */ - GNSS_LOC_SV_SYSTEM_GALILEO = 2, - /**< GALILEO satellite. */ - GNSS_LOC_SV_SYSTEM_SBAS = 3, - /**< SBAS satellite. */ - GNSS_LOC_SV_SYSTEM_COMPASS = 4, - /**< COMPASS satellite. */ - GNSS_LOC_SV_SYSTEM_GLONASS = 5, - /**< GLONASS satellite. */ - GNSS_LOC_SV_SYSTEM_BDS = 6, - /**< BDS satellite. */ - GNSS_LOC_SV_SYSTEM_QZSS = 7 - /**< QZSS satellite. */ -} Gnss_LocSvSystemEnumType; - -typedef enum -{ - GNSS_LOC_FREQ_SOURCE_INVALID = 0, - /**< Source of the frequency is invalid */ - GNSS_LOC_FREQ_SOURCE_EXTERNAL = 1, - /**< Source of the frequency is from external injection */ - GNSS_LOC_FREQ_SOURCE_PE_CLK_REPORT = 2, - /**< Source of the frequency is from Navigation engine */ - GNSS_LOC_FREQ_SOURCE_UNKNOWN = 3 - /**< Source of the frequency is unknown */ -} Gnss_LocSourceofFreqEnumType; - -typedef struct -{ - size_t size; - float clockDrift; - /**< Receiver clock Drift \n - - Units: meter per sec \n - */ - float clockDriftUnc; - /**< Receiver clock Drift uncertainty \n - - Units: meter per sec \n - */ - Gnss_LocSourceofFreqEnumType sourceOfFreq; -}Gnss_LocRcvrClockFrequencyInfoStructType; - -typedef struct -{ - size_t size; - uint8_t leapSec; - /**< GPS time leap second delta to UTC time \n - - Units: sec \n - */ - uint8_t leapSecUnc; - /**< Uncertainty for GPS leap second \n - - Units: sec \n - */ -}Gnss_LeapSecondInfoStructType; - -typedef enum -{ - GNSS_LOC_SYS_TIME_BIAS_VALID = 0x01, - /**< System time bias valid */ - GNSS_LOC_SYS_TIME_BIAS_UNC_VALID = 0x02, - /**< System time bias uncertainty valid */ -}Gnss_LocInterSystemBiasValidMaskType; - -typedef struct -{ - size_t size; - uint32_t validMask; - /* Validity mask as per Gnss_LocInterSystemBiasValidMaskType */ - - float timeBias; - /**< System-1 to System-2 Time Bias \n - - Units: msec \n - */ - float timeBiasUnc; - /**< System-1 to System-2 Time Bias uncertainty \n - - Units: msec \n - */ -}Gnss_InterSystemBiasStructType; - - -typedef struct -{ - size_t size; - uint16_t systemWeek; - /**< System week number for GPS, BDS and GAL satellite systems. \n - Set to 65535 when invalid or not available. \n - Not valid for GLONASS system. \n - */ - - uint32_t systemMsec; - /**< System time msec. Time of Week for GPS, BDS, GAL and - Time of Day for GLONASS. - - Units: msec \n - */ - float systemClkTimeBias; - /**< System clock time bias \n - - Units: msec \n - System time = systemMsec - systemClkTimeBias \n - */ - float systemClkTimeUncMs; - /**< Single sided maximum time bias uncertainty \n - - Units: msec \n - */ -}Gnss_LocSystemTimeStructType; - -typedef struct { - - size_t size; - uint8_t gloFourYear; - /**< GLONASS four year number from 1996. Refer to GLONASS ICD.\n - Applicable only for GLONASS and shall be ignored for other constellations. \n - If unknown shall be set to 255 - */ - - uint16_t gloDays; - /**< GLONASS day number in four years. Refer to GLONASS ICD. - Applicable only for GLONASS and shall be ignored for other constellations. \n - If unknown shall be set to 65535 - */ - - uint32_t gloMsec; - /**< GLONASS time of day in msec. Refer to GLONASS ICD. - - Units: msec \n - */ - - float gloClkTimeBias; - /**< System clock time bias (sub-millisecond) \n - - Units: msec \n - System time = systemMsec - systemClkTimeBias \n - */ - - float gloClkTimeUncMs; - /**< Single sided maximum time bias uncertainty \n - - Units: msec \n - */ -}Gnss_LocGloTimeStructType; /* Type */ - -typedef struct { - - size_t size; - uint32_t refFCount; - /**< Receiver frame counter value at reference tick */ - - uint8_t systemRtc_valid; - /**< Validity indicator for System RTC */ - - uint64_t systemRtcMs; - /**< Platform system RTC value \n - - Units: msec \n - */ - - uint32_t sourceOfTime; - /**< Source of time information */ - -}Gnss_LocGnssTimeExtStructType; - - - -typedef enum -{ - GNSS_LOC_MEAS_STATUS_NULL = 0x00000000, - /**< No information state */ - GNSS_LOC_MEAS_STATUS_SM_VALID = 0x00000001, - /**< Code phase is known */ - GNSS_LOC_MEAS_STATUS_SB_VALID = 0x00000002, - /**< Sub-bit time is known */ - GNSS_LOC_MEAS_STATUS_MS_VALID = 0x00000004, - /**< Satellite time is known */ - GNSS_LOC_MEAS_STATUS_BE_CONFIRM = 0x00000008, - /**< Bit edge is confirmed from signal */ - GNSS_LOC_MEAS_STATUS_VELOCITY_VALID = 0x00000010, - /**< Satellite Doppler measured */ - GNSS_LOC_MEAS_STATUS_VELOCITY_FINE = 0x00000020, - /**< TRUE: Fine Doppler measured, FALSE: Coarse Doppler measured */ - GNSS_LOC_MEAS_STATUS_FROM_RNG_DIFF = 0x00000200, - /**< Range update from Satellite differences */ - GNSS_LOC_MEAS_STATUS_FROM_VE_DIFF = 0x00000400, - /**< Doppler update from Satellite differences */ - GNSS_LOC_MEAS_STATUS_DONT_USE_X = 0x00000800, - /**< Don't use measurement if bit is set */ - GNSS_LOC_MEAS_STATUS_DONT_USE_M = 0x000001000, - /**< Don't use measurement if bit is set */ - GNSS_LOC_MEAS_STATUS_DONT_USE_D = 0x000002000, - /**< Don't use measurement if bit is set */ - GNSS_LOC_MEAS_STATUS_DONT_USE_S = 0x000004000, - /**< Don't use measurement if bit is set */ - GNSS_LOC_MEAS_STATUS_DONT_USE_P = 0x000008000 - /**< Don't use measurement if bit is set */ -}Gnss_LocSvMeasStatusMaskType; - -typedef struct -{ - size_t size; - uint32_t svMs; - /**< Satellite time milisecond.\n - For GPS, BDS, GAL range of 0 thru (604800000-1) \n - For GLONASS range of 0 thru (86400000-1) \n - Valid when PD_LOC_MEAS_STATUS_MS_VALID bit is set in measurement status \n - Note: All SV times in the current measurement block are alredy propagated to common reference time epoch. \n - - Units: msec \n - */ - float svSubMs; - /**<Satellite time sub-millisecond. \n - Total SV Time = svMs + svSubMs \n - - Units: msec \n - */ - float svTimeUncMs; - /**< Satellite Time uncertainty \n - - Units: msec \n - */ - float dopplerShift; - /**< Satellite Doppler \n - - Units: meter per sec \n - */ - float dopplerShiftUnc; - /**< Satellite Doppler uncertainty\n - - Units: meter per sec \n - */ -}Gnss_LocSVTimeSpeedStructType; - -typedef enum -{ - GNSS_SV_STATE_IDLE = 0, - GNSS_SV_STATE_SEARCH = 1, - GNSS_SV_STATE_SEARCH_VERIFY = 2, - GNSS_SV_STATE_BIT_EDGE = 3, - GNSS_SV_STATE_VERIFY_TRACK = 4, - GNSS_SV_STATE_TRACK = 5, - GNSS_SV_STATE_RESTART = 6, - GNSS_SV_STATE_DPO_TRACK = 7 -} Gnss_LocSVStateEnumType; - -typedef enum -{ - GNSS_LOC_SVINFO_MASK_HAS_EPHEMERIS = 0x01, - /**< Ephemeris is available for this SV */ - GNSS_LOC_SVINFO_MASK_HAS_ALMANAC = 0x02 - /**< Almanac is available for this SV */ -}Gnss_LocSvInfoMaskT; - -typedef enum -{ - GNSS_LOC_SV_SRCH_STATUS_IDLE = 1, - /**< SV is not being actively processed */ - GNSS_LOC_SV_SRCH_STATUS_SEARCH = 2, - /**< The system is searching for this SV */ - GNSS_LOC_SV_SRCH_STATUS_TRACK = 3 - /**< SV is being tracked */ -}Gnss_LocSvSearchStatusEnumT; - - -typedef struct -{ - size_t size; - uint16_t gnssSvId; - /**< GNSS SV ID. - \begin{itemize1} - \item Range: \begin{itemize1} - \item For GPS: 1 to 32 - \item For GLONASS: 1 to 32 - \item For SBAS: 120 to 151 - \item For BDS: 201 to 237 - \end{itemize1} \end{itemize1} - The GPS and GLONASS SVs can be disambiguated using the system field. - */ - uint8_t gloFrequency; - /**< GLONASS frequency number + 7 \n - Valid only for GLONASS System \n - Shall be ignored for all other systems \n - - Range: 1 to 14 \n - */ - Gnss_LocSvSearchStatusEnumT svStatus; - /**< Satellite search state \n - @ENUM() - */ - bool healthStatus_valid; - /**< SV Health Status validity flag\n - - 0: Not valid \n - - 1: Valid \n - */ - uint8_t healthStatus; - /**< Health status. - \begin{itemize1} - \item Range: 0 to 1; 0 = unhealthy, \n 1 = healthy, 2 = unknown - \vspace{-0.18in} \end{itemize1} - */ - Gnss_LocSvInfoMaskT svInfoMask; - /**< Indicates whether almanac and ephemeris information is available. \n - @MASK() - */ - uint64_t measurementStatus; - /**< Bitmask indicating SV measurement status. - Valid bitmasks: \n - If any MSB bit in 0xFFC0000000000000 DONT_USE is set, the measurement - must not be used by the client. - @MASK() - */ - uint16_t CNo; - /**< Carrier to Noise ratio \n - - Units: 0.1 dBHz \n - */ - uint16_t gloRfLoss; - /**< GLONASS Rf loss reference to Antenna. \n - - Units: dB, Scale: 0.1 \n - */ - bool lossOfLock; - /**< Loss of signal lock indicator \n - - 0: Signal in continuous track \n - - 1: Signal not in track \n - */ - int16_t measLatency; - /**< Age of the measurement. Positive value means measurement precedes ref time. \n - - Units: msec \n - */ - Gnss_LocSVTimeSpeedStructType svTimeSpeed; - /**< Unfiltered SV Time and Speed information - */ - float dopplerAccel; - /**< Satellite Doppler Accelertion\n - - Units: Hz/s \n - */ - bool multipathEstValid; - /**< Multipath estimate validity flag\n - - 0: Multipath estimate not valid \n - - 1: Multipath estimate valid \n - */ - float multipathEstimate; - /**< Estimate of multipath in measurement\n - - Units: Meters \n - */ - bool fineSpeedValid; - /**< Fine speed validity flag\n - - 0: Fine speed not valid \n - - 1: Fine speed valid \n - */ - float fineSpeed; - /**< Carrier phase derived speed \n - - Units: m/s \n - */ - bool fineSpeedUncValid; - /**< Fine speed uncertainty validity flag\n - - 0: Fine speed uncertainty not valid \n - - 1: Fine speed uncertainty valid \n - */ - float fineSpeedUnc; - /**< Carrier phase derived speed \n - - Units: m/s \n - */ - bool carrierPhaseValid; - /**< Carrier Phase measurement validity flag\n - - 0: Carrier Phase not valid \n - - 1: Carrier Phase valid \n - */ - double carrierPhase; - /**< Carrier phase measurement [L1 cycles] \n - */ - bool cycleSlipCountValid; - /**< Cycle slup count validity flag\n - - 0: Not valid \n - - 1: Valid \n - */ - uint8_t cycleSlipCount; - /**< Increments when a CSlip is detected */ - - bool svDirectionValid; - /**< Validity flag for SV direction */ - - float svAzimuth; - /**< Satellite Azimuth - - Units: radians \n - */ - float svElevation; - /**< Satellite Elevation - - Units: radians \n - */ -} Gnss_SVMeasurementStructType; - -/**< Maximum number of satellites in measurement block for given system. */ - -typedef struct -{ - size_t size; - Gnss_LocSvSystemEnumType system; - /**< Specifies the Satellite System Type - */ - bool isSystemTimeValid; - /**< Indicates whether System Time is Valid:\n - - 0x01 (TRUE) -- System Time is valid \n - - 0x00 (FALSE) -- System Time is not valid - */ - Gnss_LocSystemTimeStructType systemTime; - /**< System Time Information \n - */ - bool isGloTime_valid; - Gnss_LocGloTimeStructType gloTime; - - bool isSystemTimeExt_valid; - Gnss_LocGnssTimeExtStructType systemTimeExt; - - uint8_t numSvs; - /* Number of SVs in this report block */ - - Gnss_SVMeasurementStructType svMeasurement[GNSS_LOC_SV_MEAS_LIST_MAX_SIZE]; - /**< Satellite measurement Information \n - */ -} Gnss_ClockMeasurementStructType; - - -typedef struct -{ - size_t size; - uint8_t seqNum; - /**< Current message Number */ - uint8_t maxMessageNum; - /**< Maximum number of message that will be sent for present time epoch. */ - - bool leapSecValid; - Gnss_LeapSecondInfoStructType leapSec; - - Gnss_InterSystemBiasStructType gpsGloInterSystemBias; - - Gnss_InterSystemBiasStructType gpsBdsInterSystemBias; - - Gnss_InterSystemBiasStructType gpsGalInterSystemBias; - - Gnss_InterSystemBiasStructType bdsGloInterSystemBias; - - Gnss_InterSystemBiasStructType galGloInterSystemBias; - - Gnss_InterSystemBiasStructType galBdsInterSystemBias; - - bool clockFreqValid; - Gnss_LocRcvrClockFrequencyInfoStructType clockFreq; /* Freq */ - bool gnssMeasValid; - Gnss_ClockMeasurementStructType gnssMeas; - Gnss_ApTimeStampStructType timeStamp; - -} GnssSvMeasurementSet; - -typedef enum -{ - GNSS_SV_POLY_COEFF_VALID = 0x01, - /**< SV position in orbit coefficients are valid */ - GNSS_SV_POLY_IONO_VALID = 0x02, - /**< Iono estimates are valid */ - - GNSS_SV_POLY_TROPO_VALID = 0x04, - /**< Tropo estimates are valid */ - - GNSS_SV_POLY_ELEV_VALID = 0x08, - /**< Elevation, rate, uncertainty are valid */ - - GNSS_SV_POLY_SRC_ALM_CORR = 0x10, - /**< Polynomials based on XTRA */ - - GNSS_SV_POLY_SBAS_IONO_VALID = 0x20, - /**< SBAS IONO and rate are valid */ - - GNSS_SV_POLY_GLO_STR4 = 0x40 - /**< GLONASS String 4 has been received */ -}Gnss_SvPolyStatusMaskType; - - -typedef struct -{ - size_t size; - uint16_t gnssSvId; - /* GPS: 1-32, GLO: 65-96, 0: Invalid, - SBAS: 120-151, BDS:201-237,GAL:301 to 336 - All others are reserved - */ - int8_t freqNum; - /* Freq index, only valid if u_SysInd is GLO */ - - uint8_t svPolyFlags; - /* Indicate the validity of the elements - as per Gnss_SvPolyStatusMaskType - */ - - uint32_t is_valid; - - uint16_t iode; - /* Ephemeris reference time - GPS:Issue of Data Ephemeris used [unitless]. - GLO: Tb 7-bit, refer to ICD02 - */ - double T0; - /* Reference time for polynominal calculations - GPS: Secs in week. - GLO: Full secs since Jan/01/96 - */ - double polyCoeffXYZ0[GNSS_SV_POLY_XYZ_0_TH_ORDER_COEFF_MAX_SIZE]; - /* C0X, C0Y, C0Z */ - double polyCoefXYZN[GNSS_SV_POLY_XYZ_N_TH_ORDER_COEFF_MAX_SIZE]; - /* C1X, C2X ... C2Z, C3Z */ - float polyCoefOther[GNSS_SV_POLY_SV_CLKBIAS_COEFF_MAX_SIZE]; - /* C0T, C1T, C2T, C3T */ - float svPosUnc; /* SV position uncertainty [m]. */ - float ionoDelay; /* Ionospheric delay at d_T0 [m]. */ - float ionoDot; /* Iono delay rate [m/s]. */ - float sbasIonoDelay;/* SBAS Ionospheric delay at d_T0 [m]. */ - float sbasIonoDot; /* SBAS Iono delay rate [m/s]. */ - float tropoDelay; /* Tropospheric delay [m]. */ - float elevation; /* Elevation [rad] at d_T0 */ - float elevationDot; /* Elevation rate [rad/s] */ - float elevationUnc; /* SV elevation [rad] uncertainty */ - double velCoef[GNSS_SV_POLY_VELOCITY_COEF_MAX_SIZE]; - /* Coefficients of velocity poly */ - uint32_t enhancedIOD; /* Enhanced Reference Time */ -} GnssSvPolynomial; - -/* Various Short Range Node Technology type*/ -typedef enum { - SRN_AP_DATA_TECH_TYPE_NONE, - SRN_AP_DATA_TECH_TYPE_BT, - SRN_AP_DATA_TECH_TYPE_BTLE, - SRN_AP_DATA_TECH_TYPE_NFC, - SRN_AP_DATA_TECH_TYPE_MOBILE_CODE, - SRN_AP_DATA_TECH_TYPE_OTHER -} Gnss_SrnTech; - -/* Mac Address type requested by modem */ -typedef enum { - SRN_AP_DATA_PUBLIC_MAC_ADDR_TYPE_INVALID, /* No valid mac address type send */ - SRN_AP_DATA_PUBLIC_MAC_ADDR_TYPE_PUBLIC, /* SRN AP MAC Address type PUBLIC */ - SRN_AP_DATA_PUBLIC_MAC_ADDR_TYPE_PRIVATE, /* SRN AP MAC Address type PRIVATE */ - SRN_AP_DATA_PUBLIC_MAC_ADDR_TYPE_OTHER, /* SRN AP MAC Address type OTHER */ -}Gnss_Srn_MacAddr_Type; - -typedef struct -{ - size_t size; - Gnss_SrnTech srnTechType; /* SRN Technology type in request */ - bool srnRequest; /* scan - start(true) or stop(false) */ - bool e911Mode; /* If in E911 emergency */ - Gnss_Srn_MacAddr_Type macAddrType; /* SRN AP MAC Address type */ -} GnssSrnDataReq; - -/* - * Represents the status of AGNSS augmented to support IPv4. - */ -struct AGnssExtStatusIpV4 { - AGpsExtType type; - LocAGpsStatusValue status; - /* - * 32-bit IPv4 address. - */ - uint32_t ipV4Addr; -}; - -/* - * Represents the status of AGNSS augmented to support IPv6. - */ -struct AGnssExtStatusIpV6 { - AGpsExtType type; - LocAGpsStatusValue status; - /* - * 128-bit IPv6 address. - */ - uint8_t ipV6Addr[16]; -}; - -/* ODCPI Request Info */ -enum OdcpiRequestType { - ODCPI_REQUEST_TYPE_START, - ODCPI_REQUEST_TYPE_STOP -}; -struct OdcpiRequestInfo { - size_t size; - OdcpiRequestType type; - uint32_t tbfMillis; - bool isEmergencyMode; -}; -/* Callback to send ODCPI request to framework */ -typedef std::function<void(const OdcpiRequestInfo& request)> OdcpiRequestCallback; - -/* - * Callback with AGNSS(IpV4) status information. - * - * @param status Will be of type AGnssExtStatusIpV4. - */ -typedef void (*AgnssStatusIpV4Cb)(AGnssExtStatusIpV4 status); - -/* - * Callback with AGNSS(IpV6) status information. - * - * @param status Will be of type AGnssExtStatusIpV6. - */ -typedef void (*AgnssStatusIpV6Cb)(AGnssExtStatusIpV6 status); - -/* Constructs for interaction with loc_net_iface library */ -typedef void (*LocAgpsOpenResultCb)(bool isSuccess, AGpsExtType agpsType, const char* apn, - AGpsBearerType bearerType, void* userDataPtr); - -typedef void (*LocAgpsCloseResultCb)(bool isSuccess, AGpsExtType agpsType, void* userDataPtr); - -/* Shared resources of LocIpc */ -#define LOC_IPC_HAL "/dev/socket/location/socket_hal" -#define LOC_IPC_XTRA "/dev/socket/location/xtra/socket_xtra" - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* GPS_EXTENDED_C_H */ diff --git a/gps/utils/linked_list.c b/gps/utils/linked_list.c deleted file mode 100644 index 02e1463..0000000 --- a/gps/utils/linked_list.c +++ /dev/null @@ -1,325 +0,0 @@ -/* Copyright (c) 2011, 2014, 2017 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_TAG "LocSvc_utils_ll" - -#include "linked_list.h" -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <stdint.h> -#include <loc_pla.h> -#include <log_util.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*)) -{ - 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) -{ - 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) -{ - 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; -} - diff --git a/gps/utils/linked_list.h b/gps/utils/linked_list.h deleted file mode 100644 index a85f09a..0000000 --- a/gps/utils/linked_list.h +++ /dev/null @@ -1,217 +0,0 @@ -/* Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#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__ */ diff --git a/gps/utils/loc_cfg.cpp b/gps/utils/loc_cfg.cpp deleted file mode 100644 index d7adad1..0000000 --- a/gps/utils/loc_cfg.cpp +++ /dev/null @@ -1,1139 +0,0 @@ -/* Copyright (c) 2011-2015, 2018 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_NDEBUG 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 <pwd.h> -#include <errno.h> -#include <loc_cfg.h> -#include <loc_pla.h> -#include <loc_target.h> -#include <loc_misc_utils.h> -#ifdef USE_GLIB -#include <glib.h> -#endif -#include "log_util.h" - -/*============================================================================= - * - * GLOBAL DATA DECLARATION - * - *============================================================================*/ - -/* Parameter data */ -static uint32_t DEBUG_LEVEL = 0xff; -static uint32_t TIMESTAMP = 0; -static uint32_t LOC_MODEM_EMULATOR = 0; - -/* Parameter spec table */ -static const loc_param_s_type loc_param_table[] = -{ - {"DEBUG_LEVEL", &DEBUG_LEVEL, NULL, 'n'}, - {"TIMESTAMP", &TIMESTAMP, NULL, 'n'}, - {"LOC_MODEM_EMULATOR", &LOC_MODEM_EMULATOR, 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; - -// Reference below arrays wherever needed to avoid duplicating -// same conf path string over and again in location code. -const char LOC_PATH_GPS_CONF[] = LOC_PATH_GPS_CONF_STR; -const char LOC_PATH_IZAT_CONF[] = LOC_PATH_IZAT_CONF_STR; -const char LOC_PATH_FLP_CONF[] = LOC_PATH_FLP_CONF_STR; -const char LOC_PATH_LOWI_CONF[] = LOC_PATH_LOWI_CONF_STR; -const char LOC_PATH_SAP_CONF[] = LOC_PATH_SAP_CONF_STR; -const char LOC_PATH_APDR_CONF[] = LOC_PATH_APDR_CONF_STR; -const char LOC_PATH_XTWIFI_CONF[] = LOC_PATH_XTWIFI_CONF_STR; -const char LOC_PATH_QUIPC_CONF[] = LOC_PATH_QUIPC_CONF_STR; - -/*=========================================================================== -FUNCTION loc_modem_emulator_enabled - -DESCRIPTION - Provides access to Modem Emulator config item. -===========================================================================*/ -uint32_t loc_modem_emulator_enabled() -{ - return LOC_MODEM_EMULATOR; -} - -/*=========================================================================== -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; - - 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); -} - -/*============================================================================= - * - * Define and Structures for Parsing Location Process Configuration File - * - *============================================================================*/ -#define MAX_NUM_STRINGS 20 - -//We can have 8 masks for now -#define CONFIG_MASK_TARGET_ALL 0X01 -#define CONFIG_MASK_TARGET_FOUND 0X02 -#define CONFIG_MASK_TARGET_CHECK 0X03 -#define CONFIG_MASK_BASEBAND_ALL 0X04 -#define CONFIG_MASK_BASEBAND_FOUND 0X08 -#define CONFIG_MASK_BASEBAND_CHECK 0x0c -#define CONFIG_MASK_AUTOPLATFORM_ALL 0x10 -#define CONFIG_MASK_AUTOPLATFORM_FOUND 0x20 -#define CONFIG_MASK_AUTOPLATFORM_CHECK 0x30 - -#define LOC_FEATURE_MASK_GTP_WIFI_BASIC 0x01 -#define LOC_FEATURE_MASK_GTP_WIFI_PREMIUM 0X02 -#define LOC_FEATURE_MASK_GTP_CELL_BASIC 0X04 -#define LOC_FEATURE_MASK_GTP_CELL_PREMIUM 0X08 -#define LOC_FEATURE_MASK_GTP_AP_CELL_BASIC LOC_FEATURE_MASK_GTP_CELL_BASIC -#define LOC_FEATURE_MASK_GTP_AP_CELL_PREMIUM LOC_FEATURE_MASK_GTP_CELL_PREMIUM -#define LOC_FEATURE_MASK_SAP_BASIC 0x40 -#define LOC_FEATURE_MASK_SAP_PREMIUM 0X80 -#define LOC_FEATURE_MASK_GTP_WAA_BASIC 0X100 -#define LOC_FEATURE_MASK_GTP_WAA_PREMIUM 0x200 -#define LOC_FEATURE_MASK_GTP_MODEM_CELL_BASIC 0X400 -#define LOC_FEATURE_MASK_GTP_MODEM_CELL_PREMIUM 0X800 -#define LOC_FEATURE_MASK_ODCPI 0x1000 -#define LOC_FEATURE_MASK_FREE_WIFI_SCAN_INJECT 0x2000 -#define LOC_FEATURE_MASK_SUPL_WIFI 0x4000 -#define LOC_FEATURE_MASK_WIFI_SUPPLICANT_INFO 0x8000 - -typedef struct { - char proc_name[LOC_MAX_PARAM_STRING]; - char proc_argument[LOC_MAX_PARAM_STRING]; - char proc_status[LOC_MAX_PARAM_STRING]; - char group_list[LOC_MAX_PARAM_STRING]; - unsigned int premium_feature; - unsigned int loc_feature_mask; - char platform_list[LOC_MAX_PARAM_STRING]; - char baseband[LOC_MAX_PARAM_STRING]; - unsigned int sglte_target; - char feature_gtp_cell_proc[LOC_MAX_PARAM_STRING]; - char feature_gtp_waa[LOC_MAX_PARAM_STRING]; - char feature_gtp_cell[LOC_MAX_PARAM_STRING]; - char feature_gtp_wifi[LOC_MAX_PARAM_STRING]; - char feature_sap[LOC_MAX_PARAM_STRING]; - char feature_odcpi[LOC_MAX_PARAM_STRING]; - char feature_free_wifi_scan_inject[LOC_MAX_PARAM_STRING]; - char feature_supl_wifi[LOC_MAX_PARAM_STRING]; - char feature_wifi_supplicant_info[LOC_MAX_PARAM_STRING]; - char auto_platform[LOC_MAX_PARAM_STRING]; -} loc_launcher_conf; - -/* process configuration parameters */ -static loc_launcher_conf conf; - -/* gps.conf Parameter spec table */ -static const loc_param_s_type gps_conf_parameter_table[] = { - {"SGLTE_TARGET", &conf.sglte_target, NULL, 'n'}, -}; - -/* location feature conf, e.g.: izat.conf feature mode table*/ -static const loc_param_s_type loc_feature_conf_table[] = { - {"GTP_CELL_PROC", &conf.feature_gtp_cell_proc, NULL, 's'}, - {"GTP_CELL", &conf.feature_gtp_cell, NULL, 's'}, - {"GTP_WIFI", &conf.feature_gtp_wifi, NULL, 's'}, - {"GTP_WAA", &conf.feature_gtp_waa, NULL, 's'}, - {"SAP", &conf.feature_sap, NULL, 's'}, - {"ODCPI", &conf.feature_odcpi, NULL, 's'}, - {"FREE_WIFI_SCAN_INJECT", &conf.feature_free_wifi_scan_inject, NULL, 's'}, - {"SUPL_WIFI", &conf.feature_supl_wifi, NULL, 's'}, - {"WIFI_SUPPLICANT_INFO", &conf.feature_wifi_supplicant_info, NULL, 's'}, -}; - -/* location process conf, e.g.: izat.conf Parameter spec table */ -static const loc_param_s_type loc_process_conf_parameter_table[] = { - {"PROCESS_NAME", &conf.proc_name, NULL, 's'}, - {"PROCESS_ARGUMENT", &conf.proc_argument, NULL, 's'}, - {"PROCESS_STATE", &conf.proc_status, NULL, 's'}, - {"PROCESS_GROUPS", &conf.group_list, NULL, 's'}, - {"PREMIUM_FEATURE", &conf.premium_feature, NULL, 'n'}, - {"IZAT_FEATURE_MASK", &conf.loc_feature_mask, NULL, 'n'}, - {"PLATFORMS", &conf.platform_list, NULL, 's'}, - {"BASEBAND", &conf.baseband, NULL, 's'}, - {"HARDWARE_TYPE", &conf.auto_platform, NULL, 's'}, -}; - -/*=========================================================================== -FUNCTION loc_read_process_conf - -DESCRIPTION - Parse the specified conf file and return info for the processes defined. - The format of the file should conform with izat.conf. - -PARAMETERS: - conf_file_name: configuration file to read - process_count_ptr: pointer to store number of processes defined in the conf file. - process_info_table_ptr: pointer to store the process info table. - -DEPENDENCIES - The file must be in izat.conf format. - -RETURN VALUE - 0: success - none-zero: failure - -SIDE EFFECTS - N/A - -NOTES: - On success, memory pointed by (*process_info_table_ptr) must be freed. -===========================================================================*/ -int loc_read_process_conf(const char* conf_file_name, uint32_t * process_count_ptr, - loc_process_info_s_type** process_info_table_ptr) { - loc_process_info_s_type *child_proc = nullptr; - volatile int i=0; - unsigned int j=0; - gid_t gid_list[LOC_PROCESS_MAX_NUM_GROUPS]; - char *split_strings[MAX_NUM_STRINGS]; - int name_length=0, group_list_length=0, platform_length=0, baseband_length=0, ngroups=0, ret=0; - int auto_platform_length = 0; - int group_index=0, nstrings=0, status_length=0; - FILE* conf_fp = nullptr; - char platform_name[PROPERTY_VALUE_MAX], baseband_name[PROPERTY_VALUE_MAX]; - char autoplatform_name[PROPERTY_VALUE_MAX]; - unsigned int loc_service_mask=0; - char config_mask = 0; - unsigned char proc_list_length=0; - int gtp_cell_ap_enabled = 0; - char arg_gtp_waa[LOC_PROCESS_MAX_ARG_STR_LENGTH] = "--"; - char arg_gtp_ap_cell[LOC_PROCESS_MAX_ARG_STR_LENGTH] = "--"; - char arg_gtp_modem_cell[LOC_PROCESS_MAX_ARG_STR_LENGTH] = "--"; - char arg_gtp_wifi[LOC_PROCESS_MAX_ARG_STR_LENGTH] = "--"; - char arg_sap[LOC_PROCESS_MAX_ARG_STR_LENGTH] = "--"; - char arg_disabled[LOC_PROCESS_MAX_ARG_STR_LENGTH] = LOC_FEATURE_MODE_DISABLED; - char arg_basic[LOC_PROCESS_MAX_ARG_STR_LENGTH] = LOC_FEATURE_MODE_BASIC; - char arg_premium[LOC_PROCESS_MAX_ARG_STR_LENGTH] = LOC_FEATURE_MODE_PREMIUM; - - if (process_count_ptr == NULL || process_info_table_ptr == NULL) { - return -1; - } - - //Read gps.conf and fill parameter table - UTIL_READ_CONF(LOC_PATH_GPS_CONF, gps_conf_parameter_table); - - //Form argument strings - strlcat(arg_gtp_waa, LOC_FEATURE_GTP_WAA, LOC_PROCESS_MAX_ARG_STR_LENGTH-3); - strlcat(arg_gtp_ap_cell, LOC_FEATURE_GTP_AP_CELL, LOC_PROCESS_MAX_ARG_STR_LENGTH-3); - strlcat(arg_gtp_modem_cell, LOC_FEATURE_GTP_MODEM_CELL, LOC_PROCESS_MAX_ARG_STR_LENGTH-3); - strlcat(arg_gtp_wifi, LOC_FEATURE_GTP_WIFI, LOC_PROCESS_MAX_ARG_STR_LENGTH-3); - strlcat(arg_sap, LOC_FEATURE_SAP, LOC_PROCESS_MAX_ARG_STR_LENGTH-3); - - //Get platform name from ro.board.platform property - loc_get_platform_name(platform_name, sizeof(platform_name)); - //Get baseband name from ro.baseband property - loc_get_target_baseband(baseband_name, sizeof(baseband_name)); - //Identify if this is an automotive platform - loc_get_auto_platform_name(autoplatform_name,sizeof(autoplatform_name)); - - UTIL_READ_CONF(conf_file_name, loc_feature_conf_table); - - //Set service mask for GTP_WIFI - if(strcmp(conf.feature_gtp_wifi, "DISABLED") == 0) { - LOC_LOGD("%s:%d]: GTP WIFI DISABLED", __func__, __LINE__); - } - else if(strcmp(conf.feature_gtp_wifi, "BASIC") == 0) { - LOC_LOGD("%s:%d]: Setting GTP WIFI to mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_GTP_WIFI_BASIC; - } - //conf file has a garbage value - else { - LOC_LOGE("%s:%d]: Unrecognized value for GTP WIFI Mode."\ - " Setting GTP WIFI to default mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_GTP_WIFI_BASIC; - } - - //Set service mask for GTP_CELL - //Using a temp variable here to indicate wheter GTP cell is - //enabled on the AP or modem. This variable will be used in - //further checks below. An alternative was to compare the - //string again in each place which would've been more expensive - if(strcmp(conf.feature_gtp_cell_proc, "AP") == 0) { - gtp_cell_ap_enabled = 1; - } - - if(strcmp(conf.feature_gtp_cell, "PREMIUM") == 0) { - LOC_LOGE("%s:%d]: Error: location feature GTP CELL does not support PREMIUM mode" \ - " available modes are BASIC and DISABLED. Starting feature in BASIC mode", - __func__, __LINE__); - if(gtp_cell_ap_enabled) { - loc_service_mask |= LOC_FEATURE_MASK_GTP_AP_CELL_BASIC; - } - else { - loc_service_mask |= LOC_FEATURE_MASK_GTP_MODEM_CELL_BASIC; - } - } - else if(strcmp(conf.feature_gtp_cell, "BASIC") == 0) { - LOC_LOGD("%s:%d]: Setting GTP CELL to mode: BASIC", __func__, __LINE__); - if(gtp_cell_ap_enabled) { - loc_service_mask |= LOC_FEATURE_MASK_GTP_AP_CELL_BASIC; - } - else { - loc_service_mask |= LOC_FEATURE_MASK_GTP_MODEM_CELL_BASIC; - } - } - else if(strcmp(conf.feature_gtp_cell, "DISABLED") == 0) { - LOC_LOGD("%s:%d]: GTP CELL DISABLED", __func__, __LINE__); - } - //conf file has a garbage value - else { - LOC_LOGE("%s:%d]: Unrecognized value for GTP CELL Mode." \ - " Setting GTP CELL to default mode: BASIC", __func__, __LINE__); - if(gtp_cell_ap_enabled) { - loc_service_mask |= LOC_FEATURE_MASK_GTP_AP_CELL_BASIC; - } - else { - loc_service_mask |= LOC_FEATURE_MASK_GTP_MODEM_CELL_BASIC; - } - } - - //Set service mask for GTP_WAA - if(strcmp(conf.feature_gtp_waa, "PREMIUM") == 0) { - LOC_LOGE("%s:%d]: Error: location feature GTP WAA does not support PREMIUM mode" \ - " available modes are BASIC and DISABLED. Starting feature in BASIC mode", - __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_GTP_WAA_BASIC; - } - else if(strcmp(conf.feature_gtp_waa, "BASIC") == 0) { - LOC_LOGD("%s:%d]: Setting GTP WAA to mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_GTP_WAA_BASIC; - } - else if(strcmp(conf.feature_gtp_waa, "DISABLED") == 0) { - LOC_LOGD("%s:%d]: GTP WAA DISABLED", __func__, __LINE__); - } - //conf file has a garbage value - else { - LOC_LOGE("%s:%d]: Unrecognized value for GTP WAA Mode."\ - " Setting GTP WAA to default mode: DISABLED", __func__, __LINE__); - } - - //Set service mask for SAP - if(strcmp(conf.feature_sap, "PREMIUM") == 0) { - LOC_LOGD("%s:%d]: Setting SAP to mode: PREMIUM", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_SAP_PREMIUM; - } - else if(strcmp(conf.feature_sap, "BASIC") == 0) { - LOC_LOGD("%s:%d]: Setting SAP to mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_SAP_BASIC; - } - else if(strcmp(conf.feature_sap, "DISABLED") == 0) { - LOC_LOGD("%s:%d]: Setting SAP to mode: DISABLED", __func__, __LINE__); - } - else { - LOC_LOGE("%s:%d]: Unrecognized value for SAP Mode."\ - " Setting SAP to default mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_SAP_BASIC; - } - - // Set service mask for ODCPI - if(strcmp(conf.feature_odcpi, "BASIC") == 0) { - LOC_LOGD("%s:%d]: Setting ODCPI to mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_ODCPI; - } - else if(strcmp(conf.feature_odcpi, "DISABLED") == 0) { - LOC_LOGD("%s:%d]: Setting ODCPI to mode: DISABLED", __func__, __LINE__); - } - else if(strcmp(conf.feature_odcpi, "PREMIUM") == 0) { - LOC_LOGD("%s:%d]: Unrecognized value for ODCPI mode."\ - "Setting ODCPI to default mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_ODCPI; - } - - // Set service mask for FREE_WIFI_SCAN_INJECT - if(strcmp(conf.feature_free_wifi_scan_inject, "BASIC") == 0) { - LOC_LOGD("%s:%d]: Setting FREE_WIFI_SCAN_INJECT to mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_FREE_WIFI_SCAN_INJECT; - } - else if(strcmp(conf.feature_free_wifi_scan_inject, "DISABLED") == 0) { - LOC_LOGD("%s:%d]: Setting FREE_WIFI_SCAN_INJECT to mode: DISABLED", __func__, __LINE__); - } - else if(strcmp(conf.feature_free_wifi_scan_inject, "PREMIUM") == 0) { - LOC_LOGD("%s:%d]: Unrecognized value for FREE_WIFI_SCAN_INJECT mode."\ - "Setting FREE_WIFI_SCAN_INJECT to default mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_FREE_WIFI_SCAN_INJECT; - } - - // Set service mask for SUPL_WIFI - if(strcmp(conf.feature_supl_wifi, "BASIC") == 0) { - LOC_LOGD("%s:%d]: Setting SUPL_WIFI to mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_SUPL_WIFI; - } - else if(strcmp(conf.feature_supl_wifi, "DISABLED") == 0) { - LOC_LOGD("%s:%d]: Setting SUPL_WIFI to mode: DISABLED", __func__, __LINE__); - } - else if(strcmp(conf.feature_supl_wifi, "PREMIUM") == 0) { - LOC_LOGD("%s:%d]: Unrecognized value for SUPL_WIFI mode."\ - "Setting SUPL_WIFI to default mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_SUPL_WIFI; - } - - // Set service mask for WIFI_SUPPLICANT_INFO - if(strcmp(conf.feature_wifi_supplicant_info, "BASIC") == 0) { - LOC_LOGD("%s:%d]: Setting WIFI_SUPPLICANT_INFO to mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_WIFI_SUPPLICANT_INFO; - } - else if(strcmp(conf.feature_wifi_supplicant_info, "DISABLED") == 0) { - LOC_LOGD("%s:%d]: Setting WIFI_SUPPLICANT_INFO to mode: DISABLED", __func__, __LINE__); - } - else if(strcmp(conf.feature_wifi_supplicant_info, "PREMIUM") == 0) { - LOC_LOGD("%s:%d]: Unrecognized value for WIFI_SUPPLICANT_INFO mode."\ - "Setting LOC_FEATURE_MASK_WIFI_SUPPLICANT_INFO to default mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_WIFI_SUPPLICANT_INFO; - } - - LOC_LOGD("%s:%d]: loc_service_mask: %x\n", __func__, __LINE__, loc_service_mask); - - if((conf_fp = fopen(conf_file_name, "r")) == NULL) { - LOC_LOGE("%s:%d]: Error opening %s %s\n", __func__, - __LINE__, conf_file_name, strerror(errno)); - ret = -1; - goto err; - } - - //Parse through the file to find out how many processes are to be launched - proc_list_length = 0; - do { - conf.proc_name[0] = 0; - //Here note that the 3rd parameter is passed as 1. - //This is so that only the first parameter in the table which is "PROCESS_NAME" - //is read. We do not want to read the entire block of parameters at this time - //since we are only counting the number of processes to launch. - //Therefore, only counting the occurrences of PROCESS_NAME parameter - //should suffice - if(loc_read_conf_r(conf_fp, loc_process_conf_parameter_table, 1)) { - LOC_LOGE("%s:%d]: Unable to read conf file. Failing\n", __func__, __LINE__); - ret = -1; - goto err; - } - name_length=(int)strlen(conf.proc_name); - if(name_length) { - proc_list_length++; - LOC_LOGD("Process name:%s", conf.proc_name); - } - } while(name_length); - LOC_LOGD("Process cnt = %d", proc_list_length); - - child_proc = (loc_process_info_s_type *)calloc(proc_list_length, sizeof(loc_process_info_s_type)); - if(child_proc == NULL) { - LOC_LOGE("%s:%d]: ERROR: Malloc returned NULL\n", __func__, __LINE__); - ret = -1; - goto err; - } - - //Move file descriptor to the beginning of the file - //so that the parameters can be read - rewind(conf_fp); - - for(j=0; j<proc_list_length; j++) { - //Set defaults for all the child process structs - child_proc[j].proc_status = DISABLED; - memset(child_proc[j].group_list, 0, sizeof(child_proc[j].group_list)); - config_mask=0; - if(loc_read_conf_r(conf_fp, loc_process_conf_parameter_table, - sizeof(loc_process_conf_parameter_table)/sizeof(loc_process_conf_parameter_table[0]))) { - LOC_LOGE("%s:%d]: Unable to read conf file. Failing\n", __func__, __LINE__); - ret = -1; - goto err; - } - - name_length=(int)strlen(conf.proc_name); - group_list_length=(int)strlen(conf.group_list); - platform_length = (int)strlen(conf.platform_list); - baseband_length = (int)strlen(conf.baseband); - status_length = (int)strlen(conf.proc_status); - auto_platform_length = (int)strlen(conf.auto_platform); - - if(!name_length || !group_list_length || !platform_length || - !baseband_length || !status_length || !auto_platform_length) { - LOC_LOGE("%s:%d]: Error: i: %d; One of the parameters not specified in conf file", - __func__, __LINE__, i); - continue; - } - - if(strcmp(conf.proc_status, "DISABLED") == 0) { - LOC_LOGD("%s:%d]: Process %s is disabled in conf file", - __func__, __LINE__, conf.proc_name); - child_proc[j].proc_status = DISABLED_FROM_CONF; - continue; - } - else if(strcmp(conf.proc_status, "ENABLED") == 0) { - LOC_LOGD("%s:%d]: Process %s is enabled in conf file", - __func__, __LINE__, conf.proc_name); - } - - //Since strlcpy copies length-1 characters, we add 1 to name_length - if((name_length+1) > LOC_MAX_PARAM_STRING) { - LOC_LOGE("%s:%d]: i: %d; Length of name parameter too long. Max length: %d", - __func__, __LINE__, i, LOC_MAX_PARAM_STRING); - continue; - } - strlcpy(child_proc[j].name[0], conf.proc_name, sizeof (child_proc[j].name[0])); - - child_proc[j].num_groups = 0; - ngroups = loc_util_split_string(conf.group_list, split_strings, MAX_NUM_STRINGS, ' '); -#ifdef __ANDROID__ - for(i=0; i<ngroups; i++) { - struct passwd* pwd = getpwnam(split_strings[i]); - if (pwd) { - child_proc[j].group_list[i] = pwd->pw_gid; - child_proc[j].num_groups++; - LOC_LOGD("%s:%d]:Group %s = %d matches child_group: %d\n", - __func__, __LINE__, split_strings[i], - pwd->pw_gid,child_proc[j].group_list[i]); - } - } -#endif - nstrings = loc_util_split_string(conf.platform_list, split_strings, MAX_NUM_STRINGS, ' '); - if(strcmp("all", split_strings[0]) == 0) { - if (nstrings == 1 || (nstrings == 2 && (strcmp("exclude", split_strings[1]) == 0))) { - LOC_LOGD("%s:%d]: Enabled for all targets\n", __func__, __LINE__); - config_mask |= CONFIG_MASK_TARGET_ALL; - } - else if (nstrings > 2 && (strcmp("exclude", split_strings[1]) == 0)) { - config_mask |= CONFIG_MASK_TARGET_FOUND; - for (i=2; i<nstrings; i++) { - if(strcmp(platform_name, split_strings[i]) == 0) { - LOC_LOGD("%s:%d]: Disabled platform %s\n", __func__, __LINE__, platform_name); - config_mask &= ~CONFIG_MASK_TARGET_FOUND; - break; - } - } - } - } - else { - for(i=0; i<nstrings; i++) { - if(strcmp(platform_name, split_strings[i]) == 0) { - LOC_LOGD("%s:%d]: Matched platform: %s\n", - __func__, __LINE__, split_strings[i]); - config_mask |= CONFIG_MASK_TARGET_FOUND; - break; - } - } - } - - nstrings = loc_util_split_string(conf.baseband, split_strings, MAX_NUM_STRINGS, ' '); - if(strcmp("all", split_strings[0]) == 0) { - if (nstrings == 1 || (nstrings == 2 && (strcmp("exclude", split_strings[1]) == 0))) { - LOC_LOGD("%s:%d]: Enabled for all basebands\n", __func__, __LINE__); - config_mask |= CONFIG_MASK_BASEBAND_ALL; - } - else if (nstrings > 2 && (strcmp("exclude", split_strings[1]) == 0)) { - config_mask |= CONFIG_MASK_BASEBAND_FOUND; - for (i=2; i<nstrings; i++) { - if(strcmp(baseband_name, split_strings[i]) == 0) { - LOC_LOGD("%s:%d]: Disabled band %s\n", __func__, __LINE__, baseband_name); - config_mask &= ~CONFIG_MASK_BASEBAND_FOUND; - break; - } - } - } - } - else { - for(i=0; i<nstrings; i++) { - if(strcmp(baseband_name, split_strings[i]) == 0) { - LOC_LOGD("%s:%d]: Matched baseband: %s\n", - __func__, __LINE__, split_strings[i]); - config_mask |= CONFIG_MASK_BASEBAND_FOUND; - break; - } - //Since ro.baseband is not a reliable source for detecting sglte - //the alternative is to read the SGLTE_TARGET parameter from gps.conf - //this parameter is read into conf_sglte_target - else if((strcmp("sglte", split_strings[i]) == 0 ) && conf.sglte_target) { - LOC_LOGD("%s:%d]: Matched baseband SGLTE\n", __func__, __LINE__); - config_mask |= CONFIG_MASK_BASEBAND_FOUND; - break; - } - } - } - - nstrings = loc_util_split_string(conf.auto_platform, split_strings, MAX_NUM_STRINGS, ' '); - if(strcmp("all", split_strings[0]) == 0) { - LOC_LOGD("%s:%d]: Enabled for all auto platforms\n", __func__, __LINE__); - config_mask |= CONFIG_MASK_AUTOPLATFORM_ALL; - } - else { - for(i=0; i<nstrings; i++) { - if(strcmp(autoplatform_name, split_strings[i]) == 0) { - LOC_LOGD("%s:%d]: Matched auto platform: %s\n", - __func__, __LINE__, split_strings[i]); - config_mask |= CONFIG_MASK_AUTOPLATFORM_FOUND; - break; - } - } - } - - if((config_mask & CONFIG_MASK_TARGET_CHECK) && - (config_mask & CONFIG_MASK_BASEBAND_CHECK) && - (config_mask & CONFIG_MASK_AUTOPLATFORM_CHECK) && - (child_proc[j].proc_status != DISABLED_FROM_CONF)) { - - //Set args - //The first argument passed through argv is usually the name of the - //binary when started from commandline. - //getopt() seems to ignore this first argument and hence we assign it - //to the process name for consistency with command line args - i = 0; - char* temp_arg = ('/' == child_proc[j].name[0][0]) ? - (strrchr(child_proc[j].name[0], '/') + 1) : child_proc[j].name[0]; - strlcpy (child_proc[j].args[i++], temp_arg, sizeof (child_proc[j].args[i++])); - - if(conf.premium_feature) { - if(conf.loc_feature_mask & loc_service_mask) { - LOC_LOGD("%s:%d]: Enabled. %s has service mask: %x\n", - __func__, __LINE__, child_proc[j].name[0], conf.loc_feature_mask); - child_proc[j].proc_status = ENABLED; - - if(conf.loc_feature_mask & - (LOC_FEATURE_MASK_GTP_WIFI_BASIC | LOC_FEATURE_MASK_GTP_WIFI_PREMIUM)) { - if(loc_service_mask & LOC_FEATURE_MASK_GTP_WIFI_BASIC) { - strlcpy(child_proc[j].args[i++], arg_gtp_wifi, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_basic, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - } - else if(loc_service_mask & LOC_FEATURE_MASK_GTP_WIFI_PREMIUM) { - strlcpy(child_proc[j].args[i++], arg_gtp_wifi, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_premium, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - } - else - { - strlcpy(child_proc[j].args[i++], arg_gtp_wifi, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_disabled, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - } - } - if(conf.loc_feature_mask & - (LOC_FEATURE_MASK_GTP_CELL_BASIC | LOC_FEATURE_MASK_GTP_CELL_PREMIUM )) { - if(loc_service_mask & LOC_FEATURE_MASK_GTP_AP_CELL_BASIC){ - strlcpy(child_proc[j].args[i++], arg_gtp_ap_cell, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_basic, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_gtp_modem_cell, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_disabled, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - } - else if(loc_service_mask & LOC_FEATURE_MASK_GTP_AP_CELL_PREMIUM){ - strlcpy(child_proc[j].args[i++], arg_gtp_ap_cell, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_premium, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_gtp_modem_cell, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_disabled, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - } - else if(loc_service_mask & LOC_FEATURE_MASK_GTP_MODEM_CELL_BASIC) { - strlcpy(child_proc[j].args[i++], arg_gtp_modem_cell, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_basic, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_gtp_ap_cell, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_disabled, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - } - else if(loc_service_mask & LOC_FEATURE_MASK_GTP_MODEM_CELL_PREMIUM) { - strlcpy(child_proc[j].args[i++], arg_gtp_modem_cell, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_premium, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_gtp_ap_cell, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_disabled, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - } - else { - strlcpy(child_proc[j].args[i++], arg_gtp_ap_cell, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_disabled, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_gtp_modem_cell, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_disabled, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - } - } - if(conf.loc_feature_mask & - (LOC_FEATURE_MASK_GTP_WAA_BASIC | LOC_FEATURE_MASK_GTP_WAA_PREMIUM)) { - if(loc_service_mask & LOC_FEATURE_MASK_GTP_WAA_BASIC) { - strlcpy(child_proc[j].args[i++], arg_gtp_waa, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_basic, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - } - else if(loc_service_mask & LOC_FEATURE_MASK_GTP_WAA_PREMIUM) { - strlcpy(child_proc[j].args[i++], arg_gtp_waa, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_premium, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - } - else - { - strlcpy(child_proc[j].args[i++], arg_gtp_waa, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_disabled, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - } - } - if(conf.loc_feature_mask & - (LOC_FEATURE_MASK_SAP_BASIC | LOC_FEATURE_MASK_SAP_PREMIUM)) { - if(loc_service_mask & LOC_FEATURE_MASK_SAP_BASIC) { - strlcpy(child_proc[j].args[i++], arg_sap, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_basic, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - } - else if(loc_service_mask & LOC_FEATURE_MASK_SAP_PREMIUM) { - strlcpy(child_proc[j].args[i++], arg_sap, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_premium, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - } - else - { - strlcpy(child_proc[j].args[i++], arg_sap, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - strlcpy(child_proc[j].args[i++], arg_disabled, - LOC_PROCESS_MAX_ARG_STR_LENGTH); - } - } - IF_LOC_LOGD { - LOC_LOGD("%s:%d]: %s args\n", __func__, __LINE__, child_proc[j].name[0]); - for(unsigned int k=0; k<LOC_PROCESS_MAX_NUM_ARGS; k++) { - if(child_proc[j].args[k][0] != '\0') { - LOC_LOGD("%s:%d]: k: %d, %s\n", __func__, __LINE__, k, - child_proc[j].args[k]); - } - } - LOC_LOGD("%s:%d]: \n", __func__, __LINE__); - } - } - else { - LOC_LOGD("%s:%d]: Disabled. %s has service mask: %x \n", - __func__, __LINE__, child_proc[j].name[0], conf.loc_feature_mask); - } - } - else { - LOC_LOGD("%s:%d]: %s not a premium feature. Enabled\n", - __func__, __LINE__, child_proc[j].name[0]); - child_proc[j].proc_status = ENABLED; - } - - /*Fill up the remaining arguments from configuration file*/ - LOC_LOGD("%s] Parsing Process_Arguments from Configuration: %s \n", - __func__, conf.proc_argument); - if(0 != conf.proc_argument[0]) - { - /************************************** - ** conf_proc_argument is shared by all the programs getting launched, - ** hence copy to process specific argument string and parse the same. - ***************************************/ - strlcpy(child_proc[j].argumentString, conf.proc_argument, - sizeof(child_proc[j].argumentString)); - char *temp_args[LOC_PROCESS_MAX_NUM_ARGS]; - memset (temp_args, 0, sizeof (temp_args)); - loc_util_split_string(child_proc[j].argumentString, &temp_args[i], - (LOC_PROCESS_MAX_NUM_ARGS - i), ' '); - // copy argument from the pointer to the memory - for (unsigned int index = i; index < LOC_PROCESS_MAX_NUM_ARGS; index++) { - if (temp_args[index] == NULL) { - break; - } - strlcpy (child_proc[j].args[index], temp_args[index], - sizeof (child_proc[j].args[index])); - } - } - } - else { - LOC_LOGD("%s:%d]: Process %s is disabled\n", - __func__, __LINE__, child_proc[j].name[0]); - } - } - -err: - if (conf_fp) { - fclose(conf_fp); - } - if (ret != 0) { - LOC_LOGE("%s:%d]: ret: %d", __func__, __LINE__, ret); - if (child_proc) { - free (child_proc); - child_proc = nullptr; - } - *process_count_ptr = 0; - *process_info_table_ptr = nullptr; - - } - else { - *process_count_ptr = proc_list_length; - *process_info_table_ptr = child_proc; - } - - return ret; -} diff --git a/gps/utils/loc_cfg.h b/gps/utils/loc_cfg.h deleted file mode 100644 index 652d86e..0000000 --- a/gps/utils/loc_cfg.h +++ /dev/null @@ -1,142 +0,0 @@ -/* Copyright (c) 2011-2015, 2018 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> -#include <sys/types.h> -#include <unistd.h> -#include <grp.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 LOC_FEATURE_MODE_DISABLED "DISABLED" -#define LOC_FEATURE_MODE_BASIC "BASIC" -#define LOC_FEATURE_MODE_PREMIUM "PREMIUM" - -#define LOC_FEATURE_GTP_AP_CELL "gtp-ap-cell" -#define LOC_FEATURE_GTP_MODEM_CELL "gtp-modem-cell" -#define LOC_FEATURE_GTP_CELL_ENH "gtp-cell-enh" -#define LOC_FEATURE_GTP_WIFI "gtp-wifi" -#define LOC_FEATURE_GTP_WAA "gtp-waa" -#define LOC_FEATURE_SAP "sap" - -#define LOC_PROCESS_MAX_NUM_GROUPS 20 -#define LOC_PROCESS_MAX_NUM_ARGS 25 -#define LOC_PROCESS_MAX_ARG_STR_LENGTH 32 - -#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; /* indicate value set by config file */ - char param_type; /* 'n' for number, - 's' for string, - 'f' for double */ -} loc_param_s_type; - -typedef enum { - ENABLED, - RUNNING, - DISABLED, - DISABLED_FROM_CONF -} loc_process_e_status; - -typedef struct { - loc_process_e_status proc_status; - pid_t proc_id; - char name[2][LOC_MAX_PARAM_STRING]; - gid_t group_list[LOC_PROCESS_MAX_NUM_GROUPS]; - unsigned char num_groups; - char args[LOC_PROCESS_MAX_NUM_ARGS][LOC_PROCESS_MAX_ARG_STR_LENGTH]; - char argumentString[LOC_MAX_PARAM_STRING]; -} loc_process_info_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); - -// Below are the location conf file paths -extern const char LOC_PATH_GPS_CONF[]; -extern const char LOC_PATH_IZAT_CONF[]; -extern const char LOC_PATH_FLP_CONF[]; -extern const char LOC_PATH_LOWI_CONF[]; -extern const char LOC_PATH_SAP_CONF[]; -extern const char LOC_PATH_APDR_CONF[]; -extern const char LOC_PATH_XTWIFI_CONF[]; -extern const char LOC_PATH_QUIPC_CONF[]; - -int loc_read_process_conf(const char* conf_file_name, uint32_t * process_count_ptr, - loc_process_info_s_type** process_info_table_ptr); - -uint32_t loc_modem_emulator_enabled(); - -#ifdef __cplusplus -} -#endif - -#endif /* LOC_CFG_H */ diff --git a/gps/utils/loc_gps.h b/gps/utils/loc_gps.h deleted file mode 100644 index 5e915a3..0000000 --- a/gps/utils/loc_gps.h +++ /dev/null @@ -1,2209 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef LOC_GPS_H -#define LOC_GPS_H - -#include <stdint.h> -#include <sys/cdefs.h> -#include <sys/types.h> -#include <pthread.h> -#include <sys/socket.h> -#include <stdbool.h> - -__BEGIN_DECLS - -#define LOC_FLP_STATUS_LOCATION_AVAILABLE 0 -#define LOC_FLP_STATUS_LOCATION_UNAVAILABLE 1 -#define LOC_CAPABILITY_GNSS (1U<<0) -#define LOC_CAPABILITY_WIFI (1U<<1) -#define LOC_CAPABILITY_CELL (1U<<3) - -/** Milliseconds since January 1, 1970 */ -typedef int64_t LocGpsUtcTime; - -/** Maximum number of SVs for loc_gps_sv_status_callback(). */ -#define LOC_GPS_MAX_SVS 32 -/** Maximum number of SVs for loc_gps_sv_status_callback(). */ -#define LOC_GNSS_MAX_SVS 64 - -/** Maximum number of Measurements in loc_gps_measurement_callback(). */ -#define LOC_GPS_MAX_MEASUREMENT 32 - -/** Maximum number of Measurements in loc_gnss_measurement_callback(). */ -#define LOC_GNSS_MAX_MEASUREMENT 64 - -/** Requested operational mode for GPS operation. */ -typedef uint32_t LocGpsPositionMode; -/* IMPORTANT: Note that the following values must match - * constants in GpsLocationProvider.java. */ -/** Mode for running GPS standalone (no assistance). */ -#define LOC_GPS_POSITION_MODE_STANDALONE 0 -/** AGPS MS-Based mode. */ -#define LOC_GPS_POSITION_MODE_MS_BASED 1 -/** - * AGPS MS-Assisted mode. This mode is not maintained by the platform anymore. - * It is strongly recommended to use LOC_GPS_POSITION_MODE_MS_BASED instead. - */ -#define LOC_GPS_POSITION_MODE_MS_ASSISTED 2 - -/** Requested recurrence mode for GPS operation. */ -typedef uint32_t LocGpsPositionRecurrence; -/* IMPORTANT: Note that the following values must match - * constants in GpsLocationProvider.java. */ -/** Receive GPS fixes on a recurring basis at a specified period. */ -#define LOC_GPS_POSITION_RECURRENCE_PERIODIC 0 -/** Request a single shot GPS fix. */ -#define LOC_GPS_POSITION_RECURRENCE_SINGLE 1 - -/** GPS status event values. */ -typedef uint16_t LocGpsStatusValue; -/* IMPORTANT: Note that the following values must match - * constants in GpsLocationProvider.java. */ -/** GPS status unknown. */ -#define LOC_GPS_STATUS_NONE 0 -/** GPS has begun navigating. */ -#define LOC_GPS_STATUS_SESSION_BEGIN 1 -/** GPS has stopped navigating. */ -#define LOC_GPS_STATUS_SESSION_END 2 -/** GPS has powered on but is not navigating. */ -#define LOC_GPS_STATUS_ENGINE_ON 3 -/** GPS is powered off. */ -#define LOC_GPS_STATUS_ENGINE_OFF 4 - -/** Flags to indicate which values are valid in a LocGpsLocation. */ -typedef uint16_t LocGpsLocationFlags; -/* IMPORTANT: Note that the following values must match - * constants in GpsLocationProvider.java. */ -/** LocGpsLocation has valid latitude and longitude. */ -#define LOC_GPS_LOCATION_HAS_LAT_LONG 0x0001 -/** LocGpsLocation has valid altitude. */ -#define LOC_GPS_LOCATION_HAS_ALTITUDE 0x0002 -/** LocGpsLocation has valid speed. */ -#define LOC_GPS_LOCATION_HAS_SPEED 0x0004 -/** LocGpsLocation has valid bearing. */ -#define LOC_GPS_LOCATION_HAS_BEARING 0x0008 -/** LocGpsLocation has valid accuracy. */ -#define LOC_GPS_LOCATION_HAS_ACCURACY 0x0010 -/** LocGpsLocation has valid vertical uncertainity */ -#define LOC_GPS_LOCATION_HAS_VERT_UNCERTAINITY 0x0040 - -/** Flags for the loc_gps_set_capabilities callback. */ - -/** - * GPS HAL schedules fixes for LOC_GPS_POSITION_RECURRENCE_PERIODIC mode. If this is - * not set, then the framework will use 1000ms for min_interval and will start - * and call start() and stop() to schedule the GPS. - */ -#define LOC_GPS_CAPABILITY_SCHEDULING (1 << 0) -/** GPS supports MS-Based AGPS mode */ -#define LOC_GPS_CAPABILITY_MSB (1 << 1) -/** GPS supports MS-Assisted AGPS mode */ -#define LOC_GPS_CAPABILITY_MSA (1 << 2) -/** GPS supports single-shot fixes */ -#define LOC_GPS_CAPABILITY_SINGLE_SHOT (1 << 3) -/** GPS supports on demand time injection */ -#define LOC_GPS_CAPABILITY_ON_DEMAND_TIME (1 << 4) -/** GPS supports Geofencing */ -#define LOC_GPS_CAPABILITY_GEOFENCING (1 << 5) -/** GPS supports Measurements. */ -#define LOC_GPS_CAPABILITY_MEASUREMENTS (1 << 6) -/** GPS supports Navigation Messages */ -#define LOC_GPS_CAPABILITY_NAV_MESSAGES (1 << 7) - -/** - * Flags used to specify which aiding data to delete when calling - * delete_aiding_data(). - */ -typedef uint16_t LocGpsAidingData; -/* IMPORTANT: Note that the following values must match - * constants in GpsLocationProvider.java. */ -#define LOC_GPS_DELETE_EPHEMERIS 0x0001 -#define LOC_GPS_DELETE_ALMANAC 0x0002 -#define LOC_GPS_DELETE_POSITION 0x0004 -#define LOC_GPS_DELETE_TIME 0x0008 -#define LOC_GPS_DELETE_IONO 0x0010 -#define LOC_GPS_DELETE_UTC 0x0020 -#define LOC_GPS_DELETE_HEALTH 0x0040 -#define LOC_GPS_DELETE_SVDIR 0x0080 -#define LOC_GPS_DELETE_SVSTEER 0x0100 -#define LOC_GPS_DELETE_SADATA 0x0200 -#define LOC_GPS_DELETE_RTI 0x0400 -#define LOC_GPS_DELETE_CELLDB_INFO 0x8000 -#define LOC_GPS_DELETE_ALL 0xFFFF - -/** AGPS type */ -typedef uint16_t LocAGpsType; -#define LOC_AGPS_TYPE_SUPL 1 -#define LOC_AGPS_TYPE_C2K 2 - -typedef uint16_t LocAGpsSetIDType; -#define LOC_AGPS_SETID_TYPE_NONE 0 -#define LOC_AGPS_SETID_TYPE_IMSI 1 -#define LOC_AGPS_SETID_TYPE_MSISDN 2 - -typedef uint16_t LocApnIpType; -#define LOC_APN_IP_INVALID 0 -#define LOC_APN_IP_IPV4 1 -#define LOC_APN_IP_IPV6 2 -#define LOC_APN_IP_IPV4V6 3 - -/** - * String length constants - */ -#define LOC_GPS_NI_SHORT_STRING_MAXLEN 256 -#define LOC_GPS_NI_LONG_STRING_MAXLEN 2048 - -/** - * LocGpsNiType constants - */ -typedef uint32_t LocGpsNiType; -#define LOC_GPS_NI_TYPE_VOICE 1 -#define LOC_GPS_NI_TYPE_UMTS_SUPL 2 -#define LOC_GPS_NI_TYPE_UMTS_CTRL_PLANE 3 -/*Emergency SUPL*/ -#define LOC_GPS_NI_TYPE_EMERGENCY_SUPL 4 - -/** - * LocGpsNiNotifyFlags constants - */ -typedef uint32_t LocGpsNiNotifyFlags; -/** NI requires notification */ -#define LOC_GPS_NI_NEED_NOTIFY 0x0001 -/** NI requires verification */ -#define LOC_GPS_NI_NEED_VERIFY 0x0002 -/** NI requires privacy override, no notification/minimal trace */ -#define LOC_GPS_NI_PRIVACY_OVERRIDE 0x0004 - -/** - * GPS NI responses, used to define the response in - * NI structures - */ -typedef int LocGpsUserResponseType; -#define LOC_GPS_NI_RESPONSE_ACCEPT 1 -#define LOC_GPS_NI_RESPONSE_DENY 2 -#define LOC_GPS_NI_RESPONSE_NORESP 3 - -/** - * NI data encoding scheme - */ -typedef int LocGpsNiEncodingType; -#define LOC_GPS_ENC_NONE 0 -#define LOC_GPS_ENC_SUPL_GSM_DEFAULT 1 -#define LOC_GPS_ENC_SUPL_UTF8 2 -#define LOC_GPS_ENC_SUPL_UCS2 3 -#define LOC_GPS_ENC_UNKNOWN -1 - -/** AGPS status event values. */ -typedef uint8_t LocAGpsStatusValue; -/** GPS requests data connection for AGPS. */ -#define LOC_GPS_REQUEST_AGPS_DATA_CONN 1 -/** GPS releases the AGPS data connection. */ -#define LOC_GPS_RELEASE_AGPS_DATA_CONN 2 -/** AGPS data connection initiated */ -#define LOC_GPS_AGPS_DATA_CONNECTED 3 -/** AGPS data connection completed */ -#define LOC_GPS_AGPS_DATA_CONN_DONE 4 -/** AGPS data connection failed */ -#define LOC_GPS_AGPS_DATA_CONN_FAILED 5 - -typedef uint16_t LocAGpsRefLocationType; -#define LOC_AGPS_REF_LOCATION_TYPE_GSM_CELLID 1 -#define LOC_AGPS_REF_LOCATION_TYPE_UMTS_CELLID 2 -#define LOC_AGPS_REF_LOCATION_TYPE_MAC 3 -#define LOC_AGPS_REF_LOCATION_TYPE_LTE_CELLID 4 - -/* Deprecated, to be removed in the next Android release. */ -#define LOC_AGPS_REG_LOCATION_TYPE_MAC 3 - -/** Network types for update_network_state "type" parameter */ -#define LOC_AGPS_RIL_NETWORK_TYPE_MOBILE 0 -#define LOC_AGPS_RIL_NETWORK_TYPE_WIFI 1 -#define LOC_AGPS_RIL_NETWORK_TYPE_MOBILE_MMS 2 -#define LOC_AGPS_RIL_NETWORK_TYPE_MOBILE_SUPL 3 -#define LOC_AGPS_RIL_NETWORK_TTYPE_MOBILE_DUN 4 -#define LOC_AGPS_RIL_NETWORK_TTYPE_MOBILE_HIPRI 5 -#define LOC_AGPS_RIL_NETWORK_TTYPE_WIMAX 6 - -/* The following typedef together with its constants below are deprecated, and - * will be removed in the next release. */ -typedef uint16_t LocGpsClockFlags; -#define LOC_GPS_CLOCK_HAS_LEAP_SECOND (1<<0) -#define LOC_GPS_CLOCK_HAS_TIME_UNCERTAINTY (1<<1) -#define LOC_GPS_CLOCK_HAS_FULL_BIAS (1<<2) -#define LOC_GPS_CLOCK_HAS_BIAS (1<<3) -#define LOC_GPS_CLOCK_HAS_BIAS_UNCERTAINTY (1<<4) -#define LOC_GPS_CLOCK_HAS_DRIFT (1<<5) -#define LOC_GPS_CLOCK_HAS_DRIFT_UNCERTAINTY (1<<6) - -/** - * Flags to indicate what fields in LocGnssClock are valid. - */ -typedef uint16_t LocGnssClockFlags; -/** A valid 'leap second' is stored in the data structure. */ -#define LOC_GNSS_CLOCK_HAS_LEAP_SECOND (1<<0) -/** A valid 'time uncertainty' is stored in the data structure. */ -#define LOC_GNSS_CLOCK_HAS_TIME_UNCERTAINTY (1<<1) -/** A valid 'full bias' is stored in the data structure. */ -#define LOC_GNSS_CLOCK_HAS_FULL_BIAS (1<<2) -/** A valid 'bias' is stored in the data structure. */ -#define LOC_GNSS_CLOCK_HAS_BIAS (1<<3) -/** A valid 'bias uncertainty' is stored in the data structure. */ -#define LOC_GNSS_CLOCK_HAS_BIAS_UNCERTAINTY (1<<4) -/** A valid 'drift' is stored in the data structure. */ -#define LOC_GNSS_CLOCK_HAS_DRIFT (1<<5) -/** A valid 'drift uncertainty' is stored in the data structure. */ -#define LOC_GNSS_CLOCK_HAS_DRIFT_UNCERTAINTY (1<<6) - -/* The following typedef together with its constants below are deprecated, and - * will be removed in the next release. */ -typedef uint8_t LocGpsClockType; -#define LOC_GPS_CLOCK_TYPE_UNKNOWN 0 -#define LOC_GPS_CLOCK_TYPE_LOCAL_HW_TIME 1 -#define LOC_GPS_CLOCK_TYPE_GPS_TIME 2 - -/* The following typedef together with its constants below are deprecated, and - * will be removed in the next release. */ -typedef uint32_t LocGpsMeasurementFlags; -#define LOC_GPS_MEASUREMENT_HAS_SNR (1<<0) -#define LOC_GPS_MEASUREMENT_HAS_ELEVATION (1<<1) -#define LOC_GPS_MEASUREMENT_HAS_ELEVATION_UNCERTAINTY (1<<2) -#define LOC_GPS_MEASUREMENT_HAS_AZIMUTH (1<<3) -#define LOC_GPS_MEASUREMENT_HAS_AZIMUTH_UNCERTAINTY (1<<4) -#define LOC_GPS_MEASUREMENT_HAS_PSEUDORANGE (1<<5) -#define LOC_GPS_MEASUREMENT_HAS_PSEUDORANGE_UNCERTAINTY (1<<6) -#define LOC_GPS_MEASUREMENT_HAS_CODE_PHASE (1<<7) -#define LOC_GPS_MEASUREMENT_HAS_CODE_PHASE_UNCERTAINTY (1<<8) -#define LOC_GPS_MEASUREMENT_HAS_CARRIER_FREQUENCY (1<<9) -#define LOC_GPS_MEASUREMENT_HAS_CARRIER_CYCLES (1<<10) -#define LOC_GPS_MEASUREMENT_HAS_CARRIER_PHASE (1<<11) -#define LOC_GPS_MEASUREMENT_HAS_CARRIER_PHASE_UNCERTAINTY (1<<12) -#define LOC_GPS_MEASUREMENT_HAS_BIT_NUMBER (1<<13) -#define LOC_GPS_MEASUREMENT_HAS_TIME_FROM_LAST_BIT (1<<14) -#define LOC_GPS_MEASUREMENT_HAS_DOPPLER_SHIFT (1<<15) -#define LOC_GPS_MEASUREMENT_HAS_DOPPLER_SHIFT_UNCERTAINTY (1<<16) -#define LOC_GPS_MEASUREMENT_HAS_USED_IN_FIX (1<<17) -#define LOC_GPS_MEASUREMENT_HAS_UNCORRECTED_PSEUDORANGE_RATE (1<<18) - -/** - * Flags to indicate what fields in LocGnssMeasurement are valid. - */ -typedef uint32_t LocGnssMeasurementFlags; -/** A valid 'snr' is stored in the data structure. */ -#define LOC_GNSS_MEASUREMENT_HAS_SNR (1<<0) -/** A valid 'carrier frequency' is stored in the data structure. */ -#define LOC_GNSS_MEASUREMENT_HAS_CARRIER_FREQUENCY (1<<9) -/** A valid 'carrier cycles' is stored in the data structure. */ -#define LOC_GNSS_MEASUREMENT_HAS_CARRIER_CYCLES (1<<10) -/** A valid 'carrier phase' is stored in the data structure. */ -#define LOC_GNSS_MEASUREMENT_HAS_CARRIER_PHASE (1<<11) -/** A valid 'carrier phase uncertainty' is stored in the data structure. */ -#define LOC_GNSS_MEASUREMENT_HAS_CARRIER_PHASE_UNCERTAINTY (1<<12) - -/* The following typedef together with its constants below are deprecated, and - * will be removed in the next release. */ -typedef uint8_t LocGpsLossOfLock; -#define LOC_GPS_LOSS_OF_LOCK_UNKNOWN 0 -#define LOC_GPS_LOSS_OF_LOCK_OK 1 -#define LOC_GPS_LOSS_OF_LOCK_CYCLE_SLIP 2 - -/* The following typedef together with its constants below are deprecated, and - * will be removed in the next release. Use LocGnssMultipathIndicator instead. - */ -typedef uint8_t LocGpsMultipathIndicator; -#define LOC_GPS_MULTIPATH_INDICATOR_UNKNOWN 0 -#define LOC_GPS_MULTIPATH_INDICATOR_DETECTED 1 -#define LOC_GPS_MULTIPATH_INDICATOR_NOT_USED 2 - -/** - * Enumeration of available values for the GNSS Measurement's multipath - * indicator. - */ -typedef uint8_t LocGnssMultipathIndicator; -/** The indicator is not available or unknown. */ -#define LOC_GNSS_MULTIPATH_INDICATOR_UNKNOWN 0 -/** The measurement is indicated to be affected by multipath. */ -#define LOC_GNSS_MULTIPATH_INDICATOR_PRESENT 1 -/** The measurement is indicated to be not affected by multipath. */ -#define LOC_GNSS_MULTIPATH_INDICATOR_NOT_PRESENT 2 - -/* The following typedef together with its constants below are deprecated, and - * will be removed in the next release. */ -typedef uint16_t LocGpsMeasurementState; -#define LOC_GPS_MEASUREMENT_STATE_UNKNOWN 0 -#define LOC_GPS_MEASUREMENT_STATE_CODE_LOCK (1<<0) -#define LOC_GPS_MEASUREMENT_STATE_BIT_SYNC (1<<1) -#define LOC_GPS_MEASUREMENT_STATE_SUBFRAME_SYNC (1<<2) -#define LOC_GPS_MEASUREMENT_STATE_TOW_DECODED (1<<3) -#define LOC_GPS_MEASUREMENT_STATE_MSEC_AMBIGUOUS (1<<4) - -/** - * Flags indicating the GNSS measurement state. - * - * The expected behavior here is for GPS HAL to set all the flags that applies. - * For example, if the state for a satellite is only C/A code locked and bit - * synchronized, and there is still millisecond ambiguity, the state should be - * set as: - * - * LOC_GNSS_MEASUREMENT_STATE_CODE_LOCK | LOC_GNSS_MEASUREMENT_STATE_BIT_SYNC | - * LOC_GNSS_MEASUREMENT_STATE_MSEC_AMBIGUOUS - * - * If GNSS is still searching for a satellite, the corresponding state should be - * set to LOC_GNSS_MEASUREMENT_STATE_UNKNOWN(0). - */ -typedef uint32_t LocGnssMeasurementState; -#define LOC_GNSS_MEASUREMENT_STATE_UNKNOWN 0 -#define LOC_GNSS_MEASUREMENT_STATE_CODE_LOCK (1<<0) -#define LOC_GNSS_MEASUREMENT_STATE_BIT_SYNC (1<<1) -#define LOC_GNSS_MEASUREMENT_STATE_SUBFRAME_SYNC (1<<2) -#define LOC_GNSS_MEASUREMENT_STATE_TOW_DECODED (1<<3) -#define LOC_GNSS_MEASUREMENT_STATE_MSEC_AMBIGUOUS (1<<4) -#define LOC_GNSS_MEASUREMENT_STATE_SYMBOL_SYNC (1<<5) -#define LOC_GNSS_MEASUREMENT_STATE_GLO_STRING_SYNC (1<<6) -#define LOC_GNSS_MEASUREMENT_STATE_GLO_TOD_DECODED (1<<7) -#define LOC_GNSS_MEASUREMENT_STATE_BDS_D2_BIT_SYNC (1<<8) -#define LOC_GNSS_MEASUREMENT_STATE_BDS_D2_SUBFRAME_SYNC (1<<9) -#define LOC_GNSS_MEASUREMENT_STATE_GAL_E1BC_CODE_LOCK (1<<10) -#define LOC_GNSS_MEASUREMENT_STATE_GAL_E1C_2ND_CODE_LOCK (1<<11) -#define LOC_GNSS_MEASUREMENT_STATE_GAL_E1B_PAGE_SYNC (1<<12) -#define LOC_GNSS_MEASUREMENT_STATE_SBAS_SYNC (1<<13) - -/* The following typedef together with its constants below are deprecated, and - * will be removed in the next release. */ -typedef uint16_t LocGpsAccumulatedDeltaRangeState; -#define LOC_GPS_ADR_STATE_UNKNOWN 0 -#define LOC_GPS_ADR_STATE_VALID (1<<0) -#define LOC_GPS_ADR_STATE_RESET (1<<1) -#define LOC_GPS_ADR_STATE_CYCLE_SLIP (1<<2) - -/** - * Flags indicating the Accumulated Delta Range's states. - */ -typedef uint16_t LocGnssAccumulatedDeltaRangeState; -#define LOC_GNSS_ADR_STATE_UNKNOWN 0 -#define LOC_GNSS_ADR_STATE_VALID (1<<0) -#define LOC_GNSS_ADR_STATE_RESET (1<<1) -#define LOC_GNSS_ADR_STATE_CYCLE_SLIP (1<<2) - -#if 0 -/* The following typedef together with its constants below are deprecated, and - * will be removed in the next release. */ -typedef uint8_t GpsNavigationMessageType; -#define GPS_NAVIGATION_MESSAGE_TYPE_UNKNOWN 0 -#define GPS_NAVIGATION_MESSAGE_TYPE_L1CA 1 -#define GPS_NAVIGATION_MESSAGE_TYPE_L2CNAV 2 -#define GPS_NAVIGATION_MESSAGE_TYPE_L5CNAV 3 -#define GPS_NAVIGATION_MESSAGE_TYPE_CNAV2 4 - -/** - * Enumeration of available values to indicate the GNSS Navigation message - * types. - * - * For convenience, first byte is the LocGnssConstellationType on which that signal - * is typically transmitted - */ -typedef int16_t GnssNavigationMessageType; - -#define GNSS_NAVIGATION_MESSAGE_TYPE_UNKNOWN 0 -/** GPS L1 C/A message contained in the structure. */ -#define GNSS_NAVIGATION_MESSAGE_TYPE_GPS_L1CA 0x0101 -/** GPS L2-CNAV message contained in the structure. */ -#define GNSS_NAVIGATION_MESSAGE_TYPE_GPS_L2CNAV 0x0102 -/** GPS L5-CNAV message contained in the structure. */ -#define GNSS_NAVIGATION_MESSAGE_TYPE_GPS_L5CNAV 0x0103 -/** GPS CNAV-2 message contained in the structure. */ -#define GNSS_NAVIGATION_MESSAGE_TYPE_GPS_CNAV2 0x0104 -/** Glonass L1 CA message contained in the structure. */ -#define GNSS_NAVIGATION_MESSAGE_TYPE_GLO_L1CA 0x0301 -/** Beidou D1 message contained in the structure. */ -#define GNSS_NAVIGATION_MESSAGE_TYPE_BDS_D1 0x0501 -/** Beidou D2 message contained in the structure. */ -#define GNSS_NAVIGATION_MESSAGE_TYPE_BDS_D2 0x0502 -/** Galileo I/NAV message contained in the structure. */ -#define GNSS_NAVIGATION_MESSAGE_TYPE_GAL_I 0x0601 -/** Galileo F/NAV message contained in the structure. */ -#define GNSS_NAVIGATION_MESSAGE_TYPE_GAL_F 0x0602 - -/** - * Status of Navigation Message - * When a message is received properly without any parity error in its navigation words, the - * status should be set to NAV_MESSAGE_STATUS_PARITY_PASSED. But if a message is received - * with words that failed parity check, but GPS is able to correct those words, the status - * should be set to NAV_MESSAGE_STATUS_PARITY_REBUILT. - * No need to send any navigation message that contains words with parity error and cannot be - * corrected. - */ -typedef uint16_t NavigationMessageStatus; -#define NAV_MESSAGE_STATUS_UNKNOWN 0 -#define NAV_MESSAGE_STATUS_PARITY_PASSED (1<<0) -#define NAV_MESSAGE_STATUS_PARITY_REBUILT (1<<1) - -/* This constant is deprecated, and will be removed in the next release. */ -#define NAV_MESSAGE_STATUS_UNKONW 0 -#endif - -/** - * Flags that indicate information about the satellite - */ -typedef uint8_t LocGnssSvFlags; -#define LOC_GNSS_SV_FLAGS_NONE 0 -#define LOC_GNSS_SV_FLAGS_HAS_EPHEMERIS_DATA (1 << 0) -#define LOC_GNSS_SV_FLAGS_HAS_ALMANAC_DATA (1 << 1) -#define LOC_GNSS_SV_FLAGS_USED_IN_FIX (1 << 2) - -/** - * Constellation type of LocGnssSvInfo - */ -typedef uint8_t LocGnssConstellationType; -#define LOC_GNSS_CONSTELLATION_UNKNOWN 0 -#define LOC_GNSS_CONSTELLATION_GPS 1 -#define LOC_GNSS_CONSTELLATION_SBAS 2 -#define LOC_GNSS_CONSTELLATION_GLONASS 3 -#define LOC_GNSS_CONSTELLATION_QZSS 4 -#define LOC_GNSS_CONSTELLATION_BEIDOU 5 -#define LOC_GNSS_CONSTELLATION_GALILEO 6 - -/** - * Name for the GPS XTRA interface. - */ -#define LOC_GPS_XTRA_INTERFACE "gps-xtra" - -/** - * Name for the GPS DEBUG interface. - */ -#define LOC_GPS_DEBUG_INTERFACE "gps-debug" - -/** - * Name for the AGPS interface. - */ - -#define LOC_AGPS_INTERFACE "agps" - -/** - * Name of the Supl Certificate interface. - */ -#define LOC_SUPL_CERTIFICATE_INTERFACE "supl-certificate" - -/** - * Name for NI interface - */ -#define LOC_GPS_NI_INTERFACE "gps-ni" - -/** - * Name for the AGPS-RIL interface. - */ -#define LOC_AGPS_RIL_INTERFACE "agps_ril" - -/** - * Name for the GPS_Geofencing interface. - */ -#define LOC_GPS_GEOFENCING_INTERFACE "gps_geofencing" - -/** - * Name of the GPS Measurements interface. - */ -#define LOC_GPS_MEASUREMENT_INTERFACE "gps_measurement" - -/** - * Name of the GPS navigation message interface. - */ -#define LOC_GPS_NAVIGATION_MESSAGE_INTERFACE "gps_navigation_message" - -/** - * Name of the GNSS/GPS configuration interface. - */ -#define LOC_GNSS_CONFIGURATION_INTERFACE "gnss_configuration" - -/** Represents a location. */ -typedef struct { - /** set to sizeof(LocGpsLocation) */ - size_t size; - /** Contains LocGpsLocationFlags bits. */ - uint16_t flags; - /** Represents latitude in degrees. */ - double latitude; - /** Represents longitude in degrees. */ - double longitude; - /** - * Represents altitude in meters above the WGS 84 reference ellipsoid. - */ - double altitude; - /** Represents horizontal speed in meters per second. */ - float speed; - /** Represents heading in degrees. */ - float bearing; - /** Represents expected accuracy in meters. */ - float accuracy; - /** Represents the expected vertical uncertainity in meters*/ - float vertUncertainity; - /** Timestamp for the location fix. */ - LocGpsUtcTime timestamp; -} LocGpsLocation; - -/** Represents the status. */ -typedef struct { - /** set to sizeof(LocGpsStatus) */ - size_t size; - LocGpsStatusValue status; -} LocGpsStatus; - -/** - * Legacy struct to represents SV information. - * Deprecated, to be removed in the next Android release. - * Use LocGnssSvInfo instead. - */ -typedef struct { - /** set to sizeof(LocGpsSvInfo) */ - size_t size; - /** Pseudo-random number for the SV. */ - int prn; - /** Signal to noise ratio. */ - float snr; - /** Elevation of SV in degrees. */ - float elevation; - /** Azimuth of SV in degrees. */ - float azimuth; -} LocGpsSvInfo; - -typedef struct { - /** set to sizeof(LocGnssSvInfo) */ - size_t size; - - /** - * Pseudo-random number for the SV, or FCN/OSN number for Glonass. The - * distinction is made by looking at constellation field. Values should be - * in the range of: - * - * - GPS: 1-32 - * - SBAS: 120-151, 183-192 - * - GLONASS: 1-24, the orbital slot number (OSN), if known. Or, if not: - * 93-106, the frequency channel number (FCN) (-7 to +6) offset by + 100 - * i.e. report an FCN of -7 as 93, FCN of 0 as 100, and FCN of +6 as 106. - * - QZSS: 193-200 - * - Galileo: 1-36 - * - Beidou: 1-37 - */ - int16_t svid; - - /** - * Defines the constellation of the given SV. Value should be one of those - * LOC_GNSS_CONSTELLATION_* constants - */ - LocGnssConstellationType constellation; - - /** - * Carrier-to-noise density in dB-Hz, typically in the range [0, 63]. - * It contains the measured C/N0 value for the signal at the antenna port. - * - * This is a mandatory value. - */ - float c_n0_dbhz; - - /** Elevation of SV in degrees. */ - float elevation; - - /** Azimuth of SV in degrees. */ - float azimuth; - - /** - * Contains additional data about the given SV. Value should be one of those - * LOC_GNSS_SV_FLAGS_* constants - */ - LocGnssSvFlags flags; - -} LocGnssSvInfo; - -/** - * Legacy struct to represents SV status. - * Deprecated, to be removed in the next Android release. - * Use LocGnssSvStatus instead. - */ -typedef struct { - /** set to sizeof(LocGpsSvStatus) */ - size_t size; - int num_svs; - LocGpsSvInfo sv_list[LOC_GPS_MAX_SVS]; - uint32_t ephemeris_mask; - uint32_t almanac_mask; - uint32_t used_in_fix_mask; -} LocGpsSvStatus; - -/** - * Represents SV status. - */ -typedef struct { - /** set to sizeof(LocGnssSvStatus) */ - size_t size; - - /** Number of GPS SVs currently visible, refers to the SVs stored in sv_list */ - int num_svs; - /** - * Pointer to an array of SVs information for all GNSS constellations, - * except GPS, which is reported using sv_list - */ - LocGnssSvInfo gnss_sv_list[LOC_GNSS_MAX_SVS]; - -} LocGnssSvStatus; - -/* CellID for 2G, 3G and LTE, used in AGPS. */ -typedef struct { - LocAGpsRefLocationType type; - /** Mobile Country Code. */ - uint16_t mcc; - /** Mobile Network Code .*/ - uint16_t mnc; - /** Location Area Code in 2G, 3G and LTE. In 3G lac is discarded. In LTE, - * lac is populated with tac, to ensure that we don't break old clients that - * might rely in the old (wrong) behavior. - */ - uint16_t lac; - /** Cell id in 2G. Utran Cell id in 3G. Cell Global Id EUTRA in LTE. */ - uint32_t cid; - /** Tracking Area Code in LTE. */ - uint16_t tac; - /** Physical Cell id in LTE (not used in 2G and 3G) */ - uint16_t pcid; -} LocAGpsRefLocationCellID; - -typedef struct { - uint8_t mac[6]; -} LocAGpsRefLocationMac; - -/** Represents ref locations */ -typedef struct { - LocAGpsRefLocationType type; - union { - LocAGpsRefLocationCellID cellID; - LocAGpsRefLocationMac mac; - } u; -} LocAGpsRefLocation; - -/** - * Callback with location information. Can only be called from a thread created - * by create_thread_cb. - */ -typedef void (* loc_gps_location_callback)(LocGpsLocation* location); - -/** - * Callback with status information. Can only be called from a thread created by - * create_thread_cb. - */ -typedef void (* loc_gps_status_callback)(LocGpsStatus* status); -/** - * Legacy callback with SV status information. - * Can only be called from a thread created by create_thread_cb. - * - * This callback is deprecated, and will be removed in the next release. Use - * loc_gnss_sv_status_callback() instead. - */ -typedef void (* loc_gps_sv_status_callback)(LocGpsSvStatus* sv_info); - -/** - * Callback with SV status information. - * Can only be called from a thread created by create_thread_cb. - */ -typedef void (* loc_gnss_sv_status_callback)(LocGnssSvStatus* sv_info); - -/** - * Callback for reporting NMEA sentences. Can only be called from a thread - * created by create_thread_cb. - */ -typedef void (* loc_gps_nmea_callback)(LocGpsUtcTime timestamp, const char* nmea, int length); - -/** - * Callback to inform framework of the GPS engine's capabilities. Capability - * parameter is a bit field of LOC_GPS_CAPABILITY_* flags. - */ -typedef void (* loc_gps_set_capabilities)(uint32_t capabilities); - -/** - * Callback utility for acquiring the GPS wakelock. This can be used to prevent - * the CPU from suspending while handling GPS events. - */ -typedef void (* loc_gps_acquire_wakelock)(); - -/** Callback utility for releasing the GPS wakelock. */ -typedef void (* loc_gps_release_wakelock)(); - -/** Callback for requesting NTP time */ -typedef void (* loc_gps_request_utc_time)(); - -/** - * Callback for creating a thread that can call into the Java framework code. - * This must be used to create any threads that report events up to the - * framework. - */ -typedef pthread_t (* loc_gps_create_thread)(const char* name, void (*start)(void *), void* arg); - -/** - * Provides information about how new the underlying GPS/GNSS hardware and - * software is. - * - * This information will be available for Android Test Applications. If a GPS - * HAL does not provide this information, it will be considered "2015 or - * earlier". - * - * If a GPS HAL does provide this information, then newer years will need to - * meet newer CTS standards. E.g. if the date are 2016 or above, then N+ level - * LocGpsMeasurement support will be verified. - */ -typedef struct { - /** Set to sizeof(LocGnssSystemInfo) */ - size_t size; - /* year in which the last update was made to the underlying hardware/firmware - * used to capture GNSS signals, e.g. 2016 */ - uint16_t year_of_hw; -} LocGnssSystemInfo; - -/** - * Callback to inform framework of the engine's hardware version information. - */ -typedef void (*loc_gnss_set_system_info)(const LocGnssSystemInfo* info); - -/** New GPS callback structure. */ -typedef struct { - /** set to sizeof(LocGpsCallbacks) */ - size_t size; - loc_gps_location_callback location_cb; - loc_gps_status_callback status_cb; - loc_gps_sv_status_callback sv_status_cb; - loc_gps_nmea_callback nmea_cb; - loc_gps_set_capabilities set_capabilities_cb; - loc_gps_acquire_wakelock acquire_wakelock_cb; - loc_gps_release_wakelock release_wakelock_cb; - loc_gps_create_thread create_thread_cb; - loc_gps_request_utc_time request_utc_time_cb; - - loc_gnss_set_system_info set_system_info_cb; - loc_gnss_sv_status_callback gnss_sv_status_cb; -} LocGpsCallbacks; - -/** Represents the standard GPS interface. */ -typedef struct { - /** set to sizeof(LocGpsInterface) */ - size_t size; - /** - * Opens the interface and provides the callback routines - * to the implementation of this interface. - */ - int (*init)( LocGpsCallbacks* callbacks ); - - /** Starts navigating. */ - int (*start)( void ); - - /** Stops navigating. */ - int (*stop)( void ); - - /** Closes the interface. */ - void (*cleanup)( void ); - - /** Injects the current time. */ - int (*inject_time)(LocGpsUtcTime time, int64_t timeReference, - int uncertainty); - - /** - * Injects current location from another location provider (typically cell - * ID). Latitude and longitude are measured in degrees expected accuracy is - * measured in meters - */ - int (*inject_location)(double latitude, double longitude, float accuracy); - - /** - * Specifies that the next call to start will not use the - * information defined in the flags. LOC_GPS_DELETE_ALL is passed for - * a cold start. - */ - void (*delete_aiding_data)(LocGpsAidingData flags); - - /** - * min_interval represents the time between fixes in milliseconds. - * preferred_accuracy represents the requested fix accuracy in meters. - * preferred_time represents the requested time to first fix in milliseconds. - * - * 'mode' parameter should be one of LOC_GPS_POSITION_MODE_MS_BASED - * or LOC_GPS_POSITION_MODE_STANDALONE. - * It is allowed by the platform (and it is recommended) to fallback to - * LOC_GPS_POSITION_MODE_MS_BASED if LOC_GPS_POSITION_MODE_MS_ASSISTED is passed in, and - * LOC_GPS_POSITION_MODE_MS_BASED is supported. - */ - int (*set_position_mode)(LocGpsPositionMode mode, LocGpsPositionRecurrence recurrence, - uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time); - - /** Get a pointer to extension information. */ - const void* (*get_extension)(const char* name); -} LocGpsInterface; - -/** - * Callback to request the client to download XTRA data. The client should - * download XTRA data and inject it by calling inject_xtra_data(). Can only be - * called from a thread created by create_thread_cb. - */ -typedef void (* loc_gps_xtra_download_request)(); - -/** Callback structure for the XTRA interface. */ -typedef struct { - loc_gps_xtra_download_request download_request_cb; - loc_gps_create_thread create_thread_cb; -} LocGpsXtraCallbacks; - -/** Extended interface for XTRA support. */ -typedef struct { - /** set to sizeof(LocGpsXtraInterface) */ - size_t size; - /** - * Opens the XTRA interface and provides the callback routines - * to the implementation of this interface. - */ - int (*init)( LocGpsXtraCallbacks* callbacks ); - /** Injects XTRA data into the GPS. */ - int (*inject_xtra_data)( char* data, int length ); -} LocGpsXtraInterface; - -#if 0 -/** Extended interface for DEBUG support. */ -typedef struct { - /** set to sizeof(LocGpsDebugInterface) */ - size_t size; - - /** - * This function should return any information that the native - * implementation wishes to include in a bugreport. - */ - size_t (*get_internal_state)(char* buffer, size_t bufferSize); -} LocGpsDebugInterface; -#endif - -/* - * Represents the status of AGPS augmented to support IPv4 and IPv6. - */ -typedef struct { - /** set to sizeof(LocAGpsStatus) */ - size_t size; - - LocAGpsType type; - LocAGpsStatusValue status; - - /** - * Must be set to a valid IPv4 address if the field 'addr' contains an IPv4 - * address, or set to INADDR_NONE otherwise. - */ - uint32_t ipaddr; - - /** - * Must contain the IPv4 (AF_INET) or IPv6 (AF_INET6) address to report. - * Any other value of addr.ss_family will be rejected. - */ - struct sockaddr_storage addr; -} LocAGpsStatus; - -/** - * Callback with AGPS status information. Can only be called from a thread - * created by create_thread_cb. - */ -typedef void (* loc_agps_status_callback)(LocAGpsStatus* status); - -/** Callback structure for the AGPS interface. */ -typedef struct { - loc_agps_status_callback status_cb; - loc_gps_create_thread create_thread_cb; -} LocAGpsCallbacks; - -/** - * Extended interface for AGPS support, it is augmented to enable to pass - * extra APN data. - */ -typedef struct { - /** set to sizeof(LocAGpsInterface) */ - size_t size; - - /** - * Opens the AGPS interface and provides the callback routines to the - * implementation of this interface. - */ - void (*init)(LocAGpsCallbacks* callbacks); - /** - * Deprecated. - * If the HAL supports LocAGpsInterface_v2 this API will not be used, see - * data_conn_open_with_apn_ip_type for more information. - */ - int (*data_conn_open)(const char* apn); - /** - * Notifies that the AGPS data connection has been closed. - */ - int (*data_conn_closed)(); - /** - * Notifies that a data connection is not available for AGPS. - */ - int (*data_conn_failed)(); - /** - * Sets the hostname and port for the AGPS server. - */ - int (*set_server)(LocAGpsType type, const char* hostname, int port); - - /** - * Notifies that a data connection is available and sets the name of the - * APN, and its IP type, to be used for SUPL connections. - */ - int (*data_conn_open_with_apn_ip_type)( - const char* apn, - LocApnIpType apnIpType); -} LocAGpsInterface; - -/** Error codes associated with certificate operations */ -#define LOC_AGPS_CERTIFICATE_OPERATION_SUCCESS 0 -#define LOC_AGPS_CERTIFICATE_ERROR_GENERIC -100 -#define LOC_AGPS_CERTIFICATE_ERROR_TOO_MANY_CERTIFICATES -101 - -/** A data structure that represents an X.509 certificate using DER encoding */ -typedef struct { - size_t length; - u_char* data; -} LocDerEncodedCertificate; - -/** - * A type definition for SHA1 Fingerprints used to identify X.509 Certificates - * The Fingerprint is a digest of the DER Certificate that uniquely identifies it. - */ -typedef struct { - u_char data[20]; -} LocSha1CertificateFingerprint; - -/** AGPS Interface to handle SUPL certificate operations */ -typedef struct { - /** set to sizeof(LocSuplCertificateInterface) */ - size_t size; - - /** - * Installs a set of Certificates used for SUPL connections to the AGPS server. - * If needed the HAL should find out internally any certificates that need to be removed to - * accommodate the certificates to install. - * The certificates installed represent a full set of valid certificates needed to connect to - * AGPS SUPL servers. - * The list of certificates is required, and all must be available at the same time, when trying - * to establish a connection with the AGPS Server. - * - * Parameters: - * certificates - A pointer to an array of DER encoded certificates that are need to be - * installed in the HAL. - * length - The number of certificates to install. - * Returns: - * LOC_AGPS_CERTIFICATE_OPERATION_SUCCESS if the operation is completed successfully - * LOC_AGPS_CERTIFICATE_ERROR_TOO_MANY_CERTIFICATES if the HAL cannot store the number of - * certificates attempted to be installed, the state of the certificates stored should - * remain the same as before on this error case. - * - * IMPORTANT: - * If needed the HAL should find out internally the set of certificates that need to be - * removed to accommodate the certificates to install. - */ - int (*install_certificates) ( const LocDerEncodedCertificate* certificates, size_t length ); - - /** - * Notifies the HAL that a list of certificates used for SUPL connections are revoked. It is - * expected that the given set of certificates is removed from the internal store of the HAL. - * - * Parameters: - * fingerprints - A pointer to an array of SHA1 Fingerprints to identify the set of - * certificates to revoke. - * length - The number of fingerprints provided. - * Returns: - * LOC_AGPS_CERTIFICATE_OPERATION_SUCCESS if the operation is completed successfully. - * - * IMPORTANT: - * If any of the certificates provided (through its fingerprint) is not known by the HAL, - * it should be ignored and continue revoking/deleting the rest of them. - */ - int (*revoke_certificates) ( const LocSha1CertificateFingerprint* fingerprints, size_t length ); -} LocSuplCertificateInterface; - -/** Represents an NI request */ -typedef struct { - /** set to sizeof(LocGpsNiNotification) */ - size_t size; - - /** - * An ID generated by HAL to associate NI notifications and UI - * responses - */ - int notification_id; - - /** - * An NI type used to distinguish different categories of NI - * events, such as LOC_GPS_NI_TYPE_VOICE, LOC_GPS_NI_TYPE_UMTS_SUPL, ... - */ - LocGpsNiType ni_type; - - /** - * Notification/verification options, combinations of LocGpsNiNotifyFlags constants - */ - LocGpsNiNotifyFlags notify_flags; - - /** - * Timeout period to wait for user response. - * Set to 0 for no time out limit. - */ - int timeout; - - /** - * Default response when time out. - */ - LocGpsUserResponseType default_response; - - /** - * Requestor ID - */ - char requestor_id[LOC_GPS_NI_SHORT_STRING_MAXLEN]; - - /** - * Notification message. It can also be used to store client_id in some cases - */ - char text[LOC_GPS_NI_LONG_STRING_MAXLEN]; - - /** - * Client name decoding scheme - */ - LocGpsNiEncodingType requestor_id_encoding; - - /** - * Client name decoding scheme - */ - LocGpsNiEncodingType text_encoding; - - /** - * A pointer to extra data. Format: - * key_1 = value_1 - * key_2 = value_2 - */ - char extras[LOC_GPS_NI_LONG_STRING_MAXLEN]; - -} LocGpsNiNotification; - -/** - * Callback with NI notification. Can only be called from a thread created by - * create_thread_cb. - */ -typedef void (*loc_gps_ni_notify_callback)(LocGpsNiNotification *notification); - -/** GPS NI callback structure. */ -typedef struct -{ - /** - * Sends the notification request from HAL to GPSLocationProvider. - */ - loc_gps_ni_notify_callback notify_cb; - loc_gps_create_thread create_thread_cb; -} LocGpsNiCallbacks; - -/** - * Extended interface for Network-initiated (NI) support. - */ -typedef struct -{ - /** set to sizeof(LocGpsNiInterface) */ - size_t size; - - /** Registers the callbacks for HAL to use. */ - void (*init) (LocGpsNiCallbacks *callbacks); - - /** Sends a response to HAL. */ - void (*respond) (int notif_id, LocGpsUserResponseType user_response); -} LocGpsNiInterface; - -#define LOC_AGPS_RIL_REQUEST_SETID_IMSI (1<<0L) -#define LOC_AGPS_RIL_REQUEST_SETID_MSISDN (1<<1L) - -#define LOC_AGPS_RIL_REQUEST_REFLOC_CELLID (1<<0L) -#define LOC_AGPS_RIL_REQUEST_REFLOC_MAC (1<<1L) - -typedef void (*loc_agps_ril_request_set_id)(uint32_t flags); -typedef void (*loc_agps_ril_request_ref_loc)(uint32_t flags); - -typedef struct { - loc_agps_ril_request_set_id request_setid; - loc_agps_ril_request_ref_loc request_refloc; - loc_gps_create_thread create_thread_cb; -} LocAGpsRilCallbacks; - -/** Extended interface for AGPS_RIL support. */ -typedef struct { - /** set to sizeof(LocAGpsRilInterface) */ - size_t size; - /** - * Opens the AGPS interface and provides the callback routines - * to the implementation of this interface. - */ - void (*init)( LocAGpsRilCallbacks* callbacks ); - - /** - * Sets the reference location. - */ - void (*set_ref_location) (const LocAGpsRefLocation *agps_reflocation, size_t sz_struct); - /** - * Sets the set ID. - */ - void (*set_set_id) (LocAGpsSetIDType type, const char* setid); - - /** - * Send network initiated message. - */ - void (*ni_message) (uint8_t *msg, size_t len); - - /** - * Notify GPS of network status changes. - * These parameters match values in the android.net.NetworkInfo class. - */ - void (*update_network_state) (int connected, int type, int roaming, const char* extra_info); - - /** - * Notify GPS of network status changes. - * These parameters match values in the android.net.NetworkInfo class. - */ - void (*update_network_availability) (int avaiable, const char* apn); -} LocAGpsRilInterface; - -/** - * GPS Geofence. - * There are 3 states associated with a Geofence: Inside, Outside, Unknown. - * There are 3 transitions: ENTERED, EXITED, UNCERTAIN. - * - * An example state diagram with confidence level: 95% and Unknown time limit - * set as 30 secs is shown below. (confidence level and Unknown time limit are - * explained latter) - * ____________________________ - * | Unknown (30 secs) | - * """""""""""""""""""""""""""" - * ^ | | ^ - * UNCERTAIN| |ENTERED EXITED| |UNCERTAIN - * | v v | - * ________ EXITED _________ - * | Inside | -----------> | Outside | - * | | <----------- | | - * """""""" ENTERED """"""""" - * - * Inside state: We are 95% confident that the user is inside the geofence. - * Outside state: We are 95% confident that the user is outside the geofence - * Unknown state: Rest of the time. - * - * The Unknown state is better explained with an example: - * - * __________ - * | c| - * | ___ | _______ - * | |a| | | b | - * | """ | """"""" - * | | - * """""""""" - * In the diagram above, "a" and "b" are 2 geofences and "c" is the accuracy - * circle reported by the GPS subsystem. Now with regard to "b", the system is - * confident that the user is outside. But with regard to "a" is not confident - * whether it is inside or outside the geofence. If the accuracy remains the - * same for a sufficient period of time, the UNCERTAIN transition would be - * triggered with the state set to Unknown. If the accuracy improves later, an - * appropriate transition should be triggered. This "sufficient period of time" - * is defined by the parameter in the add_geofence_area API. - * In other words, Unknown state can be interpreted as a state in which the - * GPS subsystem isn't confident enough that the user is either inside or - * outside the Geofence. It moves to Unknown state only after the expiry of the - * timeout. - * - * The geofence callback needs to be triggered for the ENTERED and EXITED - * transitions, when the GPS system is confident that the user has entered - * (Inside state) or exited (Outside state) the Geofence. An implementation - * which uses a value of 95% as the confidence is recommended. The callback - * should be triggered only for the transitions requested by the - * add_geofence_area call. - * - * Even though the diagram and explanation talks about states and transitions, - * the callee is only interested in the transistions. The states are mentioned - * here for illustrative purposes. - * - * Startup Scenario: When the device boots up, if an application adds geofences, - * and then we get an accurate GPS location fix, it needs to trigger the - * appropriate (ENTERED or EXITED) transition for every Geofence it knows about. - * By default, all the Geofences will be in the Unknown state. - * - * When the GPS system is unavailable, loc_gps_geofence_status_callback should be - * called to inform the upper layers of the same. Similarly, when it becomes - * available the callback should be called. This is a global state while the - * UNKNOWN transition described above is per geofence. - * - * An important aspect to note is that users of this API (framework), will use - * other subsystems like wifi, sensors, cell to handle Unknown case and - * hopefully provide a definitive state transition to the third party - * application. GPS Geofence will just be a signal indicating what the GPS - * subsystem knows about the Geofence. - * - */ -#define LOC_GPS_GEOFENCE_ENTERED (1<<0L) -#define LOC_GPS_GEOFENCE_EXITED (1<<1L) -#define LOC_GPS_GEOFENCE_UNCERTAIN (1<<2L) - -#define LOC_GPS_GEOFENCE_UNAVAILABLE (1<<0L) -#define LOC_GPS_GEOFENCE_AVAILABLE (1<<1L) - -#define LOC_GPS_GEOFENCE_OPERATION_SUCCESS 0 -#define LOC_GPS_GEOFENCE_ERROR_TOO_MANY_GEOFENCES -100 -#define LOC_GPS_GEOFENCE_ERROR_ID_EXISTS -101 -#define LOC_GPS_GEOFENCE_ERROR_ID_UNKNOWN -102 -#define LOC_GPS_GEOFENCE_ERROR_INVALID_TRANSITION -103 -#define LOC_GPS_GEOFENCE_ERROR_GENERIC -149 - -/** - * The callback associated with the geofence. - * Parameters: - * geofence_id - The id associated with the add_geofence_area. - * location - The current GPS location. - * transition - Can be one of LOC_GPS_GEOFENCE_ENTERED, LOC_GPS_GEOFENCE_EXITED, - * LOC_GPS_GEOFENCE_UNCERTAIN. - * timestamp - Timestamp when the transition was detected. - * - * The callback should only be called when the caller is interested in that - * particular transition. For instance, if the caller is interested only in - * ENTERED transition, then the callback should NOT be called with the EXITED - * transition. - * - * IMPORTANT: If a transition is triggered resulting in this callback, the GPS - * subsystem will wake up the application processor, if its in suspend state. - */ -typedef void (*loc_gps_geofence_transition_callback) (int32_t geofence_id, LocGpsLocation* location, - int32_t transition, LocGpsUtcTime timestamp); - -/** - * The callback associated with the availability of the GPS system for geofencing - * monitoring. If the GPS system determines that it cannot monitor geofences - * because of lack of reliability or unavailability of the GPS signals, it will - * call this callback with LOC_GPS_GEOFENCE_UNAVAILABLE parameter. - * - * Parameters: - * status - LOC_GPS_GEOFENCE_UNAVAILABLE or LOC_GPS_GEOFENCE_AVAILABLE. - * last_location - Last known location. - */ -typedef void (*loc_gps_geofence_status_callback) (int32_t status, LocGpsLocation* last_location); - -/** - * The callback associated with the add_geofence call. - * - * Parameter: - * geofence_id - Id of the geofence. - * status - LOC_GPS_GEOFENCE_OPERATION_SUCCESS - * LOC_GPS_GEOFENCE_ERROR_TOO_MANY_GEOFENCES - geofence limit has been reached. - * LOC_GPS_GEOFENCE_ERROR_ID_EXISTS - geofence with id already exists - * LOC_GPS_GEOFENCE_ERROR_INVALID_TRANSITION - the monitorTransition contains an - * invalid transition - * LOC_GPS_GEOFENCE_ERROR_GENERIC - for other errors. - */ -typedef void (*loc_gps_geofence_add_callback) (int32_t geofence_id, int32_t status); - -/** - * The callback associated with the remove_geofence call. - * - * Parameter: - * geofence_id - Id of the geofence. - * status - LOC_GPS_GEOFENCE_OPERATION_SUCCESS - * LOC_GPS_GEOFENCE_ERROR_ID_UNKNOWN - for invalid id - * LOC_GPS_GEOFENCE_ERROR_GENERIC for others. - */ -typedef void (*loc_gps_geofence_remove_callback) (int32_t geofence_id, int32_t status); - - -/** - * The callback associated with the pause_geofence call. - * - * Parameter: - * geofence_id - Id of the geofence. - * status - LOC_GPS_GEOFENCE_OPERATION_SUCCESS - * LOC_GPS_GEOFENCE_ERROR_ID_UNKNOWN - for invalid id - * LOC_GPS_GEOFENCE_ERROR_INVALID_TRANSITION - - * when monitor_transitions is invalid - * LOC_GPS_GEOFENCE_ERROR_GENERIC for others. - */ -typedef void (*loc_gps_geofence_pause_callback) (int32_t geofence_id, int32_t status); - -/** - * The callback associated with the resume_geofence call. - * - * Parameter: - * geofence_id - Id of the geofence. - * status - LOC_GPS_GEOFENCE_OPERATION_SUCCESS - * LOC_GPS_GEOFENCE_ERROR_ID_UNKNOWN - for invalid id - * LOC_GPS_GEOFENCE_ERROR_GENERIC for others. - */ -typedef void (*loc_gps_geofence_resume_callback) (int32_t geofence_id, int32_t status); - -typedef struct { - loc_gps_geofence_transition_callback geofence_transition_callback; - loc_gps_geofence_status_callback geofence_status_callback; - loc_gps_geofence_add_callback geofence_add_callback; - loc_gps_geofence_remove_callback geofence_remove_callback; - loc_gps_geofence_pause_callback geofence_pause_callback; - loc_gps_geofence_resume_callback geofence_resume_callback; - loc_gps_create_thread create_thread_cb; -} LocGpsGeofenceCallbacks; - -/** Extended interface for GPS_Geofencing support */ -typedef struct { - /** set to sizeof(LocGpsGeofencingInterface) */ - size_t size; - - /** - * Opens the geofence interface and provides the callback routines - * to the implementation of this interface. - */ - void (*init)( LocGpsGeofenceCallbacks* callbacks ); - - /** - * Add a geofence area. This api currently supports circular geofences. - * Parameters: - * geofence_id - The id for the geofence. If a geofence with this id - * already exists, an error value (LOC_GPS_GEOFENCE_ERROR_ID_EXISTS) - * should be returned. - * latitude, longtitude, radius_meters - The lat, long and radius - * (in meters) for the geofence - * last_transition - The current state of the geofence. For example, if - * the system already knows that the user is inside the geofence, - * this will be set to LOC_GPS_GEOFENCE_ENTERED. In most cases, it - * will be LOC_GPS_GEOFENCE_UNCERTAIN. - * monitor_transition - Which transitions to monitor. Bitwise OR of - * LOC_GPS_GEOFENCE_ENTERED, LOC_GPS_GEOFENCE_EXITED and - * LOC_GPS_GEOFENCE_UNCERTAIN. - * notification_responsiveness_ms - Defines the best-effort description - * of how soon should the callback be called when the transition - * associated with the Geofence is triggered. For instance, if set - * to 1000 millseconds with LOC_GPS_GEOFENCE_ENTERED, the callback - * should be called 1000 milliseconds within entering the geofence. - * This parameter is defined in milliseconds. - * NOTE: This is not to be confused with the rate that the GPS is - * polled at. It is acceptable to dynamically vary the rate of - * sampling the GPS for power-saving reasons; thus the rate of - * sampling may be faster or slower than this. - * unknown_timer_ms - The time limit after which the UNCERTAIN transition - * should be triggered. This parameter is defined in milliseconds. - * See above for a detailed explanation. - */ - void (*add_geofence_area) (int32_t geofence_id, double latitude, double longitude, - double radius_meters, int last_transition, int monitor_transitions, - int notification_responsiveness_ms, int unknown_timer_ms); - - /** - * Pause monitoring a particular geofence. - * Parameters: - * geofence_id - The id for the geofence. - */ - void (*pause_geofence) (int32_t geofence_id); - - /** - * Resume monitoring a particular geofence. - * Parameters: - * geofence_id - The id for the geofence. - * monitor_transitions - Which transitions to monitor. Bitwise OR of - * LOC_GPS_GEOFENCE_ENTERED, LOC_GPS_GEOFENCE_EXITED and - * LOC_GPS_GEOFENCE_UNCERTAIN. - * This supersedes the value associated provided in the - * add_geofence_area call. - */ - void (*resume_geofence) (int32_t geofence_id, int monitor_transitions); - - /** - * Remove a geofence area. After the function returns, no notifications - * should be sent. - * Parameter: - * geofence_id - The id for the geofence. - */ - void (*remove_geofence_area) (int32_t geofence_id); -} LocGpsGeofencingInterface; - -/** - * Legacy struct to represent an estimate of the GPS clock time. - * Deprecated, to be removed in the next Android release. - * Use LocGnssClock instead. - */ -typedef struct { - /** set to sizeof(LocGpsClock) */ - size_t size; - LocGpsClockFlags flags; - int16_t leap_second; - LocGpsClockType type; - int64_t time_ns; - double time_uncertainty_ns; - int64_t full_bias_ns; - double bias_ns; - double bias_uncertainty_ns; - double drift_nsps; - double drift_uncertainty_nsps; -} LocGpsClock; - -/** - * Represents an estimate of the GPS clock time. - */ -typedef struct { - /** set to sizeof(LocGnssClock) */ - size_t size; - - /** - * A set of flags indicating the validity of the fields in this data - * structure. - */ - LocGnssClockFlags flags; - - /** - * Leap second data. - * The sign of the value is defined by the following equation: - * utc_time_ns = time_ns - (full_bias_ns + bias_ns) - leap_second * - * 1,000,000,000 - * - * If the data is available 'flags' must contain LOC_GNSS_CLOCK_HAS_LEAP_SECOND. - */ - int16_t leap_second; - - /** - * The GNSS receiver internal clock value. This is the local hardware clock - * value. - * - * For local hardware clock, this value is expected to be monotonically - * increasing while the hardware clock remains power on. (For the case of a - * HW clock that is not continuously on, see the - * hw_clock_discontinuity_count field). The receiver's estimate of GPS time - * can be derived by substracting the sum of full_bias_ns and bias_ns (when - * available) from this value. - * - * This GPS time is expected to be the best estimate of current GPS time - * that GNSS receiver can achieve. - * - * Sub-nanosecond accuracy can be provided by means of the 'bias_ns' field. - * The value contains the 'time uncertainty' in it. - * - * This field is mandatory. - */ - int64_t time_ns; - - /** - * 1-Sigma uncertainty associated with the clock's time in nanoseconds. - * The uncertainty is represented as an absolute (single sided) value. - * - * If the data is available, 'flags' must contain - * LOC_GNSS_CLOCK_HAS_TIME_UNCERTAINTY. This value is effectively zero (it is - * the reference local clock, by which all other times and time - * uncertainties are measured.) (And thus this field can be not provided, - * per LOC_GNSS_CLOCK_HAS_TIME_UNCERTAINTY flag, or provided & set to 0.) - */ - double time_uncertainty_ns; - - /** - * The difference between hardware clock ('time' field) inside GPS receiver - * and the true GPS time since 0000Z, January 6, 1980, in nanoseconds. - * - * The sign of the value is defined by the following equation: - * local estimate of GPS time = time_ns - (full_bias_ns + bias_ns) - * - * This value is mandatory if the receiver has estimated GPS time. If the - * computed time is for a non-GPS constellation, the time offset of that - * constellation to GPS has to be applied to fill this value. The error - * estimate for the sum of this and the bias_ns is the bias_uncertainty_ns, - * and the caller is responsible for using this uncertainty (it can be very - * large before the GPS time has been solved for.) If the data is available - * 'flags' must contain LOC_GNSS_CLOCK_HAS_FULL_BIAS. - */ - int64_t full_bias_ns; - - /** - * Sub-nanosecond bias. - * The error estimate for the sum of this and the full_bias_ns is the - * bias_uncertainty_ns - * - * If the data is available 'flags' must contain LOC_GNSS_CLOCK_HAS_BIAS. If GPS - * has computed a position fix. This value is mandatory if the receiver has - * estimated GPS time. - */ - double bias_ns; - - /** - * 1-Sigma uncertainty associated with the local estimate of GPS time (clock - * bias) in nanoseconds. The uncertainty is represented as an absolute - * (single sided) value. - * - * If the data is available 'flags' must contain - * LOC_GNSS_CLOCK_HAS_BIAS_UNCERTAINTY. This value is mandatory if the receiver - * has estimated GPS time. - */ - double bias_uncertainty_ns; - - /** - * The clock's drift in nanoseconds (per second). - * - * A positive value means that the frequency is higher than the nominal - * frequency, and that the (full_bias_ns + bias_ns) is growing more positive - * over time. - * - * The value contains the 'drift uncertainty' in it. - * If the data is available 'flags' must contain LOC_GNSS_CLOCK_HAS_DRIFT. - * - * This value is mandatory if the receiver has estimated GNSS time - */ - double drift_nsps; - - /** - * 1-Sigma uncertainty associated with the clock's drift in nanoseconds (per second). - * The uncertainty is represented as an absolute (single sided) value. - * - * If the data is available 'flags' must contain - * LOC_GNSS_CLOCK_HAS_DRIFT_UNCERTAINTY. If GPS has computed a position fix this - * field is mandatory and must be populated. - */ - double drift_uncertainty_nsps; - - /** - * When there are any discontinuities in the HW clock, this field is - * mandatory. - * - * A "discontinuity" is meant to cover the case of a switch from one source - * of clock to another. A single free-running crystal oscillator (XO) - * should generally not have any discontinuities, and this can be set and - * left at 0. - * - * If, however, the time_ns value (HW clock) is derived from a composite of - * sources, that is not as smooth as a typical XO, or is otherwise stopped & - * restarted, then this value shall be incremented each time a discontinuity - * occurs. (E.g. this value may start at zero at device boot-up and - * increment each time there is a change in clock continuity. In the - * unlikely event that this value reaches full scale, rollover (not - * clamping) is required, such that this value continues to change, during - * subsequent discontinuity events.) - * - * While this number stays the same, between LocGnssClock reports, it can be - * safely assumed that the time_ns value has been running continuously, e.g. - * derived from a single, high quality clock (XO like, or better, that's - * typically used during continuous GNSS signal sampling.) - * - * It is expected, esp. during periods where there are few GNSS signals - * available, that the HW clock be discontinuity-free as long as possible, - * as this avoids the need to use (waste) a GNSS measurement to fully - * re-solve for the GPS clock bias and drift, when using the accompanying - * measurements, from consecutive LocGnssData reports. - */ - uint32_t hw_clock_discontinuity_count; - -} LocGnssClock; - -/** - * Legacy struct to represent a GPS Measurement, it contains raw and computed - * information. - * Deprecated, to be removed in the next Android release. - * Use LocGnssMeasurement instead. - */ -typedef struct { - /** set to sizeof(LocGpsMeasurement) */ - size_t size; - LocGpsMeasurementFlags flags; - int8_t prn; - double time_offset_ns; - LocGpsMeasurementState state; - int64_t received_gps_tow_ns; - int64_t received_gps_tow_uncertainty_ns; - double c_n0_dbhz; - double pseudorange_rate_mps; - double pseudorange_rate_uncertainty_mps; - LocGpsAccumulatedDeltaRangeState accumulated_delta_range_state; - double accumulated_delta_range_m; - double accumulated_delta_range_uncertainty_m; - double pseudorange_m; - double pseudorange_uncertainty_m; - double code_phase_chips; - double code_phase_uncertainty_chips; - float carrier_frequency_hz; - int64_t carrier_cycles; - double carrier_phase; - double carrier_phase_uncertainty; - LocGpsLossOfLock loss_of_lock; - int32_t bit_number; - int16_t time_from_last_bit_ms; - double doppler_shift_hz; - double doppler_shift_uncertainty_hz; - LocGpsMultipathIndicator multipath_indicator; - double snr_db; - double elevation_deg; - double elevation_uncertainty_deg; - double azimuth_deg; - double azimuth_uncertainty_deg; - bool used_in_fix; -} LocGpsMeasurement; - -/** - * Represents a GNSS Measurement, it contains raw and computed information. - * - * Independence - All signal measurement information (e.g. sv_time, - * pseudorange_rate, multipath_indicator) reported in this struct should be - * based on GNSS signal measurements only. You may not synthesize measurements - * by calculating or reporting expected measurements based on known or estimated - * position, velocity, or time. - */ -typedef struct { - /** set to sizeof(LocGnssMeasurement) */ - size_t size; - - /** A set of flags indicating the validity of the fields in this data structure. */ - LocGnssMeasurementFlags flags; - - /** - * Satellite vehicle ID number, as defined in LocGnssSvInfo::svid - * This is a mandatory value. - */ - int16_t svid; - - /** - * Defines the constellation of the given SV. Value should be one of those - * LOC_GNSS_CONSTELLATION_* constants - */ - LocGnssConstellationType constellation; - - /** - * Time offset at which the measurement was taken in nanoseconds. - * The reference receiver's time is specified by LocGpsData::clock::time_ns and should be - * interpreted in the same way as indicated by LocGpsClock::type. - * - * The sign of time_offset_ns is given by the following equation: - * measurement time = LocGpsClock::time_ns + time_offset_ns - * - * It provides an individual time-stamp for the measurement, and allows sub-nanosecond accuracy. - * This is a mandatory value. - */ - double time_offset_ns; - - /** - * Per satellite sync state. It represents the current sync state for the associated satellite. - * Based on the sync state, the 'received GPS tow' field should be interpreted accordingly. - * - * This is a mandatory value. - */ - LocGnssMeasurementState state; - - /** - * The received GNSS Time-of-Week at the measurement time, in nanoseconds. - * Ensure that this field is independent (see comment at top of - * LocGnssMeasurement struct.) - * - * For GPS & QZSS, this is: - * Received GPS Time-of-Week at the measurement time, in nanoseconds. - * The value is relative to the beginning of the current GPS week. - * - * Given the highest sync state that can be achieved, per each satellite, valid range - * for this field can be: - * Searching : [ 0 ] : LOC_GNSS_MEASUREMENT_STATE_UNKNOWN - * C/A code lock : [ 0 1ms ] : LOC_GNSS_MEASUREMENT_STATE_CODE_LOCK is set - * Bit sync : [ 0 20ms ] : LOC_GNSS_MEASUREMENT_STATE_BIT_SYNC is set - * Subframe sync : [ 0 6s ] : LOC_GNSS_MEASUREMENT_STATE_SUBFRAME_SYNC is set - * TOW decoded : [ 0 1week ] : LOC_GNSS_MEASUREMENT_STATE_TOW_DECODED is set - * - * Note well: if there is any ambiguity in integer millisecond, - * LOC_GNSS_MEASUREMENT_STATE_MSEC_AMBIGUOUS should be set accordingly, in the 'state' field. - * - * This value must be populated if 'state' != LOC_GNSS_MEASUREMENT_STATE_UNKNOWN. - * - * For Glonass, this is: - * Received Glonass time of day, at the measurement time in nanoseconds. - * - * Given the highest sync state that can be achieved, per each satellite, valid range for - * this field can be: - * Searching : [ 0 ] : LOC_GNSS_MEASUREMENT_STATE_UNKNOWN - * C/A code lock : [ 0 1ms ] : LOC_GNSS_MEASUREMENT_STATE_CODE_LOCK is set - * Symbol sync : [ 0 10ms ] : LOC_GNSS_MEASUREMENT_STATE_SYMBOL_SYNC is set - * Bit sync : [ 0 20ms ] : LOC_GNSS_MEASUREMENT_STATE_BIT_SYNC is set - * String sync : [ 0 2s ] : LOC_GNSS_MEASUREMENT_STATE_GLO_STRING_SYNC is set - * Time of day : [ 0 1day ] : LOC_GNSS_MEASUREMENT_STATE_GLO_TOD_DECODED is set - * - * For Beidou, this is: - * Received Beidou time of week, at the measurement time in nanoseconds. - * - * Given the highest sync state that can be achieved, per each satellite, valid range for - * this field can be: - * Searching : [ 0 ] : LOC_GNSS_MEASUREMENT_STATE_UNKNOWN - * C/A code lock: [ 0 1ms ] : LOC_GNSS_MEASUREMENT_STATE_CODE_LOCK is set - * Bit sync (D2): [ 0 2ms ] : LOC_GNSS_MEASUREMENT_STATE_BDS_D2_BIT_SYNC is set - * Bit sync (D1): [ 0 20ms ] : LOC_GNSS_MEASUREMENT_STATE_BIT_SYNC is set - * Subframe (D2): [ 0 0.6s ] : LOC_GNSS_MEASUREMENT_STATE_BDS_D2_SUBFRAME_SYNC is set - * Subframe (D1): [ 0 6s ] : LOC_GNSS_MEASUREMENT_STATE_SUBFRAME_SYNC is set - * Time of week : [ 0 1week ] : LOC_GNSS_MEASUREMENT_STATE_TOW_DECODED is set - * - * For Galileo, this is: - * Received Galileo time of week, at the measurement time in nanoseconds. - * - * E1BC code lock : [ 0 4ms ] : LOC_GNSS_MEASUREMENT_STATE_GAL_E1BC_CODE_LOCK is set - * E1C 2nd code lock: [ 0 100ms ] : - * LOC_GNSS_MEASUREMENT_STATE_GAL_E1C_2ND_CODE_LOCK is set - * - * E1B page : [ 0 2s ] : LOC_GNSS_MEASUREMENT_STATE_GAL_E1B_PAGE_SYNC is set - * Time of week: [ 0 1week ] : LOC_GNSS_MEASUREMENT_STATE_TOW_DECODED is set - * - * For SBAS, this is: - * Received SBAS time, at the measurement time in nanoseconds. - * - * Given the highest sync state that can be achieved, per each satellite, - * valid range for this field can be: - * Searching : [ 0 ] : LOC_GNSS_MEASUREMENT_STATE_UNKNOWN - * C/A code lock: [ 0 1ms ] : LOC_GNSS_MEASUREMENT_STATE_CODE_LOCK is set - * Symbol sync : [ 0 2ms ] : LOC_GNSS_MEASUREMENT_STATE_SYMBOL_SYNC is set - * Message : [ 0 1s ] : LOC_GNSS_MEASUREMENT_STATE_SBAS_SYNC is set - */ - int64_t received_sv_time_in_ns; - - /** - * 1-Sigma uncertainty of the Received GPS Time-of-Week in nanoseconds. - * - * This value must be populated if 'state' != LOC_GPS_MEASUREMENT_STATE_UNKNOWN. - */ - int64_t received_sv_time_uncertainty_in_ns; - - /** - * Carrier-to-noise density in dB-Hz, typically in the range [0, 63]. - * It contains the measured C/N0 value for the signal at the antenna port. - * - * This is a mandatory value. - */ - double c_n0_dbhz; - - /** - * Pseudorange rate at the timestamp in m/s. The correction of a given - * Pseudorange Rate value includes corrections for receiver and satellite - * clock frequency errors. Ensure that this field is independent (see - * comment at top of LocGnssMeasurement struct.) - * - * It is mandatory to provide the 'uncorrected' 'pseudorange rate', and provide LocGpsClock's - * 'drift' field as well (When providing the uncorrected pseudorange rate, do not apply the - * corrections described above.) - * - * The value includes the 'pseudorange rate uncertainty' in it. - * A positive 'uncorrected' value indicates that the SV is moving away from the receiver. - * - * The sign of the 'uncorrected' 'pseudorange rate' and its relation to the sign of 'doppler - * shift' is given by the equation: - * pseudorange rate = -k * doppler shift (where k is a constant) - * - * This should be the most accurate pseudorange rate available, based on - * fresh signal measurements from this channel. - * - * It is mandatory that this value be provided at typical carrier phase PRR - * quality (few cm/sec per second of uncertainty, or better) - when signals - * are sufficiently strong & stable, e.g. signals from a GPS simulator at >= - * 35 dB-Hz. - */ - double pseudorange_rate_mps; - - /** - * 1-Sigma uncertainty of the pseudorange_rate_mps. - * The uncertainty is represented as an absolute (single sided) value. - * - * This is a mandatory value. - */ - double pseudorange_rate_uncertainty_mps; - - /** - * Accumulated delta range's state. It indicates whether ADR is reset or there is a cycle slip - * (indicating loss of lock). - * - * This is a mandatory value. - */ - LocGnssAccumulatedDeltaRangeState accumulated_delta_range_state; - - /** - * Accumulated delta range since the last channel reset in meters. - * A positive value indicates that the SV is moving away from the receiver. - * - * The sign of the 'accumulated delta range' and its relation to the sign of 'carrier phase' - * is given by the equation: - * accumulated delta range = -k * carrier phase (where k is a constant) - * - * This value must be populated if 'accumulated delta range state' != LOC_GPS_ADR_STATE_UNKNOWN. - * However, it is expected that the data is only accurate when: - * 'accumulated delta range state' == LOC_GPS_ADR_STATE_VALID. - */ - double accumulated_delta_range_m; - - /** - * 1-Sigma uncertainty of the accumulated delta range in meters. - * This value must be populated if 'accumulated delta range state' != LOC_GPS_ADR_STATE_UNKNOWN. - */ - double accumulated_delta_range_uncertainty_m; - - /** - * Carrier frequency at which codes and messages are modulated, it can be L1 or L2. - * If the field is not set, the carrier frequency is assumed to be L1. - * - * If the data is available, 'flags' must contain - * LOC_GNSS_MEASUREMENT_HAS_CARRIER_FREQUENCY. - */ - float carrier_frequency_hz; - - /** - * The number of full carrier cycles between the satellite and the receiver. - * The reference frequency is given by the field 'carrier_frequency_hz'. - * Indications of possible cycle slips and resets in the accumulation of - * this value can be inferred from the accumulated_delta_range_state flags. - * - * If the data is available, 'flags' must contain - * LOC_GNSS_MEASUREMENT_HAS_CARRIER_CYCLES. - */ - int64_t carrier_cycles; - - /** - * The RF phase detected by the receiver, in the range [0.0, 1.0]. - * This is usually the fractional part of the complete carrier phase measurement. - * - * The reference frequency is given by the field 'carrier_frequency_hz'. - * The value contains the 'carrier-phase uncertainty' in it. - * - * If the data is available, 'flags' must contain - * LOC_GNSS_MEASUREMENT_HAS_CARRIER_PHASE. - */ - double carrier_phase; - - /** - * 1-Sigma uncertainty of the carrier-phase. - * If the data is available, 'flags' must contain - * LOC_GNSS_MEASUREMENT_HAS_CARRIER_PHASE_UNCERTAINTY. - */ - double carrier_phase_uncertainty; - - /** - * An enumeration that indicates the 'multipath' state of the event. - * - * The multipath Indicator is intended to report the presence of overlapping - * signals that manifest as distorted correlation peaks. - * - * - if there is a distorted correlation peak shape, report that multipath - * is LOC_GNSS_MULTIPATH_INDICATOR_PRESENT. - * - if there is not a distorted correlation peak shape, report - * LOC_GNSS_MULTIPATH_INDICATOR_NOT_PRESENT - * - if signals are too weak to discern this information, report - * LOC_GNSS_MULTIPATH_INDICATOR_UNKNOWN - * - * Example: when doing the standardized overlapping Multipath Performance - * test (3GPP TS 34.171) the Multipath indicator should report - * LOC_GNSS_MULTIPATH_INDICATOR_PRESENT for those signals that are tracked, and - * contain multipath, and LOC_GNSS_MULTIPATH_INDICATOR_NOT_PRESENT for those - * signals that are tracked and do not contain multipath. - */ - LocGnssMultipathIndicator multipath_indicator; - - /** - * Signal-to-noise ratio at correlator output in dB. - * If the data is available, 'flags' must contain LOC_GNSS_MEASUREMENT_HAS_SNR. - * This is the power ratio of the "correlation peak height above the - * observed noise floor" to "the noise RMS". - */ - double snr_db; -} LocGnssMeasurement; - -/** - * Legacy struct to represents a reading of GPS measurements. - * Deprecated, to be removed in the next Android release. - * Use LocGnssData instead. - */ -typedef struct { - /** set to sizeof(LocGpsData) */ - size_t size; - size_t measurement_count; - LocGpsMeasurement measurements[LOC_GPS_MAX_MEASUREMENT]; - - /** The GPS clock time reading. */ - LocGpsClock clock; -} LocGpsData; - -/** - * Represents a reading of GNSS measurements. For devices where LocGnssSystemInfo's - * year_of_hw is set to 2016+, it is mandatory that these be provided, on - * request, when the GNSS receiver is searching/tracking signals. - * - * - Reporting of GPS constellation measurements is mandatory. - * - Reporting of all tracked constellations are encouraged. - */ -typedef struct { - /** set to sizeof(LocGnssData) */ - size_t size; - - /** Number of measurements. */ - size_t measurement_count; - - /** The array of measurements. */ - LocGnssMeasurement measurements[LOC_GNSS_MAX_MEASUREMENT]; - - /** The GPS clock time reading. */ - LocGnssClock clock; -} LocGnssData; - -/** - * The legacy callback for to report measurements from the HAL. - * - * This callback is deprecated, and will be removed in the next release. Use - * loc_gnss_measurement_callback() instead. - * - * Parameters: - * data - A data structure containing the measurements. - */ -typedef void (*loc_gps_measurement_callback) (LocGpsData* data); - -/** - * The callback for to report measurements from the HAL. - * - * Parameters: - * data - A data structure containing the measurements. - */ -typedef void (*loc_gnss_measurement_callback) (LocGnssData* data); - -typedef struct { - /** set to sizeof(LocGpsMeasurementCallbacks) */ - size_t size; - loc_gps_measurement_callback measurement_callback; - loc_gnss_measurement_callback loc_gnss_measurement_callback; -} LocGpsMeasurementCallbacks; - -#define LOC_GPS_MEASUREMENT_OPERATION_SUCCESS 0 -#define LOC_GPS_MEASUREMENT_ERROR_ALREADY_INIT -100 -#define LOC_GPS_MEASUREMENT_ERROR_GENERIC -101 - -/** - * Extended interface for GPS Measurements support. - */ -typedef struct { - /** Set to sizeof(LocGpsMeasurementInterface) */ - size_t size; - - /** - * Initializes the interface and registers the callback routines with the HAL. - * After a successful call to 'init' the HAL must begin to provide updates at its own phase. - * - * Status: - * LOC_GPS_MEASUREMENT_OPERATION_SUCCESS - * LOC_GPS_MEASUREMENT_ERROR_ALREADY_INIT - if a callback has already been registered without a - * corresponding call to 'close' - * LOC_GPS_MEASUREMENT_ERROR_GENERIC - if any other error occurred, it is expected that the HAL - * will not generate any updates upon returning this error code. - */ - int (*init) (LocGpsMeasurementCallbacks* callbacks); - - /** - * Stops updates from the HAL, and unregisters the callback routines. - * After a call to stop, the previously registered callbacks must be considered invalid by the - * HAL. - * If stop is invoked without a previous 'init', this function should perform no work. - */ - void (*close) (); - -} LocGpsMeasurementInterface; - -#if 0 -/** - * Legacy struct to represents a GPS navigation message (or a fragment of it). - * Deprecated, to be removed in the next Android release. - * Use GnssNavigationMessage instead. - */ -typedef struct { - /** set to sizeof(GpsNavigationMessage) */ - size_t size; - int8_t prn; - GpsNavigationMessageType type; - NavigationMessageStatus status; - int16_t message_id; - int16_t submessage_id; - size_t data_length; - uint8_t* data; -} GpsNavigationMessage; - -/** Represents a GPS navigation message (or a fragment of it). */ -typedef struct { - /** set to sizeof(GnssNavigationMessage) */ - size_t size; - - /** - * Satellite vehicle ID number, as defined in LocGnssSvInfo::svid - * This is a mandatory value. - */ - int16_t svid; - - /** - * The type of message contained in the structure. - * This is a mandatory value. - */ - GnssNavigationMessageType type; - - /** - * The status of the received navigation message. - * No need to send any navigation message that contains words with parity error and cannot be - * corrected. - */ - NavigationMessageStatus status; - - /** - * Message identifier. It provides an index so the complete Navigation - * Message can be assembled. - * - * - For GPS L1 C/A subframe 4 and 5, this value corresponds to the 'frame - * id' of the navigation message, in the range of 1-25 (Subframe 1, 2, 3 - * does not contain a 'frame id' and this value can be set to -1.) - * - * - For Glonass L1 C/A, this refers to the frame ID, in the range of 1-5. - * - * - For BeiDou D1, this refers to the frame number in the range of 1-24 - * - * - For Beidou D2, this refers to the frame number, in the range of 1-120 - * - * - For Galileo F/NAV nominal frame structure, this refers to the subframe - * number, in the range of 1-12 - * - * - For Galileo I/NAV nominal frame structure, this refers to the subframe - * number in the range of 1-24 - */ - int16_t message_id; - - /** - * Sub-message identifier. If required by the message 'type', this value - * contains a sub-index within the current message (or frame) that is being - * transmitted. - * - * - For GPS L1 C/A, BeiDou D1 & BeiDou D2, the submessage id corresponds to - * the subframe number of the navigation message, in the range of 1-5. - * - * - For Glonass L1 C/A, this refers to the String number, in the range from - * 1-15 - * - * - For Galileo F/NAV, this refers to the page type in the range 1-6 - * - * - For Galileo I/NAV, this refers to the word type in the range 1-10+ - */ - int16_t submessage_id; - - /** - * The length of the data (in bytes) contained in the current message. - * If this value is different from zero, 'data' must point to an array of the same size. - * e.g. for L1 C/A the size of the sub-frame will be 40 bytes (10 words, 30 bits/word). - * - * This is a mandatory value. - */ - size_t data_length; - - /** - * The data of the reported GPS message. The bytes (or words) specified - * using big endian format (MSB first). - * - * - For GPS L1 C/A, Beidou D1 & Beidou D2, each subframe contains 10 30-bit - * words. Each word (30 bits) should be fit into the last 30 bits in a - * 4-byte word (skip B31 and B32), with MSB first, for a total of 40 - * bytes, covering a time period of 6, 6, and 0.6 seconds, respectively. - * - * - For Glonass L1 C/A, each string contains 85 data bits, including the - * checksum. These bits should be fit into 11 bytes, with MSB first (skip - * B86-B88), covering a time period of 2 seconds. - * - * - For Galileo F/NAV, each word consists of 238-bit (sync & tail symbols - * excluded). Each word should be fit into 30-bytes, with MSB first (skip - * B239, B240), covering a time period of 10 seconds. - * - * - For Galileo I/NAV, each page contains 2 page parts, even and odd, with - * a total of 2x114 = 228 bits, (sync & tail excluded) that should be fit - * into 29 bytes, with MSB first (skip B229-B232). - */ - uint8_t* data; - -} GnssNavigationMessage; - -/** - * The legacy callback to report an available fragment of a GPS navigation - * messages from the HAL. - * - * This callback is deprecated, and will be removed in the next release. Use - * gnss_navigation_message_callback() instead. - * - * Parameters: - * message - The GPS navigation submessage/subframe representation. - */ -typedef void (*gps_navigation_message_callback) (GpsNavigationMessage* message); - -/** - * The callback to report an available fragment of a GPS navigation messages from the HAL. - * - * Parameters: - * message - The GPS navigation submessage/subframe representation. - */ -typedef void (*gnss_navigation_message_callback) (GnssNavigationMessage* message); - -typedef struct { - /** set to sizeof(GpsNavigationMessageCallbacks) */ - size_t size; - gps_navigation_message_callback navigation_message_callback; - gnss_navigation_message_callback gnss_navigation_message_callback; -} GpsNavigationMessageCallbacks; - -#define GPS_NAVIGATION_MESSAGE_OPERATION_SUCCESS 0 -#define GPS_NAVIGATION_MESSAGE_ERROR_ALREADY_INIT -100 -#define GPS_NAVIGATION_MESSAGE_ERROR_GENERIC -101 - -/** - * Extended interface for GPS navigation message reporting support. - */ -typedef struct { - /** Set to sizeof(GpsNavigationMessageInterface) */ - size_t size; - - /** - * Initializes the interface and registers the callback routines with the HAL. - * After a successful call to 'init' the HAL must begin to provide updates as they become - * available. - * - * Status: - * GPS_NAVIGATION_MESSAGE_OPERATION_SUCCESS - * GPS_NAVIGATION_MESSAGE_ERROR_ALREADY_INIT - if a callback has already been registered - * without a corresponding call to 'close'. - * GPS_NAVIGATION_MESSAGE_ERROR_GENERIC - if any other error occurred, it is expected that - * the HAL will not generate any updates upon returning this error code. - */ - int (*init) (GpsNavigationMessageCallbacks* callbacks); - - /** - * Stops updates from the HAL, and unregisters the callback routines. - * After a call to stop, the previously registered callbacks must be considered invalid by the - * HAL. - * If stop is invoked without a previous 'init', this function should perform no work. - */ - void (*close) (); - -} GpsNavigationMessageInterface; -#endif - -/** - * Interface for passing GNSS configuration contents from platform to HAL. - */ -typedef struct { - /** Set to sizeof(LocGnssConfigurationInterface) */ - size_t size; - - /** - * Deliver GNSS configuration contents to HAL. - * Parameters: - * config_data - a pointer to a char array which holds what usually is expected from - file(/vendor/etc/gps.conf), i.e., a sequence of UTF8 strings separated by '\n'. - * length - total number of UTF8 characters in configuraiton data. - * - * IMPORTANT: - * GPS HAL should expect this function can be called multiple times. And it may be - * called even when GpsLocationProvider is already constructed and enabled. GPS HAL - * should maintain the existing requests for various callback regardless the change - * in configuration data. - */ - void (*configuration_update) (const char* config_data, int32_t length); -} LocGnssConfigurationInterface; - -__END_DECLS - -#endif /* LOC_GPS_H */ - diff --git a/gps/utils/loc_log.cpp b/gps/utils/loc_log.cpp deleted file mode 100644 index 50d9e4d..0000000 --- a/gps/utils/loc_log.cpp +++ /dev/null @@ -1,239 +0,0 @@ -/* 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_NDEBUG 0 - -#include <stdio.h> -#include <stdlib.h> -#include <sys/time.h> -#include <time.h> -#include "log_util.h" -#include "loc_log.h" -#include "msg_q.h" -#include <loc_pla.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_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; -} - diff --git a/gps/utils/loc_log.h b/gps/utils/loc_log.h deleted file mode 100644 index be492b1..0000000 --- a/gps/utils/loc_log.h +++ /dev/null @@ -1,71 +0,0 @@ -/* 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. - * - */ - -#ifndef LOC_LOG_H -#define LOC_LOG_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include <ctype.h> -#include <stdlib.h> -#include "loc_target.h" - -typedef struct -{ - const char *name; - long val; -} loc_name_val_s_type; - -#define NAME_VAL(x) {"" #x "", x } - -#define UNKNOWN_STR "UNKNOWN" - -#define CHECK_MASK(type, value, mask_var, mask) \ - (((mask_var) & (mask)) ? (type) (value) : (type) (-1)) - -#define LOC_TABLE_SIZE(table) (sizeof(table)/sizeof((table)[0])) - -/* Get names from value */ -const char* loc_get_name_from_mask(const loc_name_val_s_type table[], size_t table_size, long mask); -const char* loc_get_name_from_val(const loc_name_val_s_type table[], size_t table_size, long value); -const char* loc_get_msg_q_status(int status); -const char* loc_get_target_name(unsigned int target); - -extern const char* log_succ_fail_string(int is_succ); - -extern char *loc_get_time(char *time_string, size_t buf_size); - -#ifdef __cplusplus -} -#endif - -#endif /* LOC_LOG_H */ diff --git a/gps/utils/loc_misc_utils.cpp b/gps/utils/loc_misc_utils.cpp deleted file mode 100644 index b7c8406..0000000 --- a/gps/utils/loc_misc_utils.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* 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. - * - */ -#define LOG_NDEBUG 0 -#define LOG_TAG "LocSvc_misc_utils" -#include <stdio.h> -#include <string.h> -#include <log_util.h> -#include <loc_misc_utils.h> -#include <ctype.h> - - -int loc_util_split_string(char *raw_string, char **split_strings_ptr, - int max_num_substrings, char delimiter) -{ - int raw_string_index=0; - int num_split_strings=0; - unsigned char end_string=0; - int raw_string_length=0; - - if(!raw_string || !split_strings_ptr) { - LOC_LOGE("%s:%d]: NULL parameters", __func__, __LINE__); - num_split_strings = -1; - goto err; - } - LOC_LOGD("%s:%d]: raw string: %s\n", __func__, __LINE__, raw_string); - raw_string_length = strlen(raw_string) + 1; - split_strings_ptr[num_split_strings] = &raw_string[raw_string_index]; - for(raw_string_index=0; raw_string_index < raw_string_length; raw_string_index++) { - if(raw_string[raw_string_index] == '\0') - end_string=1; - if((raw_string[raw_string_index] == delimiter) || end_string) { - raw_string[raw_string_index] = '\0'; - LOC_LOGD("%s:%d]: split string: %s\n", - __func__, __LINE__, split_strings_ptr[num_split_strings]); - num_split_strings++; - if(((raw_string_index + 1) < raw_string_length) && - (num_split_strings < max_num_substrings)) { - split_strings_ptr[num_split_strings] = &raw_string[raw_string_index+1]; - } - else { - break; - } - } - if(end_string) - break; - } -err: - LOC_LOGD("%s:%d]: num_split_strings: %d\n", __func__, __LINE__, num_split_strings); - return num_split_strings; -} - -void loc_util_trim_space(char *org_string) -{ - char *scan_ptr, *write_ptr; - char *first_nonspace = NULL, *last_nonspace = NULL; - - if(org_string == NULL) { - LOC_LOGE("%s:%d]: NULL parameter", __func__, __LINE__); - goto err; - } - - scan_ptr = write_ptr = org_string; - - while (*scan_ptr) { - //Find the first non-space character - if ( !isspace(*scan_ptr) && first_nonspace == NULL) { - first_nonspace = scan_ptr; - } - //Once the first non-space character is found in the - //above check, keep shifting the characters to the left - //to replace the spaces - if (first_nonspace != NULL) { - *(write_ptr++) = *scan_ptr; - //Keep track of which was the last non-space character - //encountered - //last_nonspace will not be updated in the case where - //the string ends with spaces - if ( !isspace(*scan_ptr)) { - last_nonspace = write_ptr; - } - } - scan_ptr++; - } - //Add NULL terminator after the last non-space character - if (last_nonspace) { *last_nonspace = '\0'; } -err: - return; -} diff --git a/gps/utils/loc_misc_utils.h b/gps/utils/loc_misc_utils.h deleted file mode 100644 index 7d66d84..0000000 --- a/gps/utils/loc_misc_utils.h +++ /dev/null @@ -1,99 +0,0 @@ -/* 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_MISC_UTILS_H_ -#define _LOC_MISC_UTILS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/*=========================================================================== -FUNCTION loc_split_string - -DESCRIPTION: - This function is used to split a delimiter separated string into - sub-strings. This function does not allocate new memory to store the split - strings. Instead, it places '\0' in places of delimiters and assings the - starting address of the substring within the raw string as the string address - The input raw_string no longer remains to be a collection of sub-strings - after this function is executed. - Please make a copy of the input string before calling this function if - necessary - -PARAMETERS: - char *raw_string: is the original string with delimiter separated substrings - char **split_strings_ptr: is the arraw of pointers which will hold the addresses - of individual substrings - int max_num_substrings: is the maximum number of substrings that are expected - by the caller. The array of pointers in the above parameter - is usually this long - char delimiter: is the delimiter that separates the substrings. Examples: ' ', ';' - -DEPENDENCIES - N/A - -RETURN VALUE - int Number of split strings - -SIDE EFFECTS - The input raw_string no longer remains a delimiter separated single string. - -EXAMPLE - delimiter = ' ' //space - raw_string = "hello new user" //delimiter is space ' ' - addresses = 0123456789abcd - split_strings_ptr[0] = &raw_string[0]; //split_strings_ptr[0] contains "hello" - split_strings_ptr[1] = &raw_string[6]; //split_strings_ptr[1] contains "new" - split_strings_ptr[2] = &raw_string[a]; //split_strings_ptr[2] contains "user" - -===========================================================================*/ -int loc_util_split_string(char *raw_string, char **split_strings_ptr, int max_num_substrings, - char delimiter); - -/*=========================================================================== -FUNCTION trim_space - -DESCRIPTION - Removes leading and trailing spaces of the string - -DEPENDENCIES - N/A - -RETURN VALUE - None - -SIDE EFFECTS - N/A -===========================================================================*/ -void loc_util_trim_space(char *org_string); -#ifdef __cplusplus -} -#endif - -#endif //_LOC_MISC_UTILS_H_ diff --git a/gps/utils/loc_nmea.cpp b/gps/utils/loc_nmea.cpp deleted file mode 100644 index 558dc65..0000000 --- a/gps/utils/loc_nmea.cpp +++ /dev/null @@ -1,1114 +0,0 @@ -/* Copyright (c) 2012-2017, 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_NDEBUG 0 -#define LOG_TAG "LocSvc_nmea" -#include <loc_nmea.h> -#include <math.h> -#include <log_util.h> -#include <loc_pla.h> - -#define GLONASS_SV_ID_OFFSET 64 -#define MAX_SATELLITES_IN_USE 12 - -// GNSS system id according to NMEA spec -#define SYSTEM_ID_GPS 1 -#define SYSTEM_ID_GLONASS 2 -#define SYSTEM_ID_GALILEO 3 -// Extended systems -#define SYSTEM_ID_BEIDOU 4 -#define SYSTEM_ID_QZSS 5 - -typedef struct loc_nmea_sv_meta_s -{ - char talker[3]; - LocGnssConstellationType svType; - uint32_t mask; - uint32_t svCount; - uint32_t svIdOffset; - uint32_t signalId; - uint32_t systemId; -} loc_nmea_sv_meta; - -typedef struct loc_sv_cache_info_s -{ - uint32_t gps_used_mask; - uint32_t glo_used_mask; - uint32_t gal_used_mask; - uint32_t qzss_used_mask; - uint32_t bds_used_mask; - uint32_t gps_count; - uint32_t glo_count; - uint32_t gal_count; - uint32_t qzss_count; - uint32_t bds_count; - float hdop; - float pdop; - float vdop; -} loc_sv_cache_info; - -/*=========================================================================== -FUNCTION loc_nmea_sv_meta_init - -DESCRIPTION - Init loc_nmea_sv_meta passed in - -DEPENDENCIES - NONE - -RETURN VALUE - Pointer to loc_nmea_sv_meta - -SIDE EFFECTS - N/A - -===========================================================================*/ -static loc_nmea_sv_meta* loc_nmea_sv_meta_init(loc_nmea_sv_meta& sv_meta, - loc_sv_cache_info& sv_cache_info, - GnssSvType svType, - bool needCombine) -{ - memset(&sv_meta, 0, sizeof(sv_meta)); - sv_meta.svType = svType; - - switch (svType) - { - case GNSS_SV_TYPE_GPS: - sv_meta.talker[0] = 'G'; - sv_meta.talker[1] = 'P'; - sv_meta.mask = sv_cache_info.gps_used_mask; - sv_meta.svCount = sv_cache_info.gps_count; - sv_meta.signalId = 1; - sv_meta.systemId = SYSTEM_ID_GPS; - break; - case GNSS_SV_TYPE_GLONASS: - sv_meta.talker[0] = 'G'; - sv_meta.talker[1] = 'L'; - sv_meta.mask = sv_cache_info.glo_used_mask; - sv_meta.svCount = sv_cache_info.glo_count; - // GLONASS SV ids are from 65-96 - sv_meta.svIdOffset = GLONASS_SV_ID_OFFSET; - sv_meta.signalId = 1; - sv_meta.systemId = SYSTEM_ID_GLONASS; - break; - case GNSS_SV_TYPE_GALILEO: - sv_meta.talker[0] = 'G'; - sv_meta.talker[1] = 'A'; - sv_meta.mask = sv_cache_info.gal_used_mask; - sv_meta.svCount = sv_cache_info.gal_count; - sv_meta.signalId = 7; - sv_meta.systemId = SYSTEM_ID_GALILEO; - break; - case GNSS_SV_TYPE_QZSS: - sv_meta.talker[0] = 'P'; - sv_meta.talker[1] = 'Q'; - sv_meta.mask = sv_cache_info.qzss_used_mask; - sv_meta.svCount = sv_cache_info.qzss_count; - // QZSS SV ids are from 193-197. So keep svIdOffset 0 - sv_meta.signalId = 0; - sv_meta.systemId = SYSTEM_ID_QZSS; - break; - case GNSS_SV_TYPE_BEIDOU: - sv_meta.talker[0] = 'P'; - sv_meta.talker[1] = 'Q'; - sv_meta.mask = sv_cache_info.bds_used_mask; - sv_meta.svCount = sv_cache_info.bds_count; - // BDS SV ids are from 201-235. So keep svIdOffset 0 - sv_meta.signalId = 0; - sv_meta.systemId = SYSTEM_ID_BEIDOU; - break; - default: - LOC_LOGE("NMEA Error unknow constellation type: %d", svType); - return NULL; - } - if (needCombine && - (sv_cache_info.gps_used_mask ? 1 : 0) + - (sv_cache_info.glo_used_mask ? 1 : 0) + - (sv_cache_info.gal_used_mask ? 1 : 0) + - (sv_cache_info.qzss_used_mask ? 1 : 0) + - (sv_cache_info.bds_used_mask ? 1 : 0) > 1) - { - // If GPS, GLONASS, Galileo, QZSS, BDS etc. are combined - // to obtain the reported position solution, - // talker shall be set to GN, to indicate that - // the satellites are used in a combined solution - sv_meta.talker[0] = 'G'; - sv_meta.talker[1] = 'N'; - } - return &sv_meta; -} - -/*=========================================================================== -FUNCTION loc_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 - -===========================================================================*/ -static int loc_nmea_put_checksum(char *pNmea, int maxSize) -{ - uint8_t checksum = 0; - int length = 0; - if(NULL == pNmea) - return 0; - - pNmea++; //skip the $ - while (*pNmea != '\0') - { - checksum ^= *pNmea++; - length++; - } - - // length now contains nmea sentence string length not including $ sign. - int checksumLength = snprintf(pNmea,(maxSize-length-1),"*%02X\r\n", checksum); - - // total length of nmea sentence is length of nmea sentence inc $ sign plus - // length of checksum (+1 is to cover the $ character in the length). - return (length + checksumLength + 1); -} - -/*=========================================================================== -FUNCTION loc_nmea_generate_GSA - -DESCRIPTION - Generate NMEA GSA sentences generated based on position report - Currently below sentences are generated: - - $GPGSA : GPS DOP and active SVs - - $GLGSA : GLONASS DOP and active SVs - - $GAGSA : GALILEO DOP and active SVs - - $GNGSA : GNSS DOP and active SVs - -DEPENDENCIES - NONE - -RETURN VALUE - Number of SVs used - -SIDE EFFECTS - N/A - -===========================================================================*/ -static uint32_t loc_nmea_generate_GSA(const GpsLocationExtended &locationExtended, - char* sentence, - int bufSize, - loc_nmea_sv_meta* sv_meta_p, - std::vector<std::string> &nmeaArraystr) -{ - if (!sentence || bufSize <= 0 || !sv_meta_p) - { - LOC_LOGE("NMEA Error invalid arguments."); - return 0; - } - - char* pMarker = sentence; - int lengthRemaining = bufSize; - int length = 0; - - uint32_t svUsedCount = 0; - uint32_t svUsedList[32] = {0}; - - char fixType = '\0'; - - const char* talker = sv_meta_p->talker; - uint32_t svIdOffset = sv_meta_p->svIdOffset; - uint32_t mask = sv_meta_p->mask; - - for (uint8_t i = 1; mask > 0 && svUsedCount < 32; i++) - { - if (mask & 1) - svUsedList[svUsedCount++] = i + svIdOffset; - mask = mask >> 1; - } - - if (svUsedCount == 0 && GNSS_SV_TYPE_GPS != sv_meta_p->svType) - return 0; - - if (svUsedCount == 0) - fixType = '1'; // no fix - else if (svUsedCount <= 3) - fixType = '2'; // 2D fix - else - fixType = '3'; // 3D fix - - // Start printing the sentence - // Format: $--GSA,a,x,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,p.p,h.h,v.v,s*cc - // a : Mode : A : Automatic, allowed to automatically switch 2D/3D - // x : Fixtype : 1 (no fix), 2 (2D fix), 3 (3D fix) - // xx : 12 SV ID - // p.p : Position DOP (Dilution of Precision) - // h.h : Horizontal DOP - // v.v : Vertical DOP - // s : GNSS System Id - // cc : Checksum value - length = snprintf(pMarker, lengthRemaining, "$%sGSA,A,%c,", talker, fixType); - - if (length < 0 || length >= lengthRemaining) - { - LOC_LOGE("NMEA Error in string formatting"); - return 0; - } - pMarker += length; - lengthRemaining -= length; - - // Add first 12 satellite IDs - for (uint8_t i = 0; i < 12; i++) - { - 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 0; - } - pMarker += length; - lengthRemaining -= length; - } - - // Add the position/horizontal/vertical DOP values - if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_DOP) - { - length = snprintf(pMarker, lengthRemaining, "%.1f,%.1f,%.1f,", - locationExtended.pdop, - locationExtended.hdop, - locationExtended.vdop); - } - else - { // no dop - length = snprintf(pMarker, lengthRemaining, ",,,"); - } - pMarker += length; - lengthRemaining -= length; - - // system id - length = snprintf(pMarker, lengthRemaining, "%d", sv_meta_p->systemId); - pMarker += length; - lengthRemaining -= length; - - /* Sentence is ready, add checksum and broadcast */ - length = loc_nmea_put_checksum(sentence, bufSize); - nmeaArraystr.push_back(sentence); - - return svUsedCount; -} - -/*=========================================================================== -FUNCTION loc_nmea_generate_GSV - -DESCRIPTION - Generate NMEA GSV sentences generated based on sv report - Currently below sentences are generated: - - $GPGSV: GPS Satellites in View - - $GLGSV: GLONASS Satellites in View - - $GAGSV: GALILEO Satellites in View - -DEPENDENCIES - NONE - -RETURN VALUE - NONE - -SIDE EFFECTS - N/A - -===========================================================================*/ -static void loc_nmea_generate_GSV(const GnssSvNotification &svNotify, - char* sentence, - int bufSize, - loc_nmea_sv_meta* sv_meta_p, - std::vector<std::string> &nmeaArraystr) -{ - if (!sentence || bufSize <= 0) - { - LOC_LOGE("NMEA Error invalid argument."); - return; - } - - char* pMarker = sentence; - int lengthRemaining = bufSize; - int length = 0; - int sentenceCount = 0; - int sentenceNumber = 1; - size_t svNumber = 1; - - const char* talker = sv_meta_p->talker; - uint32_t svIdOffset = sv_meta_p->svIdOffset; - int svCount = sv_meta_p->svCount; - - if (svCount <= 0) - { - // no svs in view, so just send a blank $--GSV sentence - snprintf(sentence, lengthRemaining, "$%sGSV,1,1,0,%d", talker, sv_meta_p->signalId); - length = loc_nmea_put_checksum(sentence, bufSize); - nmeaArraystr.push_back(sentence); - return; - } - - svNumber = 1; - sentenceNumber = 1; - sentenceCount = svCount / 4 + (svCount % 4 != 0); - - while (sentenceNumber <= sentenceCount) - { - pMarker = sentence; - lengthRemaining = bufSize; - - length = snprintf(pMarker, lengthRemaining, "$%sGSV,%d,%d,%02d", - talker, sentenceCount, sentenceNumber, svCount); - - if (length < 0 || length >= lengthRemaining) - { - LOC_LOGE("NMEA Error in string formatting"); - return; - } - pMarker += length; - lengthRemaining -= length; - - for (int i=0; (svNumber <= svNotify.count) && (i < 4); svNumber++) - { - if (sv_meta_p->svType == svNotify.gnssSvs[svNumber - 1].type) - { - length = snprintf(pMarker, lengthRemaining,",%02d,%02d,%03d,", - svNotify.gnssSvs[svNumber - 1].svId + svIdOffset, - (int)(0.5 + svNotify.gnssSvs[svNumber - 1].elevation), //float to int - (int)(0.5 + svNotify.gnssSvs[svNumber - 1].azimuth)); //float to int - - if (length < 0 || length >= lengthRemaining) - { - LOC_LOGE("NMEA Error in string formatting"); - return; - } - pMarker += length; - lengthRemaining -= length; - - if (svNotify.gnssSvs[svNumber - 1].cN0Dbhz > 0) - { - length = snprintf(pMarker, lengthRemaining,"%02d", - (int)(0.5 + svNotify.gnssSvs[svNumber - 1].cN0Dbhz)); //float to int - - if (length < 0 || length >= lengthRemaining) - { - LOC_LOGE("NMEA Error in string formatting"); - return; - } - pMarker += length; - lengthRemaining -= length; - } - - i++; - } - - } - - // append signalId - length = snprintf(pMarker, lengthRemaining,",%d",sv_meta_p->signalId); - pMarker += length; - lengthRemaining -= length; - - length = loc_nmea_put_checksum(sentence, bufSize); - nmeaArraystr.push_back(sentence); - sentenceNumber++; - - } //while -} - -/*=========================================================================== -FUNCTION loc_nmea_generate_pos - -DESCRIPTION - Generate NMEA sentences generated based on position report - Currently below sentences are generated within this function: - - $GPGSA : GPS DOP and active SVs - - $GLGSA : GLONASS DOP and active SVs - - $GAGSA : GALILEO DOP and active SVs - - $GNGSA : GNSS DOP and active SVs - - $--VTG : Track made good and ground speed - - $--RMC : Recommended minimum navigation information - - $--GGA : Time, position and fix related data - -DEPENDENCIES - NONE - -RETURN VALUE - 0 - -SIDE EFFECTS - N/A - -===========================================================================*/ -void loc_nmea_generate_pos(const UlpLocation &location, - const GpsLocationExtended &locationExtended, - unsigned char generate_nmea, - std::vector<std::string> &nmeaArraystr) -{ - 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; - int utcMSeconds = (location.gpsLocation.timestamp)%1000; - loc_sv_cache_info sv_cache_info = {}; - - if (GPS_LOCATION_EXTENDED_HAS_GNSS_SV_USED_DATA & locationExtended.flags) { - sv_cache_info.gps_used_mask = - (uint32_t)locationExtended.gnss_sv_used_ids.gps_sv_used_ids_mask; - sv_cache_info.glo_used_mask = - (uint32_t)locationExtended.gnss_sv_used_ids.glo_sv_used_ids_mask; - sv_cache_info.gal_used_mask = - (uint32_t)locationExtended.gnss_sv_used_ids.gal_sv_used_ids_mask; - sv_cache_info.qzss_used_mask = - (uint32_t)locationExtended.gnss_sv_used_ids.bds_sv_used_ids_mask; - sv_cache_info.bds_used_mask = - (uint32_t)locationExtended.gnss_sv_used_ids.qzss_sv_used_ids_mask; - } - if (generate_nmea) { - char talker[3] = {'G', 'P', '\0'}; - uint32_t svUsedCount = 0; - uint32_t count = 0; - loc_nmea_sv_meta sv_meta; - // ------------------- - // ---$GPGSA/$GNGSA--- - // ------------------- - - count = loc_nmea_generate_GSA(locationExtended, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_GPS, true), - nmeaArraystr); - if (count > 0) - { - svUsedCount += count; - talker[0] = sv_meta.talker[0]; - talker[1] = sv_meta.talker[1]; - } - - // ------------------- - // ---$GLGSA/$GNGSA--- - // ------------------- - - count = loc_nmea_generate_GSA(locationExtended, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_GLONASS, true), - nmeaArraystr); - if (count > 0) - { - svUsedCount += count; - talker[0] = sv_meta.talker[0]; - talker[1] = sv_meta.talker[1]; - } - - // ------------------- - // ---$GAGSA/$GNGSA--- - // ------------------- - - count = loc_nmea_generate_GSA(locationExtended, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_GALILEO, true), - nmeaArraystr); - if (count > 0) - { - svUsedCount += count; - talker[0] = sv_meta.talker[0]; - talker[1] = sv_meta.talker[1]; - } - - // -------------------------- - // ---$PQGSA/$GNGSA (QZSS)--- - // -------------------------- - - count = loc_nmea_generate_GSA(locationExtended, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_QZSS, false), - nmeaArraystr); - if (count > 0) - { - svUsedCount += count; - // talker should be default "GP". If GPS, GLO etc is used, it should be "GN" - } - - // ---------------------------- - // ---$PQGSA/$GNGSA (BEIDOU)--- - // ---------------------------- - count = loc_nmea_generate_GSA(locationExtended, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_BEIDOU, false), - nmeaArraystr); - if (count > 0) - { - svUsedCount += count; - // talker should be default "GP". If GPS, GLO etc is used, it should be "GN" - } - - // ------------------- - // ------$--VTG------- - // ------------------- - - pMarker = sentence; - lengthRemaining = sizeof(sentence); - - if (location.gpsLocation.flags & LOC_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, "$%sVTG,%.1lf,T,%.1lf,M,", talker, location.gpsLocation.bearing, magTrack); - } - else - { - length = snprintf(pMarker, lengthRemaining, "$%sVTG,,T,,M,", talker); - } - - if (length < 0 || length >= lengthRemaining) - { - LOC_LOGE("NMEA Error in string formatting"); - return; - } - pMarker += length; - lengthRemaining -= length; - - if (location.gpsLocation.flags & LOC_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 & LOC_GPS_LOCATION_HAS_LAT_LONG)) - // N means no fix - length = snprintf(pMarker, lengthRemaining, "%c", 'N'); - else if (LOC_NAV_MASK_SBAS_CORRECTION_IONO & locationExtended.navSolutionMask) - // D means differential - length = snprintf(pMarker, lengthRemaining, "%c", 'D'); - else if (LOC_POS_TECH_MASK_SENSORS == locationExtended.tech_mask) - // E means estimated (dead reckoning) - length = snprintf(pMarker, lengthRemaining, "%c", 'E'); - else // A means autonomous - length = snprintf(pMarker, lengthRemaining, "%c", 'A'); - - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); - nmeaArraystr.push_back(sentence); - - // ------------------- - // ------$--RMC------- - // ------------------- - - pMarker = sentence; - lengthRemaining = sizeof(sentence); - - length = snprintf(pMarker, lengthRemaining, "$%sRMC,%02d%02d%02d.%02d,A," , - talker, utcHours, utcMinutes, utcSeconds,utcMSeconds/10); - - if (length < 0 || length >= lengthRemaining) - { - LOC_LOGE("NMEA Error in string formatting"); - return; - } - pMarker += length; - lengthRemaining -= length; - - if (location.gpsLocation.flags & LOC_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 & LOC_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 & LOC_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 & LOC_GPS_LOCATION_HAS_LAT_LONG)) - // N means no fix - length = snprintf(pMarker, lengthRemaining, "%c", 'N'); - else if (LOC_NAV_MASK_SBAS_CORRECTION_IONO & locationExtended.navSolutionMask) - // D means differential - length = snprintf(pMarker, lengthRemaining, "%c", 'D'); - else if (LOC_POS_TECH_MASK_SENSORS == locationExtended.tech_mask) - // E means estimated (dead reckoning) - length = snprintf(pMarker, lengthRemaining, "%c", 'E'); - else // A means autonomous - length = snprintf(pMarker, lengthRemaining, "%c", 'A'); - - pMarker += length; - lengthRemaining -= length; - - // hardcode Navigation Status field to 'V' - length = snprintf(pMarker, lengthRemaining, ",%c", 'V'); - pMarker += length; - lengthRemaining -= length; - - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); - nmeaArraystr.push_back(sentence); - - // ------------------- - // ------$--GGA------- - // ------------------- - - pMarker = sentence; - lengthRemaining = sizeof(sentence); - - length = snprintf(pMarker, lengthRemaining, "$%sGGA,%02d%02d%02d.%02d," , - talker, utcHours, utcMinutes, utcSeconds, utcMSeconds/10); - - if (length < 0 || length >= lengthRemaining) - { - LOC_LOGE("NMEA Error in string formatting"); - return; - } - pMarker += length; - lengthRemaining -= length; - - if (location.gpsLocation.flags & LOC_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 & LOC_GPS_LOCATION_HAS_LAT_LONG)) - gpsQuality = '0'; // 0 means no fix - else if (LOC_NAV_MASK_SBAS_CORRECTION_IONO & locationExtended.navSolutionMask) - gpsQuality = '2'; // 2 means DGPS fix - else if (LOC_POS_TECH_MASK_SENSORS == locationExtended.tech_mask) - gpsQuality = '6'; // 6 means estimated (dead reckoning) - else - gpsQuality = '1'; // 1 means GPS fix - - // Number of satellites in use, 00-12 - if (svUsedCount > MAX_SATELLITES_IN_USE) - svUsedCount = MAX_SATELLITES_IN_USE; - if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_DOP) - { - length = snprintf(pMarker, lengthRemaining, "%c,%02d,%.1f,", - gpsQuality, svUsedCount, locationExtended.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 & LOC_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_nmea_put_checksum(sentence, sizeof(sentence)); - nmeaArraystr.push_back(sentence); - } - //Send blank NMEA reports for non-final fixes - else { - strlcpy(sentence, "$GPGSA,A,1,,,,,,,,,,,,,,,", sizeof(sentence)); - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); - nmeaArraystr.push_back(sentence); - - strlcpy(sentence, "$GNGSA,A,1,,,,,,,,,,,,,,,", sizeof(sentence)); - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); - nmeaArraystr.push_back(sentence); - - strlcpy(sentence, "$PQGSA,A,1,,,,,,,,,,,,,,,", sizeof(sentence)); - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); - nmeaArraystr.push_back(sentence); - - strlcpy(sentence, "$GPVTG,,T,,M,,N,,K,N", sizeof(sentence)); - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); - nmeaArraystr.push_back(sentence); - - strlcpy(sentence, "$GPRMC,,V,,,,,,,,,,N,V", sizeof(sentence)); - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); - nmeaArraystr.push_back(sentence); - - strlcpy(sentence, "$GPGGA,,,,,,0,,,,,,,,", sizeof(sentence)); - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); - nmeaArraystr.push_back(sentence); - } - - EXIT_LOG(%d, 0); -} - - - -/*=========================================================================== -FUNCTION loc_nmea_generate_sv - -DESCRIPTION - Generate NMEA sentences generated based on sv report - -DEPENDENCIES - NONE - -RETURN VALUE - 0 - -SIDE EFFECTS - N/A - -===========================================================================*/ -void loc_nmea_generate_sv(const GnssSvNotification &svNotify, - std::vector<std::string> &nmeaArraystr) -{ - ENTRY_LOG(); - - char sentence[NMEA_SENTENCE_MAX_LENGTH] = {0}; - int svCount = svNotify.count; - int svNumber = 1; - loc_sv_cache_info sv_cache_info = {}; - - //Count GPS SVs for saparating GPS from GLONASS and throw others - for(svNumber=1; svNumber <= svCount; svNumber++) { - if (GNSS_SV_TYPE_GPS == svNotify.gnssSvs[svNumber - 1].type) - { - // cache the used in fix mask, as it will be needed to send $GPGSA - // during the position report - if (GNSS_SV_OPTIONS_USED_IN_FIX_BIT == - (svNotify.gnssSvs[svNumber - 1].gnssSvOptionsMask & - GNSS_SV_OPTIONS_USED_IN_FIX_BIT)) - { - sv_cache_info.gps_used_mask |= (1 << (svNotify.gnssSvs[svNumber - 1].svId - 1)); - } - sv_cache_info.gps_count++; - } - else if (GNSS_SV_TYPE_GLONASS == svNotify.gnssSvs[svNumber - 1].type) - { - // cache the used in fix mask, as it will be needed to send $GNGSA - // during the position report - if (GNSS_SV_OPTIONS_USED_IN_FIX_BIT == - (svNotify.gnssSvs[svNumber - 1].gnssSvOptionsMask & - GNSS_SV_OPTIONS_USED_IN_FIX_BIT)) - { - sv_cache_info.glo_used_mask |= (1 << (svNotify.gnssSvs[svNumber - 1].svId - 1)); - } - sv_cache_info.glo_count++; - } - else if (GNSS_SV_TYPE_GALILEO == svNotify.gnssSvs[svNumber - 1].type) - { - // cache the used in fix mask, as it will be needed to send $GAGSA - // during the position report - if (GNSS_SV_OPTIONS_USED_IN_FIX_BIT == - (svNotify.gnssSvs[svNumber - 1].gnssSvOptionsMask & - GNSS_SV_OPTIONS_USED_IN_FIX_BIT)) - { - sv_cache_info.gal_used_mask |= (1 << (svNotify.gnssSvs[svNumber - 1].svId - 1)); - } - sv_cache_info.gal_count++; - } - else if (GNSS_SV_TYPE_QZSS == svNotify.gnssSvs[svNumber - 1].type) - { - // cache the used in fix mask, as it will be needed to send $PQGSA - // during the position report - if (GNSS_SV_OPTIONS_USED_IN_FIX_BIT == - (svNotify.gnssSvs[svNumber - 1].gnssSvOptionsMask & - GNSS_SV_OPTIONS_USED_IN_FIX_BIT)) - { - sv_cache_info.qzss_used_mask |= (1 << (svNotify.gnssSvs[svNumber - 1].svId - 1)); - } - sv_cache_info.qzss_count++; - } - else if (GNSS_SV_TYPE_BEIDOU == svNotify.gnssSvs[svNumber - 1].type) - { - // cache the used in fix mask, as it will be needed to send $PQGSA - // during the position report - if (GNSS_SV_OPTIONS_USED_IN_FIX_BIT == - (svNotify.gnssSvs[svNumber - 1].gnssSvOptionsMask & - GNSS_SV_OPTIONS_USED_IN_FIX_BIT)) - { - sv_cache_info.bds_used_mask |= (1 << (svNotify.gnssSvs[svNumber - 1].svId - 1)); - } - sv_cache_info.bds_count++; - } - } - - loc_nmea_sv_meta sv_meta; - // ------------------ - // ------$GPGSV------ - // ------------------ - - loc_nmea_generate_GSV(svNotify, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_GPS, false), nmeaArraystr); - - // ------------------ - // ------$GLGSV------ - // ------------------ - - loc_nmea_generate_GSV(svNotify, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_GLONASS, false), - nmeaArraystr); - - // ------------------ - // ------$GAGSV------ - // ------------------ - - loc_nmea_generate_GSV(svNotify, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_GALILEO, false), - nmeaArraystr); - - // ------------------------- - // ------$PQGSV (QZSS)------ - // ------------------------- - - loc_nmea_generate_GSV(svNotify, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_QZSS, false), nmeaArraystr); - - // --------------------------- - // ------$PQGSV (BEIDOU)------ - // --------------------------- - - loc_nmea_generate_GSV(svNotify, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_BEIDOU, false), - nmeaArraystr); - - EXIT_LOG(%d, 0); -} diff --git a/gps/utils/loc_nmea.h b/gps/utils/loc_nmea.h deleted file mode 100644 index 585a9c1..0000000 --- a/gps/utils/loc_nmea.h +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (c) 2012-2013, 2015-2017 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 <gps_extended.h> -#include <vector> -#include <string> -#define NMEA_SENTENCE_MAX_LENGTH 200 - -void loc_nmea_generate_sv(const GnssSvNotification &svNotify, - std::vector<std::string> &nmeaArraystr); - -void loc_nmea_generate_pos(const UlpLocation &location, - const GpsLocationExtended &locationExtended, - unsigned char generate_nmea, - std::vector<std::string> &nmeaArraystr); - -#define DEBUG_NMEA_MINSIZE 6 -#define DEBUG_NMEA_MAXSIZE 4096 -inline bool loc_nmea_is_debug(const char* nmea, int length) { - return ((nullptr != nmea) && - (length >= DEBUG_NMEA_MINSIZE) && (length <= DEBUG_NMEA_MAXSIZE) && - (nmea[0] == '$') && (nmea[1] == 'P') && (nmea[2] == 'Q') && (nmea[3] == 'W')); -} - -#endif // LOC_ENG_NMEA_H diff --git a/gps/utils/loc_target.cpp b/gps/utils/loc_target.cpp deleted file mode 100644 index 569f3a7..0000000 --- a/gps/utils/loc_target.cpp +++ /dev/null @@ -1,208 +0,0 @@ -/* Copyright (c) 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. - * - */ - -#include <unistd.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> -#include <log_util.h> -#include "loc_target.h" -#include "loc_log.h" -#include <loc_pla.h> - -#define APQ8064_ID_1 "109" -#define APQ8064_ID_2 "153" -#define MPQ8064_ID_1 "130" -#define MSM8930_ID_1 "142" -#define MSM8930_ID_2 "116" -#define APQ8030_ID_1 "157" -#define APQ8074_ID_1 "184" - -#define LINE_LEN 100 -#define STR_LIQUID "Liquid" -#define STR_SURF "Surf" -#define STR_MTP "MTP" -#define STR_APQ "apq" -#define STR_SDC "sdc" // alternative string for APQ targets -#define STR_MSM "msm" -#define STR_SDM "sdm" // alternative string for MSM targets -#define STR_APQ_NO_WGR "baseband_apq_nowgr" -#define STR_AUTO "auto" -#define IS_STR_END(c) ((c) == '\0' || (c) == '\n' || (c) == '\r') -#define LENGTH(s) (sizeof(s) - 1) -#define GPS_CHECK_NO_ERROR 0 -#define GPS_CHECK_NO_GPS_HW 1 - -static unsigned int gTarget = (unsigned int)-1; - -static int read_a_line(const char * file_path, char * line, int line_size) -{ - FILE *fp; - int result = 0; - - * line = '\0'; - fp = fopen(file_path, "r" ); - if( fp == NULL ) { - LOC_LOGE("open failed: %s: %s\n", file_path, strerror(errno)); - result = -1; - } else { - int len; - fgets(line, line_size, fp); - len = strlen(line); - len = len < line_size - 1? len : line_size - 1; - line[len] = '\0'; - LOC_LOGD("cat %s: %s", file_path, line); - fclose(fp); - } - return result; -} - -/*The character array passed to this function should have length - of atleast PROPERTY_VALUE_MAX*/ -void loc_get_target_baseband(char *baseband, int array_length) -{ - if(baseband && (array_length >= PROPERTY_VALUE_MAX)) { - property_get("ro.baseband", baseband, ""); - LOC_LOGD("%s:%d]: Baseband: %s\n", __func__, __LINE__, baseband); - } - else { - LOC_LOGE("%s:%d]: NULL parameter or array length less than PROPERTY_VALUE_MAX\n", - __func__, __LINE__); - } -} - -/*The character array passed to this function should have length - of atleast PROPERTY_VALUE_MAX*/ -void loc_get_platform_name(char *platform_name, int array_length) -{ - if(platform_name && (array_length >= PROPERTY_VALUE_MAX)) { - property_get("ro.board.platform", platform_name, ""); - LOC_LOGD("%s:%d]: Target name: %s\n", __func__, __LINE__, platform_name); - } - else { - LOC_LOGE("%s:%d]: Null parameter or array length less than PROPERTY_VALUE_MAX\n", - __func__, __LINE__); - } -} - -/*The character array passed to this function should have length - of atleast PROPERTY_VALUE_MAX*/ -void loc_get_auto_platform_name(char *platform_name, int array_length) -{ - if(platform_name && (array_length >= PROPERTY_VALUE_MAX)) { - property_get("ro.hardware.type", platform_name, ""); - LOC_LOGD("%s:%d]: Autoplatform name: %s\n", __func__, __LINE__, platform_name); - } - else { - LOC_LOGE("%s:%d]: Null parameter or array length less than PROPERTY_VALUE_MAX\n", - __func__, __LINE__); - } -} - -unsigned int loc_get_target(void) -{ - if (gTarget != (unsigned int)-1) - return gTarget; - - static const char hw_platform[] = "/sys/devices/soc0/hw_platform"; - static const char id[] = "/sys/devices/soc0/soc_id"; - static const char hw_platform_dep[] = - "/sys/devices/system/soc/soc0/hw_platform"; - static const char id_dep[] = "/sys/devices/system/soc/soc0/id"; - static const char mdm[] = "/target"; // mdm target we are using - - char rd_hw_platform[LINE_LEN]; - char rd_id[LINE_LEN]; - char rd_mdm[LINE_LEN]; - char baseband[LINE_LEN]; - char rd_auto_platform[LINE_LEN]; - - loc_get_target_baseband(baseband, sizeof(baseband)); - - if (!access(hw_platform, F_OK)) { - read_a_line(hw_platform, rd_hw_platform, LINE_LEN); - } else { - read_a_line(hw_platform_dep, rd_hw_platform, LINE_LEN); - } - if (!access(id, F_OK)) { - read_a_line(id, rd_id, LINE_LEN); - } else { - read_a_line(id_dep, rd_id, LINE_LEN); - } - - /*check automotive platform*/ - loc_get_auto_platform_name(rd_auto_platform, sizeof(rd_auto_platform)); - if( !memcmp(rd_auto_platform, STR_AUTO, LENGTH(STR_AUTO)) ) - { - gTarget = TARGET_AUTO; - goto detected; - } - - if( !memcmp(baseband, STR_APQ_NO_WGR, LENGTH(STR_APQ_NO_WGR)) ){ - - gTarget = TARGET_NO_GNSS; - goto detected; - } - - if( !memcmp(baseband, STR_APQ, LENGTH(STR_APQ)) || - !memcmp(baseband, STR_SDC, LENGTH(STR_SDC)) ) { - - if( !memcmp(rd_id, MPQ8064_ID_1, LENGTH(MPQ8064_ID_1)) - && IS_STR_END(rd_id[LENGTH(MPQ8064_ID_1)]) ) - gTarget = TARGET_NO_GNSS; - else - gTarget = TARGET_APQ_SA; - } else if (((!memcmp(rd_hw_platform, STR_LIQUID, LENGTH(STR_LIQUID)) - && IS_STR_END(rd_hw_platform[LENGTH(STR_LIQUID)])) || - (!memcmp(rd_hw_platform, STR_SURF, LENGTH(STR_SURF)) - && IS_STR_END(rd_hw_platform[LENGTH(STR_SURF)])) || - (!memcmp(rd_hw_platform, STR_MTP, LENGTH(STR_MTP)) - && IS_STR_END(rd_hw_platform[LENGTH(STR_MTP)]))) && - !read_a_line( mdm, rd_mdm, LINE_LEN)) { - gTarget = TARGET_MDM; - } else if( (!memcmp(rd_id, MSM8930_ID_1, LENGTH(MSM8930_ID_1)) - && IS_STR_END(rd_id[LENGTH(MSM8930_ID_1)])) || - (!memcmp(rd_id, MSM8930_ID_2, LENGTH(MSM8930_ID_2)) - && IS_STR_END(rd_id[LENGTH(MSM8930_ID_2)])) ) { - gTarget = TARGET_MSM_NO_SSC; - } else if ( !memcmp(baseband, STR_MSM, LENGTH(STR_MSM)) || - !memcmp(baseband, STR_SDM, LENGTH(STR_SDM)) ) { - gTarget = TARGET_DEFAULT; - } else { - gTarget = TARGET_UNKNOWN; - } - -detected: - LOC_LOGW("HAL: %s returned %d", __FUNCTION__, gTarget); - return gTarget; -} diff --git a/gps/utils/loc_target.h b/gps/utils/loc_target.h deleted file mode 100644 index 172b475..0000000 --- a/gps/utils/loc_target.h +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright (c) 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_TARGET_H -#define LOC_TARGET_H -#define TARGET_SET(gnss,ssc) ( (gnss<<1)|ssc ) -#define TARGET_DEFAULT TARGET_SET(GNSS_MSM, HAS_SSC) -#define TARGET_MDM TARGET_SET(GNSS_MDM, HAS_SSC) -#define TARGET_APQ_SA TARGET_SET(GNSS_GSS, NO_SSC) -#define TARGET_NO_GNSS TARGET_SET(GNSS_NONE, NO_SSC) -#define TARGET_MSM_NO_SSC TARGET_SET(GNSS_MSM, NO_SSC) -#define TARGET_AUTO TARGET_SET(GNSS_AUTO, NO_SSC) -#define TARGET_UNKNOWN TARGET_SET(GNSS_UNKNOWN, NO_SSC) -#define getTargetGnssType(target) (target>>1) - -#ifdef __cplusplus -extern "C" -{ -#endif - -unsigned int loc_get_target(void); - -/*The character array passed to this function should have length - of atleast PROPERTY_VALUE_MAX*/ -void loc_get_target_baseband(char *baseband, int array_length); -/*The character array passed to this function should have length - of atleast PROPERTY_VALUE_MAX*/ -void loc_get_platform_name(char *platform_name, int array_length); -/*The character array passed to this function should have length - of atleast PROPERTY_VALUE_MAX*/ -void loc_get_auto_platform_name(char *platform_name, int array_length); - -/* Please remember to update 'target_name' in loc_log.cpp, - if do any changes to this enum. */ -typedef enum { - GNSS_NONE = 0, - GNSS_MSM, - GNSS_GSS, - GNSS_MDM, - GNSS_AUTO, - GNSS_UNKNOWN -}GNSS_TARGET; - -typedef enum { - NO_SSC = 0, - HAS_SSC -}SSC_TYPE; - -#ifdef __cplusplus -} -#endif - -#endif /*LOC_TARGET_H*/ diff --git a/gps/utils/loc_timer.h b/gps/utils/loc_timer.h deleted file mode 100644 index fff0c46..0000000 --- a/gps/utils/loc_timer.h +++ /dev/null @@ -1,74 +0,0 @@ -/* 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 __LOC_DELAY_H__ -#define __LOC_DELAY_H__ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ -#include <stddef.h> -#include <stdint.h> -#include <loc_pla.h> -/* - user_data: client context pointer, passthrough. Originally received - from calling client when loc_timer_start() is called. - result: 0 if timer successfully timed out; else timer failed. -*/ -typedef void (*loc_timer_callback)(void *user_data, int32_t result); - - -/* - delay_msec: timeout value for the timer. - cb_func: callback function pointer, implemented by client. - Can not be NULL. - user_data: client context pointer, passthrough. Will be - returned when loc_timer_callback() is called. - 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. - Returns the handle, which can be used to stop the timer - NULL, if timer start fails (e.g. if cb_func is NULL). -*/ -void* loc_timer_start(uint64_t delay_msec, - loc_timer_callback cb_func, - void *user_data, - bool wake_on_expire=false); - -/* - handle becomes invalid upon the return of the callback -*/ -void loc_timer_stop(void*& handle); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif //__LOC_DELAY_H__ diff --git a/gps/utils/log_util.h b/gps/utils/log_util.h deleted file mode 100644 index feb4d3c..0000000 --- a/gps/utils/log_util.h +++ /dev/null @@ -1,175 +0,0 @@ -/* 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 __LOG_UTIL_H__ -#define __LOG_UTIL_H__ - -#if defined (USE_ANDROID_LOGGING) || defined (ANDROID) -// Android and LE targets with logcat support -#include <utils/Log.h> - -#elif defined (USE_GLIB) -// LE targets with no logcat support -#include <stdio.h> -#include <string.h> -#include <sys/types.h> -#include <unistd.h> -#include <cutils/log.h> - -#ifndef LOG_TAG -#define LOG_TAG "GPS_UTILS" -#endif /* LOG_TAG */ - -#endif /* #if defined (USE_ANDROID_LOGGING) || defined (ANDROID) */ - -#ifdef __cplusplus -extern "C" -{ -#endif -/*============================================================================= - * - * LOC LOGGER TYPE DECLARATION - * - *============================================================================*/ -/* LOC LOGGER */ -typedef struct loc_logger_s -{ - unsigned long DEBUG_LEVEL; - unsigned long TIMESTAMP; -} loc_logger_s_type; - -/*============================================================================= - * - * EXTERNAL DATA - * - *============================================================================*/ -extern loc_logger_s_type loc_logger; - -// Logging Improvements -extern const char *loc_logger_boolStr[]; - -extern const char *boolStr[]; -extern const char VOID_RET[]; -extern const char FROM_AFW[]; -extern const char TO_MODEM[]; -extern const char FROM_MODEM[]; -extern const char TO_AFW[]; -extern const char EXIT_TAG[]; -extern const char ENTRY_TAG[]; -extern const char EXIT_ERROR_TAG[]; - -/*============================================================================= - * - * MODULE EXPORTED FUNCTIONS - * - *============================================================================*/ -extern void loc_logger_init(unsigned long debug, unsigned long timestamp); -extern char* get_timestamp(char* str, unsigned long buf_size); - -#ifndef DEBUG_DMN_LOC_API - -/* LOGGING MACROS */ -/*loc_logger.DEBUG_LEVEL is initialized to 0xff in loc_cfg.cpp - if that value remains unchanged, it means gps.conf did not - provide a value and we default to the initial value to use - Android's logging levels*/ -#define IF_LOC_LOGE if((loc_logger.DEBUG_LEVEL >= 1) && (loc_logger.DEBUG_LEVEL <= 5)) -#define IF_LOC_LOGW if((loc_logger.DEBUG_LEVEL >= 2) && (loc_logger.DEBUG_LEVEL <= 5)) -#define IF_LOC_LOGI if((loc_logger.DEBUG_LEVEL >= 3) && (loc_logger.DEBUG_LEVEL <= 5)) -#define IF_LOC_LOGD if((loc_logger.DEBUG_LEVEL >= 4) && (loc_logger.DEBUG_LEVEL <= 5)) -#define IF_LOC_LOGV if((loc_logger.DEBUG_LEVEL >= 5) && (loc_logger.DEBUG_LEVEL <= 5)) - -#define LOC_LOGE(...) IF_LOC_LOGE { ALOGE(__VA_ARGS__); } -#define LOC_LOGW(...) IF_LOC_LOGW { ALOGW(__VA_ARGS__); } -#define LOC_LOGI(...) IF_LOC_LOGI { ALOGI(__VA_ARGS__); } -#define LOC_LOGD(...) IF_LOC_LOGD { ALOGD(__VA_ARGS__); } -#define LOC_LOGV(...) IF_LOC_LOGV { ALOGV(__VA_ARGS__); } - -#else /* DEBUG_DMN_LOC_API */ - -#define LOC_LOGE(...) ALOGE(__VA_ARGS__) -#define LOC_LOGW(...) ALOGW(__VA_ARGS__) -#define LOC_LOGI(...) ALOGI(__VA_ARGS__) -#define LOC_LOGD(...) ALOGD(__VA_ARGS__) -#define LOC_LOGV(...) ALOGV(__VA_ARGS__) - -#endif /* DEBUG_DMN_LOC_API */ - -/*============================================================================= - * - * LOGGING IMPROVEMENT MACROS - * - *============================================================================*/ -#define LOG_(LOC_LOG, ID, WHAT, SPEC, VAL) \ - do { \ - if (loc_logger.TIMESTAMP) { \ - char ts[32]; \ - LOC_LOG("[%s] %s %s line %d " #SPEC, \ - get_timestamp(ts, sizeof(ts)), ID, WHAT, __LINE__, VAL); \ - } else { \ - LOC_LOG("%s %s line %d " #SPEC, \ - ID, WHAT, __LINE__, VAL); \ - } \ - } while(0) - -#define LOC_LOG_HEAD(fmt) "%s:%d] " fmt -#define LOC_LOGv(fmt,...) LOC_LOGV(LOC_LOG_HEAD(fmt), __FUNCTION__, __LINE__, ##__VA_ARGS__) -#define LOC_LOGw(fmt,...) LOC_LOGW(LOC_LOG_HEAD(fmt), __FUNCTION__, __LINE__, ##__VA_ARGS__) -#define LOC_LOGi(fmt,...) LOC_LOGI(LOC_LOG_HEAD(fmt), __FUNCTION__, __LINE__, ##__VA_ARGS__) -#define LOC_LOGd(fmt,...) LOC_LOGD(LOC_LOG_HEAD(fmt), __FUNCTION__, __LINE__, ##__VA_ARGS__) -#define LOC_LOGe(fmt,...) LOC_LOGE(LOC_LOG_HEAD(fmt), __FUNCTION__, __LINE__, ##__VA_ARGS__) - -#define LOG_I(ID, WHAT, SPEC, VAL) LOG_(LOC_LOGI, ID, WHAT, SPEC, VAL) -#define LOG_V(ID, WHAT, SPEC, VAL) LOG_(LOC_LOGV, ID, WHAT, SPEC, VAL) -#define LOG_E(ID, WHAT, SPEC, VAL) LOG_(LOC_LOGE, ID, WHAT, SPEC, VAL) - -#define ENTRY_LOG() LOG_V(ENTRY_TAG, __FUNCTION__, %s, "") -#define EXIT_LOG(SPEC, VAL) LOG_V(EXIT_TAG, __FUNCTION__, SPEC, VAL) -#define EXIT_LOG_WITH_ERROR(SPEC, VAL) \ - if (VAL != 0) { \ - LOG_E(EXIT_ERROR_TAG, __FUNCTION__, SPEC, VAL); \ - } else { \ - LOG_V(EXIT_TAG, __FUNCTION__, SPEC, VAL); \ - } - - -// Used for logging callflow from Android Framework -#define ENTRY_LOG_CALLFLOW() LOG_I(FROM_AFW, __FUNCTION__, %s, "") -// Used for logging callflow to Modem -#define EXIT_LOG_CALLFLOW(SPEC, VAL) LOG_I(TO_MODEM, __FUNCTION__, SPEC, VAL) -// Used for logging callflow from Modem(TO_MODEM, __FUNCTION__, %s, "") -#define MODEM_LOG_CALLFLOW(SPEC, VAL) LOG_I(FROM_MODEM, __FUNCTION__, SPEC, VAL) -// Used for logging callflow to Android Framework -#define CALLBACK_LOG_CALLFLOW(CB, SPEC, VAL) LOG_I(TO_AFW, CB, SPEC, VAL) - -#ifdef __cplusplus -} -#endif - -#endif // __LOG_UTIL_H__ diff --git a/gps/utils/msg_q.c b/gps/utils/msg_q.c deleted file mode 100644 index 76c1478..0000000 --- a/gps/utils/msg_q.c +++ /dev/null @@ -1,333 +0,0 @@ -/* Copyright (c) 2011-2012, 2014, 2017 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_TAG "LocSvc_utils_q" -#include <stdio.h> -#include <stdlib.h> -#include <pthread.h> -#include <loc_pla.h> -#include <log_util.h> -#include "linked_list.h" -#include "msg_q.h" - -typedef struct msg_q { - void* msg_list; /* Linked list to store information */ - pthread_cond_t list_cond; /* Condition variable for waiting on msg queue */ - pthread_mutex_t list_mutex; /* Mutex for exclusive access to message queue */ - int unblocked; /* Has this message queue been unblocked? */ -} msg_q; - -/*=========================================================================== -FUNCTION convert_linked_list_err_type - -DESCRIPTION - Converts from one set of enum values to another. - - linked_list_val: Value to convert to msg_q_enum_type - -DEPENDENCIES - N/A - -RETURN VALUE - Corresponding linked_list_enum_type in msg_q_enum_type - -SIDE EFFECTS - N/A - -===========================================================================*/ -static msq_q_err_type convert_linked_list_err_type(linked_list_err_type linked_list_val) -{ - switch( linked_list_val ) - { - case eLINKED_LIST_SUCCESS: - return eMSG_Q_SUCCESS; - case eLINKED_LIST_INVALID_PARAMETER: - return eMSG_Q_INVALID_PARAMETER; - case eLINKED_LIST_INVALID_HANDLE: - return eMSG_Q_INVALID_HANDLE; - case eLINKED_LIST_UNAVAILABLE_RESOURCE: - return eMSG_Q_UNAVAILABLE_RESOURCE; - case eLINKED_LIST_INSUFFICIENT_BUFFER: - return eMSG_Q_INSUFFICIENT_BUFFER; - - case eLINKED_LIST_FAILURE_GENERAL: - default: - return eMSG_Q_FAILURE_GENERAL; - } -} - -/* ----------------------- END INTERNAL FUNCTIONS ---------------------------------------- */ - -/*=========================================================================== - - FUNCTION: msg_q_init - - ===========================================================================*/ -msq_q_err_type msg_q_init(void** msg_q_data) -{ - if( msg_q_data == NULL ) - { - LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__); - return eMSG_Q_INVALID_PARAMETER; - } - - msg_q* tmp_msg_q; - tmp_msg_q = (msg_q*)calloc(1, sizeof(msg_q)); - if( tmp_msg_q == NULL ) - { - LOC_LOGE("%s: Unable to allocate space for message queue!\n", __FUNCTION__); - return eMSG_Q_FAILURE_GENERAL; - } - - if( linked_list_init(&tmp_msg_q->msg_list) != 0 ) - { - LOC_LOGE("%s: Unable to initialize storage list!\n", __FUNCTION__); - free(tmp_msg_q); - return eMSG_Q_FAILURE_GENERAL; - } - - if( pthread_mutex_init(&tmp_msg_q->list_mutex, NULL) != 0 ) - { - LOC_LOGE("%s: Unable to initialize list mutex!\n", __FUNCTION__); - linked_list_destroy(&tmp_msg_q->msg_list); - free(tmp_msg_q); - return eMSG_Q_FAILURE_GENERAL; - } - - if( pthread_cond_init(&tmp_msg_q->list_cond, NULL) != 0 ) - { - LOC_LOGE("%s: Unable to initialize msg q cond var!\n", __FUNCTION__); - linked_list_destroy(&tmp_msg_q->msg_list); - pthread_mutex_destroy(&tmp_msg_q->list_mutex); - free(tmp_msg_q); - return eMSG_Q_FAILURE_GENERAL; - } - - tmp_msg_q->unblocked = 0; - - *msg_q_data = tmp_msg_q; - - return eMSG_Q_SUCCESS; -} - -/*=========================================================================== - - FUNCTION: msg_q_init2 - - ===========================================================================*/ -const void* msg_q_init2() -{ - void* q = NULL; - if (eMSG_Q_SUCCESS != msg_q_init(&q)) { - q = NULL; - } - return q; -} - -/*=========================================================================== - - FUNCTION: msg_q_destroy - - ===========================================================================*/ -msq_q_err_type msg_q_destroy(void** msg_q_data) -{ - if( msg_q_data == NULL ) - { - LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__); - return eMSG_Q_INVALID_HANDLE; - } - - msg_q* p_msg_q = (msg_q*)*msg_q_data; - - linked_list_destroy(&p_msg_q->msg_list); - pthread_mutex_destroy(&p_msg_q->list_mutex); - pthread_cond_destroy(&p_msg_q->list_cond); - - p_msg_q->unblocked = 0; - - free(*msg_q_data); - *msg_q_data = NULL; - - return eMSG_Q_SUCCESS; -} - -/*=========================================================================== - - FUNCTION: msg_q_snd - - ===========================================================================*/ -msq_q_err_type msg_q_snd(void* msg_q_data, void* msg_obj, void (*dealloc)(void*)) -{ - msq_q_err_type rv; - if( msg_q_data == NULL ) - { - LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__); - return eMSG_Q_INVALID_HANDLE; - } - if( msg_obj == NULL ) - { - LOC_LOGE("%s: Invalid msg_obj parameter!\n", __FUNCTION__); - return eMSG_Q_INVALID_PARAMETER; - } - - msg_q* p_msg_q = (msg_q*)msg_q_data; - - pthread_mutex_lock(&p_msg_q->list_mutex); - LOC_LOGV("%s: Sending message with handle = %p\n", __FUNCTION__, msg_obj); - - if( p_msg_q->unblocked ) - { - LOC_LOGE("%s: Message queue has been unblocked.\n", __FUNCTION__); - pthread_mutex_unlock(&p_msg_q->list_mutex); - return eMSG_Q_UNAVAILABLE_RESOURCE; - } - - rv = convert_linked_list_err_type(linked_list_add(p_msg_q->msg_list, msg_obj, dealloc)); - - /* Show data is in the message queue. */ - pthread_cond_signal(&p_msg_q->list_cond); - - pthread_mutex_unlock(&p_msg_q->list_mutex); - - LOC_LOGV("%s: Finished Sending message with handle = %p\n", __FUNCTION__, msg_obj); - - return rv; -} - -/*=========================================================================== - - FUNCTION: msg_q_rcv - - ===========================================================================*/ -msq_q_err_type msg_q_rcv(void* msg_q_data, void** msg_obj) -{ - msq_q_err_type rv; - if( msg_q_data == NULL ) - { - LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__); - return eMSG_Q_INVALID_HANDLE; - } - - if( msg_obj == NULL ) - { - LOC_LOGE("%s: Invalid msg_obj parameter!\n", __FUNCTION__); - return eMSG_Q_INVALID_PARAMETER; - } - - msg_q* p_msg_q = (msg_q*)msg_q_data; - - pthread_mutex_lock(&p_msg_q->list_mutex); - - if( p_msg_q->unblocked ) - { - LOC_LOGE("%s: Message queue has been unblocked.\n", __FUNCTION__); - pthread_mutex_unlock(&p_msg_q->list_mutex); - return eMSG_Q_UNAVAILABLE_RESOURCE; - } - - /* Wait for data in the message queue */ - while( linked_list_empty(p_msg_q->msg_list) && !p_msg_q->unblocked ) - { - pthread_cond_wait(&p_msg_q->list_cond, &p_msg_q->list_mutex); - } - - rv = convert_linked_list_err_type(linked_list_remove(p_msg_q->msg_list, msg_obj)); - - pthread_mutex_unlock(&p_msg_q->list_mutex); - - LOC_LOGV("%s: Received message %p rv = %d\n", __FUNCTION__, *msg_obj, rv); - - return rv; -} - -/*=========================================================================== - - FUNCTION: msg_q_flush - - ===========================================================================*/ -msq_q_err_type msg_q_flush(void* msg_q_data) -{ - msq_q_err_type rv; - if ( msg_q_data == NULL ) - { - LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__); - return eMSG_Q_INVALID_HANDLE; - } - - msg_q* p_msg_q = (msg_q*)msg_q_data; - - LOC_LOGD("%s: Flushing Message Queue\n", __FUNCTION__); - - pthread_mutex_lock(&p_msg_q->list_mutex); - - /* Remove all elements from the list */ - rv = convert_linked_list_err_type(linked_list_flush(p_msg_q->msg_list)); - - pthread_mutex_unlock(&p_msg_q->list_mutex); - - LOC_LOGD("%s: Message Queue flushed\n", __FUNCTION__); - - return rv; -} - -/*=========================================================================== - - FUNCTION: msg_q_unblock - - ===========================================================================*/ -msq_q_err_type msg_q_unblock(void* msg_q_data) -{ - if ( msg_q_data == NULL ) - { - LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__); - return eMSG_Q_INVALID_HANDLE; - } - - msg_q* p_msg_q = (msg_q*)msg_q_data; - pthread_mutex_lock(&p_msg_q->list_mutex); - - if( p_msg_q->unblocked ) - { - LOC_LOGE("%s: Message queue has been unblocked.\n", __FUNCTION__); - pthread_mutex_unlock(&p_msg_q->list_mutex); - return eMSG_Q_UNAVAILABLE_RESOURCE; - } - - LOC_LOGD("%s: Unblocking Message Queue\n", __FUNCTION__); - /* Unblocking message queue */ - p_msg_q->unblocked = 1; - - /* Allow all the waiters to wake up */ - pthread_cond_broadcast(&p_msg_q->list_cond); - - pthread_mutex_unlock(&p_msg_q->list_mutex); - - LOC_LOGD("%s: Message Queue unblocked\n", __FUNCTION__); - - return eMSG_Q_SUCCESS; -} diff --git a/gps/utils/msg_q.h b/gps/utils/msg_q.h deleted file mode 100644 index 453b8ce..0000000 --- a/gps/utils/msg_q.h +++ /dev/null @@ -1,207 +0,0 @@ -/* Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __MSG_Q_H__ -#define __MSG_Q_H__ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include <stdlib.h> - -/** Linked List Return Codes */ -typedef enum -{ - eMSG_Q_SUCCESS = 0, - /**< Request was successful. */ - eMSG_Q_FAILURE_GENERAL = -1, - /**< Failed because of a general failure. */ - eMSG_Q_INVALID_PARAMETER = -2, - /**< Failed because the request contained invalid parameters. */ - eMSG_Q_INVALID_HANDLE = -3, - /**< Failed because an invalid handle was specified. */ - eMSG_Q_UNAVAILABLE_RESOURCE = -4, - /**< Failed because an there were not enough resources. */ - eMSG_Q_INSUFFICIENT_BUFFER = -5, - /**< Failed because an the supplied buffer was too small. */ -}msq_q_err_type; - -/*=========================================================================== -FUNCTION msg_q_init - -DESCRIPTION - Initializes internal structures for message queue. - - msg_q_data: pointer to an opaque Q handle to be returned; NULL if fails - -DEPENDENCIES - N/A - -RETURN VALUE - Look at error codes above. - -SIDE EFFECTS - N/A - -===========================================================================*/ -msq_q_err_type msg_q_init(void** msg_q_data); - -/*=========================================================================== -FUNCTION msg_q_init2 - -DESCRIPTION - Initializes internal structures for message queue. - -DEPENDENCIES - N/A - -RETURN VALUE - opaque handle to the Q created; NULL if create fails - -SIDE EFFECTS - N/A - -===========================================================================*/ -const void* msg_q_init2(); - -/*=========================================================================== -FUNCTION msg_q_destroy - -DESCRIPTION - Releases internal structures for message queue. - - msg_q_data: State of message queue to be released. - -DEPENDENCIES - N/A - -RETURN VALUE - Look at error codes above. - -SIDE EFFECTS - N/A - -===========================================================================*/ -msq_q_err_type msg_q_destroy(void** msg_q_data); - -/*=========================================================================== -FUNCTION msg_q_snd - -DESCRIPTION - Sends data to the message queue. The passed in data pointer - is not modified or freed. Passed in msg_obj is expected to live throughout - the use of the msg_q (i.e. data is not allocated internally) - - msg_q_data: Message Queue to add the element to. - msgp: Pointer to data to add into message queue. - 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 - -===========================================================================*/ -msq_q_err_type msg_q_snd(void* msg_q_data, void* msg_obj, void (*dealloc)(void*)); - -/*=========================================================================== -FUNCTION msg_q_rcv - -DESCRIPTION - Retrieves data from the message queue. msg_obj is the oldest message received - and pointer is simply removed from message queue. - - msg_q_data: Message Queue to copy data from into msgp. - msg_obj: Pointer to space to copy msg_q contents to. - -DEPENDENCIES - N/A - -RETURN VALUE - Look at error codes above. - -SIDE EFFECTS - N/A - -===========================================================================*/ -msq_q_err_type msg_q_rcv(void* msg_q_data, void** msg_obj); - -/*=========================================================================== -FUNCTION msg_q_flush - -DESCRIPTION - Function removes all elements from the message queue. - - msg_q_data: Message Queue to remove elements from. - -DEPENDENCIES - N/A - -RETURN VALUE - Look at error codes above. - -SIDE EFFECTS - N/A - -===========================================================================*/ -msq_q_err_type msg_q_flush(void* msg_q_data); - -/*=========================================================================== -FUNCTION msg_q_unblock - -DESCRIPTION - This function will stop use of the message queue. All waiters will wake up - and likely receive nothing from the queue resulting in a negative return - value. The message queue can no longer be used until it is destroyed - and initialized again after calling this function. - - msg_q_data: Message queue to unblock. - -DEPENDENCIES - N/A - -RETURN VALUE - Look at error codes above. - -SIDE EFFECTS - N/A - -===========================================================================*/ -msq_q_err_type msg_q_unblock(void* msg_q_data); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __MSG_Q_H__ */ |