Add CorrelationVector AIDL in JNI
Test: on cuttlefish Bug: 171516016 Change-Id: I81529b27f00b62680d9e2a77e3d8a5ed2cb3c409
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user