sanders: gps: update to LA.UM.7.6.r1-02000-89xx.0 tag

This commit is contained in:
therootlord
2018-09-12 13:45:48 -03:00
parent 8a6b5c05e7
commit 0a41b9dc1a
150 changed files with 4794 additions and 4130 deletions

View File

@@ -6,6 +6,8 @@
<privapp-permissions package="com.qualcomm.location"> <privapp-permissions package="com.qualcomm.location">
<permission name="android.permission.CONTROL_LOCATION_UPDATES"/> <permission name="android.permission.CONTROL_LOCATION_UPDATES"/>
<permission name="android.permission.WRITE_SECURE_SETTINGS"/>
<permission name="android.permission.MANAGE_USERS"/>
</privapp-permissions> </privapp-permissions>
<privapp-permissions package="com.qualcomm.qcrilmsgtunnel"> <privapp-permissions package="com.qualcomm.qcrilmsgtunnel">

View File

@@ -1,5 +1,6 @@
ifneq ($(BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE),) ifneq ($(BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE),)
LOCAL_PATH := $(call my-dir) LOCAL_PATH := $(call my-dir)
include $(LOCAL_PATH)/build/target_specific_features.mk
include $(call all-makefiles-under,$(LOCAL_PATH)) include $(call all-makefiles-under,$(LOCAL_PATH))
endif endif

View File

@@ -3,7 +3,7 @@
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4
SUBDIRS = core location gnss SUBDIRS = gnss
pkgconfigdir = $(libdir)/pkgconfig pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = loc-hal.pc pkgconfig_DATA = loc-hal.pc

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@@ -27,15 +27,26 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
sp<IAGnssCallback> AGnss::sAGnssCbIface = nullptr; static AGnss* spAGnss = nullptr;
AGnss::AGnss(Gnss* gnss) : mGnss(gnss) { AGnss::AGnss(Gnss* gnss) : mGnss(gnss) {
spAGnss = this;
}
AGnss::~AGnss() {
spAGnss = nullptr;
} }
void AGnss::agnssStatusIpV4Cb(AGnssExtStatusIpV4 status){ void AGnss::agnssStatusIpV4Cb(AGnssExtStatusIpV4 status){
if (nullptr != spAGnss) {
spAGnss->statusIpV4Cb(status);
}
}
void AGnss::statusIpV4Cb(AGnssExtStatusIpV4 status) {
IAGnssCallback::AGnssStatusIpV4 st = {}; IAGnssCallback::AGnssStatusIpV4 st = {};
switch (status.type) { switch (status.type) {
@@ -72,9 +83,13 @@ void AGnss::agnssStatusIpV4Cb(AGnssExtStatusIpV4 status){
} }
st.ipV4Addr = status.ipV4Addr; st.ipV4Addr = status.ipV4Addr;
auto r = sAGnssCbIface->agnssStatusIpV4Cb(st); if (mAGnssCbIface != nullptr) {
if (!r.isOk()) { auto r = mAGnssCbIface->agnssStatusIpV4Cb(st);
LOC_LOGE("Error invoking AGNSS status cb %s", r.description().c_str()); if (!r.isOk()) {
LOC_LOGw("Error invoking AGNSS status cb %s", r.description().c_str());
}
} else {
LOC_LOGw("setCallback has not been called yet");
} }
} }
@@ -86,7 +101,7 @@ Return<void> AGnss::setCallback(const sp<IAGnssCallback>& callback) {
} }
// Save the interface // Save the interface
sAGnssCbIface = callback; mAGnssCbIface = callback;
AgpsCbInfo cbInfo = {}; AgpsCbInfo cbInfo = {};
cbInfo.statusV4Cb = (void*)agnssStatusIpV4Cb; cbInfo.statusV4Cb = (void*)agnssStatusIpV4Cb;
@@ -182,7 +197,7 @@ Return<bool> AGnss::setServer(IAGnssCallback::AGnssType type,
} }
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@@ -28,7 +28,7 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
using ::android::hardware::gnss::V1_0::IAGnss; using ::android::hardware::gnss::V1_0::IAGnss;
@@ -43,7 +43,7 @@ struct Gnss;
struct AGnss : public IAGnss { struct AGnss : public IAGnss {
AGnss(Gnss* gnss); AGnss(Gnss* gnss);
~AGnss() = default; ~AGnss();
/* /*
* Methods from ::android::hardware::gnss::V1_0::IAGnss interface follow. * Methods from ::android::hardware::gnss::V1_0::IAGnss interface follow.
* These declarations were generated from IAGnss.hal. * These declarations were generated from IAGnss.hal.
@@ -60,16 +60,18 @@ struct AGnss : public IAGnss {
Return<bool> setServer(IAGnssCallback::AGnssType type, Return<bool> setServer(IAGnssCallback::AGnssType type,
const hidl_string& hostname, int32_t port) override; const hidl_string& hostname, int32_t port) override;
void statusIpV4Cb(AGnssExtStatusIpV4 status);
/* Data call setup callback passed down to GNSS HAL implementation */ /* Data call setup callback passed down to GNSS HAL implementation */
static void agnssStatusIpV4Cb(AGnssExtStatusIpV4 status); static void agnssStatusIpV4Cb(AGnssExtStatusIpV4 status);
private: private:
Gnss* mGnss = nullptr; Gnss* mGnss = nullptr;
static sp<IAGnssCallback> sAGnssCbIface; sp<IAGnssCallback> mAGnssCbIface = nullptr;
}; };
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@@ -29,12 +29,14 @@
#include <string> #include <string>
#include "Gnss.h" #include "Gnss.h"
#include "AGnssRil.h" #include "AGnssRil.h"
#include <DataItemConcreteTypesBase.h>
typedef void* (getLocationInterface)(); typedef void* (getLocationInterface)();
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
@@ -51,13 +53,41 @@ Return<bool> AGnssRil::updateNetworkState(bool connected, NetworkType type, bool
// for XTRA // for XTRA
if (nullptr != mGnss && ( nullptr != mGnss->getGnssInterface() )) { if (nullptr != mGnss && ( nullptr != mGnss->getGnssInterface() )) {
mGnss->getGnssInterface()->updateConnectionStatus(connected, (uint8_t)type); 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; return true;
} }
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@@ -28,7 +28,7 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
using ::android::hardware::gnss::V1_0::IAGnssRil; using ::android::hardware::gnss::V1_0::IAGnssRil;
@@ -75,7 +75,7 @@ struct AGnssRil : public IAGnssRil {
}; };
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,9 +1,8 @@
LOCAL_PATH := $(call my-dir) LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := android.hardware.gnss@1.0-impl-qti LOCAL_MODULE := android.hardware.gnss@1.1-impl-qti
LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib LOCAL_VENDOR_MODULE := true
LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64
LOCAL_MODULE_RELATIVE_PATH := hw LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_SRC_FILES := \ LOCAL_SRC_FILES := \
AGnss.cpp \ AGnss.cpp \
@@ -36,14 +35,15 @@ LOCAL_SHARED_LIBRARIES := \
libhidlbase \ libhidlbase \
libhidltransport \ libhidltransport \
libhwbinder \ libhwbinder \
libcutils \
libutils \ libutils \
android.hardware.gnss@1.0 \ android.hardware.gnss@1.0 \
android.hardware.gnss@1.1 \
LOCAL_SHARED_LIBRARIES += \ LOCAL_SHARED_LIBRARIES += \
libloc_core \ libloc_core \
libgps.utils \ libgps.utils \
libdl \ libdl \
libloc_pla \
liblocation_api \ liblocation_api \
LOCAL_CFLAGS += $(GNSS_CFLAGS) LOCAL_CFLAGS += $(GNSS_CFLAGS)
@@ -52,20 +52,16 @@ include $(BUILD_SHARED_LIBRARY)
BUILD_GNSS_HIDL_SERVICE := true BUILD_GNSS_HIDL_SERVICE := true
ifneq ($(BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET), true) ifneq ($(BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET), true)
ifneq ($(LW_FEATURE_SET),true) ifneq ($(LW_FEATURE_SET),true)
ifneq ($(TARGET_HAS_LOW_RAM),true)
BUILD_GNSS_HIDL_SERVICE := false BUILD_GNSS_HIDL_SERVICE := false
endif # TARGET_HAS_LOW_RAM
endif # LW_FEATURE_SET endif # LW_FEATURE_SET
endif # BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET endif # BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET
ifeq ($(BUILD_GNSS_HIDL_SERVICE), true) ifeq ($(BUILD_GNSS_HIDL_SERVICE), true)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := android.hardware.gnss@1.0-service-qti LOCAL_MODULE := android.hardware.gnss@1.1-service-qti
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXECUTABLES)
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_VENDOR_MODULE := true LOCAL_VENDOR_MODULE := true
LOCAL_MODULE_OWNER := qti LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_INIT_RC := android.hardware.gnss@1.0-service-qti.rc LOCAL_INIT_RC := android.hardware.gnss@1.1-service-qti.rc
LOCAL_SRC_FILES := \ LOCAL_SRC_FILES := \
service.cpp \ service.cpp \
@@ -90,6 +86,7 @@ LOCAL_SHARED_LIBRARIES += \
libhidlbase \ libhidlbase \
libhidltransport \ libhidltransport \
android.hardware.gnss@1.0 \ android.hardware.gnss@1.0 \
android.hardware.gnss@1.1 \
LOCAL_CFLAGS += $(GNSS_CFLAGS) LOCAL_CFLAGS += $(GNSS_CFLAGS)
include $(BUILD_EXECUTABLE) include $(BUILD_EXECUTABLE)

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@@ -20,17 +20,61 @@
#define LOG_TAG "LocSvc_GnssInterface" #define LOG_TAG "LocSvc_GnssInterface"
#include <fstream>
#include <log_util.h> #include <log_util.h>
#include <dlfcn.h> #include <dlfcn.h>
#include <cutils/properties.h>
#include "Gnss.h" #include "Gnss.h"
#include <LocationUtil.h>
typedef void* (getLocationInterface)(); typedef void* (getLocationInterface)();
#define IMAGES_INFO_FILE "/sys/devices/soc0/images"
#define DELIMITER ";"
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
static std::string getVersionString() {
static std::string version;
if (!version.empty())
return version;
char value[PROPERTY_VALUE_MAX] = {0};
property_get("ro.hardware", value, "unknown");
version.append(value).append(DELIMITER);
std::ifstream in(IMAGES_INFO_FILE);
std::string s;
while(getline(in, s)) {
std::size_t found = s.find("CRM:");
if (std::string::npos == found) {
continue;
}
// skip over space characters after "CRM:"
const char* substr = s.c_str();
found += 4;
while (0 != substr[found] && isspace(substr[found])) {
found++;
}
if (s.find("11:") != found) {
continue;
}
s.erase(0, found + 3);
found = s.find_first_of("\r\n");
if (std::string::npos != found) {
s.erase(s.begin() + found, s.end());
}
version.append(s).append(DELIMITER);
}
return version;
}
void Gnss::GnssDeathRecipient::serviceDied(uint64_t cookie, const wp<IBase>& who) { void Gnss::GnssDeathRecipient::serviceDied(uint64_t cookie, const wp<IBase>& who) {
LOC_LOGE("%s] service died. cookie: %llu, who: %p", LOC_LOGE("%s] service died. cookie: %llu, who: %p",
__FUNCTION__, static_cast<unsigned long long>(cookie), &who); __FUNCTION__, static_cast<unsigned long long>(cookie), &who);
@@ -107,7 +151,7 @@ GnssInterface* Gnss::getGnssInterface() {
return mGnssInterface; return mGnssInterface;
} }
Return<bool> Gnss::setCallback(const sp<IGnssCallback>& callback) { Return<bool> Gnss::setCallback(const sp<V1_0::IGnssCallback>& callback) {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
if (mGnssCbIface != nullptr) { if (mGnssCbIface != nullptr) {
mGnssCbIface->unlinkToDeath(mGnssDeathRecipient); mGnssCbIface->unlinkToDeath(mGnssDeathRecipient);
@@ -251,7 +295,7 @@ Return<bool> Gnss::injectTime(int64_t timeMs, int64_t timeReferenceMs,
} }
} }
Return<void> Gnss::deleteAidingData(IGnss::GnssAidingData aidingDataFlags) { Return<void> Gnss::deleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags) {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
GnssAPIClient* api = getApi(); GnssAPIClient* api = getApi();
if (api) { if (api) {
@@ -260,8 +304,8 @@ Return<void> Gnss::deleteAidingData(IGnss::GnssAidingData aidingDataFlags) {
return Void(); return Void();
} }
Return<bool> Gnss::setPositionMode(IGnss::GnssPositionMode mode, Return<bool> Gnss::setPositionMode(V1_0::IGnss::GnssPositionMode mode,
IGnss::GnssPositionRecurrence recurrence, V1_0::IGnss::GnssPositionRecurrence recurrence,
uint32_t minIntervalMs, uint32_t minIntervalMs,
uint32_t preferredAccuracyMeters, uint32_t preferredAccuracyMeters,
uint32_t preferredTimeMs) { uint32_t preferredTimeMs) {
@@ -275,52 +319,122 @@ Return<bool> Gnss::setPositionMode(IGnss::GnssPositionMode mode,
return retVal; return retVal;
} }
Return<sp<IAGnss>> Gnss::getExtensionAGnss() { Return<sp<V1_0::IAGnss>> Gnss::getExtensionAGnss() {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
mAGnssIface = new AGnss(this); mAGnssIface = new AGnss(this);
return mAGnssIface; return mAGnssIface;
} }
Return<sp<IGnssNi>> Gnss::getExtensionGnssNi() { Return<sp<V1_0::IGnssNi>> Gnss::getExtensionGnssNi() {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
mGnssNi = new GnssNi(this); mGnssNi = new GnssNi(this);
return mGnssNi; return mGnssNi;
} }
Return<sp<IGnssMeasurement>> Gnss::getExtensionGnssMeasurement() { Return<sp<V1_0::IGnssMeasurement>> Gnss::getExtensionGnssMeasurement() {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
mGnssMeasurement = new GnssMeasurement(); if (mGnssMeasurement == nullptr)
mGnssMeasurement = new GnssMeasurement();
return mGnssMeasurement; return mGnssMeasurement;
} }
Return<sp<IGnssConfiguration>> Gnss::getExtensionGnssConfiguration() { Return<sp<V1_0::IGnssConfiguration>> Gnss::getExtensionGnssConfiguration() {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
mGnssConfig = new GnssConfiguration(this); mGnssConfig = new GnssConfiguration(this);
return mGnssConfig; return mGnssConfig;
} }
Return<sp<IGnssGeofencing>> Gnss::getExtensionGnssGeofencing() { Return<sp<V1_0::IGnssGeofencing>> Gnss::getExtensionGnssGeofencing() {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
mGnssGeofencingIface = new GnssGeofencing(); mGnssGeofencingIface = new GnssGeofencing();
return mGnssGeofencingIface; return mGnssGeofencingIface;
} }
Return<sp<IGnssBatching>> Gnss::getExtensionGnssBatching() { Return<sp<V1_0::IGnssBatching>> Gnss::getExtensionGnssBatching() {
mGnssBatching = new GnssBatching(); mGnssBatching = new GnssBatching();
return mGnssBatching; return mGnssBatching;
} }
Return<sp<IGnssDebug>> Gnss::getExtensionGnssDebug() { Return<sp<V1_0::IGnssDebug>> Gnss::getExtensionGnssDebug() {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
mGnssDebug = new GnssDebug(this); mGnssDebug = new GnssDebug(this);
return mGnssDebug; return mGnssDebug;
} }
Return<sp<IAGnssRil>> Gnss::getExtensionAGnssRil() { Return<sp<V1_0::IAGnssRil>> Gnss::getExtensionAGnssRil() {
mGnssRil = new AGnssRil(this); mGnssRil = new AGnssRil(this);
return mGnssRil; return mGnssRil;
} }
// Methods from ::android::hardware::gnss::V1_1::IGnss follow.
Return<bool> Gnss::setCallback_1_1(const sp<V1_1::IGnssCallback>& callback) {
ENTRY_LOG_CALLFLOW();
callback->gnssNameCb(getVersionString());
mGnssCbIface_1_1 = callback;
GnssInterface* gnssInterface = getGnssInterface();
if (nullptr != gnssInterface) {
OdcpiRequestCallback cb = [this](const OdcpiRequestInfo& odcpiRequest) {
odcpiRequestCb(odcpiRequest);
};
gnssInterface->odcpiInit(cb);
}
return setCallback(callback);
}
Return<bool> Gnss::setPositionMode_1_1(V1_0::IGnss::GnssPositionMode mode,
V1_0::IGnss::GnssPositionRecurrence recurrence,
uint32_t minIntervalMs,
uint32_t preferredAccuracyMeters,
uint32_t preferredTimeMs,
bool /*lowPowerMode*/) {
ENTRY_LOG_CALLFLOW();
return setPositionMode(mode, recurrence, minIntervalMs,
preferredAccuracyMeters, preferredTimeMs);
}
Return<sp<V1_1::IGnssMeasurement>> Gnss::getExtensionGnssMeasurement_1_1() {
ENTRY_LOG_CALLFLOW();
if (mGnssMeasurement == nullptr)
mGnssMeasurement = new GnssMeasurement();
return mGnssMeasurement;
}
Return<sp<V1_1::IGnssConfiguration>> Gnss::getExtensionGnssConfiguration_1_1() {
ENTRY_LOG_CALLFLOW();
if (mGnssConfig == nullptr)
mGnssConfig = new GnssConfiguration(this);
return mGnssConfig;
}
Return<bool> Gnss::injectBestLocation(const GnssLocation& gnssLocation) {
ENTRY_LOG_CALLFLOW();
GnssInterface* gnssInterface = getGnssInterface();
if (nullptr != gnssInterface) {
Location location = {};
convertGnssLocation(gnssLocation, location);
gnssInterface->odcpiInject(location);
}
return true;
}
void Gnss::odcpiRequestCb(const OdcpiRequestInfo& request) {
ENTRY_LOG_CALLFLOW();
if (mGnssCbIface_1_1 != nullptr) {
// For emergency mode, request DBH (Device based hybrid) location
// Mark Independent from GNSS flag to false.
if (ODCPI_REQUEST_TYPE_START == request.type) {
auto r = mGnssCbIface_1_1->gnssRequestLocationCb(!request.isEmergencyMode);
if (!r.isOk()) {
LOC_LOGe("Error invoking gnssRequestLocationCb %s", r.description().c_str());
}
} else {
LOC_LOGv("Unsupported ODCPI request type: %d", request.type);
}
} else {
LOC_LOGe("ODCPI request not supported.");
}
}
IGnss* HIDL_FETCH_IGnss(const char* hal) { IGnss* HIDL_FETCH_IGnss(const char* hal) {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
IGnss* iface = nullptr; IGnss* iface = nullptr;
@@ -332,7 +446,7 @@ IGnss* HIDL_FETCH_IGnss(const char* hal) {
} }
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018-2018-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@@ -30,7 +30,8 @@
#include <GnssNi.h> #include <GnssNi.h>
#include <GnssDebug.h> #include <GnssDebug.h>
#include <android/hardware/gnss/1.0/IGnss.h> #include <android/hardware/gnss/1.1/IGnss.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h> #include <hidl/Status.h>
#include <GnssAPIClient.h> #include <GnssAPIClient.h>
@@ -39,37 +40,27 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { 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::Return;
using ::android::hardware::Void; using ::android::hardware::Void;
using ::android::hardware::hidl_vec;
using ::android::hardware::hidl_string;
using ::android::sp; using ::android::sp;
using ::android::hardware::gnss::V1_0::GnssLocation;
struct Gnss : public IGnss { struct Gnss : public IGnss {
Gnss(); Gnss();
~Gnss(); ~Gnss();
// registerAsService will call interfaceChain to determine the version of service
/* comment this out until we know really how to manipulate hidl version
using interfaceChain_cb = std::function<
void(const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& descriptors)>;
virtual ::android::hardware::Return<void> interfaceChain(interfaceChain_cb _hidl_cb) override {
_hidl_cb({
"android.hardware.gnss@1.1::IGnss",
::android::hidl::base::V1_0::IBase::descriptor,
});
return ::android::hardware::Void();
}
*/
/* /*
* Methods from ::android::hardware::gnss::V1_0::IGnss follow. * Methods from ::android::hardware::gnss::V1_0::IGnss follow.
* These declarations were generated from Gnss.hal. * These declarations were generated from Gnss.hal.
*/ */
Return<bool> setCallback(const sp<IGnssCallback>& callback) override; Return<bool> setCallback(const sp<V1_0::IGnssCallback>& callback) override;
Return<bool> start() override; Return<bool> start() override;
Return<bool> stop() override; Return<bool> stop() override;
Return<void> cleanup() override; Return<void> cleanup() override;
@@ -79,30 +70,40 @@ struct Gnss : public IGnss {
Return<bool> injectTime(int64_t timeMs, Return<bool> injectTime(int64_t timeMs,
int64_t timeReferenceMs, int64_t timeReferenceMs,
int32_t uncertaintyMs) override; int32_t uncertaintyMs) override;
Return<void> deleteAidingData(IGnss::GnssAidingData aidingDataFlags) override; Return<void> deleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags) override;
Return<bool> setPositionMode(IGnss::GnssPositionMode mode, Return<bool> setPositionMode(V1_0::IGnss::GnssPositionMode mode,
IGnss::GnssPositionRecurrence recurrence, V1_0::IGnss::GnssPositionRecurrence recurrence,
uint32_t minIntervalMs, uint32_t minIntervalMs,
uint32_t preferredAccuracyMeters, uint32_t preferredAccuracyMeters,
uint32_t preferredTimeMs) override; uint32_t preferredTimeMs) override;
Return<sp<IAGnss>> getExtensionAGnss() override; Return<sp<V1_0::IAGnss>> getExtensionAGnss() override;
Return<sp<IGnssNi>> getExtensionGnssNi() override; Return<sp<V1_0::IGnssNi>> getExtensionGnssNi() override;
Return<sp<IGnssMeasurement>> getExtensionGnssMeasurement() override; Return<sp<V1_0::IGnssMeasurement>> getExtensionGnssMeasurement() override;
Return<sp<IGnssConfiguration>> getExtensionGnssConfiguration() override; Return<sp<V1_0::IGnssConfiguration>> getExtensionGnssConfiguration() override;
Return<sp<IGnssGeofencing>> getExtensionGnssGeofencing() override; Return<sp<V1_0::IGnssGeofencing>> getExtensionGnssGeofencing() override;
Return<sp<IGnssBatching>> getExtensionGnssBatching() override; Return<sp<V1_0::IGnssBatching>> getExtensionGnssBatching() override;
Return<sp<IAGnssRil>> getExtensionAGnssRil() override; Return<sp<V1_0::IAGnssRil>> getExtensionAGnssRil() override;
inline Return<sp<IGnssNavigationMessage>> getExtensionGnssNavigationMessage() override { inline Return<sp<V1_0::IGnssNavigationMessage>> getExtensionGnssNavigationMessage() override {
return nullptr; return nullptr;
} }
inline Return<sp<IGnssXtra>> getExtensionXtra() override { inline Return<sp<V1_0::IGnssXtra>> getExtensionXtra() override {
return nullptr; return nullptr;
} }
Return<sp<IGnssDebug>> getExtensionGnssDebug() override; Return<sp<V1_0::IGnssDebug>> getExtensionGnssDebug() override;
// Methods from ::android::hardware::gnss::V1_1::IGnss follow.
Return<bool> setCallback_1_1(const sp<V1_1::IGnssCallback>& callback) override;
Return<bool> setPositionMode_1_1(V1_0::IGnss::GnssPositionMode mode,
V1_0::IGnss::GnssPositionRecurrence recurrence,
uint32_t minIntervalMs, uint32_t preferredAccuracyMeters,
uint32_t preferredTimeMs, bool lowPowerMode) override;
Return<sp<V1_1::IGnssMeasurement>> getExtensionGnssMeasurement_1_1() override;
Return<sp<V1_1::IGnssConfiguration>> getExtensionGnssConfiguration_1_1() override;
Return<bool> injectBestLocation(const GnssLocation& location) override;
// These methods are not part of the IGnss base class. // These methods are not part of the IGnss base class.
GnssAPIClient* getApi(); GnssAPIClient* getApi();
@@ -110,6 +111,9 @@ struct Gnss : public IGnss {
Return<bool> updateConfiguration(GnssConfig& gnssConfig); Return<bool> updateConfiguration(GnssConfig& gnssConfig);
GnssInterface* getGnssInterface(); GnssInterface* getGnssInterface();
// Callback for ODCPI request
void odcpiRequestCb(const OdcpiRequestInfo& request);
private: private:
struct GnssDeathRecipient : hidl_death_recipient { struct GnssDeathRecipient : hidl_death_recipient {
GnssDeathRecipient(sp<Gnss> gnss) : mGnss(gnss) { GnssDeathRecipient(sp<Gnss> gnss) : mGnss(gnss) {
@@ -132,8 +136,9 @@ struct Gnss : public IGnss {
sp<AGnssRil> mGnssRil = nullptr; sp<AGnssRil> mGnssRil = nullptr;
GnssAPIClient* mApi = nullptr; GnssAPIClient* mApi = nullptr;
sp<IGnssCallback> mGnssCbIface = nullptr; sp<V1_0::IGnssCallback> mGnssCbIface = nullptr;
sp<IGnssNiCallback> mGnssNiCbIface = nullptr; sp<V1_1::IGnssCallback> mGnssCbIface_1_1 = nullptr;
sp<V1_0::IGnssNiCallback> mGnssNiCbIface = nullptr;
GnssConfig mPendingConfig; GnssConfig mPendingConfig;
GnssInterface* mGnssInterface = nullptr; GnssInterface* mGnssInterface = nullptr;
}; };
@@ -141,7 +146,7 @@ struct Gnss : public IGnss {
extern "C" IGnss* HIDL_FETCH_IGnss(const char* name); extern "C" IGnss* HIDL_FETCH_IGnss(const char* name);
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@@ -27,7 +27,7 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
void GnssBatching::GnssBatchingDeathRecipient::serviceDied( void GnssBatching::GnssBatchingDeathRecipient::serviceDied(
@@ -124,7 +124,7 @@ Return<void> GnssBatching::cleanup() {
} }
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@@ -28,7 +28,7 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
using ::android::hardware::gnss::V1_0::IGnssBatching; using ::android::hardware::gnss::V1_0::IGnssBatching;
@@ -72,7 +72,7 @@ struct GnssBatching : public IGnssBatching {
}; };
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@@ -27,7 +27,7 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
GnssConfiguration::GnssConfiguration(Gnss* gnss) : mGnss(gnss) { GnssConfiguration::GnssConfiguration(Gnss* gnss) : mGnss(gnss) {
@@ -220,8 +220,16 @@ Return<bool> GnssConfiguration::setEmergencySuplPdn(bool enabled) {
return mGnss->updateConfiguration(config); return mGnss->updateConfiguration(config);
} }
// Methods from ::android::hardware::gnss::V1_1::IGnssConfiguration follow.
Return<bool> GnssConfiguration::setBlacklist(
const hidl_vec<GnssConfiguration::BlacklistedSource>& /*blacklist*/) {
ENTRY_LOG_CALLFLOW();
return true;
}
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
@@ -22,16 +22,16 @@
#ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSCONFIGURATION_H #ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSCONFIGURATION_H
#define ANDROID_HARDWARE_GNSS_V1_1_GNSSCONFIGURATION_H #define ANDROID_HARDWARE_GNSS_V1_1_GNSSCONFIGURATION_H
#include <android/hardware/gnss/1.0/IGnssConfiguration.h> #include <android/hardware/gnss/1.1/IGnssConfiguration.h>
#include <hidl/Status.h> #include <hidl/Status.h>
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
using ::android::hardware::gnss::V1_0::IGnssConfiguration; using ::android::hardware::gnss::V1_1::IGnssConfiguration;
using ::android::hardware::Return; using ::android::hardware::Return;
using ::android::hardware::Void; using ::android::hardware::Void;
using ::android::hardware::hidl_vec; using ::android::hardware::hidl_vec;
@@ -58,12 +58,16 @@ struct GnssConfiguration : public IGnssConfiguration {
Return<bool> setEmergencySuplPdn(bool enable) override; Return<bool> setEmergencySuplPdn(bool enable) override;
Return<bool> setGpsLock(uint8_t lock) override; Return<bool> setGpsLock(uint8_t lock) override;
// Methods from ::android::hardware::gnss::V1_1::IGnssConfiguration follow.
Return<bool> setBlacklist(
const hidl_vec<GnssConfiguration::BlacklistedSource>& blacklist) override;
private: private:
Gnss* mGnss = nullptr; Gnss* mGnss = nullptr;
}; };
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -25,13 +25,19 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
using ::android::hardware::hidl_vec; using ::android::hardware::hidl_vec;
#define GNSS_DEBUG_UNKNOWN_UTC_TIME (1483228800000ULL) // 1/1/2017 00:00 GMT #define GNSS_DEBUG_UNKNOWN_HORIZONTAL_ACCURACY_METERS (20000000)
#define GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC (1.57783680E17) // 5 years in ns #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) GnssDebug::GnssDebug(Gnss* gnss) : mGnss(gnss)
{ {
@@ -91,6 +97,40 @@ Return<void> GnssDebug::getDebugData(getDebugData_cb _hidl_cb)
data.position.valid = false; 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 // time block
if (reports.mTime.mValid) { if (reports.mTime.mValid) {
data.time.timeEstimate = reports.mTime.timeEstimate; data.time.timeEstimate = reports.mTime.timeEstimate;
@@ -98,10 +138,17 @@ Return<void> GnssDebug::getDebugData(getDebugData_cb _hidl_cb)
data.time.frequencyUncertaintyNsPerSec = data.time.frequencyUncertaintyNsPerSec =
reports.mTime.frequencyUncertaintyNsPerSec; reports.mTime.frequencyUncertaintyNsPerSec;
} }
else {
if (data.time.timeEstimate < GNSS_DEBUG_UNKNOWN_UTC_TIME) {
data.time.timeEstimate = GNSS_DEBUG_UNKNOWN_UTC_TIME; data.time.timeEstimate = GNSS_DEBUG_UNKNOWN_UTC_TIME;
data.time.timeUncertaintyNs = (float)(GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC); }
data.time.frequencyUncertaintyNsPerSec = 0; 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 // satellite data block
@@ -137,7 +184,7 @@ Return<void> GnssDebug::getDebugData(getDebugData_cb _hidl_cb)
} }
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -24,7 +24,7 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
using ::android::hardware::gnss::V1_0::IGnssDebug; using ::android::hardware::gnss::V1_0::IGnssDebug;
@@ -51,7 +51,7 @@ private:
}; };
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@@ -27,7 +27,7 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
void GnssGeofencing::GnssGeofencingDeathRecipient::serviceDied( void GnssGeofencing::GnssGeofencingDeathRecipient::serviceDied(
@@ -135,7 +135,7 @@ Return<void> GnssGeofencing::removeAllGeofences() {
} }
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@@ -27,7 +27,7 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
using ::android::hardware::gnss::V1_0::IGnssGeofenceCallback; using ::android::hardware::gnss::V1_0::IGnssGeofenceCallback;
@@ -83,7 +83,7 @@ struct GnssGeofencing : public IGnssGeofencing {
}; };
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@@ -27,7 +27,7 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
void GnssMeasurement::GnssMeasurementDeathRecipient::serviceDied( void GnssMeasurement::GnssMeasurementDeathRecipient::serviceDied(
@@ -52,8 +52,9 @@ GnssMeasurement::~GnssMeasurement() {
} }
// Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow. // Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow.
Return<IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback( Return<IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
const sp<IGnssMeasurementCallback>& callback) { const sp<V1_0::IGnssMeasurementCallback>& callback) {
Return<IGnssMeasurement::GnssMeasurementStatus> ret = Return<IGnssMeasurement::GnssMeasurementStatus> ret =
IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC; IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
@@ -72,9 +73,10 @@ Return<IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
} }
mGnssMeasurementCbIface = callback; mGnssMeasurementCbIface = callback;
mGnssMeasurementCbIface->linkToDeath(mGnssMeasurementDeathRecipient, 0 /*cookie*/); mGnssMeasurementCbIface->linkToDeath(mGnssMeasurementDeathRecipient, 0);
return mApi->measurementSetCallback(callback); return mApi->measurementSetCallback(callback);
} }
Return<void> GnssMeasurement::close() { Return<void> GnssMeasurement::close() {
@@ -87,13 +89,43 @@ Return<void> GnssMeasurement::close() {
mGnssMeasurementCbIface->unlinkToDeath(mGnssMeasurementDeathRecipient); mGnssMeasurementCbIface->unlinkToDeath(mGnssMeasurementDeathRecipient);
mGnssMeasurementCbIface = nullptr; mGnssMeasurementCbIface = nullptr;
} }
if (mGnssMeasurementCbIface_1_1 != nullptr) {
mGnssMeasurementCbIface_1_1->unlinkToDeath(mGnssMeasurementDeathRecipient);
mGnssMeasurementCbIface_1_1 = nullptr;
}
mApi->measurementClose(); mApi->measurementClose();
return Void(); return Void();
} }
// Methods from ::android::hardware::gnss::V1_1::IGnssMeasurement follow.
Return<GnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_1_1(
const sp<IGnssMeasurementCallback>& callback, bool /*enableFullTracking*/) {
Return<IGnssMeasurement::GnssMeasurementStatus> ret =
IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
if (mGnssMeasurementCbIface_1_1 != 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_1_1 = callback;
mGnssMeasurementCbIface_1_1->linkToDeath(mGnssMeasurementDeathRecipient, 0);
return mApi->measurementSetCallback_1_1(callback);
}
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@@ -21,17 +21,18 @@
#ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSMEASUREMENT_H #ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSMEASUREMENT_H
#define ANDROID_HARDWARE_GNSS_V1_1_GNSSMEASUREMENT_H #define ANDROID_HARDWARE_GNSS_V1_1_GNSSMEASUREMENT_H
#include <android/hardware/gnss/1.0/IGnssMeasurement.h> #include <android/hardware/gnss/1.1/IGnssMeasurement.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h> #include <hidl/Status.h>
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
using ::android::hardware::gnss::V1_0::IGnssMeasurement; using ::android::hardware::gnss::V1_1::IGnssMeasurement;
using ::android::hardware::gnss::V1_0::IGnssMeasurementCallback; using ::android::hardware::gnss::V1_1::IGnssMeasurementCallback;
using ::android::hardware::Return; using ::android::hardware::Return;
using ::android::hardware::Void; using ::android::hardware::Void;
using ::android::hardware::hidl_vec; using ::android::hardware::hidl_vec;
@@ -47,10 +48,15 @@ struct GnssMeasurement : public IGnssMeasurement {
* Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow. * Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow.
* These declarations were generated from IGnssMeasurement.hal. * These declarations were generated from IGnssMeasurement.hal.
*/ */
Return<GnssMeasurementStatus> setCallback( Return<GnssMeasurement::GnssMeasurementStatus> setCallback(
const sp<IGnssMeasurementCallback>& callback) override; const sp<V1_0::IGnssMeasurementCallback>& callback) override;
Return<void> close() override; Return<void> close() override;
// Methods from ::android::hardware::gnss::V1_1::IGnssMeasurement follow.
Return<GnssMeasurement::GnssMeasurementStatus> setCallback_1_1(
const sp<IGnssMeasurementCallback>& callback,
bool enableFullTracking) override;
private: private:
struct GnssMeasurementDeathRecipient : hidl_death_recipient { struct GnssMeasurementDeathRecipient : hidl_death_recipient {
GnssMeasurementDeathRecipient(sp<GnssMeasurement> gnssMeasurement) : GnssMeasurementDeathRecipient(sp<GnssMeasurement> gnssMeasurement) :
@@ -63,12 +69,13 @@ struct GnssMeasurement : public IGnssMeasurement {
private: private:
sp<GnssMeasurementDeathRecipient> mGnssMeasurementDeathRecipient = nullptr; sp<GnssMeasurementDeathRecipient> mGnssMeasurementDeathRecipient = nullptr;
sp<IGnssMeasurementCallback> mGnssMeasurementCbIface = nullptr; sp<V1_0::IGnssMeasurementCallback> mGnssMeasurementCbIface = nullptr;
sp<IGnssMeasurementCallback> mGnssMeasurementCbIface_1_1 = nullptr;
MeasurementAPIClient* mApi; MeasurementAPIClient* mApi;
}; };
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@@ -27,7 +27,7 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
void GnssNi::GnssNiDeathRecipient::serviceDied(uint64_t cookie, const wp<IBase>& who) { void GnssNi::GnssNiDeathRecipient::serviceDied(uint64_t cookie, const wp<IBase>& who) {
@@ -79,7 +79,7 @@ Return<void> GnssNi::respond(int32_t notifId, IGnssNiCallback::GnssUserResponseT
} }
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@@ -27,7 +27,7 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
using ::android::hardware::gnss::V1_0::IGnssNi; using ::android::hardware::gnss::V1_0::IGnssNi;
@@ -67,7 +67,7 @@ struct GnssNi : public IGnssNi {
}; };
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,4 +0,0 @@
service gnss_service /vendor/bin/hw/android.hardware.gnss@1.0-service-qti
class main
user gps
group system gps radio

View File

@@ -0,0 +1,4 @@
service gnss_service /vendor/bin/hw/android.hardware.gnss@1.1-service-qti
class hal
user gps
group system gps radio

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@@ -42,9 +42,13 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { 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, static void convertBatchOption(const IGnssBatching::Options& in, LocationOptions& out,
LocationCapabilitiesMask mask); LocationCapabilitiesMask mask);
@@ -153,7 +157,8 @@ void BatchingAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMa
mLocationCapabilitiesMask = capabilitiesMask; mLocationCapabilitiesMask = capabilitiesMask;
} }
void BatchingAPIClient::onBatchingCb(size_t count, Location* location, BatchingOptions batchOptions) void BatchingAPIClient::onBatchingCb(size_t count, Location* location,
BatchingOptions /*batchOptions*/)
{ {
LOC_LOGD("%s]: (count: %zu)", __FUNCTION__, count); LOC_LOGD("%s]: (count: %zu)", __FUNCTION__, count);
if (mGnssBatchingCbIface != nullptr && count > 0) { if (mGnssBatchingCbIface != nullptr && count > 0) {
@@ -185,7 +190,7 @@ static void convertBatchOption(const IGnssBatching::Options& in, LocationOptions
} }
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@@ -39,17 +39,17 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
class BatchingAPIClient : public LocationAPIClientBase class BatchingAPIClient : public LocationAPIClientBase
{ {
public: public:
BatchingAPIClient(const sp<IGnssBatchingCallback>& callback); BatchingAPIClient(const sp<V1_0::IGnssBatchingCallback>& callback);
~BatchingAPIClient(); ~BatchingAPIClient();
int getBatchSize(); int getBatchSize();
int startSession(const IGnssBatching::Options& options); int startSession(const V1_0::IGnssBatching::Options& options);
int updateSessionOptions(const IGnssBatching::Options& options); int updateSessionOptions(const V1_0::IGnssBatching::Options& options);
int stopSession(); int stopSession();
void getBatchedLocation(int last_n_locations); void getBatchedLocation(int last_n_locations);
void flushBatchedLocations(); void flushBatchedLocations();
@@ -61,14 +61,13 @@ public:
void onBatchingCb(size_t count, Location* location, BatchingOptions batchOptions) final; void onBatchingCb(size_t count, Location* location, BatchingOptions batchOptions) final;
private: private:
sp<IGnssBatchingCallback> mGnssBatchingCbIface; sp<V1_0::IGnssBatchingCallback> mGnssBatchingCbIface;
uint32_t mDefaultId; uint32_t mDefaultId;
int mBatchSize;
LocationCapabilitiesMask mLocationCapabilitiesMask; LocationCapabilitiesMask mLocationCapabilitiesMask;
}; };
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@@ -39,9 +39,11 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
using ::android::hardware::gnss::V1_0::IGnssGeofenceCallback;
using ::android::hardware::gnss::V1_0::GnssLocation;
GeofenceAPIClient::GeofenceAPIClient(const sp<IGnssGeofenceCallback>& callback) : GeofenceAPIClient::GeofenceAPIClient(const sp<IGnssGeofenceCallback>& callback) :
LocationAPIClientBase(), LocationAPIClientBase(),
@@ -158,7 +160,7 @@ void GeofenceAPIClient::onGeofenceBreachCb(GeofenceBreachNotification geofenceBr
auto r = mGnssGeofencingCbIface->gnssGeofenceTransitionCb( auto r = mGnssGeofencingCbIface->gnssGeofenceTransitionCb(
geofenceBreachNotification.ids[i], gnssLocation, transition, geofenceBreachNotification.ids[i], gnssLocation, transition,
static_cast<GnssUtcTime>(geofenceBreachNotification.timestamp)); static_cast<V1_0::GnssUtcTime>(geofenceBreachNotification.timestamp));
if (!r.isOk()) { if (!r.isOk()) {
LOC_LOGE("%s] Error from gnssGeofenceTransitionCb description=%s", LOC_LOGE("%s] Error from gnssGeofenceTransitionCb description=%s",
__func__, r.description().c_str()); __func__, r.description().c_str());
@@ -267,7 +269,7 @@ void GeofenceAPIClient::onResumeGeofencesCb(size_t count, LocationError* errors,
} }
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@@ -37,7 +37,7 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
using ::android::sp; using ::android::sp;
@@ -45,7 +45,7 @@ using ::android::sp;
class GeofenceAPIClient : public LocationAPIClientBase class GeofenceAPIClient : public LocationAPIClientBase
{ {
public: public:
GeofenceAPIClient(const sp<IGnssGeofenceCallback>& callback); GeofenceAPIClient(const sp<V1_0::IGnssGeofenceCallback>& callback);
virtual ~GeofenceAPIClient() = default; virtual ~GeofenceAPIClient() = default;
void geofenceAdd(uint32_t geofence_id, double latitude, double longitude, void geofenceAdd(uint32_t geofence_id, double latitude, double longitude,
@@ -65,11 +65,11 @@ public:
void onResumeGeofencesCb(size_t count, LocationError* errors, uint32_t* ids) final; void onResumeGeofencesCb(size_t count, LocationError* errors, uint32_t* ids) final;
private: private:
sp<IGnssGeofenceCallback> mGnssGeofencingCbIface; sp<V1_0::IGnssGeofenceCallback> mGnssGeofencingCbIface;
}; };
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@@ -40,9 +40,14 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { 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); static void convertGnssSvStatus(GnssSvNotification& in, IGnssCallback::GnssSvStatus& out);
GnssAPIClient::GnssAPIClient(const sp<IGnssCallback>& gpsCb, GnssAPIClient::GnssAPIClient(const sp<IGnssCallback>& gpsCb,
@@ -81,8 +86,10 @@ void GnssAPIClient::gnssUpdateCallbacks(const sp<IGnssCallback>& gpsCb,
{ {
LOC_LOGD("%s]: (%p %p)", __FUNCTION__, &gpsCb, &niCb); LOC_LOGD("%s]: (%p %p)", __FUNCTION__, &gpsCb, &niCb);
mMutex.lock();
mGnssCbIface = gpsCb; mGnssCbIface = gpsCb;
mGnssNiCbIface = niCb; mGnssNiCbIface = niCb;
mMutex.unlock();
LocationCallbacks locationCallbacks; LocationCallbacks locationCallbacks;
memset(&locationCallbacks, 0, sizeof(LocationCallbacks)); memset(&locationCallbacks, 0, sizeof(LocationCallbacks));
@@ -158,6 +165,10 @@ bool GnssAPIClient::gnssSetPositionMode(IGnss::GnssPositionMode mode,
mLocationOptions.size = sizeof(LocationOptions); mLocationOptions.size = sizeof(LocationOptions);
mLocationOptions.minInterval = minIntervalMs; mLocationOptions.minInterval = minIntervalMs;
mLocationOptions.minDistance = preferredAccuracyMeters; mLocationOptions.minDistance = preferredAccuracyMeters;
if (IGnss::GnssPositionRecurrence::RECURRENCE_SINGLE == recurrence) {
mLocationOptions.minInterval =
std::numeric_limits<decltype(mLocationOptions.minInterval)>::max();
}
if (mode == IGnss::GnssPositionMode::STANDALONE) if (mode == IGnss::GnssPositionMode::STANDALONE)
mLocationOptions.mode = GNSS_SUPL_MODE_STANDALONE; mLocationOptions.mode = GNSS_SUPL_MODE_STANDALONE;
else if (mode == IGnss::GnssPositionMode::MS_BASED) else if (mode == IGnss::GnssPositionMode::MS_BASED)
@@ -278,7 +289,10 @@ void GnssAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMask)
LOC_LOGD("%s]: (%02x)", __FUNCTION__, capabilitiesMask); LOC_LOGD("%s]: (%02x)", __FUNCTION__, capabilitiesMask);
mLocationCapabilitiesMask = capabilitiesMask; mLocationCapabilitiesMask = capabilitiesMask;
mLocationCapabilitiesCached = true; mLocationCapabilitiesCached = true;
sp<IGnssCallback> gnssCbIface = mGnssCbIface;
mMutex.lock();
auto gnssCbIface(mGnssCbIface);
mMutex.unlock();
if (gnssCbIface != nullptr) { if (gnssCbIface != nullptr) {
uint32_t data = 0; uint32_t data = 0;
@@ -322,7 +336,9 @@ void GnssAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMask)
void GnssAPIClient::onTrackingCb(Location location) void GnssAPIClient::onTrackingCb(Location location)
{ {
LOC_LOGD("%s]: (flags: %02x)", __FUNCTION__, location.flags); LOC_LOGD("%s]: (flags: %02x)", __FUNCTION__, location.flags);
sp<IGnssCallback> gnssCbIface = mGnssCbIface; mMutex.lock();
auto gnssCbIface(mGnssCbIface);
mMutex.unlock();
if (gnssCbIface != nullptr) { if (gnssCbIface != nullptr) {
GnssLocation gnssLocation; GnssLocation gnssLocation;
@@ -338,7 +354,9 @@ void GnssAPIClient::onTrackingCb(Location location)
void GnssAPIClient::onGnssNiCb(uint32_t id, GnssNiNotification gnssNiNotification) void GnssAPIClient::onGnssNiCb(uint32_t id, GnssNiNotification gnssNiNotification)
{ {
LOC_LOGD("%s]: (id: %d)", __FUNCTION__, id); LOC_LOGD("%s]: (id: %d)", __FUNCTION__, id);
sp<IGnssNiCallback> gnssNiCbIface = mGnssNiCbIface; mMutex.lock();
auto gnssNiCbIface(mGnssNiCbIface);
mMutex.unlock();
if (gnssNiCbIface == nullptr) { if (gnssNiCbIface == nullptr) {
LOC_LOGE("%s]: mGnssNiCbIface is nullptr", __FUNCTION__); LOC_LOGE("%s]: mGnssNiCbIface is nullptr", __FUNCTION__);
@@ -411,7 +429,9 @@ void GnssAPIClient::onGnssNiCb(uint32_t id, GnssNiNotification gnssNiNotificatio
void GnssAPIClient::onGnssSvCb(GnssSvNotification gnssSvNotification) void GnssAPIClient::onGnssSvCb(GnssSvNotification gnssSvNotification)
{ {
LOC_LOGD("%s]: (count: %zu)", __FUNCTION__, gnssSvNotification.count); LOC_LOGD("%s]: (count: %zu)", __FUNCTION__, gnssSvNotification.count);
sp<IGnssCallback> gnssCbIface = mGnssCbIface; mMutex.lock();
auto gnssCbIface(mGnssCbIface);
mMutex.unlock();
if (gnssCbIface != nullptr) { if (gnssCbIface != nullptr) {
IGnssCallback::GnssSvStatus svStatus; IGnssCallback::GnssSvStatus svStatus;
@@ -426,13 +446,15 @@ void GnssAPIClient::onGnssSvCb(GnssSvNotification gnssSvNotification)
void GnssAPIClient::onGnssNmeaCb(GnssNmeaNotification gnssNmeaNotification) void GnssAPIClient::onGnssNmeaCb(GnssNmeaNotification gnssNmeaNotification)
{ {
sp<IGnssCallback> gnssCbIface = mGnssCbIface; mMutex.lock();
auto gnssCbIface(mGnssCbIface);
mMutex.unlock();
if (gnssCbIface != nullptr) { if (gnssCbIface != nullptr) {
android::hardware::hidl_string nmeaString; android::hardware::hidl_string nmeaString;
nmeaString.setToExternal(gnssNmeaNotification.nmea, gnssNmeaNotification.length); nmeaString.setToExternal(gnssNmeaNotification.nmea, gnssNmeaNotification.length);
auto r = gnssCbIface->gnssNmeaCb( auto r = gnssCbIface->gnssNmeaCb(
static_cast<GnssUtcTime>(gnssNmeaNotification.timestamp), nmeaString); static_cast<V1_0::GnssUtcTime>(gnssNmeaNotification.timestamp), nmeaString);
if (!r.isOk()) { if (!r.isOk()) {
LOC_LOGE("%s] Error from gnssNmeaCb nmea=%s length=%zu description=%s", __func__, LOC_LOGE("%s] Error from gnssNmeaCb nmea=%s length=%zu description=%s", __func__,
gnssNmeaNotification.nmea, gnssNmeaNotification.length, r.description().c_str()); gnssNmeaNotification.nmea, gnssNmeaNotification.length, r.description().c_str());
@@ -443,7 +465,9 @@ void GnssAPIClient::onGnssNmeaCb(GnssNmeaNotification gnssNmeaNotification)
void GnssAPIClient::onStartTrackingCb(LocationError error) void GnssAPIClient::onStartTrackingCb(LocationError error)
{ {
LOC_LOGD("%s]: (%d)", __FUNCTION__, error); LOC_LOGD("%s]: (%d)", __FUNCTION__, error);
sp<IGnssCallback> gnssCbIface = mGnssCbIface; mMutex.lock();
auto gnssCbIface(mGnssCbIface);
mMutex.unlock();
if (error == LOCATION_ERROR_SUCCESS && gnssCbIface != nullptr) { if (error == LOCATION_ERROR_SUCCESS && gnssCbIface != nullptr) {
auto r = gnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::ENGINE_ON); auto r = gnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::ENGINE_ON);
@@ -462,7 +486,9 @@ void GnssAPIClient::onStartTrackingCb(LocationError error)
void GnssAPIClient::onStopTrackingCb(LocationError error) void GnssAPIClient::onStopTrackingCb(LocationError error)
{ {
LOC_LOGD("%s]: (%d)", __FUNCTION__, error); LOC_LOGD("%s]: (%d)", __FUNCTION__, error);
sp<IGnssCallback> gnssCbIface = mGnssCbIface; mMutex.lock();
auto gnssCbIface(mGnssCbIface);
mMutex.unlock();
if (error == LOCATION_ERROR_SUCCESS && gnssCbIface != nullptr) { if (error == LOCATION_ERROR_SUCCESS && gnssCbIface != nullptr) {
auto r = gnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::SESSION_END); auto r = gnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::SESSION_END);
@@ -482,10 +508,10 @@ static void convertGnssSvStatus(GnssSvNotification& in, IGnssCallback::GnssSvSta
{ {
memset(&out, 0, sizeof(IGnssCallback::GnssSvStatus)); memset(&out, 0, sizeof(IGnssCallback::GnssSvStatus));
out.numSvs = in.count; out.numSvs = in.count;
if (out.numSvs > static_cast<uint32_t>(GnssMax::SVS_COUNT)) { if (out.numSvs > static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT)) {
LOC_LOGW("%s]: Too many satellites %zd. Clamps to %d.", LOC_LOGW("%s]: Too many satellites %u. Clamps to %d.",
__FUNCTION__, out.numSvs, GnssMax::SVS_COUNT); __FUNCTION__, out.numSvs, V1_0::GnssMax::SVS_COUNT);
out.numSvs = static_cast<uint32_t>(GnssMax::SVS_COUNT); out.numSvs = static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT);
} }
for (size_t i = 0; i < out.numSvs; i++) { for (size_t i = 0; i < out.numSvs; i++) {
IGnssCallback::GnssSvInfo& info = out.gnssSvList[i]; IGnssCallback::GnssSvInfo& info = out.gnssSvList[i];
@@ -505,7 +531,7 @@ static void convertGnssSvStatus(GnssSvNotification& in, IGnssCallback::GnssSvSta
} }
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@@ -31,15 +31,16 @@
#define GNSS_API_CLINET_H #define GNSS_API_CLINET_H
#include <android/hardware/gnss/1.0/IGnss.h> #include <mutex>
#include <android/hardware/gnss/1.0/IGnssCallback.h> #include <android/hardware/gnss/1.1/IGnss.h>
#include <android/hardware/gnss/1.1/IGnssCallback.h>
#include <android/hardware/gnss/1.0/IGnssNiCallback.h> #include <android/hardware/gnss/1.0/IGnssNiCallback.h>
#include <LocationAPIClientBase.h> #include <LocationAPIClientBase.h>
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
using ::android::sp; using ::android::sp;
@@ -47,28 +48,28 @@ using ::android::sp;
class GnssAPIClient : public LocationAPIClientBase class GnssAPIClient : public LocationAPIClientBase
{ {
public: public:
GnssAPIClient(const sp<IGnssCallback>& gpsCb, GnssAPIClient(const sp<V1_0::IGnssCallback>& gpsCb,
const sp<IGnssNiCallback>& niCb); const sp<V1_0::IGnssNiCallback>& niCb);
virtual ~GnssAPIClient(); virtual ~GnssAPIClient();
GnssAPIClient(const GnssAPIClient&) = delete; GnssAPIClient(const GnssAPIClient&) = delete;
GnssAPIClient& operator=(const GnssAPIClient&) = delete; GnssAPIClient& operator=(const GnssAPIClient&) = delete;
// for GpsInterface // for GpsInterface
void gnssUpdateCallbacks(const sp<IGnssCallback>& gpsCb, void gnssUpdateCallbacks(const sp<V1_0::IGnssCallback>& gpsCb,
const sp<IGnssNiCallback>& niCb); const sp<V1_0::IGnssNiCallback>& niCb);
bool gnssStart(); bool gnssStart();
bool gnssStop(); bool gnssStop();
bool gnssSetPositionMode(IGnss::GnssPositionMode mode, bool gnssSetPositionMode(V1_0::IGnss::GnssPositionMode mode,
IGnss::GnssPositionRecurrence recurrence, V1_0::IGnss::GnssPositionRecurrence recurrence,
uint32_t minIntervalMs, uint32_t minIntervalMs,
uint32_t preferredAccuracyMeters, uint32_t preferredAccuracyMeters,
uint32_t preferredTimeMs); uint32_t preferredTimeMs);
// for GpsNiInterface // for GpsNiInterface
void gnssNiRespond(int32_t notifId, IGnssNiCallback::GnssUserResponseType userResponse); void gnssNiRespond(int32_t notifId, V1_0::IGnssNiCallback::GnssUserResponseType userResponse);
// these apis using LocationAPIControlClient // these apis using LocationAPIControlClient
void gnssDeleteAidingData(IGnss::GnssAidingData aidingDataFlags); void gnssDeleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags);
void gnssEnable(LocationTechnologyType techType); void gnssEnable(LocationTechnologyType techType);
void gnssDisable(); void gnssDisable();
void gnssConfigurationUpdate(const GnssConfig& gnssConfig); void gnssConfigurationUpdate(const GnssConfig& gnssConfig);
@@ -89,9 +90,9 @@ public:
void onStopTrackingCb(LocationError error) final; void onStopTrackingCb(LocationError error) final;
private: private:
sp<IGnssCallback> mGnssCbIface; sp<V1_0::IGnssCallback> mGnssCbIface;
sp<IGnssNiCallback> mGnssNiCbIface; sp<V1_0::IGnssNiCallback> mGnssNiCbIface;
std::mutex mMutex;
LocationAPIControlClient* mControlClient; LocationAPIControlClient* mControlClient;
LocationCapabilitiesMask mLocationCapabilitiesMask; LocationCapabilitiesMask mLocationCapabilitiesMask;
bool mLocationCapabilitiesCached; bool mLocationCapabilitiesCached;
@@ -100,7 +101,7 @@ private:
}; };
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@@ -32,9 +32,13 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { 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) void convertGnssLocation(Location& in, GnssLocation& out)
{ {
memset(&out, 0, sizeof(GnssLocation)); memset(&out, 0, sizeof(GnssLocation));
@@ -63,7 +67,38 @@ void convertGnssLocation(Location& in, GnssLocation& out)
out.verticalAccuracyMeters = in.verticalAccuracy; out.verticalAccuracyMeters = in.verticalAccuracy;
out.speedAccuracyMetersPerSecond = in.speedAccuracy; out.speedAccuracyMetersPerSecond = in.speedAccuracy;
out.bearingAccuracyDegrees = in.bearingAccuracy; out.bearingAccuracyDegrees = in.bearingAccuracy;
out.timestamp = static_cast<GnssUtcTime>(in.timestamp); 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) void convertGnssConstellationType(GnssSvType& in, GnssConstellationType& out)
@@ -147,7 +182,7 @@ void convertGnssEphemerisHealth(GnssEphemerisHealth& in, GnssDebug::SatelliteEph
} }
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@@ -37,17 +37,18 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
void convertGnssLocation(Location& in, GnssLocation& out); void convertGnssLocation(Location& in, V1_0::GnssLocation& out);
void convertGnssConstellationType(GnssSvType& in, GnssConstellationType& 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 convertGnssEphemerisType(GnssEphemerisType& in, GnssDebug::SatelliteEphemerisType& out);
void convertGnssEphemerisSource(GnssEphemerisSource& in, GnssDebug::SatelliteEphemerisSource& out); void convertGnssEphemerisSource(GnssEphemerisSource& in, GnssDebug::SatelliteEphemerisSource& out);
void convertGnssEphemerisHealth(GnssEphemerisHealth& in, GnssDebug::SatelliteEphemerisHealth& out); void convertGnssEphemerisHealth(GnssEphemerisHealth& in, GnssDebug::SatelliteEphemerisHealth& out);
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@@ -39,17 +39,23 @@
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
using ::android::hardware::gnss::V1_0::IGnssMeasurement;
using ::android::hardware::gnss::V1_1::IGnssMeasurementCallback;
static void convertGnssData(GnssMeasurementsNotification& in, static void convertGnssData(GnssMeasurementsNotification& in,
V1_0::IGnssMeasurementCallback::GnssData& out);
static void convertGnssData_1_1(GnssMeasurementsNotification& in,
IGnssMeasurementCallback::GnssData& out); IGnssMeasurementCallback::GnssData& out);
static void convertGnssMeasurement(GnssMeasurementsData& in, static void convertGnssMeasurement(GnssMeasurementsData& in,
IGnssMeasurementCallback::GnssMeasurement& out); V1_0::IGnssMeasurementCallback::GnssMeasurement& out);
static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback::GnssClock& out); static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback::GnssClock& out);
MeasurementAPIClient::MeasurementAPIClient() : MeasurementAPIClient::MeasurementAPIClient() :
mGnssMeasurementCbIface(nullptr), mGnssMeasurementCbIface(nullptr),
mGnssMeasurementCbIface_1_1(nullptr),
mTracking(false) mTracking(false)
{ {
LOC_LOGD("%s]: ()", __FUNCTION__); LOC_LOGD("%s]: ()", __FUNCTION__);
@@ -62,12 +68,32 @@ MeasurementAPIClient::~MeasurementAPIClient()
// for GpsInterface // for GpsInterface
Return<IGnssMeasurement::GnssMeasurementStatus> Return<IGnssMeasurement::GnssMeasurementStatus>
MeasurementAPIClient::measurementSetCallback(const sp<IGnssMeasurementCallback>& callback) MeasurementAPIClient::measurementSetCallback(const sp<V1_0::IGnssMeasurementCallback>& callback)
{ {
LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback); LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback);
mMutex.lock();
mGnssMeasurementCbIface = callback; mGnssMeasurementCbIface = callback;
mMutex.unlock();
return startTracking();
}
Return<IGnssMeasurement::GnssMeasurementStatus>
MeasurementAPIClient::measurementSetCallback_1_1(const sp<IGnssMeasurementCallback>& callback)
{
LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback);
mMutex.lock();
mGnssMeasurementCbIface_1_1 = callback;
mMutex.unlock();
return startTracking();
}
Return<IGnssMeasurement::GnssMeasurementStatus>
MeasurementAPIClient::startTracking()
{
LocationCallbacks locationCallbacks; LocationCallbacks locationCallbacks;
memset(&locationCallbacks, 0, sizeof(LocationCallbacks)); memset(&locationCallbacks, 0, sizeof(LocationCallbacks));
locationCallbacks.size = sizeof(LocationCallbacks); locationCallbacks.size = sizeof(LocationCallbacks);
@@ -82,7 +108,7 @@ MeasurementAPIClient::measurementSetCallback(const sp<IGnssMeasurementCallback>&
locationCallbacks.gnssNmeaCb = nullptr; locationCallbacks.gnssNmeaCb = nullptr;
locationCallbacks.gnssMeasurementsCb = nullptr; locationCallbacks.gnssMeasurementsCb = nullptr;
if (mGnssMeasurementCbIface != nullptr) { if (mGnssMeasurementCbIface_1_1 != nullptr || mGnssMeasurementCbIface != nullptr) {
locationCallbacks.gnssMeasurementsCb = locationCallbacks.gnssMeasurementsCb =
[this](GnssMeasurementsNotification gnssMeasurementsNotification) { [this](GnssMeasurementsNotification gnssMeasurementsNotification) {
onGnssMeasurementsCb(gnssMeasurementsNotification); onGnssMeasurementsCb(gnssMeasurementsNotification);
@@ -113,13 +139,31 @@ void MeasurementAPIClient::measurementClose() {
void MeasurementAPIClient::onGnssMeasurementsCb( void MeasurementAPIClient::onGnssMeasurementsCb(
GnssMeasurementsNotification gnssMeasurementsNotification) GnssMeasurementsNotification gnssMeasurementsNotification)
{ {
LOC_LOGD("%s]: (count: %zu active: %zu)", LOC_LOGD("%s]: (count: %zu active: %d)",
__FUNCTION__, gnssMeasurementsNotification.count, mTracking); __FUNCTION__, gnssMeasurementsNotification.count, mTracking);
if (mTracking) { if (mTracking) {
if (mGnssMeasurementCbIface != nullptr) { mMutex.lock();
sp<V1_0::IGnssMeasurementCallback> gnssMeasurementCbIface = nullptr;
sp<IGnssMeasurementCallback> gnssMeasurementCbIface_1_1 = nullptr;
if (mGnssMeasurementCbIface_1_1 != nullptr) {
gnssMeasurementCbIface_1_1 = mGnssMeasurementCbIface_1_1;
} else if (mGnssMeasurementCbIface != nullptr) {
gnssMeasurementCbIface = mGnssMeasurementCbIface;
}
mMutex.unlock();
if (gnssMeasurementCbIface_1_1 != nullptr) {
IGnssMeasurementCallback::GnssData gnssData; IGnssMeasurementCallback::GnssData gnssData;
convertGnssData_1_1(gnssMeasurementsNotification, gnssData);
auto r = gnssMeasurementCbIface_1_1->gnssMeasurementCb(gnssData);
if (!r.isOk()) {
LOC_LOGE("%s] Error from gnssMeasurementCb description=%s",
__func__, r.description().c_str());
}
} else if (gnssMeasurementCbIface != nullptr) {
V1_0::IGnssMeasurementCallback::GnssData gnssData;
convertGnssData(gnssMeasurementsNotification, gnssData); convertGnssData(gnssMeasurementsNotification, gnssData);
auto r = mGnssMeasurementCbIface->GnssMeasurementCb(gnssData); auto r = gnssMeasurementCbIface->GnssMeasurementCb(gnssData);
if (!r.isOk()) { if (!r.isOk()) {
LOC_LOGE("%s] Error from GnssMeasurementCb description=%s", LOC_LOGE("%s] Error from GnssMeasurementCb description=%s",
__func__, r.description().c_str()); __func__, r.description().c_str());
@@ -129,7 +173,7 @@ void MeasurementAPIClient::onGnssMeasurementsCb(
} }
static void convertGnssMeasurement(GnssMeasurementsData& in, static void convertGnssMeasurement(GnssMeasurementsData& in,
IGnssMeasurementCallback::GnssMeasurement& out) V1_0::IGnssMeasurementCallback::GnssMeasurement& out)
{ {
memset(&out, 0, sizeof(IGnssMeasurementCallback::GnssMeasurement)); memset(&out, 0, sizeof(IGnssMeasurementCallback::GnssMeasurement));
if (in.flags & GNSS_MEASUREMENTS_DATA_SIGNAL_TO_NOISE_RATIO_BIT) if (in.flags & GNSS_MEASUREMENTS_DATA_SIGNAL_TO_NOISE_RATIO_BIT)
@@ -236,13 +280,13 @@ static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback
} }
static void convertGnssData(GnssMeasurementsNotification& in, static void convertGnssData(GnssMeasurementsNotification& in,
IGnssMeasurementCallback::GnssData& out) V1_0::IGnssMeasurementCallback::GnssData& out)
{ {
out.measurementCount = in.count; out.measurementCount = in.count;
if (out.measurementCount > static_cast<uint32_t>(GnssMax::SVS_COUNT)) { if (out.measurementCount > static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT)) {
LOC_LOGW("%s]: Too many measurement %zd. Clamps to %d.", LOC_LOGW("%s]: Too many measurement %u. Clamps to %d.",
__FUNCTION__, out.measurementCount, GnssMax::SVS_COUNT); __FUNCTION__, out.measurementCount, V1_0::GnssMax::SVS_COUNT);
out.measurementCount = static_cast<uint32_t>(GnssMax::SVS_COUNT); out.measurementCount = static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT);
} }
for (size_t i = 0; i < out.measurementCount; i++) { for (size_t i = 0; i < out.measurementCount; i++) {
convertGnssMeasurement(in.measurements[i], out.measurements[i]); convertGnssMeasurement(in.measurements[i], out.measurements[i]);
@@ -250,8 +294,18 @@ static void convertGnssData(GnssMeasurementsNotification& in,
convertGnssClock(in.clock, out.clock); convertGnssClock(in.clock, out.clock);
} }
static void convertGnssData_1_1(GnssMeasurementsNotification& in,
IGnssMeasurementCallback::GnssData& out)
{
out.measurements.resize(in.count);
for (size_t i = 0; i < in.count; i++) {
convertGnssMeasurement(in.measurements[i], out.measurements[i].v1_0);
}
convertGnssClock(in.clock, out.clock);
}
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@@ -30,19 +30,18 @@
#ifndef MEASUREMENT_API_CLINET_H #ifndef MEASUREMENT_API_CLINET_H
#define MEASUREMENT_API_CLINET_H #define MEASUREMENT_API_CLINET_H
#include <mutex>
#include <android/hardware/gnss/1.0/IGnssMeasurement.h> #include <android/hardware/gnss/1.1/IGnssMeasurement.h>
#include <android/hardware/gnss/1.0/IGnssMeasurementCallback.h> #include <android/hardware/gnss/1.1/IGnssMeasurementCallback.h>
#include <LocationAPIClientBase.h> #include <LocationAPIClientBase.h>
#include <hidl/Status.h> #include <hidl/Status.h>
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace gnss { namespace gnss {
namespace V1_0 { namespace V1_1 {
namespace implementation { namespace implementation {
using ::android::hardware::gnss::V1_0::IGnssMeasurement;
using ::android::sp; using ::android::sp;
class MeasurementAPIClient : public LocationAPIClientBase class MeasurementAPIClient : public LocationAPIClientBase
@@ -54,21 +53,26 @@ public:
MeasurementAPIClient& operator=(const MeasurementAPIClient&) = delete; MeasurementAPIClient& operator=(const MeasurementAPIClient&) = delete;
// for GpsMeasurementInterface // for GpsMeasurementInterface
Return<IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback( Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback(
const sp<V1_0::IGnssMeasurementCallback>& callback);
Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback_1_1(
const sp<IGnssMeasurementCallback>& callback); const sp<IGnssMeasurementCallback>& callback);
void measurementClose(); void measurementClose();
Return<IGnssMeasurement::GnssMeasurementStatus> startTracking();
// callbacks we are interested in // callbacks we are interested in
void onGnssMeasurementsCb(GnssMeasurementsNotification gnssMeasurementsNotification) final; void onGnssMeasurementsCb(GnssMeasurementsNotification gnssMeasurementsNotification) final;
private: private:
sp<IGnssMeasurementCallback> mGnssMeasurementCbIface; std::mutex mMutex;
sp<V1_0::IGnssMeasurementCallback> mGnssMeasurementCbIface;
sp<IGnssMeasurementCallback> mGnssMeasurementCbIface_1_1;
bool mTracking; bool mTracking;
}; };
} // namespace implementation } // namespace implementation
} // namespace V1_0 } // namespace V1_1
} // namespace gnss } // namespace gnss
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@@ -18,12 +18,12 @@
* limitations under the License. * limitations under the License.
*/ */
#define LOG_TAG "android.hardware.gnss@1.0-service-qti" #define LOG_TAG "android.hardware.gnss@1.1-service-qti"
#include <android/hardware/gnss/1.0/IGnss.h> #include <android/hardware/gnss/1.1/IGnss.h>
#include <hidl/LegacySupport.h> #include <hidl/LegacySupport.h>
using android::hardware::gnss::V1_0::IGnss; using android::hardware::gnss::V1_1::IGnss;
using android::hardware::defaultPassthroughServiceImplementation; using android::hardware::defaultPassthroughServiceImplementation;
int main() { int main() {

View File

@@ -0,0 +1,17 @@
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

View File

@@ -11,7 +11,7 @@ AM_INIT_AUTOMAKE([foreign])
# Disables auto rebuilding of configure, Makefile.ins # Disables auto rebuilding of configure, Makefile.ins
AM_MAINTAINER_MODE AM_MAINTAINER_MODE
# Verifies the --srcdir is correct by checking for the path # Verifies the --srcdir is correct by checking for the path
AC_CONFIG_SRCDIR([utils/loc_cfg.cpp]) AC_CONFIG_SRCDIR([Makefile.am])
# defines some macros variable to be included by source # defines some macros variable to be included by source
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
@@ -29,26 +29,14 @@ AC_PROG_MAKE_SET
PKG_PROG_PKG_CONFIG PKG_PROG_PKG_CONFIG
# Checks for libraries. # Checks for libraries.
PKG_CHECK_MODULES([QMI], [qmi])
AC_SUBST([QMI_CFLAGS])
AC_SUBST([QMI_LIBS])
PKG_CHECK_MODULES([QMIF], [qmi-framework])
AC_SUBST([QMIF_CFLAGS])
AC_SUBST([QMIF_LIBS])
PKG_CHECK_MODULES([DATA], [data])
AC_SUBST([DATA_CFLAGS])
AC_SUBST([DATA_LIBS])
PKG_CHECK_MODULES([LOCPLA], [loc-pla])
AC_SUBST([LOCPLA_CFLAGS])
AC_SUBST([LOCPLA_LIBS])
PKG_CHECK_MODULES([GPSUTILS], [gps-utils]) PKG_CHECK_MODULES([GPSUTILS], [gps-utils])
AC_SUBST([GPSUTILS_CFLAGS]) AC_SUBST([GPSUTILS_CFLAGS])
AC_SUBST([GPSUTILS_LIBS]) AC_SUBST([GPSUTILS_LIBS])
PKG_CHECK_MODULES([LOCCORE], [loc-core])
AC_SUBST([LOCCORE_CFLAGS])
AC_SUBST([LOCCORE_LIBS])
AC_ARG_WITH([core_includes], AC_ARG_WITH([core_includes],
AC_HELP_STRING([--with-core-includes=@<:@dir@:>@], AC_HELP_STRING([--with-core-includes=@<:@dir@:>@],
[Specify the location of the core headers]), [Specify the location of the core headers]),
@@ -59,6 +47,16 @@ if test "x$with_core_includes" != "xno"; then
CPPFLAGS="${CPPFLAGS} -I${core_incdir}" CPPFLAGS="${CPPFLAGS} -I${core_incdir}"
fi 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_SUBST([CPPFLAGS])
AC_ARG_WITH([glib], AC_ARG_WITH([glib],
@@ -82,8 +80,6 @@ AM_CONDITIONAL(USE_GLIB, test "x${with_glib}" = "xyes")
AC_CONFIG_FILES([ \ AC_CONFIG_FILES([ \
Makefile \ Makefile \
core/Makefile \
location/Makefile \
gnss/Makefile \ gnss/Makefile \
loc-hal.pc \ loc-hal.pc \
]) ])

View File

@@ -6,8 +6,7 @@ LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := libloc_core LOCAL_MODULE := libloc_core
LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib LOCAL_VENDOR_MODULE := true
LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64
LOCAL_MODULE_TAGS := optional LOCAL_MODULE_TAGS := optional
ifeq ($(TARGET_DEVICE),apq8026_lw) ifeq ($(TARGET_DEVICE),apq8026_lw)
@@ -22,8 +21,7 @@ LOCAL_SHARED_LIBRARIES := \
libcutils \ libcutils \
libgps.utils \ libgps.utils \
libdl \ libdl \
liblog \ liblog
libloc_pla
LOCAL_SRC_FILES += \ LOCAL_SRC_FILES += \
LocApiBase.cpp \ LocApiBase.cpp \
@@ -32,9 +30,6 @@ LOCAL_SRC_FILES += \
LocDualContext.cpp \ LocDualContext.cpp \
loc_core_log.cpp \ loc_core_log.cpp \
data-items/DataItemsFactoryProxy.cpp \ data-items/DataItemsFactoryProxy.cpp \
data-items/common/ClientIndex.cpp \
data-items/common/DataItemIndex.cpp \
data-items/common/IndexFactory.cpp \
SystemStatusOsObserver.cpp \ SystemStatusOsObserver.cpp \
SystemStatus.cpp SystemStatus.cpp
@@ -48,6 +43,7 @@ LOCAL_C_INCLUDES:= \
$(LOCAL_PATH)/observer \ $(LOCAL_PATH)/observer \
LOCAL_HEADER_LIBRARIES := \ LOCAL_HEADER_LIBRARIES := \
libutils_headers \
libgps.utils_headers \ libgps.utils_headers \
libloc_pla_headers \ libloc_pla_headers \
liblocation_api_headers liblocation_api_headers

View File

@@ -35,7 +35,7 @@
#include <ContextBase.h> #include <ContextBase.h>
#include <msg_q.h> #include <msg_q.h>
#include <loc_target.h> #include <loc_target.h>
#include <platform_lib_includes.h> #include <loc_pla.h>
#include <loc_log.h> #include <loc_log.h>
namespace loc_core { namespace loc_core {
@@ -65,6 +65,8 @@ const loc_param_s_type ContextBase::mGps_conf_table[] =
{"USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL", &mGps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL, NULL, 'n'}, {"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'}, {"AGPS_CONFIG_INJECT", &mGps_conf.AGPS_CONFIG_INJECT, NULL, 'n'},
{"EXTERNAL_DR_ENABLED", &mGps_conf.EXTERNAL_DR_ENABLED, 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[] = const loc_param_s_type ContextBase::mSap_conf_table[] =
@@ -98,6 +100,8 @@ void ContextBase::readConfig()
mGps_conf.SUPL_VER = 0x10000; mGps_conf.SUPL_VER = 0x10000;
mGps_conf.SUPL_MODE = 0x1; mGps_conf.SUPL_MODE = 0x1;
mGps_conf.SUPL_ES = 0; mGps_conf.SUPL_ES = 0;
mGps_conf.SUPL_HOST[0] = 0;
mGps_conf.SUPL_PORT = 0;
mGps_conf.CAPABILITIES = 0x7; mGps_conf.CAPABILITIES = 0x7;
/* LTE Positioning Profile configuration is disable by default*/ /* LTE Positioning Profile configuration is disable by default*/
mGps_conf.LPP_PROFILE = 0; mGps_conf.LPP_PROFILE = 0;

View File

@@ -36,7 +36,8 @@
#include <LBSProxyBase.h> #include <LBSProxyBase.h>
#include <loc_cfg.h> #include <loc_cfg.h>
#define MAX_XTRA_SERVER_URL_LENGTH 256 #define MAX_XTRA_SERVER_URL_LENGTH (256)
#define MAX_SUPL_SERVER_URL_LENGTH (256)
/* GPS.conf support */ /* GPS.conf support */
/* NOTE: the implementaiton of the parser casts number /* NOTE: the implementaiton of the parser casts number
@@ -64,6 +65,8 @@ typedef struct loc_gps_cfg_s
uint32_t LPPE_CP_TECHNOLOGY; uint32_t LPPE_CP_TECHNOLOGY;
uint32_t LPPE_UP_TECHNOLOGY; uint32_t LPPE_UP_TECHNOLOGY;
uint32_t EXTERNAL_DR_ENABLED; uint32_t EXTERNAL_DR_ENABLED;
char SUPL_HOST[MAX_SUPL_SERVER_URL_LENGTH];
uint32_t SUPL_PORT;
} loc_gps_cfg_s_type; } loc_gps_cfg_s_type;
/* NOTE: the implementaiton of the parser casts number /* NOTE: the implementaiton of the parser casts number

View File

@@ -32,7 +32,7 @@
#include <dlfcn.h> #include <dlfcn.h>
#include <LocAdapterBase.h> #include <LocAdapterBase.h>
#include <loc_target.h> #include <loc_target.h>
#include <platform_lib_log_util.h> #include <log_util.h>
#include <LocAdapterProxyBase.h> #include <LocAdapterProxyBase.h>
namespace loc_core { namespace loc_core {
@@ -161,4 +161,8 @@ bool LocAdapterBase::
reportWwanZppFix(LocGpsLocation &/*zppLoc*/) reportWwanZppFix(LocGpsLocation &/*zppLoc*/)
DEFAULT_IMPL(false) DEFAULT_IMPL(false)
bool LocAdapterBase::
reportOdcpiRequestEvent(OdcpiRequestInfo& /*request*/)
DEFAULT_IMPL(false)
} // namespace loc_core } // namespace loc_core

View File

@@ -153,6 +153,7 @@ public:
virtual void reportGnssMeasurementDataEvent(const GnssMeasurementsNotification& measurements, virtual void reportGnssMeasurementDataEvent(const GnssMeasurementsNotification& measurements,
int msInWeek); int msInWeek);
virtual bool reportWwanZppFix(LocGpsLocation &zppLoc); virtual bool reportWwanZppFix(LocGpsLocation &zppLoc);
virtual bool reportOdcpiRequestEvent(OdcpiRequestInfo& request);
}; };
} // namespace loc_core } // namespace loc_core

View File

@@ -33,7 +33,7 @@
#include <inttypes.h> #include <inttypes.h>
#include <LocApiBase.h> #include <LocApiBase.h>
#include <LocAdapterBase.h> #include <LocAdapterBase.h>
#include <platform_lib_log_util.h> #include <log_util.h>
#include <LocDualContext.h> #include <LocDualContext.h>
namespace loc_core { namespace loc_core {
@@ -107,19 +107,16 @@ struct LocSsrMsg : public LocMsg {
struct LocOpenMsg : public LocMsg { struct LocOpenMsg : public LocMsg {
LocApiBase* mLocApi; LocApiBase* mLocApi;
LOC_API_ADAPTER_EVENT_MASK_T mMask; inline LocOpenMsg(LocApiBase* locApi) :
inline LocOpenMsg(LocApiBase* locApi, LocMsg(), mLocApi(locApi)
LOC_API_ADAPTER_EVENT_MASK_T mask) :
LocMsg(), mLocApi(locApi), mMask(mask)
{ {
locallog(); locallog();
} }
inline virtual void proc() const { inline virtual void proc() const {
mLocApi->open(mMask); mLocApi->open(mLocApi->getEvtMask());
} }
inline void locallog() const { inline void locallog() const {
LOC_LOGV("%s:%d]: LocOpen Mask: %x\n", LOC_LOGv("LocOpen Mask: %" PRIx64 "\n", mLocApi->getEvtMask());
__func__, __LINE__, mMask);
} }
inline virtual void log() const { inline virtual void log() const {
locallog(); locallog();
@@ -163,8 +160,7 @@ void LocApiBase::addAdapter(LocAdapterBase* adapter)
for (int i = 0; i < MAX_ADAPTERS && mLocAdapters[i] != adapter; i++) { for (int i = 0; i < MAX_ADAPTERS && mLocAdapters[i] != adapter; i++) {
if (mLocAdapters[i] == NULL) { if (mLocAdapters[i] == NULL) {
mLocAdapters[i] = adapter; mLocAdapters[i] = adapter;
mMsgTask->sendMsg(new LocOpenMsg(this, mMsgTask->sendMsg(new LocOpenMsg(this));
(adapter->getEvtMask())));
break; break;
} }
} }
@@ -200,7 +196,7 @@ void LocApiBase::removeAdapter(LocAdapterBase* adapter)
close(); close();
} else { } else {
// else we need to remove the bit // else we need to remove the bit
mMsgTask->sendMsg(new LocOpenMsg(this, getEvtMask())); mMsgTask->sendMsg(new LocOpenMsg(this));
} }
} }
} }
@@ -208,7 +204,7 @@ void LocApiBase::removeAdapter(LocAdapterBase* adapter)
void LocApiBase::updateEvtMask() void LocApiBase::updateEvtMask()
{ {
mMsgTask->sendMsg(new LocOpenMsg(this, getEvtMask())); open(getEvtMask());
} }
void LocApiBase::handleEngineUpEvent() void LocApiBase::handleEngineUpEvent()
@@ -264,6 +260,12 @@ void LocApiBase::reportWwanZppFix(LocGpsLocation &zppLoc)
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->reportWwanZppFix(zppLoc)); 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) void LocApiBase::reportSv(GnssSvNotification& svNotify)
{ {
const char* constellationString[] = { "Unknown", "GPS", "SBAS", "GLONASS", const char* constellationString[] = { "Unknown", "GPS", "SBAS", "GLONASS",
@@ -440,6 +442,10 @@ enum loc_api_adapter_err LocApiBase::
injectPosition(double /*latitude*/, double /*longitude*/, float /*accuracy*/) injectPosition(double /*latitude*/, double /*longitude*/, float /*accuracy*/)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS) 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:: enum loc_api_adapter_err LocApiBase::
setTime(LocGpsUtcTime /*time*/, int64_t /*timeReference*/, int /*uncertainty*/) setTime(LocGpsUtcTime /*time*/, int64_t /*timeReference*/, int /*uncertainty*/)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS) DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)

View File

@@ -34,7 +34,7 @@
#include <gps_extended.h> #include <gps_extended.h>
#include <LocationAPI.h> #include <LocationAPI.h>
#include <MsgTask.h> #include <MsgTask.h>
#include <platform_lib_log_util.h> #include <log_util.h>
namespace loc_core { namespace loc_core {
class ContextBase; class ContextBase;
@@ -134,6 +134,7 @@ public:
void reportGnssMeasurementData(GnssMeasurementsNotification& measurements, int msInWeek); void reportGnssMeasurementData(GnssMeasurementsNotification& measurements, int msInWeek);
void saveSupportedFeatureList(uint8_t *featureList); void saveSupportedFeatureList(uint8_t *featureList);
void reportWwanZppFix(LocGpsLocation &zppLoc); void reportWwanZppFix(LocGpsLocation &zppLoc);
void reportOdcpiRequest(OdcpiRequestInfo& request);
// downward calls // downward calls
// All below functions are to be defined by adapter specific modules: // All below functions are to be defined by adapter specific modules:
@@ -153,6 +154,8 @@ public:
setAPN(char* apn, int len); setAPN(char* apn, int len);
virtual enum loc_api_adapter_err virtual enum loc_api_adapter_err
injectPosition(double latitude, double longitude, float accuracy); injectPosition(double latitude, double longitude, float accuracy);
virtual enum loc_api_adapter_err
injectPosition(const Location& location);
virtual enum loc_api_adapter_err virtual enum loc_api_adapter_err
setTime(LocGpsUtcTime time, int64_t timeReference, int uncertainty); setTime(LocGpsUtcTime time, int64_t timeReference, int uncertainty);
virtual enum loc_api_adapter_err virtual enum loc_api_adapter_err

View File

@@ -33,7 +33,7 @@
#include <unistd.h> #include <unistd.h>
#include <LocDualContext.h> #include <LocDualContext.h>
#include <msg_q.h> #include <msg_q.h>
#include <platform_lib_log_util.h> #include <log_util.h>
#include <loc_log.h> #include <loc_log.h>
namespace loc_core { namespace loc_core {

View File

@@ -1,8 +1,11 @@
ACLOCAL_AMFLAGS = -I m4
AM_CFLAGS = -I./ \ AM_CFLAGS = -I./ \
-I../utils \
-I../location \
$(LOCPLA_CFLAGS) \ $(LOCPLA_CFLAGS) \
$(GPSUTILS_CFLAGS) \ $(GPSUTILS_CFLAGS) \
-I./data-items/ \
-I./data-items/common \
-I./observer \
-I$(WORKSPACE)/gps-noship/flp \ -I$(WORKSPACE)/gps-noship/flp \
-D__func__=__PRETTY_FUNCTION__ \ -D__func__=__PRETTY_FUNCTION__ \
-fno-short-enums \ -fno-short-enums \
@@ -19,6 +22,7 @@ libloc_core_la_h_sources = \
LocAdapterProxyBase.h \ LocAdapterProxyBase.h \
data-items/DataItemId.h \ data-items/DataItemId.h \
data-items/IDataItemCore.h \ data-items/IDataItemCore.h \
data-items/DataItemConcreteTypesBase.h \
observer/IDataItemObserver.h \ observer/IDataItemObserver.h \
observer/IDataItemSubscription.h \ observer/IDataItemSubscription.h \
observer/IFrameworkActionReq.h \ observer/IFrameworkActionReq.h \
@@ -33,13 +37,10 @@ libloc_core_la_c_sources = \
LocDualContext.cpp \ LocDualContext.cpp \
loc_core_log.cpp \ loc_core_log.cpp \
data-items/DataItemsFactoryProxy.cpp \ data-items/DataItemsFactoryProxy.cpp \
data-items/common/ClientIndex.cpp \
data-items/common/DataItemIndex.cpp \
data-items/common/IndexFactory.cpp \
SystemStatusOsObserver.cpp \ SystemStatusOsObserver.cpp \
SystemStatus.cpp SystemStatus.cpp
library_includedir = $(pkgincludedir)/core library_includedir = $(pkgincludedir)
library_include_HEADERS = $(libloc_core_la_h_sources) library_include_HEADERS = $(libloc_core_la_h_sources)
@@ -55,7 +56,11 @@ libloc_core_la_LDFLAGS = -Wl,-z,defs -lpthread -shared -version-info 1:0:0
libloc_core_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) libloc_core_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS)
endif endif
libloc_core_la_LIBADD = -lstdc++ -ldl $(LOCPLA_LIBS) $(GPSUTILS_LIBS) libloc_core_la_LIBADD = -ldl $(GPSUTILS_LIBS)
#Create and Install libraries #Create and Install libraries
lib_LTLIBRARIES = libloc_core.la lib_LTLIBRARIES = libloc_core.la
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = loc-core.pc
EXTRA_DIST = $(pkgconfig_DATA)

View File

@@ -34,12 +34,13 @@
#include <string.h> #include <string.h>
#include <sys/time.h> #include <sys/time.h>
#include <pthread.h> #include <pthread.h>
#include <platform_lib_log_util.h> #include <loc_pla.h>
#include <MsgTask.h> #include <log_util.h>
#include <loc_nmea.h> #include <loc_nmea.h>
#include <DataItemsFactoryProxy.h> #include <DataItemsFactoryProxy.h>
#include <SystemStatus.h> #include <SystemStatus.h>
#include <SystemStatusOsObserver.h> #include <SystemStatusOsObserver.h>
#include <DataItemConcreteTypesBase.h>
namespace loc_core namespace loc_core
{ {
@@ -119,6 +120,12 @@ public:
double mAgcGal; // x16 double mAgcGal; // x16
int32_t mLeapSeconds;// x17 int32_t mLeapSeconds;// x17
int32_t mLeapSecUnc; // x18 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 // parser
@@ -150,8 +157,15 @@ private:
eAgcGlo = 20, eAgcGlo = 20,
eAgcBds = 21, eAgcBds = 21,
eAgcGal = 22, eAgcGal = 22,
eMax0 = eAgcGal,
eLeapSeconds = 23, eLeapSeconds = 23,
eLeapSecUnc = 24, eLeapSecUnc = 24,
eGloBpAmpI = 25,
eGloBpAmpQ = 26,
eBdsBpAmpI = 27,
eBdsBpAmpQ = 28,
eGalBpAmpI = 29,
eGalBpAmpQ = 30,
eMax eMax
}; };
SystemStatusPQWM1 mM1; SystemStatusPQWM1 mM1;
@@ -181,12 +195,18 @@ public:
inline uint32_t getRecErrorRecovery() { return mM1.mRecErrorRecovery; } inline uint32_t getRecErrorRecovery() { return mM1.mRecErrorRecovery; }
inline int32_t getLeapSeconds(){ return mM1.mLeapSeconds; } inline int32_t getLeapSeconds(){ return mM1.mLeapSeconds; }
inline int32_t getLeapSecUnc() { return mM1.mLeapSecUnc; } 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) SystemStatusPQWM1parser(const char *str_in, uint32_t len_in)
: SystemStatusNmeaBase(str_in, len_in) : SystemStatusNmeaBase(str_in, len_in)
{ {
memset(&mM1, 0, sizeof(mM1)); memset(&mM1, 0, sizeof(mM1));
if (mField.size() < eMax) { if (mField.size() <= eMax0) {
LOC_LOGE("PQWM1parser - invalid size=%zu", mField.size()); LOC_LOGE("PQWM1parser - invalid size=%zu", mField.size());
mM1.mTimeValid = 0; mM1.mTimeValid = 0;
return; return;
@@ -213,8 +233,18 @@ public:
mM1.mAgcGlo = atof(mField[eAgcGlo].c_str()); mM1.mAgcGlo = atof(mField[eAgcGlo].c_str());
mM1.mAgcBds = atof(mField[eAgcBds].c_str()); mM1.mAgcBds = atof(mField[eAgcBds].c_str());
mM1.mAgcGal = atof(mField[eAgcGal].c_str()); mM1.mAgcGal = atof(mField[eAgcGal].c_str());
mM1.mLeapSeconds = atoi(mField[eLeapSeconds].c_str()); if (mField.size() > eLeapSecUnc) {
mM1.mLeapSecUnc = atoi(mField[eLeapSecUnc].c_str()); 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 inline SystemStatusPQWM1& get() { return mM1;} //getparser
@@ -689,7 +719,7 @@ SystemStatusTimeAndClock::SystemStatusTimeAndClock(const SystemStatusPQWM1& nmea
{ {
} }
bool SystemStatusTimeAndClock::equals(SystemStatusTimeAndClock& peer) bool SystemStatusTimeAndClock::equals(const SystemStatusTimeAndClock& peer)
{ {
if ((mGpsWeek != peer.mGpsWeek) || if ((mGpsWeek != peer.mGpsWeek) ||
(mGpsTowMs != peer.mGpsTowMs) || (mGpsTowMs != peer.mGpsTowMs) ||
@@ -729,7 +759,7 @@ SystemStatusXoState::SystemStatusXoState(const SystemStatusPQWM1& nmea) :
{ {
} }
bool SystemStatusXoState::equals(SystemStatusXoState& peer) bool SystemStatusXoState::equals(const SystemStatusXoState& peer)
{ {
if (mXoState != peer.mXoState) { if (mXoState != peer.mXoState) {
return false; return false;
@@ -761,11 +791,17 @@ SystemStatusRfAndParams::SystemStatusRfAndParams(const SystemStatusPQWM1& nmea)
mAgcGps(nmea.mAgcGps), mAgcGps(nmea.mAgcGps),
mAgcGlo(nmea.mAgcGlo), mAgcGlo(nmea.mAgcGlo),
mAgcBds(nmea.mAgcBds), mAgcBds(nmea.mAgcBds),
mAgcGal(nmea.mAgcGal) mAgcGal(nmea.mAgcGal),
mGloBpAmpI(nmea.mGloBpAmpI),
mGloBpAmpQ(nmea.mGloBpAmpQ),
mBdsBpAmpI(nmea.mBdsBpAmpI),
mBdsBpAmpQ(nmea.mBdsBpAmpQ),
mGalBpAmpI(nmea.mGalBpAmpI),
mGalBpAmpQ(nmea.mGalBpAmpQ)
{ {
} }
bool SystemStatusRfAndParams::equals(SystemStatusRfAndParams& peer) bool SystemStatusRfAndParams::equals(const SystemStatusRfAndParams& peer)
{ {
if ((mPgaGain != peer.mPgaGain) || if ((mPgaGain != peer.mPgaGain) ||
(mGpsBpAmpI != peer.mGpsBpAmpI) || (mGpsBpAmpI != peer.mGpsBpAmpI) ||
@@ -779,7 +815,13 @@ bool SystemStatusRfAndParams::equals(SystemStatusRfAndParams& peer)
(mAgcGps != peer.mAgcGps) || (mAgcGps != peer.mAgcGps) ||
(mAgcGlo != peer.mAgcGlo) || (mAgcGlo != peer.mAgcGlo) ||
(mAgcBds != peer.mAgcBds) || (mAgcBds != peer.mAgcBds) ||
(mAgcGal != peer.mAgcGal)) { (mAgcGal != peer.mAgcGal) ||
(mGloBpAmpI != peer.mGloBpAmpI) ||
(mGloBpAmpQ != peer.mGloBpAmpQ) ||
(mBdsBpAmpI != peer.mBdsBpAmpI) ||
(mBdsBpAmpQ != peer.mBdsBpAmpQ) ||
(mGalBpAmpI != peer.mGalBpAmpI) ||
(mGalBpAmpQ != peer.mGalBpAmpQ)) {
return false; return false;
} }
return true; return true;
@@ -815,7 +857,7 @@ SystemStatusErrRecovery::SystemStatusErrRecovery(const SystemStatusPQWM1& nmea)
{ {
} }
bool SystemStatusErrRecovery::equals(SystemStatusErrRecovery& peer) bool SystemStatusErrRecovery::equals(const SystemStatusErrRecovery& peer)
{ {
if (mRecErrorRecovery != peer.mRecErrorRecovery) { if (mRecErrorRecovery != peer.mRecErrorRecovery) {
return false; return false;
@@ -845,7 +887,7 @@ SystemStatusInjectedPosition::SystemStatusInjectedPosition(const SystemStatusPQW
{ {
} }
bool SystemStatusInjectedPosition::equals(SystemStatusInjectedPosition& peer) bool SystemStatusInjectedPosition::equals(const SystemStatusInjectedPosition& peer)
{ {
if ((mEpiValidity != peer.mEpiValidity) || if ((mEpiValidity != peer.mEpiValidity) ||
(mEpiLat != peer.mEpiLat) || (mEpiLat != peer.mEpiLat) ||
@@ -886,7 +928,7 @@ SystemStatusBestPosition::SystemStatusBestPosition(const SystemStatusPQWP2& nmea
{ {
} }
bool SystemStatusBestPosition::equals(SystemStatusBestPosition& peer) bool SystemStatusBestPosition::equals(const SystemStatusBestPosition& peer)
{ {
if ((mBestLat != peer.mBestLat) || if ((mBestLat != peer.mBestLat) ||
(mBestLon != peer.mBestLon) || (mBestLon != peer.mBestLon) ||
@@ -928,7 +970,7 @@ SystemStatusXtra::SystemStatusXtra(const SystemStatusPQWP3& nmea) :
{ {
} }
bool SystemStatusXtra::equals(SystemStatusXtra& peer) bool SystemStatusXtra::equals(const SystemStatusXtra& peer)
{ {
if ((mXtraValidMask != peer.mXtraValidMask) || if ((mXtraValidMask != peer.mXtraValidMask) ||
(mGpsXtraAge != peer.mGpsXtraAge) || (mGpsXtraAge != peer.mGpsXtraAge) ||
@@ -976,7 +1018,7 @@ SystemStatusEphemeris::SystemStatusEphemeris(const SystemStatusPQWP4& nmea) :
{ {
} }
bool SystemStatusEphemeris::equals(SystemStatusEphemeris& peer) bool SystemStatusEphemeris::equals(const SystemStatusEphemeris& peer)
{ {
if ((mGpsEpheValid != peer.mGpsEpheValid) || if ((mGpsEpheValid != peer.mGpsEpheValid) ||
(mGloEpheValid != peer.mGloEpheValid) || (mGloEpheValid != peer.mGloEpheValid) ||
@@ -1022,7 +1064,7 @@ SystemStatusSvHealth::SystemStatusSvHealth(const SystemStatusPQWP5& nmea) :
{ {
} }
bool SystemStatusSvHealth::equals(SystemStatusSvHealth& peer) bool SystemStatusSvHealth::equals(const SystemStatusSvHealth& peer)
{ {
if ((mGpsUnknownMask != peer.mGpsUnknownMask) || if ((mGpsUnknownMask != peer.mGpsUnknownMask) ||
(mGloUnknownMask != peer.mGloUnknownMask) || (mGloUnknownMask != peer.mGloUnknownMask) ||
@@ -1077,7 +1119,7 @@ SystemStatusPdr::SystemStatusPdr(const SystemStatusPQWP6& nmea) :
{ {
} }
bool SystemStatusPdr::equals(SystemStatusPdr& peer) bool SystemStatusPdr::equals(const SystemStatusPdr& peer)
{ {
if (mFixInfoMask != peer.mFixInfoMask) { if (mFixInfoMask != peer.mFixInfoMask) {
return false; return false;
@@ -1103,7 +1145,7 @@ SystemStatusNavData::SystemStatusNavData(const SystemStatusPQWP7& nmea)
} }
} }
bool SystemStatusNavData::equals(SystemStatusNavData& peer) bool SystemStatusNavData::equals(const SystemStatusNavData& peer)
{ {
for (uint32_t i=0; i<SV_ALL_NUM; i++) { for (uint32_t i=0; i<SV_ALL_NUM; i++) {
if ((mNav[i].mType != peer.mNav[i].mType) || if ((mNav[i].mType != peer.mNav[i].mType) ||
@@ -1135,7 +1177,7 @@ SystemStatusPositionFailure::SystemStatusPositionFailure(const SystemStatusPQWS1
{ {
} }
bool SystemStatusPositionFailure::equals(SystemStatusPositionFailure& peer) bool SystemStatusPositionFailure::equals(const SystemStatusPositionFailure& peer)
{ {
if ((mFixInfoMask != peer.mFixInfoMask) || if ((mFixInfoMask != peer.mFixInfoMask) ||
(mHepeLimit != peer.mHepeLimit)) { (mHepeLimit != peer.mHepeLimit)) {
@@ -1156,7 +1198,7 @@ void SystemStatusPositionFailure::dump()
/****************************************************************************** /******************************************************************************
SystemStatusLocation SystemStatusLocation
******************************************************************************/ ******************************************************************************/
bool SystemStatusLocation::equals(SystemStatusLocation& peer) bool SystemStatusLocation::equals(const SystemStatusLocation& peer)
{ {
if ((mLocation.gpsLocation.latitude != peer.mLocation.gpsLocation.latitude) || if ((mLocation.gpsLocation.latitude != peer.mLocation.gpsLocation.latitude) ||
(mLocation.gpsLocation.longitude != peer.mLocation.gpsLocation.longitude) || (mLocation.gpsLocation.longitude != peer.mLocation.gpsLocation.longitude) ||
@@ -1213,8 +1255,7 @@ IOsObserver* SystemStatus::getOsObserver()
} }
SystemStatus::SystemStatus(const MsgTask* msgTask) : SystemStatus::SystemStatus(const MsgTask* msgTask) :
mSysStatusObsvr(msgTask), mSysStatusObsvr(this, msgTask)
mConnected(false)
{ {
int result = 0; int result = 0;
ENTRY_LOG (); ENTRY_LOG ();
@@ -1235,230 +1276,81 @@ SystemStatus::SystemStatus(const MsgTask* msgTask) :
mCache.mPositionFailure.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); EXIT_LOG_WITH_ERROR ("%d",result);
} }
/******************************************************************************
SystemStatus - M1 functions
******************************************************************************/
bool SystemStatus::setTimeAndCLock(const SystemStatusPQWM1& nmea)
{
SystemStatusTimeAndClock s(nmea);
if (!mCache.mTimeAndClock.empty() && mCache.mTimeAndClock.back().equals(s)) {
mCache.mTimeAndClock.back().mUtcReported = s.mUtcReported;
} else {
mCache.mTimeAndClock.push_back(s);
if (mCache.mTimeAndClock.size() > maxTimeAndClock) {
mCache.mTimeAndClock.erase(mCache.mTimeAndClock.begin());
}
}
return true;
}
bool SystemStatus::setXoState(const SystemStatusPQWM1& nmea)
{
SystemStatusXoState s(nmea);
if (!mCache.mXoState.empty() && mCache.mXoState.back().equals(s)) {
mCache.mXoState.back().mUtcReported = s.mUtcReported;
} else {
mCache.mXoState.push_back(s);
if (mCache.mXoState.size() > maxXoState) {
mCache.mXoState.erase(mCache.mXoState.begin());
}
}
return true;
}
bool SystemStatus::setRfAndParams(const SystemStatusPQWM1& nmea)
{
SystemStatusRfAndParams s(nmea);
if (!mCache.mRfAndParams.empty() && mCache.mRfAndParams.back().equals(s)) {
mCache.mRfAndParams.back().mUtcReported = s.mUtcReported;
} else {
mCache.mRfAndParams.push_back(s);
if (mCache.mRfAndParams.size() > maxRfAndParams) {
mCache.mRfAndParams.erase(mCache.mRfAndParams.begin());
}
}
return true;
}
bool SystemStatus::setErrRecovery(const SystemStatusPQWM1& nmea)
{
SystemStatusErrRecovery s(nmea);
if (!mCache.mErrRecovery.empty() && mCache.mErrRecovery.back().equals(s)) {
mCache.mErrRecovery.back().mUtcReported = s.mUtcReported;
} else {
mCache.mErrRecovery.push_back(s);
if (mCache.mErrRecovery.size() > maxErrRecovery) {
mCache.mErrRecovery.erase(mCache.mErrRecovery.begin());
}
}
return true;
}
/******************************************************************************
SystemStatus - Px functions
******************************************************************************/
bool SystemStatus::setInjectedPosition(const SystemStatusPQWP1& nmea)
{
SystemStatusInjectedPosition s(nmea);
if (!mCache.mInjectedPosition.empty() && mCache.mInjectedPosition.back().equals(s)) {
mCache.mInjectedPosition.back().mUtcReported = s.mUtcReported;
} else {
mCache.mInjectedPosition.push_back(s);
if (mCache.mInjectedPosition.size() > maxInjectedPosition) {
mCache.mInjectedPosition.erase(mCache.mInjectedPosition.begin());
}
}
return true;
}
bool SystemStatus::setBestPosition(const SystemStatusPQWP2& nmea)
{
SystemStatusBestPosition s(nmea);
if (!mCache.mBestPosition.empty() && mCache.mBestPosition.back().equals(s)) {
mCache.mBestPosition.back().mUtcReported = s.mUtcReported;
} else {
mCache.mBestPosition.push_back(s);
if (mCache.mBestPosition.size() > maxBestPosition) {
mCache.mBestPosition.erase(mCache.mBestPosition.begin());
}
}
return true;
}
bool SystemStatus::setXtra(const SystemStatusPQWP3& nmea)
{
SystemStatusXtra s(nmea);
if (!mCache.mXtra.empty() && mCache.mXtra.back().equals(s)) {
mCache.mXtra.back().mUtcReported = s.mUtcReported;
} else {
mCache.mXtra.push_back(s);
if (mCache.mXtra.size() > maxXtra) {
mCache.mXtra.erase(mCache.mXtra.begin());
}
}
return true;
}
bool SystemStatus::setEphemeris(const SystemStatusPQWP4& nmea)
{
SystemStatusEphemeris s(nmea);
if (!mCache.mEphemeris.empty() && mCache.mEphemeris.back().equals(s)) {
mCache.mEphemeris.back().mUtcReported = s.mUtcReported;
} else {
mCache.mEphemeris.push_back(s);
if (mCache.mEphemeris.size() > maxEphemeris) {
mCache.mEphemeris.erase(mCache.mEphemeris.begin());
}
}
return true;
}
bool SystemStatus::setSvHealth(const SystemStatusPQWP5& nmea)
{
SystemStatusSvHealth s(nmea);
if (!mCache.mSvHealth.empty() && mCache.mSvHealth.back().equals(s)) {
mCache.mSvHealth.back().mUtcReported = s.mUtcReported;
} else {
mCache.mSvHealth.push_back(s);
if (mCache.mSvHealth.size() > maxSvHealth) {
mCache.mSvHealth.erase(mCache.mSvHealth.begin());
}
}
return true;
}
bool SystemStatus::setPdr(const SystemStatusPQWP6& nmea)
{
SystemStatusPdr s(nmea);
if (!mCache.mPdr.empty() && mCache.mPdr.back().equals(s)) {
mCache.mPdr.back().mUtcReported = s.mUtcReported;
} else {
mCache.mPdr.push_back(s);
if (mCache.mPdr.size() > maxPdr) {
mCache.mPdr.erase(mCache.mPdr.begin());
}
}
return true;
}
bool SystemStatus::setNavData(const SystemStatusPQWP7& nmea)
{
SystemStatusNavData s(nmea);
if (!mCache.mNavData.empty() && mCache.mNavData.back().equals(s)) {
mCache.mNavData.back().mUtcReported = s.mUtcReported;
} else {
mCache.mNavData.push_back(s);
if (mCache.mNavData.size() > maxNavData) {
mCache.mNavData.erase(mCache.mNavData.begin());
}
}
return true;
}
/******************************************************************************
SystemStatus - Sx functions
******************************************************************************/
bool SystemStatus::setPositionFailure(const SystemStatusPQWS1& nmea)
{
SystemStatusPositionFailure s(nmea);
if (!mCache.mPositionFailure.empty() && mCache.mPositionFailure.back().equals(s)) {
mCache.mPositionFailure.back().mUtcReported = s.mUtcReported;
} else {
mCache.mPositionFailure.push_back(s);
if (mCache.mPositionFailure.size() > maxPositionFailure) {
mCache.mPositionFailure.erase(mCache.mPositionFailure.begin());
}
}
return true;
}
/****************************************************************************** /******************************************************************************
SystemStatus - storing dataitems SystemStatus - storing dataitems
******************************************************************************/ ******************************************************************************/
bool SystemStatus::setNetworkInfo(IDataItemCore* dataitem) template <typename TYPE_REPORT, typename TYPE_ITEM>
bool SystemStatus::setIteminReport(TYPE_REPORT& report, TYPE_ITEM&& s)
{ {
SystemStatusNetworkInfo* data = reinterpret_cast<SystemStatusNetworkInfo*>(dataitem); if (!report.empty() && report.back().equals(static_cast<TYPE_ITEM&>(s.collate(report.back())))) {
SystemStatusNetworkInfo s(data->mType,data->mTypeName,data->mSubTypeName, // there is no change - just update reported timestamp
data->mAvailable,data->mConnected,data->mRoaming); report.back().mUtcReported = s.mUtcReported;
s.dump(); return false;
mConnected = data->mConnected; }
if (!mCache.mNetworkInfo.empty() && mCache.mNetworkInfo.back().equals(s)) { // first event or updated
mCache.mNetworkInfo.back().mUtcReported = s.mUtcReported; report.push_back(s);
} else { if (report.size() > s.maxItem) {
mCache.mNetworkInfo.push_back(s); report.erase(report.begin());
if (mCache.mNetworkInfo.size() > maxNetworkInfo) {
mCache.mNetworkInfo.erase(mCache.mNetworkInfo.begin());
}
} }
return true; 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 @brief API to set report data into internal buffer
@param[In] data pointer to the NMEA string @param[In] data pointer to the NMEA string
@param[In] len length of the NMEA string @param[In] len length of the NMEA string
@return true when successfully done @return true when the NMEA is consumed by the method.
******************************************************************************/ ******************************************************************************/
static uint32_t cnt = 0;
static uint32_t cnt_m1 = 0;
static uint32_t cnt_p1 = 0;
static uint32_t cnt_p2 = 0;
static uint32_t cnt_p3 = 0;
static uint32_t cnt_p4 = 0;
static uint32_t cnt_p5 = 0;
static uint32_t cnt_p6 = 0;
static uint32_t cnt_p7 = 0;
static uint32_t cnt_s1 = 0;
bool SystemStatus::setNmeaString(const char *data, uint32_t len) bool SystemStatus::setNmeaString(const char *data, uint32_t len)
{ {
bool ret = false;
if (!loc_nmea_is_debug(data, len)) { if (!loc_nmea_is_debug(data, len)) {
return false; return false;
} }
@@ -1469,64 +1361,51 @@ bool SystemStatus::setNmeaString(const char *data, uint32_t len)
pthread_mutex_lock(&mMutexSystemStatus); pthread_mutex_lock(&mMutexSystemStatus);
// parse the received nmea strings here // parse the received nmea strings here
if (0 == strncmp(data, "$PQWM1", SystemStatusNmeaBase::NMEA_MINSIZE)) { if (0 == strncmp(data, "$PQWM1", SystemStatusNmeaBase::NMEA_MINSIZE)) {
SystemStatusPQWM1 s = SystemStatusPQWM1parser(buf, len).get(); SystemStatusPQWM1 s = SystemStatusPQWM1parser(buf, len).get();
ret = setTimeAndCLock(s); setIteminReport(mCache.mTimeAndClock, SystemStatusTimeAndClock(s));
ret |= setXoState(s); setIteminReport(mCache.mXoState, SystemStatusXoState(s));
ret |= setRfAndParams(s); setIteminReport(mCache.mRfAndParams, SystemStatusRfAndParams(s));
ret |= setErrRecovery(s); setIteminReport(mCache.mErrRecovery, SystemStatusErrRecovery(s));
cnt_m1++;
} }
else if (0 == strncmp(data, "$PQWP1", SystemStatusNmeaBase::NMEA_MINSIZE)) { else if (0 == strncmp(data, "$PQWP1", SystemStatusNmeaBase::NMEA_MINSIZE)) {
ret = setInjectedPosition(SystemStatusPQWP1parser(buf, len).get()); setIteminReport(mCache.mInjectedPosition,
cnt_p1++; SystemStatusInjectedPosition(SystemStatusPQWP1parser(buf, len).get()));
} }
else if (0 == strncmp(data, "$PQWP2", SystemStatusNmeaBase::NMEA_MINSIZE)) { else if (0 == strncmp(data, "$PQWP2", SystemStatusNmeaBase::NMEA_MINSIZE)) {
ret = setBestPosition(SystemStatusPQWP2parser(buf, len).get()); setIteminReport(mCache.mBestPosition,
cnt_p2++; SystemStatusBestPosition(SystemStatusPQWP2parser(buf, len).get()));
} }
else if (0 == strncmp(data, "$PQWP3", SystemStatusNmeaBase::NMEA_MINSIZE)) { else if (0 == strncmp(data, "$PQWP3", SystemStatusNmeaBase::NMEA_MINSIZE)) {
ret = setXtra(SystemStatusPQWP3parser(buf, len).get()); setIteminReport(mCache.mXtra,
cnt_p3++; SystemStatusXtra(SystemStatusPQWP3parser(buf, len).get()));
} }
else if (0 == strncmp(data, "$PQWP4", SystemStatusNmeaBase::NMEA_MINSIZE)) { else if (0 == strncmp(data, "$PQWP4", SystemStatusNmeaBase::NMEA_MINSIZE)) {
ret = setEphemeris(SystemStatusPQWP4parser(buf, len).get()); setIteminReport(mCache.mEphemeris,
cnt_p4++; SystemStatusEphemeris(SystemStatusPQWP4parser(buf, len).get()));
} }
else if (0 == strncmp(data, "$PQWP5", SystemStatusNmeaBase::NMEA_MINSIZE)) { else if (0 == strncmp(data, "$PQWP5", SystemStatusNmeaBase::NMEA_MINSIZE)) {
ret = setSvHealth(SystemStatusPQWP5parser(buf, len).get()); setIteminReport(mCache.mSvHealth,
cnt_p5++; SystemStatusSvHealth(SystemStatusPQWP5parser(buf, len).get()));
} }
else if (0 == strncmp(data, "$PQWP6", SystemStatusNmeaBase::NMEA_MINSIZE)) { else if (0 == strncmp(data, "$PQWP6", SystemStatusNmeaBase::NMEA_MINSIZE)) {
ret = setPdr(SystemStatusPQWP6parser(buf, len).get()); setIteminReport(mCache.mPdr,
cnt_p6++; SystemStatusPdr(SystemStatusPQWP6parser(buf, len).get()));
} }
else if (0 == strncmp(data, "$PQWP7", SystemStatusNmeaBase::NMEA_MINSIZE)) { else if (0 == strncmp(data, "$PQWP7", SystemStatusNmeaBase::NMEA_MINSIZE)) {
ret = setNavData(SystemStatusPQWP7parser(buf, len).get()); setIteminReport(mCache.mNavData,
cnt_p7++; SystemStatusNavData(SystemStatusPQWP7parser(buf, len).get()));
} }
else if (0 == strncmp(data, "$PQWS1", SystemStatusNmeaBase::NMEA_MINSIZE)) { else if (0 == strncmp(data, "$PQWS1", SystemStatusNmeaBase::NMEA_MINSIZE)) {
ret = setPositionFailure(SystemStatusPQWS1parser(buf, len).get()); setIteminReport(mCache.mPositionFailure,
cnt_s1++; SystemStatusPositionFailure(SystemStatusPQWS1parser(buf, len).get()));
} }
else { else {
// do nothing // do nothing
} }
cnt++;
LOC_LOGV("setNmeaString: cnt=%d M:%d 1:%d 2:%d 3:%d 4:%d 5:%d 6:%d 7:%d S:%d",
cnt,
cnt_m1,
cnt_p1,
cnt_p2,
cnt_p3,
cnt_p4,
cnt_p5,
cnt_p6,
cnt_p7,
cnt_s1);
pthread_mutex_unlock(&mMutexSystemStatus); pthread_mutex_unlock(&mMutexSystemStatus);
return ret; return true;
} }
/****************************************************************************** /******************************************************************************
@@ -1539,22 +1418,18 @@ bool SystemStatus::setNmeaString(const char *data, uint32_t len)
bool SystemStatus::eventPosition(const UlpLocation& location, bool SystemStatus::eventPosition(const UlpLocation& location,
const GpsLocationExtended& locationEx) const GpsLocationExtended& locationEx)
{ {
SystemStatusLocation s(location, locationEx); bool ret = false;
if (!mCache.mLocation.empty() && mCache.mLocation.back().equals(s)) { pthread_mutex_lock(&mMutexSystemStatus);
mCache.mLocation.back().mUtcReported = s.mUtcReported;
} ret = setIteminReport(mCache.mLocation, SystemStatusLocation(location, locationEx));
else {
mCache.mLocation.push_back(s);
if (mCache.mLocation.size() > maxLocation) {
mCache.mLocation.erase(mCache.mLocation.begin());
}
}
LOC_LOGV("eventPosition - lat=%f lon=%f alt=%f speed=%f", LOC_LOGV("eventPosition - lat=%f lon=%f alt=%f speed=%f",
s.mLocation.gpsLocation.latitude, location.gpsLocation.latitude,
s.mLocation.gpsLocation.longitude, location.gpsLocation.longitude,
s.mLocation.gpsLocation.altitude, location.gpsLocation.altitude,
s.mLocation.gpsLocation.speed); location.gpsLocation.speed);
return true;
pthread_mutex_unlock(&mMutexSystemStatus);
return ret;
} }
/****************************************************************************** /******************************************************************************
@@ -1562,19 +1437,107 @@ bool SystemStatus::eventPosition(const UlpLocation& location,
@param[In] DataItem @param[In] DataItem
@return true when successfully done @return true when info is updatated
******************************************************************************/ ******************************************************************************/
bool SystemStatus::eventDataItemNotify(IDataItemCore* dataitem) bool SystemStatus::eventDataItemNotify(IDataItemCore* dataitem)
{ {
bool ret = false;
pthread_mutex_lock(&mMutexSystemStatus); pthread_mutex_lock(&mMutexSystemStatus);
switch(dataitem->getId()) 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: case NETWORKINFO_DATA_ITEM_ID:
setNetworkInfo(dataitem); 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; break;
} }
pthread_mutex_unlock(&mMutexSystemStatus); pthread_mutex_unlock(&mMutexSystemStatus);
return true; return ret;
} }
/****************************************************************************** /******************************************************************************
@@ -1591,74 +1554,45 @@ bool SystemStatus::getReport(SystemStatusReports& report, bool isLatestOnly) con
if (isLatestOnly) { if (isLatestOnly) {
// push back only the latest report and return it // push back only the latest report and return it
report.mLocation.clear(); getIteminReport(report.mLocation, mCache.mLocation);
if (mCache.mLocation.size() >= 1) {
report.mLocation.push_back(mCache.mLocation.back());
report.mLocation.back().dump();
}
report.mTimeAndClock.clear(); getIteminReport(report.mTimeAndClock, mCache.mTimeAndClock);
if (mCache.mTimeAndClock.size() >= 1) { getIteminReport(report.mXoState, mCache.mXoState);
report.mTimeAndClock.push_back(mCache.mTimeAndClock.back()); getIteminReport(report.mRfAndParams, mCache.mRfAndParams);
report.mTimeAndClock.back().dump(); getIteminReport(report.mErrRecovery, mCache.mErrRecovery);
}
report.mXoState.clear();
if (mCache.mXoState.size() >= 1) {
report.mXoState.push_back(mCache.mXoState.back());
report.mXoState.back().dump();
}
report.mRfAndParams.clear();
if (mCache.mRfAndParams.size() >= 1) {
report.mRfAndParams.push_back(mCache.mRfAndParams.back());
report.mRfAndParams.back().dump();
}
report.mErrRecovery.clear();
if (mCache.mErrRecovery.size() >= 1) {
report.mErrRecovery.push_back(mCache.mErrRecovery.back());
report.mErrRecovery.back().dump();
}
report.mInjectedPosition.clear(); getIteminReport(report.mInjectedPosition, mCache.mInjectedPosition);
if (mCache.mInjectedPosition.size() >= 1) { getIteminReport(report.mBestPosition, mCache.mBestPosition);
report.mInjectedPosition.push_back(mCache.mInjectedPosition.back()); getIteminReport(report.mXtra, mCache.mXtra);
report.mInjectedPosition.back().dump(); getIteminReport(report.mEphemeris, mCache.mEphemeris);
} getIteminReport(report.mSvHealth, mCache.mSvHealth);
report.mBestPosition.clear(); getIteminReport(report.mPdr, mCache.mPdr);
if (mCache.mBestPosition.size() >= 1) { getIteminReport(report.mNavData, mCache.mNavData);
report.mBestPosition.push_back(mCache.mBestPosition.back());
report.mBestPosition.back().dump();
}
report.mXtra.clear();
if (mCache.mXtra.size() >= 1) {
report.mXtra.push_back(mCache.mXtra.back());
report.mXtra.back().dump();
}
report.mEphemeris.clear();
if (mCache.mEphemeris.size() >= 1) {
report.mEphemeris.push_back(mCache.mEphemeris.back());
report.mEphemeris.back().dump();
}
report.mSvHealth.clear();
if (mCache.mSvHealth.size() >= 1) {
report.mSvHealth.push_back(mCache.mSvHealth.back());
report.mSvHealth.back().dump();
}
report.mPdr.clear();
if (mCache.mPdr.size() >= 1) {
report.mPdr.push_back(mCache.mPdr.back());
report.mPdr.back().dump();
}
report.mNavData.clear();
if (mCache.mNavData.size() >= 1) {
report.mNavData.push_back(mCache.mNavData.back());
report.mNavData.back().dump();
}
report.mPositionFailure.clear(); getIteminReport(report.mPositionFailure, mCache.mPositionFailure);
if (mCache.mPositionFailure.size() >= 1) {
report.mPositionFailure.push_back(mCache.mPositionFailure.back()); getIteminReport(report.mAirplaneMode, mCache.mAirplaneMode);
report.mPositionFailure.back().dump(); 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 { else {
// copy entire reports and return them // copy entire reports and return them
@@ -1678,6 +1612,30 @@ bool SystemStatus::getReport(SystemStatusReports& report, bool isLatestOnly) con
report.mNavData.clear(); report.mNavData.clear();
report.mPositionFailure.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; report = mCache;
} }
@@ -1692,65 +1650,26 @@ bool SystemStatus::getReport(SystemStatusReports& report, bool isLatestOnly) con
@return true when successfully done @return true when successfully done
******************************************************************************/ ******************************************************************************/
bool SystemStatus::setDefaultReport(void) bool SystemStatus::setDefaultGnssEngineStates(void)
{ {
pthread_mutex_lock(&mMutexSystemStatus); pthread_mutex_lock(&mMutexSystemStatus);
mCache.mLocation.push_back(SystemStatusLocation()); setDefaultIteminReport(mCache.mLocation, SystemStatusLocation());
if (mCache.mLocation.size() > maxLocation) {
mCache.mLocation.erase(mCache.mLocation.begin());
}
mCache.mTimeAndClock.push_back(SystemStatusTimeAndClock()); setDefaultIteminReport(mCache.mTimeAndClock, SystemStatusTimeAndClock());
if (mCache.mTimeAndClock.size() > maxTimeAndClock) { setDefaultIteminReport(mCache.mXoState, SystemStatusXoState());
mCache.mTimeAndClock.erase(mCache.mTimeAndClock.begin()); setDefaultIteminReport(mCache.mRfAndParams, SystemStatusRfAndParams());
} setDefaultIteminReport(mCache.mErrRecovery, SystemStatusErrRecovery());
mCache.mXoState.push_back(SystemStatusXoState());
if (mCache.mXoState.size() > maxXoState) {
mCache.mXoState.erase(mCache.mXoState.begin());
}
mCache.mRfAndParams.push_back(SystemStatusRfAndParams());
if (mCache.mRfAndParams.size() > maxRfAndParams) {
mCache.mRfAndParams.erase(mCache.mRfAndParams.begin());
}
mCache.mErrRecovery.push_back(SystemStatusErrRecovery());
if (mCache.mErrRecovery.size() > maxErrRecovery) {
mCache.mErrRecovery.erase(mCache.mErrRecovery.begin());
}
mCache.mInjectedPosition.push_back(SystemStatusInjectedPosition()); setDefaultIteminReport(mCache.mInjectedPosition, SystemStatusInjectedPosition());
if (mCache.mInjectedPosition.size() > maxInjectedPosition) { setDefaultIteminReport(mCache.mBestPosition, SystemStatusBestPosition());
mCache.mInjectedPosition.erase(mCache.mInjectedPosition.begin()); setDefaultIteminReport(mCache.mXtra, SystemStatusXtra());
} setDefaultIteminReport(mCache.mEphemeris, SystemStatusEphemeris());
mCache.mBestPosition.push_back(SystemStatusBestPosition()); setDefaultIteminReport(mCache.mSvHealth, SystemStatusSvHealth());
if (mCache.mBestPosition.size() > maxBestPosition) { setDefaultIteminReport(mCache.mPdr, SystemStatusPdr());
mCache.mBestPosition.erase(mCache.mBestPosition.begin()); setDefaultIteminReport(mCache.mNavData, SystemStatusNavData());
}
mCache.mXtra.push_back(SystemStatusXtra());
if (mCache.mXtra.size() > maxXtra) {
mCache.mXtra.erase(mCache.mXtra.begin());
}
mCache.mEphemeris.push_back(SystemStatusEphemeris());
if (mCache.mEphemeris.size() > maxEphemeris) {
mCache.mEphemeris.erase(mCache.mEphemeris.begin());
}
mCache.mSvHealth.push_back(SystemStatusSvHealth());
if (mCache.mSvHealth.size() > maxSvHealth) {
mCache.mSvHealth.erase(mCache.mSvHealth.begin());
}
mCache.mPdr.push_back(SystemStatusPdr());
if (mCache.mPdr.size() > maxPdr) {
mCache.mPdr.erase(mCache.mPdr.begin());
}
mCache.mNavData.push_back(SystemStatusNavData());
if (mCache.mNavData.size() > maxNavData) {
mCache.mNavData.erase(mCache.mNavData.begin());
}
mCache.mPositionFailure.push_back(SystemStatusPositionFailure()); setDefaultIteminReport(mCache.mPositionFailure, SystemStatusPositionFailure());
if (mCache.mPositionFailure.size() > maxPositionFailure) {
mCache.mPositionFailure.erase(mCache.mPositionFailure.begin());
}
pthread_mutex_unlock(&mMutexSystemStatus); pthread_mutex_unlock(&mMutexSystemStatus);
return true; return true;
@@ -1763,24 +1682,12 @@ bool SystemStatus::setDefaultReport(void)
@return true when successfully done @return true when successfully done
******************************************************************************/ ******************************************************************************/
bool SystemStatus::eventConnectionStatus(bool connected, uint8_t type) bool SystemStatus::eventConnectionStatus(bool connected, int8_t type)
{ {
if (connected != mConnected) { // send networkinof dataitem to systemstatus observer clients
mConnected = connected; SystemStatusNetworkInfo s(type, "", "", connected);
mSysStatusObsvr.notify({&s});
// send networkinof dataitem to systemstatus observer clients
SystemStatusNetworkInfo s(type, "", "", false, connected, false);
IDataItemCore *networkinfo =
DataItemsFactoryProxy::createNewDataItem(NETWORKINFO_DATA_ITEM_ID);
if (nullptr == networkinfo) {
LOC_LOGE("Unable to create dataitemd");
return false;
}
networkinfo->copy(&s);
list<IDataItemCore*> dl(0);
dl.push_back(networkinfo);
mSysStatusObsvr.notify(dl);
}
return true; return true;
} }

View File

@@ -30,12 +30,14 @@
#define __SYSTEM_STATUS__ #define __SYSTEM_STATUS__
#include <stdint.h> #include <stdint.h>
#include <string> #include <sys/time.h>
#include <vector> #include <vector>
#include <platform_lib_log_util.h> #include <loc_pla.h>
#include <log_util.h>
#include <MsgTask.h> #include <MsgTask.h>
#include <IDataItemCore.h> #include <IDataItemCore.h>
#include <IOsObserver.h> #include <IOsObserver.h>
#include <DataItemConcreteTypesBase.h>
#include <SystemStatusOsObserver.h> #include <SystemStatusOsObserver.h>
#include <gps_extended_c.h> #include <gps_extended_c.h>
@@ -66,16 +68,20 @@ class SystemStatusItemBase
public: public:
timespec mUtcTime; // UTC timestamp when this info was last updated timespec mUtcTime; // UTC timestamp when this info was last updated
timespec mUtcReported; // UTC timestamp when this info was reported timespec mUtcReported; // UTC timestamp when this info was reported
static const uint32_t maxItem = 5;
SystemStatusItemBase() { SystemStatusItemBase() {
timeval tv; struct timespec tv;
gettimeofday(&tv, NULL); clock_gettime(CLOCK_MONOTONIC, &tv);
mUtcTime.tv_sec = tv.tv_sec; mUtcTime.tv_sec = tv.tv_sec;
mUtcTime.tv_nsec = tv.tv_usec *1000ULL; mUtcTime.tv_nsec = tv.tv_nsec;
mUtcReported = mUtcTime; mUtcReported = mUtcTime;
}; };
virtual ~SystemStatusItemBase() { }; virtual ~SystemStatusItemBase() {};
virtual void dump(void) { }; inline virtual SystemStatusItemBase& collate(SystemStatusItemBase&) {
return *this;
}
virtual void dump(void) {};
}; };
class SystemStatusLocation : public SystemStatusItemBase class SystemStatusLocation : public SystemStatusItemBase
@@ -90,8 +96,8 @@ public:
const GpsLocationExtended& locationEx) : const GpsLocationExtended& locationEx) :
mValid(true), mValid(true),
mLocation(location), mLocation(location),
mLocationEx(locationEx) { } mLocationEx(locationEx) {}
bool equals(SystemStatusLocation& peer); bool equals(const SystemStatusLocation& peer);
void dump(void); void dump(void);
}; };
@@ -119,7 +125,7 @@ public:
mLeapSeconds(0), mLeapSeconds(0),
mLeapSecUnc(0) {} mLeapSecUnc(0) {}
inline SystemStatusTimeAndClock(const SystemStatusPQWM1& nmea); inline SystemStatusTimeAndClock(const SystemStatusPQWM1& nmea);
bool equals(SystemStatusTimeAndClock& peer); bool equals(const SystemStatusTimeAndClock& peer);
void dump(void); void dump(void);
}; };
@@ -130,7 +136,7 @@ public:
inline SystemStatusXoState() : inline SystemStatusXoState() :
mXoState(0) {} mXoState(0) {}
inline SystemStatusXoState(const SystemStatusPQWM1& nmea); inline SystemStatusXoState(const SystemStatusPQWM1& nmea);
bool equals(SystemStatusXoState& peer); bool equals(const SystemStatusXoState& peer);
void dump(void); void dump(void);
}; };
@@ -150,6 +156,12 @@ public:
double mAgcGlo; double mAgcGlo;
double mAgcBds; double mAgcBds;
double mAgcGal; double mAgcGal;
uint32_t mGloBpAmpI;
uint32_t mGloBpAmpQ;
uint32_t mBdsBpAmpI;
uint32_t mBdsBpAmpQ;
uint32_t mGalBpAmpI;
uint32_t mGalBpAmpQ;
inline SystemStatusRfAndParams() : inline SystemStatusRfAndParams() :
mPgaGain(0), mPgaGain(0),
mGpsBpAmpI(0), mGpsBpAmpI(0),
@@ -163,9 +175,15 @@ public:
mAgcGps(0), mAgcGps(0),
mAgcGlo(0), mAgcGlo(0),
mAgcBds(0), mAgcBds(0),
mAgcGal(0) {} mAgcGal(0),
mGloBpAmpI(0),
mGloBpAmpQ(0),
mBdsBpAmpI(0),
mBdsBpAmpQ(0),
mGalBpAmpI(0),
mGalBpAmpQ(0) {}
inline SystemStatusRfAndParams(const SystemStatusPQWM1& nmea); inline SystemStatusRfAndParams(const SystemStatusPQWM1& nmea);
bool equals(SystemStatusRfAndParams& peer); bool equals(const SystemStatusRfAndParams& peer);
void dump(void); void dump(void);
}; };
@@ -176,7 +194,7 @@ public:
inline SystemStatusErrRecovery() : inline SystemStatusErrRecovery() :
mRecErrorRecovery(0) {}; mRecErrorRecovery(0) {};
inline SystemStatusErrRecovery(const SystemStatusPQWM1& nmea); inline SystemStatusErrRecovery(const SystemStatusPQWM1& nmea);
bool equals(SystemStatusErrRecovery& peer); bool equals(const SystemStatusErrRecovery& peer);
void dump(void); void dump(void);
}; };
@@ -200,7 +218,7 @@ public:
mEpiAltUnc(0), mEpiAltUnc(0),
mEpiSrc(0) {} mEpiSrc(0) {}
inline SystemStatusInjectedPosition(const SystemStatusPQWP1& nmea); inline SystemStatusInjectedPosition(const SystemStatusPQWP1& nmea);
bool equals(SystemStatusInjectedPosition& peer); bool equals(const SystemStatusInjectedPosition& peer);
void dump(void); void dump(void);
}; };
@@ -222,7 +240,7 @@ public:
mBestHepe(0), mBestHepe(0),
mBestAltUnc(0) {} mBestAltUnc(0) {}
inline SystemStatusBestPosition(const SystemStatusPQWP2& nmea); inline SystemStatusBestPosition(const SystemStatusPQWP2& nmea);
bool equals(SystemStatusBestPosition& peer); bool equals(const SystemStatusBestPosition& peer);
void dump(void); void dump(void);
}; };
@@ -254,7 +272,7 @@ public:
mGalXtraValid(0ULL), mGalXtraValid(0ULL),
mQzssXtraValid(0) {} mQzssXtraValid(0) {}
inline SystemStatusXtra(const SystemStatusPQWP3& nmea); inline SystemStatusXtra(const SystemStatusPQWP3& nmea);
bool equals(SystemStatusXtra& peer); bool equals(const SystemStatusXtra& peer);
void dump(void); void dump(void);
}; };
@@ -274,7 +292,7 @@ public:
mGalEpheValid(0ULL), mGalEpheValid(0ULL),
mQzssEpheValid(0) {} mQzssEpheValid(0) {}
inline SystemStatusEphemeris(const SystemStatusPQWP4& nmea); inline SystemStatusEphemeris(const SystemStatusPQWP4& nmea);
bool equals(SystemStatusEphemeris& peer); bool equals(const SystemStatusEphemeris& peer);
void dump(void); void dump(void);
}; };
@@ -314,7 +332,7 @@ public:
mGalBadMask(0ULL), mGalBadMask(0ULL),
mQzssBadMask(0) {} mQzssBadMask(0) {}
inline SystemStatusSvHealth(const SystemStatusPQWP5& nmea); inline SystemStatusSvHealth(const SystemStatusPQWP5& nmea);
bool equals(SystemStatusSvHealth& peer); bool equals(const SystemStatusSvHealth& peer);
void dump(void); void dump(void);
}; };
@@ -326,7 +344,7 @@ public:
inline SystemStatusPdr() : inline SystemStatusPdr() :
mFixInfoMask(0) {} mFixInfoMask(0) {}
inline SystemStatusPdr(const SystemStatusPQWP6& nmea); inline SystemStatusPdr(const SystemStatusPQWP6& nmea);
bool equals(SystemStatusPdr& peer); bool equals(const SystemStatusPdr& peer);
void dump(void); void dump(void);
}; };
@@ -350,7 +368,7 @@ public:
} }
} }
inline SystemStatusNavData(const SystemStatusPQWP7& nmea); inline SystemStatusNavData(const SystemStatusPQWP7& nmea);
bool equals(SystemStatusNavData& peer); bool equals(const SystemStatusNavData& peer);
void dump(void); void dump(void);
}; };
@@ -364,168 +382,352 @@ public:
mFixInfoMask(0), mFixInfoMask(0),
mHepeLimit(0) {} mHepeLimit(0) {}
inline SystemStatusPositionFailure(const SystemStatusPQWS1& nmea); inline SystemStatusPositionFailure(const SystemStatusPQWS1& nmea);
bool equals(SystemStatusPositionFailure& peer); bool equals(const SystemStatusPositionFailure& peer);
void dump(void); void dump(void);
}; };
/****************************************************************************** /******************************************************************************
SystemStatus report data structure - from DataItem observer SystemStatus report data structure - from DataItem observer
******************************************************************************/ ******************************************************************************/
class SystemStatusGpsState : public SystemStatusItemBase, public IDataItemCore class SystemStatusAirplaneMode : public SystemStatusItemBase,
public AirplaneModeDataItemBase
{ {
public: public:
inline SystemStatusGpsState() : inline SystemStatusAirplaneMode(bool mode=false) :
mEnabled(false) {} AirplaneModeDataItemBase(mode) {}
inline SystemStatusGpsState(bool enabled) : inline SystemStatusAirplaneMode(const AirplaneModeDataItemBase& itemBase) :
mEnabled(enabled) {} AirplaneModeDataItemBase(itemBase) {}
inline bool equals(const SystemStatusAirplaneMode& peer) {
return (mMode == peer.mMode);
}
};
bool mEnabled; class SystemStatusENH : public SystemStatusItemBase,
public ENHDataItemBase
inline bool equals(SystemStatusGpsState& peer) { {
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); return (mEnabled == peer.mEnabled);
} }
inline void dump(void) { };
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); LOC_LOGD("GpsState: state=%u", mEnabled);
} }
inline DataItemId getId() { };
return GPSSTATE_DATA_ITEM_ID;
} class SystemStatusNLPStatus : public SystemStatusItemBase,
inline void stringify(string& valueStr) { public NLPStatusDataItemBase
valueStr.clear(); {
valueStr += "GpsState: enabled="; public:
valueStr += to_string(mEnabled); inline SystemStatusNLPStatus(bool enabled=false) :
} NLPStatusDataItemBase(enabled) {}
inline int32_t copy(IDataItemCore* src, bool* dataItemCopied = nullptr) { inline SystemStatusNLPStatus(const NLPStatusDataItemBase& itemBase) :
SystemStatusGpsState* gpsstate = static_cast<SystemStatusGpsState*>(src); NLPStatusDataItemBase(itemBase) {}
mEnabled = gpsstate->mEnabled; inline bool equals(const SystemStatusNLPStatus& peer) {
if (dataItemCopied) { return (mEnabled == peer.mEnabled);
*dataItemCopied = true;
}
return 1;
} }
}; };
class SystemStatusNetworkInfo : public SystemStatusItemBase, public IDataItemCore class SystemStatusWifiHardwareState : public SystemStatusItemBase,
public WifiHardwareStateDataItemBase
{ {
public: public:
inline SystemStatusNetworkInfo() : inline SystemStatusWifiHardwareState(bool enabled=false) :
mType(0), WifiHardwareStateDataItemBase(enabled) {}
mTypeName(""), inline SystemStatusWifiHardwareState(const WifiHardwareStateDataItemBase& itemBase) :
mSubTypeName(""), WifiHardwareStateDataItemBase(itemBase) {}
mAvailable(false), inline bool equals(const SystemStatusWifiHardwareState& peer) {
mConnected(false), return (mEnabled == peer.mEnabled);
mRoaming(false) {} }
};
class SystemStatusNetworkInfo : public SystemStatusItemBase,
public NetworkInfoDataItemBase
{
NetworkInfoDataItemBase* mSrcObjPtr;
public:
inline SystemStatusNetworkInfo( inline SystemStatusNetworkInfo(
uint32_t type, int32_t type=0,
std::string typeName, std::string typeName="",
std::string subTypeName, string subTypeName="",
bool available, bool connected=false,
bool connected, bool roaming=false) :
bool roaming) : NetworkInfoDataItemBase(
mType(type), (NetworkType)type,
mTypeName(typeName), type,
mSubTypeName(subTypeName), typeName,
mAvailable(available), subTypeName,
mConnected(connected), connected && (!roaming),
mRoaming(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.
uint32_t mType; if (nullptr != mSrcObjPtr) {
std::string mTypeName; // this is critical, changing mAllTypes of the original obj
std::string mSubTypeName; mSrcObjPtr->mAllTypes = mAllTypes;
bool mAvailable;
bool mConnected;
bool mRoaming;
inline bool equals(SystemStatusNetworkInfo& peer) {
if ((mType != peer.mType) ||
(mTypeName != peer.mTypeName) ||
(mSubTypeName != peer.mSubTypeName) ||
(mAvailable != peer.mAvailable) ||
(mConnected != peer.mConnected) ||
(mRoaming != peer.mRoaming)) {
return false;
} }
return true; return *this;
} }
inline void dump(void) { inline void dump(void) override {
LOC_LOGD("NetworkInfo: type=%u connected=%u", mType, mConnected); LOC_LOGD("NetworkInfo: mAllTypes=%" PRIx64 " connected=%u mType=%x",
} mAllTypes, mConnected, mType);
inline DataItemId getId() {
return NETWORKINFO_DATA_ITEM_ID;
}
inline void stringify(string& /*valueStr*/) { }
inline int32_t copy(IDataItemCore* src, bool* dataItemCopied = nullptr) {
SystemStatusNetworkInfo* networkinfo = static_cast<SystemStatusNetworkInfo*>(src);
mType = networkinfo->mType;
mTypeName = networkinfo->mTypeName;
mSubTypeName = networkinfo->mSubTypeName;
mAvailable = networkinfo->mAvailable;
mConnected = networkinfo->mConnected;
mRoaming = networkinfo->mRoaming;
if (dataItemCopied) {
*dataItemCopied = true;
}
return 1;
} }
}; };
class SystemStatusTac : public SystemStatusItemBase, public IDataItemCore class SystemStatusServiceInfo : public SystemStatusItemBase,
public RilServiceInfoDataItemBase
{ {
public: public:
inline SystemStatusTac() : inline SystemStatusServiceInfo() :
mValue("") {} RilServiceInfoDataItemBase() {}
inline SystemStatusTac(std::string value) : inline SystemStatusServiceInfo(const RilServiceInfoDataItemBase& itemBase) :
mValue(value) {} RilServiceInfoDataItemBase(itemBase) {}
inline bool equals(const SystemStatusServiceInfo& peer) {
return static_cast<const RilServiceInfoDataItemBase&>(peer) ==
static_cast<const RilServiceInfoDataItemBase&>(*this);
}
};
std::string mValue; 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);
}
};
inline bool equals(SystemStatusTac& peer) { 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); return (mValue == peer.mValue);
} }
inline void dump(void) { inline void dump(void) {
LOC_LOGD("Tac: value=%s", mValue.c_str()); LOC_LOGD("Tac: value=%s", mValue.c_str());
} }
inline DataItemId getId() {
return TAC_DATA_ITEM_ID;
}
inline void stringify(string& /*valueStr*/) { }
inline int32_t copy(IDataItemCore* src, bool* dataItemCopied = nullptr) {
SystemStatusTac* tac = static_cast<SystemStatusTac*>(src);
mValue = tac->mValue;
if (dataItemCopied) {
*dataItemCopied = true;
}
return 1;
}
}; };
class SystemStatusMccMnc : public SystemStatusItemBase, public IDataItemCore class SystemStatusMccMnc : public SystemStatusItemBase,
public MccmncDataItemBase
{ {
public: public:
inline SystemStatusMccMnc() : inline SystemStatusMccMnc(std::string value="") :
mValue("") {} MccmncDataItemBase(value) {}
inline SystemStatusMccMnc(std::string value) : inline SystemStatusMccMnc(const MccmncDataItemBase& itemBase) :
mValue(value) {} MccmncDataItemBase(itemBase) {}
inline bool equals(const SystemStatusMccMnc& peer) {
std::string mValue;
inline bool equals(SystemStatusMccMnc& peer) {
return (mValue == peer.mValue); return (mValue == peer.mValue);
} }
inline void dump(void) { inline void dump(void) {
LOC_LOGD("TacMccMnc value=%s", mValue.c_str()); LOC_LOGD("TacMccMnc value=%s", mValue.c_str());
} }
inline DataItemId getId() { };
return MCCMNC_DATA_ITEM_ID;
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;
} }
inline void stringify(string& /*valueStr*/) { } };
inline int32_t copy(IDataItemCore* src, bool* dataItemCopied = nullptr) {
SystemStatusMccMnc* mccmnc = static_cast<SystemStatusMccMnc*>(src); class SystemStatusBtleDeviceScanDetail : public SystemStatusItemBase,
mValue = mccmnc->mValue; public BtLeDeviceScanDetailsDataItemBase
if (dataItemCopied) { {
*dataItemCopied = true; public:
} inline SystemStatusBtleDeviceScanDetail() :
return 1; BtLeDeviceScanDetailsDataItemBase() {}
inline SystemStatusBtleDeviceScanDetail(const BtLeDeviceScanDetailsDataItemBase& itemBase) :
BtLeDeviceScanDetailsDataItemBase(itemBase) {}
inline bool equals(const SystemStatusBtleDeviceScanDetail& /*peer*/) {
return true;
} }
}; };
@@ -557,10 +759,28 @@ public:
std::vector<SystemStatusPositionFailure> mPositionFailure; std::vector<SystemStatusPositionFailure> mPositionFailure;
// from dataitems observer // from dataitems observer
std::vector<SystemStatusGpsState> mGpsState; 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<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<SystemStatusTac> mTac;
std::vector<SystemStatusMccMnc> mMccMnc; std::vector<SystemStatusMccMnc> mMccMnc;
std::vector<SystemStatusBtDeviceScanDetail> mBtDeviceScanDetail;
std::vector<SystemStatusBtleDeviceScanDetail> mBtLeDeviceScanDetail;
}; };
/****************************************************************************** /******************************************************************************
@@ -578,50 +798,17 @@ private:
// Data members // Data members
static pthread_mutex_t mMutexSystemStatus; static pthread_mutex_t mMutexSystemStatus;
static const uint32_t maxLocation = 5;
static const uint32_t maxTimeAndClock = 5;
static const uint32_t maxXoState = 5;
static const uint32_t maxRfAndParams = 5;
static const uint32_t maxErrRecovery = 5;
static const uint32_t maxInjectedPosition = 5;
static const uint32_t maxBestPosition = 5;
static const uint32_t maxXtra = 5;
static const uint32_t maxEphemeris = 5;
static const uint32_t maxSvHealth = 5;
static const uint32_t maxPdr = 5;
static const uint32_t maxNavData = 5;
static const uint32_t maxPositionFailure = 5;
static const uint32_t maxGpsState = 5;
static const uint32_t maxNetworkInfo = 5;
static const uint32_t maxTac = 5;
static const uint32_t maxMccMnc = 5;
SystemStatusReports mCache; SystemStatusReports mCache;
bool mConnected;
bool setLocation(const UlpLocation& location); template <typename TYPE_REPORT, typename TYPE_ITEM>
bool setIteminReport(TYPE_REPORT& report, TYPE_ITEM&& s);
bool setTimeAndCLock(const SystemStatusPQWM1& nmea); // set default dataitem derived item in report cache
bool setXoState(const SystemStatusPQWM1& nmea); template <typename TYPE_REPORT, typename TYPE_ITEM>
bool setRfAndParams(const SystemStatusPQWM1& nmea); void setDefaultIteminReport(TYPE_REPORT& report, const TYPE_ITEM& s);
bool setErrRecovery(const SystemStatusPQWM1& nmea);
bool setInjectedPosition(const SystemStatusPQWP1& nmea); template <typename TYPE_REPORT, typename TYPE_ITEM>
bool setBestPosition(const SystemStatusPQWP2& nmea); void getIteminReport(TYPE_REPORT& reportout, const TYPE_ITEM& c) const;
bool setXtra(const SystemStatusPQWP3& nmea);
bool setEphemeris(const SystemStatusPQWP4& nmea);
bool setSvHealth(const SystemStatusPQWP5& nmea);
bool setPdr(const SystemStatusPQWP6& nmea);
bool setNavData(const SystemStatusPQWP7& nmea);
bool setPositionFailure(const SystemStatusPQWS1& nmea);
bool setNetworkInfo(IDataItemCore* dataitem);
public: public:
// Static methods // Static methods
@@ -634,8 +821,8 @@ public:
bool eventDataItemNotify(IDataItemCore* dataitem); bool eventDataItemNotify(IDataItemCore* dataitem);
bool setNmeaString(const char *data, uint32_t len); bool setNmeaString(const char *data, uint32_t len);
bool getReport(SystemStatusReports& reports, bool isLatestonly = false) const; bool getReport(SystemStatusReports& reports, bool isLatestonly = false) const;
bool setDefaultReport(void); bool setDefaultGnssEngineStates(void);
bool eventConnectionStatus(bool connected, uint8_t type); bool eventConnectionStatus(bool connected, int8_t type);
}; };
} // namespace loc_core } // namespace loc_core

View File

@@ -32,23 +32,20 @@
#include <SystemStatus.h> #include <SystemStatus.h>
#include <SystemStatusOsObserver.h> #include <SystemStatusOsObserver.h>
#include <IDataItemCore.h> #include <IDataItemCore.h>
#include <IClientIndex.h>
#include <IDataItemIndex.h>
#include <IndexFactory.h>
#include <DataItemsFactoryProxy.h> #include <DataItemsFactoryProxy.h>
namespace loc_core namespace loc_core
{ {
SystemStatusOsObserver::SystemStatusOsObserver(const MsgTask* msgTask) : template <typename CINT, typename COUT>
mAddress("SystemStatusOsObserver"), COUT SystemStatusOsObserver::containerTransfer(CINT& inContainer) {
mClientIndex(IndexFactory<IDataItemObserver*, DataItemId> :: createClientIndex()), COUT outContainer(0);
mDataItemIndex(IndexFactory<IDataItemObserver*, DataItemId> :: createDataItemIndex()) for (auto item : inContainer) {
{ outContainer.insert(outContainer.begin(), item);
mContext.mMsgTask = msgTask; }
return outContainer;
} }
SystemStatusOsObserver::~SystemStatusOsObserver() SystemStatusOsObserver::~SystemStatusOsObserver() {
{
// Close data-item library handle // Close data-item library handle
DataItemsFactoryProxy::closeDataItemLibraryHandle(); DataItemsFactoryProxy::closeDataItemLibraryHandle();
@@ -60,290 +57,238 @@ SystemStatusOsObserver::~SystemStatusOsObserver()
} }
mDataItemCache.clear(); mDataItemCache.clear();
delete mClientIndex;
delete mDataItemIndex;
} }
void SystemStatusOsObserver::setSubscriptionObj(IDataItemSubscription* subscriptionObj) void SystemStatusOsObserver::setSubscriptionObj(IDataItemSubscription* subscriptionObj)
{ {
mContext.mSubscriptionObj = 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;
LOC_LOGD("Request cache size - Subscribe:%zu RequestData:%zu", if (!mContext.mSSObserver->mDataItemToClients.empty()) {
mSubscribeReqCache.size(), mReqDataCache.size()); list<DataItemId> dis(
containerTransfer<unordered_set<DataItemId>, list<DataItemId>>(
// we have received the subscription object. process cached requests mContext.mSSObserver->mDataItemToClients.getKeys()));
// process - subscribe request cache mContext.mSubscriptionObj->subscribe(dis, mContext.mSSObserver);
for (auto each : mSubscribeReqCache) { mContext.mSubscriptionObj->requestData(dis, mContext.mSSObserver);
subscribe(each.second, each.first); }
}
// process - requestData request cache
for (auto each : mReqDataCache) {
requestData(each.second, each.first);
}
}
// Helper to cache requests subscribe and requestData till subscription obj is obtained
void SystemStatusOsObserver::cacheObserverRequest(ObserverReqCache& reqCache,
const list<DataItemId>& l, IDataItemObserver* client)
{
ObserverReqCache::iterator dicIter = reqCache.find(client);
if (dicIter != reqCache.end()) {
// found
list<DataItemId> difference(0);
set_difference(l.begin(), l.end(),
dicIter->second.begin(), dicIter->second.end(),
inserter(difference, difference.begin()));
if (!difference.empty()) {
difference.sort();
dicIter->second.merge(difference);
dicIter->second.unique();
} }
} };
else {
// not found if (nullptr == subscriptionObj) {
reqCache[client] = l; LOC_LOGw("subscriptionObj is NULL");
} else {
mContext.mMsgTask->sendMsg(new SetSubsObj(mContext, subscriptionObj));
} }
} }
/****************************************************************************** /******************************************************************************
IDataItemSubscription Overrides IDataItemSubscription Overrides
******************************************************************************/ ******************************************************************************/
void SystemStatusOsObserver::subscribe( void SystemStatusOsObserver::subscribe(const list<DataItemId>& l, IDataItemObserver* client,
const list<DataItemId>& l, IDataItemObserver* client) bool toRequestData)
{ {
if (nullptr == mContext.mSubscriptionObj) {
LOC_LOGD("%s]: Subscription object is NULL. Caching requests", __func__);
cacheObserverRequest(mSubscribeReqCache, l, client);
return;
}
struct HandleSubscribeReq : public LocMsg { struct HandleSubscribeReq : public LocMsg {
HandleSubscribeReq(SystemStatusOsObserver* parent, inline HandleSubscribeReq(SystemStatusOsObserver* parent,
const list<DataItemId>& l, IDataItemObserver* client) : list<DataItemId>& l, IDataItemObserver* client, bool requestData) :
mParent(parent), mClient(client), mDataItemList(l) {} mParent(parent), mClient(client),
virtual ~HandleSubscribeReq() {} mDataItemSet(containerTransfer<list<DataItemId>, unordered_set<DataItemId>>(l)),
mToRequestData(requestData) {}
void proc() const { void proc() const {
unordered_set<DataItemId> dataItemsToSubscribe(0);
mParent->mDataItemToClients.add(mDataItemSet, {mClient}, &dataItemsToSubscribe);
mParent->mClientToDataItems.add(mClient, mDataItemSet);
if (mDataItemList.empty()) { mParent->sendCachedDataItems(mDataItemSet, mClient);
LOC_LOGV("mDataItemList is empty. Nothing to do. Exiting");
return;
}
// Handle First Response // Send subscription set to framework
list<DataItemId> pendingFirstResponseList(0); if (nullptr != mParent->mContext.mSubscriptionObj && !dataItemsToSubscribe.empty()) {
mParent->mClientIndex->add(mClient, mDataItemList, pendingFirstResponseList);
// Do not send first response for only pendingFirstResponseList,
// instead send for all the data items (present in the cache) that
// have been subscribed for each time.
mParent->sendFirstResponse(mDataItemList, mClient);
list<DataItemId> yetToSubscribeDataItemsList(0);
mParent->mDataItemIndex->add(mClient, mDataItemList, yetToSubscribeDataItemsList);
// Send subscription list to framework
if (!yetToSubscribeDataItemsList.empty()) {
mParent->mContext.mSubscriptionObj->subscribe(yetToSubscribeDataItemsList, mParent);
LOC_LOGD("Subscribe Request sent to framework for the following"); LOC_LOGD("Subscribe Request sent to framework for the following");
mParent->logMe(yetToSubscribeDataItemsList); 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);
}
} }
} }
SystemStatusOsObserver* mParent; mutable SystemStatusOsObserver* mParent;
IDataItemObserver* mClient; IDataItemObserver* mClient;
const list<DataItemId> mDataItemList; const unordered_set<DataItemId> mDataItemSet;
bool mToRequestData;
}; };
mContext.mMsgTask->sendMsg(new (nothrow) HandleSubscribeReq(this, l, client));
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( void SystemStatusOsObserver::updateSubscription(
const list<DataItemId>& l, IDataItemObserver* client) const list<DataItemId>& l, IDataItemObserver* client)
{ {
if (nullptr == mContext.mSubscriptionObj) {
LOC_LOGE("%s:%d]: Subscription object is NULL", __func__, __LINE__);
return;
}
struct HandleUpdateSubscriptionReq : public LocMsg { struct HandleUpdateSubscriptionReq : public LocMsg {
HandleUpdateSubscriptionReq(SystemStatusOsObserver* parent, HandleUpdateSubscriptionReq(SystemStatusOsObserver* parent,
const list<DataItemId>& l, IDataItemObserver* client) : list<DataItemId>& l, IDataItemObserver* client) :
mParent(parent), mClient(client), mDataItemList(l) {} mParent(parent), mClient(client),
virtual ~HandleUpdateSubscriptionReq() {} mDataItemSet(containerTransfer<list<DataItemId>, unordered_set<DataItemId>>(l)) {}
void proc() const { void proc() const {
if (mDataItemList.empty()) { unordered_set<DataItemId> dataItemsToSubscribe(0);
LOC_LOGV("mDataItemList is empty. Nothing to do. Exiting"); unordered_set<DataItemId> dataItemsToUnsubscribe(0);
return; 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
list<DataItemId> currentlySubscribedList(0); // result, the entire entry will be removed. dataItemsToUnsubscribe will be
mParent->mClientIndex->getSubscribedList(mClient, currentlySubscribedList); // populated to keep the keys of the removed entries.
mParent->mDataItemToClients.trimOrRemove(
list<DataItemId> removeDataItemList(0); // this call updates <IDataItemObserver*, DataItemId> map; removes
set_difference(currentlySubscribedList.begin(), currentlySubscribedList.end(), // the DataItemId's that are not new to the clietn from mDataItemSet;
mDataItemList.begin(), mDataItemList.end(), // and returns a set of mDataItemSet's that are no longer used by client.
inserter(removeDataItemList,removeDataItemList.begin())); // This unused set of mDataItemSet's is passed to trimOrRemove method of
// <DataItemId, IDataItemObserver*> map to remove the client from the
// Handle First Response // corresponding entries, and gets a set of the entries that are
list<DataItemId> pendingFirstResponseList(0); // removed from the <DataItemId, IDataItemObserver*> map as a result.
mParent->mClientIndex->add(mClient, mDataItemList, pendingFirstResponseList); 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 // Send First Response
mParent->sendFirstResponse(pendingFirstResponseList, mClient); mParent->sendCachedDataItems(mDataItemSet, mClient);
list<DataItemId> yetToSubscribeDataItemsList(0); if (nullptr != mParent->mContext.mSubscriptionObj) {
mParent->mDataItemIndex->add( // Send subscription set to framework
mClient, mDataItemList, yetToSubscribeDataItemsList); if (!dataItemsToSubscribe.empty()) {
LOC_LOGD("Subscribe Request sent to framework for the following");
mParent->logMe(dataItemsToSubscribe);
// Send subscription list to framework mParent->mContext.mSubscriptionObj->subscribe(
if (!yetToSubscribeDataItemsList.empty()) { containerTransfer<unordered_set<DataItemId>, list<DataItemId>>(
mParent->mContext.mSubscriptionObj->subscribe( std::move(dataItemsToSubscribe)),
yetToSubscribeDataItemsList, mParent); mParent);
LOC_LOGD("Subscribe Request sent to framework for the following"); }
mParent->logMe(yetToSubscribeDataItemsList);
}
list<DataItemId> unsubscribeList(0);
list<DataItemId> unused(0);
mParent->mClientIndex->remove(mClient, removeDataItemList, unused);
if (!mParent->mClientIndex->isSubscribedClient(mClient)) {
mParent->mDataItemIndex->remove(
list<IDataItemObserver*> (1,mClient), unsubscribeList);
}
if (!unsubscribeList.empty()) {
// Send unsubscribe to framework // Send unsubscribe to framework
mParent->mContext.mSubscriptionObj->unsubscribe(unsubscribeList, mParent); if (!dataItemsToUnsubscribe.empty()) {
LOC_LOGD("Unsubscribe Request sent to framework for the following"); LOC_LOGD("Unsubscribe Request sent to framework for the following");
mParent->logMe(unsubscribeList); mParent->logMe(dataItemsToUnsubscribe);
mParent->mContext.mSubscriptionObj->unsubscribe(
containerTransfer<unordered_set<DataItemId>, list<DataItemId>>(
std::move(dataItemsToUnsubscribe)),
mParent);
}
} }
} }
SystemStatusOsObserver* mParent; SystemStatusOsObserver* mParent;
IDataItemObserver* mClient; IDataItemObserver* mClient;
const list<DataItemId> mDataItemList; unordered_set<DataItemId> mDataItemSet;
}; };
mContext.mMsgTask->sendMsg(new (nothrow) HandleUpdateSubscriptionReq(this, l, client));
}
void SystemStatusOsObserver::requestData( if (l.empty() || nullptr == client) {
const list<DataItemId>& l, IDataItemObserver* client) LOC_LOGw("Data item set is empty or client is nullptr");
{ } else {
if (nullptr == mContext.mSubscriptionObj) { mContext.mMsgTask->sendMsg(
LOC_LOGD("%s]: Subscription object is NULL. Caching requests", __func__); new HandleUpdateSubscriptionReq(this, (list<DataItemId>&)l, client));
cacheObserverRequest(mReqDataCache, l, client);
return;
} }
struct HandleRequestData : public LocMsg {
HandleRequestData(SystemStatusOsObserver* parent,
const list<DataItemId>& l, IDataItemObserver* client) :
mParent(parent), mClient(client), mDataItemList(l) {}
virtual ~HandleRequestData() {}
void proc() const {
if (mDataItemList.empty()) {
LOC_LOGV("mDataItemList is empty. Nothing to do. Exiting");
return;
}
list<DataItemId> yetToSubscribeDataItemsList(0);
mParent->mClientIndex->add(
mClient, mDataItemList, yetToSubscribeDataItemsList);
mParent->mDataItemIndex->add(
mClient, mDataItemList, yetToSubscribeDataItemsList);
// Send subscription list to framework
if (!mDataItemList.empty()) {
mParent->mContext.mSubscriptionObj->requestData(mDataItemList, mParent);
LOC_LOGD("Subscribe Request sent to framework for the following");
mParent->logMe(yetToSubscribeDataItemsList);
}
}
SystemStatusOsObserver* mParent;
IDataItemObserver* mClient;
const list<DataItemId> mDataItemList;
};
mContext.mMsgTask->sendMsg(new (nothrow) HandleRequestData(this, l, client));
} }
void SystemStatusOsObserver::unsubscribe( void SystemStatusOsObserver::unsubscribe(
const list<DataItemId>& l, IDataItemObserver* client) const list<DataItemId>& l, IDataItemObserver* client)
{ {
if (nullptr == mContext.mSubscriptionObj) {
LOC_LOGE("%s:%d]: Subscription object is NULL", __func__, __LINE__);
return;
}
struct HandleUnsubscribeReq : public LocMsg { struct HandleUnsubscribeReq : public LocMsg {
HandleUnsubscribeReq(SystemStatusOsObserver* parent, HandleUnsubscribeReq(SystemStatusOsObserver* parent,
const list<DataItemId>& l, IDataItemObserver* client) : list<DataItemId>& l, IDataItemObserver* client) :
mParent(parent), mClient(client), mDataItemList(l) {} mParent(parent), mClient(client),
virtual ~HandleUnsubscribeReq() {} mDataItemSet(containerTransfer<list<DataItemId>, unordered_set<DataItemId>>(l)) {}
void proc() const { void proc() const {
if (mDataItemList.empty()) { unordered_set<DataItemId> dataItemsUnusedByClient(0);
LOC_LOGV("mDataItemList is empty. Nothing to do. Exiting"); unordered_set<IDataItemObserver*> clientToRemove(0);
return; mParent->mClientToDataItems.trimOrRemove({mClient}, mDataItemSet, &clientToRemove,
} &dataItemsUnusedByClient);
unordered_set<DataItemId> dataItemsToUnsubscribe(0);
mParent->mDataItemToClients.trimOrRemove(dataItemsUnusedByClient, {mClient},
&dataItemsToUnsubscribe, nullptr);
list<DataItemId> unsubscribeList(0); if (nullptr != mParent->mContext.mSubscriptionObj && !dataItemsToUnsubscribe.empty()) {
list<DataItemId> unused(0);
mParent->mClientIndex->remove(mClient, mDataItemList, unused);
for (auto each : mDataItemList) {
list<IDataItemObserver*> clientListSubs(0);
list<IDataItemObserver*> clientListOut(0);
mParent->mDataItemIndex->remove(
each, list<IDataItemObserver*> (1,mClient), clientListOut);
// check if there are any other subscribed client for this data item id
mParent->mDataItemIndex->getListOfSubscribedClients(each, clientListSubs);
if (clientListSubs.empty())
{
LOC_LOGD("Client list subscribed is empty for dataitem - %d", each);
unsubscribeList.push_back(each);
}
}
if (!unsubscribeList.empty()) {
// Send unsubscribe to framework
mParent->mContext.mSubscriptionObj->unsubscribe(unsubscribeList, mParent);
LOC_LOGD("Unsubscribe Request sent to framework for the following data items"); LOC_LOGD("Unsubscribe Request sent to framework for the following data items");
mParent->logMe(unsubscribeList); mParent->logMe(dataItemsToUnsubscribe);
// Send unsubscribe to framework
mParent->mContext.mSubscriptionObj->unsubscribe(
containerTransfer<unordered_set<DataItemId>, list<DataItemId>>(
std::move(dataItemsToUnsubscribe)),
mParent);
} }
} }
SystemStatusOsObserver* mParent; SystemStatusOsObserver* mParent;
IDataItemObserver* mClient; IDataItemObserver* mClient;
const list<DataItemId> mDataItemList; unordered_set<DataItemId> mDataItemSet;
}; };
mContext.mMsgTask->sendMsg(new (nothrow) HandleUnsubscribeReq(this, l, client));
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) void SystemStatusOsObserver::unsubscribeAll(IDataItemObserver* client)
{ {
if (nullptr == mContext.mSubscriptionObj) {
LOC_LOGE("%s:%d]: Subscription object is NULL", __func__, __LINE__);
return;
}
struct HandleUnsubscribeAllReq : public LocMsg { struct HandleUnsubscribeAllReq : public LocMsg {
HandleUnsubscribeAllReq(SystemStatusOsObserver* parent, HandleUnsubscribeAllReq(SystemStatusOsObserver* parent,
IDataItemObserver* client) : IDataItemObserver* client) :
mParent(parent), mClient(client) {} mParent(parent), mClient(client) {}
virtual ~HandleUnsubscribeAllReq() {}
void proc() const {
list<IDataItemObserver*> clients(1, mClient);
list<DataItemId> unsubscribeList(0);
if(0 == mParent->mClientIndex->remove(mClient)) {
return;
}
mParent->mDataItemIndex->remove(clients, unsubscribeList);
if (!unsubscribeList.empty()) { void proc() const {
// Send unsubscribe to framework unordered_set<DataItemId> diByClient = mParent->mClientToDataItems.getValSet(mClient);
mParent->mContext.mSubscriptionObj->unsubscribe(unsubscribeList, mParent); if (!diByClient.empty()) {
LOC_LOGD("Unsubscribe Request sent to framework for the following data items"); unordered_set<DataItemId> dataItemsToUnsubscribe;
mParent->logMe(unsubscribeList); 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; SystemStatusOsObserver* mParent;
IDataItemObserver* mClient; IDataItemObserver* mClient;
}; };
mContext.mMsgTask->sendMsg(new (nothrow) HandleUnsubscribeAllReq(this, client));
if (nullptr == client) {
LOC_LOGw("Data item set is empty or client is nullptr");
} else {
mContext.mMsgTask->sendMsg(new HandleUnsubscribeAllReq(this, client));
}
} }
/****************************************************************************** /******************************************************************************
@@ -351,84 +296,78 @@ void SystemStatusOsObserver::unsubscribeAll(IDataItemObserver* client)
******************************************************************************/ ******************************************************************************/
void SystemStatusOsObserver::notify(const list<IDataItemCore*>& dlist) void SystemStatusOsObserver::notify(const list<IDataItemCore*>& dlist)
{ {
list<IDataItemCore*> dataItemList(0);
for (auto each : dlist) {
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_LOGE("Unable to create dataitem:%d", each->getId());
return;
}
// Copy contents into the newly created data item
di->copy(each);
dataItemList.push_back(di);
// Request systemstatus to record this dataitem in its cache
SystemStatus* systemstatus = SystemStatus::getInstance(mContext.mMsgTask);
if(nullptr != systemstatus) {
systemstatus->eventDataItemNotify(di);
}
}
struct HandleNotify : public LocMsg { struct HandleNotify : public LocMsg {
HandleNotify(SystemStatusOsObserver* parent, const list<IDataItemCore*>& l) : HandleNotify(SystemStatusOsObserver* parent, vector<IDataItemCore*>& v) :
mParent(parent), mDList(l) {} mParent(parent), mDiVec(std::move(v)) {}
virtual ~HandleNotify() {
for (auto each : mDList) { inline virtual ~HandleNotify() {
delete each; for (auto item : mDiVec) {
delete item;
} }
} }
void proc() const { void proc() const {
// Update Cache with received data items and prepare // Update Cache with received data items and prepare
// list of data items to be sent. // list of data items to be sent.
list<DataItemId> dataItemIdsToBeSent(0); unordered_set<DataItemId> dataItemIdsToBeSent(0);
for (auto item : mDList) { for (auto item : mDiVec) {
bool dataItemUpdated = false; if (mParent->updateCache(item)) {
mParent->updateCache(item, dataItemUpdated); dataItemIdsToBeSent.insert(item->getId());
if (dataItemUpdated) {
dataItemIdsToBeSent.push_back(item->getId());
} }
} }
// Send data item to all subscribed clients // Send data item to all subscribed clients
list<IDataItemObserver*> clientList(0); unordered_set<IDataItemObserver*> clientSet(0);
for (auto each : dataItemIdsToBeSent) { for (auto each : dataItemIdsToBeSent) {
list<IDataItemObserver*> clients(0); auto clients = mParent->mDataItemToClients.getValSetPtr(each);
mParent->mDataItemIndex->getListOfSubscribedClients(each, clients); if (nullptr != clients) {
for (auto each_cient: clients) { clientSet.insert(clients->begin(), clients->end());
clientList.push_back(each_cient);
} }
} }
clientList.unique();
for (auto client : clientList) { for (auto client : clientSet) {
list<DataItemId> dataItemIdsSubscribedByThisClient(0); unordered_set<DataItemId> dataItemIdsForThisClient(
list<DataItemId> dataItemIdsToBeSentForThisClient(0); mParent->mClientToDataItems.getValSet(client));
mParent->mClientIndex->getSubscribedList( for (auto id : dataItemIdsForThisClient) {
client, dataItemIdsSubscribedByThisClient); if (dataItemIdsToBeSent.find(id) == dataItemIdsToBeSent.end()) {
dataItemIdsSubscribedByThisClient.sort(); dataItemIdsForThisClient.erase(id);
dataItemIdsToBeSent.sort(); }
}
set_intersection(dataItemIdsToBeSent.begin(), mParent->sendCachedDataItems(dataItemIdsForThisClient, client);
dataItemIdsToBeSent.end(),
dataItemIdsSubscribedByThisClient.begin(),
dataItemIdsSubscribedByThisClient.end(),
inserter(dataItemIdsToBeSentForThisClient,
dataItemIdsToBeSentForThisClient.begin()));
mParent->sendCachedDataItems(dataItemIdsToBeSentForThisClient, client);
dataItemIdsSubscribedByThisClient.clear();
dataItemIdsToBeSentForThisClient.clear();
} }
} }
SystemStatusOsObserver* mParent; SystemStatusOsObserver* mParent;
const list<IDataItemCore*> mDList; const vector<IDataItemCore*> mDiVec;
}; };
mContext.mMsgTask->sendMsg(new (nothrow) HandleNotify(this, dataItemList));
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));
}
}
} }
/****************************************************************************** /******************************************************************************
@@ -442,7 +381,7 @@ void SystemStatusOsObserver::turnOn(DataItemId dit, int timeOut)
} }
// Check if data item exists in mActiveRequestCount // Check if data item exists in mActiveRequestCount
map<DataItemId, int>::iterator citer = mActiveRequestCount.find(dit); DataItemIdToInt::iterator citer = mActiveRequestCount.find(dit);
if (citer == mActiveRequestCount.end()) { if (citer == mActiveRequestCount.end()) {
// Data item not found in map // Data item not found in map
// Add reference count as 1 and add dataitem to map // Add reference count as 1 and add dataitem to map
@@ -480,7 +419,7 @@ void SystemStatusOsObserver::turnOff(DataItemId dit)
} }
// Check if data item exists in mActiveRequestCount // Check if data item exists in mActiveRequestCount
map<DataItemId, int>::iterator citer = mActiveRequestCount.find(dit); DataItemIdToInt::iterator citer = mActiveRequestCount.find(dit);
if (citer != mActiveRequestCount.end()) { if (citer != mActiveRequestCount.end()) {
// found // found
citer->second--; citer->second--;
@@ -506,87 +445,127 @@ void SystemStatusOsObserver::turnOff(DataItemId 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 Helpers
******************************************************************************/ ******************************************************************************/
void SystemStatusOsObserver::sendFirstResponse(
const list<DataItemId>& l, IDataItemObserver* to)
{
if (l.empty()) {
LOC_LOGV("list is empty. Nothing to do. Exiting");
return;
}
string clientName;
to->getName(clientName);
list<IDataItemCore*> dataItems(0);
for (auto each : l) {
map<DataItemId, IDataItemCore*>::const_iterator 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_back(citer->second);
}
}
if (dataItems.empty()) {
LOC_LOGV("No items to notify. Nothing to do. Exiting");
return;
}
to->notify(dataItems);
}
void SystemStatusOsObserver::sendCachedDataItems( void SystemStatusOsObserver::sendCachedDataItems(
const list<DataItemId>& l, IDataItemObserver* to) const unordered_set<DataItemId>& s, IDataItemObserver* to)
{ {
string clientName; if (nullptr == to) {
to->getName(clientName); LOC_LOGv("client pointer is NULL.");
list<IDataItemCore*> dataItems(0); } else {
string clientName;
to->getName(clientName);
list<IDataItemCore*> dataItems(0);
for (auto each : l) { for (auto each : s) {
string dv; auto citer = mDataItemCache.find(each);
IDataItemCore* di = mDataItemCache[each]; if (citer != mDataItemCache.end()) {
di->stringify(dv); string dv;
LOC_LOGI("DataItem: %s >> %s", dv.c_str(), clientName.c_str()); citer->second->stringify(dv);
dataItems.push_back(di); 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);
}
} }
to->notify(dataItems);
} }
void SystemStatusOsObserver::updateCache(IDataItemCore* d, bool& dataItemUpdated) bool SystemStatusOsObserver::updateCache(IDataItemCore* d)
{ {
if (nullptr == d) { bool dataItemUpdated = false;
return;
}
// Check if data item exists in cache // Request systemstatus to record this dataitem in its cache
map<DataItemId, IDataItemCore*>::iterator citer = // if the return is false, it means that SystemStatus is not
mDataItemCache.find(d->getId()); // handling it, so SystemStatusOsObserver also doesn't.
if (citer == mDataItemCache.end()) { // So it has to be true to proceed.
// New data item; not found in cache if (nullptr != d && mSystemStatus->eventDataItemNotify(d)) {
IDataItemCore* dataitem = DataItemsFactoryProxy::createNewDataItem(d->getId()); auto citer = mDataItemCache.find(d->getId());
if (nullptr == dataitem) { if (citer == mDataItemCache.end()) {
return; // 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);
} }
// Copy the contents of the data item if (dataItemUpdated) {
dataitem->copy(d); LOC_LOGV("DataItem:%d updated:%d", d->getId(), dataItemUpdated);
pair<DataItemId, IDataItemCore*> cpair(d->getId(), dataitem);
// Insert in mDataItemCache
mDataItemCache.insert(cpair);
dataItemUpdated = true;
}
else {
// Found in cache; Update cache if necessary
if(0 == citer->second->copy(d, &dataItemUpdated)) {
return;
} }
} }
if (dataItemUpdated) { return dataItemUpdated;
LOC_LOGV("DataItem:%d updated:%d", d->getId(), dataItemUpdated);
}
} }
} // namespace loc_core } // namespace loc_core

View File

@@ -39,7 +39,9 @@
#include <MsgTask.h> #include <MsgTask.h>
#include <DataItemId.h> #include <DataItemId.h>
#include <IOsObserver.h> #include <IOsObserver.h>
#include <platform_lib_log_util.h> #include <loc_pla.h>
#include <log_util.h>
#include <LocUnorderedSetMap.h>
namespace loc_core namespace loc_core
{ {
@@ -47,25 +49,29 @@ namespace loc_core
SystemStatusOsObserver SystemStatusOsObserver
******************************************************************************/ ******************************************************************************/
using namespace std; using namespace std;
using namespace loc_util;
// Forward Declarations // Forward Declarations
class IDataItemCore; class IDataItemCore;
template<typename CT, typename DIT> class IClientIndex; class SystemStatus;
template<typename CT, typename DIT> class IDataItemIndex; 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 SystemContext { struct ObserverContext {
IDataItemSubscription* mSubscriptionObj; IDataItemSubscription* mSubscriptionObj;
IFrameworkActionReq* mFrameworkActionReqObj; IFrameworkActionReq* mFrameworkActionReqObj;
const MsgTask* mMsgTask; const MsgTask* mMsgTask;
SystemStatusOsObserver* mSSObserver;
inline SystemContext() : inline ObserverContext(const MsgTask* msgTask, SystemStatusOsObserver* observer) :
mSubscriptionObj(NULL), mSubscriptionObj(NULL), mFrameworkActionReqObj(NULL),
mFrameworkActionReqObj(NULL), mMsgTask(msgTask), mSSObserver(observer) {}
mMsgTask(NULL) {}
}; };
typedef map<IDataItemObserver*, list<DataItemId>> ObserverReqCache;
// Clients wanting to get data from OS/Framework would need to // Clients wanting to get data from OS/Framework would need to
// subscribe with OSObserver using IDataItemSubscription interface. // subscribe with OSObserver using IDataItemSubscription interface.
// Such clients would need to implement IDataItemObserver interface // Such clients would need to implement IDataItemObserver interface
@@ -74,57 +80,92 @@ class SystemStatusOsObserver : public IOsObserver {
public: public:
// ctor // ctor
SystemStatusOsObserver(const MsgTask* msgTask); 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 // dtor
~SystemStatusOsObserver(); ~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 // To set the subscription object
virtual void setSubscriptionObj(IDataItemSubscription* subscriptionObj); virtual void setSubscriptionObj(IDataItemSubscription* subscriptionObj);
// To set the framework action request object // To set the framework action request object
inline void setFrameworkActionReqObj(IFrameworkActionReq* frameworkActionReqObj) { inline void setFrameworkActionReqObj(IFrameworkActionReq* frameworkActionReqObj) {
mContext.mFrameworkActionReqObj = frameworkActionReqObj; mContext.mFrameworkActionReqObj = frameworkActionReqObj;
#ifdef USE_GLIB
if (mBackHaulConnectReqCount > 0) {
connectBackhaul();
mBackHaulConnectReqCount = 0;
}
#endif
} }
// IDataItemSubscription Overrides // IDataItemSubscription Overrides
virtual void subscribe(const list<DataItemId>& l, IDataItemObserver* client); inline virtual void subscribe(const list<DataItemId>& l, IDataItemObserver* client) override {
virtual void updateSubscription(const list<DataItemId>& l, IDataItemObserver* client); subscribe(l, client, false);
virtual void requestData(const list<DataItemId>& l, IDataItemObserver* client); }
virtual void unsubscribe(const list<DataItemId>& l, IDataItemObserver* client); virtual void updateSubscription(const list<DataItemId>& l, IDataItemObserver* client) override;
virtual void unsubscribeAll(IDataItemObserver* client); 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 // IDataItemObserver Overrides
virtual void notify(const list<IDataItemCore*>& dlist); virtual void notify(const list<IDataItemCore*>& dlist) override;
inline virtual void getName(string& name) { inline virtual void getName(string& name) override {
name = mAddress; name = mAddress;
} }
// IFrameworkActionReq Overrides // IFrameworkActionReq Overrides
virtual void turnOn(DataItemId dit, int timeOut = 0); virtual void turnOn(DataItemId dit, int timeOut = 0) override;
virtual void turnOff(DataItemId dit); virtual void turnOff(DataItemId dit) override;
#ifdef USE_GLIB
virtual bool connectBackhaul() override;
virtual bool disconnectBackhaul();
#endif
private: private:
SystemContext mContext; SystemStatus* mSystemStatus;
ObserverContext mContext;
const string mAddress; const string mAddress;
IClientIndex<IDataItemObserver*, DataItemId>* mClientIndex; ClientToDataItems mClientToDataItems;
IDataItemIndex<IDataItemObserver*, DataItemId>* mDataItemIndex; DataItemToClients mDataItemToClients;
map<DataItemId, IDataItemCore*> mDataItemCache; DataItemIdToCore mDataItemCache;
map<DataItemId, int> mActiveRequestCount; DataItemIdToInt mActiveRequestCount;
// Cache the subscribe and requestData till subscription obj is obtained // Cache the subscribe and requestData till subscription obj is obtained
ObserverReqCache mSubscribeReqCache;
ObserverReqCache mReqDataCache;
void cacheObserverRequest(ObserverReqCache& reqCache, void cacheObserverRequest(ObserverReqCache& reqCache,
const list<DataItemId>& l, IDataItemObserver* client); 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 // Helpers
void sendFirstResponse(const list<DataItemId>& l, IDataItemObserver* to); void sendCachedDataItems(const unordered_set<DataItemId>& s, IDataItemObserver* to);
void sendCachedDataItems(const list<DataItemId>& l, IDataItemObserver* to); bool updateCache(IDataItemCore* d);
void updateCache(IDataItemCore* d, bool& dataItemUpdated); inline void logMe(const unordered_set<DataItemId>& l) {
inline void logMe(const list<DataItemId>& l) { IF_LOC_LOGD {
for (auto id : l) { for (auto id : l) {
LOC_LOGD("DataItem %d", id); LOC_LOGD("DataItem %d", id);
}
} }
} }
}; };

View File

@@ -1,17 +1,17 @@
# configure.ac -- Autoconf script for gps loc-stub # configure.ac -- Autoconf script for gps loc-core
# #
# Process this file with autoconf to produce a configure script # Process this file with autoconf to produce a configure script
# Requires autoconf tool later than 2.61 # Requires autoconf tool later than 2.61
AC_PREREQ(2.61) AC_PREREQ(2.61)
# Initialize the gps loc-stub package version 1.0.0 # Initialize the gps loc-hal package version 1.0.0
AC_INIT([loc-stub],1.0.0) AC_INIT([loc-core],1.0.0)
# Does not strictly follow GNU Coding standards # Does not strictly follow GNU Coding standards
AM_INIT_AUTOMAKE([foreign]) AM_INIT_AUTOMAKE([foreign])
# Disables auto rebuilding of configure, Makefile.ins # Disables auto rebuilding of configure, Makefile.ins
AM_MAINTAINER_MODE AM_MAINTAINER_MODE
# Verifies the --srcdir is correct by checking for the path # Verifies the --srcdir is correct by checking for the path
AC_CONFIG_SRCDIR([Makefile.am]) AC_CONFIG_SRCDIR([loc-core.pc.in])
# defines some macros variable to be included by source # defines some macros variable to be included by source
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
@@ -29,16 +29,32 @@ AC_PROG_MAKE_SET
PKG_PROG_PKG_CONFIG PKG_PROG_PKG_CONFIG
# Checks for libraries. # Checks for libraries.
AC_ARG_WITH([hardware_include], PKG_CHECK_MODULES([GPSUTILS], [gps-utils])
AC_HELP_STRING([--with-hardware-include=@<:@dir@:>@], AC_SUBST([GPSUTILS_CFLAGS])
[Specify the location of the hardware headers]), AC_SUBST([GPSUTILS_LIBS])
[hardware_incdir=$withval],
with_hardware_include=no)
if test "x$with_hardware_include" != "xno"; then AC_ARG_WITH([core_includes],
CPPFLAGS="${CPPFLAGS} -I${hardware_incdir}" 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 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_ARG_WITH([glib],
AC_HELP_STRING([--with-glib], AC_HELP_STRING([--with-glib],
[enable glib, building HLOS systems which use glib])) [enable glib, building HLOS systems which use glib]))
@@ -60,8 +76,7 @@ AM_CONDITIONAL(USE_GLIB, test "x${with_glib}" = "xyes")
AC_CONFIG_FILES([ \ AC_CONFIG_FILES([ \
Makefile \ Makefile \
src/Makefile \ loc-core.pc \
loc-stub.pc
]) ])
AC_OUTPUT AC_OUTPUT

View File

@@ -0,0 +1,496 @@
/* 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__

View File

@@ -67,7 +67,13 @@ typedef enum e_DataItemId {
BTLE_SCAN_DATA_ITEM_ID, BTLE_SCAN_DATA_ITEM_ID,
BT_SCAN_DATA_ITEM_ID, BT_SCAN_DATA_ITEM_ID,
OEM_GTP_UPLOAD_TRIGGER_READY_ITEM_ID, OEM_GTP_UPLOAD_TRIGGER_READY_ITEM_ID,
MAX_DATA_ITEM_ID
MAX_DATA_ITEM_ID,
// 26 -
BATTERY_LEVEL_DATA_ITEM_ID,
MAX_DATA_ITEM_ID_1_1,
} DataItemId; } DataItemId;
#endif // #ifndef __DATAITEMID_H__ #endif // #ifndef __DATAITEMID_H__

View File

@@ -32,7 +32,8 @@
#include <DataItemId.h> #include <DataItemId.h>
#include <IDataItemCore.h> #include <IDataItemCore.h>
#include <DataItemsFactoryProxy.h> #include <DataItemsFactoryProxy.h>
#include <platform_lib_log_util.h> #include <loc_pla.h>
#include <log_util.h>
namespace loc_core namespace loc_core
{ {
@@ -68,7 +69,7 @@ IDataItemCore* DataItemsFactoryProxy::createNewDataItem(DataItemId id)
getConcreteDIFunc = (get_concrete_data_item_fn * ) getConcreteDIFunc = (get_concrete_data_item_fn * )
dlsym(dataItemLibHandle, DATA_ITEMS_GET_CONCRETE_DI); dlsym(dataItemLibHandle, DATA_ITEMS_GET_CONCRETE_DI);
if (NULL != getConcreteDIFunc) { if (NULL != getConcreteDIFunc) {
LOC_LOGD("Loaded function %s : %x",DATA_ITEMS_GET_CONCRETE_DI,getConcreteDIFunc); LOC_LOGD("Loaded function %s : %p",DATA_ITEMS_GET_CONCRETE_DI,getConcreteDIFunc);
mydi = (*getConcreteDIFunc)(id); mydi = (*getConcreteDIFunc)(id);
} }
else { else {

View File

@@ -1,171 +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.
*
*/
#include <algorithm>
#include <iterator>
#include <string>
#include <platform_lib_log_util.h>
#include <ClientIndex.h>
#include <IDataItemObserver.h>
#include <DataItemId.h>
using namespace std;
using namespace loc_core;
template <typename CT, typename DIT>
inline ClientIndex <CT,DIT> :: ClientIndex () {}
template <typename CT, typename DIT>
inline ClientIndex <CT,DIT> :: ~ClientIndex () {}
template <typename CT, typename DIT>
bool ClientIndex <CT,DIT> :: isSubscribedClient (CT client) {
bool result = false;
ENTRY_LOG ();
typename map < CT, list <DIT> > :: iterator it =
mDataItemsPerClientMap.find (client);
if (it != mDataItemsPerClientMap.end ()) {
result = true;
}
EXIT_LOG_WITH_ERROR ("%d",result);
return result;
}
template <typename CT, typename DIT>
void ClientIndex <CT,DIT> :: getSubscribedList (CT client, list <DIT> & out) {
ENTRY_LOG ();
typename map < CT, list <DIT> > :: iterator it =
mDataItemsPerClientMap.find (client);
if (it != mDataItemsPerClientMap.end ()) {
out = it->second;
}
EXIT_LOG_WITH_ERROR ("%d",0);
}
template <typename CT, typename DIT>
int ClientIndex <CT,DIT> :: remove (CT client) {
int result = 0;
ENTRY_LOG ();
mDataItemsPerClientMap.erase (client);
EXIT_LOG_WITH_ERROR ("%d",result);
return result;
}
template <typename CT, typename DIT>
void ClientIndex <CT,DIT> :: remove (const list <DIT> & r, list <CT> & out) {
ENTRY_LOG ();
typename map < CT, list <DIT> > :: iterator dicIter =
mDataItemsPerClientMap.begin ();
while (dicIter != mDataItemsPerClientMap.end()) {
typename list <DIT> :: const_iterator it = r.begin ();
for (; it != r.end (); ++it) {
typename list <DIT> :: iterator iter =
find (dicIter->second.begin (), dicIter->second.end (), *it);
if (iter != dicIter->second.end ()) {
dicIter->second.erase (iter);
}
}
if (dicIter->second.empty ()) {
out.push_back (dicIter->first);
// Post-increment operator increases the iterator but returns the
// prevous one that will be invalidated by erase()
mDataItemsPerClientMap.erase (dicIter++);
} else {
++dicIter;
}
}
EXIT_LOG_WITH_ERROR ("%d",0);
}
template <typename CT, typename DIT>
void ClientIndex <CT,DIT> :: remove
(
CT client,
const list <DIT> & r,
list <DIT> & out
)
{
ENTRY_LOG ();
typename map < CT, list <DIT> > :: iterator dicIter =
mDataItemsPerClientMap.find (client);
if (dicIter != mDataItemsPerClientMap.end ()) {
set_intersection (dicIter->second.begin (), dicIter->second.end (),
r.begin (), r.end (),
inserter (out,out.begin ()));
if (!out.empty ()) {
typename list <DIT> :: iterator it = out.begin ();
for (; it != out.end (); ++it) {
dicIter->second.erase (find (dicIter->second.begin (),
dicIter->second.end (),
*it));
}
}
if (dicIter->second.empty ()) {
mDataItemsPerClientMap.erase (dicIter);
EXIT_LOG_WITH_ERROR ("%d",0);
}
}
EXIT_LOG_WITH_ERROR ("%d",0);
}
template <typename CT, typename DIT>
void ClientIndex <CT,DIT> :: add
(
CT client,
const list <DIT> & l,
list <DIT> & out
)
{
ENTRY_LOG ();
list <DIT> difference;
typename map < CT, list <DIT> > :: iterator dicIter =
mDataItemsPerClientMap.find (client);
if (dicIter != mDataItemsPerClientMap.end ()) {
set_difference (l.begin (), l.end (),
dicIter->second.begin (), dicIter->second.end (),
inserter (difference,difference.begin ()));
if (!difference.empty ()) {
difference.sort ();
out = difference;
dicIter->second.merge (difference);
dicIter->second.unique ();
}
} else {
out = l;
pair < CT, list <DIT> > dicnpair (client, out);
mDataItemsPerClientMap.insert (dicnpair);
}
EXIT_LOG_WITH_ERROR ("%d",0);
}
// Explicit instantiation must occur in same namespace where class is defined
namespace loc_core
{
template class ClientIndex <IDataItemObserver *, DataItemId>;
template class ClientIndex <string, DataItemId>;
}

View File

@@ -1,70 +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 __CLIENTINDEX_H__
#define __CLIENTINDEX_H__
#include <list>
#include <map>
#include <IClientIndex.h>
using loc_core::IClientIndex;
namespace loc_core
{
template <typename CT, typename DIT>
class ClientIndex : public IClientIndex <CT, DIT> {
public:
ClientIndex ();
~ClientIndex ();
bool isSubscribedClient (CT client);
void getSubscribedList (CT client, std :: list <DIT> & out);
int remove (CT client);
void remove (const std :: list <DIT> & r, std :: list <CT> & out);
void remove (CT client, const std :: list <DIT> & r, std :: list <DIT> & out);
void add (CT client, const std :: list <DIT> & l, std :: list <DIT> & out);
private:
//Data members
std :: map < CT , std :: list <DIT> > mDataItemsPerClientMap;
};
} // namespace loc_core
#endif // #ifndef __CLIENTINDEX_H__

View File

@@ -1,202 +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.
*
*/
#include <string>
#include <algorithm>
#include <iterator>
#include <DataItemIndex.h>
#include <platform_lib_log_util.h>
#include <IDataItemObserver.h>
#include <DataItemId.h>
using namespace std;
using namespace loc_core;
template <typename CT, typename DIT>
inline DataItemIndex <CT,DIT> :: DataItemIndex () {}
template <typename CT, typename DIT>
inline DataItemIndex <CT,DIT> :: ~DataItemIndex () {}
template <typename CT, typename DIT>
void DataItemIndex <CT,DIT> :: getListOfSubscribedClients
(
DIT id,
list <CT> & out
)
{
typename map < DIT, list <CT> > :: iterator cdiIter =
mClientsPerDataItemMap.find (id);
if (cdiIter != mClientsPerDataItemMap.end ()) {
out = cdiIter->second;
}
}
template <typename CT, typename DIT>
int DataItemIndex <CT,DIT> :: remove (DIT id) {
int result = 0;
ENTRY_LOG ();
mClientsPerDataItemMap.erase (id);
EXIT_LOG_WITH_ERROR ("%d",result);
return result;
}
template <typename CT, typename DIT>
void DataItemIndex <CT,DIT> :: remove (const list <CT> & r, list <DIT> & out) {
ENTRY_LOG ();
typename map < DIT, list <CT> > :: iterator cdiIter =
mClientsPerDataItemMap.begin ();
while (cdiIter != mClientsPerDataItemMap.end()) {
typename list <CT> :: const_iterator it = r.begin ();
for (; it != r.end (); ++it) {
typename list <CT> :: iterator iter =
find
(
cdiIter->second.begin (),
cdiIter->second.end (),
*it
);
if (iter != cdiIter->second.end ()) {
cdiIter->second.erase (iter);
}
}
if (cdiIter->second.empty ()) {
out.push_back (cdiIter->first);
// Post-increment operator increases the iterator but returns the
// prevous one that will be invalidated by erase()
mClientsPerDataItemMap.erase (cdiIter++);
} else {
++cdiIter;
}
}
EXIT_LOG_WITH_ERROR ("%d",0);
}
template <typename CT, typename DIT>
void DataItemIndex <CT,DIT> :: remove
(
DIT id,
const list <CT> & r,
list <CT> & out
)
{
ENTRY_LOG ();
typename map < DIT, list <CT> > :: iterator cdiIter =
mClientsPerDataItemMap.find (id);
if (cdiIter != mClientsPerDataItemMap.end ()) {
set_intersection (cdiIter->second.begin (), cdiIter->second.end (),
r.begin (), r.end (),
inserter (out, out.begin ()));
if (!out.empty ()) {
typename list <CT> :: iterator it = out.begin ();
for (; it != out.end (); ++it) {
cdiIter->second.erase (find (cdiIter->second.begin (),
cdiIter->second.end (),
*it));
}
}
if (cdiIter->second.empty ()) {
mClientsPerDataItemMap.erase (cdiIter);
EXIT_LOG_WITH_ERROR ("%d",0);
}
}
EXIT_LOG_WITH_ERROR ("%d",0);
}
template <typename CT, typename DIT>
void DataItemIndex <CT,DIT> :: add
(
DIT id,
const list <CT> & l,
list <CT> & out
)
{
ENTRY_LOG ();
list <CT> difference;
typename map < DIT, list <CT> > :: iterator cdiIter =
mClientsPerDataItemMap.find (id);
if (cdiIter != mClientsPerDataItemMap.end ()) {
set_difference (l.begin (), l.end (),
cdiIter->second.begin (), cdiIter->second.end (),
inserter (difference, difference.begin ()));
if (!difference.empty ()) {
difference.sort ();
out = difference;
cdiIter->second.merge (difference);
}
} else {
out = l;
pair < DIT, list <CT> > cndipair (id, out);
mClientsPerDataItemMap.insert (cndipair);
}
EXIT_LOG_WITH_ERROR ("%d",0);
}
template <typename CT, typename DIT>
void DataItemIndex <CT,DIT> :: add
(
CT client,
const list <DIT> & l,
list <DIT> & out
)
{
ENTRY_LOG ();
typename map < DIT, list <CT> > :: iterator cdiIter;
typename list <DIT> :: const_iterator it = l.begin ();
for (; it != l.end (); ++it) {
cdiIter = mClientsPerDataItemMap.find (*it);
if (cdiIter == mClientsPerDataItemMap.end ()) {
out.push_back (*it);
pair < DIT, list <CT> > cndiPair (*it, list <CT> (1, client));
mClientsPerDataItemMap.insert (cndiPair);
} else {
typename list<CT> :: iterator clientIter =
find
(
cdiIter->second.begin (),
cdiIter->second.end (),
client
);
if (clientIter == cdiIter->second.end()) {
cdiIter->second.push_back (client);
}
}
}
EXIT_LOG_WITH_ERROR ("%d",0);
}
// Explicit instantiation must occur in same namespace where class is defined
namespace loc_core
{
template class DataItemIndex <IDataItemObserver *, DataItemId>;
template class DataItemIndex <string, DataItemId>;
}

View File

@@ -1,70 +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 __DATAITEMINDEX_H__
#define __DATAITEMINDEX_H__
#include <list>
#include <map>
#include <IDataItemIndex.h>
using loc_core::IDataItemIndex;
namespace loc_core
{
template <typename CT, typename DIT>
class DataItemIndex : public IDataItemIndex <CT, DIT> {
public:
DataItemIndex ();
~DataItemIndex ();
void getListOfSubscribedClients (DIT id, std :: list <CT> & out);
int remove (DIT id);
void remove (const std :: list <CT> & r, std :: list <DIT> & out);
void remove (DIT id, const std :: list <CT> & r, std :: list <CT> & out);
void add (DIT id, const std :: list <CT> & l, std :: list <CT> & out);
void add (CT client, const std :: list <DIT> & l, std :: list <DIT> & out);
private:
std :: map < DIT, std :: list <CT> > mClientsPerDataItemMap;
};
} // namespace loc_core
#endif // #ifndef __DATAITEMINDEX_H__

View File

@@ -1,83 +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 __ICLIENTINDEX_H__
#define __ICLIENTINDEX_H__
#include <list>
namespace loc_core
{
template <typename CT, typename DIT>
class IClientIndex {
public:
// Checks if client is subscribed
virtual bool isSubscribedClient (CT client) = 0;
// gets subscription list
virtual void getSubscribedList (CT client, std :: list <DIT> & out) = 0;
// removes an entry
virtual int remove (CT client) = 0;
// removes std :: list of data items and returns a list of clients
// removed if any.
virtual void remove
(
const std :: list <DIT> & r,
std :: list <CT> & out
) = 0;
// removes list of data items indexed by client and returns list
// of data items removed if any.
virtual void remove
(
CT client,
const std :: list <DIT> & r,
std :: list <DIT> & out
) = 0;
// adds/modifies entry in map and returns new data items added.
virtual void add
(
CT client,
const std :: list <DIT> & l,
std :: list <DIT> & out
) = 0;
// dtor
virtual ~IClientIndex () {}
};
} // namespace loc_core
#endif // #ifndef __ICLIENTINDEX_H__

View File

@@ -1,94 +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 __IDATAITEMINDEX_H__
#define __IDATAITEMINDEX_H__
#include <list>
namespace loc_core
{
template <typename CT, typename DIT>
class IDataItemIndex {
public:
// gets std :: list of subscribed clients
virtual void getListOfSubscribedClients
(
DIT id,
std :: list <CT> & out
) = 0;
// removes an entry from
virtual int remove (DIT id) = 0;
// removes list of clients and returns a list of data items
// removed if any.
virtual void remove
(
const std :: list <CT> & r,
std :: list <DIT> & out
) = 0;
// removes list of clients indexed by data item and returns list of
// clients removed if any.
virtual void remove
(
DIT id,
const std :: list <CT> & r,
std :: list <CT> & out
) = 0;
// adds/modifies entry and returns new clients added
virtual void add
(
DIT id,
const std :: list <CT> & l,
std :: list <CT> & out
) = 0;
// adds/modifies entry and returns yet to subscribe list of data items
virtual void add
(
CT client,
const std :: list <DIT> & l,
std :: list <DIT> & out
) = 0;
// dtor
virtual ~IDataItemIndex () {}
};
} // namespace loc_core
#endif // #ifndef __IDATAITEMINDEX_H__

View File

@@ -1,64 +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.
*
*/
#include <string>
#include <IndexFactory.h>
#include <IClientIndex.h>
#include <ClientIndex.h>
#include <IDataItemIndex.h>
#include <DataItemIndex.h>
#include <IDataItemObserver.h>
#include <DataItemId.h>
using namespace std;
using loc_core::IClientIndex;
using loc_core::IDataItemIndex;
using loc_core::IDataItemObserver;
using namespace loc_core;
template <typename CT, typename DIT>
inline IClientIndex <CT, DIT> * IndexFactory <CT, DIT> :: createClientIndex
()
{
return new (nothrow) ClientIndex <CT, DIT> ();
}
template <typename CT, typename DIT>
inline IDataItemIndex <CT, DIT> * IndexFactory <CT, DIT> :: createDataItemIndex
()
{
return new (nothrow) DataItemIndex <CT, DIT> ();
}
// Explicit instantiation must occur in same namespace where class is defined
namespace loc_core
{
template class IndexFactory <IDataItemObserver *, DataItemId>;
template class IndexFactory <string, DataItemId>;
}

View File

@@ -1,48 +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 __INDEXFACTORY_H__
#define __INDEXFACTORY_H__
#include <IClientIndex.h>
#include <IDataItemIndex.h>
namespace loc_core
{
template <typename CT, typename DIT>
class IndexFactory {
public:
static IClientIndex <CT, DIT> * createClientIndex ();
static IDataItemIndex <CT, DIT> * createDataItemIndex ();
};
} // namespace loc_core
#endif // #ifndef __INDEXFACTORY_H__

10
gps/core/loc-core.pc.in Normal file
View File

@@ -0,0 +1,10 @@
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

View File

@@ -30,9 +30,10 @@
#define LOG_NDEBUG 0 #define LOG_NDEBUG 0
#define LOG_TAG "LocSvc_core_log" #define LOG_TAG "LocSvc_core_log"
#include <log_util.h>
#include <loc_log.h> #include <loc_log.h>
#include <loc_core_log.h> #include <loc_core_log.h>
#include <platform_lib_includes.h> #include <loc_pla.h>
void LocPosMode::logv() const void LocPosMode::logv() const
{ {
@@ -100,26 +101,6 @@ 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); return loc_get_name_from_val(loc_eng_position_recurrences, loc_eng_position_recurrence_num, (long) recur);
} }
static const loc_name_val_s_type loc_eng_aiding_data_bits[] =
{
NAME_VAL( LOC_GPS_DELETE_EPHEMERIS ),
NAME_VAL( LOC_GPS_DELETE_ALMANAC ),
NAME_VAL( LOC_GPS_DELETE_POSITION ),
NAME_VAL( LOC_GPS_DELETE_TIME ),
NAME_VAL( LOC_GPS_DELETE_IONO ),
NAME_VAL( LOC_GPS_DELETE_UTC ),
NAME_VAL( LOC_GPS_DELETE_HEALTH ),
NAME_VAL( LOC_GPS_DELETE_SVDIR ),
NAME_VAL( LOC_GPS_DELETE_SVSTEER ),
NAME_VAL( LOC_GPS_DELETE_SADATA ),
NAME_VAL( LOC_GPS_DELETE_RTI ),
NAME_VAL( LOC_GPS_DELETE_CELLDB_INFO ),
NAME_VAL( LOC_GPS_DELETE_ALL)
};
static const int loc_eng_aiding_data_bit_num = sizeof(loc_eng_aiding_data_bits) / sizeof(loc_name_val_s_type);
const char* loc_get_aiding_data_mask_names(LocGpsAidingData /*data*/) const char* loc_get_aiding_data_mask_names(LocGpsAidingData /*data*/)
{ {
return NULL; return NULL;

View File

@@ -70,6 +70,24 @@ public:
*/ */
virtual void turnOff (DataItemId dit) = 0; 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 * @brief Destructor
* @details Destructor * @details Destructor

View File

@@ -90,6 +90,10 @@ public:
// IFrameworkActionReq Overrides // IFrameworkActionReq Overrides
inline virtual void turnOn (DataItemId /*dit*/, int /*timeOut*/){} inline virtual void turnOn (DataItemId /*dit*/, int /*timeOut*/){}
inline virtual void turnOff (DataItemId /*dit*/) {} inline virtual void turnOff (DataItemId /*dit*/) {}
#ifdef USE_GLIB
inline virtual bool connectBackhaul() {}
inline virtual bool disconnectBackhaul() {}
#endif
/** /**
* @brief Destructor * @brief Destructor

View File

@@ -42,8 +42,9 @@ DEBUG_LEVEL = 2
# MSA = 0x04 # MSA = 0x04
# ON_DEMAND_TIME = 0x10 # ON_DEMAND_TIME = 0x10
# GEOFENCE = 0x20 # GEOFENCE = 0x20
# default = ON_DEMAND_TIME | MSA | MSB | SCHEDULING | GEOFENCE # MEASUREMENTS = 0x40
CAPABILITIES=0x37 # default = ON_DEMAND_TIME | MSA | MSB | SCHEDULING | GEOFENCE | MEASUREMENTS
CAPABILITIES=0x77
# Accuracy threshold for intermediate positions # Accuracy threshold for intermediate positions
# less accurate positions are ignored, 0 for passing all positions # less accurate positions are ignored, 0 for passing all positions

View File

@@ -54,8 +54,8 @@ OSNLP_ACTION = com.android.location.service.v3.NetworkLocationProvider
# REGION_OSNLP_PACKAGE/REGION_OSNLP_ACTION: # REGION_OSNLP_PACKAGE/REGION_OSNLP_ACTION:
# These two values will be used as alternative # These two values will be used as alternative
# for particular region where default NLP is not functional. # for particular region where default NLP is not functional.
REGION_OSNLP_PACKAGE = com.amap.android.location #REGION_OSNLP_PACKAGE = com.baidu.map.location
REGION_OSNLP_ACTION = com.android.location.service.v3.NetworkLocationProvider #REGION_OSNLP_ACTION = com.android.location.service.v3.NetworkLocationProvider
# Threshold period for ZPP triggers # Threshold period for ZPP triggers
ZPP_TRIGGER_THRESHOLD=60000 ZPP_TRIGGER_THRESHOLD=60000
@@ -212,7 +212,7 @@ HARDWARE_TYPE=all
PROCESS_NAME=lowi-server PROCESS_NAME=lowi-server
PROCESS_ARGUMENT= PROCESS_ARGUMENT=
PROCESS_STATE=DISABLED PROCESS_STATE=ENABLED
PROCESS_GROUPS=gps net_admin wifi inet oem_2901 PROCESS_GROUPS=gps net_admin wifi inet oem_2901
PREMIUM_FEATURE=0 PREMIUM_FEATURE=0
IZAT_FEATURE_MASK=0xf303 IZAT_FEATURE_MASK=0xf303

View File

@@ -30,7 +30,7 @@
#define LOG_TAG "LocSvc_Agps" #define LOG_TAG "LocSvc_Agps"
#include <Agps.h> #include <Agps.h>
#include <platform_lib_includes.h> #include <loc_pla.h>
#include <ContextBase.h> #include <ContextBase.h>
#include <loc_timer.h> #include <loc_timer.h>

View File

@@ -34,7 +34,8 @@
#include <list> #include <list>
#include <MsgTask.h> #include <MsgTask.h>
#include <gps_extended_c.h> #include <gps_extended_c.h>
#include <platform_lib_log_util.h> #include <loc_pla.h>
#include <log_util.h>
/* ATL callback function pointers /* ATL callback function pointers
* Passed in by Adapter to AgpsManager */ * Passed in by Adapter to AgpsManager */
@@ -277,34 +278,29 @@ public:
mAgnssNif(NULL), mInternetNif(NULL), mDsNif(NULL) {} mAgnssNif(NULL), mInternetNif(NULL), mDsNif(NULL) {}
/* Register callbacks */ /* Register callbacks */
void registerCallbacks( inline void registerATLCallbacks(AgpsAtlOpenStatusCb atlOpenStatusCb,
AgnssStatusIpV4Cb frameworkStatusV4Cb,
AgpsAtlOpenStatusCb atlOpenStatusCb,
AgpsAtlCloseStatusCb atlCloseStatusCb, AgpsAtlCloseStatusCb atlCloseStatusCb,
AgpsDSClientInitFn dsClientInitFn, AgpsDSClientInitFn dsClientInitFn,
AgpsDSClientOpenAndStartDataCallFn dsClientOpenAndStartDataCallFn, AgpsDSClientOpenAndStartDataCallFn dsClientOpenAndStartDataCallFn,
AgpsDSClientStopDataCallFn dsClientStopDataCallFn, AgpsDSClientStopDataCallFn dsClientStopDataCallFn,
AgpsDSClientCloseDataCallFn dsClientCloseDataCallFn, AgpsDSClientCloseDataCallFn dsClientCloseDataCallFn,
AgpsDSClientReleaseFn dsClientReleaseFn, AgpsDSClientReleaseFn dsClientReleaseFn,
SendMsgToAdapterMsgQueueFn sendMsgToAdapterQueueFn) {
SendMsgToAdapterMsgQueueFn sendMsgToAdapterQueueFn ){
mFrameworkStatusV4Cb = frameworkStatusV4Cb;
mAtlOpenStatusCb = atlOpenStatusCb; mAtlOpenStatusCb = atlOpenStatusCb;
mAtlCloseStatusCb = atlCloseStatusCb; mAtlCloseStatusCb = atlCloseStatusCb;
mDSClientInitFn = dsClientInitFn; mDSClientInitFn = dsClientInitFn;
mDSClientOpenAndStartDataCallFn = dsClientOpenAndStartDataCallFn; mDSClientOpenAndStartDataCallFn = dsClientOpenAndStartDataCallFn;
mDSClientStopDataCallFn = dsClientStopDataCallFn; mDSClientStopDataCallFn = dsClientStopDataCallFn;
mDSClientCloseDataCallFn = dsClientCloseDataCallFn; mDSClientCloseDataCallFn = dsClientCloseDataCallFn;
mDSClientReleaseFn = dsClientReleaseFn; mDSClientReleaseFn = dsClientReleaseFn;
mSendMsgToAdapterQueueFn = sendMsgToAdapterQueueFn; mSendMsgToAdapterQueueFn = sendMsgToAdapterQueueFn;
} }
inline void registerFrameworkStatusCallback(AgnssStatusIpV4Cb frameworkStatusV4Cb) {
mFrameworkStatusV4Cb = frameworkStatusV4Cb;
}
/* Create all AGPS state machines */ /* Create all AGPS state machines */
void createAgpsStateMachines(); void createAgpsStateMachines();

View File

@@ -6,8 +6,7 @@ LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := libgnss LOCAL_MODULE := libgnss
LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib LOCAL_VENDOR_MODULE := true
LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64
LOCAL_MODULE_TAGS := optional LOCAL_MODULE_TAGS := optional
LOCAL_SHARED_LIBRARIES := \ LOCAL_SHARED_LIBRARIES := \

View File

@@ -74,12 +74,79 @@ GnssAdapter::GnssAdapter() :
mNiData(), mNiData(),
mAgpsManager(), mAgpsManager(),
mAgpsCbInfo(), mAgpsCbInfo(),
mOdcpiRequestCb(nullptr),
mOdcpiRequestActive(false),
mOdcpiTimer(this),
mOdcpiRequest(),
mSystemStatus(SystemStatus::getInstance(mMsgTask)), mSystemStatus(SystemStatus::getInstance(mMsgTask)),
mServerUrl(""), mServerUrl(":"),
mXtraObserver(mSystemStatus->getOsObserver(), mMsgTask) mXtraObserver(mSystemStatus->getOsObserver(), mMsgTask)
{ {
LOC_LOGD("%s]: Constructor %p", __func__, this); LOC_LOGD("%s]: Constructor %p", __func__, this);
mUlpPositionMode.mode = LOC_POSITION_MODE_INVALID; 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(); readConfigCommand();
setConfigCommand(); setConfigCommand();
initDefaultAgpsCommand(); initDefaultAgpsCommand();
@@ -522,6 +589,38 @@ GnssAdapter::readConfigCommand()
} }
} }
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 void
GnssAdapter::setConfigCommand() GnssAdapter::setConfigCommand()
{ {
@@ -541,6 +640,8 @@ GnssAdapter::setConfigCommand()
mApi.setLPPConfig(mAdapter.convertLppProfile(ContextBase::mGps_conf.LPP_PROFILE)); mApi.setLPPConfig(mAdapter.convertLppProfile(ContextBase::mGps_conf.LPP_PROFILE));
mApi.setAGLONASSProtocol(ContextBase::mGps_conf.A_GLONASS_POS_PROTOCOL_SELECT); 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, mApi.setSensorControlConfig(ContextBase::mSap_conf.SENSOR_USAGE,
ContextBase::mSap_conf.SENSOR_PROVIDER); ContextBase::mSap_conf.SENSOR_PROVIDER);
mApi.setLPPeProtocolCp( mApi.setLPPeProtocolCp(
@@ -683,30 +784,8 @@ GnssAdapter::gnssUpdateConfigCommand(GnssConfig config)
} }
if (mConfig.flags & GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT) { if (mConfig.flags & GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT) {
if (GNSS_ASSISTANCE_TYPE_SUPL == mConfig.assistanceServer.type) { if (GNSS_ASSISTANCE_TYPE_SUPL == mConfig.assistanceServer.type) {
if (ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { err = mAdapter.setSuplHostServer(mConfig.assistanceServer.hostName,
char serverUrl[MAX_URL_LEN] = {}; mConfig.assistanceServer.port);
int32_t length = 0;
const char noHost[] = "NONE";
if (NULL == mConfig.assistanceServer.hostName ||
strncasecmp(noHost,
mConfig.assistanceServer.hostName,
sizeof(noHost)) == 0) {
err = LOCATION_ERROR_INVALID_PARAMETER;
} else {
length = snprintf(serverUrl, sizeof(serverUrl), "%s:%u",
mConfig.assistanceServer.hostName,
mConfig.assistanceServer.port);
}
if (length > 0 && strncasecmp(mAdapter.getServerUrl().c_str(),
serverUrl, sizeof(serverUrl)) != 0) {
mAdapter.setServerUrl(serverUrl);
err = mApi.setServer(serverUrl, length);
}
} else {
err = LOCATION_ERROR_SUCCESS;
}
} else if (GNSS_ASSISTANCE_TYPE_C2K == mConfig.assistanceServer.type) { } else if (GNSS_ASSISTANCE_TYPE_C2K == mConfig.assistanceServer.type) {
if (ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { if (ContextBase::mGps_conf.AGPS_CONFIG_INJECT) {
struct in_addr addr; struct in_addr addr;
@@ -859,7 +938,7 @@ GnssAdapter::gnssDeleteAidingDataCommand(GnssAidingData& data)
mAdapter.reportResponse(err, mSessionId); mAdapter.reportResponse(err, mSessionId);
SystemStatus* s = mAdapter.getSystemStatus(); SystemStatus* s = mAdapter.getSystemStatus();
if ((nullptr != s) && (mData.deleteAll)) { if ((nullptr != s) && (mData.deleteAll)) {
s->setDefaultReport(); s->setDefaultGnssEngineStates();
} }
} }
}; };
@@ -868,6 +947,26 @@ GnssAdapter::gnssDeleteAidingDataCommand(GnssAidingData& data)
return sessionId; 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 void
GnssAdapter::injectLocationCommand(double latitude, double longitude, float accuracy) GnssAdapter::injectLocationCommand(double latitude, double longitude, float accuracy)
{ {
@@ -1077,7 +1176,16 @@ GnssAdapter::updateClientsEventMask()
mask |= LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT; mask |= LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT;
mask |= LOC_API_ADAPTER_BIT_GNSS_SV_POLYNOMIAL_REPORT; mask |= LOC_API_ADAPTER_BIT_GNSS_SV_POLYNOMIAL_REPORT;
LOC_LOGD("%s]: Auto usecase, Enable MEAS/POLY - mask 0x%x", __func__, mask); 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); updateEvtMask(mask, LOC_REGISTRATION_MASK_SET);
@@ -1105,6 +1213,9 @@ GnssAdapter::restartSessions()
{ {
LOC_LOGD("%s]: ", __func__); LOC_LOGD("%s]: ", __func__);
// odcpi session is no longer active after restart
mOdcpiRequestActive = false;
if (mTrackingSessions.empty()) { if (mTrackingSessions.empty()) {
return; return;
} }
@@ -1943,7 +2054,8 @@ GnssAdapter::reportPositionEvent(const UlpLocation& ulpLocation,
inline virtual void proc() const { inline virtual void proc() const {
// extract bug report info - this returns true if consumed by systemstatus // extract bug report info - this returns true if consumed by systemstatus
SystemStatus* s = mAdapter.getSystemStatus(); SystemStatus* s = mAdapter.getSystemStatus();
if ((nullptr != s) && (LOC_SESS_SUCCESS == mStatus)){ if ((nullptr != s) &&
((LOC_SESS_SUCCESS == mStatus) || (LOC_SESS_INTERMEDIATE == mStatus))){
s->eventPosition(mUlpLocation, mLocationExtended); s->eventPosition(mUlpLocation, mLocationExtended);
} }
mAdapter.reportPosition(mUlpLocation, mLocationExtended, mStatus, mTechMask); mAdapter.reportPosition(mUlpLocation, mLocationExtended, mStatus, mTechMask);
@@ -1953,34 +2065,41 @@ GnssAdapter::reportPositionEvent(const UlpLocation& ulpLocation,
sendMsg(new MsgReportPosition(*this, ulpLocation, locationExtended, status, techMask)); 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 void
GnssAdapter::reportPosition(const UlpLocation& ulpLocation, GnssAdapter::reportPosition(const UlpLocation& ulpLocation,
const GpsLocationExtended& locationExtended, const GpsLocationExtended& locationExtended,
enum loc_sess_status status, enum loc_sess_status status,
LocPosTechMask techMask) LocPosTechMask techMask)
{ {
bool reported = false; bool reported = needReport(ulpLocation, status, techMask);
// what's in the if is... (line by line) if (reported) {
// 1. this is a final fix; and
// 1.1 it is a Satellite fix; or
// 1.2 it is a sensor fix
// 2. (must be intermediate fix... implicit)
// 2.1 we accepte intermediate; and
// 2.2 it is NOT the case that
// 2.2.1 there is inaccuracy; and
// 2.2.2 we care about inaccuracy; and
// 2.2.3 the inaccuracy exceeds our tolerance
if ((LOC_SESS_SUCCESS == status &&
((LOC_POS_TECH_MASK_SATELLITE |
LOC_POS_TECH_MASK_SENSORS |
LOC_POS_TECH_MASK_HYBRID) &
techMask)) ||
(LOC_SESS_INTERMEDIATE == ContextBase::mGps_conf.INTERMEDIATE_POS &&
!((ulpLocation.gpsLocation.flags &
LOC_GPS_LOCATION_HAS_ACCURACY) &&
(ContextBase::mGps_conf.ACCURACY_THRES != 0) &&
(ulpLocation.gpsLocation.accuracy >
ContextBase::mGps_conf.ACCURACY_THRES)))) {
if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_GNSS_SV_USED_DATA) { if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_GNSS_SV_USED_DATA) {
mGnssSvIdUsedInPosAvail = true; mGnssSvIdUsedInPosAvail = true;
mGnssSvIdUsedInPosition = locationExtended.gnss_sv_used_ids; mGnssSvIdUsedInPosition = locationExtended.gnss_sv_used_ids;
@@ -1997,7 +2116,6 @@ GnssAdapter::reportPosition(const UlpLocation& ulpLocation,
it->second.gnssLocationInfoCb(locationInfo); it->second.gnssLocationInfoCb(locationInfo);
} }
} }
reported = true;
} }
if (NMEA_PROVIDER_AP == ContextBase::mGps_conf.NMEA_PROVIDER && !mTrackingSessions.empty()) { if (NMEA_PROVIDER_AP == ContextBase::mGps_conf.NMEA_PROVIDER && !mTrackingSessions.empty()) {
@@ -2224,14 +2342,14 @@ static void* niThreadProc(void *args)
NiSession* pSession = (NiSession*)args; NiSession* pSession = (NiSession*)args;
int rc = 0; /* return code from pthread calls */ int rc = 0; /* return code from pthread calls */
struct timeval present_time; struct timespec present_time;
struct timespec expire_time; struct timespec expire_time;
pthread_mutex_lock(&pSession->tLock); pthread_mutex_lock(&pSession->tLock);
/* Calculate absolute expire time */ /* Calculate absolute expire time */
gettimeofday(&present_time, NULL); clock_gettime(CLOCK_MONOTONIC, &present_time);
expire_time.tv_sec = present_time.tv_sec + pSession->respTimeLeft; expire_time.tv_sec = present_time.tv_sec + pSession->respTimeLeft;
expire_time.tv_nsec = present_time.tv_usec * 1000; expire_time.tv_nsec = present_time.tv_nsec;
LOC_LOGD("%s]: time out set for abs time %ld with delay %d sec", LOC_LOGD("%s]: time out set for abs time %ld with delay %d sec",
__func__, (long)expire_time.tv_sec, pSession->respTimeLeft); __func__, (long)expire_time.tv_sec, pSession->respTimeLeft);
@@ -2356,7 +2474,7 @@ void
GnssAdapter::reportGnssMeasurementDataEvent(const GnssMeasurementsNotification& measurements, GnssAdapter::reportGnssMeasurementDataEvent(const GnssMeasurementsNotification& measurements,
int msInWeek) int msInWeek)
{ {
LOC_LOGD("%s]: ", __func__); LOC_LOGD("%s]: msInWeek=%d", __func__, msInWeek);
struct MsgReportGnssMeasurementData : public LocMsg { struct MsgReportGnssMeasurementData : public LocMsg {
GnssAdapter& mAdapter; GnssAdapter& mAdapter;
@@ -2407,19 +2525,170 @@ GnssAdapter::reportSvPolynomialEvent(GnssSvPolynomial &svPolynomial)
mUlpProxy->reportSvPolynomial(svPolynomial); 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() { void GnssAdapter::initDefaultAgps() {
LOC_LOGD("%s]: ", __func__); LOC_LOGD("%s]: ", __func__);
LocationCapabilitiesMask mask = getCapabilities();
if (!(mask & LOCATION_CAPABILITIES_GNSS_MSB_BIT) &&
!(mask & LOCATION_CAPABILITIES_GNSS_MSA_BIT)) {
LOC_LOGI("%s]: Target does not support MSB and MSA.", __func__);
return;
}
void *handle = nullptr; void *handle = nullptr;
if ((handle = dlopen("libloc_net_iface.so", RTLD_NOW)) == nullptr) { if ((handle = dlopen("libloc_net_iface.so", RTLD_NOW)) == nullptr) {
LOC_LOGE("%s]: libloc_net_iface.so not found !", __func__); LOC_LOGD("%s]: libloc_net_iface.so not found !", __func__);
return; return;
} }
@@ -2437,7 +2706,7 @@ void GnssAdapter::initDefaultAgps() {
return; return;
} }
initAgpsCommand(cbInfo); initAgps(cbInfo);
} }
void GnssAdapter::initDefaultAgpsCommand() { void GnssAdapter::initDefaultAgpsCommand() {
@@ -2448,7 +2717,6 @@ void GnssAdapter::initDefaultAgpsCommand() {
inline MsgInitDefaultAgps(GnssAdapter& adapter) : inline MsgInitDefaultAgps(GnssAdapter& adapter) :
LocMsg(), LocMsg(),
mAdapter(adapter) { mAdapter(adapter) {
LOC_LOGV("MsgInitDefaultAgps");
} }
inline virtual void proc() const { inline virtual void proc() const {
mAdapter.initDefaultAgps(); mAdapter.initDefaultAgps();
@@ -2459,141 +2727,53 @@ void GnssAdapter::initDefaultAgpsCommand() {
} }
/* INIT LOC AGPS MANAGER */ /* 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){ void GnssAdapter::initAgpsCommand(const AgpsCbInfo& cbInfo){
LOC_LOGI("GnssAdapter::initAgpsCommand"); LOC_LOGI("GnssAdapter::initAgpsCommand");
/* 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);
};
/* Message to initialize AGPS module */ /* Message to initialize AGPS module */
struct AgpsMsgInit: public LocMsg { struct AgpsMsgInit: public LocMsg {
const AgpsCbInfo mCbInfo;
AgpsManager* mAgpsManager;
AgnssStatusIpV4Cb mFrameworkStatusV4Cb;
AgpsAtlOpenStatusCb mAtlOpenStatusCb;
AgpsAtlCloseStatusCb mAtlCloseStatusCb;
AgpsDSClientInitFn mDSClientInitFn;
AgpsDSClientOpenAndStartDataCallFn mDSClientOpenAndStartDataCallFn;
AgpsDSClientStopDataCallFn mDSClientStopDataCallFn;
AgpsDSClientCloseDataCallFn mDSClientCloseDataCallFn;
AgpsDSClientReleaseFn mDSClientReleaseFn;
SendMsgToAdapterMsgQueueFn mSendMsgFn;
GnssAdapter& mAdapter; GnssAdapter& mAdapter;
inline AgpsMsgInit(AgpsManager* agpsManager, inline AgpsMsgInit(const AgpsCbInfo& cbInfo,
AgnssStatusIpV4Cb frameworkStatusV4Cb,
AgpsAtlOpenStatusCb atlOpenStatusCb,
AgpsAtlCloseStatusCb atlCloseStatusCb,
AgpsDSClientInitFn dsClientInitFn,
AgpsDSClientOpenAndStartDataCallFn dsClientOpenAndStartDataCallFn,
AgpsDSClientStopDataCallFn dsClientStopDataCallFn,
AgpsDSClientCloseDataCallFn dsClientCloseDataCallFn,
AgpsDSClientReleaseFn dsClientReleaseFn,
SendMsgToAdapterMsgQueueFn sendMsgFn,
GnssAdapter& adapter) : GnssAdapter& adapter) :
LocMsg(), mAgpsManager(agpsManager), mFrameworkStatusV4Cb( LocMsg(), mCbInfo(cbInfo), mAdapter(adapter) {
frameworkStatusV4Cb), mAtlOpenStatusCb(atlOpenStatusCb), mAtlCloseStatusCb(
atlCloseStatusCb), mDSClientInitFn(dsClientInitFn), mDSClientOpenAndStartDataCallFn(
dsClientOpenAndStartDataCallFn), mDSClientStopDataCallFn(
dsClientStopDataCallFn), mDSClientCloseDataCallFn(
dsClientCloseDataCallFn), mDSClientReleaseFn(
dsClientReleaseFn), mSendMsgFn(sendMsgFn),
mAdapter(adapter) {
LOC_LOGV("AgpsMsgInit"); LOC_LOGV("AgpsMsgInit");
} }
inline virtual void proc() const { inline virtual void proc() const {
LOC_LOGV("AgpsMsgInit::proc()"); LOC_LOGV("AgpsMsgInit::proc()");
mAdapter.initAgps(mCbInfo);
mAgpsManager->registerCallbacks(mFrameworkStatusV4Cb, mAtlOpenStatusCb,
mAtlCloseStatusCb, mDSClientInitFn,
mDSClientOpenAndStartDataCallFn, mDSClientStopDataCallFn,
mDSClientCloseDataCallFn, mDSClientReleaseFn, mSendMsgFn);
mAgpsManager->createAgpsStateMachines();
/* Register for AGPS event mask */
mAdapter.updateEvtMask(LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST,
LOC_REGISTRATION_MASK_ENABLED);
} }
}; };
if (mAgpsCbInfo.cbPriority > cbInfo.cbPriority) {
LOC_LOGI("Higher priority AGPS CB already registered (%d > %d) !",
mAgpsCbInfo.cbPriority, cbInfo.cbPriority);
return;
} else {
mAgpsCbInfo = cbInfo;
LOC_LOGI("Registering AGPS CB %p with priority %d",
mAgpsCbInfo.statusV4Cb, mAgpsCbInfo.cbPriority);
}
/* Send message to initialize AGPS Manager */ /* Send message to initialize AGPS Manager */
sendMsg(new AgpsMsgInit( sendMsg(new AgpsMsgInit(cbInfo, *this));
&mAgpsManager,
(AgnssStatusIpV4Cb)cbInfo.statusV4Cb,
atlOpenStatusCb, atlCloseStatusCb,
dsClientInitFn, dsClientOpenAndStartDataCallFn,
dsClientStopDataCallFn, dsClientCloseDataCallFn,
dsClientReleaseFn,
sendMsgFn,
*this));
} }
/* GnssAdapter::requestATL /* GnssAdapter::requestATL
@@ -2993,6 +3173,9 @@ bool GnssAdapter::getDebugReport(GnssDebugReport& r)
r.mLocation.mLocation.longitude = r.mLocation.mLocation.longitude =
(double)(reports.mBestPosition.back().mBestLon) * RAD2DEG; (double)(reports.mBestPosition.back().mBestLon) * RAD2DEG;
r.mLocation.mLocation.altitude = reports.mBestPosition.back().mBestAlt; r.mLocation.mLocation.altitude = reports.mBestPosition.back().mBestAlt;
r.mLocation.mLocation.accuracy =
(double)(reports.mBestPosition.back().mBestHepe);
r.mLocation.mUtcReported = reports.mBestPosition.back().mUtcReported; r.mLocation.mUtcReported = reports.mBestPosition.back().mUtcReported;
} }
else { else {
@@ -3018,8 +3201,8 @@ bool GnssAdapter::getDebugReport(GnssDebugReport& r)
(int64_t)(reports.mTimeAndClock.back().mGpsTowMs); (int64_t)(reports.mTimeAndClock.back().mGpsTowMs);
r.mTime.timeUncertaintyNs = r.mTime.timeUncertaintyNs =
(float)((reports.mTimeAndClock.back().mTimeUnc + ((float)(reports.mTimeAndClock.back().mTimeUnc) +
reports.mTimeAndClock.back().mLeapSecUnc)*1000); (float)(reports.mTimeAndClock.back().mLeapSecUnc))*1000.0f;
r.mTime.frequencyUncertaintyNsPerSec = r.mTime.frequencyUncertaintyNsPerSec =
(float)(reports.mTimeAndClock.back().mClockFreqBiasUnc); (float)(reports.mTimeAndClock.back().mClockFreqBiasUnc);
LOC_LOGV("getDebugReport - timeestimate=%" PRIu64 " unc=%f frequnc=%f", LOC_LOGV("getDebugReport - timeestimate=%" PRIu64 " unc=%f frequnc=%f",
@@ -3052,12 +3235,12 @@ GnssAdapter::getAgcInformation(GnssMeasurementsNotification& measurements, int m
systemstatus->getReport(reports, true); systemstatus->getReport(reports, true);
if ((!reports.mRfAndParams.empty()) && (!reports.mTimeAndClock.empty()) && if ((!reports.mRfAndParams.empty()) && (!reports.mTimeAndClock.empty()) &&
reports.mTimeAndClock.back().mTimeValid &&
(abs(msInWeek - (int)reports.mTimeAndClock.back().mGpsTowMs) < 2000)) { (abs(msInWeek - (int)reports.mTimeAndClock.back().mGpsTowMs) < 2000)) {
for (size_t i = 0; i < measurements.count; i++) { for (size_t i = 0; i < measurements.count; i++) {
switch (measurements.measurements[i].svType) { switch (measurements.measurements[i].svType) {
case GNSS_SV_TYPE_GPS: case GNSS_SV_TYPE_GPS:
case GNSS_SV_TYPE_QZSS:
measurements.measurements[i].agcLevelDb = measurements.measurements[i].agcLevelDb =
reports.mRfAndParams.back().mAgcGps; reports.mRfAndParams.back().mAgcGps;
measurements.measurements[i].flags |= measurements.measurements[i].flags |=
@@ -3085,7 +3268,6 @@ GnssAdapter::getAgcInformation(GnssMeasurementsNotification& measurements, int m
GNSS_MEASUREMENTS_DATA_AUTOMATIC_GAIN_CONTROL_BIT; GNSS_MEASUREMENTS_DATA_AUTOMATIC_GAIN_CONTROL_BIT;
break; break;
case GNSS_SV_TYPE_QZSS:
case GNSS_SV_TYPE_SBAS: case GNSS_SV_TYPE_SBAS:
case GNSS_SV_TYPE_UNKNOWN: case GNSS_SV_TYPE_UNKNOWN:
default: default:

View File

@@ -43,9 +43,39 @@
#define MAX_SATELLITES_IN_USE 12 #define MAX_SATELLITES_IN_USE 12
#define LOC_NI_NO_RESPONSE_TIME 20 #define LOC_NI_NO_RESPONSE_TIME 20
#define LOC_GPS_NI_RESPONSE_IGNORE 4 #define LOC_GPS_NI_RESPONSE_IGNORE 4
#define ODCPI_EXPECTED_INJECTION_TIME_MS 10000
class GnssAdapter; 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 { typedef struct {
pthread_t thread; /* NI thread */ pthread_t thread; /* NI thread */
uint32_t respTimeLeft; /* examine time for NI response */ uint32_t respTimeLeft; /* examine time for NI response */
@@ -81,6 +111,7 @@ namespace loc_core {
} }
class GnssAdapter : public LocAdapterBase { class GnssAdapter : public LocAdapterBase {
/* ==== ULP ============================================================================ */ /* ==== ULP ============================================================================ */
UlpProxyBase* mUlpProxy; UlpProxyBase* mUlpProxy;
@@ -102,10 +133,18 @@ class GnssAdapter : public LocAdapterBase {
/* ==== NI ============================================================================= */ /* ==== NI ============================================================================= */
NiData mNiData; NiData mNiData;
/* ==== AGPS ========================================================*/ /* ==== AGPS =========================================================================== */
// This must be initialized via initAgps() // This must be initialized via initAgps()
AgpsManager mAgpsManager; AgpsManager mAgpsManager;
AgpsCbInfo mAgpsCbInfo; AgpsCbInfo mAgpsCbInfo;
void initAgps(const AgpsCbInfo& cbInfo);
/* ==== ODCPI ========================================================================== */
OdcpiRequestCallback mOdcpiRequestCb;
bool mOdcpiRequestActive;
OdcpiTimer mOdcpiTimer;
OdcpiRequestInfo mOdcpiRequest;
void odcpiTimerExpire();
/* === SystemStatus ===================================================================== */ /* === SystemStatus ===================================================================== */
SystemStatus* mSystemStatus; SystemStatus* mSystemStatus;
@@ -151,6 +190,7 @@ public:
LocationCallbacks getClientCallbacks(LocationAPI* client); LocationCallbacks getClientCallbacks(LocationAPI* client);
LocationCapabilitiesMask getCapabilities(); LocationCapabilitiesMask getCapabilities();
void broadcastCapabilities(LocationCapabilitiesMask); void broadcastCapabilities(LocationCapabilitiesMask);
LocationError setSuplHostServer(const char* server, int port);
/* ==== TRACKING ======================================================================= */ /* ==== TRACKING ======================================================================= */
/* ======== COMMANDS ====(Called from Client Thread)==================================== */ /* ======== COMMANDS ====(Called from Client Thread)==================================== */
@@ -198,6 +238,7 @@ public:
void setConfigCommand(); void setConfigCommand();
uint32_t* gnssUpdateConfigCommand(GnssConfig config); uint32_t* gnssUpdateConfigCommand(GnssConfig config);
uint32_t gnssDeleteAidingDataCommand(GnssAidingData& data); uint32_t gnssDeleteAidingDataCommand(GnssAidingData& data);
void gnssUpdateXtraThrottleCommand(const bool enabled);
void initDefaultAgpsCommand(); void initDefaultAgpsCommand();
void initAgpsCommand(const AgpsCbInfo& cbInfo); void initAgpsCommand(const AgpsCbInfo& cbInfo);
@@ -206,6 +247,15 @@ public:
void dataConnClosedCommand(AGpsExtType agpsType); void dataConnClosedCommand(AGpsExtType agpsType);
void dataConnFailedCommand(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 ================================================================== */ /* ======== RESPONSES ================================================================== */
void reportResponse(LocationError err, uint32_t sessionId); void reportResponse(LocationError err, uint32_t sessionId);
void reportResponse(size_t count, LocationError* errs, uint32_t* ids); void reportResponse(size_t count, LocationError* errs, uint32_t* ids);
@@ -239,8 +289,11 @@ public:
virtual bool requestSuplES(int connHandle); virtual bool requestSuplES(int connHandle);
virtual bool reportDataCallOpened(); virtual bool reportDataCallOpened();
virtual bool reportDataCallClosed(); virtual bool reportDataCallClosed();
virtual bool reportOdcpiRequestEvent(OdcpiRequestInfo& request);
/* ======== UTILITIES ================================================================= */ /* ======== UTILITIES ================================================================= */
bool needReport(const UlpLocation& ulpLocation,
enum loc_sess_status status, LocPosTechMask techMask);
void reportPosition(const UlpLocation &ulpLocation, void reportPosition(const UlpLocation &ulpLocation,
const GpsLocationExtended &locationExtended, const GpsLocationExtended &locationExtended,
enum loc_sess_status status, enum loc_sess_status status,
@@ -249,6 +302,7 @@ public:
void reportNmea(const char* nmea, size_t length); void reportNmea(const char* nmea, size_t length);
bool requestNiNotify(const GnssNiNotification& notify, const void* data); bool requestNiNotify(const GnssNiNotification& notify, const void* data);
void reportGnssMeasurementData(const GnssMeasurementsNotification& measurements); void reportGnssMeasurementData(const GnssMeasurementsNotification& measurements);
void reportOdcpiRequest(const OdcpiRequestInfo& request);
/*======== GNSSDEBUG ================================================================*/ /*======== GNSSDEBUG ================================================================*/
bool getDebugReport(GnssDebugReport& report); bool getDebugReport(GnssDebugReport& report);

View File

@@ -1,99 +1,31 @@
AM_CFLAGS = \ AM_CFLAGS = \
$(LOCPLA_CFLAGS) \ $(LOCPLA_CFLAGS) \
$(LOCHAL_CFLAGS) \ $(LOCHAL_CFLAGS) \
$(GPSUTILS_CFLAGS) \
$(LOCCORE_CFLAGS) \
-I./ \ -I./ \
-I../utils \ -I../utils \
-I../core \ -I$(WORKSPACE)/hardware/qcom/gps/core/data-items \
-I../location \ -I../location \
-std=c++11 -std=c++11
libgnss_la_SOURCES = \ libgnss_la_SOURCES = \
location_gnss.cpp \ location_gnss.cpp \
GnssAdapter.cpp \ GnssAdapter.cpp \
XtraSystemStatusObserver.cpp \
Agps.cpp Agps.cpp
if USE_GLIB if USE_GLIB
libgnss_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@ libgnss_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@
libgnss_la_LDFLAGS = -lstdc++ -lpthread @GLIB_LIBS@ -shared -avoid-version libgnss_la_LDFLAGS = -lstdc++ -Wl,-z,defs -lpthread @GLIB_LIBS@ -shared -avoid-version
libgnss_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@ libgnss_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@
else else
libgnss_la_CFLAGS = $(AM_CFLAGS) libgnss_la_CFLAGS = $(AM_CFLAGS)
libgnss_la_LDFLAGS = -lpthread -shared -version-info 1:0:0 libgnss_la_LDFLAGS = -Wl,-z,defs -lpthread -shared -version-info 1:0:0
libgnss_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) libgnss_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS)
endif endif
libgnss_la_LIBADD = -lstdc++ $(LOCPLA_LIBS) $(LOCHAL_LIBS) libgnss_la_LIBADD = -lstdc++ $(GPSUTILS_LIBS) $(LOCCORE_LIBS)
#Create and Install libraries #Create and Install libraries
#lib_LTLIBRARIES = libgnss.la lib_LTLIBRARIES = libgnss.la
#library_includedir = $(pkgincludedir)
#pkgconfigdir = $(libdir)/pkgconfig
#pkgconfig_DATA = location-api.pc
#EXTRA_DIST = $(pkgconfig_DATA)
libloc_ds_api_CFLAGS = \
$(QMIF_CFLAGS) \
$(QMI_CFLAGS) \
$(DATA_CFLAGS) \
$(GPSUTILS_CFLAGS) \
-I$(WORKSPACE)/qcom-opensource/location/loc_api/ds_api
libloc_ds_api_la_SOURCES = \
$(WORKSPACE)/qcom-opensource/location/loc_api/ds_api/ds_client.c
if USE_GLIB
libloc_ds_api_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(libloc_ds_api_CFLAGS) @GLIB_CFLAGS@
libloc_ds_api_la_LDFLAGS = -lstdc++ -Wl,-z,defs -lpthread @GLIB_LIBS@ -shared -version-info 1:0:0
libloc_ds_api_la_LDFLAGS += -Wl,--export-dynamic
libloc_ds_api_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(libloc_ds_api_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@
else
libloc_ds_api_la_CFLAGS = $(AM_CFLAGS) $(libloc_ds_api_CFLAGS)
libloc_ds_api_la_LDFLAGS = -lstdc++ -Wl,-z,defs -lpthread -Wl,--export-dynamic -shared -version-info 1:0:0
libloc_ds_api_la_LDFLAGS += -Wl,--export-dynamic
libloc_ds_api_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) $(libloc_ds_api_CFLAGS)
endif
libloc_ds_api_la_LIBADD = -lstdc++ $(QMIF_LIBS) -lqmiservices -ldsi_netctrl $(GPSUTILS_LIBS) $(LOCPLA_LIBS)
libloc_api_v02_CFLAGS = \
$(QMIF_CFLAGS) \
$(GPSUTILS_CFLAGS) \
-I$(WORKSPACE)/qcom-opensource/location/loc_api/ds_api \
-I$(WORKSPACE)/qcom-opensource/location/loc_api/loc_api_v02
libloc_api_v02_la_SOURCES = \
$(WORKSPACE)/qcom-opensource/location/loc_api/loc_api_v02/LocApiV02.cpp \
$(WORKSPACE)/qcom-opensource/location/loc_api/loc_api_v02/loc_api_v02_log.c \
$(WORKSPACE)/qcom-opensource/location/loc_api/loc_api_v02/loc_api_v02_client.c \
$(WORKSPACE)/qcom-opensource/location/loc_api/loc_api_v02/loc_api_sync_req.c \
$(WORKSPACE)/qcom-opensource/location/loc_api/loc_api_v02/location_service_v02.c
if USE_GLIB
libloc_api_v02_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(libloc_api_v02_CFLAGS) @GLIB_CFLAGS@
libloc_api_v02_la_LDFLAGS = -lstdc++ -g -Wl,-z,defs -lpthread @GLIB_LIBS@ -shared -version-info 1:0:0
libloc_api_v02_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(libloc_api_v02_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@
else
libloc_api_v02_la_CFLAGS = $(AM_CFLAGS) $(libloc_api_v02_CFLAGS)
libloc_api_v02_la_LDFLAGS = -lstdc++ -Wl,-z,defs -lpthread -shared -version-info 1:0:0
libloc_api_v02_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) $(libloc_api_v02_CFLAGS)
endif
libloc_api_v02_la_CXXFLAGS = -std=c++0x
libloc_api_v02_la_LIBADD = -lstdc++ -lqmi_cci -lqmi_common_so $(QMIF_LIBS) $(GPSUTILS_LIBS) $(LOCPLA_LIBS) ../core/libloc_core.la libloc_ds_api.la
library_include_HEADERS = \
$(WORKSPACE)/qcom-opensource/location/loc_api/ds_api/ds_client.h \
$(WORKSPACE)/qcom-opensource/location/loc_api/loc_api_v02/location_service_v02.h \
$(WORKSPACE)/qcom-opensource/location/loc_api/loc_api_v02/loc_api_v02_log.h \
$(WORKSPACE)/qcom-opensource/location/loc_api/loc_api_v02/loc_api_v02_client.h \
$(WORKSPACE)/qcom-opensource/location/loc_api/loc_api_v02/loc_api_sync_req.h \
$(WORKSPACE)/qcom-opensource/location/loc_api/loc_api_v02/LocApiV02.h \
$(WORKSPACE)/qcom-opensource/location/loc_api/loc_api_v02/loc_util_log.h
library_includedir = $(pkgincludedir)
#Create and Install libraries
lib_LTLIBRARIES = libgnss.la libloc_ds_api.la libloc_api_v02.la

View File

@@ -47,97 +47,125 @@
#include <LocAdapterBase.h> #include <LocAdapterBase.h>
#include <DataItemId.h> #include <DataItemId.h>
#include <DataItemsFactoryProxy.h> #include <DataItemsFactoryProxy.h>
#include <DataItemConcreteTypesBase.h>
using namespace loc_core; using namespace loc_core;
#define XTRA_HAL_SOCKET_NAME "/data/vendor/location/xtra/socket_hal_xtra" #ifdef LOG_TAG
#undef LOG_TAG
#endif
#define LOG_TAG "LocSvc_XSSO"
bool XtraSystemStatusObserver::updateLockStatus(uint32_t lock) { bool XtraSystemStatusObserver::updateLockStatus(uint32_t lock) {
mGpsLock = lock;
if (!mReqStatusReceived) {
return true;
}
stringstream ss; stringstream ss;
ss << "gpslock"; ss << "gpslock";
ss << " " << lock; ss << " " << lock;
ss << "\n"; // append seperator return ( send(LOC_IPC_XTRA, ss.str()) );
return ( sendEvent(ss) );
} }
bool XtraSystemStatusObserver::updateConnectionStatus(bool connected, uint32_t type) { bool XtraSystemStatusObserver::updateConnections(uint64_t allConnections) {
mIsConnectivityStatusKnown = true;
mConnections = allConnections;
if (!mReqStatusReceived) {
return true;
}
stringstream ss; stringstream ss;
ss << "connection"; ss << "connection";
ss << " " << (connected ? "1" : "0"); ss << " " << mConnections;
ss << " " << (int)type; return ( send(LOC_IPC_XTRA, ss.str()) );
ss << "\n"; // append seperator
return ( sendEvent(ss) );
} }
bool XtraSystemStatusObserver::updateTac(const string& tac) { bool XtraSystemStatusObserver::updateTac(const string& tac) {
mTac = tac;
if (!mReqStatusReceived) {
return true;
}
stringstream ss; stringstream ss;
ss << "tac"; ss << "tac";
ss << " " << tac.c_str(); ss << " " << tac.c_str();
ss << "\n"; // append seperator return ( send(LOC_IPC_XTRA, ss.str()) );
return ( sendEvent(ss) );
} }
bool XtraSystemStatusObserver::updateMccMnc(const string& mccmnc) { bool XtraSystemStatusObserver::updateMccMnc(const string& mccmnc) {
mMccmnc = mccmnc;
if (!mReqStatusReceived) {
return true;
}
stringstream ss; stringstream ss;
ss << "mncmcc"; ss << "mncmcc";
ss << " " << mccmnc.c_str(); ss << " " << mccmnc.c_str();
ss << "\n"; // append seperator return ( send(LOC_IPC_XTRA, ss.str()) );
return ( sendEvent(ss) );
} }
bool XtraSystemStatusObserver::sendEvent(const stringstream& event) { bool XtraSystemStatusObserver::updateXtraThrottle(const bool enabled) {
int socketFd = createSocket(); mXtraThrottle = enabled;
if (socketFd < 0) {
LOC_LOGe("XTRA unreachable. sending failed."); if (!mReqStatusReceived) {
return false; return true;
} }
const string& data = event.str(); stringstream ss;
int remain = data.length(); ss << "xtrathrottle";
ssize_t sent = 0; ss << " " << (enabled ? 1 : 0);
while (remain > 0 && return ( send(LOC_IPC_XTRA, ss.str()) );
(sent = ::send(socketFd, data.c_str() + (data.length() - remain),
remain, MSG_NOSIGNAL)) > 0) {
remain -= sent;
}
if (sent < 0) {
LOC_LOGe("sending error. reason:%s", strerror(errno));
}
closeSocket(socketFd);
return (remain == 0);
} }
inline bool XtraSystemStatusObserver::onStatusRequested(int32_t xtraStatusUpdated) {
mReqStatusReceived = true;
int XtraSystemStatusObserver::createSocket() { if (xtraStatusUpdated) {
int socketFd = -1; return true;
if ((socketFd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
LOC_LOGe("create socket error. reason:%s", strerror(errno));
} else {
const char* socketPath = XTRA_HAL_SOCKET_NAME ;
struct sockaddr_un addr = { .sun_family = AF_UNIX };
snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", socketPath);
if (::connect(socketFd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
LOC_LOGe("cannot connect to XTRA. reason:%s", strerror(errno));
if (::close(socketFd)) {
LOC_LOGe("close socket error. reason:%s", strerror(errno));
}
socketFd = -1;
}
} }
return socketFd; 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::closeSocket(const int socketFd) { void XtraSystemStatusObserver::onReceive(const std::string& data) {
if (socketFd >= 0) { if (!strncmp(data.c_str(), "ping", sizeof("ping") - 1)) {
if(::close(socketFd)) { LOC_LOGd("ping received");
LOC_LOGe("close socket error. reason:%s", strerror(errno));
} #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());
} }
} }
@@ -169,11 +197,11 @@ void XtraSystemStatusObserver::getName(string& name)
void XtraSystemStatusObserver::notify(const list<IDataItemCore*>& dlist) void XtraSystemStatusObserver::notify(const list<IDataItemCore*>& dlist)
{ {
struct handleOsObserverUpdateMsg : public LocMsg { struct HandleOsObserverUpdateMsg : public LocMsg {
XtraSystemStatusObserver* mXtraSysStatObj; XtraSystemStatusObserver* mXtraSysStatObj;
list <IDataItemCore*> mDataItemList; list <IDataItemCore*> mDataItemList;
inline handleOsObserverUpdateMsg(XtraSystemStatusObserver* xtraSysStatObs, inline HandleOsObserverUpdateMsg(XtraSystemStatusObserver* xtraSysStatObs,
const list<IDataItemCore*>& dataItemList) : const list<IDataItemCore*>& dataItemList) :
mXtraSysStatObj(xtraSysStatObs) { mXtraSysStatObj(xtraSysStatObs) {
for (auto eachItem : dataItemList) { for (auto eachItem : dataItemList) {
@@ -189,7 +217,7 @@ void XtraSystemStatusObserver::notify(const list<IDataItemCore*>& dlist)
} }
} }
inline ~handleOsObserverUpdateMsg() { inline ~HandleOsObserverUpdateMsg() {
for (auto each : mDataItemList) { for (auto each : mDataItemList) {
delete each; delete each;
} }
@@ -201,23 +229,24 @@ void XtraSystemStatusObserver::notify(const list<IDataItemCore*>& dlist)
{ {
case NETWORKINFO_DATA_ITEM_ID: case NETWORKINFO_DATA_ITEM_ID:
{ {
SystemStatusNetworkInfo* networkInfo = NetworkInfoDataItemBase* networkInfo =
reinterpret_cast<SystemStatusNetworkInfo*>(each); static_cast<NetworkInfoDataItemBase*>(each);
mXtraSysStatObj->updateConnectionStatus(networkInfo->mConnected, mXtraSysStatObj->updateConnections(networkInfo->getAllTypes());
networkInfo->mType);
} }
break; break;
case TAC_DATA_ITEM_ID: case TAC_DATA_ITEM_ID:
{ {
SystemStatusTac* tac = reinterpret_cast<SystemStatusTac*>(each); TacDataItemBase* tac =
static_cast<TacDataItemBase*>(each);
mXtraSysStatObj->updateTac(tac->mValue); mXtraSysStatObj->updateTac(tac->mValue);
} }
break; break;
case MCCMNC_DATA_ITEM_ID: case MCCMNC_DATA_ITEM_ID:
{ {
SystemStatusMccMnc* mccmnc = reinterpret_cast<SystemStatusMccMnc*>(each); MccmncDataItemBase* mccmnc =
static_cast<MccmncDataItemBase*>(each);
mXtraSysStatObj->updateMccMnc(mccmnc->mValue); mXtraSysStatObj->updateMccMnc(mccmnc->mValue);
} }
break; break;
@@ -228,7 +257,5 @@ void XtraSystemStatusObserver::notify(const list<IDataItemCore*>& dlist)
} }
} }
}; };
mMsgTask->sendMsg(new (nothrow) handleOsObserverUpdateMsg(this, dlist)); mMsgTask->sendMsg(new (nothrow) HandleOsObserverUpdateMsg(this, dlist));
} }

View File

@@ -31,41 +31,67 @@
#include <cinttypes> #include <cinttypes>
#include <MsgTask.h> #include <MsgTask.h>
#include <LocIpc.h>
#include <LocTimer.h>
using namespace std; using namespace std;
using loc_core::IOsObserver; using loc_core::IOsObserver;
using loc_core::IDataItemObserver; using loc_core::IDataItemObserver;
using loc_core::IDataItemCore; using loc_core::IDataItemCore;
using loc_util::LocIpc;
class XtraSystemStatusObserver : public IDataItemObserver, public LocIpc{
class XtraSystemStatusObserver : public IDataItemObserver {
public : public :
// constructor & destructor // constructor & destructor
inline XtraSystemStatusObserver(IOsObserver* sysStatObs, const MsgTask* msgTask): inline XtraSystemStatusObserver(IOsObserver* sysStatObs, const MsgTask* msgTask):
mSystemStatusObsrvr(sysStatObs), mMsgTask(msgTask) { mSystemStatusObsrvr(sysStatObs), mMsgTask(msgTask),
mGpsLock(-1), mConnections(0), mXtraThrottle(true), mReqStatusReceived(false),
mDelayLocTimer(*this), mIsConnectivityStatusKnown (false) {
subscribe(true); subscribe(true);
startListeningNonBlocking(LOC_IPC_HAL);
mDelayLocTimer.start(100 /*.1 sec*/, false);
}
inline virtual ~XtraSystemStatusObserver() {
subscribe(false);
stopListening();
} }
inline XtraSystemStatusObserver() {};
inline virtual ~XtraSystemStatusObserver() { subscribe(false); }
// IDataItemObserver overrides // IDataItemObserver overrides
inline virtual void getName(string& name); inline virtual void getName(string& name);
virtual void notify(const list<IDataItemCore*>& dlist); virtual void notify(const list<IDataItemCore*>& dlist);
bool updateLockStatus(uint32_t lock); bool updateLockStatus(uint32_t lock);
bool updateConnectionStatus(bool connected, uint32_t type); bool updateConnections(uint64_t allConnections);
bool updateTac(const string& tac); bool updateTac(const string& tac);
bool updateMccMnc(const string& mccmnc); bool updateMccMnc(const string& mccmnc);
bool updateXtraThrottle(const bool enabled);
inline const MsgTask* getMsgTask() { return mMsgTask; } inline const MsgTask* getMsgTask() { return mMsgTask; }
void subscribe(bool yes); void subscribe(bool yes);
protected:
void onReceive(const std::string& data) override;
private: private:
int createSocket();
void closeSocket(const int32_t socketFd);
bool sendEvent(const stringstream& event);
IOsObserver* mSystemStatusObsrvr; IOsObserver* mSystemStatusObsrvr;
const MsgTask* mMsgTask; 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 #endif

View File

@@ -45,6 +45,7 @@ static void stopTracking(LocationAPI* client, uint32_t id);
static void gnssNiResponse(LocationAPI* client, uint32_t id, GnssNiResponse response); static void gnssNiResponse(LocationAPI* client, uint32_t id, GnssNiResponse response);
static uint32_t gnssDeleteAidingData(GnssAidingData& data); static uint32_t gnssDeleteAidingData(GnssAidingData& data);
static void gnssUpdateXtraThrottle(const bool enabled);
static void setControlCallbacks(LocationControlCallbacks& controlCallbacks); static void setControlCallbacks(LocationControlCallbacks& controlCallbacks);
static uint32_t enable(LocationTechnologyType techType); static uint32_t enable(LocationTechnologyType techType);
@@ -59,7 +60,10 @@ static void agpsDataConnOpen(AGpsExtType agpsType, const char* apnName, int apnL
static void agpsDataConnClosed(AGpsExtType agpsType); static void agpsDataConnClosed(AGpsExtType agpsType);
static void agpsDataConnFailed(AGpsExtType agpsType); static void agpsDataConnFailed(AGpsExtType agpsType);
static void getDebugReport(GnssDebugReport& report); static void getDebugReport(GnssDebugReport& report);
static void updateConnectionStatus(bool connected, uint8_t type); static void updateConnectionStatus(bool connected, int8_t type);
static void odcpiInit(const OdcpiRequestCallback& callback);
static void odcpiInject(const Location& location);
static const GnssInterface gGnssInterface = { static const GnssInterface gGnssInterface = {
sizeof(GnssInterface), sizeof(GnssInterface),
@@ -77,6 +81,7 @@ static const GnssInterface gGnssInterface = {
disable, disable,
gnssUpdateConfig, gnssUpdateConfig,
gnssDeleteAidingData, gnssDeleteAidingData,
gnssUpdateXtraThrottle,
injectLocation, injectLocation,
injectTime, injectTime,
agpsInit, agpsInit,
@@ -85,6 +90,8 @@ static const GnssInterface gGnssInterface = {
agpsDataConnFailed, agpsDataConnFailed,
getDebugReport, getDebugReport,
updateConnectionStatus, updateConnectionStatus,
odcpiInit,
odcpiInject,
}; };
#ifndef DEBUG_X86 #ifndef DEBUG_X86
@@ -203,6 +210,13 @@ static uint32_t gnssDeleteAidingData(GnssAidingData& data)
} }
} }
static void gnssUpdateXtraThrottle(const bool enabled)
{
if (NULL != gGnssAdapter) {
gGnssAdapter->gnssUpdateXtraThrottleCommand(enabled);
}
}
static void injectLocation(double latitude, double longitude, float accuracy) static void injectLocation(double latitude, double longitude, float accuracy)
{ {
if (NULL != gGnssAdapter) { if (NULL != gGnssAdapter) {
@@ -251,8 +265,23 @@ static void getDebugReport(GnssDebugReport& report) {
} }
} }
static void updateConnectionStatus(bool connected, uint8_t type) { static void updateConnectionStatus(bool connected, int8_t type) {
if (NULL != gGnssAdapter) { if (NULL != gGnssAdapter) {
gGnssAdapter->getSystemStatus()->eventConnectionStatus(connected, type); 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);
}
}

View File

@@ -1,6 +1,7 @@
AM_CFLAGS = \ AM_CFLAGS = \
$(LOCPLA_CFLAGS) \ $(LOCPLA_CFLAGS) \
$(GPSUTILS_CFLAGS) \ $(GPSUTILS_CFLAGS) \
-I$(WORKSPACE)/system/core/include \
-I./ -I./
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4

View File

@@ -29,14 +29,20 @@ AC_PROG_MAKE_SET
PKG_PROG_PKG_CONFIG PKG_PROG_PKG_CONFIG
# Checks for libraries. # Checks for libraries.
PKG_CHECK_MODULES([LOCPLA], [loc-pla])
AC_SUBST([LOCPLA_CFLAGS])
AC_SUBST([LOCPLA_LIBS])
PKG_CHECK_MODULES([GPSUTILS], [gps-utils]) PKG_CHECK_MODULES([GPSUTILS], [gps-utils])
AC_SUBST([GPSUTILS_CFLAGS]) AC_SUBST([GPSUTILS_CFLAGS])
AC_SUBST([GPSUTILS_LIBS]) 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_ARG_WITH([glib],
AC_HELP_STRING([--with-glib], AC_HELP_STRING([--with-glib],
[enable glib, building HLOS systems which use glib])) [enable glib, building HLOS systems which use glib]))

View File

@@ -25,7 +25,7 @@
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include <platform_lib_log_util.h> #include <log_util.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>

View File

@@ -4,7 +4,7 @@ libdir=@libdir@
includedir=@includedir@ includedir=@includedir@
Name: gnsspps Name: gnsspps
Description: QTI GPS drplugin-client Description: QTI GPS gnsspps
Version: @VERSION Version: @VERSION
Libs: -L${libdir} -lgnsspps Libs: -L${libdir} -lgnsspps
Cflags: -I${includedir}/gnsspps Cflags: -I${includedir}/gnsspps

View File

@@ -6,5 +6,5 @@ includedir=@includedir@
Name: loc-hal Name: loc-hal
Description: QTI GPS Loc HAL Description: QTI GPS Loc HAL
Version: @VERSION Version: @VERSION
Libs: -L${libdir} -lloc_core -llocation_api -lgnss -lloc_ds_api -lloc_api_v02 Libs: -L${libdir} -lgnss
Cflags: -I${includedir} -I${includedir}/loc-hal -I${includedir}/loc-hal/location -I${includedir}/loc-hal/gnss -I${includedir}/loc-hal/core Cflags: -I${includedir} -I${includedir}/utils -I${includedir}/core -I${includedir}/loc-hal

View File

@@ -6,8 +6,7 @@ LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := liblocation_api LOCAL_MODULE := liblocation_api
LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib LOCAL_VENDOR_MODULE := true
LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64
LOCAL_MODULE_TAGS := optional LOCAL_MODULE_TAGS := optional
LOCAL_SHARED_LIBRARIES := \ LOCAL_SHARED_LIBRARIES := \

View File

@@ -29,7 +29,8 @@
#include <location_interface.h> #include <location_interface.h>
#include <dlfcn.h> #include <dlfcn.h>
#include <platform_lib_log_util.h> #include <loc_pla.h>
#include <log_util.h>
#include <pthread.h> #include <pthread.h>
#include <map> #include <map>

View File

@@ -308,8 +308,9 @@ typedef enum {
} GnssSuplMode; } GnssSuplMode;
typedef enum { typedef enum {
BATCHING_MODE_ROUTINE = 0, BATCHING_MODE_ROUTINE = 0, // positions are reported when batched positions memory is full
BATCHING_MODE_TRIP 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; } BatchingMode;
typedef enum { typedef enum {

View File

@@ -29,12 +29,12 @@
#define LOG_NDDEBUG 0 #define LOG_NDDEBUG 0
#define LOG_TAG "LocSvc_APIClientBase" #define LOG_TAG "LocSvc_APIClientBase"
#include <platform_lib_log_util.h> #include <loc_pla.h>
#include <log_util.h>
#include <inttypes.h> #include <inttypes.h>
#include <loc_cfg.h> #include <loc_cfg.h>
#include "LocationAPIClientBase.h" #include "LocationAPIClientBase.h"
#define FLP_CONF_FILE "/etc/flp.conf"
#define GEOFENCE_SESSION_ID 0xFFFFFFFF #define GEOFENCE_SESSION_ID 0xFFFFFFFF
#define CONFIG_SESSION_ID 0xFFFFFFFF #define CONFIG_SESSION_ID 0xFFFFFFFF
@@ -153,7 +153,6 @@ uint32_t LocationAPIControlClient::locAPIGnssUpdateConfig(GnssConfig config)
memcpy(&mConfig, &config, sizeof(GnssConfig)); memcpy(&mConfig, &config, sizeof(GnssConfig));
uint32_t session = 0;
uint32_t* idArray = mLocationControlAPI->gnssUpdateConfig(config); uint32_t* idArray = mLocationControlAPI->gnssUpdateConfig(config);
LOC_LOGV("%s:%d] gnssUpdateConfig return array: %p", __FUNCTION__, __LINE__, idArray); LOC_LOGV("%s:%d] gnssUpdateConfig return array: %p", __FUNCTION__, __LINE__, idArray);
if (idArray != nullptr) { if (idArray != nullptr) {
@@ -365,7 +364,7 @@ int32_t LocationAPIClientBase::locAPIGetBatchSize()
{ {
{"BATCH_SIZE", &mBatchSize, nullptr, 'n'}, {"BATCH_SIZE", &mBatchSize, nullptr, 'n'},
}; };
UTIL_READ_CONF(FLP_CONF_FILE, flp_conf_param_table); UTIL_READ_CONF(LOC_PATH_FLP_CONF, flp_conf_param_table);
if (mBatchSize < 0) { if (mBatchSize < 0) {
// set mBatchSize to 0 if we got an illegal value from config file // set mBatchSize to 0 if we got an illegal value from config file
mBatchSize = 0; mBatchSize = 0;
@@ -393,14 +392,20 @@ uint32_t LocationAPIClientBase::locAPIStartSession(uint32_t id, uint32_t session
trackingSession = mLocationAPI->startTracking(locationOptions); trackingSession = mLocationAPI->startTracking(locationOptions);
LOC_LOGI("%s:%d] start new session: %d", __FUNCTION__, __LINE__, trackingSession); LOC_LOGI("%s:%d] start new session: %d", __FUNCTION__, __LINE__, trackingSession);
mRequestQueues[REQUEST_SESSION].push(new StartTrackingRequest(*this)); mRequestQueues[REQUEST_SESSION].push(new StartTrackingRequest(*this));
} else if ((sessionMode == SESSION_MODE_ON_FULL) || } else {
(sessionMode == SESSION_MODE_ON_TRIP_COMPLETED)) {
// Fill in the batch mode // Fill in the batch mode
BatchingOptions batchOptions = {}; BatchingOptions batchOptions = {};
batchOptions.size = sizeof(BatchingOptions); batchOptions.size = sizeof(BatchingOptions);
batchOptions.batchingMode = BATCHING_MODE_ROUTINE; switch (sessionMode) {
if (sessionMode == SESSION_MODE_ON_TRIP_COMPLETED) { case SESSION_MODE_ON_FULL:
batchOptions.batchingMode = BATCHING_MODE_ROUTINE;
break;
case SESSION_MODE_ON_TRIP_COMPLETED:
batchOptions.batchingMode = BATCHING_MODE_TRIP; batchOptions.batchingMode = BATCHING_MODE_TRIP;
break;
default:
batchOptions.batchingMode = BATCHING_MODE_NO_AUTO_REPORT;
break;
} }
batchingSession = mLocationAPI->startBatching(locationOptions, batchOptions); batchingSession = mLocationAPI->startBatching(locationOptions, batchOptions);
@@ -409,8 +414,7 @@ uint32_t LocationAPIClientBase::locAPIStartSession(uint32_t id, uint32_t session
mRequestQueues[REQUEST_SESSION].push(new StartBatchingRequest(*this)); mRequestQueues[REQUEST_SESSION].push(new StartBatchingRequest(*this));
} }
uint32_t session = ((sessionMode == SESSION_MODE_ON_FULL || uint32_t session = ((sessionMode != SESSION_MODE_ON_FIX) ?
(sessionMode == SESSION_MODE_ON_TRIP_COMPLETED)) ?
batchingSession : trackingSession); batchingSession : trackingSession);
SessionEntity entity; SessionEntity entity;
@@ -445,12 +449,9 @@ uint32_t LocationAPIClientBase::locAPIStopSession(uint32_t id)
if (sMode == SESSION_MODE_ON_FIX) { if (sMode == SESSION_MODE_ON_FIX) {
mRequestQueues[REQUEST_SESSION].push(new StopTrackingRequest(*this)); mRequestQueues[REQUEST_SESSION].push(new StopTrackingRequest(*this));
mLocationAPI->stopTracking(trackingSession); mLocationAPI->stopTracking(trackingSession);
} else if ((sMode == SESSION_MODE_ON_FULL) || } else {
(sMode == SESSION_MODE_ON_TRIP_COMPLETED)) {
mRequestQueues[REQUEST_SESSION].push(new StopBatchingRequest(*this)); mRequestQueues[REQUEST_SESSION].push(new StopBatchingRequest(*this));
mLocationAPI->stopBatching(batchingSession); mLocationAPI->stopBatching(batchingSession);
} else {
LOC_LOGE("%s:%d] unknown mode %d.", __FUNCTION__, __LINE__, sMode);
} }
retVal = LOCATION_ERROR_SUCCESS; retVal = LOCATION_ERROR_SUCCESS;
@@ -484,8 +485,7 @@ uint32_t LocationAPIClientBase::locAPIUpdateSessionOptions(uint32_t id, uint32_t
mRequestQueues[REQUEST_SESSION].push(new UpdateTrackingOptionsRequest(*this)); mRequestQueues[REQUEST_SESSION].push(new UpdateTrackingOptionsRequest(*this));
if (sMode == SESSION_MODE_ON_FIX) { if (sMode == SESSION_MODE_ON_FIX) {
mLocationAPI->updateTrackingOptions(trackingSession, options); mLocationAPI->updateTrackingOptions(trackingSession, options);
} else if ((sMode == SESSION_MODE_ON_FULL) || } else {
(sMode == SESSION_MODE_ON_TRIP_COMPLETED)) {
// stop batching // stop batching
// batchingSession will be removed from mSessionBiDict soon, // batchingSession will be removed from mSessionBiDict soon,
// so we don't need to add a new request to mRequestQueues[REQUEST_SESSION]. // so we don't need to add a new request to mRequestQueues[REQUEST_SESSION].
@@ -497,19 +497,23 @@ uint32_t LocationAPIClientBase::locAPIUpdateSessionOptions(uint32_t id, uint32_t
trackingSession = mLocationAPI->startTracking(options); trackingSession = mLocationAPI->startTracking(options);
LOC_LOGI("%s:%d] start new session: %d", LOC_LOGI("%s:%d] start new session: %d",
__FUNCTION__, __LINE__, trackingSession); __FUNCTION__, __LINE__, trackingSession);
} else {
LOC_LOGE("%s:%d] unknown mode %d", __FUNCTION__, __LINE__, sMode);
} }
} else if ((sessionMode == SESSION_MODE_ON_FULL) || } else {
(sessionMode == SESSION_MODE_ON_TRIP_COMPLETED)) {
// we only add an UpdateBatchingOptionsRequest to mRequestQueues[REQUEST_SESSION], // we only add an UpdateBatchingOptionsRequest to mRequestQueues[REQUEST_SESSION],
// even if this update request will stop tracking and then start batching. // even if this update request will stop tracking and then start batching.
mRequestQueues[REQUEST_SESSION].push(new UpdateBatchingOptionsRequest(*this)); mRequestQueues[REQUEST_SESSION].push(new UpdateBatchingOptionsRequest(*this));
BatchingOptions batchOptions = {}; BatchingOptions batchOptions = {};
batchOptions.size = sizeof(BatchingOptions); batchOptions.size = sizeof(BatchingOptions);
batchOptions.batchingMode = BATCHING_MODE_ROUTINE; switch (sessionMode) {
if (sessionMode == SESSION_MODE_ON_TRIP_COMPLETED) { case SESSION_MODE_ON_FULL:
batchOptions.batchingMode = BATCHING_MODE_TRIP; 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) { if (sMode == SESSION_MODE_ON_FIX) {
@@ -524,19 +528,13 @@ uint32_t LocationAPIClientBase::locAPIUpdateSessionOptions(uint32_t id, uint32_t
LOC_LOGI("%s:%d] start new session: %d", LOC_LOGI("%s:%d] start new session: %d",
__FUNCTION__, __LINE__, batchingSession); __FUNCTION__, __LINE__, batchingSession);
mRequestQueues[REQUEST_SESSION].setSession(batchingSession); mRequestQueues[REQUEST_SESSION].setSession(batchingSession);
} else if ((sMode == SESSION_MODE_ON_FULL) ||
(sMode == SESSION_MODE_ON_TRIP_COMPLETED)) {
mLocationAPI->updateBatchingOptions(batchingSession, options, batchOptions);
} else { } else {
LOC_LOGE("%s:%d] unknown mode %d", __FUNCTION__, __LINE__, sMode); mLocationAPI->updateBatchingOptions(batchingSession, options, batchOptions);
} }
} else {
LOC_LOGE("%s:%d] unknown mode %d.", __FUNCTION__, __LINE__, sessionMode);
} }
uint32_t session = ((sessionMode == SESSION_MODE_ON_FULL) || uint32_t session = ((sessionMode != SESSION_MODE_ON_FIX) ?
(sessionMode == SESSION_MODE_ON_TRIP_COMPLETED) ?
batchingSession : trackingSession); batchingSession : trackingSession);
entity.trackingSession = trackingSession; entity.trackingSession = trackingSession;
@@ -556,22 +554,31 @@ uint32_t LocationAPIClientBase::locAPIUpdateSessionOptions(uint32_t id, uint32_t
return retVal; return retVal;
} }
void LocationAPIClientBase::locAPIGetBatchedLocations(uint32_t id, size_t count) uint32_t LocationAPIClientBase::locAPIGetBatchedLocations(uint32_t id, size_t count)
{ {
uint32_t retVal = LOCATION_ERROR_GENERAL_FAILURE;
pthread_mutex_lock(&mMutex); pthread_mutex_lock(&mMutex);
if (mLocationAPI) { if (mLocationAPI) {
uint32_t session = 0; if (mSessionBiDict.hasId(id)) {
session = mRequestQueues[REQUEST_SESSION].getSession();
if (session > 0) {
SessionEntity entity = mSessionBiDict.getExtById(id); SessionEntity entity = mSessionBiDict.getExtById(id);
uint32_t batchingSession = entity.batchingSession; if (entity.sessionMode != SESSION_MODE_ON_FIX) {
mRequestQueues[REQUEST_SESSION].push(new GetBatchedLocationsRequest(*this)); uint32_t batchingSession = entity.batchingSession;
mLocationAPI->getBatchedLocations(batchingSession, count); 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 { } else {
LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__, session); retVal = LOCATION_ERROR_ID_UNKNOWN;
LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__, id);
} }
} }
pthread_mutex_unlock(&mMutex); pthread_mutex_unlock(&mMutex);
return retVal;
} }
uint32_t LocationAPIClientBase::locAPIAddGeofences( uint32_t LocationAPIClientBase::locAPIAddGeofences(
@@ -612,16 +619,24 @@ void LocationAPIClientBase::locAPIRemoveGeofences(size_t count, uint32_t* ids)
} }
if (mRequestQueues[REQUEST_GEOFENCE].getSession() == GEOFENCE_SESSION_ID) { if (mRequestQueues[REQUEST_GEOFENCE].getSession() == GEOFENCE_SESSION_ID) {
BiDict<GeofenceBreachTypeMask>* removedGeofenceBiDict =
new BiDict<GeofenceBreachTypeMask>();
size_t j = 0; size_t j = 0;
for (size_t i = 0; i < count; i++) { for (size_t i = 0; i < count; i++) {
sessions[j] = mGeofenceBiDict.getSession(ids[i]); sessions[j] = mGeofenceBiDict.getSession(ids[i]);
if (sessions[j] > 0) { if (sessions[j] > 0) {
GeofenceBreachTypeMask type = mGeofenceBiDict.getExtBySession(sessions[j]);
mGeofenceBiDict.rmBySession(sessions[j]);
removedGeofenceBiDict->set(ids[i], sessions[j], type);
j++; j++;
} }
} }
if (j > 0) { if (j > 0) {
mRequestQueues[REQUEST_GEOFENCE].push(new RemoveGeofencesRequest(*this)); mRequestQueues[REQUEST_GEOFENCE].push(new RemoveGeofencesRequest(*this,
removedGeofenceBiDict));
mLocationAPI->removeGeofences(j, sessions); mLocationAPI->removeGeofences(j, sessions);
} else {
delete(removedGeofenceBiDict);
} }
} else { } else {
LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__, LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__,
@@ -743,38 +758,8 @@ void LocationAPIClientBase::locAPIResumeGeofences(
void LocationAPIClientBase::locAPIRemoveAllGeofences() void LocationAPIClientBase::locAPIRemoveAllGeofences()
{ {
pthread_mutex_lock(&mMutex); std::vector<uint32_t> sessionsVec = mGeofenceBiDict.getAllSessions();
if (mLocationAPI) { locAPIRemoveGeofences(sessionsVec.size(), &sessionsVec[0]);
std::vector<uint32_t> sessionsVec = mGeofenceBiDict.getAllSessions();
size_t count = sessionsVec.size();
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] = sessionsVec[i];
if (sessions[j] > 0) {
j++;
}
}
if (j > 0) {
mRequestQueues[REQUEST_GEOFENCE].push(new RemoveGeofencesRequest(*this));
mLocationAPI->removeGeofences(j, sessions);
}
} else {
LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__,
mRequestQueues[REQUEST_GEOFENCE].getSession());
}
free(sessions);
}
pthread_mutex_unlock(&mMutex);
} }
void LocationAPIClientBase::locAPIGnssNiResponse(uint32_t id, GnssNiResponse response) void LocationAPIClientBase::locAPIGnssNiResponse(uint32_t id, GnssNiResponse response)

View File

@@ -36,6 +36,8 @@
#include <map> #include <map>
#include "LocationAPI.h" #include "LocationAPI.h"
#include <loc_pla.h>
#include <log_util.h>
enum SESSION_MODE { enum SESSION_MODE {
SESSION_MODE_NONE = 0, SESSION_MODE_NONE = 0,
@@ -195,7 +197,7 @@ public:
uint32_t locAPIStopSession(uint32_t id); uint32_t locAPIStopSession(uint32_t id);
uint32_t locAPIUpdateSessionOptions(uint32_t id, uint32_t sessionMode, uint32_t locAPIUpdateSessionOptions(uint32_t id, uint32_t sessionMode,
LocationOptions& options); LocationOptions& options);
void locAPIGetBatchedLocations(uint32_t id, size_t count); uint32_t locAPIGetBatchedLocations(uint32_t id, size_t count);
uint32_t locAPIAddGeofences(size_t count, uint32_t* ids, uint32_t locAPIAddGeofences(size_t count, uint32_t* ids,
GeofenceOption* options, GeofenceInfo* data); GeofenceOption* options, GeofenceInfo* data);
@@ -381,7 +383,10 @@ private:
class StartTrackingRequest : public LocationAPIRequest { class StartTrackingRequest : public LocationAPIRequest {
public: public:
StartTrackingRequest(LocationAPIClientBase& API) : mAPI(API) {} StartTrackingRequest(LocationAPIClientBase& API) : mAPI(API) {}
inline void onResponse(LocationError error, uint32_t /*id*/) { inline void onResponse(LocationError error, uint32_t id) {
if (error != LOCATION_ERROR_SUCCESS) {
mAPI.removeSession(id);
}
mAPI.onStartTrackingCb(error); mAPI.onStartTrackingCb(error);
} }
LocationAPIClientBase& mAPI; LocationAPIClientBase& mAPI;
@@ -411,7 +416,10 @@ private:
class StartBatchingRequest : public LocationAPIRequest { class StartBatchingRequest : public LocationAPIRequest {
public: public:
StartBatchingRequest(LocationAPIClientBase& API) : mAPI(API) {} StartBatchingRequest(LocationAPIClientBase& API) : mAPI(API) {}
inline void onResponse(LocationError error, uint32_t /*id*/) { inline void onResponse(LocationError error, uint32_t id) {
if (error != LOCATION_ERROR_SUCCESS) {
mAPI.removeSession(id);
}
mAPI.onStartBatchingCb(error); mAPI.onStartBatchingCb(error);
} }
LocationAPIClientBase& mAPI; LocationAPIClientBase& mAPI;
@@ -463,17 +471,24 @@ private:
class RemoveGeofencesRequest : public LocationAPIRequest { class RemoveGeofencesRequest : public LocationAPIRequest {
public: public:
RemoveGeofencesRequest(LocationAPIClientBase& API) : mAPI(API) {} RemoveGeofencesRequest(LocationAPIClientBase& API,
BiDict<GeofenceBreachTypeMask>* removedGeofenceBiDict) :
mAPI(API), mRemovedGeofenceBiDict(removedGeofenceBiDict) {}
inline void onCollectiveResponse(size_t count, LocationError* errors, uint32_t* sessions) { inline void onCollectiveResponse(size_t count, LocationError* errors, uint32_t* sessions) {
uint32_t *ids = (uint32_t*)malloc(sizeof(uint32_t) * count); if (nullptr != mRemovedGeofenceBiDict) {
for (size_t i = 0; i < count; i++) { uint32_t *ids = (uint32_t*)malloc(sizeof(uint32_t) * count);
ids[i] = mAPI.mGeofenceBiDict.getId(sessions[i]); for (size_t i = 0; i < count; i++) {
mAPI.mGeofenceBiDict.rmBySession(sessions[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__);
} }
mAPI.onRemoveGeofencesCb(count, errors, ids);
free(ids);
} }
LocationAPIClientBase& mAPI; LocationAPIClientBase& mAPI;
BiDict<GeofenceBreachTypeMask>* mRemovedGeofenceBiDict;
}; };
class ModifyGeofencesRequest : public LocationAPIRequest { class ModifyGeofencesRequest : public LocationAPIRequest {

View File

@@ -1,9 +1,10 @@
ACLOCAL_AMFLAGS = -I m4
AM_CFLAGS = \ AM_CFLAGS = \
$(LOCPLA_CFLAGS) \
$(GPSUTILS_CFLAGS) \
$(LOCHAL_CFLAGS) \
-I./ \ -I./ \
-I../utils \ -I../utils \
$(LOCPLA_CFLAGS) \
$(GPSUTILS_CFLAGS) \
-std=c++11 -std=c++11
liblocation_api_la_SOURCES = \ liblocation_api_la_SOURCES = \
@@ -12,15 +13,15 @@ liblocation_api_la_SOURCES = \
if USE_GLIB if USE_GLIB
liblocation_api_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@ liblocation_api_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@
liblocation_api_la_LDFLAGS = -lstdc++ -lpthread @GLIB_LIBS@ -shared -version-info 1:0:0 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@ liblocation_api_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@
else else
liblocation_api_la_CFLAGS = $(AM_CFLAGS) liblocation_api_la_CFLAGS = $(AM_CFLAGS)
liblocation_api_la_LDFLAGS = -lpthread -shared -version-info 1:0:0 liblocation_api_la_LDFLAGS = -Wl,-z,defs -lpthread -shared -version-info 1:0:0
liblocation_api_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) liblocation_api_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS)
endif endif
liblocation_api_la_LIBADD = -lstdc++ $(LOCPLA_LIBS) $(GPSUTILS_LIBS) $(LOCHAL_LIBS) liblocation_api_la_LIBADD = -lstdc++ -ldl $(GPSUTILS_LIBS)
library_include_HEADERS = \ library_include_HEADERS = \
LocationAPI.h \ LocationAPI.h \
@@ -31,10 +32,7 @@ library_include_HEADERS = \
lib_LTLIBRARIES = liblocation_api.la lib_LTLIBRARIES = liblocation_api.la
library_includedir = $(pkgincludedir) library_includedir = $(pkgincludedir)
#pkgconfigdir = $(libdir)/pkgconfig
#pkgconfig_DATA = location-api.pc
#EXTRA_DIST = $(pkgconfig_DATA)
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = location-api.pc
EXTRA_DIST = $(pkgconfig_DATA)

View File

@@ -1,17 +1,17 @@
# configure.ac -- Autoconf script for gps loc-pla # configure.ac -- Autoconf script for gps location-api-iface
# #
# Process this file with autoconf to produce a configure script # Process this file with autoconf to produce a configure script
# Requires autoconf tool later than 2.61 # Requires autoconf tool later than 2.61
AC_PREREQ(2.61) AC_PREREQ(2.61)
# Initialize the gps loc-pla package version 1.0.0 # Initialize the gps location-api-iface package version 1.0.0
AC_INIT([loc-pla],1.0.0) AC_INIT([location-api-iface],1.0.0)
# Does not strictly follow GNU Coding standards # Does not strictly follow GNU Coding standards
AM_INIT_AUTOMAKE([foreign]) AM_INIT_AUTOMAKE([foreign])
# Disables auto rebuilding of configure, Makefile.ins # Disables auto rebuilding of configure, Makefile.ins
AM_MAINTAINER_MODE AM_MAINTAINER_MODE
# Verifies the --srcdir is correct by checking for the path # Verifies the --srcdir is correct by checking for the path
AC_CONFIG_SRCDIR([include/platform_lib_includes.h]) AC_CONFIG_SRCDIR([location-api.pc.in])
# defines some macros variable to be included by source # defines some macros variable to be included by source
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
@@ -29,9 +29,31 @@ AC_PROG_MAKE_SET
PKG_PROG_PKG_CONFIG PKG_PROG_PKG_CONFIG
# Checks for libraries. # Checks for libraries.
PKG_CHECK_MODULES([LOCSTUB], [loc-stub]) PKG_CHECK_MODULES([GPSUTILS], [gps-utils])
AC_SUBST([LOCSTUB_CFLAGS]) AC_SUBST([GPSUTILS_CFLAGS])
AC_SUBST([LOCSTUB_LIBS]) 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_ARG_WITH([glib],
AC_HELP_STRING([--with-glib], AC_HELP_STRING([--with-glib],
@@ -54,8 +76,7 @@ AM_CONDITIONAL(USE_GLIB, test "x${with_glib}" = "xyes")
AC_CONFIG_FILES([ \ AC_CONFIG_FILES([ \
Makefile \ Makefile \
src/Makefile \ location-api.pc \
loc-pla.pc \
]) ])
AC_OUTPUT AC_OUTPUT

View File

@@ -0,0 +1,10 @@
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

View File

@@ -48,6 +48,7 @@ struct GnssInterface {
void (*disable)(uint32_t id); void (*disable)(uint32_t id);
uint32_t* (*gnssUpdateConfig)(GnssConfig config); uint32_t* (*gnssUpdateConfig)(GnssConfig config);
uint32_t (*gnssDeleteAidingData)(GnssAidingData& data); uint32_t (*gnssDeleteAidingData)(GnssAidingData& data);
void (*gnssUpdateXtraThrottle)(const bool enabled);
void (*injectLocation)(double latitude, double longitude, float accuracy); void (*injectLocation)(double latitude, double longitude, float accuracy);
void (*injectTime)(int64_t time, int64_t timeReference, int32_t uncertainty); void (*injectTime)(int64_t time, int64_t timeReference, int32_t uncertainty);
void (*agpsInit)(const AgpsCbInfo& cbInfo); void (*agpsInit)(const AgpsCbInfo& cbInfo);
@@ -55,7 +56,9 @@ struct GnssInterface {
void (*agpsDataConnClosed)(AGpsExtType agpsType); void (*agpsDataConnClosed)(AGpsExtType agpsType);
void (*agpsDataConnFailed)(AGpsExtType agpsType); void (*agpsDataConnFailed)(AGpsExtType agpsType);
void (*getDebugReport)(GnssDebugReport& report); void (*getDebugReport)(GnssDebugReport& report);
void (*updateConnectionStatus)(bool connected, uint8_t type); void (*updateConnectionStatus)(bool connected, int8_t type);
void (*odcpiInit)(const OdcpiRequestCallback& callback);
void (*odcpiInject)(const Location& location);
}; };
struct FlpInterface { struct FlpInterface {

30
gps/pla/Android.mk Normal file
View File

@@ -0,0 +1,30 @@
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

View File

@@ -26,19 +26,33 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __LOC_STUB_GETTID_H__ #ifndef __LOC_PLA__
#define __LOC_STUB_GETTID_H__ #define __LOC_PLA__
#include <pthread.h> #ifdef __cplusplus
#include <utils/SystemClock.h>
#define uptimeMillis android::uptimeMillis
#endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
pid_t gettid(void); #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 #ifdef __cplusplus
} }
#endif #endif /*__cplusplus */
#endif /* __LOC_STUB_GETTID_H__ */ #endif /* __LOC_PLA__ */

View File

@@ -26,19 +26,42 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __PLATFORM_LIB_PROPERTY_SERVICE_H__ #ifndef __LOC_PLA__
#define __PLATFORM_LIB_PROPERTY_SERVICE_H__ #define __LOC_PLA__
#ifdef __cplusplus #ifdef __cplusplus
#include <utils/SystemClock.h>
#define uptimeMillis android::uptimeMillis
extern "C" { extern "C" {
#endif #endif
#ifndef PROPERTY_VALUE_MAX
#define PROPERTY_VALUE_MAX 92 #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 #endif
int platform_lib_abstraction_property_get(const char *key, char *value, const char *default_value);
#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 #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif /*__cplusplus */
#endif /* __PLATFORM_LIB_PROPERTY_SERVICE_H__ */ #endif /* __LOC_PLA__ */

View File

@@ -11,8 +11,7 @@ include $(CLEAR_VARS)
LOCAL_SHARED_LIBRARIES := \ LOCAL_SHARED_LIBRARIES := \
libutils \ libutils \
libcutils \ libcutils \
liblog \ liblog
libloc_pla
LOCAL_SRC_FILES += \ LOCAL_SRC_FILES += \
loc_log.cpp \ loc_log.cpp \
@@ -20,13 +19,13 @@ LOCAL_SRC_FILES += \
msg_q.c \ msg_q.c \
linked_list.c \ linked_list.c \
loc_target.cpp \ loc_target.cpp \
platform_lib_abstractions/elapsed_millis_since_boot.cpp \
LocHeap.cpp \ LocHeap.cpp \
LocTimer.cpp \ LocTimer.cpp \
LocThread.cpp \ LocThread.cpp \
MsgTask.cpp \ MsgTask.cpp \
loc_misc_utils.cpp \ loc_misc_utils.cpp \
loc_nmea.cpp loc_nmea.cpp \
LocIpc.cpp
# Flag -std=c++11 is not accepted by compiler when LOCAL_CLANG is set to true # Flag -std=c++11 is not accepted by compiler when LOCAL_CLANG is set to true
LOCAL_CFLAGS += \ LOCAL_CFLAGS += \
@@ -41,12 +40,12 @@ LOCAL_LDFLAGS += -Wl,--export-dynamic
## Includes ## Includes
LOCAL_HEADER_LIBRARIES := \ LOCAL_HEADER_LIBRARIES := \
libutils_headers \
libloc_pla_headers \ libloc_pla_headers \
liblocation_api_headers liblocation_api_headers
LOCAL_MODULE := libgps.utils LOCAL_MODULE := libgps.utils
LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib LOCAL_VENDOR_MODULE := true
LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64
LOCAL_MODULE_TAGS := optional LOCAL_MODULE_TAGS := optional
LOCAL_PRELINK_MODULE := false LOCAL_PRELINK_MODULE := false
@@ -60,6 +59,5 @@ LOCAL_MODULE := libgps.utils_headers
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH) LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)
include $(BUILD_HEADER_LIBRARY) include $(BUILD_HEADER_LIBRARY)
include $(addsuffix /Android.mk, $(addprefix $(LOCAL_PATH)/, platform_lib_abstractions))
endif # not BUILD_TINY_ANDROID endif # not BUILD_TINY_ANDROID
endif # BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE endif # BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE

237
gps/utils/LocIpc.cpp Normal file
View File

@@ -0,0 +1,237 @@
/* 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;
}
}

153
gps/utils/LocIpc.h Normal file
View File

@@ -0,0 +1,153 @@
/* 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__

View File

@@ -29,7 +29,7 @@
#include <LocThread.h> #include <LocThread.h>
#include <string.h> #include <string.h>
#include <pthread.h> #include <pthread.h>
#include <platform_lib_macros.h> #include <loc_pla.h>
class LocThreadDelegate { class LocThreadDelegate {
LocRunnable* mRunnable; LocRunnable* mRunnable;

View File

@@ -27,13 +27,15 @@
* *
*/ */
#include <unistd.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
#include <errno.h> #include <errno.h>
#include <loc_timer.h>
#include <sys/timerfd.h> #include <sys/timerfd.h>
#include <sys/epoll.h> #include <sys/epoll.h>
#include <log_util.h>
#include <loc_timer.h>
#include <LocTimer.h> #include <LocTimer.h>
#include <LocHeap.h> #include <LocHeap.h>
#include <LocThread.h> #include <LocThread.h>

View File

@@ -31,7 +31,7 @@
#define __LOC_TIMER_CPP_H__ #define __LOC_TIMER_CPP_H__
#include <stddef.h> #include <stddef.h>
#include <platform_lib_includes.h> #include <loc_pla.h>
// opaque class to provide service implementation. // opaque class to provide service implementation.
class LocTimerDelegate; class LocTimerDelegate;

Some files were not shown because too many files have changed in this diff Show More