Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e61c0ceb authored by Shinru Han's avatar Shinru Han
Browse files

Add CorrelationVector AIDL in JNI

Test: on cuttlefish
Bug: 171516016
Change-Id: I81529b27f00b62680d9e2a77e3d8a5ed2cb3c409
parent a1435cb6
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -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<gnss::GnssMeasurementCallback>(
                                                     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<void*>(android_location_gnss_hal_GnssNative_is_measurement_supported)},
        {"native_start_measurement_collection", "(Z)Z",
        {"native_start_measurement_collection", "(ZZ)Z",
         reinterpret_cast<void*>(
                 android_location_gnss_hal_GnssNative_start_measurement_collection)},
        {"native_stop_measurement_collection", "()Z",
+20 −7
Original line number Diff line number Diff line
@@ -50,8 +50,9 @@ GnssMeasurement::GnssMeasurement(const sp<IGnssMeasurementInterface>& iGnssMeasu
      : mIGnssMeasurement(iGnssMeasurement) {}

jboolean GnssMeasurement::setCallback(const std::unique_ptr<GnssMeasurementCallback>& 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<IGnssMeasurement_V1_0>& iGns
      : mIGnssMeasurement_V1_0(iGnssMeasurement) {}

jboolean GnssMeasurement_V1_0::setCallback(const std::unique_ptr<GnssMeasurementCallback>& 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<IGnssMeasurement_V1_1>& iGns
      : GnssMeasurement_V1_0{iGnssMeasurement}, mIGnssMeasurement_V1_1(iGnssMeasurement) {}

jboolean GnssMeasurement_V1_1::setCallback(const std::unique_ptr<GnssMeasurementCallback>& 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<IGnssMeasurement_V2_0>& iGns
      : GnssMeasurement_V1_1{iGnssMeasurement}, mIGnssMeasurement_V2_0(iGnssMeasurement) {}

jboolean GnssMeasurement_V2_0::setCallback(const std::unique_ptr<GnssMeasurementCallback>& 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<IGnssMeasurement_V2_1>& iGns
      : GnssMeasurement_V2_0{iGnssMeasurement}, mIGnssMeasurement_V2_1(iGnssMeasurement) {}

jboolean GnssMeasurement_V2_1::setCallback(const std::unique_ptr<GnssMeasurementCallback>& 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;
+6 −6
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ class GnssMeasurementInterface {
public:
    virtual ~GnssMeasurementInterface() {}
    virtual jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& 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<android::hardware::gnss::IGnssMeasurementInterface>& iGnssMeasurement);
    jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
                         bool enableFullTracking) override;
                         bool enableFullTracking, bool enableCorrVecOutputs) override;
    jboolean close() override;

private:
@@ -58,7 +58,7 @@ public:
    GnssMeasurement_V1_0(
            const sp<android::hardware::gnss::V1_0::IGnssMeasurement>& iGnssMeasurement);
    jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
                         bool enableFullTracking) override;
                         bool enableFullTracking, bool enableCorrVecOutputs) override;
    jboolean close() override;

private:
@@ -70,7 +70,7 @@ public:
    GnssMeasurement_V1_1(
            const sp<android::hardware::gnss::V1_1::IGnssMeasurement>& iGnssMeasurement);
    jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
                         bool enableFullTracking) override;
                         bool enableFullTracking, bool enableCorrVecOutputs) override;

private:
    const sp<android::hardware::gnss::V1_1::IGnssMeasurement> mIGnssMeasurement_V1_1;
@@ -81,7 +81,7 @@ public:
    GnssMeasurement_V2_0(
            const sp<android::hardware::gnss::V2_0::IGnssMeasurement>& iGnssMeasurement);
    jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
                         bool enableFullTracking) override;
                         bool enableFullTracking, bool enableCorrVecOutputs) override;

private:
    const sp<android::hardware::gnss::V2_0::IGnssMeasurement> mIGnssMeasurement_V2_0;
@@ -92,7 +92,7 @@ public:
    GnssMeasurement_V2_1(
            const sp<android::hardware::gnss::V2_1::IGnssMeasurement>& iGnssMeasurement);
    jboolean setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
                         bool enableFullTracking) override;
                         bool enableFullTracking, bool enableCorrVecOutputs) override;

private:
    const sp<android::hardware::gnss::V2_1::IGnssMeasurement> mIGnssMeasurement_V2_1;
+83 −2
Original line number Diff line number Diff line
@@ -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, "<init>", "(DDD)V");

    jclass correlationVectorBuilder = env->FindClass("android/location/CorrelationVector$Builder");
    class_correlationVectorBuilder = (jclass)env->NewGlobalRef(correlationVectorBuilder);
    method_correlationVectorBuilderCtor =
            env->GetMethodID(class_correlationVectorBuilder, "<init>", "()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, "<init>", "()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<uint32_t>(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<int32_t>& magnitudeVector = correlationVector.magnitude;

            jsize numMagnitude = magnitudeVector.size();
            jintArray magnitudeArray = env->NewIntArray(numMagnitude);
            env->SetIntArrayRegion(magnitudeArray, 0, numMagnitude,
                                   reinterpret_cast<const jint*>(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);