From e5c53750f06e9d9739b45ec108260ead7ff80941 Mon Sep 17 00:00:00 2001 From: Isaac Chen Date: Mon, 31 Dec 2018 10:55:08 +0100 Subject: wayne-common: Synchorize gps to P * QC Tag: LA.UM.7.2.r1-04900-sdm660.0 Signed-off-by: Isaac Chen Change-Id: I34383e8fbf394b774f83f8d662873e8786ff1bbf --- gps/android/AGnss.cpp | 31 +++-- gps/android/AGnss.h | 12 +- gps/android/AGnssRil.cpp | 6 +- gps/android/AGnssRil.h | 6 +- gps/android/Android.mk | 17 +-- gps/android/Gnss.cpp | 146 ++++++++++++++++++--- gps/android/Gnss.h | 75 ++++++----- gps/android/GnssBatching.cpp | 6 +- gps/android/GnssBatching.h | 6 +- gps/android/GnssConfiguration.cpp | 14 +- gps/android/GnssConfiguration.h | 14 +- gps/android/GnssDebug.cpp | 61 ++++++++- gps/android/GnssDebug.h | 4 +- gps/android/GnssGeofencing.cpp | 6 +- gps/android/GnssGeofencing.h | 6 +- gps/android/GnssMeasurement.cpp | 42 +++++- gps/android/GnssMeasurement.h | 25 ++-- gps/android/GnssNi.cpp | 6 +- gps/android/GnssNi.h | 6 +- .../android.hardware.gnss@1.0-service-qti.rc | 4 - .../android.hardware.gnss@1.1-service-qti.rc | 4 + gps/android/location_api/BatchingAPIClient.cpp | 13 +- gps/android/location_api/BatchingAPIClient.h | 15 +-- gps/android/location_api/GeofenceAPIClient.cpp | 10 +- gps/android/location_api/GeofenceAPIClient.h | 10 +- gps/android/location_api/GnssAPIClient.cpp | 25 ++-- gps/android/location_api/GnssAPIClient.h | 32 ++--- gps/android/location_api/LocationUtil.cpp | 43 +++++- gps/android/location_api/LocationUtil.h | 11 +- gps/android/location_api/MeasurementAPIClient.cpp | 78 ++++++++--- gps/android/location_api/MeasurementAPIClient.h | 20 +-- gps/android/service.cpp | 8 +- 32 files changed, 549 insertions(+), 213 deletions(-) delete mode 100644 gps/android/android.hardware.gnss@1.0-service-qti.rc create mode 100644 gps/android/android.hardware.gnss@1.1-service-qti.rc (limited to 'gps/android') diff --git a/gps/android/AGnss.cpp b/gps/android/AGnss.cpp index 6213a08..fe50c9a 100644 --- a/gps/android/AGnss.cpp +++ b/gps/android/AGnss.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -27,15 +27,26 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { -sp AGnss::sAGnssCbIface = nullptr; +static AGnss* spAGnss = nullptr; AGnss::AGnss(Gnss* gnss) : mGnss(gnss) { + spAGnss = this; +} + +AGnss::~AGnss() { + spAGnss = nullptr; } void AGnss::agnssStatusIpV4Cb(AGnssExtStatusIpV4 status){ + if (nullptr != spAGnss) { + spAGnss->statusIpV4Cb(status); + } +} + +void AGnss::statusIpV4Cb(AGnssExtStatusIpV4 status) { IAGnssCallback::AGnssStatusIpV4 st = {}; switch (status.type) { @@ -72,9 +83,13 @@ void AGnss::agnssStatusIpV4Cb(AGnssExtStatusIpV4 status){ } st.ipV4Addr = status.ipV4Addr; - auto r = sAGnssCbIface->agnssStatusIpV4Cb(st); - if (!r.isOk()) { - LOC_LOGE("Error invoking AGNSS status cb %s", r.description().c_str()); + if (mAGnssCbIface != nullptr) { + auto r = mAGnssCbIface->agnssStatusIpV4Cb(st); + if (!r.isOk()) { + LOC_LOGw("Error invoking AGNSS status cb %s", r.description().c_str()); + } + } else { + LOC_LOGw("setCallback has not been called yet"); } } @@ -86,7 +101,7 @@ Return AGnss::setCallback(const sp& callback) { } // Save the interface - sAGnssCbIface = callback; + mAGnssCbIface = callback; AgpsCbInfo cbInfo = {}; cbInfo.statusV4Cb = (void*)agnssStatusIpV4Cb; @@ -182,7 +197,7 @@ Return AGnss::setServer(IAGnssCallback::AGnssType type, } } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/AGnss.h b/gps/android/AGnss.h index a3f4a87..4b599b9 100644 --- a/gps/android/AGnss.h +++ b/gps/android/AGnss.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -28,7 +28,7 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { using ::android::hardware::gnss::V1_0::IAGnss; @@ -43,7 +43,7 @@ struct Gnss; struct AGnss : public IAGnss { AGnss(Gnss* gnss); - ~AGnss() = default; + ~AGnss(); /* * Methods from ::android::hardware::gnss::V1_0::IAGnss interface follow. * These declarations were generated from IAGnss.hal. @@ -60,16 +60,18 @@ struct AGnss : public IAGnss { Return setServer(IAGnssCallback::AGnssType type, const hidl_string& hostname, int32_t port) override; + void statusIpV4Cb(AGnssExtStatusIpV4 status); + /* Data call setup callback passed down to GNSS HAL implementation */ static void agnssStatusIpV4Cb(AGnssExtStatusIpV4 status); private: Gnss* mGnss = nullptr; - static sp sAGnssCbIface; + sp mAGnssCbIface = nullptr; }; } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/AGnssRil.cpp b/gps/android/AGnssRil.cpp index d790bae..10478aa 100644 --- a/gps/android/AGnssRil.cpp +++ b/gps/android/AGnssRil.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -36,7 +36,7 @@ typedef void* (getLocationInterface)(); namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { @@ -87,7 +87,7 @@ Return AGnssRil::updateNetworkState(bool connected, NetworkType type, bool } } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/AGnssRil.h b/gps/android/AGnssRil.h index 61216d8..5c9298a 100644 --- a/gps/android/AGnssRil.h +++ b/gps/android/AGnssRil.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -28,7 +28,7 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { using ::android::hardware::gnss::V1_0::IAGnssRil; @@ -75,7 +75,7 @@ struct AGnssRil : public IAGnssRil { }; } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/Android.mk b/gps/android/Android.mk index 18845ef..4f1cdf2 100644 --- a/gps/android/Android.mk +++ b/gps/android/Android.mk @@ -1,9 +1,8 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.gnss@1.0-impl-qti +LOCAL_MODULE := android.hardware.gnss@1.1-impl-qti LOCAL_VENDOR_MODULE := true -LOCAL_MODULE_OWNER := qti LOCAL_MODULE_RELATIVE_PATH := hw LOCAL_SRC_FILES := \ AGnss.cpp \ @@ -36,14 +35,15 @@ LOCAL_SHARED_LIBRARIES := \ libhidlbase \ libhidltransport \ libhwbinder \ + libcutils \ libutils \ android.hardware.gnss@1.0 \ + android.hardware.gnss@1.1 \ LOCAL_SHARED_LIBRARIES += \ libloc_core \ libgps.utils \ libdl \ - libloc_pla \ liblocation_api \ LOCAL_CFLAGS += $(GNSS_CFLAGS) @@ -52,20 +52,16 @@ 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_MODULE_RELATIVE_PATH := hw -LOCAL_VENDOR_MODULE := true -LOCAL_MODULE_OWNER := qti -LOCAL_INIT_RC := android.hardware.gnss@1.0-service-qti.rc +LOCAL_MODULE := android.hardware.gnss@1.1-service-qti LOCAL_VENDOR_MODULE := true +LOCAL_MODULE_RELATIVE_PATH := hw +LOCAL_INIT_RC := android.hardware.gnss@1.1-service-qti.rc LOCAL_SRC_FILES := \ service.cpp \ @@ -90,6 +86,7 @@ LOCAL_SHARED_LIBRARIES += \ libhidlbase \ libhidltransport \ android.hardware.gnss@1.0 \ + android.hardware.gnss@1.1 \ LOCAL_CFLAGS += $(GNSS_CFLAGS) include $(BUILD_EXECUTABLE) diff --git a/gps/android/Gnss.cpp b/gps/android/Gnss.cpp index e3fd64e..de1430c 100644 --- a/gps/android/Gnss.cpp +++ b/gps/android/Gnss.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -20,17 +20,61 @@ #define LOG_TAG "LocSvc_GnssInterface" +#include #include #include +#include #include "Gnss.h" +#include + typedef void* (getLocationInterface)(); +#define IMAGES_INFO_FILE "/sys/devices/soc0/images" +#define DELIMITER ";" + namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { +static std::string getVersionString() { + static std::string version; + if (!version.empty()) + return version; + + char value[PROPERTY_VALUE_MAX] = {0}; + property_get("ro.hardware", value, "unknown"); + version.append(value).append(DELIMITER); + + std::ifstream in(IMAGES_INFO_FILE); + std::string s; + while(getline(in, s)) { + std::size_t found = s.find("CRM:"); + if (std::string::npos == found) { + continue; + } + + // skip over space characters after "CRM:" + const char* substr = s.c_str(); + found += 4; + while (0 != substr[found] && isspace(substr[found])) { + found++; + } + if (s.find("11:") != found) { + continue; + } + s.erase(0, found + 3); + + found = s.find_first_of("\r\n"); + if (std::string::npos != found) { + s.erase(s.begin() + found, s.end()); + } + version.append(s).append(DELIMITER); + } + return version; +} + void Gnss::GnssDeathRecipient::serviceDied(uint64_t cookie, const wp& who) { LOC_LOGE("%s] service died. cookie: %llu, who: %p", __FUNCTION__, static_cast(cookie), &who); @@ -107,7 +151,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); @@ -251,7 +295,7 @@ Return Gnss::injectTime(int64_t timeMs, int64_t timeReferenceMs, } } -Return Gnss::deleteAidingData(IGnss::GnssAidingData aidingDataFlags) { +Return Gnss::deleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags) { ENTRY_LOG_CALLFLOW(); GnssAPIClient* api = getApi(); if (api) { @@ -260,8 +304,8 @@ Return Gnss::deleteAidingData(IGnss::GnssAidingData aidingDataFlags) { return Void(); } -Return Gnss::setPositionMode(IGnss::GnssPositionMode mode, - IGnss::GnssPositionRecurrence recurrence, +Return Gnss::setPositionMode(V1_0::IGnss::GnssPositionMode mode, + V1_0::IGnss::GnssPositionRecurrence recurrence, uint32_t minIntervalMs, uint32_t preferredAccuracyMeters, uint32_t preferredTimeMs) { @@ -275,52 +319,122 @@ Return Gnss::setPositionMode(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(); - mGnssMeasurement = new GnssMeasurement(); + if (mGnssMeasurement == nullptr) + 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; } +// Methods from ::android::hardware::gnss::V1_1::IGnss follow. +Return Gnss::setCallback_1_1(const sp& callback) { + ENTRY_LOG_CALLFLOW(); + callback->gnssNameCb(getVersionString()); + mGnssCbIface_1_1 = callback; + GnssInterface* gnssInterface = getGnssInterface(); + if (nullptr != gnssInterface) { + OdcpiRequestCallback cb = [this](const OdcpiRequestInfo& odcpiRequest) { + odcpiRequestCb(odcpiRequest); + }; + gnssInterface->odcpiInit(cb); + } + return setCallback(callback); +} + +Return Gnss::setPositionMode_1_1(V1_0::IGnss::GnssPositionMode mode, + V1_0::IGnss::GnssPositionRecurrence recurrence, + uint32_t minIntervalMs, + uint32_t preferredAccuracyMeters, + uint32_t preferredTimeMs, + bool /*lowPowerMode*/) { + ENTRY_LOG_CALLFLOW(); + return setPositionMode(mode, recurrence, minIntervalMs, + preferredAccuracyMeters, preferredTimeMs); +} + +Return> Gnss::getExtensionGnssMeasurement_1_1() { + ENTRY_LOG_CALLFLOW(); + if (mGnssMeasurement == nullptr) + mGnssMeasurement = new GnssMeasurement(); + return mGnssMeasurement; +} + +Return> Gnss::getExtensionGnssConfiguration_1_1() { + ENTRY_LOG_CALLFLOW(); + if (mGnssConfig == nullptr) + mGnssConfig = new GnssConfiguration(this); + return mGnssConfig; +} + +Return Gnss::injectBestLocation(const GnssLocation& gnssLocation) { + ENTRY_LOG_CALLFLOW(); + GnssInterface* gnssInterface = getGnssInterface(); + if (nullptr != gnssInterface) { + Location location = {}; + convertGnssLocation(gnssLocation, location); + gnssInterface->odcpiInject(location); + } + return true; +} + +void Gnss::odcpiRequestCb(const OdcpiRequestInfo& request) { + ENTRY_LOG_CALLFLOW(); + if (mGnssCbIface_1_1 != nullptr) { + // For emergency mode, request DBH (Device based hybrid) location + // Mark Independent from GNSS flag to false. + if (ODCPI_REQUEST_TYPE_START == request.type) { + auto r = mGnssCbIface_1_1->gnssRequestLocationCb(!request.isEmergencyMode); + if (!r.isOk()) { + LOC_LOGe("Error invoking gnssRequestLocationCb %s", r.description().c_str()); + } + } else { + LOC_LOGv("Unsupported ODCPI request type: %d", request.type); + } + } else { + LOC_LOGe("ODCPI request not supported."); + } +} + IGnss* HIDL_FETCH_IGnss(const char* hal) { ENTRY_LOG_CALLFLOW(); IGnss* iface = nullptr; @@ -332,7 +446,7 @@ IGnss* HIDL_FETCH_IGnss(const char* hal) { } } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/Gnss.h b/gps/android/Gnss.h index e4589d6..4c0c8b0 100644 --- a/gps/android/Gnss.h +++ b/gps/android/Gnss.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018-2018-2018, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -30,7 +30,8 @@ #include #include -#include +#include +#include #include #include @@ -39,37 +40,27 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { 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; @@ -79,30 +70,40 @@ struct Gnss : public IGnss { Return injectTime(int64_t timeMs, int64_t timeReferenceMs, int32_t uncertaintyMs) override; - Return deleteAidingData(IGnss::GnssAidingData aidingDataFlags) override; - Return setPositionMode(IGnss::GnssPositionMode mode, - IGnss::GnssPositionRecurrence recurrence, + Return deleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags) override; + Return setPositionMode(V1_0::IGnss::GnssPositionMode mode, + V1_0::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; + + // Methods from ::android::hardware::gnss::V1_1::IGnss follow. + Return setCallback_1_1(const sp& callback) override; + Return setPositionMode_1_1(V1_0::IGnss::GnssPositionMode mode, + V1_0::IGnss::GnssPositionRecurrence recurrence, + uint32_t minIntervalMs, uint32_t preferredAccuracyMeters, + uint32_t preferredTimeMs, bool lowPowerMode) override; + Return> getExtensionGnssMeasurement_1_1() override; + Return> getExtensionGnssConfiguration_1_1() override; + Return injectBestLocation(const GnssLocation& location) override; // These methods are not part of the IGnss base class. GnssAPIClient* getApi(); @@ -110,6 +111,9 @@ 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) { @@ -132,8 +136,9 @@ struct Gnss : public IGnss { sp mGnssRil = nullptr; GnssAPIClient* mApi = nullptr; - sp mGnssCbIface = nullptr; - sp mGnssNiCbIface = nullptr; + sp mGnssCbIface = nullptr; + sp mGnssCbIface_1_1 = nullptr; + sp mGnssNiCbIface = nullptr; GnssConfig mPendingConfig; GnssInterface* mGnssInterface = nullptr; }; @@ -141,7 +146,7 @@ struct Gnss : public IGnss { extern "C" IGnss* HIDL_FETCH_IGnss(const char* name); } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/GnssBatching.cpp b/gps/android/GnssBatching.cpp index 6ffadc9..9701aff 100644 --- a/gps/android/GnssBatching.cpp +++ b/gps/android/GnssBatching.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -27,7 +27,7 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { void GnssBatching::GnssBatchingDeathRecipient::serviceDied( @@ -124,7 +124,7 @@ Return GnssBatching::cleanup() { } } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/GnssBatching.h b/gps/android/GnssBatching.h index de5d5c3..8e235d8 100644 --- a/gps/android/GnssBatching.h +++ b/gps/android/GnssBatching.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -28,7 +28,7 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { using ::android::hardware::gnss::V1_0::IGnssBatching; @@ -72,7 +72,7 @@ struct GnssBatching : public IGnssBatching { }; } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/GnssConfiguration.cpp b/gps/android/GnssConfiguration.cpp index 51ee892..9eeceac 100644 --- a/gps/android/GnssConfiguration.cpp +++ b/gps/android/GnssConfiguration.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -27,7 +27,7 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { GnssConfiguration::GnssConfiguration(Gnss* gnss) : mGnss(gnss) { @@ -220,8 +220,16 @@ Return GnssConfiguration::setEmergencySuplPdn(bool enabled) { return mGnss->updateConfiguration(config); } +// Methods from ::android::hardware::gnss::V1_1::IGnssConfiguration follow. +Return GnssConfiguration::setBlacklist( + const hidl_vec& /*blacklist*/) { + + ENTRY_LOG_CALLFLOW(); + return true; +} + } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/GnssConfiguration.h b/gps/android/GnssConfiguration.h index f9ea423..f46f607 100644 --- a/gps/android/GnssConfiguration.h +++ b/gps/android/GnssConfiguration.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * Not a Contribution */ @@ -22,16 +22,16 @@ #ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSCONFIGURATION_H #define ANDROID_HARDWARE_GNSS_V1_1_GNSSCONFIGURATION_H -#include +#include #include namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { -using ::android::hardware::gnss::V1_0::IGnssConfiguration; +using ::android::hardware::gnss::V1_1::IGnssConfiguration; using ::android::hardware::Return; using ::android::hardware::Void; using ::android::hardware::hidl_vec; @@ -58,12 +58,16 @@ struct GnssConfiguration : public IGnssConfiguration { Return setEmergencySuplPdn(bool enable) override; Return setGpsLock(uint8_t lock) override; + // Methods from ::android::hardware::gnss::V1_1::IGnssConfiguration follow. + Return setBlacklist( + const hidl_vec& blacklist) override; + private: Gnss* mGnss = nullptr; }; } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/GnssDebug.cpp b/gps/android/GnssDebug.cpp index ff467d3..94238ab 100644 --- a/gps/android/GnssDebug.cpp +++ b/gps/android/GnssDebug.cpp @@ -25,13 +25,19 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { using ::android::hardware::hidl_vec; -#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 +#define GNSS_DEBUG_UNKNOWN_HORIZONTAL_ACCURACY_METERS (20000000) +#define GNSS_DEBUG_UNKNOWN_VERTICAL_ACCURACY_METERS (20000) +#define GNSS_DEBUG_UNKNOWN_SPEED_ACCURACY_PER_SEC (500) +#define GNSS_DEBUG_UNKNOWN_BEARING_ACCURACY_DEG (180) + +#define GNSS_DEBUG_UNKNOWN_UTC_TIME (1483228800000LL) // 1/1/2017 00:00 GMT +#define GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC (1.57783680E17) // 5 years in ns +#define GNSS_DEBUG_UNKNOWN_FREQ_UNC_NS_PER_SEC (2.0e5) // ppm GnssDebug::GnssDebug(Gnss* gnss) : mGnss(gnss) { @@ -91,6 +97,40 @@ 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; @@ -98,10 +138,17 @@ Return GnssDebug::getDebugData(getDebugData_cb _hidl_cb) data.time.frequencyUncertaintyNsPerSec = reports.mTime.frequencyUncertaintyNsPerSec; } - else { + + if (data.time.timeEstimate < GNSS_DEBUG_UNKNOWN_UTC_TIME) { data.time.timeEstimate = GNSS_DEBUG_UNKNOWN_UTC_TIME; - data.time.timeUncertaintyNs = (float)(GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC); - data.time.frequencyUncertaintyNsPerSec = 0; + } + if (data.time.timeUncertaintyNs <= 0 || + data.time.timeUncertaintyNs > (float)GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC) { + data.time.timeUncertaintyNs = (float)GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC; + } + if (data.time.frequencyUncertaintyNsPerSec <= 0 || + data.time.frequencyUncertaintyNsPerSec > (float)GNSS_DEBUG_UNKNOWN_FREQ_UNC_NS_PER_SEC) { + data.time.frequencyUncertaintyNsPerSec = (float)GNSS_DEBUG_UNKNOWN_FREQ_UNC_NS_PER_SEC; } // satellite data block @@ -137,7 +184,7 @@ Return GnssDebug::getDebugData(getDebugData_cb _hidl_cb) } } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/GnssDebug.h b/gps/android/GnssDebug.h index 7d29131..cb818ac 100644 --- a/gps/android/GnssDebug.h +++ b/gps/android/GnssDebug.h @@ -24,7 +24,7 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { using ::android::hardware::gnss::V1_0::IGnssDebug; @@ -51,7 +51,7 @@ private: }; } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/GnssGeofencing.cpp b/gps/android/GnssGeofencing.cpp index 035a092..5c11afe 100644 --- a/gps/android/GnssGeofencing.cpp +++ b/gps/android/GnssGeofencing.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -27,7 +27,7 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { void GnssGeofencing::GnssGeofencingDeathRecipient::serviceDied( @@ -135,7 +135,7 @@ Return GnssGeofencing::removeAllGeofences() { } } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/GnssGeofencing.h b/gps/android/GnssGeofencing.h index 7af5f91..94a73de 100644 --- a/gps/android/GnssGeofencing.h +++ b/gps/android/GnssGeofencing.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -27,7 +27,7 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { using ::android::hardware::gnss::V1_0::IGnssGeofenceCallback; @@ -83,7 +83,7 @@ struct GnssGeofencing : public IGnssGeofencing { }; } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/GnssMeasurement.cpp b/gps/android/GnssMeasurement.cpp index 8cbfabd..2578a85 100644 --- a/gps/android/GnssMeasurement.cpp +++ b/gps/android/GnssMeasurement.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -27,7 +27,7 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { void GnssMeasurement::GnssMeasurementDeathRecipient::serviceDied( @@ -52,8 +52,9 @@ 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; @@ -72,9 +73,10 @@ Return GnssMeasurement::setCallback( } mGnssMeasurementCbIface = callback; - mGnssMeasurementCbIface->linkToDeath(mGnssMeasurementDeathRecipient, 0 /*cookie*/); + mGnssMeasurementCbIface->linkToDeath(mGnssMeasurementDeathRecipient, 0); return mApi->measurementSetCallback(callback); + } Return GnssMeasurement::close() { @@ -87,13 +89,43 @@ Return GnssMeasurement::close() { mGnssMeasurementCbIface->unlinkToDeath(mGnssMeasurementDeathRecipient); mGnssMeasurementCbIface = nullptr; } + if (mGnssMeasurementCbIface_1_1 != nullptr) { + mGnssMeasurementCbIface_1_1->unlinkToDeath(mGnssMeasurementDeathRecipient); + mGnssMeasurementCbIface_1_1 = nullptr; + } mApi->measurementClose(); return Void(); } +// Methods from ::android::hardware::gnss::V1_1::IGnssMeasurement follow. +Return GnssMeasurement::setCallback_1_1( + const sp& callback, bool /*enableFullTracking*/) { + + Return ret = + IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC; + if (mGnssMeasurementCbIface_1_1 != nullptr) { + LOC_LOGE("%s]: GnssMeasurementCallback is already set", __FUNCTION__); + return IGnssMeasurement::GnssMeasurementStatus::ERROR_ALREADY_INIT; + } + + if (callback == nullptr) { + LOC_LOGE("%s]: callback is nullptr", __FUNCTION__); + return ret; + } + if (mApi == nullptr) { + LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__); + return ret; + } + + mGnssMeasurementCbIface_1_1 = callback; + mGnssMeasurementCbIface_1_1->linkToDeath(mGnssMeasurementDeathRecipient, 0); + + return mApi->measurementSetCallback_1_1(callback); +} + } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/GnssMeasurement.h b/gps/android/GnssMeasurement.h index 5073169..373f0d0 100644 --- a/gps/android/GnssMeasurement.h +++ b/gps/android/GnssMeasurement.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -21,17 +21,18 @@ #ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSMEASUREMENT_H #define ANDROID_HARDWARE_GNSS_V1_1_GNSSMEASUREMENT_H -#include +#include +#include #include namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { -using ::android::hardware::gnss::V1_0::IGnssMeasurement; -using ::android::hardware::gnss::V1_0::IGnssMeasurementCallback; +using ::android::hardware::gnss::V1_1::IGnssMeasurement; +using ::android::hardware::gnss::V1_1::IGnssMeasurementCallback; using ::android::hardware::Return; using ::android::hardware::Void; using ::android::hardware::hidl_vec; @@ -47,10 +48,15 @@ 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; + // Methods from ::android::hardware::gnss::V1_1::IGnssMeasurement follow. + Return setCallback_1_1( + const sp& callback, + bool enableFullTracking) override; + private: struct GnssMeasurementDeathRecipient : hidl_death_recipient { GnssMeasurementDeathRecipient(sp gnssMeasurement) : @@ -63,12 +69,13 @@ struct GnssMeasurement : public IGnssMeasurement { private: sp mGnssMeasurementDeathRecipient = nullptr; - sp mGnssMeasurementCbIface = nullptr; + sp mGnssMeasurementCbIface = nullptr; + sp mGnssMeasurementCbIface_1_1 = nullptr; MeasurementAPIClient* mApi; }; } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/GnssNi.cpp b/gps/android/GnssNi.cpp index 4437932..5ce9569 100644 --- a/gps/android/GnssNi.cpp +++ b/gps/android/GnssNi.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -27,7 +27,7 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { void GnssNi::GnssNiDeathRecipient::serviceDied(uint64_t cookie, const wp& who) { @@ -79,7 +79,7 @@ Return GnssNi::respond(int32_t notifId, IGnssNiCallback::GnssUserResponseT } } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/GnssNi.h b/gps/android/GnssNi.h index f6fe0bb..6733e5b 100644 --- a/gps/android/GnssNi.h +++ b/gps/android/GnssNi.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -27,7 +27,7 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { using ::android::hardware::gnss::V1_0::IGnssNi; @@ -67,7 +67,7 @@ struct GnssNi : public IGnssNi { }; } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/android.hardware.gnss@1.0-service-qti.rc b/gps/android/android.hardware.gnss@1.0-service-qti.rc deleted file mode 100644 index b5da6f9..0000000 --- a/gps/android/android.hardware.gnss@1.0-service-qti.rc +++ /dev/null @@ -1,4 +0,0 @@ -service gnss_service /vendor/bin/hw/android.hardware.gnss@1.0-service-qti - class hal - user gps - group system gps radio diff --git a/gps/android/android.hardware.gnss@1.1-service-qti.rc b/gps/android/android.hardware.gnss@1.1-service-qti.rc new file mode 100644 index 0000000..41b105b --- /dev/null +++ b/gps/android/android.hardware.gnss@1.1-service-qti.rc @@ -0,0 +1,4 @@ +service gnss_service /vendor/bin/hw/android.hardware.gnss@1.1-service-qti + class hal + user gps + group system gps radio diff --git a/gps/android/location_api/BatchingAPIClient.cpp b/gps/android/location_api/BatchingAPIClient.cpp index 0b66d38..82a803f 100644 --- a/gps/android/location_api/BatchingAPIClient.cpp +++ b/gps/android/location_api/BatchingAPIClient.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -42,9 +42,13 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { 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); @@ -153,7 +157,8 @@ 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) { @@ -185,7 +190,7 @@ static void convertBatchOption(const IGnssBatching::Options& in, LocationOptions } } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/location_api/BatchingAPIClient.h b/gps/android/location_api/BatchingAPIClient.h index c951a83..64d47a0 100644 --- a/gps/android/location_api/BatchingAPIClient.h +++ b/gps/android/location_api/BatchingAPIClient.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -39,17 +39,17 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { class BatchingAPIClient : public LocationAPIClientBase { public: - BatchingAPIClient(const sp& callback); + BatchingAPIClient(const sp& callback); ~BatchingAPIClient(); int getBatchSize(); - int startSession(const IGnssBatching::Options& options); - int updateSessionOptions(const IGnssBatching::Options& options); + int startSession(const V1_0::IGnssBatching::Options& options); + int updateSessionOptions(const V1_0::IGnssBatching::Options& options); int stopSession(); void getBatchedLocation(int last_n_locations); void flushBatchedLocations(); @@ -61,14 +61,13 @@ public: void onBatchingCb(size_t count, Location* location, BatchingOptions batchOptions) final; private: - sp mGnssBatchingCbIface; + sp mGnssBatchingCbIface; uint32_t mDefaultId; - int mBatchSize; LocationCapabilitiesMask mLocationCapabilitiesMask; }; } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/location_api/GeofenceAPIClient.cpp b/gps/android/location_api/GeofenceAPIClient.cpp index 6167177..93d175e 100644 --- a/gps/android/location_api/GeofenceAPIClient.cpp +++ b/gps/android/location_api/GeofenceAPIClient.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -39,9 +39,11 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { +using ::android::hardware::gnss::V1_0::IGnssGeofenceCallback; +using ::android::hardware::gnss::V1_0::GnssLocation; GeofenceAPIClient::GeofenceAPIClient(const sp& callback) : LocationAPIClientBase(), @@ -158,7 +160,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()); @@ -267,7 +269,7 @@ void GeofenceAPIClient::onResumeGeofencesCb(size_t count, LocationError* errors, } } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/location_api/GeofenceAPIClient.h b/gps/android/location_api/GeofenceAPIClient.h index f779bcb..c74a59a 100644 --- a/gps/android/location_api/GeofenceAPIClient.h +++ b/gps/android/location_api/GeofenceAPIClient.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -37,7 +37,7 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { using ::android::sp; @@ -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,11 +65,11 @@ public: void onResumeGeofencesCb(size_t count, LocationError* errors, uint32_t* ids) final; private: - sp mGnssGeofencingCbIface; + sp mGnssGeofencingCbIface; }; } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/location_api/GnssAPIClient.cpp b/gps/android/location_api/GnssAPIClient.cpp index 2e44c2e..4e3b0ac 100644 --- a/gps/android/location_api/GnssAPIClient.cpp +++ b/gps/android/location_api/GnssAPIClient.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -40,9 +40,14 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { 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, @@ -160,6 +165,10 @@ 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) @@ -445,7 +454,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()); @@ -499,10 +508,10 @@ static void convertGnssSvStatus(GnssSvNotification& in, IGnssCallback::GnssSvSta { memset(&out, 0, sizeof(IGnssCallback::GnssSvStatus)); out.numSvs = in.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); + 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); } for (size_t i = 0; i < out.numSvs; i++) { IGnssCallback::GnssSvInfo& info = out.gnssSvList[i]; @@ -522,7 +531,7 @@ static void convertGnssSvStatus(GnssSvNotification& in, IGnssCallback::GnssSvSta } } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/location_api/GnssAPIClient.h b/gps/android/location_api/GnssAPIClient.h index b5cffb1..1589f39 100644 --- a/gps/android/location_api/GnssAPIClient.h +++ b/gps/android/location_api/GnssAPIClient.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -30,16 +30,17 @@ #ifndef GNSS_API_CLINET_H #define GNSS_API_CLINET_H + #include -#include -#include +#include +#include #include #include namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { using ::android::sp; @@ -47,28 +48,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(IGnss::GnssPositionMode mode, - IGnss::GnssPositionRecurrence recurrence, + bool gnssSetPositionMode(V1_0::IGnss::GnssPositionMode mode, + V1_0::IGnss::GnssPositionRecurrence recurrence, uint32_t minIntervalMs, uint32_t preferredAccuracyMeters, uint32_t preferredTimeMs); // for GpsNiInterface - void gnssNiRespond(int32_t notifId, IGnssNiCallback::GnssUserResponseType userResponse); + void gnssNiRespond(int32_t notifId, V1_0::IGnssNiCallback::GnssUserResponseType userResponse); // these apis using LocationAPIControlClient - void gnssDeleteAidingData(IGnss::GnssAidingData aidingDataFlags); + void gnssDeleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags); void gnssEnable(LocationTechnologyType techType); void gnssDisable(); void gnssConfigurationUpdate(const GnssConfig& gnssConfig); @@ -89,17 +90,18 @@ 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; }; } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/location_api/LocationUtil.cpp b/gps/android/location_api/LocationUtil.cpp index 311c0b2..21c2e39 100644 --- a/gps/android/location_api/LocationUtil.cpp +++ b/gps/android/location_api/LocationUtil.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -32,9 +32,13 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { 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)); @@ -63,7 +67,38 @@ void convertGnssLocation(Location& in, GnssLocation& out) out.verticalAccuracyMeters = in.verticalAccuracy; out.speedAccuracyMetersPerSecond = in.speedAccuracy; out.bearingAccuracyDegrees = in.bearingAccuracy; - out.timestamp = static_cast(in.timestamp); + 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); } void convertGnssConstellationType(GnssSvType& in, GnssConstellationType& out) @@ -147,7 +182,7 @@ void convertGnssEphemerisHealth(GnssEphemerisHealth& in, GnssDebug::SatelliteEph } } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/location_api/LocationUtil.h b/gps/android/location_api/LocationUtil.h index 44d5e02..63f4f6f 100644 --- a/gps/android/location_api/LocationUtil.h +++ b/gps/android/location_api/LocationUtil.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -37,17 +37,18 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { -void convertGnssLocation(Location& in, GnssLocation& out); -void convertGnssConstellationType(GnssSvType& in, GnssConstellationType& out); +void convertGnssLocation(Location& in, V1_0::GnssLocation& out); +void convertGnssLocation(const V1_0::GnssLocation& in, Location& out); +void convertGnssConstellationType(GnssSvType& in, V1_0::GnssConstellationType& out); void convertGnssEphemerisType(GnssEphemerisType& in, GnssDebug::SatelliteEphemerisType& out); void convertGnssEphemerisSource(GnssEphemerisSource& in, GnssDebug::SatelliteEphemerisSource& out); void convertGnssEphemerisHealth(GnssEphemerisHealth& in, GnssDebug::SatelliteEphemerisHealth& out); } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/location_api/MeasurementAPIClient.cpp b/gps/android/location_api/MeasurementAPIClient.cpp index 731c7ed..f1a5d01 100644 --- a/gps/android/location_api/MeasurementAPIClient.cpp +++ b/gps/android/location_api/MeasurementAPIClient.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -39,17 +39,23 @@ namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { +using ::android::hardware::gnss::V1_0::IGnssMeasurement; +using ::android::hardware::gnss::V1_1::IGnssMeasurementCallback; + static void convertGnssData(GnssMeasurementsNotification& in, + V1_0::IGnssMeasurementCallback::GnssData& out); +static void convertGnssData_1_1(GnssMeasurementsNotification& in, IGnssMeasurementCallback::GnssData& out); static void convertGnssMeasurement(GnssMeasurementsData& in, - IGnssMeasurementCallback::GnssMeasurement& out); + V1_0::IGnssMeasurementCallback::GnssMeasurement& out); static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback::GnssClock& out); MeasurementAPIClient::MeasurementAPIClient() : mGnssMeasurementCbIface(nullptr), + mGnssMeasurementCbIface_1_1(nullptr), mTracking(false) { LOC_LOGD("%s]: ()", __FUNCTION__); @@ -62,7 +68,7 @@ MeasurementAPIClient::~MeasurementAPIClient() // for GpsInterface Return -MeasurementAPIClient::measurementSetCallback(const sp& callback) +MeasurementAPIClient::measurementSetCallback(const sp& callback) { LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback); @@ -70,6 +76,24 @@ MeasurementAPIClient::measurementSetCallback(const sp& mGnssMeasurementCbIface = callback; mMutex.unlock(); + return startTracking(); +} + +Return +MeasurementAPIClient::measurementSetCallback_1_1(const sp& callback) +{ + LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback); + + mMutex.lock(); + mGnssMeasurementCbIface_1_1 = callback; + mMutex.unlock(); + + return startTracking(); +} + +Return +MeasurementAPIClient::startTracking() +{ LocationCallbacks locationCallbacks; memset(&locationCallbacks, 0, sizeof(LocationCallbacks)); locationCallbacks.size = sizeof(LocationCallbacks); @@ -84,7 +108,7 @@ MeasurementAPIClient::measurementSetCallback(const sp& locationCallbacks.gnssNmeaCb = nullptr; locationCallbacks.gnssMeasurementsCb = nullptr; - if (mGnssMeasurementCbIface != nullptr) { + if (mGnssMeasurementCbIface_1_1 != nullptr || mGnssMeasurementCbIface != nullptr) { locationCallbacks.gnssMeasurementsCb = [this](GnssMeasurementsNotification gnssMeasurementsNotification) { onGnssMeasurementsCb(gnssMeasurementsNotification); @@ -115,15 +139,29 @@ void MeasurementAPIClient::measurementClose() { void MeasurementAPIClient::onGnssMeasurementsCb( GnssMeasurementsNotification gnssMeasurementsNotification) { - LOC_LOGD("%s]: (count: %zu active: %zu)", + LOC_LOGD("%s]: (count: %zu active: %d)", __FUNCTION__, gnssMeasurementsNotification.count, mTracking); if (mTracking) { mMutex.lock(); - auto gnssMeasurementCbIface(mGnssMeasurementCbIface); + sp gnssMeasurementCbIface = nullptr; + sp gnssMeasurementCbIface_1_1 = nullptr; + if (mGnssMeasurementCbIface_1_1 != nullptr) { + gnssMeasurementCbIface_1_1 = mGnssMeasurementCbIface_1_1; + } else if (mGnssMeasurementCbIface != nullptr) { + gnssMeasurementCbIface = mGnssMeasurementCbIface; + } mMutex.unlock(); - if (gnssMeasurementCbIface != nullptr) { + if (gnssMeasurementCbIface_1_1 != nullptr) { IGnssMeasurementCallback::GnssData gnssData; + convertGnssData_1_1(gnssMeasurementsNotification, gnssData); + auto r = gnssMeasurementCbIface_1_1->gnssMeasurementCb(gnssData); + if (!r.isOk()) { + LOC_LOGE("%s] Error from gnssMeasurementCb description=%s", + __func__, r.description().c_str()); + } + } else if (gnssMeasurementCbIface != nullptr) { + V1_0::IGnssMeasurementCallback::GnssData gnssData; convertGnssData(gnssMeasurementsNotification, gnssData); auto r = gnssMeasurementCbIface->GnssMeasurementCb(gnssData); if (!r.isOk()) { @@ -135,7 +173,7 @@ void MeasurementAPIClient::onGnssMeasurementsCb( } static void convertGnssMeasurement(GnssMeasurementsData& in, - IGnssMeasurementCallback::GnssMeasurement& out) + V1_0::IGnssMeasurementCallback::GnssMeasurement& out) { memset(&out, 0, sizeof(IGnssMeasurementCallback::GnssMeasurement)); if (in.flags & GNSS_MEASUREMENTS_DATA_SIGNAL_TO_NOISE_RATIO_BIT) @@ -242,13 +280,13 @@ static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback } static void convertGnssData(GnssMeasurementsNotification& in, - IGnssMeasurementCallback::GnssData& out) + V1_0::IGnssMeasurementCallback::GnssData& out) { out.measurementCount = in.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); + 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); } for (size_t i = 0; i < out.measurementCount; i++) { convertGnssMeasurement(in.measurements[i], out.measurements[i]); @@ -256,8 +294,18 @@ static void convertGnssData(GnssMeasurementsNotification& in, convertGnssClock(in.clock, out.clock); } +static void convertGnssData_1_1(GnssMeasurementsNotification& in, + IGnssMeasurementCallback::GnssData& out) +{ + out.measurements.resize(in.count); + for (size_t i = 0; i < in.count; i++) { + convertGnssMeasurement(in.measurements[i], out.measurements[i].v1_0); + } + convertGnssClock(in.clock, out.clock); +} + } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/location_api/MeasurementAPIClient.h b/gps/android/location_api/MeasurementAPIClient.h index 8de1326..117ad54 100644 --- a/gps/android/location_api/MeasurementAPIClient.h +++ b/gps/android/location_api/MeasurementAPIClient.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -31,18 +31,17 @@ #define MEASUREMENT_API_CLINET_H #include -#include -#include +#include +#include #include #include namespace android { namespace hardware { namespace gnss { -namespace V1_0 { +namespace V1_1 { namespace implementation { -using ::android::hardware::gnss::V1_0::IGnssMeasurement; using ::android::sp; class MeasurementAPIClient : public LocationAPIClientBase @@ -54,21 +53,26 @@ public: MeasurementAPIClient& operator=(const MeasurementAPIClient&) = delete; // for GpsMeasurementInterface - Return measurementSetCallback( + Return measurementSetCallback( + const sp& callback); + Return measurementSetCallback_1_1( 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; + sp mGnssMeasurementCbIface_1_1; + bool mTracking; }; } // namespace implementation -} // namespace V1_0 +} // namespace V1_1 } // namespace gnss } // namespace hardware } // namespace android diff --git a/gps/android/service.cpp b/gps/android/service.cpp index 5779e67..72cb4e9 100644 --- a/gps/android/service.cpp +++ b/gps/android/service.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * Not a Contribution */ /* @@ -18,12 +18,12 @@ * limitations under the License. */ -#define LOG_TAG "android.hardware.gnss@1.0-service-qti" +#define LOG_TAG "android.hardware.gnss@1.1-service-qti" -#include +#include #include -using android::hardware::gnss::V1_0::IGnss; +using android::hardware::gnss::V1_1::IGnss; using android::hardware::defaultPassthroughServiceImplementation; int main() { -- cgit v1.2.3