summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Huang <joethhuang@google.com>2023-06-16 03:32:47 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-06-16 03:32:47 +0000
commit6cc1ac73d4746fe536b00dd410162322f90783aa (patch)
tree14d13109e3b380cce703e166402e556cb80b8811
parent0a26aa3caf9881d731933848ef437c77ef410772 (diff)
parent4f6e3c628022440337c4e3dadecd7f65f6989e62 (diff)
downloadgps-6cc1ac73d4746fe536b00dd410162322f90783aa.tar.gz
[GPS] Change of HIDL/AIDL behavior for battery issue am: 4f6e3c6280
Original change: https://googleplex-android-review.googlesource.com/c/platform/hardware/qcom/sm7250/gps/+/23468462 Change-Id: Ic47cf75c1234634c67b29ee4836353700f3feb20 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--android/1.0/GnssMeasurement.cpp55
-rw-r--r--android/1.0/GnssMeasurement.h10
-rw-r--r--android/1.0/location_api/MeasurementAPIClient.cpp25
-rw-r--r--android/1.0/location_api/MeasurementAPIClient.h14
-rw-r--r--android/1.1/GnssMeasurement.cpp80
-rw-r--r--android/1.1/GnssMeasurement.h10
-rw-r--r--android/1.1/location_api/MeasurementAPIClient.cpp40
-rw-r--r--android/1.1/location_api/MeasurementAPIClient.h21
-rw-r--r--android/2.0/GnssMeasurement.cpp104
-rw-r--r--android/2.0/GnssMeasurement.h10
-rw-r--r--android/2.0/location_api/MeasurementAPIClient.cpp59
-rw-r--r--android/2.0/location_api/MeasurementAPIClient.h29
-rw-r--r--android/2.1/GnssMeasurement.cpp133
-rw-r--r--android/2.1/GnssMeasurement.h10
-rw-r--r--android/2.1/location_api/MeasurementAPIClient.cpp73
-rw-r--r--android/2.1/location_api/MeasurementAPIClient.h37
-rw-r--r--location/LocationAPIClientBase.cpp12
17 files changed, 258 insertions, 464 deletions
diff --git a/android/1.0/GnssMeasurement.cpp b/android/1.0/GnssMeasurement.cpp
index 7af9e27..9a99371 100644
--- a/android/1.0/GnssMeasurement.cpp
+++ b/android/1.0/GnssMeasurement.cpp
@@ -18,11 +18,15 @@
* limitations under the License.
*/
+/* ​​​​​Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
+ */
+
#define LOG_TAG "LocSvc_GnssMeasurementInterface"
#include <log_util.h>
-#include <MeasurementAPIClient.h>
-#include "GnssMeasurement.h"
+#include <GnssMeasurement.h>
namespace android {
namespace hardware {
@@ -52,44 +56,47 @@ GnssMeasurement::~GnssMeasurement() {
}
// Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow.
-
-Return<IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
+Return<GnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
const sp<V1_0::IGnssMeasurementCallback>& callback) {
+ return setCallback(callback, mGnssMeasurementCbIface, GNSS_POWER_MODE_INVALID);
+}
- Return<IGnssMeasurement::GnssMeasurementStatus> ret =
- IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
- if (mGnssMeasurementCbIface != nullptr) {
- LOC_LOGE("%s]: GnssMeasurementCallback is already set", __FUNCTION__);
- return IGnssMeasurement::GnssMeasurementStatus::ERROR_ALREADY_INIT;
- }
-
- if (callback == nullptr) {
- LOC_LOGE("%s]: callback is nullptr", __FUNCTION__);
- return ret;
- }
+template <typename T>
+Return<IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
+ const sp<T>& callback, sp<T>& myCallback, GnssPowerMode powerMode) {
+ Return<GnssMeasurement::GnssMeasurementStatus> ret =
+ IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
if (mApi == nullptr) {
LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
return ret;
}
+ if (myCallback != callback) {
+ if (nullptr == callback) {
+ LOC_LOGE("%s]: callback is nullptr", __FUNCTION__);
+ mApi->measurementSetCallback(callback);
+ close();
+ } else {
+ if (nullptr != myCallback) {
+ myCallback->unlinkToDeath(mGnssMeasurementDeathRecipient);
+ }
+ myCallback = callback;
+ myCallback->linkToDeath(mGnssMeasurementDeathRecipient, 0);
+ ret = mApi->measurementSetCallback(callback, powerMode);
+ }
+ }
- mGnssMeasurementCbIface = callback;
- mGnssMeasurementCbIface->linkToDeath(mGnssMeasurementDeathRecipient, 0);
-
- return mApi->measurementSetCallback(callback);
-
+ return ret;
}
Return<void> GnssMeasurement::close() {
- if (mApi == nullptr) {
- LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
- return Void();
+ if (mApi != nullptr) {
+ mApi->measurementSetCallback<V1_0::IGnssMeasurementCallback>(nullptr);
}
if (mGnssMeasurementCbIface != nullptr) {
mGnssMeasurementCbIface->unlinkToDeath(mGnssMeasurementDeathRecipient);
mGnssMeasurementCbIface = nullptr;
}
- mApi->measurementClose();
return Void();
}
diff --git a/android/1.0/GnssMeasurement.h b/android/1.0/GnssMeasurement.h
index 4247dbf..5511b69 100644
--- a/android/1.0/GnssMeasurement.h
+++ b/android/1.0/GnssMeasurement.h
@@ -18,12 +18,18 @@
* limitations under the License.
*/
+/* ​​​​​Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
+ */
+
#ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSMEASUREMENT_H
#define ANDROID_HARDWARE_GNSS_V1_0_GNSSMEASUREMENT_H
#include <android/hardware/gnss/1.0/IGnssMeasurement.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
+#include "MeasurementAPIClient.h"
namespace android {
namespace hardware {
@@ -62,7 +68,9 @@ struct GnssMeasurement : public IGnssMeasurement {
sp<GnssMeasurement> mGnssMeasurement;
};
- private:
+ template <typename T>
+ Return<IGnssMeasurement::GnssMeasurementStatus> setCallback(
+ const sp<T>& callback, sp<T>& myCallback, GnssPowerMode powerMode);
sp<GnssMeasurementDeathRecipient> mGnssMeasurementDeathRecipient = nullptr;
sp<V1_0::IGnssMeasurementCallback> mGnssMeasurementCbIface = nullptr;
MeasurementAPIClient* mApi;
diff --git a/android/1.0/location_api/MeasurementAPIClient.cpp b/android/1.0/location_api/MeasurementAPIClient.cpp
index 8dd039b..ef947f7 100644
--- a/android/1.0/location_api/MeasurementAPIClient.cpp
+++ b/android/1.0/location_api/MeasurementAPIClient.cpp
@@ -63,19 +63,6 @@ MeasurementAPIClient::~MeasurementAPIClient()
LOC_LOGD("%s]: ()", __FUNCTION__);
}
-// for GpsInterface
-Return<IGnssMeasurement::GnssMeasurementStatus>
-MeasurementAPIClient::measurementSetCallback(const sp<V1_0::IGnssMeasurementCallback>& callback)
-{
- LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback);
-
- mMutex.lock();
- mGnssMeasurementCbIface = callback;
- mMutex.unlock();
-
- return startTracking();
-}
-
Return<IGnssMeasurement::GnssMeasurementStatus>
MeasurementAPIClient::startTracking()
{
@@ -83,16 +70,6 @@ MeasurementAPIClient::startTracking()
memset(&locationCallbacks, 0, sizeof(LocationCallbacks));
locationCallbacks.size = sizeof(LocationCallbacks);
- locationCallbacks.trackingCb = nullptr;
- locationCallbacks.batchingCb = nullptr;
- locationCallbacks.geofenceBreachCb = nullptr;
- locationCallbacks.geofenceStatusCb = nullptr;
- locationCallbacks.gnssLocationInfoCb = nullptr;
- locationCallbacks.gnssNiCb = nullptr;
- locationCallbacks.gnssSvCb = nullptr;
- locationCallbacks.gnssNmeaCb = nullptr;
-
- locationCallbacks.gnssMeasurementsCb = nullptr;
if (mGnssMeasurementCbIface != nullptr) {
locationCallbacks.gnssMeasurementsCb =
[this](GnssMeasurementsNotification gnssMeasurementsNotification) {
@@ -109,7 +86,7 @@ MeasurementAPIClient::startTracking()
options.mode = GNSS_SUPL_MODE_STANDALONE;
mTracking = true;
- LOC_LOGD("%s]: start tracking session", __FUNCTION__);
+ LOC_LOGd();
locAPIStartTracking(options);
return IGnssMeasurement::GnssMeasurementStatus::SUCCESS;
}
diff --git a/android/1.0/location_api/MeasurementAPIClient.h b/android/1.0/location_api/MeasurementAPIClient.h
index 225deac..1c86882 100644
--- a/android/1.0/location_api/MeasurementAPIClient.h
+++ b/android/1.0/location_api/MeasurementAPIClient.h
@@ -53,8 +53,15 @@ public:
MeasurementAPIClient& operator=(const MeasurementAPIClient&) = delete;
// for GpsMeasurementInterface
- Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback(
- const sp<V1_0::IGnssMeasurementCallback>& callback);
+ template <typename T>
+ Return<IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback(
+ const sp<T>& callback, GnssPowerMode powerMode = GNSS_POWER_MODE_INVALID) {
+ mMutex.lock();
+ setCallbackLocked(callback);
+ mMutex.unlock();
+
+ return startTracking();
+ }
void measurementClose();
Return<IGnssMeasurement::GnssMeasurementStatus> startTracking();
@@ -62,6 +69,9 @@ public:
void onGnssMeasurementsCb(GnssMeasurementsNotification gnssMeasurementsNotification) final;
private:
+ inline void setCallbackLocked(const sp<V1_0::IGnssMeasurementCallback>& callback) {
+ mGnssMeasurementCbIface = callback;
+ }
virtual ~MeasurementAPIClient();
std::mutex mMutex;
diff --git a/android/1.1/GnssMeasurement.cpp b/android/1.1/GnssMeasurement.cpp
index 6f8c14d..70ceee2 100644
--- a/android/1.1/GnssMeasurement.cpp
+++ b/android/1.1/GnssMeasurement.cpp
@@ -18,10 +18,14 @@
* limitations under the License.
*/
+/* ​​​​​Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
+ */
+
#define LOG_TAG "LocSvc_GnssMeasurementInterface"
#include <log_util.h>
-#include <MeasurementAPIClient.h>
#include "GnssMeasurement.h"
namespace android {
@@ -52,37 +56,42 @@ GnssMeasurement::~GnssMeasurement() {
}
// Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow.
-
-Return<IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
+Return<GnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
const sp<V1_0::IGnssMeasurementCallback>& callback) {
+ return setCallback(callback, mGnssMeasurementCbIface, GNSS_POWER_MODE_INVALID);
+}
- Return<IGnssMeasurement::GnssMeasurementStatus> ret =
- IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
- if (mGnssMeasurementCbIface != nullptr) {
- LOC_LOGE("%s]: GnssMeasurementCallback is already set", __FUNCTION__);
- return IGnssMeasurement::GnssMeasurementStatus::ERROR_ALREADY_INIT;
- }
-
- if (callback == nullptr) {
- LOC_LOGE("%s]: callback is nullptr", __FUNCTION__);
- return ret;
- }
+template <typename T>
+Return<IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
+ const sp<T>& callback, sp<T>& myCallback, GnssPowerMode powerMode) {
+ Return<GnssMeasurement::GnssMeasurementStatus> ret =
+ IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
if (mApi == nullptr) {
LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
return ret;
}
+ if (myCallback != callback) {
+ if (nullptr == callback) {
+ LOC_LOGE("%s]: callback is nullptr", __FUNCTION__);
+ mApi->measurementSetCallback(callback);
+ close();
+ } else {
+ if (nullptr != myCallback) {
+ myCallback->unlinkToDeath(mGnssMeasurementDeathRecipient);
+ }
+ myCallback = callback;
+ myCallback->linkToDeath(mGnssMeasurementDeathRecipient, 0);
+ ret = mApi->measurementSetCallback(callback, powerMode);
+ }
+ }
- mGnssMeasurementCbIface = callback;
- mGnssMeasurementCbIface->linkToDeath(mGnssMeasurementDeathRecipient, 0);
-
- return mApi->measurementSetCallback(callback);
-
+ return ret;
}
Return<void> GnssMeasurement::close() {
- if (mApi == nullptr) {
- LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
- return Void();
+ if (mApi != nullptr) {
+ mApi->measurementSetCallback<V1_0::IGnssMeasurementCallback>(nullptr);
+ mApi->measurementSetCallback<V1_1::IGnssMeasurementCallback>(nullptr);
}
if (mGnssMeasurementCbIface != nullptr) {
@@ -93,7 +102,6 @@ Return<void> GnssMeasurement::close() {
mGnssMeasurementCbIface_1_1->unlinkToDeath(mGnssMeasurementDeathRecipient);
mGnssMeasurementCbIface_1_1 = nullptr;
}
- mApi->measurementClose();
return Void();
}
@@ -101,30 +109,8 @@ Return<void> GnssMeasurement::close() {
// Methods from ::android::hardware::gnss::V1_1::IGnssMeasurement follow.
Return<GnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_1_1(
const sp<IGnssMeasurementCallback>& callback, bool enableFullTracking) {
-
- Return<IGnssMeasurement::GnssMeasurementStatus> ret =
- IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
- if (mGnssMeasurementCbIface_1_1 != nullptr) {
- LOC_LOGE("%s]: GnssMeasurementCallback is already set", __FUNCTION__);
- return IGnssMeasurement::GnssMeasurementStatus::ERROR_ALREADY_INIT;
- }
-
- if (callback == nullptr) {
- LOC_LOGE("%s]: callback is nullptr", __FUNCTION__);
- return ret;
- }
- if (nullptr == mApi) {
- LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
- return ret;
- }
-
- mGnssMeasurementCbIface_1_1 = callback;
- mGnssMeasurementCbIface_1_1->linkToDeath(mGnssMeasurementDeathRecipient, 0);
-
- GnssPowerMode powerMode = enableFullTracking?
- GNSS_POWER_MODE_M1 : GNSS_POWER_MODE_M2;
-
- return mApi->measurementSetCallback_1_1(callback, powerMode);
+ return setCallback(callback, mGnssMeasurementCbIface_1_1,
+ enableFullTracking ? GNSS_POWER_MODE_M1 : GNSS_POWER_MODE_M2);
}
} // namespace implementation
diff --git a/android/1.1/GnssMeasurement.h b/android/1.1/GnssMeasurement.h
index 373f0d0..c497c7d 100644
--- a/android/1.1/GnssMeasurement.h
+++ b/android/1.1/GnssMeasurement.h
@@ -18,12 +18,18 @@
* limitations under the License.
*/
+/* ​​​​​Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
+ */
+
#ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSMEASUREMENT_H
#define ANDROID_HARDWARE_GNSS_V1_1_GNSSMEASUREMENT_H
#include <android/hardware/gnss/1.1/IGnssMeasurement.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
+#include "MeasurementAPIClient.h"
namespace android {
namespace hardware {
@@ -67,7 +73,9 @@ struct GnssMeasurement : public IGnssMeasurement {
sp<GnssMeasurement> mGnssMeasurement;
};
- private:
+ template <typename T>
+ Return<IGnssMeasurement::GnssMeasurementStatus> setCallback(
+ const sp<T>& callback, sp<T>& myCallback, GnssPowerMode powerMode);
sp<GnssMeasurementDeathRecipient> mGnssMeasurementDeathRecipient = nullptr;
sp<V1_0::IGnssMeasurementCallback> mGnssMeasurementCbIface = nullptr;
sp<IGnssMeasurementCallback> mGnssMeasurementCbIface_1_1 = nullptr;
diff --git a/android/1.1/location_api/MeasurementAPIClient.cpp b/android/1.1/location_api/MeasurementAPIClient.cpp
index af8095c..4ebb4e0 100644
--- a/android/1.1/location_api/MeasurementAPIClient.cpp
+++ b/android/1.1/location_api/MeasurementAPIClient.cpp
@@ -66,34 +66,6 @@ MeasurementAPIClient::~MeasurementAPIClient()
LOC_LOGD("%s]: ()", __FUNCTION__);
}
-// for GpsInterface
-Return<IGnssMeasurement::GnssMeasurementStatus>
-MeasurementAPIClient::measurementSetCallback(const sp<V1_0::IGnssMeasurementCallback>& callback)
-{
- LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback);
-
- mMutex.lock();
- mGnssMeasurementCbIface = callback;
- mMutex.unlock();
-
- return startTracking();
-}
-
-Return<IGnssMeasurement::GnssMeasurementStatus>
-MeasurementAPIClient::measurementSetCallback_1_1(
- const sp<IGnssMeasurementCallback>& callback,
- GnssPowerMode powerMode, uint32_t timeBetweenMeasurement)
-{
- LOC_LOGD("%s]: (%p) (powermode: %d) (tbm: %d)",
- __FUNCTION__, &callback, (int)powerMode, timeBetweenMeasurement);
-
- mMutex.lock();
- mGnssMeasurementCbIface_1_1 = callback;
- mMutex.unlock();
-
- return startTracking(powerMode, timeBetweenMeasurement);
-}
-
Return<IGnssMeasurement::GnssMeasurementStatus>
MeasurementAPIClient::startTracking(
GnssPowerMode powerMode, uint32_t timeBetweenMeasurement)
@@ -102,16 +74,6 @@ MeasurementAPIClient::startTracking(
memset(&locationCallbacks, 0, sizeof(LocationCallbacks));
locationCallbacks.size = sizeof(LocationCallbacks);
- locationCallbacks.trackingCb = nullptr;
- locationCallbacks.batchingCb = nullptr;
- locationCallbacks.geofenceBreachCb = nullptr;
- locationCallbacks.geofenceStatusCb = nullptr;
- locationCallbacks.gnssLocationInfoCb = nullptr;
- locationCallbacks.gnssNiCb = nullptr;
- locationCallbacks.gnssSvCb = nullptr;
- locationCallbacks.gnssNmeaCb = nullptr;
-
- locationCallbacks.gnssMeasurementsCb = nullptr;
if (mGnssMeasurementCbIface_1_1 != nullptr || mGnssMeasurementCbIface != nullptr) {
locationCallbacks.gnssMeasurementsCb =
[this](GnssMeasurementsNotification gnssMeasurementsNotification) {
@@ -132,7 +94,7 @@ MeasurementAPIClient::startTracking(
}
mTracking = true;
- LOC_LOGD("%s]: start tracking session", __FUNCTION__);
+ LOC_LOGd("(powermode: %d) (tbm %d)", (int)powerMode, timeBetweenMeasurement);
locAPIStartTracking(options);
return IGnssMeasurement::GnssMeasurementStatus::SUCCESS;
}
diff --git a/android/1.1/location_api/MeasurementAPIClient.h b/android/1.1/location_api/MeasurementAPIClient.h
index 5fb307c..e768e77 100644
--- a/android/1.1/location_api/MeasurementAPIClient.h
+++ b/android/1.1/location_api/MeasurementAPIClient.h
@@ -53,12 +53,15 @@ public:
MeasurementAPIClient& operator=(const MeasurementAPIClient&) = delete;
// for GpsMeasurementInterface
- Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback(
- const sp<V1_0::IGnssMeasurementCallback>& callback);
- Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback_1_1(
- const sp<IGnssMeasurementCallback>& callback,
- GnssPowerMode powerMode = GNSS_POWER_MODE_INVALID,
- uint32_t timeBetweenMeasurement = GPS_DEFAULT_FIX_INTERVAL_MS);
+ template <typename T>
+ Return<IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback(
+ const sp<T>& callback, GnssPowerMode powerMode = GNSS_POWER_MODE_INVALID) {
+ mMutex.lock();
+ setCallbackLocked(callback);
+ mMutex.unlock();
+
+ return startTracking(powerMode);
+ }
void measurementClose();
Return<IGnssMeasurement::GnssMeasurementStatus> startTracking(
GnssPowerMode powerMode = GNSS_POWER_MODE_INVALID,
@@ -68,6 +71,12 @@ public:
void onGnssMeasurementsCb(GnssMeasurementsNotification gnssMeasurementsNotification) final;
private:
+ inline void setCallbackLocked(const sp<V1_0::IGnssMeasurementCallback>& callback) {
+ mGnssMeasurementCbIface = callback;
+ }
+ inline void setCallbackLocked(const sp<V1_1::IGnssMeasurementCallback>& callback) {
+ mGnssMeasurementCbIface_1_1 = callback;
+ }
virtual ~MeasurementAPIClient();
std::mutex mMutex;
diff --git a/android/2.0/GnssMeasurement.cpp b/android/2.0/GnssMeasurement.cpp
index 6cb55ca..32383b1 100644
--- a/android/2.0/GnssMeasurement.cpp
+++ b/android/2.0/GnssMeasurement.cpp
@@ -18,11 +18,15 @@
* limitations under the License.
*/
+/* ​​​​​Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
+ */
+
#define LOG_TAG "LocSvc_GnssMeasurementInterface"
#include <log_util.h>
#include "GnssMeasurement.h"
-#include "MeasurementAPIClient.h"
namespace android {
namespace hardware {
@@ -54,32 +58,42 @@ GnssMeasurement::~GnssMeasurement() {
// Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow.
Return<GnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
const sp<V1_0::IGnssMeasurementCallback>& callback) {
+ return setCallback(callback, mGnssMeasurementCbIface, GNSS_POWER_MODE_INVALID);
+}
+template <typename T>
+Return<IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
+ const sp<T>& callback, sp<T>& myCallback, GnssPowerMode powerMode) {
Return<GnssMeasurement::GnssMeasurementStatus> ret =
- IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
- if (mGnssMeasurementCbIface != nullptr) {
- LOC_LOGE("%s]: GnssMeasurementCallback is already set", __FUNCTION__);
- return IGnssMeasurement::GnssMeasurementStatus::ERROR_ALREADY_INIT;
- }
-
- if (callback == nullptr) {
- LOC_LOGE("%s]: callback is nullptr", __FUNCTION__);
- return ret;
- }
+ IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
if (mApi == nullptr) {
LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
return ret;
}
+ if (myCallback != callback) {
+ if (nullptr == callback) {
+ LOC_LOGE("%s]: callback is nullptr", __FUNCTION__);
+ mApi->measurementSetCallback(callback);
+ close();
+ } else {
+ if (nullptr != myCallback) {
+ myCallback->unlinkToDeath(mGnssMeasurementDeathRecipient);
+ }
+ myCallback = callback;
+ myCallback->linkToDeath(mGnssMeasurementDeathRecipient, 0);
+ ret = mApi->measurementSetCallback(callback, powerMode);
+ }
+ }
- clearInterfaces();
-
- mGnssMeasurementCbIface = callback;
- mGnssMeasurementCbIface->linkToDeath(mGnssMeasurementDeathRecipient, 0);
-
- return mApi->measurementSetCallback(callback);
+ return ret;
}
void GnssMeasurement::clearInterfaces() {
+ if (mApi != nullptr) {
+ mApi->measurementSetCallback<V1_0::IGnssMeasurementCallback>(nullptr);
+ mApi->measurementSetCallback<V1_1::IGnssMeasurementCallback>(nullptr);
+ mApi->measurementSetCallback<V2_0::IGnssMeasurementCallback>(nullptr);
+ }
if (mGnssMeasurementCbIface != nullptr) {
mGnssMeasurementCbIface->unlinkToDeath(mGnssMeasurementDeathRecipient);
mGnssMeasurementCbIface = nullptr;
@@ -109,63 +123,15 @@ Return<void> GnssMeasurement::close() {
// Methods from ::android::hardware::gnss::V1_1::IGnssMeasurement follow.
Return<GnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_1_1(
const sp<V1_1::IGnssMeasurementCallback>& callback, bool enableFullTracking) {
-
- Return<GnssMeasurement::GnssMeasurementStatus> ret =
- IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
- if (mGnssMeasurementCbIface_1_1 != nullptr) {
- LOC_LOGE("%s]: GnssMeasurementCallback is already set", __FUNCTION__);
- return IGnssMeasurement::GnssMeasurementStatus::ERROR_ALREADY_INIT;
- }
-
- if (callback == nullptr) {
- LOC_LOGE("%s]: callback is nullptr", __FUNCTION__);
- return ret;
- }
- if (nullptr == mApi) {
- LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
- return ret;
- }
-
- clearInterfaces();
-
- mGnssMeasurementCbIface_1_1 = callback;
- mGnssMeasurementCbIface_1_1->linkToDeath(mGnssMeasurementDeathRecipient, 0);
-
- GnssPowerMode powerMode = enableFullTracking?
- GNSS_POWER_MODE_M1 : GNSS_POWER_MODE_M2;
-
- return mApi->measurementSetCallback_1_1(callback, powerMode);
+ return setCallback(callback, mGnssMeasurementCbIface_1_1,
+ enableFullTracking ? GNSS_POWER_MODE_M1 : GNSS_POWER_MODE_M2);
}
// Methods from ::android::hardware::gnss::V2_0::IGnssMeasurement follow.
Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_2_0(
const sp<V2_0::IGnssMeasurementCallback>& callback,
bool enableFullTracking) {
-
- Return<GnssMeasurement::GnssMeasurementStatus> ret =
- IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
- if (mGnssMeasurementCbIface_2_0 != 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 (nullptr == mApi) {
- LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
- return ret;
- }
-
- clearInterfaces();
-
- mGnssMeasurementCbIface_2_0 = callback;
- mGnssMeasurementCbIface_2_0->linkToDeath(mGnssMeasurementDeathRecipient, 0);
-
- GnssPowerMode powerMode = enableFullTracking ?
- GNSS_POWER_MODE_M1 : GNSS_POWER_MODE_M2;
-
- return mApi->measurementSetCallback_2_0(callback, powerMode);
+ return setCallback(callback, mGnssMeasurementCbIface_2_0,
+ enableFullTracking ? GNSS_POWER_MODE_M1 : GNSS_POWER_MODE_M2);
}
} // namespace implementation
diff --git a/android/2.0/GnssMeasurement.h b/android/2.0/GnssMeasurement.h
index 7fa66b4..37fdc1c 100644
--- a/android/2.0/GnssMeasurement.h
+++ b/android/2.0/GnssMeasurement.h
@@ -18,12 +18,18 @@
* limitations under the License.
*/
+/* ​​​​​Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
+ */
+
#ifndef ANDROID_HARDWARE_GNSS_V2_0_GNSSMEASUREMENT_H
#define ANDROID_HARDWARE_GNSS_V2_0_GNSSMEASUREMENT_H
#include <android/hardware/gnss/2.0/IGnssMeasurement.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
+#include "MeasurementAPIClient.h"
namespace android {
namespace hardware {
@@ -69,7 +75,9 @@ struct GnssMeasurement : public V2_0::IGnssMeasurement {
sp<GnssMeasurement> mGnssMeasurement;
};
- private:
+ template <typename T>
+ Return<IGnssMeasurement::GnssMeasurementStatus> setCallback(
+ const sp<T>& callback, sp<T>& myCallback, GnssPowerMode powerMode);
sp<GnssMeasurementDeathRecipient> mGnssMeasurementDeathRecipient = nullptr;
sp<V1_0::IGnssMeasurementCallback> mGnssMeasurementCbIface = nullptr;
sp<V1_1::IGnssMeasurementCallback> mGnssMeasurementCbIface_1_1 = nullptr;
diff --git a/android/2.0/location_api/MeasurementAPIClient.cpp b/android/2.0/location_api/MeasurementAPIClient.cpp
index 425415f..e1cb3f8 100644
--- a/android/2.0/location_api/MeasurementAPIClient.cpp
+++ b/android/2.0/location_api/MeasurementAPIClient.cpp
@@ -82,52 +82,6 @@ void MeasurementAPIClient::clearInterfaces()
mGnssMeasurementCbIface_2_0 = nullptr;
}
-// for GpsInterface
-Return<IGnssMeasurement::GnssMeasurementStatus>
-MeasurementAPIClient::measurementSetCallback(const sp<V1_0::IGnssMeasurementCallback>& callback)
-{
- LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback);
-
- mMutex.lock();
- clearInterfaces();
- mGnssMeasurementCbIface = callback;
- mMutex.unlock();
-
- return startTracking();
-}
-
-Return<IGnssMeasurement::GnssMeasurementStatus>
-MeasurementAPIClient::measurementSetCallback_1_1(
- const sp<V1_1::IGnssMeasurementCallback>& callback,
- GnssPowerMode powerMode, uint32_t timeBetweenMeasurement)
-{
- LOC_LOGD("%s]: (%p) (powermode: %d) (tbm: %d)",
- __FUNCTION__, &callback, (int)powerMode, timeBetweenMeasurement);
-
- mMutex.lock();
- clearInterfaces();
- mGnssMeasurementCbIface_1_1 = callback;
- mMutex.unlock();
-
- return startTracking(powerMode, timeBetweenMeasurement);
-}
-
-Return<IGnssMeasurement::GnssMeasurementStatus>
-MeasurementAPIClient::measurementSetCallback_2_0(
- const sp<V2_0::IGnssMeasurementCallback>& callback,
- GnssPowerMode powerMode, uint32_t timeBetweenMeasurement)
-{
- LOC_LOGD("%s]: (%p) (powermode: %d) (tbm: %d)",
- __FUNCTION__, &callback, (int)powerMode, timeBetweenMeasurement);
-
- mMutex.lock();
- clearInterfaces();
- mGnssMeasurementCbIface_2_0 = callback;
- mMutex.unlock();
-
- return startTracking(powerMode, timeBetweenMeasurement);
-}
-
Return<IGnssMeasurement::GnssMeasurementStatus>
MeasurementAPIClient::startTracking(
GnssPowerMode powerMode, uint32_t timeBetweenMeasurement)
@@ -136,16 +90,6 @@ MeasurementAPIClient::startTracking(
memset(&locationCallbacks, 0, sizeof(LocationCallbacks));
locationCallbacks.size = sizeof(LocationCallbacks);
- locationCallbacks.trackingCb = nullptr;
- locationCallbacks.batchingCb = nullptr;
- locationCallbacks.geofenceBreachCb = nullptr;
- locationCallbacks.geofenceStatusCb = nullptr;
- locationCallbacks.gnssLocationInfoCb = nullptr;
- locationCallbacks.gnssNiCb = nullptr;
- locationCallbacks.gnssSvCb = nullptr;
- locationCallbacks.gnssNmeaCb = nullptr;
-
- locationCallbacks.gnssMeasurementsCb = nullptr;
if (mGnssMeasurementCbIface_2_0 != nullptr ||
mGnssMeasurementCbIface_1_1 != nullptr ||
mGnssMeasurementCbIface != nullptr) {
@@ -168,7 +112,7 @@ MeasurementAPIClient::startTracking(
}
mTracking = true;
- LOC_LOGD("%s]: start tracking session", __FUNCTION__);
+ LOC_LOGd("(powermode: %d) (tbm %d)", (int)powerMode, timeBetweenMeasurement);
locAPIStartTracking(options);
return IGnssMeasurement::GnssMeasurementStatus::SUCCESS;
}
@@ -177,6 +121,7 @@ MeasurementAPIClient::startTracking(
void MeasurementAPIClient::measurementClose() {
LOC_LOGD("%s]: ()", __FUNCTION__);
mTracking = false;
+ clearInterfaces();
locAPIStopTracking();
}
diff --git a/android/2.0/location_api/MeasurementAPIClient.h b/android/2.0/location_api/MeasurementAPIClient.h
index 6c2d38d..cd47c08 100644
--- a/android/2.0/location_api/MeasurementAPIClient.h
+++ b/android/2.0/location_api/MeasurementAPIClient.h
@@ -32,7 +32,6 @@
#include <mutex>
#include <android/hardware/gnss/2.0/IGnssMeasurement.h>
-//#include <android/hardware/gnss/1.1/IGnssMeasurementCallback.h>
#include <LocationAPIClientBase.h>
#include <hidl/Status.h>
#include <gps_extended_c.h>
@@ -53,16 +52,15 @@ public:
MeasurementAPIClient& operator=(const MeasurementAPIClient&) = delete;
// for GpsMeasurementInterface
- Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback(
- const sp<V1_0::IGnssMeasurementCallback>& callback);
- Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback_1_1(
- const sp<V1_1::IGnssMeasurementCallback>& callback,
- GnssPowerMode powerMode = GNSS_POWER_MODE_INVALID,
- uint32_t timeBetweenMeasurement = GPS_DEFAULT_FIX_INTERVAL_MS);
- Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback_2_0(
- const sp<V2_0::IGnssMeasurementCallback>& callback,
- GnssPowerMode powerMode = GNSS_POWER_MODE_INVALID,
- uint32_t timeBetweenMeasurement = GPS_DEFAULT_FIX_INTERVAL_MS);
+ template <typename T>
+ Return<IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback(
+ const sp<T>& callback, GnssPowerMode powerMode = GNSS_POWER_MODE_INVALID) {
+ mMutex.lock();
+ setCallbackLocked(callback);
+ mMutex.unlock();
+
+ return startTracking(powerMode);
+ }
void measurementClose();
Return<IGnssMeasurement::GnssMeasurementStatus> startTracking(
GnssPowerMode powerMode = GNSS_POWER_MODE_INVALID,
@@ -72,6 +70,15 @@ public:
void onGnssMeasurementsCb(GnssMeasurementsNotification gnssMeasurementsNotification) final;
private:
+ inline void setCallbackLocked(const sp<V1_0::IGnssMeasurementCallback>& callback) {
+ mGnssMeasurementCbIface = callback;
+ }
+ inline void setCallbackLocked(const sp<V1_1::IGnssMeasurementCallback>& callback) {
+ mGnssMeasurementCbIface_1_1 = callback;
+ }
+ inline void setCallbackLocked(const sp<V2_0::IGnssMeasurementCallback>& callback) {
+ mGnssMeasurementCbIface_2_0 = callback;
+ }
virtual ~MeasurementAPIClient();
std::mutex mMutex;
diff --git a/android/2.1/GnssMeasurement.cpp b/android/2.1/GnssMeasurement.cpp
index af75802..16b0bd6 100644
--- a/android/2.1/GnssMeasurement.cpp
+++ b/android/2.1/GnssMeasurement.cpp
@@ -18,11 +18,15 @@
* limitations under the License.
*/
+/* ​​​​​Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
+ */
+
#define LOG_TAG "LocSvc_GnssMeasurementInterface"
#include <log_util.h>
#include "GnssMeasurement.h"
-#include "MeasurementAPIClient.h"
namespace android {
namespace hardware {
@@ -54,32 +58,44 @@ GnssMeasurement::~GnssMeasurement() {
// Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow.
Return<GnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
const sp<V1_0::IGnssMeasurementCallback>& callback) {
+ return setCallback(callback, mGnssMeasurementCbIface, GNSS_POWER_MODE_INVALID);
+}
+template <typename T>
+Return<IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
+ const sp<T>& callback, sp<T>& myCallback, GnssPowerMode powerMode) {
Return<GnssMeasurement::GnssMeasurementStatus> ret =
- IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
- if (mGnssMeasurementCbIface != nullptr) {
- LOC_LOGE("%s]: GnssMeasurementCallback is already set", __FUNCTION__);
- return IGnssMeasurement::GnssMeasurementStatus::ERROR_ALREADY_INIT;
- }
-
- if (callback == nullptr) {
- LOC_LOGE("%s]: callback is nullptr", __FUNCTION__);
- return ret;
- }
+ IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
if (mApi == nullptr) {
LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
return ret;
}
- clearInterfaces();
-
- mGnssMeasurementCbIface = callback;
- mGnssMeasurementCbIface->linkToDeath(mGnssMeasurementDeathRecipient, 0);
+ if (myCallback != callback) {
+ if (nullptr == callback) {
+ LOC_LOGE("%s]: callback is nullptr", __FUNCTION__);
+ mApi->measurementSetCallback(callback);
+ close();
+ } else {
+ if (nullptr != myCallback) {
+ myCallback->unlinkToDeath(mGnssMeasurementDeathRecipient);
+ }
+ myCallback = callback;
+ myCallback->linkToDeath(mGnssMeasurementDeathRecipient, 0);
+ ret = mApi->measurementSetCallback(callback, powerMode);
+ }
+ }
- return mApi->measurementSetCallback(callback);
+ return ret;
}
void GnssMeasurement::clearInterfaces() {
+ if (mApi != nullptr) {
+ mApi->measurementSetCallback<V1_0::IGnssMeasurementCallback>(nullptr);
+ mApi->measurementSetCallback<V1_1::IGnssMeasurementCallback>(nullptr);
+ mApi->measurementSetCallback<V2_0::IGnssMeasurementCallback>(nullptr);
+ mApi->measurementSetCallback<V2_1::IGnssMeasurementCallback>(nullptr);
+ }
if (mGnssMeasurementCbIface != nullptr) {
mGnssMeasurementCbIface->unlinkToDeath(mGnssMeasurementDeathRecipient);
mGnssMeasurementCbIface = nullptr;
@@ -113,95 +129,24 @@ Return<void> GnssMeasurement::close() {
// Methods from ::android::hardware::gnss::V1_1::IGnssMeasurement follow.
Return<GnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_1_1(
const sp<V1_1::IGnssMeasurementCallback>& callback, bool enableFullTracking) {
-
- Return<GnssMeasurement::GnssMeasurementStatus> ret =
- IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
- if (mGnssMeasurementCbIface_1_1 != nullptr) {
- LOC_LOGE("%s]: GnssMeasurementCallback is already set", __FUNCTION__);
- return IGnssMeasurement::GnssMeasurementStatus::ERROR_ALREADY_INIT;
- }
-
- if (callback == nullptr) {
- LOC_LOGE("%s]: callback is nullptr", __FUNCTION__);
- return ret;
- }
- if (nullptr == mApi) {
- LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
- return ret;
- }
-
- clearInterfaces();
-
- mGnssMeasurementCbIface_1_1 = callback;
- mGnssMeasurementCbIface_1_1->linkToDeath(mGnssMeasurementDeathRecipient, 0);
-
- GnssPowerMode powerMode = enableFullTracking?
- GNSS_POWER_MODE_M1 : GNSS_POWER_MODE_M2;
-
- return mApi->measurementSetCallback_1_1(callback, powerMode);
+ return setCallback(callback, mGnssMeasurementCbIface_1_1,
+ enableFullTracking ? GNSS_POWER_MODE_M1 : GNSS_POWER_MODE_M2);
}
+
// Methods from ::android::hardware::gnss::V2_0::IGnssMeasurement follow.
Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_2_0(
const sp<V2_0::IGnssMeasurementCallback>& callback,
bool enableFullTracking) {
-
- Return<GnssMeasurement::GnssMeasurementStatus> ret =
- IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
- if (mGnssMeasurementCbIface_2_0 != 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 (nullptr == mApi) {
- LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
- return ret;
- }
-
- clearInterfaces();
-
- mGnssMeasurementCbIface_2_0 = callback;
- mGnssMeasurementCbIface_2_0->linkToDeath(mGnssMeasurementDeathRecipient, 0);
-
- GnssPowerMode powerMode = enableFullTracking ?
- GNSS_POWER_MODE_M1 : GNSS_POWER_MODE_M2;
-
- return mApi->measurementSetCallback_2_0(callback, powerMode);
+ return setCallback(callback, mGnssMeasurementCbIface_2_0,
+ enableFullTracking ? GNSS_POWER_MODE_M1 : GNSS_POWER_MODE_M2);
}
// Methods from ::android::hardware::gnss::V2_1::IGnssMeasurement follow.
Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_2_1(
const sp<::android::hardware::gnss::V2_1::IGnssMeasurementCallback>& callback,
bool enableFullTracking) {
- Return<GnssMeasurement::GnssMeasurementStatus> ret =
- IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
- if (mGnssMeasurementCbIface_2_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 (nullptr == mApi) {
- LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
- return ret;
- }
-
- clearInterfaces();
-
- mGnssMeasurementCbIface_2_1 = callback;
- mGnssMeasurementCbIface_2_1->linkToDeath(mGnssMeasurementDeathRecipient, 0);
-
- GnssPowerMode powerMode = enableFullTracking ?
- GNSS_POWER_MODE_M1 : GNSS_POWER_MODE_M2;
-
- return mApi->measurementSetCallback_2_1(callback, powerMode);
-
+ return setCallback(callback, mGnssMeasurementCbIface_2_1,
+ enableFullTracking ? GNSS_POWER_MODE_M1 : GNSS_POWER_MODE_M2);
}
} // namespace implementation
diff --git a/android/2.1/GnssMeasurement.h b/android/2.1/GnssMeasurement.h
index 2ac45c6..9d7a567 100644
--- a/android/2.1/GnssMeasurement.h
+++ b/android/2.1/GnssMeasurement.h
@@ -18,12 +18,18 @@
* limitations under the License.
*/
+/* ​​​​​Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
+ */
+
#ifndef ANDROID_HARDWARE_GNSS_V2_1_GNSSMEASUREMENT_H
#define ANDROID_HARDWARE_GNSS_V2_1_GNSSMEASUREMENT_H
#include <android/hardware/gnss/2.1/IGnssMeasurement.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
+#include "MeasurementAPIClient.h"
namespace android {
namespace hardware {
@@ -74,7 +80,9 @@ struct GnssMeasurement : public V2_1::IGnssMeasurement {
sp<GnssMeasurement> mGnssMeasurement;
};
- private:
+ template <typename T>
+ Return<IGnssMeasurement::GnssMeasurementStatus> setCallback(
+ const sp<T>& callback, sp<T>& myCallback, GnssPowerMode powerMode);
sp<GnssMeasurementDeathRecipient> mGnssMeasurementDeathRecipient = nullptr;
sp<V1_0::IGnssMeasurementCallback> mGnssMeasurementCbIface = nullptr;
sp<V1_1::IGnssMeasurementCallback> mGnssMeasurementCbIface_1_1 = nullptr;
diff --git a/android/2.1/location_api/MeasurementAPIClient.cpp b/android/2.1/location_api/MeasurementAPIClient.cpp
index 0028074..96a7a94 100644
--- a/android/2.1/location_api/MeasurementAPIClient.cpp
+++ b/android/2.1/location_api/MeasurementAPIClient.cpp
@@ -95,65 +95,6 @@ void MeasurementAPIClient::clearInterfaces()
mGnssMeasurementCbIface_2_1 = nullptr;
}
-// for GpsInterface
-Return<IGnssMeasurement::GnssMeasurementStatus>
-MeasurementAPIClient::measurementSetCallback(const sp<V1_0::IGnssMeasurementCallback>& callback)
-{
- LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback);
-
- mMutex.lock();
- clearInterfaces();
- mGnssMeasurementCbIface = callback;
- mMutex.unlock();
-
- return startTracking();
-}
-
-Return<IGnssMeasurement::GnssMeasurementStatus>
-MeasurementAPIClient::measurementSetCallback_1_1(
- const sp<V1_1::IGnssMeasurementCallback>& callback,
- GnssPowerMode powerMode, uint32_t timeBetweenMeasurement)
-{
- LOC_LOGD("%s]: (%p) (powermode: %d) (tbm: %d)",
- __FUNCTION__, &callback, (int)powerMode, timeBetweenMeasurement);
-
- mMutex.lock();
- clearInterfaces();
- mGnssMeasurementCbIface_1_1 = callback;
- mMutex.unlock();
-
- return startTracking(powerMode, timeBetweenMeasurement);
-}
-
-Return<IGnssMeasurement::GnssMeasurementStatus>
-MeasurementAPIClient::measurementSetCallback_2_0(
- const sp<V2_0::IGnssMeasurementCallback>& callback,
- GnssPowerMode powerMode, uint32_t timeBetweenMeasurement)
-{
- LOC_LOGD("%s]: (%p) (powermode: %d) (tbm: %d)",
- __FUNCTION__, &callback, (int)powerMode, timeBetweenMeasurement);
-
- mMutex.lock();
- clearInterfaces();
- mGnssMeasurementCbIface_2_0 = callback;
- mMutex.unlock();
-
- return startTracking(powerMode, timeBetweenMeasurement);
-}
-
-Return<IGnssMeasurement::GnssMeasurementStatus> MeasurementAPIClient::measurementSetCallback_2_1(
- const sp<V2_1::IGnssMeasurementCallback>& callback,
- GnssPowerMode powerMode, uint32_t timeBetweenMeasurement) {
- LOC_LOGD("%s]: (%p) (powermode: %d) (tbm: %d)",
- __FUNCTION__, &callback, (int)powerMode, timeBetweenMeasurement);
-
- mMutex.lock();
- clearInterfaces();
- mGnssMeasurementCbIface_2_1 = callback;
- mMutex.unlock();
-
- return startTracking(powerMode, timeBetweenMeasurement);
-}
Return<IGnssMeasurement::GnssMeasurementStatus>
MeasurementAPIClient::startTracking(
GnssPowerMode powerMode, uint32_t timeBetweenMeasurement)
@@ -162,16 +103,6 @@ MeasurementAPIClient::startTracking(
memset(&locationCallbacks, 0, sizeof(LocationCallbacks));
locationCallbacks.size = sizeof(LocationCallbacks);
- locationCallbacks.trackingCb = nullptr;
- locationCallbacks.batchingCb = nullptr;
- locationCallbacks.geofenceBreachCb = nullptr;
- locationCallbacks.geofenceStatusCb = nullptr;
- locationCallbacks.gnssLocationInfoCb = nullptr;
- locationCallbacks.gnssNiCb = nullptr;
- locationCallbacks.gnssSvCb = nullptr;
- locationCallbacks.gnssNmeaCb = nullptr;
-
- locationCallbacks.gnssMeasurementsCb = nullptr;
if (mGnssMeasurementCbIface_2_1 != nullptr ||
mGnssMeasurementCbIface_2_0 != nullptr ||
mGnssMeasurementCbIface_1_1 != nullptr ||
@@ -195,7 +126,8 @@ MeasurementAPIClient::startTracking(
}
mTracking = true;
- LOC_LOGD("%s]: start tracking session", __FUNCTION__);
+ LOC_LOGd("(powermode: %d) (tbm %d)", (int)powerMode, timeBetweenMeasurement);
+
locAPIStartTracking(options);
return IGnssMeasurement::GnssMeasurementStatus::SUCCESS;
}
@@ -204,6 +136,7 @@ MeasurementAPIClient::startTracking(
void MeasurementAPIClient::measurementClose() {
LOC_LOGD("%s]: ()", __FUNCTION__);
mTracking = false;
+ clearInterfaces();
locAPIStopTracking();
}
diff --git a/android/2.1/location_api/MeasurementAPIClient.h b/android/2.1/location_api/MeasurementAPIClient.h
index 3e8805b..1a3051f 100644
--- a/android/2.1/location_api/MeasurementAPIClient.h
+++ b/android/2.1/location_api/MeasurementAPIClient.h
@@ -32,7 +32,6 @@
#include <mutex>
#include <android/hardware/gnss/2.1/IGnssMeasurement.h>
-//#include <android/hardware/gnss/1.1/IGnssMeasurementCallback.h>
#include <android/hardware/gnss/2.1/IGnssMeasurementCallback.h>
#include <LocationAPIClientBase.h>
#include <hidl/Status.h>
@@ -54,20 +53,16 @@ public:
MeasurementAPIClient& operator=(const MeasurementAPIClient&) = delete;
// for GpsMeasurementInterface
- Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback(
- const sp<V1_0::IGnssMeasurementCallback>& callback);
- Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback_1_1(
- const sp<V1_1::IGnssMeasurementCallback>& callback,
- GnssPowerMode powerMode = GNSS_POWER_MODE_INVALID,
- uint32_t timeBetweenMeasurement = GPS_DEFAULT_FIX_INTERVAL_MS);
- Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback_2_0(
- const sp<V2_0::IGnssMeasurementCallback>& callback,
- GnssPowerMode powerMode = GNSS_POWER_MODE_INVALID,
- uint32_t timeBetweenMeasurement = GPS_DEFAULT_FIX_INTERVAL_MS);
- Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback_2_1(
- const sp<V2_1::IGnssMeasurementCallback>& callback,
- GnssPowerMode powerMode = GNSS_POWER_MODE_INVALID,
- uint32_t timeBetweenMeasurement = GPS_DEFAULT_FIX_INTERVAL_MS);
+ template <typename T>
+ Return<IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback(
+ const sp<T>& callback, GnssPowerMode powerMode = GNSS_POWER_MODE_INVALID) {
+ mMutex.lock();
+ setCallbackLocked(callback);
+ mMutex.unlock();
+
+ return startTracking(powerMode);
+ }
+
void measurementClose();
Return<IGnssMeasurement::GnssMeasurementStatus> startTracking(
GnssPowerMode powerMode = GNSS_POWER_MODE_INVALID,
@@ -77,6 +72,18 @@ public:
void onGnssMeasurementsCb(GnssMeasurementsNotification gnssMeasurementsNotification) final;
private:
+ inline void setCallbackLocked(const sp<V1_0::IGnssMeasurementCallback>& callback) {
+ mGnssMeasurementCbIface = callback;
+ }
+ inline void setCallbackLocked(const sp<V1_1::IGnssMeasurementCallback>& callback) {
+ mGnssMeasurementCbIface_1_1 = callback;
+ }
+ inline void setCallbackLocked(const sp<V2_0::IGnssMeasurementCallback>& callback) {
+ mGnssMeasurementCbIface_2_0 = callback;
+ }
+ inline void setCallbackLocked(const sp<V2_1::IGnssMeasurementCallback>& callback) {
+ mGnssMeasurementCbIface_2_1 = callback;
+ }
virtual ~MeasurementAPIClient();
std::mutex mMutex;
diff --git a/location/LocationAPIClientBase.cpp b/location/LocationAPIClientBase.cpp
index ea15a76..d4a86c2 100644
--- a/location/LocationAPIClientBase.cpp
+++ b/location/LocationAPIClientBase.cpp
@@ -26,6 +26,11 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+/* ​​​​​Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
+ */
+
#define LOG_NDEBUG 0
#define LOG_TAG "LocSvc_APIClientBase"
@@ -357,7 +362,8 @@ uint32_t LocationAPIClientBase::locAPIStartTracking(TrackingOptions& options)
pthread_mutex_lock(&mMutex);
if (mLocationAPI) {
if (mTracking) {
- LOC_LOGW("%s:%d] Existing tracking session present", __FUNCTION__, __LINE__);
+ pthread_mutex_unlock(&mMutex);
+ locAPIUpdateTrackingOptions(options);
} else {
uint32_t session = mLocationAPI->startTracking(options);
LOC_LOGI("%s:%d] start new session: %d", __FUNCTION__, __LINE__, session);
@@ -367,11 +373,13 @@ uint32_t LocationAPIClientBase::locAPIStartTracking(TrackingOptions& options)
mRequestQueues[REQUEST_TRACKING].reset(session);
mRequestQueues[REQUEST_TRACKING].push(new StartTrackingRequest(*this));
mTracking = true;
+ pthread_mutex_unlock(&mMutex);
}
retVal = LOCATION_ERROR_SUCCESS;
+ } else {
+ pthread_mutex_unlock(&mMutex);
}
- pthread_mutex_unlock(&mMutex);
return retVal;
}