Loading services/core/jni/com_android_server_location_GnssLocationProvider.cpp +18 −30 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include <android/hardware/gnss/2.1/IGnssAntennaInfo.h> #include <android/hardware/gnss/2.1/IGnssMeasurement.h> #include <android/hardware/gnss/BnGnss.h> #include <android/hardware/gnss/BnGnssAntennaInfo.h> #include <android/hardware/gnss/BnGnssCallback.h> #include <android/hardware/gnss/BnGnssDebug.h> #include <android/hardware/gnss/BnGnssGeofence.h> Loading @@ -51,6 +52,7 @@ #include "android_runtime/Log.h" #include "gnss/AGnss.h" #include "gnss/AGnssRil.h" #include "gnss/GnssAntennaInfo.h" #include "gnss/GnssAntennaInfoCallback.h" #include "gnss/GnssBatching.h" #include "gnss/GnssConfiguration.h" Loading Loading @@ -155,7 +157,6 @@ using IGnss_V2_1 = android::hardware::gnss::V2_1::IGnss; using IGnssCallback_V1_0 = android::hardware::gnss::V1_0::IGnssCallback; using IGnssCallback_V2_0 = android::hardware::gnss::V2_0::IGnssCallback; using IGnssCallback_V2_1 = android::hardware::gnss::V2_1::IGnssCallback; using IGnssAntennaInfo = android::hardware::gnss::V2_1::IGnssAntennaInfo; using IMeasurementCorrections_V1_0 = android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrections; using IMeasurementCorrections_V1_1 = android::hardware::gnss::measurement_corrections::V1_1::IMeasurementCorrections; Loading @@ -179,6 +180,7 @@ using IGnssPsdsAidl = android::hardware::gnss::IGnssPsds; using IGnssPsdsCallbackAidl = android::hardware::gnss::IGnssPsdsCallback; using IGnssConfigurationAidl = android::hardware::gnss::IGnssConfiguration; using GnssLocationAidl = android::hardware::gnss::GnssLocation; using IGnssAntennaInfoAidl = android::hardware::gnss::IGnssAntennaInfo; struct GnssDeathRecipient : virtual public hidl_death_recipient { Loading Loading @@ -207,7 +209,6 @@ sp<IGnssNi> gnssNiIface = nullptr; sp<IGnssPowerIndication> gnssPowerIndicationIface = nullptr; sp<IMeasurementCorrections_V1_0> gnssCorrectionsIface_V1_0 = nullptr; sp<IMeasurementCorrections_V1_1> gnssCorrectionsIface_V1_1 = nullptr; sp<IGnssAntennaInfo> gnssAntennaInfoIface = nullptr; std::unique_ptr<GnssConfigurationInterface> gnssConfigurationIface = nullptr; std::unique_ptr<android::gnss::GnssMeasurementInterface> gnssMeasurementIface = nullptr; Loading @@ -218,6 +219,7 @@ std::unique_ptr<android::gnss::AGnssInterface> agnssIface = nullptr; std::unique_ptr<android::gnss::GnssDebugInterface> gnssDebugIface = nullptr; std::unique_ptr<android::gnss::AGnssRilInterface> agnssRilIface = nullptr; std::unique_ptr<android::gnss::GnssVisibilityControlInterface> gnssVisibilityControlIface = nullptr; std::unique_ptr<android::gnss::GnssAntennaInfoInterface> gnssAntennaInfoIface = nullptr; #define WAKE_LOCK_NAME "GPS" Loading Loading @@ -1163,12 +1165,18 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject } } if (gnssHal_V2_1 != nullptr) { auto gnssAntennaInfo = gnssHal_V2_1->getExtensionGnssAntennaInfo(); if (!gnssAntennaInfo.isOk()) { ALOGD("Unable to get a handle to GnssAntennaInfo"); } else { gnssAntennaInfoIface = gnssAntennaInfo; if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) { sp<IGnssAntennaInfoAidl> gnssAntennaInfoAidl; auto status = gnssHalAidl->getExtensionGnssAntennaInfo(&gnssAntennaInfoAidl); if (checkAidlStatus(status, "Unable to get a handle to GnssAntennaInfo interface.")) { gnssAntennaInfoIface = std::make_unique<gnss::GnssAntennaInfoAidl>(gnssAntennaInfoAidl); } } else if (gnssHal_V2_1 != nullptr) { auto gnssAntennaInfo_V2_1 = gnssHal_V2_1->getExtensionGnssAntennaInfo(); if (checkHidlReturn(gnssAntennaInfo_V2_1, "Unable to get a handle to GnssAntennaInfo_V2_1")) { gnssAntennaInfoIface = std::make_unique<gnss::GnssAntennaInfo_V2_1>(gnssAntennaInfo_V2_1); } } Loading Loading @@ -1933,25 +1941,7 @@ static jboolean android_location_gnss_hal_GnssNative_start_antenna_info_listenin ALOGE("%s: IGnssAntennaInfo interface not available.", __func__); return JNI_FALSE; } sp<gnss::GnssAntennaInfoCallback> cbIface = new gnss::GnssAntennaInfoCallback(mCallbacksObj); auto result = gnssAntennaInfoIface->setCallback(cbIface); if (!checkHidlReturn(result, "IGnssAntennaInfo setCallback() failed.")) { return JNI_FALSE; } IGnssAntennaInfo::GnssAntennaInfoStatus initRet = result; if (initRet != IGnssAntennaInfo::GnssAntennaInfoStatus::SUCCESS) { ALOGE("An error has been found on GnssAntennaInfoInterface::init, status=%d", static_cast<int32_t>(initRet)); return JNI_FALSE; } else { ALOGD("gnss antenna info has been enabled"); } return JNI_TRUE; return gnssAntennaInfoIface->setCallback(std::make_unique<gnss::GnssAntennaInfoCallback>()); } static jboolean android_location_gnss_hal_GnssNative_stop_antenna_info_listening(JNIEnv* /* env */, Loading @@ -1960,9 +1950,7 @@ static jboolean android_location_gnss_hal_GnssNative_stop_antenna_info_listening ALOGE("%s: IGnssAntennaInfo interface not available.", __func__); return JNI_FALSE; } auto result = gnssAntennaInfoIface->close(); return checkHidlReturn(result, "IGnssAntennaInfo close() failed."); return gnssAntennaInfoIface->close(); } static jboolean android_location_gnss_hal_GnssNative_is_measurement_supported(JNIEnv* env, jclass) { Loading services/core/jni/gnss/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ cc_library_shared { "AGnssCallback.cpp", "AGnssRil.cpp", "AGnssRilCallback.cpp", "GnssAntennaInfo.cpp", "GnssAntennaInfoCallback.cpp", "GnssBatching.cpp", "GnssBatchingCallback.cpp", Loading services/core/jni/gnss/GnssAntennaInfo.cpp 0 → 100644 +77 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // Define LOG_TAG before <log/log.h> to overwrite the default value. #define LOG_TAG "GnssAntennaInfoJni" #include "GnssAntennaInfo.h" #include "Utils.h" using IGnssAntennaInfoAidl = android::hardware::gnss::IGnssAntennaInfo; using IGnssAntennaInfo_V2_1 = android::hardware::gnss::V2_1::IGnssAntennaInfo; namespace android::gnss { // Implementation of GnssAntennaInfo (AIDL HAL) GnssAntennaInfoAidl::GnssAntennaInfoAidl(const sp<IGnssAntennaInfoAidl>& iGnssAntennaInfo) : mIGnssAntennaInfoAidl(iGnssAntennaInfo) { assert(mIGnssAntennaInfoAidl != nullptr); } jboolean GnssAntennaInfoAidl::setCallback( const std::unique_ptr<GnssAntennaInfoCallback>& callback) { auto status = mIGnssAntennaInfoAidl->setCallback(callback->getAidl()); return checkAidlStatus(status, "IGnssAntennaInfoAidl setCallback() failed."); } jboolean GnssAntennaInfoAidl::close() { auto status = mIGnssAntennaInfoAidl->close(); return checkAidlStatus(status, "IGnssAntennaInfoAidl close() failed"); } // Implementation of GnssAntennaInfo_V2_1 GnssAntennaInfo_V2_1::GnssAntennaInfo_V2_1(const sp<IGnssAntennaInfo_V2_1>& iGnssAntennaInfo) : mIGnssAntennaInfo_V2_1(iGnssAntennaInfo) { assert(mIGnssAntennaInfo_V2_1 != nullptr); } jboolean GnssAntennaInfo_V2_1::setCallback( const std::unique_ptr<GnssAntennaInfoCallback>& callback) { auto result = mIGnssAntennaInfo_V2_1->setCallback(callback->getV2_1()); if (!checkHidlReturn(result, "IGnssAntennaInfo_V2_1 setCallback() failed.")) { return JNI_FALSE; } IGnssAntennaInfo_V2_1::GnssAntennaInfoStatus initRet = result; if (initRet != IGnssAntennaInfo_V2_1::GnssAntennaInfoStatus::SUCCESS) { ALOGE("An error has been found on GnssAntennaInfoInterface::init, status=%d", static_cast<int32_t>(initRet)); return JNI_FALSE; } else { ALOGD("gnss antenna info v2_1 has been enabled"); } return JNI_TRUE; } jboolean GnssAntennaInfo_V2_1::close() { auto result = mIGnssAntennaInfo_V2_1->close(); return checkHidlReturn(result, "IGnssAntennaInfo_V2_1 close() failed."); } } // namespace android::gnss services/core/jni/gnss/GnssAntennaInfo.h 0 → 100644 +65 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _ANDROID_SERVER_GNSS_GNSSANTENNAINFO_H #define _ANDROID_SERVER_GNSS_GNSSANTENNAINFO_H #pragma once #ifndef LOG_TAG #error LOG_TAG must be defined before including this file. #endif #include <android/hardware/gnss/2.1/IGnssAntennaInfo.h> #include <android/hardware/gnss/BnGnssAntennaInfo.h> #include <log/log.h> #include "GnssAntennaInfoCallback.h" #include "jni.h" namespace android::gnss { class GnssAntennaInfoInterface { public: virtual ~GnssAntennaInfoInterface() {} virtual jboolean setCallback(const std::unique_ptr<GnssAntennaInfoCallback>& callback) = 0; virtual jboolean close() = 0; }; class GnssAntennaInfoAidl : public GnssAntennaInfoInterface { public: GnssAntennaInfoAidl(const sp<android::hardware::gnss::IGnssAntennaInfo>& iGnssAntennaInfo); jboolean setCallback(const std::unique_ptr<GnssAntennaInfoCallback>& callback) override; jboolean close() override; private: const sp<android::hardware::gnss::IGnssAntennaInfo> mIGnssAntennaInfoAidl; }; class GnssAntennaInfo_V2_1 : public GnssAntennaInfoInterface { public: GnssAntennaInfo_V2_1( const sp<android::hardware::gnss::V2_1::IGnssAntennaInfo>& iGnssAntennaInfo); jboolean setCallback(const std::unique_ptr<GnssAntennaInfoCallback>& callback) override; jboolean close() override; private: const sp<android::hardware::gnss::V2_1::IGnssAntennaInfo> mIGnssAntennaInfo_V2_1; }; } // namespace android::gnss #endif // _ANDROID_SERVER_GNSS_GNSSANTENNAINFO_H services/core/jni/gnss/GnssAntennaInfoCallback.cpp +100 −20 Original line number Diff line number Diff line Loading @@ -25,8 +25,10 @@ namespace android::gnss { using android::hardware::hidl_vec; using android::hardware::Return; using android::hardware::Void; using binder::Status; using IGnssAntennaInfoCallback = android::hardware::gnss::V2_1::IGnssAntennaInfoCallback; using IGnssAntennaInfoCallbackAidl = android::hardware::gnss::IGnssAntennaInfoCallback; using IGnssAntennaInfoCallback_V2_1 = android::hardware::gnss::V2_1::IGnssAntennaInfoCallback; namespace { jclass class_gnssAntennaInfoBuilder; Loading Loading @@ -92,14 +94,21 @@ void GnssAntennaInfo_class_init_once(JNIEnv* env, jclass& clazz) { class_doubleArray = (jclass)env->NewGlobalRef(doubleArrayClass); } Return<void> GnssAntennaInfoCallback::gnssAntennaInfoCb( const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos) { translateAndReportGnssAntennaInfo(gnssAntennaInfos); binder::Status GnssAntennaInfoCallbackAidl::gnssAntennaInfoCb( const std::vector<IGnssAntennaInfoCallbackAidl::GnssAntennaInfo>& gnssAntennaInfos) { GnssAntennaInfoCallbackUtil::translateAndReportGnssAntennaInfo(gnssAntennaInfos); return Status::ok(); } Return<void> GnssAntennaInfoCallback_V2_1::gnssAntennaInfoCb( const hidl_vec<IGnssAntennaInfoCallback_V2_1::GnssAntennaInfo>& gnssAntennaInfos) { GnssAntennaInfoCallbackUtil::translateAndReportGnssAntennaInfo(gnssAntennaInfos); return Void(); } jobjectArray GnssAntennaInfoCallback::translate2dDoubleArray( JNIEnv* env, const hidl_vec<IGnssAntennaInfoCallback::Row>& array) { template <template <class...> class T_vector, class T_info> jobjectArray GnssAntennaInfoCallbackUtil::translate2dDoubleArray(JNIEnv* env, const T_vector<T_info>& array) { jsize numRows = array.size(); if (numRows == 0) { // Empty array Loading @@ -124,8 +133,9 @@ jobjectArray GnssAntennaInfoCallback::translate2dDoubleArray( return returnArray; } jobject GnssAntennaInfoCallback::translateAllGnssAntennaInfos( JNIEnv* env, const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos) { template <template <class...> class T_vector, class T_info> jobject GnssAntennaInfoCallbackUtil::translateAllGnssAntennaInfos( JNIEnv* env, const T_vector<T_info>& gnssAntennaInfos) { jobject arrayList = env->NewObject(class_arrayList, method_arrayListCtor); // Create new ArrayList instance Loading @@ -141,8 +151,9 @@ jobject GnssAntennaInfoCallback::translateAllGnssAntennaInfos( return arrayList; } jobject GnssAntennaInfoCallback::translatePhaseCenterOffset( JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) { template <class T> jobject GnssAntennaInfoCallbackUtil::translatePhaseCenterOffset(JNIEnv* env, const T& gnssAntennaInfo) { jobject phaseCenterOffset = env->NewObject(class_phaseCenterOffset, method_phaseCenterOffsetCtor, gnssAntennaInfo.phaseCenterOffsetCoordinateMillimeters.x, Loading @@ -155,8 +166,42 @@ jobject GnssAntennaInfoCallback::translatePhaseCenterOffset( return phaseCenterOffset; } jobject GnssAntennaInfoCallback::translatePhaseCenterVariationCorrections( JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) { template <> jobject GnssAntennaInfoCallbackUtil::translatePhaseCenterVariationCorrections( JNIEnv* env, const IGnssAntennaInfoCallbackAidl::GnssAntennaInfo& gnssAntennaInfo) { if (gnssAntennaInfo.phaseCenterVariationCorrectionMillimeters.empty() || gnssAntennaInfo.phaseCenterVariationCorrectionUncertaintyMillimeters.empty()) { return NULL; } jobjectArray phaseCenterVariationCorrectionsArray = translate2dDoubleArray(env, gnssAntennaInfo.phaseCenterVariationCorrectionMillimeters); jobjectArray phaseCenterVariationCorrectionsUncertaintiesArray = translate2dDoubleArray(env, gnssAntennaInfo .phaseCenterVariationCorrectionUncertaintyMillimeters); if (phaseCenterVariationCorrectionsArray == NULL || phaseCenterVariationCorrectionsUncertaintiesArray == NULL) { env->DeleteLocalRef(phaseCenterVariationCorrectionsArray); env->DeleteLocalRef(phaseCenterVariationCorrectionsUncertaintiesArray); return NULL; } jobject phaseCenterVariationCorrections = env->NewObject(class_sphericalCorrections, method_sphericalCorrectionsCtor, phaseCenterVariationCorrectionsArray, phaseCenterVariationCorrectionsUncertaintiesArray); env->DeleteLocalRef(phaseCenterVariationCorrectionsArray); env->DeleteLocalRef(phaseCenterVariationCorrectionsUncertaintiesArray); return phaseCenterVariationCorrections; } template <> jobject GnssAntennaInfoCallbackUtil::translatePhaseCenterVariationCorrections( JNIEnv* env, const IGnssAntennaInfoCallback_V2_1::GnssAntennaInfo& gnssAntennaInfo) { if (gnssAntennaInfo.phaseCenterVariationCorrectionMillimeters == NULL || gnssAntennaInfo.phaseCenterVariationCorrectionUncertaintyMillimeters == NULL) { return NULL; Loading @@ -171,6 +216,8 @@ jobject GnssAntennaInfoCallback::translatePhaseCenterVariationCorrections( if (phaseCenterVariationCorrectionsArray == NULL || phaseCenterVariationCorrectionsUncertaintiesArray == NULL) { env->DeleteLocalRef(phaseCenterVariationCorrectionsArray); env->DeleteLocalRef(phaseCenterVariationCorrectionsUncertaintiesArray); return NULL; } Loading @@ -185,8 +232,37 @@ jobject GnssAntennaInfoCallback::translatePhaseCenterVariationCorrections( return phaseCenterVariationCorrections; } jobject GnssAntennaInfoCallback::translateSignalGainCorrections( JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) { template <> jobject GnssAntennaInfoCallbackUtil::translateSignalGainCorrections( JNIEnv* env, const IGnssAntennaInfoCallbackAidl::GnssAntennaInfo& gnssAntennaInfo) { if (gnssAntennaInfo.signalGainCorrectionDbi.empty() || gnssAntennaInfo.signalGainCorrectionUncertaintyDbi.empty()) { return NULL; } jobjectArray signalGainCorrectionsArray = translate2dDoubleArray(env, gnssAntennaInfo.signalGainCorrectionDbi); jobjectArray signalGainCorrectionsUncertaintiesArray = translate2dDoubleArray(env, gnssAntennaInfo.signalGainCorrectionUncertaintyDbi); if (signalGainCorrectionsArray == NULL || signalGainCorrectionsUncertaintiesArray == NULL) { env->DeleteLocalRef(signalGainCorrectionsArray); env->DeleteLocalRef(signalGainCorrectionsUncertaintiesArray); return NULL; } jobject signalGainCorrections = env->NewObject(class_sphericalCorrections, method_sphericalCorrectionsCtor, signalGainCorrectionsArray, signalGainCorrectionsUncertaintiesArray); env->DeleteLocalRef(signalGainCorrectionsArray); env->DeleteLocalRef(signalGainCorrectionsUncertaintiesArray); return signalGainCorrections; } template <> jobject GnssAntennaInfoCallbackUtil::translateSignalGainCorrections( JNIEnv* env, const IGnssAntennaInfoCallback_V2_1::GnssAntennaInfo& gnssAntennaInfo) { if (gnssAntennaInfo.signalGainCorrectionDbi == NULL || gnssAntennaInfo.signalGainCorrectionUncertaintyDbi == NULL) { return NULL; Loading @@ -197,6 +273,8 @@ jobject GnssAntennaInfoCallback::translateSignalGainCorrections( translate2dDoubleArray(env, gnssAntennaInfo.signalGainCorrectionUncertaintyDbi); if (signalGainCorrectionsArray == NULL || signalGainCorrectionsUncertaintiesArray == NULL) { env->DeleteLocalRef(signalGainCorrectionsArray); env->DeleteLocalRef(signalGainCorrectionsUncertaintiesArray); return NULL; } Loading @@ -210,8 +288,9 @@ jobject GnssAntennaInfoCallback::translateSignalGainCorrections( return signalGainCorrections; } jobject GnssAntennaInfoCallback::translateSingleGnssAntennaInfo( JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) { template <class T> jobject GnssAntennaInfoCallbackUtil::translateSingleGnssAntennaInfo(JNIEnv* env, const T& gnssAntennaInfo) { jobject phaseCenterOffset = translatePhaseCenterOffset(env, gnssAntennaInfo); // Nullable Loading @@ -228,7 +307,7 @@ jobject GnssAntennaInfoCallback::translateSingleGnssAntennaInfo( // Set fields callObjectMethodIgnoringResult(env, gnssAntennaInfoBuilderObject, method_gnssAntennaInfoBuilderSetCarrierFrequencyMHz, gnssAntennaInfo.carrierFrequencyMHz); getCarrierFrequencyMHz(gnssAntennaInfo)); callObjectMethodIgnoringResult(env, gnssAntennaInfoBuilderObject, method_gnssAntennaInfoBuilderSetPhaseCenterOffset, phaseCenterOffset); Loading @@ -251,8 +330,9 @@ jobject GnssAntennaInfoCallback::translateSingleGnssAntennaInfo( return gnssAntennaInfoObject; } void GnssAntennaInfoCallback::translateAndReportGnssAntennaInfo( const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos) { template <template <class...> class T_vector, class T_info> void GnssAntennaInfoCallbackUtil::translateAndReportGnssAntennaInfo( const T_vector<T_info>& gnssAntennaInfos) { JNIEnv* env = getJniEnv(); jobject arrayList = translateAllGnssAntennaInfos(env, gnssAntennaInfos); Loading @@ -262,7 +342,7 @@ void GnssAntennaInfoCallback::translateAndReportGnssAntennaInfo( env->DeleteLocalRef(arrayList); } void GnssAntennaInfoCallback::reportAntennaInfo(JNIEnv* env, const jobject antennaInfosArray) { void GnssAntennaInfoCallbackUtil::reportAntennaInfo(JNIEnv* env, const jobject antennaInfosArray) { env->CallVoidMethod(mCallbacksObj, method_reportAntennaInfo, antennaInfosArray); checkAndClearExceptionFromCallback(env, __FUNCTION__); } Loading Loading
services/core/jni/com_android_server_location_GnssLocationProvider.cpp +18 −30 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include <android/hardware/gnss/2.1/IGnssAntennaInfo.h> #include <android/hardware/gnss/2.1/IGnssMeasurement.h> #include <android/hardware/gnss/BnGnss.h> #include <android/hardware/gnss/BnGnssAntennaInfo.h> #include <android/hardware/gnss/BnGnssCallback.h> #include <android/hardware/gnss/BnGnssDebug.h> #include <android/hardware/gnss/BnGnssGeofence.h> Loading @@ -51,6 +52,7 @@ #include "android_runtime/Log.h" #include "gnss/AGnss.h" #include "gnss/AGnssRil.h" #include "gnss/GnssAntennaInfo.h" #include "gnss/GnssAntennaInfoCallback.h" #include "gnss/GnssBatching.h" #include "gnss/GnssConfiguration.h" Loading Loading @@ -155,7 +157,6 @@ using IGnss_V2_1 = android::hardware::gnss::V2_1::IGnss; using IGnssCallback_V1_0 = android::hardware::gnss::V1_0::IGnssCallback; using IGnssCallback_V2_0 = android::hardware::gnss::V2_0::IGnssCallback; using IGnssCallback_V2_1 = android::hardware::gnss::V2_1::IGnssCallback; using IGnssAntennaInfo = android::hardware::gnss::V2_1::IGnssAntennaInfo; using IMeasurementCorrections_V1_0 = android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrections; using IMeasurementCorrections_V1_1 = android::hardware::gnss::measurement_corrections::V1_1::IMeasurementCorrections; Loading @@ -179,6 +180,7 @@ using IGnssPsdsAidl = android::hardware::gnss::IGnssPsds; using IGnssPsdsCallbackAidl = android::hardware::gnss::IGnssPsdsCallback; using IGnssConfigurationAidl = android::hardware::gnss::IGnssConfiguration; using GnssLocationAidl = android::hardware::gnss::GnssLocation; using IGnssAntennaInfoAidl = android::hardware::gnss::IGnssAntennaInfo; struct GnssDeathRecipient : virtual public hidl_death_recipient { Loading Loading @@ -207,7 +209,6 @@ sp<IGnssNi> gnssNiIface = nullptr; sp<IGnssPowerIndication> gnssPowerIndicationIface = nullptr; sp<IMeasurementCorrections_V1_0> gnssCorrectionsIface_V1_0 = nullptr; sp<IMeasurementCorrections_V1_1> gnssCorrectionsIface_V1_1 = nullptr; sp<IGnssAntennaInfo> gnssAntennaInfoIface = nullptr; std::unique_ptr<GnssConfigurationInterface> gnssConfigurationIface = nullptr; std::unique_ptr<android::gnss::GnssMeasurementInterface> gnssMeasurementIface = nullptr; Loading @@ -218,6 +219,7 @@ std::unique_ptr<android::gnss::AGnssInterface> agnssIface = nullptr; std::unique_ptr<android::gnss::GnssDebugInterface> gnssDebugIface = nullptr; std::unique_ptr<android::gnss::AGnssRilInterface> agnssRilIface = nullptr; std::unique_ptr<android::gnss::GnssVisibilityControlInterface> gnssVisibilityControlIface = nullptr; std::unique_ptr<android::gnss::GnssAntennaInfoInterface> gnssAntennaInfoIface = nullptr; #define WAKE_LOCK_NAME "GPS" Loading Loading @@ -1163,12 +1165,18 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject } } if (gnssHal_V2_1 != nullptr) { auto gnssAntennaInfo = gnssHal_V2_1->getExtensionGnssAntennaInfo(); if (!gnssAntennaInfo.isOk()) { ALOGD("Unable to get a handle to GnssAntennaInfo"); } else { gnssAntennaInfoIface = gnssAntennaInfo; if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) { sp<IGnssAntennaInfoAidl> gnssAntennaInfoAidl; auto status = gnssHalAidl->getExtensionGnssAntennaInfo(&gnssAntennaInfoAidl); if (checkAidlStatus(status, "Unable to get a handle to GnssAntennaInfo interface.")) { gnssAntennaInfoIface = std::make_unique<gnss::GnssAntennaInfoAidl>(gnssAntennaInfoAidl); } } else if (gnssHal_V2_1 != nullptr) { auto gnssAntennaInfo_V2_1 = gnssHal_V2_1->getExtensionGnssAntennaInfo(); if (checkHidlReturn(gnssAntennaInfo_V2_1, "Unable to get a handle to GnssAntennaInfo_V2_1")) { gnssAntennaInfoIface = std::make_unique<gnss::GnssAntennaInfo_V2_1>(gnssAntennaInfo_V2_1); } } Loading Loading @@ -1933,25 +1941,7 @@ static jboolean android_location_gnss_hal_GnssNative_start_antenna_info_listenin ALOGE("%s: IGnssAntennaInfo interface not available.", __func__); return JNI_FALSE; } sp<gnss::GnssAntennaInfoCallback> cbIface = new gnss::GnssAntennaInfoCallback(mCallbacksObj); auto result = gnssAntennaInfoIface->setCallback(cbIface); if (!checkHidlReturn(result, "IGnssAntennaInfo setCallback() failed.")) { return JNI_FALSE; } IGnssAntennaInfo::GnssAntennaInfoStatus initRet = result; if (initRet != IGnssAntennaInfo::GnssAntennaInfoStatus::SUCCESS) { ALOGE("An error has been found on GnssAntennaInfoInterface::init, status=%d", static_cast<int32_t>(initRet)); return JNI_FALSE; } else { ALOGD("gnss antenna info has been enabled"); } return JNI_TRUE; return gnssAntennaInfoIface->setCallback(std::make_unique<gnss::GnssAntennaInfoCallback>()); } static jboolean android_location_gnss_hal_GnssNative_stop_antenna_info_listening(JNIEnv* /* env */, Loading @@ -1960,9 +1950,7 @@ static jboolean android_location_gnss_hal_GnssNative_stop_antenna_info_listening ALOGE("%s: IGnssAntennaInfo interface not available.", __func__); return JNI_FALSE; } auto result = gnssAntennaInfoIface->close(); return checkHidlReturn(result, "IGnssAntennaInfo close() failed."); return gnssAntennaInfoIface->close(); } static jboolean android_location_gnss_hal_GnssNative_is_measurement_supported(JNIEnv* env, jclass) { Loading
services/core/jni/gnss/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ cc_library_shared { "AGnssCallback.cpp", "AGnssRil.cpp", "AGnssRilCallback.cpp", "GnssAntennaInfo.cpp", "GnssAntennaInfoCallback.cpp", "GnssBatching.cpp", "GnssBatchingCallback.cpp", Loading
services/core/jni/gnss/GnssAntennaInfo.cpp 0 → 100644 +77 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // Define LOG_TAG before <log/log.h> to overwrite the default value. #define LOG_TAG "GnssAntennaInfoJni" #include "GnssAntennaInfo.h" #include "Utils.h" using IGnssAntennaInfoAidl = android::hardware::gnss::IGnssAntennaInfo; using IGnssAntennaInfo_V2_1 = android::hardware::gnss::V2_1::IGnssAntennaInfo; namespace android::gnss { // Implementation of GnssAntennaInfo (AIDL HAL) GnssAntennaInfoAidl::GnssAntennaInfoAidl(const sp<IGnssAntennaInfoAidl>& iGnssAntennaInfo) : mIGnssAntennaInfoAidl(iGnssAntennaInfo) { assert(mIGnssAntennaInfoAidl != nullptr); } jboolean GnssAntennaInfoAidl::setCallback( const std::unique_ptr<GnssAntennaInfoCallback>& callback) { auto status = mIGnssAntennaInfoAidl->setCallback(callback->getAidl()); return checkAidlStatus(status, "IGnssAntennaInfoAidl setCallback() failed."); } jboolean GnssAntennaInfoAidl::close() { auto status = mIGnssAntennaInfoAidl->close(); return checkAidlStatus(status, "IGnssAntennaInfoAidl close() failed"); } // Implementation of GnssAntennaInfo_V2_1 GnssAntennaInfo_V2_1::GnssAntennaInfo_V2_1(const sp<IGnssAntennaInfo_V2_1>& iGnssAntennaInfo) : mIGnssAntennaInfo_V2_1(iGnssAntennaInfo) { assert(mIGnssAntennaInfo_V2_1 != nullptr); } jboolean GnssAntennaInfo_V2_1::setCallback( const std::unique_ptr<GnssAntennaInfoCallback>& callback) { auto result = mIGnssAntennaInfo_V2_1->setCallback(callback->getV2_1()); if (!checkHidlReturn(result, "IGnssAntennaInfo_V2_1 setCallback() failed.")) { return JNI_FALSE; } IGnssAntennaInfo_V2_1::GnssAntennaInfoStatus initRet = result; if (initRet != IGnssAntennaInfo_V2_1::GnssAntennaInfoStatus::SUCCESS) { ALOGE("An error has been found on GnssAntennaInfoInterface::init, status=%d", static_cast<int32_t>(initRet)); return JNI_FALSE; } else { ALOGD("gnss antenna info v2_1 has been enabled"); } return JNI_TRUE; } jboolean GnssAntennaInfo_V2_1::close() { auto result = mIGnssAntennaInfo_V2_1->close(); return checkHidlReturn(result, "IGnssAntennaInfo_V2_1 close() failed."); } } // namespace android::gnss
services/core/jni/gnss/GnssAntennaInfo.h 0 → 100644 +65 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _ANDROID_SERVER_GNSS_GNSSANTENNAINFO_H #define _ANDROID_SERVER_GNSS_GNSSANTENNAINFO_H #pragma once #ifndef LOG_TAG #error LOG_TAG must be defined before including this file. #endif #include <android/hardware/gnss/2.1/IGnssAntennaInfo.h> #include <android/hardware/gnss/BnGnssAntennaInfo.h> #include <log/log.h> #include "GnssAntennaInfoCallback.h" #include "jni.h" namespace android::gnss { class GnssAntennaInfoInterface { public: virtual ~GnssAntennaInfoInterface() {} virtual jboolean setCallback(const std::unique_ptr<GnssAntennaInfoCallback>& callback) = 0; virtual jboolean close() = 0; }; class GnssAntennaInfoAidl : public GnssAntennaInfoInterface { public: GnssAntennaInfoAidl(const sp<android::hardware::gnss::IGnssAntennaInfo>& iGnssAntennaInfo); jboolean setCallback(const std::unique_ptr<GnssAntennaInfoCallback>& callback) override; jboolean close() override; private: const sp<android::hardware::gnss::IGnssAntennaInfo> mIGnssAntennaInfoAidl; }; class GnssAntennaInfo_V2_1 : public GnssAntennaInfoInterface { public: GnssAntennaInfo_V2_1( const sp<android::hardware::gnss::V2_1::IGnssAntennaInfo>& iGnssAntennaInfo); jboolean setCallback(const std::unique_ptr<GnssAntennaInfoCallback>& callback) override; jboolean close() override; private: const sp<android::hardware::gnss::V2_1::IGnssAntennaInfo> mIGnssAntennaInfo_V2_1; }; } // namespace android::gnss #endif // _ANDROID_SERVER_GNSS_GNSSANTENNAINFO_H
services/core/jni/gnss/GnssAntennaInfoCallback.cpp +100 −20 Original line number Diff line number Diff line Loading @@ -25,8 +25,10 @@ namespace android::gnss { using android::hardware::hidl_vec; using android::hardware::Return; using android::hardware::Void; using binder::Status; using IGnssAntennaInfoCallback = android::hardware::gnss::V2_1::IGnssAntennaInfoCallback; using IGnssAntennaInfoCallbackAidl = android::hardware::gnss::IGnssAntennaInfoCallback; using IGnssAntennaInfoCallback_V2_1 = android::hardware::gnss::V2_1::IGnssAntennaInfoCallback; namespace { jclass class_gnssAntennaInfoBuilder; Loading Loading @@ -92,14 +94,21 @@ void GnssAntennaInfo_class_init_once(JNIEnv* env, jclass& clazz) { class_doubleArray = (jclass)env->NewGlobalRef(doubleArrayClass); } Return<void> GnssAntennaInfoCallback::gnssAntennaInfoCb( const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos) { translateAndReportGnssAntennaInfo(gnssAntennaInfos); binder::Status GnssAntennaInfoCallbackAidl::gnssAntennaInfoCb( const std::vector<IGnssAntennaInfoCallbackAidl::GnssAntennaInfo>& gnssAntennaInfos) { GnssAntennaInfoCallbackUtil::translateAndReportGnssAntennaInfo(gnssAntennaInfos); return Status::ok(); } Return<void> GnssAntennaInfoCallback_V2_1::gnssAntennaInfoCb( const hidl_vec<IGnssAntennaInfoCallback_V2_1::GnssAntennaInfo>& gnssAntennaInfos) { GnssAntennaInfoCallbackUtil::translateAndReportGnssAntennaInfo(gnssAntennaInfos); return Void(); } jobjectArray GnssAntennaInfoCallback::translate2dDoubleArray( JNIEnv* env, const hidl_vec<IGnssAntennaInfoCallback::Row>& array) { template <template <class...> class T_vector, class T_info> jobjectArray GnssAntennaInfoCallbackUtil::translate2dDoubleArray(JNIEnv* env, const T_vector<T_info>& array) { jsize numRows = array.size(); if (numRows == 0) { // Empty array Loading @@ -124,8 +133,9 @@ jobjectArray GnssAntennaInfoCallback::translate2dDoubleArray( return returnArray; } jobject GnssAntennaInfoCallback::translateAllGnssAntennaInfos( JNIEnv* env, const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos) { template <template <class...> class T_vector, class T_info> jobject GnssAntennaInfoCallbackUtil::translateAllGnssAntennaInfos( JNIEnv* env, const T_vector<T_info>& gnssAntennaInfos) { jobject arrayList = env->NewObject(class_arrayList, method_arrayListCtor); // Create new ArrayList instance Loading @@ -141,8 +151,9 @@ jobject GnssAntennaInfoCallback::translateAllGnssAntennaInfos( return arrayList; } jobject GnssAntennaInfoCallback::translatePhaseCenterOffset( JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) { template <class T> jobject GnssAntennaInfoCallbackUtil::translatePhaseCenterOffset(JNIEnv* env, const T& gnssAntennaInfo) { jobject phaseCenterOffset = env->NewObject(class_phaseCenterOffset, method_phaseCenterOffsetCtor, gnssAntennaInfo.phaseCenterOffsetCoordinateMillimeters.x, Loading @@ -155,8 +166,42 @@ jobject GnssAntennaInfoCallback::translatePhaseCenterOffset( return phaseCenterOffset; } jobject GnssAntennaInfoCallback::translatePhaseCenterVariationCorrections( JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) { template <> jobject GnssAntennaInfoCallbackUtil::translatePhaseCenterVariationCorrections( JNIEnv* env, const IGnssAntennaInfoCallbackAidl::GnssAntennaInfo& gnssAntennaInfo) { if (gnssAntennaInfo.phaseCenterVariationCorrectionMillimeters.empty() || gnssAntennaInfo.phaseCenterVariationCorrectionUncertaintyMillimeters.empty()) { return NULL; } jobjectArray phaseCenterVariationCorrectionsArray = translate2dDoubleArray(env, gnssAntennaInfo.phaseCenterVariationCorrectionMillimeters); jobjectArray phaseCenterVariationCorrectionsUncertaintiesArray = translate2dDoubleArray(env, gnssAntennaInfo .phaseCenterVariationCorrectionUncertaintyMillimeters); if (phaseCenterVariationCorrectionsArray == NULL || phaseCenterVariationCorrectionsUncertaintiesArray == NULL) { env->DeleteLocalRef(phaseCenterVariationCorrectionsArray); env->DeleteLocalRef(phaseCenterVariationCorrectionsUncertaintiesArray); return NULL; } jobject phaseCenterVariationCorrections = env->NewObject(class_sphericalCorrections, method_sphericalCorrectionsCtor, phaseCenterVariationCorrectionsArray, phaseCenterVariationCorrectionsUncertaintiesArray); env->DeleteLocalRef(phaseCenterVariationCorrectionsArray); env->DeleteLocalRef(phaseCenterVariationCorrectionsUncertaintiesArray); return phaseCenterVariationCorrections; } template <> jobject GnssAntennaInfoCallbackUtil::translatePhaseCenterVariationCorrections( JNIEnv* env, const IGnssAntennaInfoCallback_V2_1::GnssAntennaInfo& gnssAntennaInfo) { if (gnssAntennaInfo.phaseCenterVariationCorrectionMillimeters == NULL || gnssAntennaInfo.phaseCenterVariationCorrectionUncertaintyMillimeters == NULL) { return NULL; Loading @@ -171,6 +216,8 @@ jobject GnssAntennaInfoCallback::translatePhaseCenterVariationCorrections( if (phaseCenterVariationCorrectionsArray == NULL || phaseCenterVariationCorrectionsUncertaintiesArray == NULL) { env->DeleteLocalRef(phaseCenterVariationCorrectionsArray); env->DeleteLocalRef(phaseCenterVariationCorrectionsUncertaintiesArray); return NULL; } Loading @@ -185,8 +232,37 @@ jobject GnssAntennaInfoCallback::translatePhaseCenterVariationCorrections( return phaseCenterVariationCorrections; } jobject GnssAntennaInfoCallback::translateSignalGainCorrections( JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) { template <> jobject GnssAntennaInfoCallbackUtil::translateSignalGainCorrections( JNIEnv* env, const IGnssAntennaInfoCallbackAidl::GnssAntennaInfo& gnssAntennaInfo) { if (gnssAntennaInfo.signalGainCorrectionDbi.empty() || gnssAntennaInfo.signalGainCorrectionUncertaintyDbi.empty()) { return NULL; } jobjectArray signalGainCorrectionsArray = translate2dDoubleArray(env, gnssAntennaInfo.signalGainCorrectionDbi); jobjectArray signalGainCorrectionsUncertaintiesArray = translate2dDoubleArray(env, gnssAntennaInfo.signalGainCorrectionUncertaintyDbi); if (signalGainCorrectionsArray == NULL || signalGainCorrectionsUncertaintiesArray == NULL) { env->DeleteLocalRef(signalGainCorrectionsArray); env->DeleteLocalRef(signalGainCorrectionsUncertaintiesArray); return NULL; } jobject signalGainCorrections = env->NewObject(class_sphericalCorrections, method_sphericalCorrectionsCtor, signalGainCorrectionsArray, signalGainCorrectionsUncertaintiesArray); env->DeleteLocalRef(signalGainCorrectionsArray); env->DeleteLocalRef(signalGainCorrectionsUncertaintiesArray); return signalGainCorrections; } template <> jobject GnssAntennaInfoCallbackUtil::translateSignalGainCorrections( JNIEnv* env, const IGnssAntennaInfoCallback_V2_1::GnssAntennaInfo& gnssAntennaInfo) { if (gnssAntennaInfo.signalGainCorrectionDbi == NULL || gnssAntennaInfo.signalGainCorrectionUncertaintyDbi == NULL) { return NULL; Loading @@ -197,6 +273,8 @@ jobject GnssAntennaInfoCallback::translateSignalGainCorrections( translate2dDoubleArray(env, gnssAntennaInfo.signalGainCorrectionUncertaintyDbi); if (signalGainCorrectionsArray == NULL || signalGainCorrectionsUncertaintiesArray == NULL) { env->DeleteLocalRef(signalGainCorrectionsArray); env->DeleteLocalRef(signalGainCorrectionsUncertaintiesArray); return NULL; } Loading @@ -210,8 +288,9 @@ jobject GnssAntennaInfoCallback::translateSignalGainCorrections( return signalGainCorrections; } jobject GnssAntennaInfoCallback::translateSingleGnssAntennaInfo( JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) { template <class T> jobject GnssAntennaInfoCallbackUtil::translateSingleGnssAntennaInfo(JNIEnv* env, const T& gnssAntennaInfo) { jobject phaseCenterOffset = translatePhaseCenterOffset(env, gnssAntennaInfo); // Nullable Loading @@ -228,7 +307,7 @@ jobject GnssAntennaInfoCallback::translateSingleGnssAntennaInfo( // Set fields callObjectMethodIgnoringResult(env, gnssAntennaInfoBuilderObject, method_gnssAntennaInfoBuilderSetCarrierFrequencyMHz, gnssAntennaInfo.carrierFrequencyMHz); getCarrierFrequencyMHz(gnssAntennaInfo)); callObjectMethodIgnoringResult(env, gnssAntennaInfoBuilderObject, method_gnssAntennaInfoBuilderSetPhaseCenterOffset, phaseCenterOffset); Loading @@ -251,8 +330,9 @@ jobject GnssAntennaInfoCallback::translateSingleGnssAntennaInfo( return gnssAntennaInfoObject; } void GnssAntennaInfoCallback::translateAndReportGnssAntennaInfo( const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos) { template <template <class...> class T_vector, class T_info> void GnssAntennaInfoCallbackUtil::translateAndReportGnssAntennaInfo( const T_vector<T_info>& gnssAntennaInfos) { JNIEnv* env = getJniEnv(); jobject arrayList = translateAllGnssAntennaInfos(env, gnssAntennaInfos); Loading @@ -262,7 +342,7 @@ void GnssAntennaInfoCallback::translateAndReportGnssAntennaInfo( env->DeleteLocalRef(arrayList); } void GnssAntennaInfoCallback::reportAntennaInfo(JNIEnv* env, const jobject antennaInfosArray) { void GnssAntennaInfoCallbackUtil::reportAntennaInfo(JNIEnv* env, const jobject antennaInfosArray) { env->CallVoidMethod(mCallbacksObj, method_reportAntennaInfo, antennaInfosArray); checkAndClearExceptionFromCallback(env, __FUNCTION__); } Loading