diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index 35aad3e268ed2..b2d6b15a4930d 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -2709,7 +2709,7 @@ static jboolean android_location_gnss_hal_GnssNative_is_measurement_supported(JN } static jboolean android_location_gnss_hal_GnssNative_start_measurement_collection( - JNIEnv* /* env */, jclass, jboolean enableFullTracking) { + JNIEnv* /* env */, jclass, jboolean enableFullTracking, jboolean enableCorrVecOutputs) { if (gnssMeasurementIface == nullptr) { ALOGE("%s: IGnssMeasurement interface not available.", __func__); return JNI_FALSE; @@ -2717,7 +2717,7 @@ static jboolean android_location_gnss_hal_GnssNative_start_measurement_collectio return gnssMeasurementIface->setCallback(std::make_unique( mCallbacksObj), - enableFullTracking); + enableFullTracking, enableCorrVecOutputs); } static jboolean android_location_gnss_hal_GnssNative_stop_measurement_collection(JNIEnv* env, @@ -3211,7 +3211,7 @@ static const JNINativeMethod sMeasurementMethods[] = { /* name, signature, funcPtr */ {"native_is_measurement_supported", "()Z", reinterpret_cast(android_location_gnss_hal_GnssNative_is_measurement_supported)}, - {"native_start_measurement_collection", "(Z)Z", + {"native_start_measurement_collection", "(ZZ)Z", reinterpret_cast( android_location_gnss_hal_GnssNative_start_measurement_collection)}, {"native_stop_measurement_collection", "()Z", diff --git a/services/core/jni/gnss/GnssMeasurement.cpp b/services/core/jni/gnss/GnssMeasurement.cpp index 2261c38fb185b..663d839ff1591 100644 --- a/services/core/jni/gnss/GnssMeasurement.cpp +++ b/services/core/jni/gnss/GnssMeasurement.cpp @@ -50,8 +50,9 @@ GnssMeasurement::GnssMeasurement(const sp& iGnssMeasu : mIGnssMeasurement(iGnssMeasurement) {} jboolean GnssMeasurement::setCallback(const std::unique_ptr& callback, - bool enableFullTracking) { - auto status = mIGnssMeasurement->setCallback(callback->getAidl(), enableFullTracking); + bool enableFullTracking, bool enableCorrVecOutputs) { + auto status = mIGnssMeasurement->setCallback(callback->getAidl(), enableFullTracking, + enableCorrVecOutputs); return checkAidlStatus(status, "IGnssMeasurement setCallback() failed."); } @@ -66,9 +67,12 @@ GnssMeasurement_V1_0::GnssMeasurement_V1_0(const sp& iGns : mIGnssMeasurement_V1_0(iGnssMeasurement) {} jboolean GnssMeasurement_V1_0::setCallback(const std::unique_ptr& callback, - bool enableFullTracking) { + bool enableFullTracking, bool enableCorrVecOutputs) { if (enableFullTracking == true) { - ALOGW("Full tracking is mode not supported in 1.0 GNSS HAL."); + ALOGW("Full tracking mode is not supported in 1.0 GNSS HAL."); + } + if (enableCorrVecOutputs == true) { + ALOGW("Correlation vector output is not supported in 1.0 GNSS HAL."); } auto status = mIGnssMeasurement_V1_0->setCallback(callback->getHidl()); if (!checkHidlReturn(status, "IGnssMeasurement setCallback() failed.")) { @@ -89,7 +93,10 @@ GnssMeasurement_V1_1::GnssMeasurement_V1_1(const sp& iGns : GnssMeasurement_V1_0{iGnssMeasurement}, mIGnssMeasurement_V1_1(iGnssMeasurement) {} jboolean GnssMeasurement_V1_1::setCallback(const std::unique_ptr& callback, - bool enableFullTracking) { + bool enableFullTracking, bool enableCorrVecOutputs) { + if (enableCorrVecOutputs == true) { + ALOGW("Correlation vector output is not supported in 1.1 GNSS HAL."); + } auto status = mIGnssMeasurement_V1_1->setCallback_1_1(callback->getHidl(), enableFullTracking); if (!checkHidlReturn(status, "IGnssMeasurement setCallback_V1_1() failed.")) { return JNI_FALSE; @@ -104,7 +111,10 @@ GnssMeasurement_V2_0::GnssMeasurement_V2_0(const sp& iGns : GnssMeasurement_V1_1{iGnssMeasurement}, mIGnssMeasurement_V2_0(iGnssMeasurement) {} jboolean GnssMeasurement_V2_0::setCallback(const std::unique_ptr& callback, - bool enableFullTracking) { + bool enableFullTracking, bool enableCorrVecOutputs) { + if (enableCorrVecOutputs == true) { + ALOGW("Correlation vector output is not supported in 2.0 GNSS HAL."); + } auto status = mIGnssMeasurement_V2_0->setCallback_2_0(callback->getHidl(), enableFullTracking); if (!checkHidlReturn(status, "IGnssMeasurement setCallback_2_0() failed.")) { return JNI_FALSE; @@ -119,7 +129,10 @@ GnssMeasurement_V2_1::GnssMeasurement_V2_1(const sp& iGns : GnssMeasurement_V2_0{iGnssMeasurement}, mIGnssMeasurement_V2_1(iGnssMeasurement) {} jboolean GnssMeasurement_V2_1::setCallback(const std::unique_ptr& callback, - bool enableFullTracking) { + bool enableFullTracking, bool enableCorrVecOutputs) { + if (enableCorrVecOutputs == true) { + ALOGW("Correlation vector output is not supported in 2.1 GNSS HAL."); + } auto status = mIGnssMeasurement_V2_1->setCallback_2_1(callback->getHidl(), enableFullTracking); if (!checkHidlReturn(status, "IGnssMeasurement setCallback_2_1() failed.")) { return JNI_FALSE; diff --git a/services/core/jni/gnss/GnssMeasurement.h b/services/core/jni/gnss/GnssMeasurement.h index e64336fb67ac7..f0752cd3ab5b2 100644 --- a/services/core/jni/gnss/GnssMeasurement.h +++ b/services/core/jni/gnss/GnssMeasurement.h @@ -38,7 +38,7 @@ class GnssMeasurementInterface { public: virtual ~GnssMeasurementInterface() {} virtual jboolean setCallback(const std::unique_ptr& callback, - bool enableFullTracking) = 0; + bool enableFullTracking, bool enableCorrVecOutputs) = 0; virtual jboolean close() = 0; }; @@ -46,7 +46,7 @@ class GnssMeasurement : public GnssMeasurementInterface { public: GnssMeasurement(const sp& iGnssMeasurement); jboolean setCallback(const std::unique_ptr& callback, - bool enableFullTracking) override; + bool enableFullTracking, bool enableCorrVecOutputs) override; jboolean close() override; private: @@ -58,7 +58,7 @@ public: GnssMeasurement_V1_0( const sp& iGnssMeasurement); jboolean setCallback(const std::unique_ptr& callback, - bool enableFullTracking) override; + bool enableFullTracking, bool enableCorrVecOutputs) override; jboolean close() override; private: @@ -70,7 +70,7 @@ public: GnssMeasurement_V1_1( const sp& iGnssMeasurement); jboolean setCallback(const std::unique_ptr& callback, - bool enableFullTracking) override; + bool enableFullTracking, bool enableCorrVecOutputs) override; private: const sp mIGnssMeasurement_V1_1; @@ -81,7 +81,7 @@ public: GnssMeasurement_V2_0( const sp& iGnssMeasurement); jboolean setCallback(const std::unique_ptr& callback, - bool enableFullTracking) override; + bool enableFullTracking, bool enableCorrVecOutputs) override; private: const sp mIGnssMeasurement_V2_0; @@ -92,7 +92,7 @@ public: GnssMeasurement_V2_1( const sp& iGnssMeasurement); jboolean setCallback(const std::unique_ptr& callback, - bool enableFullTracking) override; + bool enableFullTracking, bool enableCorrVecOutputs) override; private: const sp mIGnssMeasurement_V2_1; diff --git a/services/core/jni/gnss/GnssMeasurementCallback.cpp b/services/core/jni/gnss/GnssMeasurementCallback.cpp index 8cba77328248a..757381dff80af 100644 --- a/services/core/jni/gnss/GnssMeasurementCallback.cpp +++ b/services/core/jni/gnss/GnssMeasurementCallback.cpp @@ -21,21 +21,33 @@ namespace android::gnss { using binder::Status; +using hardware::gnss::CorrelationVector; using hardware::gnss::ElapsedRealtime; using hardware::gnss::GnssClock; using hardware::gnss::GnssData; using hardware::gnss::GnssMeasurement; using hardware::gnss::SatellitePvt; +jclass class_arrayList; +jclass class_clockInfo; +jclass class_correlationVectorBuilder; jclass class_gnssMeasurementsEvent; jclass class_gnssMeasurement; jclass class_gnssClock; -jclass class_satellitePvtBuilder; jclass class_positionEcef; +jclass class_satellitePvtBuilder; jclass class_velocityEcef; -jclass class_clockInfo; +jmethodID method_arrayListAdd; +jmethodID method_arrayListCtor; +jmethodID method_correlationVectorBuilderBuild; +jmethodID method_correlationVectorBuilderCtor; +jmethodID method_correlationVectorBuilderSetFrequencyOffsetMetersPerSecond; +jmethodID method_correlationVectorBuilderSetMagnitude; +jmethodID method_correlationVectorBuilderSetSamplingStartMeters; +jmethodID method_correlationVectorBuilderSetSamplingWidthMeters; jmethodID method_gnssMeasurementsEventCtor; +jmethodID method_gnssMeasurementsSetCorrelationVectors; jmethodID method_gnssMeasurementsSetSatellitePvt; jmethodID method_gnssClockCtor; jmethodID method_gnssMeasurementCtor; @@ -66,6 +78,9 @@ void GnssMeasurement_class_init_once(JNIEnv* env, jclass& clazz) { method_gnssMeasurementsSetSatellitePvt = env->GetMethodID(class_gnssMeasurement, "setSatellitePvt", "(Landroid/location/SatellitePvt;)V"); + method_gnssMeasurementsSetCorrelationVectors = + env->GetMethodID(class_gnssMeasurement, "setCorrelationVectors", + "(Ljava/util/Collection;)V"); jclass gnssClockClass = env->FindClass("android/location/GnssClock"); class_gnssClock = (jclass)env->NewGlobalRef(gnssClockClass); @@ -106,6 +121,31 @@ void GnssMeasurement_class_init_once(JNIEnv* env, jclass& clazz) { jclass clockInfoClass = env->FindClass("android/location/SatellitePvt$ClockInfo"); class_clockInfo = (jclass)env->NewGlobalRef(clockInfoClass); method_clockInfo = env->GetMethodID(class_clockInfo, "", "(DDD)V"); + + jclass correlationVectorBuilder = env->FindClass("android/location/CorrelationVector$Builder"); + class_correlationVectorBuilder = (jclass)env->NewGlobalRef(correlationVectorBuilder); + method_correlationVectorBuilderCtor = + env->GetMethodID(class_correlationVectorBuilder, "", "()V"); + method_correlationVectorBuilderSetMagnitude = + env->GetMethodID(class_correlationVectorBuilder, "setMagnitude", + "([I)Landroid/location/CorrelationVector$Builder;"); + method_correlationVectorBuilderSetFrequencyOffsetMetersPerSecond = + env->GetMethodID(class_correlationVectorBuilder, "setFrequencyOffsetMetersPerSecond", + "(I)Landroid/location/CorrelationVector$Builder;"); + method_correlationVectorBuilderSetSamplingStartMeters = + env->GetMethodID(class_correlationVectorBuilder, "setSamplingStartMeters", + "(D)Landroid/location/CorrelationVector$Builder;"); + method_correlationVectorBuilderSetSamplingWidthMeters = + env->GetMethodID(class_correlationVectorBuilder, "setSamplingWidthMeters", + "(D)Landroid/location/CorrelationVector$Builder;"); + method_correlationVectorBuilderBuild = + env->GetMethodID(class_correlationVectorBuilder, "build", + "()Landroid/location/CorrelationVector;"); + + jclass arrayListClass = env->FindClass("java/util/ArrayList"); + class_arrayList = (jclass)env->NewGlobalRef(arrayListClass); + method_arrayListCtor = env->GetMethodID(class_arrayList, "", "()V"); + method_arrayListAdd = env->GetMethodID(class_arrayList, "add", "(Ljava/lang/Object;)Z"); } void setMeasurementData(JNIEnv* env, jobject& callbacksObj, jobject clock, @@ -310,6 +350,47 @@ void GnssMeasurementCallbackAidl::translateSingleGnssMeasurement(JNIEnv* env, env->DeleteLocalRef(satellitePvtObject); } + if (measurement.flags & static_cast(GnssMeasurement::HAS_CORRELATION_VECTOR)) { + jobject correlationVectorList = env->NewObject(class_arrayList, method_arrayListCtor); + for (uint16_t i = 0; i < measurement.correlationVectors.size(); ++i) { + const CorrelationVector& correlationVector = measurement.correlationVectors[i]; + const std::vector& magnitudeVector = correlationVector.magnitude; + + jsize numMagnitude = magnitudeVector.size(); + jintArray magnitudeArray = env->NewIntArray(numMagnitude); + env->SetIntArrayRegion(magnitudeArray, 0, numMagnitude, + reinterpret_cast(magnitudeVector.data())); + + jobject correlationVectorBuilderObject = + env->NewObject(class_correlationVectorBuilder, + method_correlationVectorBuilderCtor); + env->CallObjectMethod(correlationVectorBuilderObject, + method_correlationVectorBuilderSetMagnitude, magnitudeArray); + env->CallObjectMethod(correlationVectorBuilderObject, + method_correlationVectorBuilderSetFrequencyOffsetMetersPerSecond, + correlationVector.frequencyOffsetMps); + env->CallObjectMethod(correlationVectorBuilderObject, + method_correlationVectorBuilderSetSamplingStartMeters, + correlationVector.samplingStartM); + env->CallObjectMethod(correlationVectorBuilderObject, + method_correlationVectorBuilderSetSamplingWidthMeters, + correlationVector.samplingWidthM); + jobject correlationVectorObject = + env->CallObjectMethod(correlationVectorBuilderObject, + method_correlationVectorBuilderBuild); + + env->CallBooleanMethod(correlationVectorList, method_arrayListAdd, + correlationVectorObject); + + env->DeleteLocalRef(magnitudeArray); + env->DeleteLocalRef(correlationVectorBuilderObject); + env->DeleteLocalRef(correlationVectorObject); + } + env->CallVoidMethod(object.get(), method_gnssMeasurementsSetCorrelationVectors, + correlationVectorList); + env->DeleteLocalRef(correlationVectorList); + } + jstring codeType = env->NewStringUTF(measurement.signalType.codeType.c_str()); SET(CodeType, codeType); env->DeleteLocalRef(codeType);