diff --git a/device.mk b/device.mk index e51adb7..d50c1ac 100755 --- a/device.mk +++ b/device.mk @@ -198,8 +198,7 @@ PRODUCT_PACKAGES += \ libcurl \ libgnss \ libgnsspps \ - libsensorndkbridge \ - libwifi-hal-ctrl + libsensorndkbridge PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/gps/etc/flp.conf:$(TARGET_COPY_OUT_VENDOR)/etc/flp.conf \ diff --git a/gps/Android.mk b/gps/Android.mk old mode 100755 new mode 100644 index 86d8174..3be1512 --- a/gps/Android.mk +++ b/gps/Android.mk @@ -15,7 +15,4 @@ # limitations under the License. # -LOCAL_PATH := $(call my-dir) -include $(LOCAL_PATH)/build/target_specific_features.mk - -include $(call all-makefiles-under,$(LOCAL_PATH)) +include $(call first-makefiles-under,$(call my-dir)) diff --git a/gps/android/AGnss.cpp b/gps/android/AGnss.cpp old mode 100755 new mode 100644 index faaf75e..3602e85 --- a/gps/android/AGnss.cpp +++ b/gps/android/AGnss.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017, The Linux Foundation. All rights reserved. * Not a Contribution */ /* diff --git a/gps/android/AGnss.h b/gps/android/AGnss.h old mode 100755 new mode 100644 index cdd5931..ead6416 --- a/gps/android/AGnss.h +++ b/gps/android/AGnss.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -18,8 +18,8 @@ * limitations under the License. */ -#ifndef ANDROID_HARDWARE_GNSS_V1_0_AGNSS_H -#define ANDROID_HARDWARE_GNSS_V1_0_AGNSS_H +#ifndef ANDROID_HARDWARE_GNSS_V1_1_AGNSS_H +#define ANDROID_HARDWARE_GNSS_V1_1_AGNSS_H #include #include @@ -76,4 +76,4 @@ struct AGnss : public IAGnss { } // namespace hardware } // namespace android -#endif // ANDROID_HARDWARE_GNSS_V1_0_AGNSS_H +#endif // ANDROID_HARDWARE_GNSS_V1_1_AGNSS_H diff --git a/gps/android/AGnssRil.cpp b/gps/android/AGnssRil.cpp old mode 100755 new mode 100644 index f4b9849..d790bae --- a/gps/android/AGnssRil.cpp +++ b/gps/android/AGnssRil.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017, The Linux Foundation. All rights reserved. * Not a Contribution */ /* diff --git a/gps/android/AGnssRil.h b/gps/android/AGnssRil.h old mode 100755 new mode 100644 index 7f18c57..61216d8 --- a/gps/android/AGnssRil.h +++ b/gps/android/AGnssRil.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017, The Linux Foundation. All rights reserved. * Not a Contribution */ /* diff --git a/gps/android/Android.mk b/gps/android/Android.mk old mode 100755 new mode 100644 index dc721db..9d0e07c --- a/gps/android/Android.mk +++ b/gps/android/Android.mk @@ -2,7 +2,8 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := android.hardware.gnss@1.0-impl-qti -LOCAL_VENDOR_MODULE := true +LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib +LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64 LOCAL_MODULE_RELATIVE_PATH := hw LOCAL_SRC_FILES := \ AGnss.cpp \ @@ -33,9 +34,6 @@ LOCAL_HEADER_LIBRARIES := \ LOCAL_SHARED_LIBRARIES := \ liblog \ libhidlbase \ - libhidltransport \ - libhwbinder \ - libcutils \ libutils \ android.hardware.gnss@1.0 \ @@ -43,6 +41,7 @@ LOCAL_SHARED_LIBRARIES += \ libloc_core \ libgps.utils \ libdl \ + libloc_pla \ liblocation_api \ LOCAL_CFLAGS += $(GNSS_CFLAGS) @@ -51,15 +50,19 @@ include $(BUILD_SHARED_LIBRARY) BUILD_GNSS_HIDL_SERVICE := true ifneq ($(BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET), true) ifneq ($(LW_FEATURE_SET),true) +ifneq ($(TARGET_HAS_LOW_RAM),true) BUILD_GNSS_HIDL_SERVICE := false +endif # TARGET_HAS_LOW_RAM endif # LW_FEATURE_SET endif # BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET ifeq ($(BUILD_GNSS_HIDL_SERVICE), true) include $(CLEAR_VARS) LOCAL_MODULE := android.hardware.gnss@1.0-service-qti -LOCAL_VENDOR_MODULE := true +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXECUTABLES) LOCAL_MODULE_RELATIVE_PATH := hw +LOCAL_VENDOR_MODULE := true +LOCAL_MODULE_OWNER := qti LOCAL_INIT_RC := android.hardware.gnss@1.0-service-qti.rc LOCAL_SRC_FILES := \ service.cpp \ @@ -81,9 +84,7 @@ LOCAL_SHARED_LIBRARIES := \ libutils \ LOCAL_SHARED_LIBRARIES += \ - libhwbinder \ libhidlbase \ - libhidltransport \ android.hardware.gnss@1.0 \ LOCAL_CFLAGS += $(GNSS_CFLAGS) diff --git a/gps/android/Gnss.cpp b/gps/android/Gnss.cpp old mode 100755 new mode 100644 index c844118..e3fd64e --- a/gps/android/Gnss.cpp +++ b/gps/android/Gnss.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -20,13 +20,9 @@ #define LOG_TAG "LocSvc_GnssInterface" -#include #include #include -#include #include "Gnss.h" -#include - typedef void* (getLocationInterface)(); namespace android { @@ -111,7 +107,7 @@ GnssInterface* Gnss::getGnssInterface() { return mGnssInterface; } -Return Gnss::setCallback(const sp& callback) { +Return Gnss::setCallback(const sp& callback) { ENTRY_LOG_CALLFLOW(); if (mGnssCbIface != nullptr) { mGnssCbIface->unlinkToDeath(mGnssDeathRecipient); @@ -255,7 +251,7 @@ Return Gnss::injectTime(int64_t timeMs, int64_t timeReferenceMs, } } -Return Gnss::deleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags) { +Return Gnss::deleteAidingData(IGnss::GnssAidingData aidingDataFlags) { ENTRY_LOG_CALLFLOW(); GnssAPIClient* api = getApi(); if (api) { @@ -264,8 +260,8 @@ Return Gnss::deleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags) return Void(); } -Return Gnss::setPositionMode(V1_0::IGnss::GnssPositionMode mode, - V1_0::IGnss::GnssPositionRecurrence recurrence, +Return Gnss::setPositionMode(IGnss::GnssPositionMode mode, + IGnss::GnssPositionRecurrence recurrence, uint32_t minIntervalMs, uint32_t preferredAccuracyMeters, uint32_t preferredTimeMs) { @@ -279,49 +275,48 @@ Return Gnss::setPositionMode(V1_0::IGnss::GnssPositionMode mode, return retVal; } -Return> Gnss::getExtensionAGnss() { +Return> Gnss::getExtensionAGnss() { ENTRY_LOG_CALLFLOW(); mAGnssIface = new AGnss(this); return mAGnssIface; } -Return> Gnss::getExtensionGnssNi() { +Return> Gnss::getExtensionGnssNi() { ENTRY_LOG_CALLFLOW(); mGnssNi = new GnssNi(this); return mGnssNi; } -Return> Gnss::getExtensionGnssMeasurement() { +Return> Gnss::getExtensionGnssMeasurement() { ENTRY_LOG_CALLFLOW(); - if (mGnssMeasurement == nullptr) - mGnssMeasurement = new GnssMeasurement(); + mGnssMeasurement = new GnssMeasurement(); return mGnssMeasurement; } -Return> Gnss::getExtensionGnssConfiguration() { +Return> Gnss::getExtensionGnssConfiguration() { ENTRY_LOG_CALLFLOW(); mGnssConfig = new GnssConfiguration(this); return mGnssConfig; } -Return> Gnss::getExtensionGnssGeofencing() { +Return> Gnss::getExtensionGnssGeofencing() { ENTRY_LOG_CALLFLOW(); mGnssGeofencingIface = new GnssGeofencing(); return mGnssGeofencingIface; } -Return> Gnss::getExtensionGnssBatching() { +Return> Gnss::getExtensionGnssBatching() { mGnssBatching = new GnssBatching(); return mGnssBatching; } -Return> Gnss::getExtensionGnssDebug() { +Return> Gnss::getExtensionGnssDebug() { ENTRY_LOG_CALLFLOW(); mGnssDebug = new GnssDebug(this); return mGnssDebug; } -Return> Gnss::getExtensionAGnssRil() { +Return> Gnss::getExtensionAGnssRil() { mGnssRil = new AGnssRil(this); return mGnssRil; } diff --git a/gps/android/Gnss.h b/gps/android/Gnss.h old mode 100755 new mode 100644 index 03ef170..e4589d6 --- a/gps/android/Gnss.h +++ b/gps/android/Gnss.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018-2018-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -18,8 +18,8 @@ * limitations under the License. */ -#ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSS_H -#define ANDROID_HARDWARE_GNSS_V1_0_GNSS_H +#ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSS_H +#define ANDROID_HARDWARE_GNSS_V1_1_GNSS_H #include #include @@ -31,7 +31,6 @@ #include #include -#include #include #include @@ -43,24 +42,34 @@ namespace gnss { namespace V1_0 { namespace implementation { -using ::android::hardware::hidl_array; -using ::android::hardware::hidl_memory; -using ::android::hardware::hidl_string; -using ::android::hardware::hidl_vec; using ::android::hardware::Return; using ::android::hardware::Void; +using ::android::hardware::hidl_vec; +using ::android::hardware::hidl_string; using ::android::sp; -using ::android::hardware::gnss::V1_0::GnssLocation; struct Gnss : public IGnss { 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 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. * These declarations were generated from Gnss.hal. */ - Return setCallback(const sp& callback) override; + Return setCallback(const sp& callback) override; Return start() override; Return stop() override; Return cleanup() override; @@ -70,30 +79,30 @@ struct Gnss : public IGnss { Return injectTime(int64_t timeMs, int64_t timeReferenceMs, int32_t uncertaintyMs) override; - Return deleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags) override; - Return setPositionMode(V1_0::IGnss::GnssPositionMode mode, - V1_0::IGnss::GnssPositionRecurrence recurrence, + Return deleteAidingData(IGnss::GnssAidingData aidingDataFlags) override; + Return setPositionMode(IGnss::GnssPositionMode mode, + IGnss::GnssPositionRecurrence recurrence, uint32_t minIntervalMs, uint32_t preferredAccuracyMeters, uint32_t preferredTimeMs) override; - Return> getExtensionAGnss() override; - Return> getExtensionGnssNi() override; - Return> getExtensionGnssMeasurement() override; - Return> getExtensionGnssConfiguration() override; - Return> getExtensionGnssGeofencing() override; - Return> getExtensionGnssBatching() override; + Return> getExtensionAGnss() override; + Return> getExtensionGnssNi() override; + Return> getExtensionGnssMeasurement() override; + Return> getExtensionGnssConfiguration() override; + Return> getExtensionGnssGeofencing() override; + Return> getExtensionGnssBatching() override; - Return> getExtensionAGnssRil() override; + Return> getExtensionAGnssRil() override; - inline Return> getExtensionGnssNavigationMessage() override { + inline Return> getExtensionGnssNavigationMessage() override { return nullptr; } - inline Return> getExtensionXtra() override { + inline Return> getExtensionXtra() override { return nullptr; } - Return> getExtensionGnssDebug() override; + Return> getExtensionGnssDebug() override; // These methods are not part of the IGnss base class. GnssAPIClient* getApi(); @@ -101,9 +110,6 @@ struct Gnss : public IGnss { Return updateConfiguration(GnssConfig& gnssConfig); GnssInterface* getGnssInterface(); - // Callback for ODCPI request - void odcpiRequestCb(const OdcpiRequestInfo& request); - private: struct GnssDeathRecipient : hidl_death_recipient { GnssDeathRecipient(sp gnss) : mGnss(gnss) { @@ -126,8 +132,8 @@ struct Gnss : public IGnss { sp mGnssRil = nullptr; GnssAPIClient* mApi = nullptr; - sp mGnssCbIface = nullptr; - sp mGnssNiCbIface = nullptr; + sp mGnssCbIface = nullptr; + sp mGnssNiCbIface = nullptr; GnssConfig mPendingConfig; GnssInterface* mGnssInterface = nullptr; }; @@ -140,4 +146,4 @@ extern "C" IGnss* HIDL_FETCH_IGnss(const char* name); } // namespace hardware } // namespace android -#endif // ANDROID_HARDWARE_GNSS_V1_0_GNSS_H +#endif // ANDROID_HARDWARE_GNSS_V1_1_GNSS_H diff --git a/gps/android/GnssBatching.cpp b/gps/android/GnssBatching.cpp old mode 100755 new mode 100644 index 3e5a9f4..6ffadc9 --- a/gps/android/GnssBatching.cpp +++ b/gps/android/GnssBatching.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017, The Linux Foundation. All rights reserved. * Not a Contribution */ /* diff --git a/gps/android/GnssBatching.h b/gps/android/GnssBatching.h old mode 100755 new mode 100644 index 8fab857..de5d5c3 --- a/gps/android/GnssBatching.h +++ b/gps/android/GnssBatching.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -18,8 +18,8 @@ * limitations under the License. */ -#ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSBATCHING_H -#define ANDROID_HARDWARE_GNSS_V1_0_GNSSBATCHING_H +#ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSBATCHING_H +#define ANDROID_HARDWARE_GNSS_V1_1_GNSSBATCHING_H #include #include @@ -77,4 +77,4 @@ struct GnssBatching : public IGnssBatching { } // namespace hardware } // namespace android -#endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSBATCHING_H +#endif // ANDROID_HARDWARE_GNSS_V1_1_GNSSBATCHING_H diff --git a/gps/android/GnssConfiguration.cpp b/gps/android/GnssConfiguration.cpp old mode 100755 new mode 100644 index 15153dd..51ee892 --- a/gps/android/GnssConfiguration.cpp +++ b/gps/android/GnssConfiguration.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017, The Linux Foundation. All rights reserved. * Not a Contribution */ /* diff --git a/gps/android/GnssConfiguration.h b/gps/android/GnssConfiguration.h old mode 100755 new mode 100644 index 1629e06..f9ea423 --- a/gps/android/GnssConfiguration.h +++ b/gps/android/GnssConfiguration.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017, The Linux Foundation. All rights reserved. * Not a Contribution */ @@ -19,8 +19,8 @@ */ -#ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSCONFIGURATION_H -#define ANDROID_HARDWARE_GNSS_V1_0_GNSSCONFIGURATION_H +#ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSCONFIGURATION_H +#define ANDROID_HARDWARE_GNSS_V1_1_GNSSCONFIGURATION_H #include #include @@ -68,4 +68,4 @@ struct GnssConfiguration : public IGnssConfiguration { } // namespace hardware } // namespace android -#endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSCONFIGURATION_H +#endif // ANDROID_HARDWARE_GNSS_V1_1_GNSSCONFIGURATION_H diff --git a/gps/android/GnssDebug.cpp b/gps/android/GnssDebug.cpp old mode 100755 new mode 100644 index 3d8e055..ff467d3 --- a/gps/android/GnssDebug.cpp +++ b/gps/android/GnssDebug.cpp @@ -30,14 +30,8 @@ namespace implementation { using ::android::hardware::hidl_vec; -#define GNSS_DEBUG_UNKNOWN_HORIZONTAL_ACCURACY_METERS (20000000) -#define GNSS_DEBUG_UNKNOWN_VERTICAL_ACCURACY_METERS (20000) -#define GNSS_DEBUG_UNKNOWN_SPEED_ACCURACY_PER_SEC (500) -#define GNSS_DEBUG_UNKNOWN_BEARING_ACCURACY_DEG (180) - -#define GNSS_DEBUG_UNKNOWN_UTC_TIME (1483228800000LL) // 1/1/2017 00:00 GMT -#define GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC (1.57783680E17) // 5 years in ns -#define GNSS_DEBUG_UNKNOWN_FREQ_UNC_NS_PER_SEC (2.0e5) // ppm +#define GNSS_DEBUG_UNKNOWN_UTC_TIME (1483228800000ULL) // 1/1/2017 00:00 GMT +#define GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC (1.57783680E17) // 5 years in ns GnssDebug::GnssDebug(Gnss* gnss) : mGnss(gnss) { @@ -97,40 +91,6 @@ Return GnssDebug::getDebugData(getDebugData_cb _hidl_cb) data.position.valid = false; } - if (data.position.horizontalAccuracyMeters <= 0 || - data.position.horizontalAccuracyMeters > GNSS_DEBUG_UNKNOWN_HORIZONTAL_ACCURACY_METERS) { - data.position.horizontalAccuracyMeters = GNSS_DEBUG_UNKNOWN_HORIZONTAL_ACCURACY_METERS; - } - if (data.position.verticalAccuracyMeters <= 0 || - data.position.verticalAccuracyMeters > GNSS_DEBUG_UNKNOWN_VERTICAL_ACCURACY_METERS) { - data.position.verticalAccuracyMeters = GNSS_DEBUG_UNKNOWN_VERTICAL_ACCURACY_METERS; - } - if (data.position.speedAccuracyMetersPerSecond <= 0 || - data.position.speedAccuracyMetersPerSecond > GNSS_DEBUG_UNKNOWN_SPEED_ACCURACY_PER_SEC) { - data.position.speedAccuracyMetersPerSecond = GNSS_DEBUG_UNKNOWN_SPEED_ACCURACY_PER_SEC; - } - if (data.position.bearingAccuracyDegrees <= 0 || - data.position.bearingAccuracyDegrees > GNSS_DEBUG_UNKNOWN_BEARING_ACCURACY_DEG) { - data.position.bearingAccuracyDegrees = GNSS_DEBUG_UNKNOWN_BEARING_ACCURACY_DEG; - } - - if (data.position.horizontalAccuracyMeters <= 0 || - data.position.horizontalAccuracyMeters > GNSS_DEBUG_UNKNOWN_HORIZONTAL_ACCURACY_METERS) { - data.position.horizontalAccuracyMeters = GNSS_DEBUG_UNKNOWN_HORIZONTAL_ACCURACY_METERS; - } - if (data.position.verticalAccuracyMeters <= 0 || - data.position.verticalAccuracyMeters > GNSS_DEBUG_UNKNOWN_VERTICAL_ACCURACY_METERS) { - data.position.verticalAccuracyMeters = GNSS_DEBUG_UNKNOWN_VERTICAL_ACCURACY_METERS; - } - if (data.position.speedAccuracyMetersPerSecond <= 0 || - data.position.speedAccuracyMetersPerSecond > GNSS_DEBUG_UNKNOWN_SPEED_ACCURACY_PER_SEC) { - data.position.speedAccuracyMetersPerSecond = GNSS_DEBUG_UNKNOWN_SPEED_ACCURACY_PER_SEC; - } - if (data.position.bearingAccuracyDegrees <= 0 || - data.position.bearingAccuracyDegrees > GNSS_DEBUG_UNKNOWN_BEARING_ACCURACY_DEG) { - data.position.bearingAccuracyDegrees = GNSS_DEBUG_UNKNOWN_BEARING_ACCURACY_DEG; - } - // time block if (reports.mTime.mValid) { data.time.timeEstimate = reports.mTime.timeEstimate; @@ -138,17 +98,10 @@ Return GnssDebug::getDebugData(getDebugData_cb _hidl_cb) data.time.frequencyUncertaintyNsPerSec = reports.mTime.frequencyUncertaintyNsPerSec; } - - if (data.time.timeEstimate < GNSS_DEBUG_UNKNOWN_UTC_TIME) { + else { data.time.timeEstimate = GNSS_DEBUG_UNKNOWN_UTC_TIME; - } - if (data.time.timeUncertaintyNs <= 0 || - data.time.timeUncertaintyNs > (float)GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC) { - data.time.timeUncertaintyNs = (float)GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC; - } - if (data.time.frequencyUncertaintyNsPerSec <= 0 || - data.time.frequencyUncertaintyNsPerSec > (float)GNSS_DEBUG_UNKNOWN_FREQ_UNC_NS_PER_SEC) { - data.time.frequencyUncertaintyNsPerSec = (float)GNSS_DEBUG_UNKNOWN_FREQ_UNC_NS_PER_SEC; + data.time.timeUncertaintyNs = (float)(GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC); + data.time.frequencyUncertaintyNsPerSec = 0; } // satellite data block diff --git a/gps/android/GnssDebug.h b/gps/android/GnssDebug.h old mode 100755 new mode 100644 index a7116cb..7d29131 --- a/gps/android/GnssDebug.h +++ b/gps/android/GnssDebug.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSDEBUG_H -#define ANDROID_HARDWARE_GNSS_V1_0_GNSSDEBUG_H +#ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSDEBUG_H +#define ANDROID_HARDWARE_GNSS_V1_1_GNSSDEBUG_H #include @@ -56,4 +56,4 @@ private: } // namespace hardware } // namespace android -#endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSDEBUG_H +#endif // ANDROID_HARDWARE_GNSS_V1_1_GNSSDEBUG_H diff --git a/gps/android/GnssGeofencing.cpp b/gps/android/GnssGeofencing.cpp old mode 100755 new mode 100644 index 2a8ff88..035a092 --- a/gps/android/GnssGeofencing.cpp +++ b/gps/android/GnssGeofencing.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017, The Linux Foundation. All rights reserved. * Not a Contribution */ /* diff --git a/gps/android/GnssGeofencing.h b/gps/android/GnssGeofencing.h old mode 100755 new mode 100644 index db5f9d2..7af5f91 --- a/gps/android/GnssGeofencing.h +++ b/gps/android/GnssGeofencing.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -18,8 +18,8 @@ * limitations under the License. */ -#ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSGEOFENCING_H -#define ANDROID_HARDWARE_GNSS_V1_0_GNSSGEOFENCING_H +#ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSGEOFENCING_H +#define ANDROID_HARDWARE_GNSS_V1_1_GNSSGEOFENCING_H #include #include @@ -88,4 +88,4 @@ struct GnssGeofencing : public IGnssGeofencing { } // namespace hardware } // namespace android -#endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSGEOFENCING_H +#endif // ANDROID_HARDWARE_GNSS_V1_1_GNSSGEOFENCING_H diff --git a/gps/android/GnssMeasurement.cpp b/gps/android/GnssMeasurement.cpp old mode 100755 new mode 100644 index 1c65bd6..8cbfabd --- a/gps/android/GnssMeasurement.cpp +++ b/gps/android/GnssMeasurement.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -52,9 +52,8 @@ GnssMeasurement::~GnssMeasurement() { } // Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow. - Return GnssMeasurement::setCallback( - const sp& callback) { + const sp& callback) { Return ret = IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC; @@ -73,10 +72,9 @@ Return GnssMeasurement::setCallback( } mGnssMeasurementCbIface = callback; - mGnssMeasurementCbIface->linkToDeath(mGnssMeasurementDeathRecipient, 0); + mGnssMeasurementCbIface->linkToDeath(mGnssMeasurementDeathRecipient, 0 /*cookie*/); return mApi->measurementSetCallback(callback); - } Return GnssMeasurement::close() { diff --git a/gps/android/GnssMeasurement.h b/gps/android/GnssMeasurement.h old mode 100755 new mode 100644 index 4247dbf..5073169 --- a/gps/android/GnssMeasurement.h +++ b/gps/android/GnssMeasurement.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -18,11 +18,10 @@ * limitations under the License. */ -#ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSMEASUREMENT_H -#define ANDROID_HARDWARE_GNSS_V1_0_GNSSMEASUREMENT_H +#ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSMEASUREMENT_H +#define ANDROID_HARDWARE_GNSS_V1_1_GNSSMEASUREMENT_H #include -#include #include namespace android { @@ -48,8 +47,8 @@ struct GnssMeasurement : public IGnssMeasurement { * Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow. * These declarations were generated from IGnssMeasurement.hal. */ - Return setCallback( - const sp& callback) override; + Return setCallback( + const sp& callback) override; Return close() override; private: @@ -64,7 +63,7 @@ struct GnssMeasurement : public IGnssMeasurement { private: sp mGnssMeasurementDeathRecipient = nullptr; - sp mGnssMeasurementCbIface = nullptr; + sp mGnssMeasurementCbIface = nullptr; MeasurementAPIClient* mApi; }; @@ -74,4 +73,4 @@ struct GnssMeasurement : public IGnssMeasurement { } // namespace hardware } // namespace android -#endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSMEASUREMENT_H +#endif // ANDROID_HARDWARE_GNSS_V1_1_GNSSMEASUREMENT_H diff --git a/gps/android/GnssNi.cpp b/gps/android/GnssNi.cpp old mode 100755 new mode 100644 index d06cc20..4437932 --- a/gps/android/GnssNi.cpp +++ b/gps/android/GnssNi.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017, The Linux Foundation. All rights reserved. * Not a Contribution */ /* diff --git a/gps/android/GnssNi.h b/gps/android/GnssNi.h old mode 100755 new mode 100644 index 90f62d5..f6fe0bb --- a/gps/android/GnssNi.h +++ b/gps/android/GnssNi.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -18,8 +18,8 @@ * limitations under the License. */ -#ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSNI_H -#define ANDROID_HARDWARE_GNSS_V1_0_GNSSNI_H +#ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSNI_H +#define ANDROID_HARDWARE_GNSS_V1_1_GNSSNI_H #include #include @@ -72,4 +72,4 @@ struct GnssNi : public IGnssNi { } // namespace hardware } // namespace android -#endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSNI_H +#endif // ANDROID_HARDWARE_GNSS_V1_1_GNSSNI_H diff --git a/gps/android/android.hardware.gnss@1.1-service-qti.rc b/gps/android/android.hardware.gnss@1.0-service-qti.rc old mode 100755 new mode 100644 similarity index 88% rename from gps/android/android.hardware.gnss@1.1-service-qti.rc rename to gps/android/android.hardware.gnss@1.0-service-qti.rc index b5da6f9..d4d40fa --- a/gps/android/android.hardware.gnss@1.1-service-qti.rc +++ b/gps/android/android.hardware.gnss@1.0-service-qti.rc @@ -1,4 +1,4 @@ service gnss_service /vendor/bin/hw/android.hardware.gnss@1.0-service-qti - class hal + class main user gps group system gps radio diff --git a/gps/android/location_api/BatchingAPIClient.cpp b/gps/android/location_api/BatchingAPIClient.cpp old mode 100755 new mode 100644 index 264ab83..0b66d38 --- a/gps/android/location_api/BatchingAPIClient.cpp +++ b/gps/android/location_api/BatchingAPIClient.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -45,10 +45,6 @@ namespace gnss { namespace V1_0 { namespace implementation { -using ::android::hardware::gnss::V1_0::IGnssBatching; -using ::android::hardware::gnss::V1_0::IGnssBatchingCallback; -using ::android::hardware::gnss::V1_0::GnssLocation; - static void convertBatchOption(const IGnssBatching::Options& in, LocationOptions& out, LocationCapabilitiesMask mask); @@ -157,8 +153,7 @@ void BatchingAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMa 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); if (mGnssBatchingCbIface != nullptr && count > 0) { diff --git a/gps/android/location_api/BatchingAPIClient.h b/gps/android/location_api/BatchingAPIClient.h old mode 100755 new mode 100644 index 5d64df3..c951a83 --- a/gps/android/location_api/BatchingAPIClient.h +++ b/gps/android/location_api/BatchingAPIClient.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -45,11 +45,11 @@ namespace implementation { class BatchingAPIClient : public LocationAPIClientBase { public: - BatchingAPIClient(const sp& callback); + BatchingAPIClient(const sp& callback); ~BatchingAPIClient(); int getBatchSize(); - int startSession(const V1_0::IGnssBatching::Options& options); - int updateSessionOptions(const V1_0::IGnssBatching::Options& options); + int startSession(const IGnssBatching::Options& options); + int updateSessionOptions(const IGnssBatching::Options& options); int stopSession(); void getBatchedLocation(int last_n_locations); void flushBatchedLocations(); @@ -61,8 +61,9 @@ public: void onBatchingCb(size_t count, Location* location, BatchingOptions batchOptions) final; private: - sp mGnssBatchingCbIface; + sp mGnssBatchingCbIface; uint32_t mDefaultId; + int mBatchSize; LocationCapabilitiesMask mLocationCapabilitiesMask; }; diff --git a/gps/android/location_api/GeofenceAPIClient.cpp b/gps/android/location_api/GeofenceAPIClient.cpp old mode 100755 new mode 100644 index 774a049..6167177 --- a/gps/android/location_api/GeofenceAPIClient.cpp +++ b/gps/android/location_api/GeofenceAPIClient.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -42,8 +42,6 @@ namespace gnss { namespace V1_0 { namespace implementation { -using ::android::hardware::gnss::V1_0::IGnssGeofenceCallback; -using ::android::hardware::gnss::V1_0::GnssLocation; GeofenceAPIClient::GeofenceAPIClient(const sp& callback) : LocationAPIClientBase(), @@ -160,7 +158,7 @@ void GeofenceAPIClient::onGeofenceBreachCb(GeofenceBreachNotification geofenceBr auto r = mGnssGeofencingCbIface->gnssGeofenceTransitionCb( geofenceBreachNotification.ids[i], gnssLocation, transition, - static_cast(geofenceBreachNotification.timestamp)); + static_cast(geofenceBreachNotification.timestamp)); if (!r.isOk()) { LOC_LOGE("%s] Error from gnssGeofenceTransitionCb description=%s", __func__, r.description().c_str()); diff --git a/gps/android/location_api/GeofenceAPIClient.h b/gps/android/location_api/GeofenceAPIClient.h old mode 100755 new mode 100644 index dc99ddd..f779bcb --- a/gps/android/location_api/GeofenceAPIClient.h +++ b/gps/android/location_api/GeofenceAPIClient.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -45,7 +45,7 @@ using ::android::sp; class GeofenceAPIClient : public LocationAPIClientBase { public: - GeofenceAPIClient(const sp& callback); + GeofenceAPIClient(const sp& callback); virtual ~GeofenceAPIClient() = default; void geofenceAdd(uint32_t geofence_id, double latitude, double longitude, @@ -65,7 +65,7 @@ public: void onResumeGeofencesCb(size_t count, LocationError* errors, uint32_t* ids) final; private: - sp mGnssGeofencingCbIface; + sp mGnssGeofencingCbIface; }; } // namespace implementation diff --git a/gps/android/location_api/GnssAPIClient.cpp b/gps/android/location_api/GnssAPIClient.cpp old mode 100755 new mode 100644 index 320ae15..2e44c2e --- a/gps/android/location_api/GnssAPIClient.cpp +++ b/gps/android/location_api/GnssAPIClient.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -43,11 +43,6 @@ namespace gnss { namespace V1_0 { namespace implementation { -using ::android::hardware::gnss::V1_0::IGnss; -using ::android::hardware::gnss::V1_0::IGnssCallback; -using ::android::hardware::gnss::V1_0::IGnssNiCallback; -using ::android::hardware::gnss::V1_0::GnssLocation; - static void convertGnssSvStatus(GnssSvNotification& in, IGnssCallback::GnssSvStatus& out); GnssAPIClient::GnssAPIClient(const sp& gpsCb, @@ -165,10 +160,6 @@ bool GnssAPIClient::gnssSetPositionMode(IGnss::GnssPositionMode mode, mLocationOptions.size = sizeof(LocationOptions); mLocationOptions.minInterval = minIntervalMs; mLocationOptions.minDistance = preferredAccuracyMeters; - if (IGnss::GnssPositionRecurrence::RECURRENCE_SINGLE == recurrence) { - mLocationOptions.minInterval = - std::numeric_limits::max(); - } if (mode == IGnss::GnssPositionMode::STANDALONE) mLocationOptions.mode = GNSS_SUPL_MODE_STANDALONE; else if (mode == IGnss::GnssPositionMode::MS_BASED) @@ -454,7 +445,7 @@ void GnssAPIClient::onGnssNmeaCb(GnssNmeaNotification gnssNmeaNotification) android::hardware::hidl_string nmeaString; nmeaString.setToExternal(gnssNmeaNotification.nmea, gnssNmeaNotification.length); auto r = gnssCbIface->gnssNmeaCb( - static_cast(gnssNmeaNotification.timestamp), nmeaString); + static_cast(gnssNmeaNotification.timestamp), nmeaString); if (!r.isOk()) { LOC_LOGE("%s] Error from gnssNmeaCb nmea=%s length=%zu description=%s", __func__, gnssNmeaNotification.nmea, gnssNmeaNotification.length, r.description().c_str()); @@ -508,10 +499,10 @@ static void convertGnssSvStatus(GnssSvNotification& in, IGnssCallback::GnssSvSta { memset(&out, 0, sizeof(IGnssCallback::GnssSvStatus)); out.numSvs = in.count; - if (out.numSvs > static_cast(V1_0::GnssMax::SVS_COUNT)) { - LOC_LOGW("%s]: Too many satellites %u. Clamps to %d.", - __FUNCTION__, out.numSvs, V1_0::GnssMax::SVS_COUNT); - out.numSvs = static_cast(V1_0::GnssMax::SVS_COUNT); + if (out.numSvs > static_cast(GnssMax::SVS_COUNT)) { + LOC_LOGW("%s]: Too many satellites %zd. Clamps to %d.", + __FUNCTION__, out.numSvs, GnssMax::SVS_COUNT); + out.numSvs = static_cast(GnssMax::SVS_COUNT); } for (size_t i = 0; i < out.numSvs; i++) { IGnssCallback::GnssSvInfo& info = out.gnssSvList[i]; diff --git a/gps/android/location_api/GnssAPIClient.h b/gps/android/location_api/GnssAPIClient.h old mode 100755 new mode 100644 index 923cb48..b5cffb1 --- a/gps/android/location_api/GnssAPIClient.h +++ b/gps/android/location_api/GnssAPIClient.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -30,7 +30,6 @@ #ifndef GNSS_API_CLINET_H #define GNSS_API_CLINET_H - #include #include #include @@ -48,28 +47,28 @@ using ::android::sp; class GnssAPIClient : public LocationAPIClientBase { public: - GnssAPIClient(const sp& gpsCb, - const sp& niCb); + GnssAPIClient(const sp& gpsCb, + const sp& niCb); virtual ~GnssAPIClient(); GnssAPIClient(const GnssAPIClient&) = delete; GnssAPIClient& operator=(const GnssAPIClient&) = delete; // for GpsInterface - void gnssUpdateCallbacks(const sp& gpsCb, - const sp& niCb); + void gnssUpdateCallbacks(const sp& gpsCb, + const sp& niCb); bool gnssStart(); bool gnssStop(); - bool gnssSetPositionMode(V1_0::IGnss::GnssPositionMode mode, - V1_0::IGnss::GnssPositionRecurrence recurrence, + bool gnssSetPositionMode(IGnss::GnssPositionMode mode, + IGnss::GnssPositionRecurrence recurrence, uint32_t minIntervalMs, uint32_t preferredAccuracyMeters, uint32_t preferredTimeMs); // for GpsNiInterface - void gnssNiRespond(int32_t notifId, V1_0::IGnssNiCallback::GnssUserResponseType userResponse); + void gnssNiRespond(int32_t notifId, IGnssNiCallback::GnssUserResponseType userResponse); // these apis using LocationAPIControlClient - void gnssDeleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags); + void gnssDeleteAidingData(IGnss::GnssAidingData aidingDataFlags); void gnssEnable(LocationTechnologyType techType); void gnssDisable(); void gnssConfigurationUpdate(const GnssConfig& gnssConfig); @@ -90,13 +89,12 @@ public: void onStopTrackingCb(LocationError error) final; private: - sp mGnssCbIface; - sp mGnssNiCbIface; + sp mGnssCbIface; + sp mGnssNiCbIface; std::mutex mMutex; LocationAPIControlClient* mControlClient; LocationCapabilitiesMask mLocationCapabilitiesMask; bool mLocationCapabilitiesCached; - LocationOptions mLocationOptions; }; diff --git a/gps/android/location_api/LocationUtil.cpp b/gps/android/location_api/LocationUtil.cpp old mode 100755 new mode 100644 index 89681f2..311c0b2 --- a/gps/android/location_api/LocationUtil.cpp +++ b/gps/android/location_api/LocationUtil.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -35,10 +35,6 @@ namespace gnss { namespace V1_0 { namespace implementation { -using ::android::hardware::gnss::V1_0::GnssLocation; -using ::android::hardware::gnss::V1_0::GnssConstellationType; -using ::android::hardware::gnss::V1_0::GnssLocationFlags; - void convertGnssLocation(Location& in, GnssLocation& out) { memset(&out, 0, sizeof(GnssLocation)); @@ -67,38 +63,7 @@ void convertGnssLocation(Location& in, GnssLocation& out) out.verticalAccuracyMeters = in.verticalAccuracy; out.speedAccuracyMetersPerSecond = in.speedAccuracy; out.bearingAccuracyDegrees = in.bearingAccuracy; - out.timestamp = static_cast(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(in.timestamp); + out.timestamp = static_cast(in.timestamp); } void convertGnssConstellationType(GnssSvType& in, GnssConstellationType& out) diff --git a/gps/android/location_api/LocationUtil.h b/gps/android/location_api/LocationUtil.h old mode 100755 new mode 100644 index 9e0cd36..44d5e02 --- a/gps/android/location_api/LocationUtil.h +++ b/gps/android/location_api/LocationUtil.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -40,9 +40,8 @@ namespace gnss { namespace V1_0 { namespace implementation { -void convertGnssLocation(Location& in, V1_0::GnssLocation& out); -void convertGnssLocation(const V1_0::GnssLocation& in, Location& out); -void convertGnssConstellationType(GnssSvType& in, V1_0::GnssConstellationType& out); +void convertGnssLocation(Location& in, GnssLocation& out); +void convertGnssConstellationType(GnssSvType& in, GnssConstellationType& out); void convertGnssEphemerisType(GnssEphemerisType& in, GnssDebug::SatelliteEphemerisType& out); void convertGnssEphemerisSource(GnssEphemerisSource& in, GnssDebug::SatelliteEphemerisSource& out); void convertGnssEphemerisHealth(GnssEphemerisHealth& in, GnssDebug::SatelliteEphemerisHealth& out); diff --git a/gps/android/location_api/MeasurementAPIClient.cpp b/gps/android/location_api/MeasurementAPIClient.cpp old mode 100755 new mode 100644 index 823851d..731c7ed --- a/gps/android/location_api/MeasurementAPIClient.cpp +++ b/gps/android/location_api/MeasurementAPIClient.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -42,13 +42,10 @@ namespace gnss { namespace V1_0 { namespace implementation { -using ::android::hardware::gnss::V1_0::IGnssMeasurement; -using ::android::hardware::gnss::V1_0::IGnssMeasurementCallback; - static void convertGnssData(GnssMeasurementsNotification& in, - V1_0::IGnssMeasurementCallback::GnssData& out); + IGnssMeasurementCallback::GnssData& out); static void convertGnssMeasurement(GnssMeasurementsData& in, - V1_0::IGnssMeasurementCallback::GnssMeasurement& out); + IGnssMeasurementCallback::GnssMeasurement& out); static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback::GnssClock& out); MeasurementAPIClient::MeasurementAPIClient() : @@ -65,7 +62,7 @@ MeasurementAPIClient::~MeasurementAPIClient() // for GpsInterface Return -MeasurementAPIClient::measurementSetCallback(const sp& callback) +MeasurementAPIClient::measurementSetCallback(const sp& callback) { LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback); @@ -73,12 +70,6 @@ MeasurementAPIClient::measurementSetCallback(const sp -MeasurementAPIClient::startTracking() -{ LocationCallbacks locationCallbacks; memset(&locationCallbacks, 0, sizeof(LocationCallbacks)); locationCallbacks.size = sizeof(LocationCallbacks); @@ -124,18 +115,15 @@ void MeasurementAPIClient::measurementClose() { void MeasurementAPIClient::onGnssMeasurementsCb( GnssMeasurementsNotification gnssMeasurementsNotification) { - LOC_LOGD("%s]: (count: %zu active: %d)", + LOC_LOGD("%s]: (count: %zu active: %zu)", __FUNCTION__, gnssMeasurementsNotification.count, mTracking); if (mTracking) { mMutex.lock(); - sp gnssMeasurementCbIface = nullptr; - if (mGnssMeasurementCbIface != nullptr) { - gnssMeasurementCbIface = mGnssMeasurementCbIface; - } + auto gnssMeasurementCbIface(mGnssMeasurementCbIface); mMutex.unlock(); if (gnssMeasurementCbIface != nullptr) { - V1_0::IGnssMeasurementCallback::GnssData gnssData; + IGnssMeasurementCallback::GnssData gnssData; convertGnssData(gnssMeasurementsNotification, gnssData); auto r = gnssMeasurementCbIface->GnssMeasurementCb(gnssData); if (!r.isOk()) { @@ -147,7 +135,7 @@ void MeasurementAPIClient::onGnssMeasurementsCb( } static void convertGnssMeasurement(GnssMeasurementsData& in, - V1_0::IGnssMeasurementCallback::GnssMeasurement& out) + IGnssMeasurementCallback::GnssMeasurement& out) { memset(&out, 0, sizeof(IGnssMeasurementCallback::GnssMeasurement)); if (in.flags & GNSS_MEASUREMENTS_DATA_SIGNAL_TO_NOISE_RATIO_BIT) @@ -254,13 +242,13 @@ static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback } static void convertGnssData(GnssMeasurementsNotification& in, - V1_0::IGnssMeasurementCallback::GnssData& out) + IGnssMeasurementCallback::GnssData& out) { out.measurementCount = in.count; - if (out.measurementCount > static_cast(V1_0::GnssMax::SVS_COUNT)) { - LOC_LOGW("%s]: Too many measurement %u. Clamps to %d.", - __FUNCTION__, out.measurementCount, V1_0::GnssMax::SVS_COUNT); - out.measurementCount = static_cast(V1_0::GnssMax::SVS_COUNT); + if (out.measurementCount > static_cast(GnssMax::SVS_COUNT)) { + LOC_LOGW("%s]: Too many measurement %zd. Clamps to %d.", + __FUNCTION__, out.measurementCount, GnssMax::SVS_COUNT); + out.measurementCount = static_cast(GnssMax::SVS_COUNT); } for (size_t i = 0; i < out.measurementCount; i++) { convertGnssMeasurement(in.measurements[i], out.measurements[i]); diff --git a/gps/android/location_api/MeasurementAPIClient.h b/gps/android/location_api/MeasurementAPIClient.h old mode 100755 new mode 100644 index 08b4811..8de1326 --- a/gps/android/location_api/MeasurementAPIClient.h +++ b/gps/android/location_api/MeasurementAPIClient.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -42,6 +42,7 @@ namespace gnss { namespace V1_0 { namespace implementation { +using ::android::hardware::gnss::V1_0::IGnssMeasurement; using ::android::sp; class MeasurementAPIClient : public LocationAPIClientBase @@ -53,18 +54,16 @@ public: MeasurementAPIClient& operator=(const MeasurementAPIClient&) = delete; // for GpsMeasurementInterface - Return measurementSetCallback( - const sp& callback); + Return measurementSetCallback( + const sp& callback); void measurementClose(); - Return startTracking(); // callbacks we are interested in void onGnssMeasurementsCb(GnssMeasurementsNotification gnssMeasurementsNotification) final; private: + sp mGnssMeasurementCbIface; std::mutex mMutex; - sp mGnssMeasurementCbIface; - bool mTracking; }; diff --git a/gps/android/service.cpp b/gps/android/service.cpp old mode 100755 new mode 100644 index c03b7ea..5779e67 --- a/gps/android/service.cpp +++ b/gps/android/service.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -18,9 +18,9 @@ * limitations under the License. */ -#define LOG_TAG "android.hardware.gnss@1.1-service-qti" +#define LOG_TAG "android.hardware.gnss@1.0-service-qti" -#include +#include #include using android::hardware::gnss::V1_0::IGnss; diff --git a/gps/build/target_specific_features.mk b/gps/build/target_specific_features.mk deleted file mode 100755 index 943e231..0000000 --- a/gps/build/target_specific_features.mk +++ /dev/null @@ -1,17 +0,0 @@ -GNSS_CFLAGS := \ - -Werror \ - -Wno-error=unused-parameter \ - -Wno-error=format \ - -Wno-error=macro-redefined \ - -Wno-error=reorder \ - -Wno-error=missing-braces \ - -Wno-error=self-assign \ - -Wno-error=enum-conversion \ - -Wno-error=logical-op-parentheses \ - -Wno-error=null-arithmetic \ - -Wno-error=null-conversion \ - -Wno-error=parentheses-equality \ - -Wno-error=undefined-bool-conversion \ - -Wno-error=tautological-compare \ - -Wno-error=switch \ - -Wno-error=date-time diff --git a/gps/core/Android.mk b/gps/core/Android.mk old mode 100755 new mode 100644 index bbb001f..df16535 --- a/gps/core/Android.mk +++ b/gps/core/Android.mk @@ -3,7 +3,9 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libloc_core -LOCAL_VENDOR_MODULE := true +LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib +LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64 +LOCAL_MODULE_TAGS := optional ifeq ($(BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET),true) LOCAL_CFLAGS += -DPDK_FEATURE_SET @@ -15,7 +17,8 @@ LOCAL_SHARED_LIBRARIES := \ libcutils \ libgps.utils \ libdl \ - liblog + liblog \ + libloc_pla LOCAL_SRC_FILES += \ LocApiBase.cpp \ @@ -24,6 +27,9 @@ LOCAL_SRC_FILES += \ LocDualContext.cpp \ loc_core_log.cpp \ data-items/DataItemsFactoryProxy.cpp \ + data-items/common/ClientIndex.cpp \ + data-items/common/DataItemIndex.cpp \ + data-items/common/IndexFactory.cpp \ SystemStatusOsObserver.cpp \ SystemStatus.cpp @@ -37,7 +43,6 @@ LOCAL_C_INCLUDES:= \ $(LOCAL_PATH)/observer \ LOCAL_HEADER_LIBRARIES := \ - libutils_headers \ libgps.utils_headers \ libloc_pla_headers \ liblocation_api_headers diff --git a/gps/core/ContextBase.cpp b/gps/core/ContextBase.cpp old mode 100755 new mode 100644 index 35e6585..8af48fc --- a/gps/core/ContextBase.cpp +++ b/gps/core/ContextBase.cpp @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include namespace loc_core { @@ -65,8 +65,6 @@ 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'}, {"AGPS_CONFIG_INJECT", &mGps_conf.AGPS_CONFIG_INJECT, NULL, 'n'}, {"EXTERNAL_DR_ENABLED", &mGps_conf.EXTERNAL_DR_ENABLED, NULL, 'n'}, - {"SUPL_HOST", &mGps_conf.SUPL_HOST, NULL, 's'}, - {"SUPL_PORT", &mGps_conf.SUPL_PORT, NULL, 'n'}, }; const loc_param_s_type ContextBase::mSap_conf_table[] = @@ -100,8 +98,6 @@ void ContextBase::readConfig() mGps_conf.SUPL_VER = 0x10000; mGps_conf.SUPL_MODE = 0x1; mGps_conf.SUPL_ES = 0; - mGps_conf.SUPL_HOST[0] = 0; - mGps_conf.SUPL_PORT = 0; mGps_conf.CAPABILITIES = 0x7; /* LTE Positioning Profile configuration is disable by default*/ mGps_conf.LPP_PROFILE = 0; diff --git a/gps/core/ContextBase.h b/gps/core/ContextBase.h old mode 100755 new mode 100644 index dc64b6a..83de999 --- a/gps/core/ContextBase.h +++ b/gps/core/ContextBase.h @@ -36,8 +36,7 @@ #include #include -#define MAX_XTRA_SERVER_URL_LENGTH (256) -#define MAX_SUPL_SERVER_URL_LENGTH (256) +#define MAX_XTRA_SERVER_URL_LENGTH 256 /* GPS.conf support */ /* NOTE: the implementaiton of the parser casts number @@ -65,8 +64,6 @@ typedef struct loc_gps_cfg_s uint32_t LPPE_CP_TECHNOLOGY; uint32_t LPPE_UP_TECHNOLOGY; uint32_t EXTERNAL_DR_ENABLED; - char SUPL_HOST[MAX_SUPL_SERVER_URL_LENGTH]; - uint32_t SUPL_PORT; } loc_gps_cfg_s_type; /* NOTE: the implementaiton of the parser casts number diff --git a/gps/core/LBSProxyBase.h b/gps/core/LBSProxyBase.h old mode 100755 new mode 100644 diff --git a/gps/core/LocAdapterBase.cpp b/gps/core/LocAdapterBase.cpp old mode 100755 new mode 100644 index d0da3da..3943819 --- a/gps/core/LocAdapterBase.cpp +++ b/gps/core/LocAdapterBase.cpp @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include namespace loc_core { @@ -161,8 +161,4 @@ bool LocAdapterBase:: reportWwanZppFix(LocGpsLocation &/*zppLoc*/) DEFAULT_IMPL(false) -bool LocAdapterBase:: - reportOdcpiRequestEvent(OdcpiRequestInfo& /*request*/) -DEFAULT_IMPL(false) - } // namespace loc_core diff --git a/gps/core/LocAdapterBase.h b/gps/core/LocAdapterBase.h old mode 100755 new mode 100644 index 35fc48e..e7beca8 --- a/gps/core/LocAdapterBase.h +++ b/gps/core/LocAdapterBase.h @@ -153,7 +153,6 @@ public: virtual void reportGnssMeasurementDataEvent(const GnssMeasurementsNotification& measurements, int msInWeek); virtual bool reportWwanZppFix(LocGpsLocation &zppLoc); - virtual bool reportOdcpiRequestEvent(OdcpiRequestInfo& request); }; } // namespace loc_core diff --git a/gps/core/LocAdapterProxyBase.h b/gps/core/LocAdapterProxyBase.h old mode 100755 new mode 100644 diff --git a/gps/core/LocApiBase.cpp b/gps/core/LocApiBase.cpp old mode 100755 new mode 100644 index 426335d..e0845de --- a/gps/core/LocApiBase.cpp +++ b/gps/core/LocApiBase.cpp @@ -33,7 +33,7 @@ #include #include #include -#include +#include #include namespace loc_core { @@ -107,16 +107,19 @@ struct LocSsrMsg : public LocMsg { struct LocOpenMsg : public LocMsg { LocApiBase* mLocApi; - inline LocOpenMsg(LocApiBase* locApi) : - LocMsg(), mLocApi(locApi) + LOC_API_ADAPTER_EVENT_MASK_T mMask; + inline LocOpenMsg(LocApiBase* locApi, + LOC_API_ADAPTER_EVENT_MASK_T mask) : + LocMsg(), mLocApi(locApi), mMask(mask) { locallog(); } inline virtual void proc() const { - mLocApi->open(mLocApi->getEvtMask()); + mLocApi->open(mMask); } inline void locallog() const { - LOC_LOGv("LocOpen Mask: %" PRIx64 "\n", mLocApi->getEvtMask()); + LOC_LOGV("%s:%d]: LocOpen Mask: %x\n", + __func__, __LINE__, mMask); } inline virtual void log() const { locallog(); @@ -160,7 +163,8 @@ void LocApiBase::addAdapter(LocAdapterBase* adapter) for (int i = 0; i < MAX_ADAPTERS && mLocAdapters[i] != adapter; i++) { if (mLocAdapters[i] == NULL) { mLocAdapters[i] = adapter; - mMsgTask->sendMsg(new LocOpenMsg(this)); + mMsgTask->sendMsg(new LocOpenMsg(this, + (adapter->getEvtMask()))); break; } } @@ -196,7 +200,7 @@ void LocApiBase::removeAdapter(LocAdapterBase* adapter) close(); } else { // else we need to remove the bit - mMsgTask->sendMsg(new LocOpenMsg(this)); + mMsgTask->sendMsg(new LocOpenMsg(this, getEvtMask())); } } } @@ -204,7 +208,7 @@ void LocApiBase::removeAdapter(LocAdapterBase* adapter) void LocApiBase::updateEvtMask() { - open(getEvtMask()); + mMsgTask->sendMsg(new LocOpenMsg(this, getEvtMask())); } void LocApiBase::handleEngineUpEvent() @@ -260,12 +264,6 @@ void LocApiBase::reportWwanZppFix(LocGpsLocation &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) { const char* constellationString[] = { "Unknown", "GPS", "SBAS", "GLONASS", @@ -442,10 +440,6 @@ enum loc_api_adapter_err LocApiBase:: injectPosition(double /*latitude*/, double /*longitude*/, float /*accuracy*/) DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS) -enum loc_api_adapter_err LocApiBase:: - injectPosition(const Location& /*location*/) -DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS) - enum loc_api_adapter_err LocApiBase:: setTime(LocGpsUtcTime /*time*/, int64_t /*timeReference*/, int /*uncertainty*/) DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS) diff --git a/gps/core/LocApiBase.h b/gps/core/LocApiBase.h old mode 100755 new mode 100644 index 6563dea..f66bfe1 --- a/gps/core/LocApiBase.h +++ b/gps/core/LocApiBase.h @@ -34,7 +34,7 @@ #include #include #include -#include +#include namespace loc_core { class ContextBase; @@ -134,7 +134,6 @@ public: void reportGnssMeasurementData(GnssMeasurementsNotification& measurements, int msInWeek); void saveSupportedFeatureList(uint8_t *featureList); void reportWwanZppFix(LocGpsLocation &zppLoc); - void reportOdcpiRequest(OdcpiRequestInfo& request); // downward calls // All below functions are to be defined by adapter specific modules: @@ -154,8 +153,6 @@ public: setAPN(char* apn, int len); virtual enum loc_api_adapter_err injectPosition(double latitude, double longitude, float accuracy); - virtual enum loc_api_adapter_err - injectPosition(const Location& location); virtual enum loc_api_adapter_err setTime(LocGpsUtcTime time, int64_t timeReference, int uncertainty); virtual enum loc_api_adapter_err diff --git a/gps/core/LocDualContext.cpp b/gps/core/LocDualContext.cpp old mode 100755 new mode 100644 index 180d9dc..fd3450d --- a/gps/core/LocDualContext.cpp +++ b/gps/core/LocDualContext.cpp @@ -33,7 +33,7 @@ #include #include #include -#include +#include #include namespace loc_core { diff --git a/gps/core/LocDualContext.h b/gps/core/LocDualContext.h old mode 100755 new mode 100644 diff --git a/gps/core/SystemStatus.cpp b/gps/core/SystemStatus.cpp old mode 100755 new mode 100644 index f4316ca..92ddeed --- a/gps/core/SystemStatus.cpp +++ b/gps/core/SystemStatus.cpp @@ -34,8 +34,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include @@ -120,12 +120,6 @@ public: double mAgcGal; // x16 int32_t mLeapSeconds;// x17 int32_t mLeapSecUnc; // x18 - uint32_t mGloBpAmpI; // x19 - uint32_t mGloBpAmpQ; // x1A - uint32_t mBdsBpAmpI; // x1B - uint32_t mBdsBpAmpQ; // x1C - uint32_t mGalBpAmpI; // x1D - uint32_t mGalBpAmpQ; // x1E }; // parser @@ -160,12 +154,6 @@ private: eMax0 = eAgcGal, eLeapSeconds = 23, eLeapSecUnc = 24, - eGloBpAmpI = 25, - eGloBpAmpQ = 26, - eBdsBpAmpI = 27, - eBdsBpAmpQ = 28, - eGalBpAmpI = 29, - eGalBpAmpQ = 30, eMax }; SystemStatusPQWM1 mM1; @@ -195,12 +183,6 @@ public: inline uint32_t getRecErrorRecovery() { return mM1.mRecErrorRecovery; } inline int32_t getLeapSeconds(){ return mM1.mLeapSeconds; } inline int32_t getLeapSecUnc() { return mM1.mLeapSecUnc; } - inline uint32_t getGloBpAmpI() { return mM1.mGloBpAmpI; } - inline uint32_t getGloBpAmpQ() { return mM1.mGloBpAmpQ; } - inline uint32_t getBdsBpAmpI() { return mM1.mBdsBpAmpI; } - inline uint32_t getBdsBpAmpQ() { return mM1.mBdsBpAmpQ; } - inline uint32_t getGalBpAmpI() { return mM1.mGalBpAmpI; } - inline uint32_t getGalBpAmpQ() { return mM1.mGalBpAmpQ; } SystemStatusPQWM1parser(const char *str_in, uint32_t len_in) : SystemStatusNmeaBase(str_in, len_in) @@ -237,14 +219,6 @@ public: 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 @@ -791,13 +765,7 @@ SystemStatusRfAndParams::SystemStatusRfAndParams(const SystemStatusPQWM1& nmea) mAgcGps(nmea.mAgcGps), mAgcGlo(nmea.mAgcGlo), mAgcBds(nmea.mAgcBds), - mAgcGal(nmea.mAgcGal), - mGloBpAmpI(nmea.mGloBpAmpI), - mGloBpAmpQ(nmea.mGloBpAmpQ), - mBdsBpAmpI(nmea.mBdsBpAmpI), - mBdsBpAmpQ(nmea.mBdsBpAmpQ), - mGalBpAmpI(nmea.mGalBpAmpI), - mGalBpAmpQ(nmea.mGalBpAmpQ) + mAgcGal(nmea.mAgcGal) { } @@ -815,13 +783,7 @@ bool SystemStatusRfAndParams::equals(const SystemStatusRfAndParams& peer) (mAgcGps != peer.mAgcGps) || (mAgcGlo != peer.mAgcGlo) || (mAgcBds != peer.mAgcBds) || - (mAgcGal != peer.mAgcGal) || - (mGloBpAmpI != peer.mGloBpAmpI) || - (mGloBpAmpQ != peer.mGloBpAmpQ) || - (mBdsBpAmpI != peer.mBdsBpAmpI) || - (mBdsBpAmpQ != peer.mBdsBpAmpQ) || - (mGalBpAmpI != peer.mGalBpAmpI) || - (mGalBpAmpQ != peer.mGalBpAmpQ)) { + (mAgcGal != peer.mAgcGal)) { return false; } return true; @@ -1255,7 +1217,8 @@ IOsObserver* SystemStatus::getOsObserver() } SystemStatus::SystemStatus(const MsgTask* msgTask) : - mSysStatusObsvr(this, msgTask) + mSysStatusObsvr(this, msgTask), + mConnected(false) { int result = 0; ENTRY_LOG (); @@ -1305,10 +1268,17 @@ SystemStatus::SystemStatus(const MsgTask* msgTask) : /****************************************************************************** SystemStatus - storing dataitems ******************************************************************************/ -template -bool SystemStatus::setIteminReport(TYPE_REPORT& report, TYPE_ITEM&& s) +template +bool SystemStatus::setItemBaseinReport(TYPE_REPORT& report, const TYPE_ITEMBASE& s) { - if (!report.empty() && report.back().equals(static_cast(s.collate(report.back())))) { + TYPE_SYSTEMSTATUS_ITEM sout(s); + return setIteminReport(report, sout); +} + +template +bool SystemStatus::setIteminReport(TYPE_REPORT& report, const TYPE_ITEM& s) +{ + if (!report.empty() && report.back().equals(s)) { // there is no change - just update reported timestamp report.back().mUtcReported = s.mUtcReported; return false; @@ -1347,10 +1317,11 @@ void SystemStatus::getIteminReport(TYPE_REPORT& reportout, const TYPE_ITEM& c) c @param[In] data pointer to the NMEA string @param[In] len length of the NMEA string -@return true when the NMEA is consumed by the method. +@return true when successfully done ******************************************************************************/ bool SystemStatus::setNmeaString(const char *data, uint32_t len) { + bool ret = false; if (!loc_nmea_is_debug(data, len)) { return false; } @@ -1361,43 +1332,43 @@ bool SystemStatus::setNmeaString(const char *data, uint32_t len) pthread_mutex_lock(&mMutexSystemStatus); // 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(); - setIteminReport(mCache.mTimeAndClock, SystemStatusTimeAndClock(s)); - setIteminReport(mCache.mXoState, SystemStatusXoState(s)); - setIteminReport(mCache.mRfAndParams, SystemStatusRfAndParams(s)); - setIteminReport(mCache.mErrRecovery, SystemStatusErrRecovery(s)); + ret |= setIteminReport(mCache.mTimeAndClock, SystemStatusTimeAndClock(s)); + ret |= setIteminReport(mCache.mXoState, SystemStatusXoState(s)); + ret |= setIteminReport(mCache.mRfAndParams, SystemStatusRfAndParams(s)); + ret |= setIteminReport(mCache.mErrRecovery, SystemStatusErrRecovery(s)); } else if (0 == strncmp(data, "$PQWP1", SystemStatusNmeaBase::NMEA_MINSIZE)) { - setIteminReport(mCache.mInjectedPosition, + ret = setIteminReport(mCache.mInjectedPosition, SystemStatusInjectedPosition(SystemStatusPQWP1parser(buf, len).get())); } else if (0 == strncmp(data, "$PQWP2", SystemStatusNmeaBase::NMEA_MINSIZE)) { - setIteminReport(mCache.mBestPosition, + ret = setIteminReport(mCache.mBestPosition, SystemStatusBestPosition(SystemStatusPQWP2parser(buf, len).get())); } else if (0 == strncmp(data, "$PQWP3", SystemStatusNmeaBase::NMEA_MINSIZE)) { - setIteminReport(mCache.mXtra, + ret = setIteminReport(mCache.mXtra, SystemStatusXtra(SystemStatusPQWP3parser(buf, len).get())); } else if (0 == strncmp(data, "$PQWP4", SystemStatusNmeaBase::NMEA_MINSIZE)) { - setIteminReport(mCache.mEphemeris, + ret = setIteminReport(mCache.mEphemeris, SystemStatusEphemeris(SystemStatusPQWP4parser(buf, len).get())); } else if (0 == strncmp(data, "$PQWP5", SystemStatusNmeaBase::NMEA_MINSIZE)) { - setIteminReport(mCache.mSvHealth, + ret = setIteminReport(mCache.mSvHealth, SystemStatusSvHealth(SystemStatusPQWP5parser(buf, len).get())); } else if (0 == strncmp(data, "$PQWP6", SystemStatusNmeaBase::NMEA_MINSIZE)) { - setIteminReport(mCache.mPdr, + ret = setIteminReport(mCache.mPdr, SystemStatusPdr(SystemStatusPQWP6parser(buf, len).get())); } else if (0 == strncmp(data, "$PQWP7", SystemStatusNmeaBase::NMEA_MINSIZE)) { - setIteminReport(mCache.mNavData, + ret = setIteminReport(mCache.mNavData, SystemStatusNavData(SystemStatusPQWP7parser(buf, len).get())); } else if (0 == strncmp(data, "$PQWS1", SystemStatusNmeaBase::NMEA_MINSIZE)) { - setIteminReport(mCache.mPositionFailure, + ret = setIteminReport(mCache.mPositionFailure, SystemStatusPositionFailure(SystemStatusPQWS1parser(buf, len).get())); } else { @@ -1405,7 +1376,7 @@ bool SystemStatus::setNmeaString(const char *data, uint32_t len) } pthread_mutex_unlock(&mMutexSystemStatus); - return true; + return ret; } /****************************************************************************** @@ -1446,92 +1417,94 @@ bool SystemStatus::eventDataItemNotify(IDataItemCore* dataitem) switch(dataitem->getId()) { case AIRPLANEMODE_DATA_ITEM_ID: - ret = setIteminReport(mCache.mAirplaneMode, - SystemStatusAirplaneMode(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mAirplaneMode, + *(static_cast(dataitem))); break; case ENH_DATA_ITEM_ID: - ret = setIteminReport(mCache.mENH, - SystemStatusENH(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mENH, + *(static_cast(dataitem))); break; case GPSSTATE_DATA_ITEM_ID: - ret = setIteminReport(mCache.mGPSState, - SystemStatusGpsState(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mGPSState, + *(static_cast(dataitem))); break; case NLPSTATUS_DATA_ITEM_ID: - ret = setIteminReport(mCache.mNLPStatus, - SystemStatusNLPStatus(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mNLPStatus, + *(static_cast(dataitem))); break; case WIFIHARDWARESTATE_DATA_ITEM_ID: - ret = setIteminReport(mCache.mWifiHardwareState, - SystemStatusWifiHardwareState(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mWifiHardwareState, + *(static_cast(dataitem))); break; case NETWORKINFO_DATA_ITEM_ID: - ret = setIteminReport(mCache.mNetworkInfo, - SystemStatusNetworkInfo(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mNetworkInfo, + *(static_cast(dataitem))); break; case RILSERVICEINFO_DATA_ITEM_ID: - ret = setIteminReport(mCache.mRilServiceInfo, - SystemStatusServiceInfo(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mRilServiceInfo, + *(static_cast(dataitem))); break; case RILCELLINFO_DATA_ITEM_ID: - ret = setIteminReport(mCache.mRilCellInfo, - SystemStatusRilCellInfo(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mRilCellInfo, + *(static_cast(dataitem))); break; case SERVICESTATUS_DATA_ITEM_ID: - ret = setIteminReport(mCache.mServiceStatus, - SystemStatusServiceStatus(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mServiceStatus, + *(static_cast(dataitem))); break; case MODEL_DATA_ITEM_ID: - ret = setIteminReport(mCache.mModel, - SystemStatusModel(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mModel, + *(static_cast(dataitem))); break; case MANUFACTURER_DATA_ITEM_ID: - ret = setIteminReport(mCache.mManufacturer, - SystemStatusManufacturer(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mManufacturer, + *(static_cast(dataitem))); break; case ASSISTED_GPS_DATA_ITEM_ID: - ret = setIteminReport(mCache.mAssistedGps, - SystemStatusAssistedGps(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mAssistedGps, + *(static_cast(dataitem))); break; case SCREEN_STATE_DATA_ITEM_ID: - ret = setIteminReport(mCache.mScreenState, - SystemStatusScreenState(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mScreenState, + *(static_cast(dataitem))); break; case POWER_CONNECTED_STATE_DATA_ITEM_ID: - ret = setIteminReport(mCache.mPowerConnectState, - SystemStatusPowerConnectState(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mPowerConnectState, + *(static_cast(dataitem))); break; case TIMEZONE_CHANGE_DATA_ITEM_ID: - ret = setIteminReport(mCache.mTimeZoneChange, - SystemStatusTimeZoneChange(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mTimeZoneChange, + *(static_cast(dataitem))); break; case TIME_CHANGE_DATA_ITEM_ID: - ret = setIteminReport(mCache.mTimeChange, - SystemStatusTimeChange(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mTimeChange, + *(static_cast(dataitem))); break; case WIFI_SUPPLICANT_STATUS_DATA_ITEM_ID: - ret = setIteminReport(mCache.mWifiSupplicantStatus, - SystemStatusWifiSupplicantStatus(*(static_cast(dataitem)))); + ret = setItemBaseinReport( + mCache.mWifiSupplicantStatus, + *(static_cast(dataitem))); break; case SHUTDOWN_STATE_DATA_ITEM_ID: - ret = setIteminReport(mCache.mShutdownState, - SystemStatusShutdownState(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mShutdownState, + *(static_cast(dataitem))); break; case TAC_DATA_ITEM_ID: - ret = setIteminReport(mCache.mTac, - SystemStatusTac(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mTac, + *(static_cast(dataitem))); break; case MCCMNC_DATA_ITEM_ID: - ret = setIteminReport(mCache.mMccMnc, - SystemStatusMccMnc(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mMccMnc, + *(static_cast(dataitem))); break; case BTLE_SCAN_DATA_ITEM_ID: - ret = setIteminReport(mCache.mBtDeviceScanDetail, - SystemStatusBtDeviceScanDetail(*(static_cast(dataitem)))); + ret = setItemBaseinReport(mCache.mBtDeviceScanDetail, + *(static_cast(dataitem))); break; case BT_SCAN_DATA_ITEM_ID: - ret = setIteminReport(mCache.mBtLeDeviceScanDetail, - SystemStatusBtleDeviceScanDetail(*(static_cast(dataitem)))); + ret = setItemBaseinReport( + mCache.mBtLeDeviceScanDetail, + *(static_cast(dataitem))); break; default: break; @@ -1650,7 +1623,7 @@ bool SystemStatus::getReport(SystemStatusReports& report, bool isLatestOnly) con @return true when successfully done ******************************************************************************/ -bool SystemStatus::setDefaultGnssEngineStates(void) +bool SystemStatus::setDefaultReport(void) { pthread_mutex_lock(&mMutexSystemStatus); @@ -1671,6 +1644,29 @@ bool SystemStatus::setDefaultGnssEngineStates(void) setDefaultIteminReport(mCache.mPositionFailure, SystemStatusPositionFailure()); + setDefaultIteminReport(mCache.mAirplaneMode, SystemStatusAirplaneMode()); + setDefaultIteminReport(mCache.mENH, SystemStatusENH()); + setDefaultIteminReport(mCache.mGPSState, SystemStatusGpsState()); + setDefaultIteminReport(mCache.mNLPStatus, SystemStatusNLPStatus()); + setDefaultIteminReport(mCache.mWifiHardwareState, SystemStatusWifiHardwareState()); + setDefaultIteminReport(mCache.mNetworkInfo, SystemStatusNetworkInfo()); + setDefaultIteminReport(mCache.mRilServiceInfo, SystemStatusServiceInfo()); + setDefaultIteminReport(mCache.mRilCellInfo, SystemStatusRilCellInfo()); + setDefaultIteminReport(mCache.mServiceStatus, SystemStatusServiceStatus()); + setDefaultIteminReport(mCache.mModel, SystemStatusModel()); + setDefaultIteminReport(mCache.mManufacturer, SystemStatusManufacturer()); + setDefaultIteminReport(mCache.mAssistedGps, SystemStatusAssistedGps()); + setDefaultIteminReport(mCache.mScreenState, SystemStatusScreenState()); + setDefaultIteminReport(mCache.mPowerConnectState, SystemStatusPowerConnectState()); + setDefaultIteminReport(mCache.mTimeZoneChange, SystemStatusTimeZoneChange()); + setDefaultIteminReport(mCache.mTimeChange, SystemStatusTimeChange()); + setDefaultIteminReport(mCache.mWifiSupplicantStatus, SystemStatusWifiSupplicantStatus()); + setDefaultIteminReport(mCache.mShutdownState, SystemStatusShutdownState()); + setDefaultIteminReport(mCache.mTac, SystemStatusTac()); + setDefaultIteminReport(mCache.mMccMnc, SystemStatusMccMnc()); + setDefaultIteminReport(mCache.mBtDeviceScanDetail, SystemStatusBtDeviceScanDetail()); + setDefaultIteminReport(mCache.mBtLeDeviceScanDetail, SystemStatusBtleDeviceScanDetail()); + pthread_mutex_unlock(&mMutexSystemStatus); return true; } @@ -1682,12 +1678,17 @@ bool SystemStatus::setDefaultGnssEngineStates(void) @return true when successfully done ******************************************************************************/ -bool SystemStatus::eventConnectionStatus(bool connected, int8_t type) +bool SystemStatus::eventConnectionStatus(bool connected, uint8_t type) { - // send networkinof dataitem to systemstatus observer clients - SystemStatusNetworkInfo s(type, "", "", connected); - mSysStatusObsvr.notify({&s}); + if (connected != mConnected) { + mConnected = connected; + // send networkinof dataitem to systemstatus observer clients + SystemStatusNetworkInfo s(type, "", "", false, connected, false); + list dl(0); + dl.push_back(&s); + mSysStatusObsvr.notify(dl); + } return true; } diff --git a/gps/core/SystemStatus.h b/gps/core/SystemStatus.h old mode 100755 new mode 100644 index b2f4fb6..1bcef10 --- a/gps/core/SystemStatus.h +++ b/gps/core/SystemStatus.h @@ -30,10 +30,9 @@ #define __SYSTEM_STATUS__ #include -#include +#include #include -#include -#include +#include #include #include #include @@ -71,17 +70,14 @@ public: static const uint32_t maxItem = 5; SystemStatusItemBase() { - struct timespec tv; - clock_gettime(CLOCK_MONOTONIC, &tv); + timeval tv; + gettimeofday(&tv, NULL); mUtcTime.tv_sec = tv.tv_sec; - mUtcTime.tv_nsec = tv.tv_nsec; + mUtcTime.tv_nsec = tv.tv_usec *1000ULL; mUtcReported = mUtcTime; }; - virtual ~SystemStatusItemBase() {}; - inline virtual SystemStatusItemBase& collate(SystemStatusItemBase&) { - return *this; - } - virtual void dump(void) {}; + virtual ~SystemStatusItemBase() { }; + virtual void dump(void) { }; }; class SystemStatusLocation : public SystemStatusItemBase @@ -96,7 +92,7 @@ public: const GpsLocationExtended& locationEx) : mValid(true), mLocation(location), - mLocationEx(locationEx) {} + mLocationEx(locationEx) { } bool equals(const SystemStatusLocation& peer); void dump(void); }; @@ -156,12 +152,6 @@ public: double mAgcGlo; double mAgcBds; double mAgcGal; - uint32_t mGloBpAmpI; - uint32_t mGloBpAmpQ; - uint32_t mBdsBpAmpI; - uint32_t mBdsBpAmpQ; - uint32_t mGalBpAmpI; - uint32_t mGalBpAmpQ; inline SystemStatusRfAndParams() : mPgaGain(0), mGpsBpAmpI(0), @@ -175,13 +165,7 @@ public: mAgcGps(0), mAgcGlo(0), mAgcBds(0), - mAgcGal(0), - mGloBpAmpI(0), - mGloBpAmpQ(0), - mBdsBpAmpI(0), - mBdsBpAmpQ(0), - mGalBpAmpI(0), - mGalBpAmpQ(0) {} + mAgcGal(0) {} inline SystemStatusRfAndParams(const SystemStatusPQWM1& nmea); bool equals(const SystemStatusRfAndParams& peer); void dump(void); @@ -460,49 +444,38 @@ public: class SystemStatusNetworkInfo : public SystemStatusItemBase, public NetworkInfoDataItemBase { - NetworkInfoDataItemBase* mSrcObjPtr; public: inline SystemStatusNetworkInfo( int32_t type=0, std::string typeName="", string subTypeName="", + bool available=false, bool connected=false, bool roaming=false) : NetworkInfoDataItemBase( - (NetworkType)type, type, typeName, subTypeName, - connected && (!roaming), + available, connected, - roaming), - mSrcObjPtr(nullptr) {} + roaming) {} inline SystemStatusNetworkInfo(const NetworkInfoDataItemBase& itemBase) : - NetworkInfoDataItemBase(itemBase), - mSrcObjPtr((NetworkInfoDataItemBase*)&itemBase) { + 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(curInfo)).mAllTypes; - if (mConnected) { - mAllTypes |= allTypes; - } else if (0 != mAllTypes) { - mAllTypes = (allTypes & (~mAllTypes)); - } // else (mConnected == false && mAllTypes == 0) - // we keep mAllTypes as 0, which means no more connections. - - if (nullptr != mSrcObjPtr) { - // this is critical, changing mAllTypes of the original obj - mSrcObjPtr->mAllTypes = mAllTypes; + if ((mType == peer.mType) && + (mTypeName == peer.mTypeName) && + (mSubTypeName == peer.mSubTypeName) && + (mAvailable == peer.mAvailable) && + (mConnected == peer.mConnected) && + (mRoaming == peer.mRoaming)) { + return true; } - return *this; + return false; } inline void dump(void) override { - LOC_LOGD("NetworkInfo: mAllTypes=%" PRIx64 " connected=%u mType=%x", - mAllTypes, mConnected, mType); + LOC_LOGD("NetworkInfo: type=%u connected=%u", mType, mConnected); } }; @@ -514,9 +487,8 @@ public: RilServiceInfoDataItemBase() {} inline SystemStatusServiceInfo(const RilServiceInfoDataItemBase& itemBase) : RilServiceInfoDataItemBase(itemBase) {} - inline bool equals(const SystemStatusServiceInfo& peer) { - return static_cast(peer) == - static_cast(*this); + inline bool equals(const SystemStatusServiceInfo& /*peer*/) { + return true; } }; @@ -528,9 +500,8 @@ public: RilCellInfoDataItemBase() {} inline SystemStatusRilCellInfo(const RilCellInfoDataItemBase& itemBase) : RilCellInfoDataItemBase(itemBase) {} - inline bool equals(const SystemStatusRilCellInfo& peer) { - return static_cast(peer) == - static_cast(*this); + inline bool equals(const SystemStatusRilCellInfo& /*peer*/) { + return true; } }; @@ -799,9 +770,13 @@ private: // Data members static pthread_mutex_t mMutexSystemStatus; SystemStatusReports mCache; + bool mConnected; + + template + bool setItemBaseinReport(TYPE_REPORT& report, const TYPE_ITEMBASE& s); template - bool setIteminReport(TYPE_REPORT& report, TYPE_ITEM&& s); + bool setIteminReport(TYPE_REPORT& report, const TYPE_ITEM& s); // set default dataitem derived item in report cache template @@ -821,8 +796,8 @@ public: bool eventDataItemNotify(IDataItemCore* dataitem); bool setNmeaString(const char *data, uint32_t len); bool getReport(SystemStatusReports& reports, bool isLatestonly = false) const; - bool setDefaultGnssEngineStates(void); - bool eventConnectionStatus(bool connected, int8_t type); + bool setDefaultReport(void); + bool eventConnectionStatus(bool connected, uint8_t type); }; } // namespace loc_core diff --git a/gps/core/SystemStatusOsObserver.cpp b/gps/core/SystemStatusOsObserver.cpp old mode 100755 new mode 100644 index 8127e86..541b5fd --- a/gps/core/SystemStatusOsObserver.cpp +++ b/gps/core/SystemStatusOsObserver.cpp @@ -32,20 +32,25 @@ #include #include #include +#include +#include +#include #include namespace loc_core { -template -COUT SystemStatusOsObserver::containerTransfer(CINT& inContainer) { - COUT outContainer(0); - for (auto item : inContainer) { - outContainer.insert(outContainer.begin(), item); - } - return outContainer; +SystemStatusOsObserver::SystemStatusOsObserver( + SystemStatus* systemstatus, const MsgTask* msgTask) : + mSystemStatus(systemstatus), + mAddress("SystemStatusOsObserver"), + mClientIndex(IndexFactory :: createClientIndex()), + mDataItemIndex(IndexFactory :: createDataItemIndex()) +{ + mContext.mMsgTask = msgTask; } -SystemStatusOsObserver::~SystemStatusOsObserver() { +SystemStatusOsObserver::~SystemStatusOsObserver() +{ // Close data-item library handle DataItemsFactoryProxy::closeDataItemLibraryHandle(); @@ -57,238 +62,290 @@ SystemStatusOsObserver::~SystemStatusOsObserver() { } mDataItemCache.clear(); + delete mClientIndex; + delete mDataItemIndex; } void SystemStatusOsObserver::setSubscriptionObj(IDataItemSubscription* subscriptionObj) { - struct SetSubsObj : public LocMsg { - ObserverContext& mContext; - IDataItemSubscription* mSubsObj; - inline SetSubsObj(ObserverContext& context, IDataItemSubscription* subscriptionObj) : - mContext(context), mSubsObj(subscriptionObj) {} - void proc() const { - mContext.mSubscriptionObj = mSubsObj; + mContext.mSubscriptionObj = subscriptionObj; - if (!mContext.mSSObserver->mDataItemToClients.empty()) { - list dis( - containerTransfer, list>( - mContext.mSSObserver->mDataItemToClients.getKeys())); - mContext.mSubscriptionObj->subscribe(dis, mContext.mSSObserver); - mContext.mSubscriptionObj->requestData(dis, mContext.mSSObserver); - } + LOC_LOGD("Request cache size - Subscribe:%zu RequestData:%zu", + mSubscribeReqCache.size(), mReqDataCache.size()); + + // we have received the subscription object. process cached requests + // process - subscribe request cache + for (auto each : mSubscribeReqCache) { + 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& l, IDataItemObserver* client) +{ + ObserverReqCache::iterator dicIter = reqCache.find(client); + if (dicIter != reqCache.end()) { + // found + list 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(); } - }; - - if (nullptr == subscriptionObj) { - LOC_LOGw("subscriptionObj is NULL"); - } else { - mContext.mMsgTask->sendMsg(new SetSubsObj(mContext, subscriptionObj)); + } + else { + // not found + reqCache[client] = l; } } /****************************************************************************** IDataItemSubscription Overrides ******************************************************************************/ -void SystemStatusOsObserver::subscribe(const list& l, IDataItemObserver* client, - bool toRequestData) +void SystemStatusOsObserver::subscribe( + const list& l, IDataItemObserver* client) { + if (nullptr == mContext.mSubscriptionObj) { + LOC_LOGD("%s]: Subscription object is NULL. Caching requests", __func__); + cacheObserverRequest(mSubscribeReqCache, l, client); + return; + } + struct HandleSubscribeReq : public LocMsg { - inline HandleSubscribeReq(SystemStatusOsObserver* parent, - list& l, IDataItemObserver* client, bool requestData) : - mParent(parent), mClient(client), - mDataItemSet(containerTransfer, unordered_set>(l)), - mToRequestData(requestData) {} - + HandleSubscribeReq(SystemStatusOsObserver* parent, + const list& l, IDataItemObserver* client) : + mParent(parent), mClient(client), mDataItemList(l) {} + virtual ~HandleSubscribeReq() {} void proc() const { - unordered_set dataItemsToSubscribe(0); - mParent->mDataItemToClients.add(mDataItemSet, {mClient}, &dataItemsToSubscribe); - mParent->mClientToDataItems.add(mClient, mDataItemSet); - mParent->sendCachedDataItems(mDataItemSet, mClient); + if (mDataItemList.empty()) { + LOC_LOGV("mDataItemList is empty. Nothing to do. Exiting"); + return; + } - // Send subscription set to framework - if (nullptr != mParent->mContext.mSubscriptionObj && !dataItemsToSubscribe.empty()) { + // Handle First Response + list pendingFirstResponseList(0); + 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 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"); - mParent->logMe(dataItemsToSubscribe); - - if (mToRequestData) { - mParent->mContext.mSubscriptionObj->requestData( - containerTransfer, list>( - std::move(dataItemsToSubscribe)), - mParent); - } else { - mParent->mContext.mSubscriptionObj->subscribe( - containerTransfer, list>( - std::move(dataItemsToSubscribe)), - mParent); - } + mParent->logMe(yetToSubscribeDataItemsList); } } - mutable SystemStatusOsObserver* mParent; + SystemStatusOsObserver* mParent; IDataItemObserver* mClient; - const unordered_set mDataItemSet; - bool mToRequestData; + const list mDataItemList; }; - - if (l.empty() || nullptr == client) { - LOC_LOGw("Data item set is empty or client is nullptr"); - } else { - mContext.mMsgTask->sendMsg( - new HandleSubscribeReq(this, (list&)l, client, toRequestData)); - } + mContext.mMsgTask->sendMsg(new (nothrow) HandleSubscribeReq(this, l, client)); } void SystemStatusOsObserver::updateSubscription( const list& l, IDataItemObserver* client) { + if (nullptr == mContext.mSubscriptionObj) { + LOC_LOGE("%s:%d]: Subscription object is NULL", __func__, __LINE__); + return; + } + struct HandleUpdateSubscriptionReq : public LocMsg { HandleUpdateSubscriptionReq(SystemStatusOsObserver* parent, - list& l, IDataItemObserver* client) : - mParent(parent), mClient(client), - mDataItemSet(containerTransfer, unordered_set>(l)) {} - + const list& l, IDataItemObserver* client) : + mParent(parent), mClient(client), mDataItemList(l) {} + virtual ~HandleUpdateSubscriptionReq() {} void proc() const { - unordered_set dataItemsToSubscribe(0); - unordered_set dataItemsToUnsubscribe(0); - unordered_set clients({mClient}); - // below removes clients from all entries keyed with the return of the - // mClientToDataItems.update() call. If leaving an empty set of clients as the - // result, the entire entry will be removed. dataItemsToUnsubscribe will be - // populated to keep the keys of the removed entries. - mParent->mDataItemToClients.trimOrRemove( - // this call updates map; removes - // the DataItemId's that are not new to the clietn from mDataItemSet; - // and returns a set of mDataItemSet's that are no longer used by client. - // This unused set of mDataItemSet's is passed to trimOrRemove method of - // map to remove the client from the - // corresponding entries, and gets a set of the entries that are - // removed from the map as a result. - mParent->mClientToDataItems.update(mClient, - (unordered_set&)mDataItemSet), - clients, &dataItemsToUnsubscribe, nullptr); - // below adds mClient to map, and populates - // new keys added to that map, which are DataItemIds to be subscribed. - mParent->mDataItemToClients.add(mDataItemSet, clients, &dataItemsToSubscribe); + if (mDataItemList.empty()) { + LOC_LOGV("mDataItemList is empty. Nothing to do. Exiting"); + return; + } + + list currentlySubscribedList(0); + mParent->mClientIndex->getSubscribedList(mClient, currentlySubscribedList); + + list removeDataItemList(0); + set_difference(currentlySubscribedList.begin(), currentlySubscribedList.end(), + mDataItemList.begin(), mDataItemList.end(), + inserter(removeDataItemList,removeDataItemList.begin())); + + // Handle First Response + list pendingFirstResponseList(0); + mParent->mClientIndex->add(mClient, mDataItemList, pendingFirstResponseList); // Send First Response - mParent->sendCachedDataItems(mDataItemSet, mClient); + mParent->sendFirstResponse(pendingFirstResponseList, mClient); - if (nullptr != mParent->mContext.mSubscriptionObj) { - // Send subscription set to framework - if (!dataItemsToSubscribe.empty()) { - LOC_LOGD("Subscribe Request sent to framework for the following"); - mParent->logMe(dataItemsToSubscribe); + list yetToSubscribeDataItemsList(0); + mParent->mDataItemIndex->add( + mClient, mDataItemList, yetToSubscribeDataItemsList); - mParent->mContext.mSubscriptionObj->subscribe( - containerTransfer, list>( - std::move(dataItemsToSubscribe)), - mParent); - } + // Send subscription list to framework + if (!yetToSubscribeDataItemsList.empty()) { + mParent->mContext.mSubscriptionObj->subscribe( + yetToSubscribeDataItemsList, mParent); + LOC_LOGD("Subscribe Request sent to framework for the following"); + mParent->logMe(yetToSubscribeDataItemsList); + } + list unsubscribeList(0); + list unused(0); + mParent->mClientIndex->remove(mClient, removeDataItemList, unused); + + if (!mParent->mClientIndex->isSubscribedClient(mClient)) { + mParent->mDataItemIndex->remove( + list (1,mClient), unsubscribeList); + } + if (!unsubscribeList.empty()) { // Send unsubscribe to framework - if (!dataItemsToUnsubscribe.empty()) { - LOC_LOGD("Unsubscribe Request sent to framework for the following"); - mParent->logMe(dataItemsToUnsubscribe); - - mParent->mContext.mSubscriptionObj->unsubscribe( - containerTransfer, list>( - std::move(dataItemsToUnsubscribe)), - mParent); - } + mParent->mContext.mSubscriptionObj->unsubscribe(unsubscribeList, mParent); + LOC_LOGD("Unsubscribe Request sent to framework for the following"); + mParent->logMe(unsubscribeList); } } SystemStatusOsObserver* mParent; IDataItemObserver* mClient; - unordered_set mDataItemSet; + const list mDataItemList; }; + mContext.mMsgTask->sendMsg(new (nothrow) HandleUpdateSubscriptionReq(this, l, client)); +} - if (l.empty() || nullptr == client) { - LOC_LOGw("Data item set is empty or client is nullptr"); - } else { - mContext.mMsgTask->sendMsg( - new HandleUpdateSubscriptionReq(this, (list&)l, client)); +void SystemStatusOsObserver::requestData( + const list& l, IDataItemObserver* client) +{ + if (nullptr == mContext.mSubscriptionObj) { + LOC_LOGD("%s]: Subscription object is NULL. Caching requests", __func__); + cacheObserverRequest(mReqDataCache, l, client); + return; } + + struct HandleRequestData : public LocMsg { + HandleRequestData(SystemStatusOsObserver* parent, + const list& 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 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 mDataItemList; + }; + mContext.mMsgTask->sendMsg(new (nothrow) HandleRequestData(this, l, client)); } void SystemStatusOsObserver::unsubscribe( const list& l, IDataItemObserver* client) { + if (nullptr == mContext.mSubscriptionObj) { + LOC_LOGE("%s:%d]: Subscription object is NULL", __func__, __LINE__); + return; + } struct HandleUnsubscribeReq : public LocMsg { HandleUnsubscribeReq(SystemStatusOsObserver* parent, - list& l, IDataItemObserver* client) : - mParent(parent), mClient(client), - mDataItemSet(containerTransfer, unordered_set>(l)) {} - + const list& l, IDataItemObserver* client) : + mParent(parent), mClient(client), mDataItemList(l) {} + virtual ~HandleUnsubscribeReq() {} void proc() const { - unordered_set dataItemsUnusedByClient(0); - unordered_set clientToRemove(0); - mParent->mClientToDataItems.trimOrRemove({mClient}, mDataItemSet, &clientToRemove, - &dataItemsUnusedByClient); - unordered_set dataItemsToUnsubscribe(0); - mParent->mDataItemToClients.trimOrRemove(dataItemsUnusedByClient, {mClient}, - &dataItemsToUnsubscribe, nullptr); + if (mDataItemList.empty()) { + LOC_LOGV("mDataItemList is empty. Nothing to do. Exiting"); + return; + } - if (nullptr != mParent->mContext.mSubscriptionObj && !dataItemsToUnsubscribe.empty()) { - LOC_LOGD("Unsubscribe Request sent to framework for the following data items"); - mParent->logMe(dataItemsToUnsubscribe); + list unsubscribeList(0); + list unused(0); + mParent->mClientIndex->remove(mClient, mDataItemList, unused); + for (auto each : mDataItemList) { + list clientListSubs(0); + list clientListOut(0); + mParent->mDataItemIndex->remove( + each, list (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( - containerTransfer, list>( - std::move(dataItemsToUnsubscribe)), - mParent); + mParent->mContext.mSubscriptionObj->unsubscribe(unsubscribeList, mParent); + LOC_LOGD("Unsubscribe Request sent to framework for the following data items"); + mParent->logMe(unsubscribeList); } } SystemStatusOsObserver* mParent; IDataItemObserver* mClient; - unordered_set mDataItemSet; + const list mDataItemList; }; - - if (l.empty() || nullptr == client) { - LOC_LOGw("Data item set is empty or client is nullptr"); - } else { - mContext.mMsgTask->sendMsg(new HandleUnsubscribeReq(this, (list&)l, client)); - } + mContext.mMsgTask->sendMsg(new (nothrow) HandleUnsubscribeReq(this, l, 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 { HandleUnsubscribeAllReq(SystemStatusOsObserver* parent, IDataItemObserver* client) : mParent(parent), mClient(client) {} - + virtual ~HandleUnsubscribeAllReq() {} void proc() const { - unordered_set diByClient = mParent->mClientToDataItems.getValSet(mClient); - if (!diByClient.empty()) { - unordered_set dataItemsToUnsubscribe; - mParent->mClientToDataItems.remove(mClient); - mParent->mDataItemToClients.trimOrRemove(diByClient, {mClient}, - &dataItemsToUnsubscribe, nullptr); + list clients(1, mClient); + list unsubscribeList(0); + if(0 == mParent->mClientIndex->remove(mClient)) { + return; + } + mParent->mDataItemIndex->remove(clients, unsubscribeList); - 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, list>( - std::move(dataItemsToUnsubscribe)), - mParent); - } + 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"); + mParent->logMe(unsubscribeList); } } SystemStatusOsObserver* mParent; IDataItemObserver* mClient; }; - - if (nullptr == client) { - LOC_LOGw("Data item set is empty or client is nullptr"); - } else { - mContext.mMsgTask->sendMsg(new HandleUnsubscribeAllReq(this, client)); - } + mContext.mMsgTask->sendMsg(new (nothrow) HandleUnsubscribeAllReq(this, client)); } /****************************************************************************** @@ -296,81 +353,84 @@ void SystemStatusOsObserver::unsubscribeAll(IDataItemObserver* client) ******************************************************************************/ void SystemStatusOsObserver::notify(const list& dlist) { - struct HandleNotify : public LocMsg { - HandleNotify(SystemStatusOsObserver* parent, vector& v) : - mParent(parent), mDiVec(std::move(v)) {} + list dataItemList(0); - inline virtual ~HandleNotify() { - for (auto item : mDiVec) { - delete item; - } + 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); + + // Request systemstatus to record this dataitem in its cache + if (mSystemStatus->eventDataItemNotify(di)) { + // add this dataitem if updated from last one + dataItemList.push_back(di); + } + } + + struct HandleNotify : public LocMsg { + HandleNotify(SystemStatusOsObserver* parent, const list& l) : + mParent(parent), mDList(l) {} + virtual ~HandleNotify() { + for (auto each : mDList) { + delete each; + } + } void proc() const { // Update Cache with received data items and prepare // list of data items to be sent. - unordered_set dataItemIdsToBeSent(0); - for (auto item : mDiVec) { - if (mParent->updateCache(item)) { - dataItemIdsToBeSent.insert(item->getId()); + list dataItemIdsToBeSent(0); + for (auto item : mDList) { + bool dataItemUpdated = false; + mParent->updateCache(item, dataItemUpdated); + if (dataItemUpdated) { + dataItemIdsToBeSent.push_back(item->getId()); } } // Send data item to all subscribed clients - unordered_set clientSet(0); + list clientList(0); for (auto each : dataItemIdsToBeSent) { - auto clients = mParent->mDataItemToClients.getValSetPtr(each); - if (nullptr != clients) { - clientSet.insert(clients->begin(), clients->end()); + list clients(0); + mParent->mDataItemIndex->getListOfSubscribedClients(each, clients); + for (auto each_cient: clients) { + clientList.push_back(each_cient); } } + clientList.unique(); - for (auto client : clientSet) { - unordered_set dataItemIdsForThisClient( - mParent->mClientToDataItems.getValSet(client)); - for (auto itr = dataItemIdsForThisClient.begin(); - itr != dataItemIdsForThisClient.end(); ) { - if (dataItemIdsToBeSent.find(*itr) == dataItemIdsToBeSent.end()) { - itr = dataItemIdsForThisClient.erase(itr); - } else { - itr++; - } - } + for (auto client : clientList) { + list dataItemIdsSubscribedByThisClient(0); + list dataItemIdsToBeSentForThisClient(0); + mParent->mClientIndex->getSubscribedList( + client, dataItemIdsSubscribedByThisClient); + dataItemIdsSubscribedByThisClient.sort(); + dataItemIdsToBeSent.sort(); - mParent->sendCachedDataItems(dataItemIdsForThisClient, client); + set_intersection(dataItemIdsToBeSent.begin(), + dataItemIdsToBeSent.end(), + dataItemIdsSubscribedByThisClient.begin(), + dataItemIdsSubscribedByThisClient.end(), + inserter(dataItemIdsToBeSentForThisClient, + dataItemIdsToBeSentForThisClient.begin())); + + mParent->sendCachedDataItems(dataItemIdsToBeSentForThisClient, client); + dataItemIdsSubscribedByThisClient.clear(); + dataItemIdsToBeSentForThisClient.clear(); } } SystemStatusOsObserver* mParent; - const vector mDiVec; + const list mDList; }; - - if (!dlist.empty()) { - vector 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)); - } - } + mContext.mMsgTask->sendMsg(new (nothrow) HandleNotify(this, dataItemList)); } /****************************************************************************** @@ -384,7 +444,7 @@ void SystemStatusOsObserver::turnOn(DataItemId dit, int timeOut) } // Check if data item exists in mActiveRequestCount - DataItemIdToInt::iterator citer = mActiveRequestCount.find(dit); + map::iterator citer = mActiveRequestCount.find(dit); if (citer == mActiveRequestCount.end()) { // Data item not found in map // Add reference count as 1 and add dataitem to map @@ -422,7 +482,7 @@ void SystemStatusOsObserver::turnOff(DataItemId dit) } // Check if data item exists in mActiveRequestCount - DataItemIdToInt::iterator citer = mActiveRequestCount.find(dit); + map::iterator citer = mActiveRequestCount.find(dit); if (citer != mActiveRequestCount.end()) { // found citer->second--; @@ -448,127 +508,87 @@ 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 ******************************************************************************/ -void SystemStatusOsObserver::sendCachedDataItems( - const unordered_set& s, IDataItemObserver* to) +void SystemStatusOsObserver::sendFirstResponse( + const list& l, IDataItemObserver* to) { - if (nullptr == to) { - LOC_LOGv("client pointer is NULL."); - } else { - string clientName; - to->getName(clientName); - list dataItems(0); + if (l.empty()) { + LOC_LOGV("list is empty. Nothing to do. Exiting"); + return; + } - for (auto each : s) { - auto citer = mDataItemCache.find(each); - if (citer != mDataItemCache.end()) { - string dv; - citer->second->stringify(dv); - LOC_LOGI("DataItem: %s >> %s", dv.c_str(), clientName.c_str()); - dataItems.push_front(citer->second); - } - } + string clientName; + to->getName(clientName); + list dataItems(0); - if (dataItems.empty()) { - LOC_LOGv("No items to notify."); - } else { - to->notify(dataItems); + for (auto each : l) { + map::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); } -bool SystemStatusOsObserver::updateCache(IDataItemCore* d) +void SystemStatusOsObserver::sendCachedDataItems( + const list& l, IDataItemObserver* to) { - bool dataItemUpdated = false; + string clientName; + to->getName(clientName); + list dataItems(0); - // Request systemstatus to record this dataitem in its cache - // if the return is false, it means that SystemStatus is not - // handling it, so SystemStatusOsObserver also doesn't. - // So it has to be true to proceed. - if (nullptr != d && mSystemStatus->eventDataItemNotify(d)) { - auto citer = mDataItemCache.find(d->getId()); - if (citer == mDataItemCache.end()) { - // New data item; not found in cache - IDataItemCore* dataitem = DataItemsFactoryProxy::createNewDataItem(d->getId()); - if (nullptr != dataitem) { - // Copy the contents of the data item - dataitem->copy(d); - // Insert in mDataItemCache - mDataItemCache.insert(std::make_pair(d->getId(), dataitem)); - dataItemUpdated = true; - } - } else { - // Found in cache; Update cache if necessary - citer->second->copy(d, &dataItemUpdated); + for (auto each : l) { + string dv; + IDataItemCore* di = mDataItemCache[each]; + di->stringify(dv); + LOC_LOGI("DataItem: %s >> %s", dv.c_str(), clientName.c_str()); + dataItems.push_back(di); + } + to->notify(dataItems); +} + +void SystemStatusOsObserver::updateCache(IDataItemCore* d, bool& dataItemUpdated) +{ + if (nullptr == d) { + return; + } + + // Check if data item exists in cache + map::iterator citer = + mDataItemCache.find(d->getId()); + if (citer == mDataItemCache.end()) { + // New data item; not found in cache + IDataItemCore* dataitem = DataItemsFactoryProxy::createNewDataItem(d->getId()); + if (nullptr == dataitem) { + return; } - if (dataItemUpdated) { - LOC_LOGV("DataItem:%d updated:%d", d->getId(), dataItemUpdated); + // Copy the contents of the data item + dataitem->copy(d); + pair 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; } } - return dataItemUpdated; + if (dataItemUpdated) { + LOC_LOGV("DataItem:%d updated:%d", d->getId(), dataItemUpdated); + } } } // namespace loc_core diff --git a/gps/core/SystemStatusOsObserver.h b/gps/core/SystemStatusOsObserver.h old mode 100755 new mode 100644 index fd60606..fa114ee --- a/gps/core/SystemStatusOsObserver.h +++ b/gps/core/SystemStatusOsObserver.h @@ -39,9 +39,7 @@ #include #include #include -#include -#include -#include +#include namespace loc_core { @@ -49,123 +47,86 @@ namespace loc_core SystemStatusOsObserver ******************************************************************************/ using namespace std; -using namespace loc_util; // Forward Declarations class IDataItemCore; -class SystemStatus; -class SystemStatusOsObserver; -typedef map> ObserverReqCache; -typedef LocUnorderedSetMap ClientToDataItems; -typedef LocUnorderedSetMap DataItemToClients; -typedef unordered_map DataItemIdToCore; -typedef unordered_map DataItemIdToInt; +template class IClientIndex; +template class IDataItemIndex; -struct ObserverContext { +struct SystemContext { IDataItemSubscription* mSubscriptionObj; IFrameworkActionReq* mFrameworkActionReqObj; const MsgTask* mMsgTask; - SystemStatusOsObserver* mSSObserver; - inline ObserverContext(const MsgTask* msgTask, SystemStatusOsObserver* observer) : - mSubscriptionObj(NULL), mFrameworkActionReqObj(NULL), - mMsgTask(msgTask), mSSObserver(observer) {} + inline SystemContext() : + mSubscriptionObj(NULL), + mFrameworkActionReqObj(NULL), + mMsgTask(NULL) {} }; +typedef map> ObserverReqCache; + // Clients wanting to get data from OS/Framework would need to // subscribe with OSObserver using IDataItemSubscription interface. // Such clients would need to implement IDataItemObserver interface // to receive data when it becomes available. +class SystemStatus; class SystemStatusOsObserver : public IOsObserver { public: // ctor - inline SystemStatusOsObserver(SystemStatus* systemstatus, const MsgTask* msgTask) : - mSystemStatus(systemstatus), mContext(msgTask, this), - mAddress("SystemStatusOsObserver"), - mClientToDataItems(MAX_DATA_ITEM_ID), mDataItemToClients(MAX_DATA_ITEM_ID) -#ifdef USE_GLIB - , mBackHaulConnectReqCount(0) -#endif - { - } - + SystemStatusOsObserver( + SystemStatus* systemstatus, const MsgTask* msgTask); // dtor ~SystemStatusOsObserver(); - template - static COUT containerTransfer(CINT& s); - template - inline static COUT containerTransfer(CINT&& s) { - return containerTransfer(s); - } - // To set the subscription object virtual void setSubscriptionObj(IDataItemSubscription* subscriptionObj); // To set the framework action request object inline void setFrameworkActionReqObj(IFrameworkActionReq* frameworkActionReqObj) { mContext.mFrameworkActionReqObj = frameworkActionReqObj; -#ifdef USE_GLIB - if (mBackHaulConnectReqCount > 0) { - connectBackhaul(); - mBackHaulConnectReqCount = 0; - } -#endif } // IDataItemSubscription Overrides - inline virtual void subscribe(const list& l, IDataItemObserver* client) override { - subscribe(l, client, false); - } - virtual void updateSubscription(const list& l, IDataItemObserver* client) override; - inline virtual void requestData(const list& l, IDataItemObserver* client) override { - subscribe(l, client, true); - } - virtual void unsubscribe(const list& l, IDataItemObserver* client) override; - virtual void unsubscribeAll(IDataItemObserver* client) override; + virtual void subscribe(const list& l, IDataItemObserver* client); + virtual void updateSubscription(const list& l, IDataItemObserver* client); + virtual void requestData(const list& l, IDataItemObserver* client); + virtual void unsubscribe(const list& l, IDataItemObserver* client); + virtual void unsubscribeAll(IDataItemObserver* client); // IDataItemObserver Overrides - virtual void notify(const list& dlist) override; - inline virtual void getName(string& name) override { + virtual void notify(const list& dlist); + inline virtual void getName(string& name) { name = mAddress; } // IFrameworkActionReq Overrides - virtual void turnOn(DataItemId dit, int timeOut = 0) override; - virtual void turnOff(DataItemId dit) override; -#ifdef USE_GLIB - virtual bool connectBackhaul() override; - virtual bool disconnectBackhaul(); -#endif + virtual void turnOn(DataItemId dit, int timeOut = 0); + virtual void turnOff(DataItemId dit); private: SystemStatus* mSystemStatus; - ObserverContext mContext; + SystemContext mContext; const string mAddress; - ClientToDataItems mClientToDataItems; - DataItemToClients mDataItemToClients; - DataItemIdToCore mDataItemCache; - DataItemIdToInt mActiveRequestCount; + IClientIndex* mClientIndex; + IDataItemIndex* mDataItemIndex; + map mDataItemCache; + map mActiveRequestCount; // Cache the subscribe and requestData till subscription obj is obtained + ObserverReqCache mSubscribeReqCache; + ObserverReqCache mReqDataCache; void cacheObserverRequest(ObserverReqCache& reqCache, const list& l, IDataItemObserver* client); -#ifdef USE_GLIB - // Cache the framework action request for connect/disconnect - int mBackHaulConnectReqCount; -#endif - - void subscribe(const list& l, IDataItemObserver* client, bool toRequestData); // Helpers - void sendCachedDataItems(const unordered_set& s, IDataItemObserver* to); - bool updateCache(IDataItemCore* d); - inline void logMe(const unordered_set& l) { - IF_LOC_LOGD { - for (auto id : l) { - LOC_LOGD("DataItem %d", id); - } + void sendFirstResponse(const list& l, IDataItemObserver* to); + void sendCachedDataItems(const list& l, IDataItemObserver* to); + void updateCache(IDataItemCore* d, bool& dataItemUpdated); + inline void logMe(const list& l) { + for (auto id : l) { + LOC_LOGD("DataItem %d", id); } } }; diff --git a/gps/core/UlpProxyBase.h b/gps/core/UlpProxyBase.h old mode 100755 new mode 100644 diff --git a/gps/core/data-items/DataItemConcreteTypesBase.h b/gps/core/data-items/DataItemConcreteTypesBase.h old mode 100755 new mode 100644 index bcb8d72..df3bf9a --- a/gps/core/data-items/DataItemConcreteTypesBase.h +++ b/gps/core/data-items/DataItemConcreteTypesBase.h @@ -221,22 +221,9 @@ protected: 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, + int32_t type, string typeName, string subTypeName, bool available, bool connected, bool roaming ): - mAllTypes(typeToAllTypes(initialType)), mType(type), mTypeName(typeName), mSubTypeName(subTypeName), @@ -248,12 +235,22 @@ public: inline virtual DataItemId getId() { return mId; } virtual void stringify(string& /*valueStr*/) {} virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} + enum NetworkType { + TYPE_UNKNOWN, + TYPE_MOBILE, + TYPE_WIFI, + TYPE_ETHERNET, + TYPE_BLUETOOTH, + TYPE_MMS, + TYPE_SUPL, + TYPE_DUN, + TYPE_HIPRI, + TYPE_WIMAX + }; inline virtual NetworkType getType(void) const { return (NetworkType)mType; } - inline uint64_t getAllTypes() { return mAllTypes; } - // Data members - uint64_t mAllTypes; +// Data members int32_t mType; string mTypeName; string mSubTypeName; @@ -262,9 +259,7 @@ public: bool mRoaming; protected: DataItemId mId; - inline uint64_t typeToAllTypes(NetworkType type) { - return (type >= TYPE_UNKNOWN || type < TYPE_MOBILE) ? 0 : (1< #include #include -#include -#include +#include namespace loc_core { @@ -69,7 +68,7 @@ IDataItemCore* DataItemsFactoryProxy::createNewDataItem(DataItemId id) getConcreteDIFunc = (get_concrete_data_item_fn * ) dlsym(dataItemLibHandle, DATA_ITEMS_GET_CONCRETE_DI); if (NULL != getConcreteDIFunc) { - LOC_LOGD("Loaded function %s : %p",DATA_ITEMS_GET_CONCRETE_DI,getConcreteDIFunc); + LOC_LOGD("Loaded function %s : %x",DATA_ITEMS_GET_CONCRETE_DI,getConcreteDIFunc); mydi = (*getConcreteDIFunc)(id); } else { diff --git a/gps/core/data-items/DataItemsFactoryProxy.h b/gps/core/data-items/DataItemsFactoryProxy.h old mode 100755 new mode 100644 diff --git a/gps/core/data-items/IDataItemCore.h b/gps/core/data-items/IDataItemCore.h old mode 100755 new mode 100644 diff --git a/gps/core/data-items/common/ClientIndex.cpp b/gps/core/data-items/common/ClientIndex.cpp new file mode 100644 index 0000000..ffb5e1d --- /dev/null +++ b/gps/core/data-items/common/ClientIndex.cpp @@ -0,0 +1,171 @@ +/* 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 +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace loc_core; + +template +inline ClientIndex :: ClientIndex () {} + +template +inline ClientIndex :: ~ClientIndex () {} + +template +bool ClientIndex :: isSubscribedClient (CT client) { + bool result = false; + ENTRY_LOG (); + typename map < CT, list > :: iterator it = + mDataItemsPerClientMap.find (client); + if (it != mDataItemsPerClientMap.end ()) { + result = true; + } + EXIT_LOG_WITH_ERROR ("%d",result); + return result; +} + +template +void ClientIndex :: getSubscribedList (CT client, list & out) { + ENTRY_LOG (); + typename map < CT, list > :: iterator it = + mDataItemsPerClientMap.find (client); + if (it != mDataItemsPerClientMap.end ()) { + out = it->second; + } + EXIT_LOG_WITH_ERROR ("%d",0); +} + +template +int ClientIndex :: remove (CT client) { + int result = 0; + ENTRY_LOG (); + mDataItemsPerClientMap.erase (client); + EXIT_LOG_WITH_ERROR ("%d",result); + return result; +} + +template +void ClientIndex :: remove (const list & r, list & out) { + ENTRY_LOG (); + typename map < CT, list > :: iterator dicIter = + mDataItemsPerClientMap.begin (); + while (dicIter != mDataItemsPerClientMap.end()) { + typename list :: const_iterator it = r.begin (); + for (; it != r.end (); ++it) { + typename list :: 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 +void ClientIndex :: remove +( + CT client, + const list & r, + list & out +) +{ + ENTRY_LOG (); + typename map < CT, list > :: 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 :: 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 +void ClientIndex :: add +( + CT client, + const list & l, + list & out +) +{ + ENTRY_LOG (); + list difference; + typename map < CT, list > :: 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 > 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 ; + template class ClientIndex ; +} diff --git a/gps/core/data-items/common/ClientIndex.h b/gps/core/data-items/common/ClientIndex.h new file mode 100644 index 0000000..feccb05 --- /dev/null +++ b/gps/core/data-items/common/ClientIndex.h @@ -0,0 +1,70 @@ +/* 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 +#include +#include + +using loc_core::IClientIndex; + +namespace loc_core +{ + +template + +class ClientIndex : public IClientIndex { + +public: + + ClientIndex (); + + ~ClientIndex (); + + bool isSubscribedClient (CT client); + + void getSubscribedList (CT client, std :: list & out); + + int remove (CT client); + + void remove (const std :: list & r, std :: list & out); + + void remove (CT client, const std :: list & r, std :: list & out); + + void add (CT client, const std :: list & l, std :: list & out); + +private: + //Data members + std :: map < CT , std :: list > mDataItemsPerClientMap; +}; + +} // namespace loc_core + +#endif // #ifndef __CLIENTINDEX_H__ diff --git a/gps/core/data-items/common/DataItemIndex.cpp b/gps/core/data-items/common/DataItemIndex.cpp new file mode 100644 index 0000000..7869b43 --- /dev/null +++ b/gps/core/data-items/common/DataItemIndex.cpp @@ -0,0 +1,202 @@ +/* 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 +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace loc_core; + +template +inline DataItemIndex :: DataItemIndex () {} + +template +inline DataItemIndex :: ~DataItemIndex () {} + +template +void DataItemIndex :: getListOfSubscribedClients + ( + DIT id, + list & out +) +{ + typename map < DIT, list > :: iterator cdiIter = + mClientsPerDataItemMap.find (id); + if (cdiIter != mClientsPerDataItemMap.end ()) { + out = cdiIter->second; + } +} + + +template +int DataItemIndex :: remove (DIT id) { + int result = 0; + ENTRY_LOG (); + mClientsPerDataItemMap.erase (id); + EXIT_LOG_WITH_ERROR ("%d",result); + return result; +} + +template +void DataItemIndex :: remove (const list & r, list & out) { + ENTRY_LOG (); + typename map < DIT, list > :: iterator cdiIter = + mClientsPerDataItemMap.begin (); + while (cdiIter != mClientsPerDataItemMap.end()) { + typename list :: const_iterator it = r.begin (); + for (; it != r.end (); ++it) { + typename list :: 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 +void DataItemIndex :: remove +( + DIT id, + const list & r, + list & out +) +{ + ENTRY_LOG (); + + typename map < DIT, list > :: 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 :: 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 +void DataItemIndex :: add +( + DIT id, + const list & l, + list & out +) +{ + ENTRY_LOG (); + list difference; + typename map < DIT, list > :: 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 > cndipair (id, out); + mClientsPerDataItemMap.insert (cndipair); + } + EXIT_LOG_WITH_ERROR ("%d",0); +} + +template +void DataItemIndex :: add +( + CT client, + const list & l, + list & out +) +{ + ENTRY_LOG (); + typename map < DIT, list > :: iterator cdiIter; + typename list :: 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 > cndiPair (*it, list (1, client)); + mClientsPerDataItemMap.insert (cndiPair); + } else { + typename list :: 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 ; + template class DataItemIndex ; +} diff --git a/gps/core/data-items/common/DataItemIndex.h b/gps/core/data-items/common/DataItemIndex.h new file mode 100644 index 0000000..d72e89e --- /dev/null +++ b/gps/core/data-items/common/DataItemIndex.h @@ -0,0 +1,70 @@ +/* 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 +#include +#include + +using loc_core::IDataItemIndex; + +namespace loc_core +{ + +template + +class DataItemIndex : public IDataItemIndex { + +public: + + DataItemIndex (); + + ~DataItemIndex (); + + void getListOfSubscribedClients (DIT id, std :: list & out); + + int remove (DIT id); + + void remove (const std :: list & r, std :: list & out); + + void remove (DIT id, const std :: list & r, std :: list & out); + + void add (DIT id, const std :: list & l, std :: list & out); + + void add (CT client, const std :: list & l, std :: list & out); + +private: + std :: map < DIT, std :: list > mClientsPerDataItemMap; +}; + +} // namespace loc_core + +#endif // #ifndef __DATAITEMINDEX_H__ diff --git a/gps/core/data-items/common/IClientIndex.h b/gps/core/data-items/common/IClientIndex.h new file mode 100644 index 0000000..0272e7b --- /dev/null +++ b/gps/core/data-items/common/IClientIndex.h @@ -0,0 +1,83 @@ +/* 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 + +namespace loc_core +{ + +template + +class IClientIndex { +public: + + // Checks if client is subscribed + virtual bool isSubscribedClient (CT client) = 0; + + // gets subscription list + virtual void getSubscribedList (CT client, std :: list & 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 & r, + std :: list & 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 & r, + std :: list & out + ) = 0; + + // adds/modifies entry in map and returns new data items added. + virtual void add + ( + CT client, + const std :: list & l, + std :: list & out + ) = 0; + + // dtor + virtual ~IClientIndex () {} +}; + +} // namespace loc_core + +#endif // #ifndef __ICLIENTINDEX_H__ diff --git a/gps/core/data-items/common/IDataItemIndex.h b/gps/core/data-items/common/IDataItemIndex.h new file mode 100644 index 0000000..9185582 --- /dev/null +++ b/gps/core/data-items/common/IDataItemIndex.h @@ -0,0 +1,94 @@ +/* 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 + +namespace loc_core +{ + +template + +class IDataItemIndex { + +public: + + // gets std :: list of subscribed clients + virtual void getListOfSubscribedClients + ( + DIT id, + std :: list & 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 & r, + std :: list & 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 & r, + std :: list & out + ) = 0; + + // adds/modifies entry and returns new clients added + virtual void add + ( + DIT id, + const std :: list & l, + std :: list & out + ) = 0; + + // adds/modifies entry and returns yet to subscribe list of data items + virtual void add + ( + CT client, + const std :: list & l, + std :: list & out + ) = 0; + + // dtor + virtual ~IDataItemIndex () {} +}; + +} // namespace loc_core + +#endif // #ifndef __IDATAITEMINDEX_H__ + diff --git a/gps/core/data-items/common/IndexFactory.cpp b/gps/core/data-items/common/IndexFactory.cpp new file mode 100644 index 0000000..cf49475 --- /dev/null +++ b/gps/core/data-items/common/IndexFactory.cpp @@ -0,0 +1,64 @@ +/* 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 +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using loc_core::IClientIndex; +using loc_core::IDataItemIndex; +using loc_core::IDataItemObserver; +using namespace loc_core; + +template +inline IClientIndex * IndexFactory :: createClientIndex +() +{ + return new (nothrow) ClientIndex (); +} + +template +inline IDataItemIndex * IndexFactory :: createDataItemIndex +() +{ + return new (nothrow) DataItemIndex (); +} + +// Explicit instantiation must occur in same namespace where class is defined +namespace loc_core +{ + template class IndexFactory ; + template class IndexFactory ; +} diff --git a/gps/core/data-items/common/IndexFactory.h b/gps/core/data-items/common/IndexFactory.h new file mode 100644 index 0000000..9a2070e --- /dev/null +++ b/gps/core/data-items/common/IndexFactory.h @@ -0,0 +1,48 @@ +/* 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 +#include + +namespace loc_core +{ +template +class IndexFactory { + +public: + static IClientIndex * createClientIndex (); + static IDataItemIndex * createDataItemIndex (); +}; + +} // namespace loc_core + +#endif // #ifndef __INDEXFACTORY_H__ diff --git a/gps/core/loc_core_log.cpp b/gps/core/loc_core_log.cpp old mode 100755 new mode 100644 index 67d68f0..5a627dd --- a/gps/core/loc_core_log.cpp +++ b/gps/core/loc_core_log.cpp @@ -30,10 +30,9 @@ #define LOG_NDEBUG 0 #define LOG_TAG "LocSvc_core_log" -#include #include #include -#include +#include void LocPosMode::logv() const { @@ -101,6 +100,26 @@ 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); } + + +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*/) { return NULL; diff --git a/gps/core/loc_core_log.h b/gps/core/loc_core_log.h old mode 100755 new mode 100644 diff --git a/gps/core/observer/IDataItemObserver.h b/gps/core/observer/IDataItemObserver.h old mode 100755 new mode 100644 diff --git a/gps/core/observer/IDataItemSubscription.h b/gps/core/observer/IDataItemSubscription.h old mode 100755 new mode 100644 diff --git a/gps/core/observer/IFrameworkActionReq.h b/gps/core/observer/IFrameworkActionReq.h old mode 100755 new mode 100644 index 4be947f..c7b3ebd --- a/gps/core/observer/IFrameworkActionReq.h +++ b/gps/core/observer/IFrameworkActionReq.h @@ -70,24 +70,6 @@ public: */ virtual void turnOff (DataItemId dit) = 0; -#ifdef USE_GLIB - /** - * @brief Setup WWAN backhaul - * @details Setup WWAN backhaul - * - * @param None - */ - virtual bool connectBackhaul() = 0; - - /** - * @brief Disconnects the WWANbackhaul - * @details Disconnects the WWANbackhaul, only if it was setup by us - * - * @param None - */ - virtual bool disconnectBackhaul() = 0; -#endif - /** * @brief Destructor * @details Destructor diff --git a/gps/core/observer/IOsObserver.h b/gps/core/observer/IOsObserver.h old mode 100755 new mode 100644 index 40d7671..3db8a85 --- a/gps/core/observer/IOsObserver.h +++ b/gps/core/observer/IOsObserver.h @@ -90,10 +90,6 @@ public: // IFrameworkActionReq Overrides inline virtual void turnOn (DataItemId /*dit*/, int /*timeOut*/){} inline virtual void turnOff (DataItemId /*dit*/) {} -#ifdef USE_GLIB - inline virtual bool connectBackhaul() {} - inline virtual bool disconnectBackhaul() {} -#endif /** * @brief Destructor diff --git a/gps/etc/flp.conf b/gps/etc/flp.conf old mode 100755 new mode 100644 diff --git a/gps/etc/gps.conf b/gps/etc/gps.conf old mode 100755 new mode 100644 index fd98cbf..7b29e3f --- a/gps/etc/gps.conf +++ b/gps/etc/gps.conf @@ -208,17 +208,10 @@ MISSING_PULSE_TIME_DELTA = 900 # This settings enables time uncertainty propagation # logic incase of missing PPS pulse PROPAGATION_TIME_UNCERTAINTY = 1 +XTRA_TEST_ENABLED = 1 +XTRA_THROTTLE_ENABLED = 0 -####################################### -# APN / IP Type Configuration -# APN and IP Type to use for setting -# up WWAN call. -# Use below values for IP Type: -# v4 = 4 -# v6 = 6 -# v4v6 = 10 -####################################### -# INTERNET_APN = abc.xyz -# INTERNET_IP_TYPE = 4 -# SUPL_APN = abc.xyz -# SUPL_IP_TYPE = 4 +#################################### +#system time injection +#################################### +XTRA_SYSTEM_TIME_INJECT = 1 diff --git a/gps/etc/lowi.conf b/gps/etc/lowi.conf old mode 100755 new mode 100644 diff --git a/gps/etc/sap.conf b/gps/etc/sap.conf old mode 100755 new mode 100644 diff --git a/gps/etc/xtwifi.conf b/gps/etc/xtwifi.conf old mode 100755 new mode 100644 diff --git a/gps/gnss/Agps.cpp b/gps/gnss/Agps.cpp old mode 100755 new mode 100644 index 6ce0c34..72ce293 --- a/gps/gnss/Agps.cpp +++ b/gps/gnss/Agps.cpp @@ -30,7 +30,7 @@ #define LOG_TAG "LocSvc_Agps" #include -#include +#include #include #include diff --git a/gps/gnss/Agps.h b/gps/gnss/Agps.h old mode 100755 new mode 100644 index 703a475..2f89c8c --- a/gps/gnss/Agps.h +++ b/gps/gnss/Agps.h @@ -34,8 +34,7 @@ #include #include #include -#include -#include +#include /* ATL callback function pointers * Passed in by Adapter to AgpsManager */ @@ -278,27 +277,32 @@ public: mAgnssNif(NULL), mInternetNif(NULL), mDsNif(NULL) {} /* Register callbacks */ - inline void registerATLCallbacks(AgpsAtlOpenStatusCb atlOpenStatusCb, + void registerCallbacks( + AgnssStatusIpV4Cb frameworkStatusV4Cb, + + AgpsAtlOpenStatusCb atlOpenStatusCb, AgpsAtlCloseStatusCb atlCloseStatusCb, + AgpsDSClientInitFn dsClientInitFn, AgpsDSClientOpenAndStartDataCallFn dsClientOpenAndStartDataCallFn, AgpsDSClientStopDataCallFn dsClientStopDataCallFn, AgpsDSClientCloseDataCallFn dsClientCloseDataCallFn, AgpsDSClientReleaseFn dsClientReleaseFn, - SendMsgToAdapterMsgQueueFn sendMsgToAdapterQueueFn) { + + SendMsgToAdapterMsgQueueFn sendMsgToAdapterQueueFn ){ + + mFrameworkStatusV4Cb = frameworkStatusV4Cb; mAtlOpenStatusCb = atlOpenStatusCb; mAtlCloseStatusCb = atlCloseStatusCb; + mDSClientInitFn = dsClientInitFn; mDSClientOpenAndStartDataCallFn = dsClientOpenAndStartDataCallFn; mDSClientStopDataCallFn = dsClientStopDataCallFn; mDSClientCloseDataCallFn = dsClientCloseDataCallFn; mDSClientReleaseFn = dsClientReleaseFn; - mSendMsgToAdapterQueueFn = sendMsgToAdapterQueueFn; - } - inline void registerFrameworkStatusCallback(AgnssStatusIpV4Cb frameworkStatusV4Cb) { - mFrameworkStatusV4Cb = frameworkStatusV4Cb; + mSendMsgToAdapterQueueFn = sendMsgToAdapterQueueFn; } /* Create all AGPS state machines */ diff --git a/gps/gnss/Android.mk b/gps/gnss/Android.mk old mode 100755 new mode 100644 index b1f6379..25c9b49 --- a/gps/gnss/Android.mk +++ b/gps/gnss/Android.mk @@ -3,7 +3,9 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libgnss -LOCAL_VENDOR_MODULE := true +LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib +LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64 +LOCAL_MODULE_TAGS := optional LOCAL_SHARED_LIBRARIES := \ libutils \ diff --git a/gps/gnss/GnssAdapter.cpp b/gps/gnss/GnssAdapter.cpp old mode 100755 new mode 100644 index 751c148..cdda01d --- a/gps/gnss/GnssAdapter.cpp +++ b/gps/gnss/GnssAdapter.cpp @@ -74,79 +74,12 @@ GnssAdapter::GnssAdapter() : mNiData(), mAgpsManager(), mAgpsCbInfo(), - mOdcpiRequestCb(nullptr), - mOdcpiRequestActive(false), - mOdcpiTimer(this), - mOdcpiRequest(), mSystemStatus(SystemStatus::getInstance(mMsgTask)), - mServerUrl(":"), + mServerUrl(""), mXtraObserver(mSystemStatus->getOsObserver(), mMsgTask) { LOC_LOGD("%s]: Constructor %p", __func__, this); mUlpPositionMode.mode = LOC_POSITION_MODE_INVALID; - - pthread_condattr_t condAttr; - pthread_condattr_init(&condAttr); - pthread_condattr_setclock(&condAttr, CLOCK_MONOTONIC); - pthread_cond_init(&mNiData.session.tCond, &condAttr); - pthread_cond_init(&mNiData.sessionEs.tCond, &condAttr); - pthread_condattr_destroy(&condAttr); - - /* Set ATL open/close callbacks */ - AgpsAtlOpenStatusCb atlOpenStatusCb = - [this](int handle, int isSuccess, char* apn, - AGpsBearerType bearerType, AGpsExtType agpsType) { - - mLocApi->atlOpenStatus( - handle, isSuccess, apn, bearerType, agpsType); - }; - AgpsAtlCloseStatusCb atlCloseStatusCb = - [this](int handle, int isSuccess) { - - mLocApi->atlCloseStatus(handle, isSuccess); - }; - - /* Register DS Client APIs */ - AgpsDSClientInitFn dsClientInitFn = - [this](bool isDueToSSR) { - - return mLocApi->initDataServiceClient(isDueToSSR); - }; - - AgpsDSClientOpenAndStartDataCallFn dsClientOpenAndStartDataCallFn = - [this] { - - return mLocApi->openAndStartDataCall(); - }; - - AgpsDSClientStopDataCallFn dsClientStopDataCallFn = - [this] { - - mLocApi->stopDataCall(); - }; - - AgpsDSClientCloseDataCallFn dsClientCloseDataCallFn = - [this] { - - mLocApi->closeDataCall(); - }; - - AgpsDSClientReleaseFn dsClientReleaseFn = - [this] { - - mLocApi->releaseDataServiceClient(); - }; - - /* Send Msg function */ - SendMsgToAdapterMsgQueueFn sendMsgFn = - [this](LocMsg* msg) { - - sendMsg(msg); - }; - mAgpsManager.registerATLCallbacks(atlOpenStatusCb, atlCloseStatusCb, - dsClientInitFn, dsClientOpenAndStartDataCallFn, dsClientStopDataCallFn, - dsClientCloseDataCallFn, dsClientReleaseFn, sendMsgFn); - readConfigCommand(); setConfigCommand(); initDefaultAgpsCommand(); @@ -589,38 +522,6 @@ 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 GnssAdapter::setConfigCommand() { @@ -640,8 +541,6 @@ GnssAdapter::setConfigCommand() mApi.setLPPConfig(mAdapter.convertLppProfile(ContextBase::mGps_conf.LPP_PROFILE)); mApi.setAGLONASSProtocol(ContextBase::mGps_conf.A_GLONASS_POS_PROTOCOL_SELECT); } - mAdapter.setSuplHostServer(ContextBase::mGps_conf.SUPL_HOST, - ContextBase::mGps_conf.SUPL_PORT); mApi.setSensorControlConfig(ContextBase::mSap_conf.SENSOR_USAGE, ContextBase::mSap_conf.SENSOR_PROVIDER); mApi.setLPPeProtocolCp( @@ -784,8 +683,30 @@ GnssAdapter::gnssUpdateConfigCommand(GnssConfig config) } if (mConfig.flags & GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT) { if (GNSS_ASSISTANCE_TYPE_SUPL == mConfig.assistanceServer.type) { - err = mAdapter.setSuplHostServer(mConfig.assistanceServer.hostName, - mConfig.assistanceServer.port); + if (ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { + char serverUrl[MAX_URL_LEN] = {}; + 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) { if (ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { struct in_addr addr; @@ -938,7 +859,7 @@ GnssAdapter::gnssDeleteAidingDataCommand(GnssAidingData& data) mAdapter.reportResponse(err, mSessionId); SystemStatus* s = mAdapter.getSystemStatus(); if ((nullptr != s) && (mData.deleteAll)) { - s->setDefaultGnssEngineStates(); + s->setDefaultReport(); } } }; @@ -947,26 +868,6 @@ GnssAdapter::gnssDeleteAidingDataCommand(GnssAidingData& data) return sessionId; } -void -GnssAdapter::gnssUpdateXtraThrottleCommand(const bool enabled) -{ - LOC_LOGD("%s] enabled:%d", __func__, enabled); - - struct UpdateXtraThrottleMsg : public LocMsg { - GnssAdapter& mAdapter; - const bool mEnabled; - inline UpdateXtraThrottleMsg(GnssAdapter& adapter, const bool enabled) : - LocMsg(), - mAdapter(adapter), - mEnabled(enabled) {} - inline virtual void proc() const { - mAdapter.mXtraObserver.updateXtraThrottle(mEnabled); - } - }; - - sendMsg(new UpdateXtraThrottleMsg(*this, enabled)); -} - void GnssAdapter::injectLocationCommand(double latitude, double longitude, float accuracy) { @@ -1176,16 +1077,7 @@ GnssAdapter::updateClientsEventMask() mask |= LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT; mask |= LOC_API_ADAPTER_BIT_GNSS_SV_POLYNOMIAL_REPORT; - LOC_LOGD("%s]: Auto usecase, Enable MEAS/POLY - mask 0x%" PRIu64 "", __func__, mask); - } - - if (mAgpsCbInfo.statusV4Cb != NULL) { - mask |= LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST; - } - - // Add ODCPI handling - if (nullptr != mOdcpiRequestCb) { - mask |= LOC_API_ADAPTER_BIT_REQUEST_WIFI; + LOC_LOGD("%s]: Auto usecase, Enable MEAS/POLY - mask 0x%x", __func__, mask); } updateEvtMask(mask, LOC_REGISTRATION_MASK_SET); @@ -1213,9 +1105,6 @@ GnssAdapter::restartSessions() { LOC_LOGD("%s]: ", __func__); - // odcpi session is no longer active after restart - mOdcpiRequestActive = false; - if (mTrackingSessions.empty()) { return; } @@ -2054,8 +1943,7 @@ GnssAdapter::reportPositionEvent(const UlpLocation& ulpLocation, inline virtual void proc() const { // extract bug report info - this returns true if consumed by systemstatus SystemStatus* s = mAdapter.getSystemStatus(); - if ((nullptr != s) && - ((LOC_SESS_SUCCESS == mStatus) || (LOC_SESS_INTERMEDIATE == mStatus))){ + if ((nullptr != s) && (LOC_SESS_SUCCESS == mStatus)){ s->eventPosition(mUlpLocation, mLocationExtended); } mAdapter.reportPosition(mUlpLocation, mLocationExtended, mStatus, mTechMask); @@ -2065,41 +1953,34 @@ GnssAdapter::reportPositionEvent(const UlpLocation& ulpLocation, sendMsg(new MsgReportPosition(*this, ulpLocation, locationExtended, status, techMask)); } -bool -GnssAdapter::needReport(const UlpLocation& ulpLocation, - enum loc_sess_status status, - LocPosTechMask techMask) { - bool reported = false; - if (LOC_SESS_SUCCESS == status) { - // this is a final fix - LocPosTechMask mask = - LOC_POS_TECH_MASK_SATELLITE | LOC_POS_TECH_MASK_SENSORS | LOC_POS_TECH_MASK_HYBRID; - // it is a Satellite fix or a sensor fix - reported = (mask & techMask); - } else if (LOC_SESS_INTERMEDIATE == status && - LOC_SESS_INTERMEDIATE == ContextBase::mGps_conf.INTERMEDIATE_POS) { - // this is a intermediate fix and we accepte intermediate - - // it is NOT the case that - // there is inaccuracy; and - // we care about inaccuracy; and - // the inaccuracy exceeds our tolerance - reported = !((ulpLocation.gpsLocation.flags & LOC_GPS_LOCATION_HAS_ACCURACY) && - (ContextBase::mGps_conf.ACCURACY_THRES != 0) && - (ulpLocation.gpsLocation.accuracy > ContextBase::mGps_conf.ACCURACY_THRES)); - } - - return reported; -} - void GnssAdapter::reportPosition(const UlpLocation& ulpLocation, const GpsLocationExtended& locationExtended, enum loc_sess_status status, LocPosTechMask techMask) { - bool reported = needReport(ulpLocation, status, techMask); - if (reported) { + bool reported = false; + // what's in the if is... (line by line) + // 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) { mGnssSvIdUsedInPosAvail = true; mGnssSvIdUsedInPosition = locationExtended.gnss_sv_used_ids; @@ -2116,6 +1997,7 @@ GnssAdapter::reportPosition(const UlpLocation& ulpLocation, it->second.gnssLocationInfoCb(locationInfo); } } + reported = true; } if (NMEA_PROVIDER_AP == ContextBase::mGps_conf.NMEA_PROVIDER && !mTrackingSessions.empty()) { @@ -2342,14 +2224,14 @@ static void* niThreadProc(void *args) NiSession* pSession = (NiSession*)args; int rc = 0; /* return code from pthread calls */ - struct timespec present_time; + struct timeval present_time; struct timespec expire_time; pthread_mutex_lock(&pSession->tLock); /* Calculate absolute expire time */ - clock_gettime(CLOCK_MONOTONIC, &present_time); + gettimeofday(&present_time, NULL); expire_time.tv_sec = present_time.tv_sec + pSession->respTimeLeft; - expire_time.tv_nsec = present_time.tv_nsec; + expire_time.tv_nsec = present_time.tv_usec * 1000; LOC_LOGD("%s]: time out set for abs time %ld with delay %d sec", __func__, (long)expire_time.tv_sec, pSession->respTimeLeft); @@ -2474,7 +2356,7 @@ void GnssAdapter::reportGnssMeasurementDataEvent(const GnssMeasurementsNotification& measurements, int msInWeek) { - LOC_LOGD("%s]: msInWeek=%d", __func__, msInWeek); + LOC_LOGD("%s]: ", __func__); struct MsgReportGnssMeasurementData : public LocMsg { GnssAdapter& mAdapter; @@ -2525,170 +2407,19 @@ GnssAdapter::reportSvPolynomialEvent(GnssSvPolynomial &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() { 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; if ((handle = dlopen("libloc_net_iface.so", RTLD_NOW)) == nullptr) { - LOC_LOGD("%s]: libloc_net_iface.so not found !", __func__); + LOC_LOGE("%s]: libloc_net_iface.so not found !", __func__); return; } @@ -2706,7 +2437,7 @@ void GnssAdapter::initDefaultAgps() { return; } - initAgps(cbInfo); + initAgpsCommand(cbInfo); } void GnssAdapter::initDefaultAgpsCommand() { @@ -2717,6 +2448,7 @@ void GnssAdapter::initDefaultAgpsCommand() { inline MsgInitDefaultAgps(GnssAdapter& adapter) : LocMsg(), mAdapter(adapter) { + LOC_LOGV("MsgInitDefaultAgps"); } inline virtual void proc() const { mAdapter.initDefaultAgps(); @@ -2727,53 +2459,141 @@ void GnssAdapter::initDefaultAgpsCommand() { } /* INIT LOC AGPS MANAGER */ - -void GnssAdapter::initAgps(const AgpsCbInfo& cbInfo) { - LOC_LOGD("%s]: mAgpsCbInfo.cbPriority - %d; cbInfo.cbPriority - %d", - __func__, mAgpsCbInfo.cbPriority, cbInfo.cbPriority) - - if (!((ContextBase::mGps_conf.CAPABILITIES & LOC_GPS_CAPABILITY_MSB) || - (ContextBase::mGps_conf.CAPABILITIES & LOC_GPS_CAPABILITY_MSA))) { - return; - } - - if (mAgpsCbInfo.cbPriority > cbInfo.cbPriority) { - return; - } else { - mAgpsCbInfo = cbInfo; - - mAgpsManager.registerFrameworkStatusCallback((AgnssStatusIpV4Cb)cbInfo.statusV4Cb); - - mAgpsManager.createAgpsStateMachines(); - - /* Register for AGPS event mask */ - updateEvtMask(LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST, - LOC_REGISTRATION_MASK_ENABLED); - } -} - void GnssAdapter::initAgpsCommand(const AgpsCbInfo& cbInfo){ + LOC_LOGI("GnssAdapter::initAgpsCommand"); + /* 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 */ 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; - inline AgpsMsgInit(const AgpsCbInfo& cbInfo, + inline AgpsMsgInit(AgpsManager* agpsManager, + AgnssStatusIpV4Cb frameworkStatusV4Cb, + AgpsAtlOpenStatusCb atlOpenStatusCb, + AgpsAtlCloseStatusCb atlCloseStatusCb, + AgpsDSClientInitFn dsClientInitFn, + AgpsDSClientOpenAndStartDataCallFn dsClientOpenAndStartDataCallFn, + AgpsDSClientStopDataCallFn dsClientStopDataCallFn, + AgpsDSClientCloseDataCallFn dsClientCloseDataCallFn, + AgpsDSClientReleaseFn dsClientReleaseFn, + SendMsgToAdapterMsgQueueFn sendMsgFn, GnssAdapter& adapter) : - LocMsg(), mCbInfo(cbInfo), mAdapter(adapter) { + LocMsg(), mAgpsManager(agpsManager), mFrameworkStatusV4Cb( + frameworkStatusV4Cb), mAtlOpenStatusCb(atlOpenStatusCb), mAtlCloseStatusCb( + atlCloseStatusCb), mDSClientInitFn(dsClientInitFn), mDSClientOpenAndStartDataCallFn( + dsClientOpenAndStartDataCallFn), mDSClientStopDataCallFn( + dsClientStopDataCallFn), mDSClientCloseDataCallFn( + dsClientCloseDataCallFn), mDSClientReleaseFn( + dsClientReleaseFn), mSendMsgFn(sendMsgFn), + mAdapter(adapter) { + LOC_LOGV("AgpsMsgInit"); } inline virtual void proc() const { + 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 */ - sendMsg(new AgpsMsgInit(cbInfo, *this)); + sendMsg(new AgpsMsgInit( + &mAgpsManager, + (AgnssStatusIpV4Cb)cbInfo.statusV4Cb, + atlOpenStatusCb, atlCloseStatusCb, + dsClientInitFn, dsClientOpenAndStartDataCallFn, + dsClientStopDataCallFn, dsClientCloseDataCallFn, + dsClientReleaseFn, + sendMsgFn, + *this)); } /* GnssAdapter::requestATL @@ -3173,9 +2993,6 @@ bool GnssAdapter::getDebugReport(GnssDebugReport& r) r.mLocation.mLocation.longitude = (double)(reports.mBestPosition.back().mBestLon) * RAD2DEG; r.mLocation.mLocation.altitude = reports.mBestPosition.back().mBestAlt; - r.mLocation.mLocation.accuracy = - (double)(reports.mBestPosition.back().mBestHepe); - r.mLocation.mUtcReported = reports.mBestPosition.back().mUtcReported; } else { @@ -3201,8 +3018,8 @@ bool GnssAdapter::getDebugReport(GnssDebugReport& r) (int64_t)(reports.mTimeAndClock.back().mGpsTowMs); r.mTime.timeUncertaintyNs = - ((float)(reports.mTimeAndClock.back().mTimeUnc) + - (float)(reports.mTimeAndClock.back().mLeapSecUnc))*1000.0f; + (float)((reports.mTimeAndClock.back().mTimeUnc + + reports.mTimeAndClock.back().mLeapSecUnc)*1000); r.mTime.frequencyUncertaintyNsPerSec = (float)(reports.mTimeAndClock.back().mClockFreqBiasUnc); LOC_LOGV("getDebugReport - timeestimate=%" PRIu64 " unc=%f frequnc=%f", @@ -3235,12 +3052,12 @@ GnssAdapter::getAgcInformation(GnssMeasurementsNotification& measurements, int m systemstatus->getReport(reports, true); if ((!reports.mRfAndParams.empty()) && (!reports.mTimeAndClock.empty()) && + reports.mTimeAndClock.back().mTimeValid && (abs(msInWeek - (int)reports.mTimeAndClock.back().mGpsTowMs) < 2000)) { for (size_t i = 0; i < measurements.count; i++) { switch (measurements.measurements[i].svType) { case GNSS_SV_TYPE_GPS: - case GNSS_SV_TYPE_QZSS: measurements.measurements[i].agcLevelDb = reports.mRfAndParams.back().mAgcGps; measurements.measurements[i].flags |= @@ -3268,6 +3085,7 @@ GnssAdapter::getAgcInformation(GnssMeasurementsNotification& measurements, int m GNSS_MEASUREMENTS_DATA_AUTOMATIC_GAIN_CONTROL_BIT; break; + case GNSS_SV_TYPE_QZSS: case GNSS_SV_TYPE_SBAS: case GNSS_SV_TYPE_UNKNOWN: default: diff --git a/gps/gnss/GnssAdapter.h b/gps/gnss/GnssAdapter.h old mode 100755 new mode 100644 index 0609e6d..e7605f9 --- a/gps/gnss/GnssAdapter.h +++ b/gps/gnss/GnssAdapter.h @@ -43,39 +43,9 @@ #define MAX_SATELLITES_IN_USE 12 #define LOC_NI_NO_RESPONSE_TIME 20 #define LOC_GPS_NI_RESPONSE_IGNORE 4 -#define ODCPI_EXPECTED_INJECTION_TIME_MS 10000 class GnssAdapter; -class OdcpiTimer : public LocTimer { -public: - OdcpiTimer(GnssAdapter* adapter) : - LocTimer(), mAdapter(adapter), mActive(false) {} - - inline void start() { - mActive = true; - LocTimer::start(ODCPI_EXPECTED_INJECTION_TIME_MS, false); - } - inline void stop() { - mActive = false; - LocTimer::stop(); - } - inline void restart() { - stop(); - start(); - } - inline bool isActive() { - return mActive; - } - -private: - // Override - virtual void timeOutCallback() override; - - GnssAdapter* mAdapter; - bool mActive; -}; - typedef struct { pthread_t thread; /* NI thread */ uint32_t respTimeLeft; /* examine time for NI response */ @@ -111,7 +81,6 @@ namespace loc_core { } class GnssAdapter : public LocAdapterBase { - /* ==== ULP ============================================================================ */ UlpProxyBase* mUlpProxy; @@ -133,18 +102,10 @@ class GnssAdapter : public LocAdapterBase { /* ==== NI ============================================================================= */ NiData mNiData; - /* ==== AGPS =========================================================================== */ + /* ==== AGPS ========================================================*/ // This must be initialized via initAgps() AgpsManager mAgpsManager; AgpsCbInfo mAgpsCbInfo; - void initAgps(const AgpsCbInfo& cbInfo); - - /* ==== ODCPI ========================================================================== */ - OdcpiRequestCallback mOdcpiRequestCb; - bool mOdcpiRequestActive; - OdcpiTimer mOdcpiTimer; - OdcpiRequestInfo mOdcpiRequest; - void odcpiTimerExpire(); /* === SystemStatus ===================================================================== */ SystemStatus* mSystemStatus; @@ -190,7 +151,6 @@ public: LocationCallbacks getClientCallbacks(LocationAPI* client); LocationCapabilitiesMask getCapabilities(); void broadcastCapabilities(LocationCapabilitiesMask); - LocationError setSuplHostServer(const char* server, int port); /* ==== TRACKING ======================================================================= */ /* ======== COMMANDS ====(Called from Client Thread)==================================== */ @@ -238,7 +198,6 @@ public: void setConfigCommand(); uint32_t* gnssUpdateConfigCommand(GnssConfig config); uint32_t gnssDeleteAidingDataCommand(GnssAidingData& data); - void gnssUpdateXtraThrottleCommand(const bool enabled); void initDefaultAgpsCommand(); void initAgpsCommand(const AgpsCbInfo& cbInfo); @@ -247,15 +206,6 @@ public: void dataConnClosedCommand(AGpsExtType agpsType); void dataConnFailedCommand(AGpsExtType agpsType); - /* ========= ODCPI ===================================================================== */ - /* ======== COMMANDS ====(Called from Client Thread)==================================== */ - void initOdcpiCommand(const OdcpiRequestCallback& callback); - void injectOdcpiCommand(const Location& location); - /* ======== UTILITIES ================================================================== */ - void initOdcpi(const OdcpiRequestCallback& callback); - void injectOdcpi(const Location& location); - void odcpiTimerExpireEvent(); - /* ======== RESPONSES ================================================================== */ void reportResponse(LocationError err, uint32_t sessionId); void reportResponse(size_t count, LocationError* errs, uint32_t* ids); @@ -289,11 +239,8 @@ public: virtual bool requestSuplES(int connHandle); virtual bool reportDataCallOpened(); virtual bool reportDataCallClosed(); - virtual bool reportOdcpiRequestEvent(OdcpiRequestInfo& request); /* ======== UTILITIES ================================================================= */ - bool needReport(const UlpLocation& ulpLocation, - enum loc_sess_status status, LocPosTechMask techMask); void reportPosition(const UlpLocation &ulpLocation, const GpsLocationExtended &locationExtended, enum loc_sess_status status, @@ -302,7 +249,6 @@ public: void reportNmea(const char* nmea, size_t length); bool requestNiNotify(const GnssNiNotification& notify, const void* data); void reportGnssMeasurementData(const GnssMeasurementsNotification& measurements); - void reportOdcpiRequest(const OdcpiRequestInfo& request); /*======== GNSSDEBUG ================================================================*/ bool getDebugReport(GnssDebugReport& report); diff --git a/gps/gnss/XtraSystemStatusObserver.cpp b/gps/gnss/XtraSystemStatusObserver.cpp old mode 100755 new mode 100644 index de7d49a..984eef0 --- a/gps/gnss/XtraSystemStatusObserver.cpp +++ b/gps/gnss/XtraSystemStatusObserver.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -51,121 +52,94 @@ using namespace loc_core; -#ifdef LOG_TAG -#undef LOG_TAG -#endif -#define LOG_TAG "LocSvc_XSSO" +#define XTRA_HAL_SOCKET_NAME "/data/vendor/location/xtra/socket_hal_xtra" bool XtraSystemStatusObserver::updateLockStatus(uint32_t lock) { - mGpsLock = lock; - - if (!mReqStatusReceived) { - return true; - } - stringstream ss; ss << "gpslock"; ss << " " << lock; - return ( send(LOC_IPC_XTRA, ss.str()) ); + ss << "\n"; // append seperator + return ( sendEvent(ss) ); } -bool XtraSystemStatusObserver::updateConnections(uint64_t allConnections) { - mIsConnectivityStatusKnown = true; - mConnections = allConnections; - - if (!mReqStatusReceived) { - return true; - } - +bool XtraSystemStatusObserver::updateConnectionStatus(bool connected, uint32_t type) { stringstream ss; ss << "connection"; - ss << " " << mConnections; - return ( send(LOC_IPC_XTRA, ss.str()) ); + ss << " " << (connected ? "1" : "0"); + ss << " " << (int)type; + ss << "\n"; // append seperator + return ( sendEvent(ss) ); } - bool XtraSystemStatusObserver::updateTac(const string& tac) { - mTac = tac; - - if (!mReqStatusReceived) { - return true; - } - stringstream ss; ss << "tac"; ss << " " << tac.c_str(); - return ( send(LOC_IPC_XTRA, ss.str()) ); + ss << "\n"; // append seperator + return ( sendEvent(ss) ); } bool XtraSystemStatusObserver::updateMccMnc(const string& mccmnc) { - mMccmnc = mccmnc; - - if (!mReqStatusReceived) { - return true; - } - stringstream ss; ss << "mncmcc"; ss << " " << mccmnc.c_str(); - return ( send(LOC_IPC_XTRA, ss.str()) ); + ss << "\n"; // append seperator + return ( sendEvent(ss) ); } -bool XtraSystemStatusObserver::updateXtraThrottle(const bool enabled) { - mXtraThrottle = enabled; - - if (!mReqStatusReceived) { - return true; +bool XtraSystemStatusObserver::sendEvent(const stringstream& event) { + int socketFd = createSocket(); + if (socketFd < 0) { + LOC_LOGe("XTRA unreachable. sending failed."); + return false; } - stringstream ss; - ss << "xtrathrottle"; - ss << " " << (enabled ? 1 : 0); - return ( send(LOC_IPC_XTRA, ss.str()) ); -} - -inline bool XtraSystemStatusObserver::onStatusRequested(int32_t xtraStatusUpdated) { - mReqStatusReceived = true; - - if (xtraStatusUpdated) { - return true; + const string& data = event.str(); + int remain = data.length(); + ssize_t sent = 0; + while (remain > 0 && + (sent = ::send(socketFd, data.c_str() + (data.length() - remain), + remain, MSG_NOSIGNAL)) > 0) { + remain -= sent; } - stringstream ss; + if (sent < 0) { + LOC_LOGe("sending error. reason:%s", strerror(errno)); + } - ss << "respondStatus" << endl; - (mGpsLock == -1 ? ss : ss << mGpsLock) << endl << mConnections << endl - << mTac << endl << mMccmnc << endl << mIsConnectivityStatusKnown; + closeSocket(socketFd); - return ( send(LOC_IPC_XTRA, ss.str()) ); + return (remain == 0); } -void XtraSystemStatusObserver::onReceive(const std::string& data) { - if (!strncmp(data.c_str(), "ping", sizeof("ping") - 1)) { - LOC_LOGd("ping received"); -#ifdef USE_GLIB - } else if (!strncmp(data.c_str(), "connectBackhaul", sizeof("connectBackhaul") - 1)) { - mSystemStatusObsrvr->connectBackhaul(); +int XtraSystemStatusObserver::createSocket() { + int socketFd = -1; - } else if (!strncmp(data.c_str(), "disconnectBackhaul", sizeof("disconnectBackhaul") - 1)) { - mSystemStatusObsrvr->disconnectBackhaul(); -#endif + if ((socketFd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { + LOC_LOGe("create socket error. reason:%s", strerror(errno)); - } else if (!strncmp(data.c_str(), "requestStatus", sizeof("requestStatus") - 1)) { - int32_t xtraStatusUpdated = 0; - sscanf(data.c_str(), "%*s %d", &xtraStatusUpdated); + } 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); - 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)); + 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; + } + } - } else { - LOC_LOGw("unknown event: %s", data.c_str()); + return socketFd; +} + +void XtraSystemStatusObserver::closeSocket(const int socketFd) { + if (socketFd >= 0) { + if(::close(socketFd)) { + LOC_LOGe("close socket error. reason:%s", strerror(errno)); + } } } @@ -197,11 +171,11 @@ void XtraSystemStatusObserver::getName(string& name) void XtraSystemStatusObserver::notify(const list& dlist) { - struct HandleOsObserverUpdateMsg : public LocMsg { + struct handleOsObserverUpdateMsg : public LocMsg { XtraSystemStatusObserver* mXtraSysStatObj; list mDataItemList; - inline HandleOsObserverUpdateMsg(XtraSystemStatusObserver* xtraSysStatObs, + inline handleOsObserverUpdateMsg(XtraSystemStatusObserver* xtraSysStatObs, const list& dataItemList) : mXtraSysStatObj(xtraSysStatObs) { for (auto eachItem : dataItemList) { @@ -217,7 +191,7 @@ void XtraSystemStatusObserver::notify(const list& dlist) } } - inline ~HandleOsObserverUpdateMsg() { + inline ~handleOsObserverUpdateMsg() { for (auto each : mDataItemList) { delete each; } @@ -231,7 +205,8 @@ void XtraSystemStatusObserver::notify(const list& dlist) { NetworkInfoDataItemBase* networkInfo = static_cast(each); - mXtraSysStatObj->updateConnections(networkInfo->getAllTypes()); + mXtraSysStatObj->updateConnectionStatus(networkInfo->mConnected, + networkInfo->mType); } break; @@ -257,5 +232,7 @@ void XtraSystemStatusObserver::notify(const list& dlist) } } }; - mMsgTask->sendMsg(new (nothrow) HandleOsObserverUpdateMsg(this, dlist)); + mMsgTask->sendMsg(new (nothrow) handleOsObserverUpdateMsg(this, dlist)); } + + diff --git a/gps/gnss/XtraSystemStatusObserver.h b/gps/gnss/XtraSystemStatusObserver.h old mode 100755 new mode 100644 index af0789b..42f49b5 --- a/gps/gnss/XtraSystemStatusObserver.h +++ b/gps/gnss/XtraSystemStatusObserver.h @@ -31,67 +31,41 @@ #include #include -#include -#include using namespace std; using loc_core::IOsObserver; using loc_core::IDataItemObserver; using loc_core::IDataItemCore; -using loc_util::LocIpc; -class XtraSystemStatusObserver : public IDataItemObserver, public LocIpc{ + +class XtraSystemStatusObserver : public IDataItemObserver { public : // constructor & destructor inline XtraSystemStatusObserver(IOsObserver* sysStatObs, const MsgTask* msgTask): - mSystemStatusObsrvr(sysStatObs), mMsgTask(msgTask), - mGpsLock(-1), mConnections(0), mXtraThrottle(true), mReqStatusReceived(false), - mDelayLocTimer(*this), mIsConnectivityStatusKnown (false) { + mSystemStatusObsrvr(sysStatObs), mMsgTask(msgTask) { 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 inline virtual void getName(string& name); virtual void notify(const list& dlist); bool updateLockStatus(uint32_t lock); - bool updateConnections(uint64_t allConnections); + bool updateConnectionStatus(bool connected, uint32_t type); bool updateTac(const string& tac); bool updateMccMnc(const string& mccmnc); - bool updateXtraThrottle(const bool enabled); inline const MsgTask* getMsgTask() { return mMsgTask; } void subscribe(bool yes); -protected: - void onReceive(const std::string& data) override; - private: + int createSocket(); + void closeSocket(const int32_t socketFd); + bool sendEvent(const stringstream& event); IOsObserver* mSystemStatusObsrvr; const MsgTask* mMsgTask; - int32_t mGpsLock; - uint64_t mConnections; - string mTac; - string mMccmnc; - bool mXtraThrottle; - bool mReqStatusReceived; - bool mIsConnectivityStatusKnown; - class DelayLocTimer : public LocTimer { - XtraSystemStatusObserver& mXSSO; - public: - DelayLocTimer(XtraSystemStatusObserver& xsso) : mXSSO(xsso) {} - void timeOutCallback() override { - mXSSO.send(LOC_IPC_XTRA, "halinit"); - } - } mDelayLocTimer; - - bool onStatusRequested(int32_t xtraStatusUpdated); }; #endif diff --git a/gps/gnss/location_gnss.cpp b/gps/gnss/location_gnss.cpp old mode 100755 new mode 100644 index 21763dd..b5623e1 --- a/gps/gnss/location_gnss.cpp +++ b/gps/gnss/location_gnss.cpp @@ -45,7 +45,6 @@ static void stopTracking(LocationAPI* client, uint32_t id); static void gnssNiResponse(LocationAPI* client, uint32_t id, GnssNiResponse response); static uint32_t gnssDeleteAidingData(GnssAidingData& data); -static void gnssUpdateXtraThrottle(const bool enabled); static void setControlCallbacks(LocationControlCallbacks& controlCallbacks); static uint32_t enable(LocationTechnologyType techType); @@ -60,10 +59,7 @@ static void agpsDataConnOpen(AGpsExtType agpsType, const char* apnName, int apnL static void agpsDataConnClosed(AGpsExtType agpsType); static void agpsDataConnFailed(AGpsExtType agpsType); static void getDebugReport(GnssDebugReport& report); -static void updateConnectionStatus(bool connected, int8_t type); - -static void odcpiInit(const OdcpiRequestCallback& callback); -static void odcpiInject(const Location& location); +static void updateConnectionStatus(bool connected, uint8_t type); static const GnssInterface gGnssInterface = { sizeof(GnssInterface), @@ -81,7 +77,6 @@ static const GnssInterface gGnssInterface = { disable, gnssUpdateConfig, gnssDeleteAidingData, - gnssUpdateXtraThrottle, injectLocation, injectTime, agpsInit, @@ -90,8 +85,6 @@ static const GnssInterface gGnssInterface = { agpsDataConnFailed, getDebugReport, updateConnectionStatus, - odcpiInit, - odcpiInject, }; #ifndef DEBUG_X86 @@ -210,13 +203,6 @@ 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) { if (NULL != gGnssAdapter) { @@ -265,23 +251,8 @@ static void getDebugReport(GnssDebugReport& report) { } } -static void updateConnectionStatus(bool connected, int8_t type) { +static void updateConnectionStatus(bool connected, uint8_t type) { if (NULL != gGnssAdapter) { gGnssAdapter->getSystemStatus()->eventConnectionStatus(connected, type); } } - -static void odcpiInit(const OdcpiRequestCallback& callback) -{ - if (NULL != gGnssAdapter) { - gGnssAdapter->initOdcpiCommand(callback); - } -} - -static void odcpiInject(const Location& location) -{ - if (NULL != gGnssAdapter) { - gGnssAdapter->injectOdcpiCommand(location); - } -} - diff --git a/gps/gnsspps/Android.mk b/gps/gnsspps/Android.mk old mode 100755 new mode 100644 index 0fff58b..fc4714e --- a/gps/gnsspps/Android.mk +++ b/gps/gnsspps/Android.mk @@ -5,6 +5,7 @@ include $(CLEAR_VARS) LOCAL_MODULE := libgnsspps LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64 +LOCAL_MODULE_TAGS := optional LOCAL_SHARED_LIBRARIES := \ libutils \ diff --git a/gps/gnsspps/gnsspps.c b/gps/gnsspps/gnsspps.c old mode 100755 new mode 100644 index 70b23f5..f92a862 --- a/gps/gnsspps/gnsspps.c +++ b/gps/gnsspps/gnsspps.c @@ -25,7 +25,7 @@ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include +#include #include #include #include diff --git a/gps/gnsspps/gnsspps.h b/gps/gnsspps/gnsspps.h old mode 100755 new mode 100644 diff --git a/gps/gnsspps/timepps.h b/gps/gnsspps/timepps.h old mode 100755 new mode 100644 diff --git a/gps/location/Android.mk b/gps/location/Android.mk old mode 100755 new mode 100644 index a6462bc..cd620ce --- a/gps/location/Android.mk +++ b/gps/location/Android.mk @@ -3,7 +3,9 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := liblocation_api -LOCAL_VENDOR_MODULE := true +LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib +LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64 +LOCAL_MODULE_TAGS := optional LOCAL_SHARED_LIBRARIES := \ libutils \ diff --git a/gps/location/LocationAPI.cpp b/gps/location/LocationAPI.cpp old mode 100755 new mode 100644 index 0111a9c..21d2de0 --- a/gps/location/LocationAPI.cpp +++ b/gps/location/LocationAPI.cpp @@ -29,8 +29,7 @@ #include #include -#include -#include +#include #include #include diff --git a/gps/location/LocationAPI.h b/gps/location/LocationAPI.h old mode 100755 new mode 100644 diff --git a/gps/location/LocationAPIClientBase.cpp b/gps/location/LocationAPIClientBase.cpp old mode 100755 new mode 100644 index 626968c..50b4b83 --- a/gps/location/LocationAPIClientBase.cpp +++ b/gps/location/LocationAPIClientBase.cpp @@ -29,12 +29,12 @@ #define LOG_NDDEBUG 0 #define LOG_TAG "LocSvc_APIClientBase" -#include -#include +#include #include #include #include "LocationAPIClientBase.h" +#define FLP_CONF_FILE "/etc/flp.conf" #define GEOFENCE_SESSION_ID 0xFFFFFFFF #define CONFIG_SESSION_ID 0xFFFFFFFF @@ -153,6 +153,7 @@ uint32_t LocationAPIControlClient::locAPIGnssUpdateConfig(GnssConfig config) memcpy(&mConfig, &config, sizeof(GnssConfig)); + uint32_t session = 0; uint32_t* idArray = mLocationControlAPI->gnssUpdateConfig(config); LOC_LOGV("%s:%d] gnssUpdateConfig return array: %p", __FUNCTION__, __LINE__, idArray); if (idArray != nullptr) { @@ -364,7 +365,7 @@ int32_t LocationAPIClientBase::locAPIGetBatchSize() { {"BATCH_SIZE", &mBatchSize, nullptr, 'n'}, }; - UTIL_READ_CONF(LOC_PATH_FLP_CONF, flp_conf_param_table); + UTIL_READ_CONF(FLP_CONF_FILE, flp_conf_param_table); if (mBatchSize < 0) { // set mBatchSize to 0 if we got an illegal value from config file mBatchSize = 0; @@ -561,16 +562,10 @@ uint32_t LocationAPIClientBase::locAPIGetBatchedLocations(uint32_t id, size_t co if (mLocationAPI) { if (mSessionBiDict.hasId(id)) { SessionEntity entity = mSessionBiDict.getExtById(id); - if (entity.sessionMode != SESSION_MODE_ON_FIX) { - uint32_t batchingSession = entity.batchingSession; - mRequestQueues[REQUEST_SESSION].push(new GetBatchedLocationsRequest(*this)); - mLocationAPI->getBatchedLocations(batchingSession, count); - retVal = LOCATION_ERROR_SUCCESS; - } else { - LOC_LOGE("%s:%d] Unsupported for session id: %d, mode is SESSION_MODE_ON_FIX", - __FUNCTION__, __LINE__, id); - retVal = LOCATION_ERROR_NOT_SUPPORTED; - } + uint32_t batchingSession = entity.batchingSession; + mRequestQueues[REQUEST_SESSION].push(new GetBatchedLocationsRequest(*this)); + mLocationAPI->getBatchedLocations(batchingSession, count); + retVal = LOCATION_ERROR_SUCCESS; } else { retVal = LOCATION_ERROR_ID_UNKNOWN; LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__, id); @@ -619,24 +614,26 @@ void LocationAPIClientBase::locAPIRemoveGeofences(size_t count, uint32_t* ids) } if (mRequestQueues[REQUEST_GEOFENCE].getSession() == GEOFENCE_SESSION_ID) { - BiDict* removedGeofenceBiDict = - new BiDict(); size_t j = 0; + uint32_t id_cb; + LocationError err; for (size_t i = 0; i < count; i++) { sessions[j] = mGeofenceBiDict.getSession(ids[i]); + id_cb = ids[i]; if (sessions[j] > 0) { - GeofenceBreachTypeMask type = mGeofenceBiDict.getExtBySession(sessions[j]); mGeofenceBiDict.rmBySession(sessions[j]); - removedGeofenceBiDict->set(ids[i], sessions[j], type); + err = LOCATION_ERROR_SUCCESS; + onRemoveGeofencesCb(1, &err, &id_cb); j++; + } else { + err = LOCATION_ERROR_ID_UNKNOWN; + onRemoveGeofencesCb(1, &err, &id_cb); } } + if (j > 0) { - mRequestQueues[REQUEST_GEOFENCE].push(new RemoveGeofencesRequest(*this, - removedGeofenceBiDict)); + mRequestQueues[REQUEST_GEOFENCE].push(new RemoveGeofencesRequest(*this)); mLocationAPI->removeGeofences(j, sessions); - } else { - delete(removedGeofenceBiDict); } } else { LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__, diff --git a/gps/location/LocationAPIClientBase.h b/gps/location/LocationAPIClientBase.h old mode 100755 new mode 100644 index 4bd1466..c6ea05c --- a/gps/location/LocationAPIClientBase.h +++ b/gps/location/LocationAPIClientBase.h @@ -36,8 +36,6 @@ #include #include "LocationAPI.h" -#include -#include enum SESSION_MODE { SESSION_MODE_NONE = 0, @@ -471,24 +469,11 @@ private: class RemoveGeofencesRequest : public LocationAPIRequest { public: - RemoveGeofencesRequest(LocationAPIClientBase& API, - BiDict* removedGeofenceBiDict) : - mAPI(API), mRemovedGeofenceBiDict(removedGeofenceBiDict) {} + RemoveGeofencesRequest(LocationAPIClientBase& API) : mAPI(API) {} inline void onCollectiveResponse(size_t count, LocationError* errors, uint32_t* sessions) { - if (nullptr != mRemovedGeofenceBiDict) { - uint32_t *ids = (uint32_t*)malloc(sizeof(uint32_t) * count); - for (size_t i = 0; i < count; i++) { - ids[i] = mRemovedGeofenceBiDict->getId(sessions[i]); - } - mAPI.onRemoveGeofencesCb(count, errors, ids); - free(ids); - delete(mRemovedGeofenceBiDict); - } else { - LOC_LOGE("%s:%d] Unable to access removed geofences data.", __FUNCTION__, __LINE__); - } + // No need to handle collectiveResponse, cbs already notified } LocationAPIClientBase& mAPI; - BiDict* mRemovedGeofenceBiDict; }; class ModifyGeofencesRequest : public LocationAPIRequest { diff --git a/gps/location/location_interface.h b/gps/location/location_interface.h old mode 100755 new mode 100644 index 9229052..33ec29e --- a/gps/location/location_interface.h +++ b/gps/location/location_interface.h @@ -48,7 +48,6 @@ struct GnssInterface { void (*disable)(uint32_t id); uint32_t* (*gnssUpdateConfig)(GnssConfig config); uint32_t (*gnssDeleteAidingData)(GnssAidingData& data); - void (*gnssUpdateXtraThrottle)(const bool enabled); void (*injectLocation)(double latitude, double longitude, float accuracy); void (*injectTime)(int64_t time, int64_t timeReference, int32_t uncertainty); void (*agpsInit)(const AgpsCbInfo& cbInfo); @@ -56,9 +55,7 @@ struct GnssInterface { void (*agpsDataConnClosed)(AGpsExtType agpsType); void (*agpsDataConnFailed)(AGpsExtType agpsType); void (*getDebugReport)(GnssDebugReport& report); - void (*updateConnectionStatus)(bool connected, int8_t type); - void (*odcpiInit)(const OdcpiRequestCallback& callback); - void (*odcpiInject)(const Location& location); + void (*updateConnectionStatus)(bool connected, uint8_t type); }; struct FlpInterface { diff --git a/gps/pla/Android.mk b/gps/pla/Android.mk deleted file mode 100755 index 5f80b04..0000000 --- a/gps/pla/Android.mk +++ /dev/null @@ -1,24 +0,0 @@ -GNSS_CFLAGS := \ - -Werror \ - -Wno-error=unused-parameter \ - -Wno-error=format \ - -Wno-error=macro-redefined \ - -Wno-error=reorder \ - -Wno-error=missing-braces \ - -Wno-error=self-assign \ - -Wno-error=enum-conversion \ - -Wno-error=logical-op-parentheses \ - -Wno-error=null-arithmetic \ - -Wno-error=null-conversion \ - -Wno-error=parentheses-equality \ - -Wno-error=undefined-bool-conversion \ - -Wno-error=tautological-compare \ - -Wno-error=switch \ - -Wno-error=date-time - -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) diff --git a/gps/utils/Android.mk b/gps/utils/Android.mk old mode 100755 new mode 100644 index 98c20f4..e46a7bc --- a/gps/utils/Android.mk +++ b/gps/utils/Android.mk @@ -2,12 +2,12 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) - ## Libs LOCAL_SHARED_LIBRARIES := \ libutils \ libcutils \ liblog \ + libloc_pla \ libprocessgroup LOCAL_SRC_FILES += \ @@ -16,13 +16,13 @@ LOCAL_SRC_FILES += \ msg_q.c \ linked_list.c \ loc_target.cpp \ + platform_lib_abstractions/elapsed_millis_since_boot.cpp \ LocHeap.cpp \ LocTimer.cpp \ LocThread.cpp \ MsgTask.cpp \ loc_misc_utils.cpp \ - loc_nmea.cpp \ - LocIpc.cpp + loc_nmea.cpp # Flag -std=c++11 is not accepted by compiler when LOCAL_CLANG is set to true LOCAL_CFLAGS += \ @@ -37,14 +37,13 @@ LOCAL_LDFLAGS += -Wl,--export-dynamic ## Includes LOCAL_HEADER_LIBRARIES := \ - libutils_headers \ libloc_pla_headers \ liblocation_api_headers LOCAL_MODULE := libgps.utils -LOCAL_VENDOR_MODULE := true - -LOCAL_PRELINK_MODULE := false +LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib +LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64 +LOCAL_MODULE_TAGS := optional LOCAL_CFLAGS += $(GNSS_CFLAGS) @@ -54,3 +53,5 @@ include $(CLEAR_VARS) LOCAL_MODULE := libgps.utils_headers LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH) include $(BUILD_HEADER_LIBRARY) + +include $(addsuffix /Android.mk, $(addprefix $(LOCAL_PATH)/, platform_lib_abstractions)) diff --git a/gps/utils/LocHeap.cpp b/gps/utils/LocHeap.cpp old mode 100755 new mode 100644 diff --git a/gps/utils/LocHeap.h b/gps/utils/LocHeap.h old mode 100755 new mode 100644 diff --git a/gps/utils/LocIpc.cpp b/gps/utils/LocIpc.cpp deleted file mode 100755 index 675664a..0000000 --- a/gps/utils/LocIpc.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/* Copyright (c) 2017-2018 The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation, nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#include -#include -#include -#include -#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(mRunnable))->mIpcName.c_str(); - send(socketName, abort); - mRunnable = nullptr; - } - - if (mIpcFd >= 0) { - if (::close(mIpcFd)) { - LOC_LOGe("cannot close socket:%s", strerror(errno)); - } - mIpcFd = -1; - } - - //delete from the file system at the end - if (socketName) { - unlink(socketName); - } -} - -bool LocIpc::send(const char name[], const std::string& data) { - return send(name, (const uint8_t*)data.c_str(), data.length()); -} - -bool LocIpc::send(const char name[], const uint8_t data[], uint32_t length) { - - bool result = true; - int fd = ::socket(AF_UNIX, SOCK_DGRAM, 0); - if (fd < 0) { - LOC_LOGe("create socket error. reason:%s", strerror(errno)); - return false; - } - - struct sockaddr_un addr = { .sun_family = AF_UNIX }; - snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", name); - - result = sendData(fd, addr, data, length); - - (void)::close(fd); - return result; -} - - -bool LocIpc::sendData(int fd, const sockaddr_un &addr, const uint8_t data[], uint32_t length) { - - bool result = true; - - if (length <= LOC_MSG_BUF_LEN) { - if (::sendto(fd, data, length, 0, - (struct sockaddr*)&addr, sizeof(addr)) < 0) { - LOC_LOGe("cannot send to socket. reason:%s", strerror(errno)); - result = false; - } - } else { - std::string head = LOC_MSG_HEAD; - head.append(std::to_string(length)); - if (::sendto(fd, head.c_str(), head.length(), 0, - (struct sockaddr*)&addr, sizeof(addr)) < 0) { - LOC_LOGe("cannot send to socket. reason:%s", strerror(errno)); - result = false; - } else { - size_t sentBytes = 0; - while(sentBytes < length) { - size_t partLen = length - sentBytes; - if (partLen > LOC_MSG_BUF_LEN) { - partLen = LOC_MSG_BUF_LEN; - } - ssize_t rv = ::sendto(fd, data + sentBytes, partLen, 0, - (struct sockaddr*)&addr, sizeof(addr)); - if (rv < 0) { - LOC_LOGe("cannot send to socket. reason:%s", strerror(errno)); - result = false; - break; - } - sentBytes += rv; - } - } - } - return result; -} - -} diff --git a/gps/utils/LocIpc.h b/gps/utils/LocIpc.h deleted file mode 100755 index 364093b..0000000 --- a/gps/utils/LocIpc.h +++ /dev/null @@ -1,153 +0,0 @@ -/* Copyright (c) 2017-2018 The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation, nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#ifndef __LOC_SOCKET__ -#define __LOC_SOCKET__ - -#include -#include -#include -#include -#include -#include - -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(::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 mSocket; - struct sockaddr_un mDestAddr; - - inline LocIpcSender( - const std::shared_ptr& mySocket, const char* destSocket) : mSocket(mySocket) { - if ((nullptr != mSocket) && (-1 != *mSocket) && (nullptr != destSocket)) { - mDestAddr.sun_family = AF_UNIX; - snprintf(mDestAddr.sun_path, sizeof(mDestAddr.sun_path), "%s", destSocket); - } - } -}; - -} - -#endif //__LOC_SOCKET__ diff --git a/gps/utils/LocSharedLock.h b/gps/utils/LocSharedLock.h old mode 100755 new mode 100644 diff --git a/gps/utils/LocThread.cpp b/gps/utils/LocThread.cpp old mode 100755 new mode 100644 index c1052cb..d112f61 --- a/gps/utils/LocThread.cpp +++ b/gps/utils/LocThread.cpp @@ -29,7 +29,7 @@ #include #include #include -#include +#include class LocThreadDelegate { LocRunnable* mRunnable; diff --git a/gps/utils/LocThread.h b/gps/utils/LocThread.h old mode 100755 new mode 100644 diff --git a/gps/utils/LocTimer.cpp b/gps/utils/LocTimer.cpp old mode 100755 new mode 100644 index 93775d0..5bcdd7b --- a/gps/utils/LocTimer.cpp +++ b/gps/utils/LocTimer.cpp @@ -27,15 +27,14 @@ * */ -#include #include #include #include #include +#include #include #include -#include -#include +#include #include #include #include diff --git a/gps/utils/LocTimer.h b/gps/utils/LocTimer.h old mode 100755 new mode 100644 index abc7f64..c6a6362 --- a/gps/utils/LocTimer.h +++ b/gps/utils/LocTimer.h @@ -31,7 +31,7 @@ #define __LOC_TIMER_CPP_H__ #include -#include +#include // opaque class to provide service implementation. class LocTimerDelegate; diff --git a/gps/utils/LocUnorderedSetMap.h b/gps/utils/LocUnorderedSetMap.h deleted file mode 100755 index 8748134..0000000 --- a/gps/utils/LocUnorderedSetMap.h +++ /dev/null @@ -1,192 +0,0 @@ -/* Copyright (c) 2015, 2017 The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation, nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#ifndef __LOC_UNORDERDED_SETMAP_H__ -#define __LOC_UNORDERDED_SETMAP_H__ - -#include -#include -#include - -using std::unordered_set; -using std::unordered_map; - -namespace loc_util { - -// Trim from *fromSet* any elements that also exist in *rVals*. -// The optional *goneVals*, if not null, will be populated with removed elements. -template -inline static void trimSet(unordered_set& fromSet, const unordered_set& rVals, - unordered_set* goneVals) { - for (auto val : rVals) { - if (fromSet.erase(val) > 0 && nullptr != goneVals) { - goneVals->insert(val); - } - } -} - -// this method is destructive to the input unordered_sets. -// the return set is the interset extracted out from the two input sets, *s1* and *s2*. -// *s1* and *s2* will be left with the intersect removed from them. -template -static unordered_set removeAndReturnInterset(unordered_set& s1, unordered_set& s2) { - unordered_set common(0); - for (auto b = s2.begin(); b != s2.end(); b++) { - auto a = find(s1.begin(), s1.end(), *b); - if (a != s1.end()) { - // this is a common item of both l1 and l2, remove from both - // but after we add to common - common.insert(*a); - s1.erase(a); - s2.erase(b); - } - } - return common; -} - -template -class LocUnorderedSetMap { - unordered_map> mMap; - - - // Trim the VALs pointed to by *iter*, with everything that also exist in *rVals*. - // If the set becomes empty, remove the map entry. *goneVals*, if not null, records - // the trimmed VALs. - bool trimOrRemove(typename unordered_map>::iterator iter, - const unordered_set& rVals, unordered_set* goneVals) { - trimSet(iter->second, rVals, goneVals); - bool removeEntry = (iter->second.empty()); - if (removeEntry) { - mMap.erase(iter); - } - return removeEntry; - } - -public: - inline LocUnorderedSetMap() {} - inline LocUnorderedSetMap(size_t size) : mMap(size) {} - - inline bool empty() { return mMap.empty(); } - - // This gets the raw pointer to the VALs pointed to by *key* - // If the entry is not in the map, nullptr will be returned. - inline unordered_set* getValSetPtr(const KEY& key) { - auto entry = mMap.find(key); - return (entry != mMap.end()) ? &(entry->second) : nullptr; - } - - // This gets a copy of VALs pointed to by *key* - // If the entry is not in the map, an empty set will be returned. - inline unordered_set getValSet(const KEY& key) { - auto entry = mMap.find(key); - return (entry != mMap.end()) ? entry->second : unordered_set(0); - } - - // This gets all the KEYs from the map - inline unordered_set getKeys() { - unordered_set keys(0); - for (auto entry : mMap) { - keys.insert(entry.first); - } - return keys; - } - - inline bool remove(const KEY& key) { - return mMap.erase(key) > 0; - } - - // This looks into all the entries keyed by *keys*. Remove any VALs from the entries - // that also exist in *rVals*. If the entry is left with an empty set, the entry will - // be removed. The optional parameters *goneKeys* and *goneVals* will record the KEYs - // (or entries) and the collapsed VALs removed from the map, respectively. - inline void trimOrRemove(unordered_set&& keys, const unordered_set& rVals, - unordered_set* goneKeys, unordered_set* goneVals) { - trimOrRemove(keys, rVals, goneKeys, goneVals); - } - inline void trimOrRemove(unordered_set& keys, const unordered_set& rVals, - unordered_set* goneKeys, unordered_set* goneVals) { - for (auto key : keys) { - auto iter = mMap.find(key); - if (iter != mMap.end() && trimOrRemove(iter, rVals, goneVals) && nullptr != goneKeys) { - goneKeys->insert(iter->first); - } - } - } - - // This adds all VALs from *newVals* to the map entry keyed by *key*. Or if it - // doesn't exist yet, add the set to the map. - bool add(const KEY& key, const unordered_set& newVals) { - bool newEntryAdded = false; - if (!newVals.empty()) { - auto iter = mMap.find(key); - if (iter != mMap.end()) { - iter->second.insert(newVals.begin(), newVals.end()); - } else { - mMap[key] = newVals; - newEntryAdded = true; - } - } - return newEntryAdded; - } - - // This adds to each of entries in the map keyed by *keys* with the VALs in the - // *enwVals*. If there new entries added (new key in *keys*), *newKeys*, if not - // null, would be populated with those keys. - inline void add(const unordered_set& keys, const unordered_set&& newVals, - unordered_set* newKeys) { - add(keys, newVals, newKeys); - } - inline void add(const unordered_set& keys, const unordered_set& newVals, - unordered_set* newKeys) { - for (auto key : keys) { - if (add(key, newVals) && nullptr != newKeys) { - newKeys->insert(key); - } - } - } - - // This puts *newVals* into the map keyed by *key*, and returns the VALs that are - // in effect removed from the keyed VAL set in the map entry. - // This call would also remove those same VALs from *newVals*. - inline unordered_set update(const KEY& key, unordered_set& newVals) { - unordered_set goneVals(0); - - if (newVals.empty()) { - mMap.erase(key); - } else { - auto curVals = mMap[key]; - mMap[key] = newVals; - goneVals = removeAndReturnInterset(curVals, newVals); - } - return goneVals; - } -}; - -} // namespace loc_util - -#endif // #ifndef __LOC_UNORDERDED_SETMAP_H__ diff --git a/gps/utils/MsgTask.cpp b/gps/utils/MsgTask.cpp old mode 100755 new mode 100644 index eaead5c..80abeec --- a/gps/utils/MsgTask.cpp +++ b/gps/utils/MsgTask.cpp @@ -32,9 +32,8 @@ #include #include #include -#include #include -#include +#include static void LocMsgDestroy(void* msg) { delete (LocMsg*)msg; @@ -83,7 +82,7 @@ void MsgTask::sendMsg(const LocMsg* msg) const { void MsgTask::prerun() { // make sure we do not run in background scheduling group - set_sched_policy(gettid(), SP_FOREGROUND); + platform_lib_abstraction_set_sched_policy(platform_lib_abstraction_gettid(), PLA_SP_FOREGROUND); } bool MsgTask::run() { diff --git a/gps/utils/MsgTask.h b/gps/utils/MsgTask.h old mode 100755 new mode 100644 diff --git a/gps/utils/gps_extended.h b/gps/utils/gps_extended.h old mode 100755 new mode 100644 diff --git a/gps/utils/gps_extended_c.h b/gps/utils/gps_extended_c.h old mode 100755 new mode 100644 index 5479bec..f87a942 --- a/gps/utils/gps_extended_c.h +++ b/gps/utils/gps_extended_c.h @@ -115,9 +115,7 @@ enum loc_registration_mask_status { typedef enum { LOC_SUPPORTED_FEATURE_ODCPI_2_V02 = 0, /**< Support ODCPI version 2 feature */ LOC_SUPPORTED_FEATURE_WIFI_AP_DATA_INJECT_2_V02, /**< Support Wifi AP data inject version 2 feature */ - LOC_SUPPORTED_FEATURE_DEBUG_NMEA_V02, /**< Support debug NMEA feature */ - LOC_SUPPORTED_FEATURE_GNSS_ONLY_POSITION_REPORT, /**< Support GNSS Only position reports */ - LOC_SUPPORTED_FEATURE_FDCL /**< Support FDCL */ + LOC_SUPPORTED_FEATURE_DEBUG_NMEA_V02 /**< Support debug NMEA feature */ } loc_supported_feature_enum; typedef struct { @@ -310,10 +308,6 @@ typedef uint32_t GpsLocationExtendedFlags; #define GPS_LOCATION_EXTENDED_HAS_POS_DYNAMICS_DATA 0x10000 /** GpsLocationExtended has GPS Time */ #define GPS_LOCATION_EXTENDED_HAS_GPS_TIME 0x20000 -/** GpsLocationExtended has Extended Dilution of Precision */ -#define GPS_LOCATION_EXTENDED_HAS_EXT_DOP 0x40000 -/** GpsLocationExtended has Elapsed Time */ -#define GPS_LOCATION_EXTENDED_HAS_ELAPSED_TIME 0x80000 typedef uint32_t LocNavSolutionMask; /* Bitmask to specify whether SBAS ionospheric correction is used */ @@ -399,29 +393,6 @@ typedef struct { float pitch; }LocPositionDynamics; -typedef struct { - - /** Position dilution of precision. - Range: 1 (highest accuracy) to 50 (lowest accuracy) */ - float PDOP; - - /** Horizontal dilution of precision. - Range: 1 (highest accuracy) to 50 (lowest accuracy) */ - float HDOP; - - /** Vertical dilution of precision. - Range: 1 (highest accuracy) to 50 (lowest accuracy) */ - float VDOP; - - /** geometric dilution of precision. - Range: 1 (highest accuracy) to 50 (lowest accuracy) */ - float GDOP; - - /** time dilution of precision. - Range: 1 (highest accuracy) to 50 (lowest accuracy) */ - float TDOP; -}LocExtDOP; - /* GPS Time structure */ typedef struct { @@ -480,10 +451,6 @@ typedef struct { LocPositionDynamics bodyFrameData; /** GPS Time */ GPSTimeStruct gpsTime; - /** Elapsed Time */ - int64_t elapsedTime; - /** Dilution of precision associated with this position*/ - LocExtDOP extDOP; } GpsLocationExtended; enum loc_sess_status { @@ -592,8 +559,7 @@ enum loc_api_adapter_event_index { LOC_API_ADAPTER_REPORT_GENFENCE_DWELL_REPORT, // Geofence dwell report LOC_API_ADAPTER_REQUEST_SRN_DATA, // request srn data from AP LOC_API_ADAPTER_REQUEST_POSITION_INJECTION, // Position injection request - LOC_API_ADAPTER_BATCH_STATUS, // batch status - LOC_API_ADAPTER_FDCL_SERVICE_REQ, // FDCL service request + LOC_API_ADAPTER_BATCH_STATUS, // batch status LOC_API_ADAPTER_EVENT_MAX }; @@ -629,10 +595,9 @@ enum loc_api_adapter_event_index { #define LOC_API_ADAPTER_BIT_REQUEST_SRN_DATA (1< OdcpiRequestCallback; - /* * Callback with AGNSS(IpV4) status information. * @@ -1331,9 +1282,6 @@ typedef void (*LocAgpsOpenResultCb)(bool isSuccess, AGpsExtType agpsType, const typedef void (*LocAgpsCloseResultCb)(bool isSuccess, AGpsExtType agpsType, void* userDataPtr); -/* Shared resources of LocIpc */ -#define LOC_IPC_HAL "/dev/socket/location/socket_hal" -#define LOC_IPC_XTRA "/dev/socket/location/xtra/socket_xtra" #ifdef __cplusplus } diff --git a/gps/utils/linked_list.c b/gps/utils/linked_list.c old mode 100755 new mode 100644 index 02e1463..33185d0 --- a/gps/utils/linked_list.c +++ b/gps/utils/linked_list.c @@ -26,15 +26,14 @@ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#define LOG_TAG "LocSvc_utils_ll" - #include "linked_list.h" #include #include + +#define LOG_TAG "LocSvc_utils_ll" +#include #include #include -#include -#include typedef struct list_element { struct list_element* next; diff --git a/gps/utils/linked_list.h b/gps/utils/linked_list.h old mode 100755 new mode 100644 diff --git a/gps/utils/loc_cfg.cpp b/gps/utils/loc_cfg.cpp old mode 100755 new mode 100644 index d7adad1..d2364f6 --- a/gps/utils/loc_cfg.cpp +++ b/gps/utils/loc_cfg.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2015, 2018 The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -37,16 +37,13 @@ #include #include #include -#include -#include #include -#include -#include +#include #include #ifdef USE_GLIB #include #endif -#include "log_util.h" +#include "platform_lib_includes.h" /*============================================================================= * @@ -57,14 +54,12 @@ /* Parameter data */ static uint32_t DEBUG_LEVEL = 0xff; static uint32_t TIMESTAMP = 0; -static uint32_t LOC_MODEM_EMULATOR = 0; /* Parameter spec table */ static const loc_param_s_type loc_param_table[] = { - {"DEBUG_LEVEL", &DEBUG_LEVEL, NULL, 'n'}, - {"TIMESTAMP", &TIMESTAMP, NULL, 'n'}, - {"LOC_MODEM_EMULATOR", &LOC_MODEM_EMULATOR, NULL, 'n'}, + {"DEBUG_LEVEL", &DEBUG_LEVEL, NULL, 'n'}, + {"TIMESTAMP", &TIMESTAMP, NULL, 'n'}, }; static const int loc_param_num = sizeof(loc_param_table) / sizeof(loc_param_s_type); @@ -76,28 +71,6 @@ typedef struct loc_param_v_type double param_double_value; }loc_param_v_type; -// Reference below arrays wherever needed to avoid duplicating -// same conf path string over and again in location code. -const char LOC_PATH_GPS_CONF[] = LOC_PATH_GPS_CONF_STR; -const char LOC_PATH_IZAT_CONF[] = LOC_PATH_IZAT_CONF_STR; -const char LOC_PATH_FLP_CONF[] = LOC_PATH_FLP_CONF_STR; -const char LOC_PATH_LOWI_CONF[] = LOC_PATH_LOWI_CONF_STR; -const char LOC_PATH_SAP_CONF[] = LOC_PATH_SAP_CONF_STR; -const char LOC_PATH_APDR_CONF[] = LOC_PATH_APDR_CONF_STR; -const char LOC_PATH_XTWIFI_CONF[] = LOC_PATH_XTWIFI_CONF_STR; -const char LOC_PATH_QUIPC_CONF[] = LOC_PATH_QUIPC_CONF_STR; - -/*=========================================================================== -FUNCTION loc_modem_emulator_enabled - -DESCRIPTION - Provides access to Modem Emulator config item. -===========================================================================*/ -uint32_t loc_modem_emulator_enabled() -{ - return LOC_MODEM_EMULATOR; -} - /*=========================================================================== FUNCTION loc_set_config_entry @@ -408,6 +381,9 @@ void loc_read_conf(const char* conf_file_name, const loc_param_s_type* config_ta uint32_t table_length) { FILE *conf_fp = NULL; + char *lasts; + loc_param_v_type config_value; + uint32_t i; if((conf_fp = fopen(conf_file_name, "r")) != NULL) { @@ -422,718 +398,3 @@ void loc_read_conf(const char* conf_file_name, const loc_param_s_type* config_ta /* Initialize logging mechanism with parsed data */ loc_logger_init(DEBUG_LEVEL, TIMESTAMP); } - -/*============================================================================= - * - * Define and Structures for Parsing Location Process Configuration File - * - *============================================================================*/ -#define MAX_NUM_STRINGS 20 - -//We can have 8 masks for now -#define CONFIG_MASK_TARGET_ALL 0X01 -#define CONFIG_MASK_TARGET_FOUND 0X02 -#define CONFIG_MASK_TARGET_CHECK 0X03 -#define CONFIG_MASK_BASEBAND_ALL 0X04 -#define CONFIG_MASK_BASEBAND_FOUND 0X08 -#define CONFIG_MASK_BASEBAND_CHECK 0x0c -#define CONFIG_MASK_AUTOPLATFORM_ALL 0x10 -#define CONFIG_MASK_AUTOPLATFORM_FOUND 0x20 -#define CONFIG_MASK_AUTOPLATFORM_CHECK 0x30 - -#define LOC_FEATURE_MASK_GTP_WIFI_BASIC 0x01 -#define LOC_FEATURE_MASK_GTP_WIFI_PREMIUM 0X02 -#define LOC_FEATURE_MASK_GTP_CELL_BASIC 0X04 -#define LOC_FEATURE_MASK_GTP_CELL_PREMIUM 0X08 -#define LOC_FEATURE_MASK_GTP_AP_CELL_BASIC LOC_FEATURE_MASK_GTP_CELL_BASIC -#define LOC_FEATURE_MASK_GTP_AP_CELL_PREMIUM LOC_FEATURE_MASK_GTP_CELL_PREMIUM -#define LOC_FEATURE_MASK_SAP_BASIC 0x40 -#define LOC_FEATURE_MASK_SAP_PREMIUM 0X80 -#define LOC_FEATURE_MASK_GTP_WAA_BASIC 0X100 -#define LOC_FEATURE_MASK_GTP_WAA_PREMIUM 0x200 -#define LOC_FEATURE_MASK_GTP_MODEM_CELL_BASIC 0X400 -#define LOC_FEATURE_MASK_GTP_MODEM_CELL_PREMIUM 0X800 -#define LOC_FEATURE_MASK_ODCPI 0x1000 -#define LOC_FEATURE_MASK_FREE_WIFI_SCAN_INJECT 0x2000 -#define LOC_FEATURE_MASK_SUPL_WIFI 0x4000 -#define LOC_FEATURE_MASK_WIFI_SUPPLICANT_INFO 0x8000 - -typedef struct { - char proc_name[LOC_MAX_PARAM_STRING]; - char proc_argument[LOC_MAX_PARAM_STRING]; - char proc_status[LOC_MAX_PARAM_STRING]; - char group_list[LOC_MAX_PARAM_STRING]; - unsigned int premium_feature; - unsigned int loc_feature_mask; - char platform_list[LOC_MAX_PARAM_STRING]; - char baseband[LOC_MAX_PARAM_STRING]; - unsigned int sglte_target; - char feature_gtp_cell_proc[LOC_MAX_PARAM_STRING]; - char feature_gtp_waa[LOC_MAX_PARAM_STRING]; - char feature_gtp_cell[LOC_MAX_PARAM_STRING]; - char feature_gtp_wifi[LOC_MAX_PARAM_STRING]; - char feature_sap[LOC_MAX_PARAM_STRING]; - char feature_odcpi[LOC_MAX_PARAM_STRING]; - char feature_free_wifi_scan_inject[LOC_MAX_PARAM_STRING]; - char feature_supl_wifi[LOC_MAX_PARAM_STRING]; - char feature_wifi_supplicant_info[LOC_MAX_PARAM_STRING]; - char auto_platform[LOC_MAX_PARAM_STRING]; -} loc_launcher_conf; - -/* process configuration parameters */ -static loc_launcher_conf conf; - -/* gps.conf Parameter spec table */ -static const loc_param_s_type gps_conf_parameter_table[] = { - {"SGLTE_TARGET", &conf.sglte_target, NULL, 'n'}, -}; - -/* location feature conf, e.g.: izat.conf feature mode table*/ -static const loc_param_s_type loc_feature_conf_table[] = { - {"GTP_CELL_PROC", &conf.feature_gtp_cell_proc, NULL, 's'}, - {"GTP_CELL", &conf.feature_gtp_cell, NULL, 's'}, - {"GTP_WIFI", &conf.feature_gtp_wifi, NULL, 's'}, - {"GTP_WAA", &conf.feature_gtp_waa, NULL, 's'}, - {"SAP", &conf.feature_sap, NULL, 's'}, - {"ODCPI", &conf.feature_odcpi, NULL, 's'}, - {"FREE_WIFI_SCAN_INJECT", &conf.feature_free_wifi_scan_inject, NULL, 's'}, - {"SUPL_WIFI", &conf.feature_supl_wifi, NULL, 's'}, - {"WIFI_SUPPLICANT_INFO", &conf.feature_wifi_supplicant_info, NULL, 's'}, -}; - -/* location process conf, e.g.: izat.conf Parameter spec table */ -static const loc_param_s_type loc_process_conf_parameter_table[] = { - {"PROCESS_NAME", &conf.proc_name, NULL, 's'}, - {"PROCESS_ARGUMENT", &conf.proc_argument, NULL, 's'}, - {"PROCESS_STATE", &conf.proc_status, NULL, 's'}, - {"PROCESS_GROUPS", &conf.group_list, NULL, 's'}, - {"PREMIUM_FEATURE", &conf.premium_feature, NULL, 'n'}, - {"IZAT_FEATURE_MASK", &conf.loc_feature_mask, NULL, 'n'}, - {"PLATFORMS", &conf.platform_list, NULL, 's'}, - {"BASEBAND", &conf.baseband, NULL, 's'}, - {"HARDWARE_TYPE", &conf.auto_platform, NULL, 's'}, -}; - -/*=========================================================================== -FUNCTION loc_read_process_conf - -DESCRIPTION - Parse the specified conf file and return info for the processes defined. - The format of the file should conform with izat.conf. - -PARAMETERS: - conf_file_name: configuration file to read - process_count_ptr: pointer to store number of processes defined in the conf file. - process_info_table_ptr: pointer to store the process info table. - -DEPENDENCIES - The file must be in izat.conf format. - -RETURN VALUE - 0: success - none-zero: failure - -SIDE EFFECTS - N/A - -NOTES: - On success, memory pointed by (*process_info_table_ptr) must be freed. -===========================================================================*/ -int loc_read_process_conf(const char* conf_file_name, uint32_t * process_count_ptr, - loc_process_info_s_type** process_info_table_ptr) { - loc_process_info_s_type *child_proc = nullptr; - volatile int i=0; - unsigned int j=0; - gid_t gid_list[LOC_PROCESS_MAX_NUM_GROUPS]; - char *split_strings[MAX_NUM_STRINGS]; - int name_length=0, group_list_length=0, platform_length=0, baseband_length=0, ngroups=0, ret=0; - int auto_platform_length = 0; - int group_index=0, nstrings=0, status_length=0; - FILE* conf_fp = nullptr; - char platform_name[PROPERTY_VALUE_MAX], baseband_name[PROPERTY_VALUE_MAX]; - char autoplatform_name[PROPERTY_VALUE_MAX]; - unsigned int loc_service_mask=0; - char config_mask = 0; - unsigned char proc_list_length=0; - int gtp_cell_ap_enabled = 0; - char arg_gtp_waa[LOC_PROCESS_MAX_ARG_STR_LENGTH] = "--"; - char arg_gtp_ap_cell[LOC_PROCESS_MAX_ARG_STR_LENGTH] = "--"; - char arg_gtp_modem_cell[LOC_PROCESS_MAX_ARG_STR_LENGTH] = "--"; - char arg_gtp_wifi[LOC_PROCESS_MAX_ARG_STR_LENGTH] = "--"; - char arg_sap[LOC_PROCESS_MAX_ARG_STR_LENGTH] = "--"; - char arg_disabled[LOC_PROCESS_MAX_ARG_STR_LENGTH] = LOC_FEATURE_MODE_DISABLED; - char arg_basic[LOC_PROCESS_MAX_ARG_STR_LENGTH] = LOC_FEATURE_MODE_BASIC; - char arg_premium[LOC_PROCESS_MAX_ARG_STR_LENGTH] = LOC_FEATURE_MODE_PREMIUM; - - if (process_count_ptr == NULL || process_info_table_ptr == NULL) { - return -1; - } - - //Read gps.conf and fill parameter table - UTIL_READ_CONF(LOC_PATH_GPS_CONF, gps_conf_parameter_table); - - //Form argument strings - strlcat(arg_gtp_waa, LOC_FEATURE_GTP_WAA, LOC_PROCESS_MAX_ARG_STR_LENGTH-3); - strlcat(arg_gtp_ap_cell, LOC_FEATURE_GTP_AP_CELL, LOC_PROCESS_MAX_ARG_STR_LENGTH-3); - strlcat(arg_gtp_modem_cell, LOC_FEATURE_GTP_MODEM_CELL, LOC_PROCESS_MAX_ARG_STR_LENGTH-3); - strlcat(arg_gtp_wifi, LOC_FEATURE_GTP_WIFI, LOC_PROCESS_MAX_ARG_STR_LENGTH-3); - strlcat(arg_sap, LOC_FEATURE_SAP, LOC_PROCESS_MAX_ARG_STR_LENGTH-3); - - //Get platform name from ro.board.platform property - loc_get_platform_name(platform_name, sizeof(platform_name)); - //Get baseband name from ro.baseband property - loc_get_target_baseband(baseband_name, sizeof(baseband_name)); - //Identify if this is an automotive platform - loc_get_auto_platform_name(autoplatform_name,sizeof(autoplatform_name)); - - UTIL_READ_CONF(conf_file_name, loc_feature_conf_table); - - //Set service mask for GTP_WIFI - if(strcmp(conf.feature_gtp_wifi, "DISABLED") == 0) { - LOC_LOGD("%s:%d]: GTP WIFI DISABLED", __func__, __LINE__); - } - else if(strcmp(conf.feature_gtp_wifi, "BASIC") == 0) { - LOC_LOGD("%s:%d]: Setting GTP WIFI to mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_GTP_WIFI_BASIC; - } - //conf file has a garbage value - else { - LOC_LOGE("%s:%d]: Unrecognized value for GTP WIFI Mode."\ - " Setting GTP WIFI to default mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_GTP_WIFI_BASIC; - } - - //Set service mask for GTP_CELL - //Using a temp variable here to indicate wheter GTP cell is - //enabled on the AP or modem. This variable will be used in - //further checks below. An alternative was to compare the - //string again in each place which would've been more expensive - if(strcmp(conf.feature_gtp_cell_proc, "AP") == 0) { - gtp_cell_ap_enabled = 1; - } - - if(strcmp(conf.feature_gtp_cell, "PREMIUM") == 0) { - LOC_LOGE("%s:%d]: Error: location feature GTP CELL does not support PREMIUM mode" \ - " available modes are BASIC and DISABLED. Starting feature in BASIC mode", - __func__, __LINE__); - if(gtp_cell_ap_enabled) { - loc_service_mask |= LOC_FEATURE_MASK_GTP_AP_CELL_BASIC; - } - else { - loc_service_mask |= LOC_FEATURE_MASK_GTP_MODEM_CELL_BASIC; - } - } - else if(strcmp(conf.feature_gtp_cell, "BASIC") == 0) { - LOC_LOGD("%s:%d]: Setting GTP CELL to mode: BASIC", __func__, __LINE__); - if(gtp_cell_ap_enabled) { - loc_service_mask |= LOC_FEATURE_MASK_GTP_AP_CELL_BASIC; - } - else { - loc_service_mask |= LOC_FEATURE_MASK_GTP_MODEM_CELL_BASIC; - } - } - else if(strcmp(conf.feature_gtp_cell, "DISABLED") == 0) { - LOC_LOGD("%s:%d]: GTP CELL DISABLED", __func__, __LINE__); - } - //conf file has a garbage value - else { - LOC_LOGE("%s:%d]: Unrecognized value for GTP CELL Mode." \ - " Setting GTP CELL to default mode: BASIC", __func__, __LINE__); - if(gtp_cell_ap_enabled) { - loc_service_mask |= LOC_FEATURE_MASK_GTP_AP_CELL_BASIC; - } - else { - loc_service_mask |= LOC_FEATURE_MASK_GTP_MODEM_CELL_BASIC; - } - } - - //Set service mask for GTP_WAA - if(strcmp(conf.feature_gtp_waa, "PREMIUM") == 0) { - LOC_LOGE("%s:%d]: Error: location feature GTP WAA does not support PREMIUM mode" \ - " available modes are BASIC and DISABLED. Starting feature in BASIC mode", - __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_GTP_WAA_BASIC; - } - else if(strcmp(conf.feature_gtp_waa, "BASIC") == 0) { - LOC_LOGD("%s:%d]: Setting GTP WAA to mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_GTP_WAA_BASIC; - } - else if(strcmp(conf.feature_gtp_waa, "DISABLED") == 0) { - LOC_LOGD("%s:%d]: GTP WAA DISABLED", __func__, __LINE__); - } - //conf file has a garbage value - else { - LOC_LOGE("%s:%d]: Unrecognized value for GTP WAA Mode."\ - " Setting GTP WAA to default mode: DISABLED", __func__, __LINE__); - } - - //Set service mask for SAP - if(strcmp(conf.feature_sap, "PREMIUM") == 0) { - LOC_LOGD("%s:%d]: Setting SAP to mode: PREMIUM", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_SAP_PREMIUM; - } - else if(strcmp(conf.feature_sap, "BASIC") == 0) { - LOC_LOGD("%s:%d]: Setting SAP to mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_SAP_BASIC; - } - else if(strcmp(conf.feature_sap, "DISABLED") == 0) { - LOC_LOGD("%s:%d]: Setting SAP to mode: DISABLED", __func__, __LINE__); - } - else { - LOC_LOGE("%s:%d]: Unrecognized value for SAP Mode."\ - " Setting SAP to default mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_SAP_BASIC; - } - - // Set service mask for ODCPI - if(strcmp(conf.feature_odcpi, "BASIC") == 0) { - LOC_LOGD("%s:%d]: Setting ODCPI to mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_ODCPI; - } - else if(strcmp(conf.feature_odcpi, "DISABLED") == 0) { - LOC_LOGD("%s:%d]: Setting ODCPI to mode: DISABLED", __func__, __LINE__); - } - else if(strcmp(conf.feature_odcpi, "PREMIUM") == 0) { - LOC_LOGD("%s:%d]: Unrecognized value for ODCPI mode."\ - "Setting ODCPI to default mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_ODCPI; - } - - // Set service mask for FREE_WIFI_SCAN_INJECT - if(strcmp(conf.feature_free_wifi_scan_inject, "BASIC") == 0) { - LOC_LOGD("%s:%d]: Setting FREE_WIFI_SCAN_INJECT to mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_FREE_WIFI_SCAN_INJECT; - } - else if(strcmp(conf.feature_free_wifi_scan_inject, "DISABLED") == 0) { - LOC_LOGD("%s:%d]: Setting FREE_WIFI_SCAN_INJECT to mode: DISABLED", __func__, __LINE__); - } - else if(strcmp(conf.feature_free_wifi_scan_inject, "PREMIUM") == 0) { - LOC_LOGD("%s:%d]: Unrecognized value for FREE_WIFI_SCAN_INJECT mode."\ - "Setting FREE_WIFI_SCAN_INJECT to default mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_FREE_WIFI_SCAN_INJECT; - } - - // Set service mask for SUPL_WIFI - if(strcmp(conf.feature_supl_wifi, "BASIC") == 0) { - LOC_LOGD("%s:%d]: Setting SUPL_WIFI to mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_SUPL_WIFI; - } - else if(strcmp(conf.feature_supl_wifi, "DISABLED") == 0) { - LOC_LOGD("%s:%d]: Setting SUPL_WIFI to mode: DISABLED", __func__, __LINE__); - } - else if(strcmp(conf.feature_supl_wifi, "PREMIUM") == 0) { - LOC_LOGD("%s:%d]: Unrecognized value for SUPL_WIFI mode."\ - "Setting SUPL_WIFI to default mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_SUPL_WIFI; - } - - // Set service mask for WIFI_SUPPLICANT_INFO - if(strcmp(conf.feature_wifi_supplicant_info, "BASIC") == 0) { - LOC_LOGD("%s:%d]: Setting WIFI_SUPPLICANT_INFO to mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_WIFI_SUPPLICANT_INFO; - } - else if(strcmp(conf.feature_wifi_supplicant_info, "DISABLED") == 0) { - LOC_LOGD("%s:%d]: Setting WIFI_SUPPLICANT_INFO to mode: DISABLED", __func__, __LINE__); - } - else if(strcmp(conf.feature_wifi_supplicant_info, "PREMIUM") == 0) { - LOC_LOGD("%s:%d]: Unrecognized value for WIFI_SUPPLICANT_INFO mode."\ - "Setting LOC_FEATURE_MASK_WIFI_SUPPLICANT_INFO to default mode: BASIC", __func__, __LINE__); - loc_service_mask |= LOC_FEATURE_MASK_WIFI_SUPPLICANT_INFO; - } - - LOC_LOGD("%s:%d]: loc_service_mask: %x\n", __func__, __LINE__, loc_service_mask); - - if((conf_fp = fopen(conf_file_name, "r")) == NULL) { - LOC_LOGE("%s:%d]: Error opening %s %s\n", __func__, - __LINE__, conf_file_name, strerror(errno)); - ret = -1; - goto err; - } - - //Parse through the file to find out how many processes are to be launched - proc_list_length = 0; - do { - conf.proc_name[0] = 0; - //Here note that the 3rd parameter is passed as 1. - //This is so that only the first parameter in the table which is "PROCESS_NAME" - //is read. We do not want to read the entire block of parameters at this time - //since we are only counting the number of processes to launch. - //Therefore, only counting the occurrences of PROCESS_NAME parameter - //should suffice - if(loc_read_conf_r(conf_fp, loc_process_conf_parameter_table, 1)) { - LOC_LOGE("%s:%d]: Unable to read conf file. Failing\n", __func__, __LINE__); - ret = -1; - goto err; - } - name_length=(int)strlen(conf.proc_name); - if(name_length) { - proc_list_length++; - LOC_LOGD("Process name:%s", conf.proc_name); - } - } while(name_length); - LOC_LOGD("Process cnt = %d", proc_list_length); - - child_proc = (loc_process_info_s_type *)calloc(proc_list_length, sizeof(loc_process_info_s_type)); - if(child_proc == NULL) { - LOC_LOGE("%s:%d]: ERROR: Malloc returned NULL\n", __func__, __LINE__); - ret = -1; - goto err; - } - - //Move file descriptor to the beginning of the file - //so that the parameters can be read - rewind(conf_fp); - - for(j=0; j LOC_MAX_PARAM_STRING) { - LOC_LOGE("%s:%d]: i: %d; Length of name parameter too long. Max length: %d", - __func__, __LINE__, i, LOC_MAX_PARAM_STRING); - continue; - } - strlcpy(child_proc[j].name[0], conf.proc_name, sizeof (child_proc[j].name[0])); - - child_proc[j].num_groups = 0; - ngroups = loc_util_split_string(conf.group_list, split_strings, MAX_NUM_STRINGS, ' '); -#ifdef __ANDROID__ - for(i=0; ipw_gid; - child_proc[j].num_groups++; - LOC_LOGD("%s:%d]:Group %s = %d matches child_group: %d\n", - __func__, __LINE__, split_strings[i], - pwd->pw_gid,child_proc[j].group_list[i]); - } - } -#endif - nstrings = loc_util_split_string(conf.platform_list, split_strings, MAX_NUM_STRINGS, ' '); - if(strcmp("all", split_strings[0]) == 0) { - if (nstrings == 1 || (nstrings == 2 && (strcmp("exclude", split_strings[1]) == 0))) { - LOC_LOGD("%s:%d]: Enabled for all targets\n", __func__, __LINE__); - config_mask |= CONFIG_MASK_TARGET_ALL; - } - else if (nstrings > 2 && (strcmp("exclude", split_strings[1]) == 0)) { - config_mask |= CONFIG_MASK_TARGET_FOUND; - for (i=2; i 2 && (strcmp("exclude", split_strings[1]) == 0)) { - config_mask |= CONFIG_MASK_BASEBAND_FOUND; - for (i=2; i #include -#include -#include -#include #define LOC_MAX_PARAM_NAME 80 #define LOC_MAX_PARAM_STRING 80 #define LOC_MAX_PARAM_LINE (LOC_MAX_PARAM_NAME + LOC_MAX_PARAM_STRING) -#define LOC_FEATURE_MODE_DISABLED "DISABLED" -#define LOC_FEATURE_MODE_BASIC "BASIC" -#define LOC_FEATURE_MODE_PREMIUM "PREMIUM" - -#define LOC_FEATURE_GTP_AP_CELL "gtp-ap-cell" -#define LOC_FEATURE_GTP_MODEM_CELL "gtp-modem-cell" -#define LOC_FEATURE_GTP_CELL_ENH "gtp-cell-enh" -#define LOC_FEATURE_GTP_WIFI "gtp-wifi" -#define LOC_FEATURE_GTP_WAA "gtp-waa" -#define LOC_FEATURE_SAP "sap" - -#define LOC_PROCESS_MAX_NUM_GROUPS 20 -#define LOC_PROCESS_MAX_NUM_ARGS 25 -#define LOC_PROCESS_MAX_ARG_STR_LENGTH 32 - #define UTIL_UPDATE_CONF(conf_data, len, config_table) \ loc_update_conf((conf_data), (len), (config_table), \ sizeof(config_table) / sizeof(config_table[0])) @@ -80,23 +62,6 @@ typedef struct 'f' for double */ } loc_param_s_type; -typedef enum { - ENABLED, - RUNNING, - DISABLED, - DISABLED_FROM_CONF -} loc_process_e_status; - -typedef struct { - loc_process_e_status proc_status; - pid_t proc_id; - char name[2][LOC_MAX_PARAM_STRING]; - gid_t group_list[LOC_PROCESS_MAX_NUM_GROUPS]; - unsigned char num_groups; - char args[LOC_PROCESS_MAX_NUM_ARGS][LOC_PROCESS_MAX_ARG_STR_LENGTH]; - char argumentString[LOC_MAX_PARAM_STRING]; -} loc_process_info_s_type; - /*============================================================================= * * MODULE EXTERNAL DATA @@ -119,22 +84,6 @@ int loc_read_conf_r(FILE *conf_fp, const loc_param_s_type* config_table, uint32_t table_length); int loc_update_conf(const char* conf_data, int32_t length, const loc_param_s_type* config_table, uint32_t table_length); - -// Below are the location conf file paths -extern const char LOC_PATH_GPS_CONF[]; -extern const char LOC_PATH_IZAT_CONF[]; -extern const char LOC_PATH_FLP_CONF[]; -extern const char LOC_PATH_LOWI_CONF[]; -extern const char LOC_PATH_SAP_CONF[]; -extern const char LOC_PATH_APDR_CONF[]; -extern const char LOC_PATH_XTWIFI_CONF[]; -extern const char LOC_PATH_QUIPC_CONF[]; - -int loc_read_process_conf(const char* conf_file_name, uint32_t * process_count_ptr, - loc_process_info_s_type** process_info_table_ptr); - -uint32_t loc_modem_emulator_enabled(); - #ifdef __cplusplus } #endif diff --git a/gps/utils/loc_gps.h b/gps/utils/loc_gps.h old mode 100755 new mode 100644 diff --git a/gps/utils/loc_log.cpp b/gps/utils/loc_log.cpp old mode 100755 new mode 100644 index ab28998..fd9a236 --- a/gps/utils/loc_log.cpp +++ b/gps/utils/loc_log.cpp @@ -32,10 +32,10 @@ #include #include #include -#include "log_util.h" +#include #include "loc_log.h" #include "msg_q.h" -#include +#include #define BUFFER_SIZE 120 diff --git a/gps/utils/loc_log.h b/gps/utils/loc_log.h old mode 100755 new mode 100644 diff --git a/gps/utils/loc_misc_utils.cpp b/gps/utils/loc_misc_utils.cpp old mode 100755 new mode 100644 index b7c8406..fd3ee6b --- a/gps/utils/loc_misc_utils.cpp +++ b/gps/utils/loc_misc_utils.cpp @@ -30,7 +30,7 @@ #define LOG_TAG "LocSvc_misc_utils" #include #include -#include +#include #include #include diff --git a/gps/utils/loc_misc_utils.h b/gps/utils/loc_misc_utils.h old mode 100755 new mode 100644 diff --git a/gps/utils/loc_nmea.cpp b/gps/utils/loc_nmea.cpp old mode 100755 new mode 100644 index 558dc65..eb193cc --- a/gps/utils/loc_nmea.cpp +++ b/gps/utils/loc_nmea.cpp @@ -31,8 +31,7 @@ #define LOG_TAG "LocSvc_nmea" #include #include -#include -#include +#include #define GLONASS_SV_ID_OFFSET 64 #define MAX_SATELLITES_IN_USE 12 @@ -52,7 +51,6 @@ typedef struct loc_nmea_sv_meta_s uint32_t mask; uint32_t svCount; uint32_t svIdOffset; - uint32_t signalId; uint32_t systemId; } loc_nmea_sv_meta; @@ -73,6 +71,8 @@ typedef struct loc_sv_cache_info_s float vdop; } loc_sv_cache_info; +static loc_sv_cache_info sv_cache_info; + /*=========================================================================== FUNCTION loc_nmea_sv_meta_init @@ -90,7 +90,6 @@ SIDE EFFECTS ===========================================================================*/ static loc_nmea_sv_meta* loc_nmea_sv_meta_init(loc_nmea_sv_meta& sv_meta, - loc_sv_cache_info& sv_cache_info, GnssSvType svType, bool needCombine) { @@ -104,7 +103,6 @@ static loc_nmea_sv_meta* loc_nmea_sv_meta_init(loc_nmea_sv_meta& sv_meta, sv_meta.talker[1] = 'P'; sv_meta.mask = sv_cache_info.gps_used_mask; sv_meta.svCount = sv_cache_info.gps_count; - sv_meta.signalId = 1; sv_meta.systemId = SYSTEM_ID_GPS; break; case GNSS_SV_TYPE_GLONASS: @@ -114,7 +112,6 @@ static loc_nmea_sv_meta* loc_nmea_sv_meta_init(loc_nmea_sv_meta& sv_meta, sv_meta.svCount = sv_cache_info.glo_count; // GLONASS SV ids are from 65-96 sv_meta.svIdOffset = GLONASS_SV_ID_OFFSET; - sv_meta.signalId = 1; sv_meta.systemId = SYSTEM_ID_GLONASS; break; case GNSS_SV_TYPE_GALILEO: @@ -122,7 +119,6 @@ static loc_nmea_sv_meta* loc_nmea_sv_meta_init(loc_nmea_sv_meta& sv_meta, sv_meta.talker[1] = 'A'; sv_meta.mask = sv_cache_info.gal_used_mask; sv_meta.svCount = sv_cache_info.gal_count; - sv_meta.signalId = 7; sv_meta.systemId = SYSTEM_ID_GALILEO; break; case GNSS_SV_TYPE_QZSS: @@ -131,7 +127,6 @@ static loc_nmea_sv_meta* loc_nmea_sv_meta_init(loc_nmea_sv_meta& sv_meta, sv_meta.mask = sv_cache_info.qzss_used_mask; sv_meta.svCount = sv_cache_info.qzss_count; // QZSS SV ids are from 193-197. So keep svIdOffset 0 - sv_meta.signalId = 0; sv_meta.systemId = SYSTEM_ID_QZSS; break; case GNSS_SV_TYPE_BEIDOU: @@ -140,7 +135,6 @@ static loc_nmea_sv_meta* loc_nmea_sv_meta_init(loc_nmea_sv_meta& sv_meta, sv_meta.mask = sv_cache_info.bds_used_mask; sv_meta.svCount = sv_cache_info.bds_count; // BDS SV ids are from 201-235. So keep svIdOffset 0 - sv_meta.signalId = 0; sv_meta.systemId = SYSTEM_ID_BEIDOU; break; default: @@ -266,14 +260,13 @@ static uint32_t loc_nmea_generate_GSA(const GpsLocationExtended &locationExtende fixType = '3'; // 3D fix // Start printing the sentence - // Format: $--GSA,a,x,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,p.p,h.h,v.v,s*cc + // Format: $--GSA,a,x,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,p.p,h.h,v.v*cc // a : Mode : A : Automatic, allowed to automatically switch 2D/3D // x : Fixtype : 1 (no fix), 2 (2D fix), 3 (3D fix) // xx : 12 SV ID // p.p : Position DOP (Dilution of Precision) // h.h : Horizontal DOP // v.v : Vertical DOP - // s : GNSS System Id // cc : Checksum value length = snprintf(pMarker, lengthRemaining, "$%sGSA,A,%c,", talker, fixType); @@ -336,7 +329,7 @@ DESCRIPTION Generate NMEA GSV sentences generated based on sv report Currently below sentences are generated: - $GPGSV: GPS Satellites in View - - $GLGSV: GLONASS Satellites in View + - $GNGSV: GLONASS Satellites in View - $GAGSV: GALILEO Satellites in View DEPENDENCIES @@ -375,7 +368,7 @@ static void loc_nmea_generate_GSV(const GnssSvNotification &svNotify, if (svCount <= 0) { // no svs in view, so just send a blank $--GSV sentence - snprintf(sentence, lengthRemaining, "$%sGSV,1,1,0,%d", talker, sv_meta_p->signalId); + snprintf(sentence, lengthRemaining, "$%sGSV,1,1,0,", talker); length = loc_nmea_put_checksum(sentence, bufSize); nmeaArraystr.push_back(sentence); return; @@ -437,10 +430,15 @@ static void loc_nmea_generate_GSV(const GnssSvNotification &svNotify, } - // append signalId - length = snprintf(pMarker, lengthRemaining,",%d",sv_meta_p->signalId); - pMarker += length; - lengthRemaining -= length; + // The following entries are specific to QZSS and BDS + if ((sv_meta_p->svType == GNSS_SV_TYPE_QZSS) || + (sv_meta_p->svType == GNSS_SV_TYPE_BEIDOU)) + { + // last one is System id and second last is Signal Id which is always zero + length = snprintf(pMarker, lengthRemaining,",%d,%d",0,sv_meta_p->systemId); + pMarker += length; + lengthRemaining -= length; + } length = loc_nmea_put_checksum(sentence, bufSize); nmeaArraystr.push_back(sentence); @@ -497,20 +495,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, int utcMinutes = pTm->tm_min; int utcSeconds = pTm->tm_sec; int utcMSeconds = (location.gpsLocation.timestamp)%1000; - loc_sv_cache_info sv_cache_info = {}; - if (GPS_LOCATION_EXTENDED_HAS_GNSS_SV_USED_DATA & locationExtended.flags) { - sv_cache_info.gps_used_mask = - (uint32_t)locationExtended.gnss_sv_used_ids.gps_sv_used_ids_mask; - sv_cache_info.glo_used_mask = - (uint32_t)locationExtended.gnss_sv_used_ids.glo_sv_used_ids_mask; - sv_cache_info.gal_used_mask = - (uint32_t)locationExtended.gnss_sv_used_ids.gal_sv_used_ids_mask; - sv_cache_info.qzss_used_mask = - (uint32_t)locationExtended.gnss_sv_used_ids.bds_sv_used_ids_mask; - sv_cache_info.bds_used_mask = - (uint32_t)locationExtended.gnss_sv_used_ids.qzss_sv_used_ids_mask; - } if (generate_nmea) { char talker[3] = {'G', 'P', '\0'}; uint32_t svUsedCount = 0; @@ -521,8 +506,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, // ------------------- count = loc_nmea_generate_GSA(locationExtended, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_GPS, true), - nmeaArraystr); + loc_nmea_sv_meta_init(sv_meta, GNSS_SV_TYPE_GPS, true), nmeaArraystr); if (count > 0) { svUsedCount += count; @@ -535,8 +519,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, // ------------------- count = loc_nmea_generate_GSA(locationExtended, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_GLONASS, true), - nmeaArraystr); + loc_nmea_sv_meta_init(sv_meta, GNSS_SV_TYPE_GLONASS, true), nmeaArraystr); if (count > 0) { svUsedCount += count; @@ -549,8 +532,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, // ------------------- count = loc_nmea_generate_GSA(locationExtended, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_GALILEO, true), - nmeaArraystr); + loc_nmea_sv_meta_init(sv_meta, GNSS_SV_TYPE_GALILEO, true), nmeaArraystr); if (count > 0) { svUsedCount += count; @@ -563,8 +545,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, // -------------------------- count = loc_nmea_generate_GSA(locationExtended, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_QZSS, false), - nmeaArraystr); + loc_nmea_sv_meta_init(sv_meta, GNSS_SV_TYPE_QZSS, false), nmeaArraystr); if (count > 0) { svUsedCount += count; @@ -575,8 +556,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, // ---$PQGSA/$GNGSA (BEIDOU)--- // ---------------------------- count = loc_nmea_generate_GSA(locationExtended, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_BEIDOU, false), - nmeaArraystr); + loc_nmea_sv_meta_init(sv_meta, GNSS_SV_TYPE_BEIDOU, false), nmeaArraystr); if (count > 0) { svUsedCount += count; @@ -807,14 +787,6 @@ void loc_nmea_generate_pos(const UlpLocation &location, else // A means autonomous length = snprintf(pMarker, lengthRemaining, "%c", 'A'); - pMarker += length; - lengthRemaining -= length; - - // hardcode Navigation Status field to 'V' - length = snprintf(pMarker, lengthRemaining, ",%c", 'V'); - pMarker += length; - lengthRemaining -= length; - length = loc_nmea_put_checksum(sentence, sizeof(sentence)); nmeaArraystr.push_back(sentence); @@ -948,6 +920,13 @@ void loc_nmea_generate_pos(const UlpLocation &location, length = loc_nmea_put_checksum(sentence, sizeof(sentence)); nmeaArraystr.push_back(sentence); + + // clear the cache so they can't be used again + sv_cache_info.gps_used_mask = 0; + sv_cache_info.glo_used_mask = 0; + sv_cache_info.gal_used_mask = 0; + sv_cache_info.qzss_used_mask = 0; + sv_cache_info.bds_used_mask = 0; } //Send blank NMEA reports for non-final fixes else { @@ -967,7 +946,7 @@ void loc_nmea_generate_pos(const UlpLocation &location, length = loc_nmea_put_checksum(sentence, sizeof(sentence)); nmeaArraystr.push_back(sentence); - strlcpy(sentence, "$GPRMC,,V,,,,,,,,,,N,V", sizeof(sentence)); + strlcpy(sentence, "$GPRMC,,V,,,,,,,,,,N", sizeof(sentence)); length = loc_nmea_put_checksum(sentence, sizeof(sentence)); nmeaArraystr.push_back(sentence); @@ -1003,11 +982,27 @@ void loc_nmea_generate_sv(const GnssSvNotification &svNotify, ENTRY_LOG(); char sentence[NMEA_SENTENCE_MAX_LENGTH] = {0}; + char* pMarker = sentence; + int lengthRemaining = sizeof(sentence); + int length = 0; int svCount = svNotify.count; + int sentenceCount = 0; + int sentenceNumber = 1; int svNumber = 1; - loc_sv_cache_info sv_cache_info = {}; //Count GPS SVs for saparating GPS from GLONASS and throw others + + sv_cache_info.gps_used_mask = 0; + sv_cache_info.glo_used_mask = 0; + sv_cache_info.gal_used_mask = 0; + sv_cache_info.qzss_used_mask = 0; + sv_cache_info.bds_used_mask = 0; + + sv_cache_info.gps_count = 0; + sv_cache_info.glo_count = 0; + sv_cache_info.gal_count = 0; + sv_cache_info.qzss_count = 0; + sv_cache_info.bds_count = 0; for(svNumber=1; svNumber <= svCount; svNumber++) { if (GNSS_SV_TYPE_GPS == svNotify.gnssSvs[svNumber - 1].type) { @@ -1077,38 +1072,35 @@ void loc_nmea_generate_sv(const GnssSvNotification &svNotify, // ------------------ loc_nmea_generate_GSV(svNotify, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_GPS, false), nmeaArraystr); + loc_nmea_sv_meta_init(sv_meta, GNSS_SV_TYPE_GPS, false), nmeaArraystr); // ------------------ // ------$GLGSV------ // ------------------ loc_nmea_generate_GSV(svNotify, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_GLONASS, false), - nmeaArraystr); + loc_nmea_sv_meta_init(sv_meta, GNSS_SV_TYPE_GLONASS, false), nmeaArraystr); // ------------------ // ------$GAGSV------ // ------------------ loc_nmea_generate_GSV(svNotify, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_GALILEO, false), - nmeaArraystr); + loc_nmea_sv_meta_init(sv_meta, GNSS_SV_TYPE_GALILEO, false), nmeaArraystr); // ------------------------- // ------$PQGSV (QZSS)------ // ------------------------- loc_nmea_generate_GSV(svNotify, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_QZSS, false), nmeaArraystr); + loc_nmea_sv_meta_init(sv_meta, GNSS_SV_TYPE_QZSS, false), nmeaArraystr); // --------------------------- // ------$PQGSV (BEIDOU)------ // --------------------------- loc_nmea_generate_GSV(svNotify, sentence, sizeof(sentence), - loc_nmea_sv_meta_init(sv_meta, sv_cache_info, GNSS_SV_TYPE_BEIDOU, false), - nmeaArraystr); + loc_nmea_sv_meta_init(sv_meta, GNSS_SV_TYPE_BEIDOU, false), nmeaArraystr); EXIT_LOG(%d, 0); } diff --git a/gps/utils/loc_nmea.h b/gps/utils/loc_nmea.h old mode 100755 new mode 100644 diff --git a/gps/utils/loc_target.cpp b/gps/utils/loc_target.cpp old mode 100755 new mode 100644 index 569f3a7..b7ba07b --- a/gps/utils/loc_target.cpp +++ b/gps/utils/loc_target.cpp @@ -27,18 +27,18 @@ * */ -#include #include #include #include #include #include +#include #include #include -#include +#include #include "loc_target.h" #include "loc_log.h" -#include +#include #define APQ8064_ID_1 "109" #define APQ8064_ID_2 "153" @@ -206,3 +206,17 @@ detected: LOC_LOGW("HAL: %s returned %d", __FUNCTION__, gTarget); return gTarget; } + +/*Reads the property ro.lean to identify if this is a lean target + Returns: + 0 if not a lean and mean target + 1 if this is a lean and mean target +*/ +int loc_identify_lean_target() +{ + int ret = 0; + char lean_target[PROPERTY_VALUE_MAX]; + property_get("ro.lean", lean_target, ""); + LOC_LOGD("%s:%d]: lean target: %s\n", __func__, __LINE__, lean_target); + return !(strncmp(lean_target, "true", PROPERTY_VALUE_MAX)); +} diff --git a/gps/utils/loc_target.h b/gps/utils/loc_target.h old mode 100755 new mode 100644 index 172b475..47a67d9 --- a/gps/utils/loc_target.h +++ b/gps/utils/loc_target.h @@ -55,6 +55,12 @@ void loc_get_platform_name(char *platform_name, int array_length); of atleast PROPERTY_VALUE_MAX*/ void loc_get_auto_platform_name(char *platform_name, int array_length); +/*Reads the property ro.lean to identify if this is a lean target + Returns: + 0 if not a lean and mean target + 1 if this is a lean and mean target*/ +int loc_identify_lean_target(); + /* Please remember to update 'target_name' in loc_log.cpp, if do any changes to this enum. */ typedef enum { diff --git a/gps/utils/loc_timer.h b/gps/utils/loc_timer.h old mode 100755 new mode 100644 index fff0c46..25fd179 --- a/gps/utils/loc_timer.h +++ b/gps/utils/loc_timer.h @@ -34,8 +34,7 @@ extern "C" { #endif /* __cplusplus */ #include -#include -#include +#include /* user_data: client context pointer, passthrough. Originally received from calling client when loc_timer_start() is called. diff --git a/gps/utils/log_util.h b/gps/utils/log_util.h old mode 100755 new mode 100644 index feb4d3c..7eb338a --- a/gps/utils/log_util.h +++ b/gps/utils/log_util.h @@ -30,23 +30,22 @@ #ifndef __LOG_UTIL_H__ #define __LOG_UTIL_H__ -#if defined (USE_ANDROID_LOGGING) || defined (ANDROID) -// Android and LE targets with logcat support +#ifndef USE_GLIB #include +#endif /* USE_GLIB */ + +#ifdef USE_GLIB -#elif defined (USE_GLIB) -// LE targets with no logcat support #include -#include #include #include -#include #ifndef LOG_TAG #define LOG_TAG "GPS_UTILS" -#endif /* LOG_TAG */ -#endif /* #if defined (USE_ANDROID_LOGGING) || defined (ANDROID) */ +#endif // LOG_TAG + +#endif /* USE_GLIB */ #ifdef __cplusplus extern "C" @@ -141,7 +140,6 @@ extern char* get_timestamp(char* str, unsigned long buf_size); #define LOC_LOG_HEAD(fmt) "%s:%d] " fmt #define LOC_LOGv(fmt,...) LOC_LOGV(LOC_LOG_HEAD(fmt), __FUNCTION__, __LINE__, ##__VA_ARGS__) #define LOC_LOGw(fmt,...) LOC_LOGW(LOC_LOG_HEAD(fmt), __FUNCTION__, __LINE__, ##__VA_ARGS__) -#define LOC_LOGi(fmt,...) LOC_LOGI(LOC_LOG_HEAD(fmt), __FUNCTION__, __LINE__, ##__VA_ARGS__) #define LOC_LOGd(fmt,...) LOC_LOGD(LOC_LOG_HEAD(fmt), __FUNCTION__, __LINE__, ##__VA_ARGS__) #define LOC_LOGe(fmt,...) LOC_LOGE(LOC_LOG_HEAD(fmt), __FUNCTION__, __LINE__, ##__VA_ARGS__) diff --git a/gps/utils/msg_q.c b/gps/utils/msg_q.c old mode 100755 new mode 100644 index 76c1478..e8b4ffe --- a/gps/utils/msg_q.c +++ b/gps/utils/msg_q.c @@ -26,14 +26,14 @@ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include "msg_q.h" + #define LOG_TAG "LocSvc_utils_q" +#include +#include "linked_list.h" #include #include #include -#include -#include -#include "linked_list.h" -#include "msg_q.h" typedef struct msg_q { void* msg_list; /* Linked list to store information */ diff --git a/gps/utils/msg_q.h b/gps/utils/msg_q.h old mode 100755 new mode 100644 diff --git a/gps/utils/platform_lib_abstractions/Android.mk b/gps/utils/platform_lib_abstractions/Android.mk new file mode 100644 index 0000000..5053e7d --- /dev/null +++ b/gps/utils/platform_lib_abstractions/Android.mk @@ -0,0 +1 @@ +include $(call all-subdir-makefiles) diff --git a/gps/utils/platform_lib_abstractions/elapsed_millis_since_boot.cpp b/gps/utils/platform_lib_abstractions/elapsed_millis_since_boot.cpp new file mode 100644 index 0000000..6c183a8 --- /dev/null +++ b/gps/utils/platform_lib_abstractions/elapsed_millis_since_boot.cpp @@ -0,0 +1,46 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include "platform_lib_time.h" + +int64_t systemTime(int /*clock*/) +{ + struct timeval t; + t.tv_sec = t.tv_usec = 0; + gettimeofday(&t, NULL); + return t.tv_sec*1000000LL + t.tv_usec; +} + + +int64_t elapsedMillisSinceBoot() +{ + int64_t t_us = systemTime(0); + return (int64_t) t_us / 1000LL; +} diff --git a/gps/utils/platform_lib_abstractions/loc_pla/Android.mk b/gps/utils/platform_lib_abstractions/loc_pla/Android.mk new file mode 100644 index 0000000..5053e7d --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_pla/Android.mk @@ -0,0 +1 @@ +include $(call all-subdir-makefiles) diff --git a/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_gettid.h b/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_gettid.h new file mode 100644 index 0000000..340c3c5 --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_gettid.h @@ -0,0 +1,45 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __PLATFORM_LIB_GETTID_H__ +#define __PLATFORM_LIB_GETTID_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif +#ifdef USE_GLIB +const char* getprogname(); +#endif /* USE_GLIB */ + +pid_t platform_lib_abstraction_gettid(); +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* __PLATFORM_LIB_GETTID_H__ */ diff --git a/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_includes.h b/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_includes.h new file mode 100644 index 0000000..ebb7119 --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_includes.h @@ -0,0 +1,39 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __PLATFORM_LIB_INCLUDES_H__ +#define __PLATFORM_LIB_INCLUDES_H__ + +#include "platform_lib_gettid.h" +#include "platform_lib_log_util.h" +#include "platform_lib_macros.h" +#include "platform_lib_property_service.h" +#include "platform_lib_sched_policy.h" +#include "platform_lib_time.h" + +#endif /* __PLATFORM_LIB_INCLUDES_H__ */ diff --git a/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_log_util.h b/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_log_util.h new file mode 100644 index 0000000..26d3c29 --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_log_util.h @@ -0,0 +1,174 @@ +/* Copyright (c) 2011-2014 The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __PLATFORM_LIB_LOG_UTIL_H__ +#define __PLATFORM_LIB_LOG_UTIL_H__ + +#include "platform_lib_macros.h" + +#ifndef USE_GLIB +#include +#else + +#include +#include +#include +#include +#include +#include + +#ifndef LOG_TAG +#define LOG_TAG "GPS_UTILS" +#endif /* LOG_TAG */ + +#ifdef __cplusplus +extern "C" +{ +#endif +/*============================================================================= + * + * LOC LOGGER TYPE DECLARATION + * + *============================================================================*/ +/* LOC LOGGER */ +typedef struct loc_logger_s +{ + unsigned long DEBUG_LEVEL; + unsigned long TIMESTAMP; +} loc_logger_s_type; + +/*============================================================================= + * + * EXTERNAL DATA + * + *============================================================================*/ +extern loc_logger_s_type loc_logger; + +// Logging Improvements +extern const char *loc_logger_boolStr[]; + +extern const char *boolStr[]; +extern const char VOID_RET[]; +extern const char FROM_AFW[]; +extern const char TO_MODEM[]; +extern const char FROM_MODEM[]; +extern const char TO_AFW[]; +extern const char EXIT_TAG[]; +extern const char ENTRY_TAG[]; +extern const char EXIT_ERROR_TAG[]; + +/*============================================================================= + * + * MODULE EXPORTED FUNCTIONS + * + *============================================================================*/ +void loc_logger_init(unsigned long debug, unsigned long timestamp); +char* get_timestamp(char* str, unsigned long buf_size); + +#ifndef DEBUG_DMN_LOC_API + +/* LOGGING MACROS */ +/*loc_logger.DEBUG_LEVEL is initialized to 0xff in loc_cfg.cpp + if that value remains unchanged, it means gps.conf did not + provide a value and we default to the initial value to use + Android's logging levels*/ +#define IF_LOC_LOGE if((loc_logger.DEBUG_LEVEL >= 1) && (loc_logger.DEBUG_LEVEL <= 5)) +#define IF_LOC_LOGW if((loc_logger.DEBUG_LEVEL >= 2) && (loc_logger.DEBUG_LEVEL <= 5)) +#define IF_LOC_LOGI if((loc_logger.DEBUG_LEVEL >= 3) && (loc_logger.DEBUG_LEVEL <= 5)) +#define IF_LOC_LOGD if((loc_logger.DEBUG_LEVEL >= 4) && (loc_logger.DEBUG_LEVEL <= 5)) +#define IF_LOC_LOGV if((loc_logger.DEBUG_LEVEL >= 5) && (loc_logger.DEBUG_LEVEL <= 5)) + +#define LOC_LOGE(...) IF_LOC_LOGE { ALOGE(__VA_ARGS__); } +#define LOC_LOGW(...) IF_LOC_LOGW { ALOGW(__VA_ARGS__); } +#define LOC_LOGI(...) IF_LOC_LOGI { ALOGI(__VA_ARGS__); } +#define LOC_LOGD(...) IF_LOC_LOGD { ALOGD(__VA_ARGS__); } +#define LOC_LOGV(...) IF_LOC_LOGV { ALOGV(__VA_ARGS__); } + +#else /* DEBUG_DMN_LOC_API */ + +#define LOC_LOGE(...) ALOGE(__VA_ARGS__) +#define LOC_LOGW(...) ALOGW(__VA_ARGS__) +#define LOC_LOGI(...) ALOGI(__VA_ARGS__) +#define LOC_LOGD(...) ALOGD(__VA_ARGS__) +#define LOC_LOGV(...) ALOGV(__VA_ARGS__) + +#endif /* DEBUG_DMN_LOC_API */ + +/*============================================================================= + * + * LOGGING IMPROVEMENT MACROS + * + *============================================================================*/ +#define LOG_(LOC_LOG, ID, WHAT, SPEC, VAL) \ + do { \ + if (loc_logger.TIMESTAMP) { \ + char ts[32]; \ + LOC_LOG("[%s] %s %s line %d " #SPEC, \ + get_timestamp(ts, sizeof(ts)), ID, WHAT, __LINE__, VAL); \ + } else { \ + LOC_LOG("%s %s line %d " #SPEC, \ + ID, WHAT, __LINE__, VAL); \ + } \ + } while(0) + +#define LOC_LOG_HEAD(fmt) "%s:%d] " fmt +#define LOC_LOGv(fmt,...) LOC_LOGV(LOC_LOG_HEAD(fmt), __FUNCTION__, __LINE__, ##__VA_ARGS__) +#define LOC_LOGw(fmt,...) LOC_LOGW(LOC_LOG_HEAD(fmt), __FUNCTION__, __LINE__, ##__VA_ARGS__) +#define LOC_LOGd(fmt,...) LOC_LOGD(LOC_LOG_HEAD(fmt), __FUNCTION__, __LINE__, ##__VA_ARGS__) +#define LOC_LOGe(fmt,...) LOC_LOGE(LOC_LOG_HEAD(fmt), __FUNCTION__, __LINE__, ##__VA_ARGS__) + +#define LOG_I(ID, WHAT, SPEC, VAL) LOG_(LOC_LOGI, ID, WHAT, SPEC, VAL) +#define LOG_V(ID, WHAT, SPEC, VAL) LOG_(LOC_LOGV, ID, WHAT, SPEC, VAL) +#define LOG_E(ID, WHAT, SPEC, VAL) LOG_(LOC_LOGE, ID, WHAT, SPEC, VAL) + +#define ENTRY_LOG() LOG_V(ENTRY_TAG, __FUNCTION__, %s, "") +#define EXIT_LOG(SPEC, VAL) LOG_V(EXIT_TAG, __FUNCTION__, SPEC, VAL) +#define EXIT_LOG_WITH_ERROR(SPEC, VAL) \ + if (VAL != 0) { \ + LOG_E(EXIT_ERROR_TAG, __FUNCTION__, SPEC, VAL); \ + } else { \ + LOG_V(EXIT_TAG, __FUNCTION__, SPEC, VAL); \ + } + + +// Used for logging callflow from Android Framework +#define ENTRY_LOG_CALLFLOW() LOG_I(FROM_AFW, __FUNCTION__, %s, "") +// Used for logging callflow to Modem +#define EXIT_LOG_CALLFLOW(SPEC, VAL) LOG_I(TO_MODEM, __FUNCTION__, SPEC, VAL) +// Used for logging callflow from Modem(TO_MODEM, __FUNCTION__, %s, "") +#define MODEM_LOG_CALLFLOW(SPEC, VAL) LOG_I(FROM_MODEM, __FUNCTION__, SPEC, VAL) +// Used for logging callflow to Android Framework +#define CALLBACK_LOG_CALLFLOW(CB, SPEC, VAL) LOG_I(TO_AFW, CB, SPEC, VAL) + +#ifdef __cplusplus +} +#endif + +#endif /* USE_GLIB */ + +#endif /* __PLATFORM_LIB_LOG_UTIL_H__ */ diff --git a/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_macros.h b/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_macros.h new file mode 100644 index 0000000..d0795eb --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_macros.h @@ -0,0 +1,85 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __PLATFORM_LIB_MACROS_H__ +#define __PLATFORM_LIB_MACROS_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef USE_GLIB +#include +#include +#include +#ifndef OFF_TARGET +#include +#define strlcat g_strlcat +#define strlcpy g_strlcpy +#else +#define strlcat strncat +#define strlcpy strncpy +#endif + +#define TS_PRINTF(format, x...) \ +{ \ + struct timeval tv; \ + struct timezone tz; \ + int hh, mm, ss; \ + gettimeofday(&tv, &tz); \ + hh = tv.tv_sec/3600%24; \ + mm = (tv.tv_sec%3600)/60; \ + ss = tv.tv_sec%60; \ + fprintf(stdout,"%02d:%02d:%02d.%06ld]" format "\n", hh, mm, ss, tv.tv_usec,##x); \ +} + +#define ALOGE(format, x...) TS_PRINTF("E/%s (%d): " format , LOG_TAG, getpid(), ##x) +#define ALOGW(format, x...) TS_PRINTF("W/%s (%d): " format , LOG_TAG, getpid(), ##x) +#define ALOGI(format, x...) TS_PRINTF("I/%s (%d): " format , LOG_TAG, getpid(), ##x) +#define ALOGD(format, x...) TS_PRINTF("D/%s (%d): " format , LOG_TAG, getpid(), ##x) +#define ALOGV(format, x...) TS_PRINTF("V/%s (%d): " format , LOG_TAG, getpid(), ##x) + +#endif /* USE_GLIB */ + + +// Below are the location conf file paths +extern const char LOC_PATH_GPS_CONF[]; +extern const char LOC_PATH_IZAT_CONF[]; +extern const char LOC_PATH_FLP_CONF[]; +extern const char LOC_PATH_LOWI_CONF[]; +extern const char LOC_PATH_SAP_CONF[]; +extern const char LOC_PATH_APDR_CONF[]; +extern const char LOC_PATH_XTWIFI_CONF[]; +extern const char LOC_PATH_QUIPC_CONF[]; + + +#ifdef __cplusplus +} +#endif /*__cplusplus */ + +#endif /* __PLATFORM_LIB_MACROS_H__ */ diff --git a/gps/pla/oe/loc_pla.h b/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_property_service.h old mode 100755 new mode 100644 similarity index 65% rename from gps/pla/oe/loc_pla.h rename to gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_property_service.h index 3ca1964..ed2041f --- a/gps/pla/oe/loc_pla.h +++ b/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_property_service.h @@ -26,42 +26,19 @@ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef __LOC_PLA__ -#define __LOC_PLA__ +#ifndef __PLATFORM_LIB_PROPERTY_SERVICE_H__ +#define __PLATFORM_LIB_PROPERTY_SERVICE_H__ #ifdef __cplusplus -#include -#define uptimeMillis android::uptimeMillis - extern "C" { #endif - -#include -#include -#include -#include -#include -#include -#ifndef OFF_TARGET -#include -#define strlcat g_strlcat -#define strlcpy g_strlcpy -#else -#define strlcat strncat -#define strlcpy strncpy +#ifndef PROPERTY_VALUE_MAX +#define PROPERTY_VALUE_MAX 92 #endif - -#define LOC_PATH_GPS_CONF_STR "/etc/gps.conf" -#define LOC_PATH_IZAT_CONF_STR "/etc/izat.conf" -#define LOC_PATH_FLP_CONF_STR "/etc/flp.conf" -#define LOC_PATH_LOWI_CONF_STR "/etc/lowi.conf" -#define LOC_PATH_SAP_CONF_STR "/etc/sap.conf" -#define LOC_PATH_APDR_CONF_STR "/etc/apdr.conf" -#define LOC_PATH_XTWIFI_CONF_STR "/etc/xtwifi.conf" -#define LOC_PATH_QUIPC_CONF_STR "/etc/quipc.conf" +int platform_lib_abstraction_property_get(const char *key, char *value, const char *default_value); #ifdef __cplusplus } -#endif /*__cplusplus */ +#endif /* __cplusplus */ -#endif /* __LOC_PLA__ */ +#endif /* __PLATFORM_LIB_PROPERTY_SERVICE_H__ */ diff --git a/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_sched_policy.h b/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_sched_policy.h new file mode 100644 index 0000000..d10f151 --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_sched_policy.h @@ -0,0 +1,46 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __PLATFORM_LIB_SCHED_POLICY_H__ +#define __PLATFORM_LIB_SCHED_POLICY_H__ + +#ifdef __cplusplus +extern "C" { +#endif +typedef enum { + PLA_SP_BACKGROUND = 0, + PLA_SP_FOREGROUND = 1, +} PLASchedPolicy; + +int platform_lib_abstraction_set_sched_policy(int tid, PLASchedPolicy policy); +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __PLATFORM_LIB_SCHED_POLICY_H__ */ + diff --git a/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_time.h b/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_time.h new file mode 100644 index 0000000..ae25ae6 --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_pla/include/platform_lib_time.h @@ -0,0 +1,36 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __PLATFORM_LIB_TIME_H__ +#define __PLATFORM_LIB_TIME_H__ + +#include +int64_t platform_lib_abstraction_elapsed_millis_since_boot(); +int64_t platform_lib_abstraction_elapsed_micros_since_boot(); + +#endif /* __PLATFORM_LIB_TIME_H__ */ diff --git a/gps/utils/platform_lib_abstractions/loc_pla/src/Android.mk b/gps/utils/platform_lib_abstractions/loc_pla/src/Android.mk new file mode 100644 index 0000000..d7aea94 --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_pla/src/Android.mk @@ -0,0 +1,60 @@ +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 + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +## Libs +LOCAL_SHARED_LIBRARIES := \ + libutils \ + libcutils \ + liblog \ + libloc_stub + +LOCAL_SRC_FILES += \ + platform_lib_gettid.cpp \ + platform_lib_log_util.cpp \ + platform_lib_property_service.cpp \ + platform_lib_sched_policy.cpp \ + platform_lib_time.cpp + +LOCAL_CFLAGS += \ + -fno-short-enums \ + -D_ANDROID_ \ + -std=c++11 + +## Includes +LOCAL_C_INCLUDES:= \ + $(LOCAL_PATH)/../include +LOCAL_HEADER_LIBRARIES := \ + libgps.utils_headers \ + libloc_stub_headers + +LOCAL_MODULE := libloc_pla +LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib +LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64 +LOCAL_MODULE_TAGS := optional + +LOCAL_CFLAGS += $(GNSS_CFLAGS) +include $(BUILD_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libloc_pla_headers +LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/../include +include $(BUILD_HEADER_LIBRARY) diff --git a/gps/utils/platform_lib_abstractions/loc_pla/src/platform_lib_gettid.cpp b/gps/utils/platform_lib_abstractions/loc_pla/src/platform_lib_gettid.cpp new file mode 100644 index 0000000..1b7aa32 --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_pla/src/platform_lib_gettid.cpp @@ -0,0 +1,46 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "platform_lib_gettid.h" + +#ifdef USE_GLIB +#include + +#include +const char* getprogname() { + return program_invocation_short_name; +} + +#else +#include +#endif /* USE_GLIB */ + +pid_t platform_lib_abstraction_gettid() +{ + return gettid(); +} diff --git a/gps/utils/platform_lib_abstractions/loc_pla/src/platform_lib_log_util.cpp b/gps/utils/platform_lib_abstractions/loc_pla/src/platform_lib_log_util.cpp new file mode 100644 index 0000000..90bf26d --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_pla/src/platform_lib_log_util.cpp @@ -0,0 +1,81 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include + +#include "platform_lib_log_util.h" +#include "platform_lib_macros.h" + +char * get_timestamp(char *str, unsigned long buf_size) +{ + struct timeval tv; + struct timezone tz; + int hh, mm, ss; + gettimeofday(&tv, &tz); + hh = tv.tv_sec/3600%24; + mm = (tv.tv_sec%3600)/60; + ss = tv.tv_sec%60; + snprintf(str, buf_size, "%02d:%02d:%02d.%06ld", hh, mm, ss, tv.tv_usec); + return str; +} + +// Below are the location conf file paths +#ifdef __ANDROID__ + +#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" + +#else + +#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" + +#endif // __ANDROID__ + +// Reference below arrays wherever needed to avoid duplicating +// same conf path string over and again in location code. +const char LOC_PATH_GPS_CONF[] = LOC_PATH_GPS_CONF_STR; +const char LOC_PATH_IZAT_CONF[] = LOC_PATH_IZAT_CONF_STR; +const char LOC_PATH_FLP_CONF[] = LOC_PATH_FLP_CONF_STR; +const char LOC_PATH_LOWI_CONF[] = LOC_PATH_LOWI_CONF_STR; +const char LOC_PATH_SAP_CONF[] = LOC_PATH_SAP_CONF_STR; +const char LOC_PATH_APDR_CONF[] = LOC_PATH_APDR_CONF_STR; +const char LOC_PATH_XTWIFI_CONF[] = LOC_PATH_XTWIFI_CONF_STR; +const char LOC_PATH_QUIPC_CONF[] = LOC_PATH_QUIPC_CONF_STR; diff --git a/gps/utils/platform_lib_abstractions/loc_pla/src/platform_lib_property_service.cpp b/gps/utils/platform_lib_abstractions/loc_pla/src/platform_lib_property_service.cpp new file mode 100644 index 0000000..dccdebc --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_pla/src/platform_lib_property_service.cpp @@ -0,0 +1,39 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifdef USE_GLIB +#include +#else +#include +#endif /* USE_GLIB */ + +#include "platform_lib_property_service.h" + +int platform_lib_abstraction_property_get(const char *key, char *value, const char *default_value) +{ + return property_get(key, value, default_value); +} diff --git a/gps/utils/platform_lib_abstractions/loc_pla/src/platform_lib_sched_policy.cpp b/gps/utils/platform_lib_abstractions/loc_pla/src/platform_lib_sched_policy.cpp new file mode 100644 index 0000000..ba6b350 --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_pla/src/platform_lib_sched_policy.cpp @@ -0,0 +1,41 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "platform_lib_sched_policy.h" + +#ifdef USE_GLIB +#include +#else +#include +#endif /* USE_GLIB */ + +int platform_lib_abstraction_set_sched_policy(int tid, PLASchedPolicy policy) +{ + return set_sched_policy(tid, (SchedPolicy)policy); +} + diff --git a/gps/utils/platform_lib_abstractions/loc_pla/src/platform_lib_time.cpp b/gps/utils/platform_lib_abstractions/loc_pla/src/platform_lib_time.cpp new file mode 100644 index 0000000..3dcd4d3 --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_pla/src/platform_lib_time.cpp @@ -0,0 +1,59 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "platform_lib_time.h" + +#ifdef USE_GLIB +#include +#else +#include +#include + +#endif /* USE_GLIB */ + +int64_t platform_lib_abstraction_elapsed_millis_since_boot() +{ +#ifdef USE_GLIB + + return elapsedMillisSinceBoot(); + +#else + + //return android::nanoseconds_to_microseconds(systemTime(SYSTEM_TIME_BOOTTIME))/1000; + return nanoseconds_to_microseconds(systemTime(SYSTEM_TIME_BOOTTIME))/1000; +#endif +} +int64_t platform_lib_abstraction_elapsed_micros_since_boot() +{ +#ifdef USE_GLIB + return elapsedMicrosSinceBoot(); + +#else + //return android::nanoseconds_to_microseconds(systemTime(SYSTEM_TIME_BOOTTIME)); + return nanoseconds_to_microseconds(systemTime(SYSTEM_TIME_BOOTTIME)); +#endif +} diff --git a/gps/utils/platform_lib_abstractions/loc_stub/Android.mk b/gps/utils/platform_lib_abstractions/loc_stub/Android.mk new file mode 100644 index 0000000..5053e7d --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_stub/Android.mk @@ -0,0 +1 @@ +include $(call all-subdir-makefiles) diff --git a/gps/utils/platform_lib_abstractions/loc_stub/include/loc_stub_android_runtime.h b/gps/utils/platform_lib_abstractions/loc_stub/include/loc_stub_android_runtime.h new file mode 100644 index 0000000..c8764ee --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_stub/include/loc_stub_android_runtime.h @@ -0,0 +1,45 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __LOC_STUB_ANDROID_RUNTIME_H__ +#define __LOC_STUB_ANDROID_RUNTIME_H__ + +#include + +namespace android { + +class AndroidRuntime +{ +public: + /** create a new thread that is visible from Java */ + static pthread_t createJavaThread(const char* name, void (*start)(void *), + void* arg); +}; + +} +#endif /* __LOC_STUB_ANDROID_RUNTIME_H__ */ diff --git a/gps/pla/android/loc_pla.h b/gps/utils/platform_lib_abstractions/loc_stub/include/loc_stub_gettid.h old mode 100755 new mode 100644 similarity index 69% rename from gps/pla/android/loc_pla.h rename to gps/utils/platform_lib_abstractions/loc_stub/include/loc_stub_gettid.h index 9caae73..677bc81 --- a/gps/pla/android/loc_pla.h +++ b/gps/utils/platform_lib_abstractions/loc_stub/include/loc_stub_gettid.h @@ -26,33 +26,19 @@ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef __LOC_PLA__ -#define __LOC_PLA__ +#ifndef __LOC_STUB_GETTID_H__ +#define __LOC_STUB_GETTID_H__ -#ifdef __cplusplus -#include -#define uptimeMillis android::uptimeMillis -#endif +#include #ifdef __cplusplus extern "C" { #endif -#include -#include -#include - -#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" +pid_t gettid(void); #ifdef __cplusplus } -#endif /*__cplusplus */ +#endif -#endif /* __LOC_PLA__ */ +#endif /* __LOC_STUB_GETTID_H__ */ diff --git a/gps/utils/platform_lib_abstractions/loc_stub/include/loc_stub_property_service.h b/gps/utils/platform_lib_abstractions/loc_stub/include/loc_stub_property_service.h new file mode 100644 index 0000000..3677cdf --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_stub/include/loc_stub_property_service.h @@ -0,0 +1,42 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __LOC_STUB_PROPERTY_SERVICE_H__ +#define __LOC_STUB_PROPERTY_SERVICE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +int property_get(const char *key, char *value, const char *default_value); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __LOC_STUB_PROPERTY_SERVICE_H__ */ diff --git a/gps/utils/platform_lib_abstractions/loc_stub/include/loc_stub_sched_policy.h b/gps/utils/platform_lib_abstractions/loc_stub/include/loc_stub_sched_policy.h new file mode 100644 index 0000000..a42b117 --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_stub/include/loc_stub_sched_policy.h @@ -0,0 +1,64 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __LOC_STUB_SCHED_POLICY_H__ +#define __LOC_STUB_SCHED_POLICY_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + SP_BACKGROUND = 0, + SP_FOREGROUND = 1, +} SchedPolicy; + +/*=========================================================================== +FUNCTION set_sched_policy + +DESCRIPTION + Local copy of this function which bypasses android set_sched_policy + +DEPENDENCIES + None + +RETURN VALUE + 0 + +SIDE EFFECTS + N/A + +===========================================================================*/ +int set_sched_policy(int tid, SchedPolicy policy); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __LOC_STUB_SCHED_POLICY_H__ */ + diff --git a/gps/utils/platform_lib_abstractions/loc_stub/include/loc_stub_time.h b/gps/utils/platform_lib_abstractions/loc_stub/include/loc_stub_time.h new file mode 100644 index 0000000..f00a49b --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_stub/include/loc_stub_time.h @@ -0,0 +1,46 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __LOC_STUB_TIME_H__ +#define __LOC_STUB_TIME_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +int64_t systemTime(int clock); +int64_t elapsedMillisSinceBoot(); +int64_t elapsedMicrosSinceBoot(); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __LOC_STUB_TIME_H__ */ diff --git a/gps/utils/platform_lib_abstractions/loc_stub/src/Android.mk b/gps/utils/platform_lib_abstractions/loc_stub/src/Android.mk new file mode 100644 index 0000000..0356fb2 --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_stub/src/Android.mk @@ -0,0 +1,41 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +## Libs +LOCAL_SHARED_LIBRARIES := \ + libutils \ + libcutils \ + liblog + +LOCAL_SRC_FILES += \ + loc_stub_android_runtime.cpp \ + loc_stub_gettid.cpp \ + loc_stub_property_service.cpp \ + loc_stub_sched_policy.cpp \ + loc_stub_time.cpp + +LOCAL_CFLAGS += \ + -fno-short-enums \ + -D_ANDROID_ \ + -std=c++11 + + +LOCAL_LDFLAGS += -Wl,--export-dynamic + +## Includes +LOCAL_C_INCLUDES:= \ + $(LOCAL_PATH)/../include \ + +LOCAL_MODULE := libloc_stub +LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib +LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64 +LOCAL_MODULE_TAGS := optional + +LOCAL_CFLAGS += $(GNSS_CFLAGS) +include $(BUILD_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libloc_stub_headers +LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/../include +include $(BUILD_HEADER_LIBRARY) diff --git a/gps/utils/platform_lib_abstractions/loc_stub/src/loc_stub_android_runtime.cpp b/gps/utils/platform_lib_abstractions/loc_stub/src/loc_stub_android_runtime.cpp new file mode 100644 index 0000000..068df4e --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_stub/src/loc_stub_android_runtime.cpp @@ -0,0 +1,41 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "loc_stub_android_runtime.h" + +namespace android { + +pthread_t AndroidRuntime::createJavaThread(const char* /*name*/, + void (*start)(void *), void* arg) +{ + pthread_t threadId = 0; + pthread_create(&threadId, NULL, (void *(*)(void*))start, arg); + return threadId; +} + +} diff --git a/gps/utils/platform_lib_abstractions/loc_stub/src/loc_stub_gettid.cpp b/gps/utils/platform_lib_abstractions/loc_stub/src/loc_stub_gettid.cpp new file mode 100644 index 0000000..55ef48a --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_stub/src/loc_stub_gettid.cpp @@ -0,0 +1,37 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "loc_stub_gettid.h" +#include +#include + +// Required for off-target environment to compile properly +pid_t gettid(void) +{ + return syscall(SYS_gettid); +} diff --git a/gps/utils/platform_lib_abstractions/loc_stub/src/loc_stub_property_service.cpp b/gps/utils/platform_lib_abstractions/loc_stub/src/loc_stub_property_service.cpp new file mode 100644 index 0000000..907ab02 --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_stub/src/loc_stub_property_service.cpp @@ -0,0 +1,42 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "loc_stub_property_service.h" +#include +#include + +int property_get(const char *key, char * value, const char */*default_value*/) +{ + /* This will disable gps interface + value[0] = '1'; + */ + if (strcmp(key, "ro.baseband") == 0) { + memcpy(value, "msm", 4); + } + return 0; +} diff --git a/gps/utils/platform_lib_abstractions/loc_stub/src/loc_stub_sched_policy.cpp b/gps/utils/platform_lib_abstractions/loc_stub/src/loc_stub_sched_policy.cpp new file mode 100644 index 0000000..5e26245 --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_stub/src/loc_stub_sched_policy.cpp @@ -0,0 +1,50 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "loc_stub_sched_policy.h" + +/*=========================================================================== +FUNCTION set_sched_policy + +DESCRIPTION + Local copy of this function which bypasses android set_sched_policy + +DEPENDENCIES + None + +RETURN VALUE + 0 + +SIDE EFFECTS + N/A + +===========================================================================*/ +int set_sched_policy(int /*tid*/, SchedPolicy /*policy*/) +{ + return 0; +} diff --git a/gps/utils/platform_lib_abstractions/loc_stub/src/loc_stub_time.cpp b/gps/utils/platform_lib_abstractions/loc_stub/src/loc_stub_time.cpp new file mode 100644 index 0000000..48149a6 --- /dev/null +++ b/gps/utils/platform_lib_abstractions/loc_stub/src/loc_stub_time.cpp @@ -0,0 +1,55 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "loc_stub_time.h" +#include +#include +#include + +int64_t systemTime(int /*clock*/) +{ + struct timeval t; + t.tv_sec = t.tv_usec = 0; + gettimeofday(&t, NULL); + return t.tv_sec*1000000LL + t.tv_usec; +} + +int64_t elapsedMicrosSinceBoot() +{ + struct timespec ts; + int64_t time_ms = 0; + clock_gettime(CLOCK_BOOTTIME, &ts); + time_ms += (ts.tv_sec * 1000000000LL); /* Seconds to nanoseconds */ + time_ms += ts.tv_nsec; /* Add Nanoseconds */ + return time_ms; +} + +int64_t elapsedMillisSinceBoot() +{ + return (int64_t) (elapsedMicrosSinceBoot() /1000000LL); +}