Loading services/core/jni/com_android_server_location_GnssLocationProvider.cpp +101 −64 Original line number Diff line number Diff line Loading @@ -166,7 +166,10 @@ using android::hardware::gnss::V2_0::ElapsedRealtimeFlags; using MeasurementCorrections_V1_0 = android::hardware::gnss::measurement_corrections::V1_0::MeasurementCorrections; using MeasurementCorrections_V1_1 = android::hardware::gnss::measurement_corrections::V1_1::MeasurementCorrections; using android::hardware::gnss::measurement_corrections::V1_0::SingleSatCorrection; using SingleSatCorrection_V1_0 = android::hardware::gnss::measurement_corrections::V1_0::SingleSatCorrection; using SingleSatCorrection_V1_1 = android::hardware::gnss::measurement_corrections::V1_1::SingleSatCorrection; using android::hardware::gnss::measurement_corrections::V1_0::ReflectingPlane; using android::hidl::base::V1_0::IBase; Loading Loading @@ -3124,66 +3127,34 @@ static jboolean return JNI_FALSE; } static jboolean android_location_GnssMeasurementCorrectionsProvider_inject_gnss_measurement_corrections( JNIEnv* env, jobject obj /* clazz*/, jobject correctionsObj) { if (gnssCorrectionsIface_V1_0 == nullptr && gnssCorrectionsIface_V1_1 == nullptr) { ALOGW("Trying to inject GNSS measurement corrections on a chipset that does not" " support them."); return JNI_FALSE; } jobject singleSatCorrectionList = env->CallObjectMethod(correctionsObj, method_correctionsGetSingleSatCorrectionList); auto len = (singleSatCorrectionList == nullptr) ? 0 : env->CallIntMethod(singleSatCorrectionList, method_listSize); if (len == 0) { ALOGI("Empty correction list injected....Returning with no HAL injection"); return JNI_TRUE; } hidl_vec<SingleSatCorrection> list(len); for (uint16_t i = 0; i < len; ++i) { jobject singleSatCorrectionObj = env->CallObjectMethod( singleSatCorrectionList, method_correctionListGet, i); jint correctionFlags = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatFlags); jint constType = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatConstType); jint satId = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatId); jfloat carrierFreqHz = env->CallFloatMethod( singleSatCorrectionObj, method_correctionSatCarrierFreq); jfloat probSatIsLos = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatIsLosProb); jfloat eplMeters = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatEpl); jfloat eplUncMeters = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatEplUnc); static SingleSatCorrection_V1_0 getSingleSatCorrection_1_0_withoutConstellation( JNIEnv* env, jobject singleSatCorrectionObj) { jint correctionFlags = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatFlags); jint satId = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatId); jfloat carrierFreqHz = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatCarrierFreq); jfloat probSatIsLos = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatIsLosProb); jfloat eplMeters = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatEpl); jfloat eplUncMeters = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatEplUnc); uint16_t corrFlags = static_cast<uint16_t>(correctionFlags); jobject reflectingPlaneObj; bool has_ref_plane = (corrFlags & GnssSingleSatCorrectionFlags::HAS_REFLECTING_PLANE) != 0; if (has_ref_plane) { reflectingPlaneObj = env->CallObjectMethod( singleSatCorrectionObj, method_correctionSatRefPlane); reflectingPlaneObj = env->CallObjectMethod(singleSatCorrectionObj, method_correctionSatRefPlane); } ReflectingPlane reflectingPlane; if (has_ref_plane) { jdouble latitudeDegreesRefPlane = env->CallDoubleMethod( reflectingPlaneObj, method_correctionPlaneLatDeg); jdouble longitudeDegreesRefPlane = env->CallDoubleMethod( reflectingPlaneObj, method_correctionPlaneLngDeg); jdouble altitudeDegreesRefPlane = env->CallDoubleMethod( reflectingPlaneObj, method_correctionPlaneAltDeg); jdouble azimuthDegreeRefPlane = env->CallDoubleMethod( reflectingPlaneObj, method_correctionPlaneAzimDeg); jdouble latitudeDegreesRefPlane = env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneLatDeg); jdouble longitudeDegreesRefPlane = env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneLngDeg); jdouble altitudeDegreesRefPlane = env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneAltDeg); jdouble azimuthDegreeRefPlane = env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneAzimDeg); reflectingPlane = { .latitudeDegrees = latitudeDegreesRefPlane, .longitudeDegrees = longitudeDegreesRefPlane, Loading @@ -3192,9 +3163,8 @@ static jboolean }; } SingleSatCorrection singleSatCorrection = { SingleSatCorrection_V1_0 singleSatCorrection = { .singleSatCorrectionFlags = corrFlags, .constellation = static_cast<GnssConstellationType_V1_0>(constType), .svid = static_cast<uint16_t>(satId), .carrierFrequencyHz = carrierFreqHz, .probSatIsLos = probSatIsLos, Loading @@ -3202,8 +3172,68 @@ static jboolean .excessPathLengthUncertaintyMeters = eplUncMeters, .reflectingPlane = reflectingPlane, }; return singleSatCorrection; } static void getSingleSatCorrectionList_1_1(JNIEnv* env, jobject singleSatCorrectionList, hidl_vec<SingleSatCorrection_V1_1>& list) { for (uint16_t i = 0; i < list.size(); ++i) { jobject singleSatCorrectionObj = env->CallObjectMethod(singleSatCorrectionList, method_correctionListGet, i); SingleSatCorrection_V1_0 singleSatCorrection_1_0 = getSingleSatCorrection_1_0_withoutConstellation(env, singleSatCorrectionObj); jint constType = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatConstType); SingleSatCorrection_V1_1 singleSatCorrection_1_1 = { .v1_0 = singleSatCorrection_1_0, .constellation = static_cast<GnssConstellationType_V2_0>(constType), }; list[i] = singleSatCorrection_1_1; } } static void getSingleSatCorrectionList_1_0(JNIEnv* env, jobject singleSatCorrectionList, hidl_vec<SingleSatCorrection_V1_0>& list) { for (uint16_t i = 0; i < list.size(); ++i) { jobject singleSatCorrectionObj = env->CallObjectMethod(singleSatCorrectionList, method_correctionListGet, i); SingleSatCorrection_V1_0 singleSatCorrection = getSingleSatCorrection_1_0_withoutConstellation(env, singleSatCorrectionObj); jint constType = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatConstType); singleSatCorrection.constellation = static_cast<GnssConstellationType_V1_0>(constType), list[i] = singleSatCorrection; } } static jboolean android_location_GnssMeasurementCorrectionsProvider_inject_gnss_measurement_corrections( JNIEnv* env, jobject obj /* clazz*/, jobject correctionsObj) { if (gnssCorrectionsIface_V1_0 == nullptr && gnssCorrectionsIface_V1_1 == nullptr) { ALOGW("Trying to inject GNSS measurement corrections on a chipset that does not" " support them."); return JNI_FALSE; } jobject singleSatCorrectionList = env->CallObjectMethod(correctionsObj, method_correctionsGetSingleSatCorrectionList); auto len = (singleSatCorrectionList == nullptr) ? 0 : env->CallIntMethod(singleSatCorrectionList, method_listSize); if (len == 0) { ALOGI("Empty correction list injected....Returning with no HAL injection"); return JNI_TRUE; } jdouble latitudeDegreesCorr = env->CallDoubleMethod( correctionsObj, method_correctionsGetLatitudeDegrees); Loading @@ -3225,7 +3255,6 @@ static jboolean .horizontalPositionUncertaintyMeters = horizontalPositionUncertaintyMeters, .verticalPositionUncertaintyMeters = verticalPositionUncertaintyMeters, .toaGpsNanosecondsOfWeek = static_cast<uint64_t>(toaGpsNanosOfWeek), .satCorrections = list, }; if (gnssCorrectionsIface_V1_1 != nullptr) { Loading @@ -3237,17 +3266,25 @@ static jboolean jfloat environmentBearingUncertaintyDegreesCorr = env->CallFloatMethod( correctionsObj, method_correctionsGetEnvironmentBearingUncertaintyDegrees); hidl_vec<SingleSatCorrection_V1_1> list(len); getSingleSatCorrectionList_1_1(env, singleSatCorrectionList, list); MeasurementCorrections_V1_1 measurementCorrections_1_1 = { .v1_0 = measurementCorrections_1_0, .hasEnvironmentBearing = static_cast<bool>(hasEnvironmentBearingCorr), .environmentBearingDegrees = environmentBearingDegreesCorr, .environmentBearingUncertaintyDegrees = environmentBearingUncertaintyDegreesCorr, .satCorrections = list, }; auto result = gnssCorrectionsIface_V1_1->setCorrections_1_1(measurementCorrections_1_1); return checkHidlReturn(result, "IMeasurementCorrections 1.1 setCorrections() failed."); } hidl_vec<SingleSatCorrection_V1_0> list(len); getSingleSatCorrectionList_1_0(env, singleSatCorrectionList, list); measurementCorrections_1_0.satCorrections = list; auto result = gnssCorrectionsIface_V1_0->setCorrections(measurementCorrections_1_0); return checkHidlReturn(result, "IMeasurementCorrections 1.0 setCorrections() failed."); } Loading Loading
services/core/jni/com_android_server_location_GnssLocationProvider.cpp +101 −64 Original line number Diff line number Diff line Loading @@ -166,7 +166,10 @@ using android::hardware::gnss::V2_0::ElapsedRealtimeFlags; using MeasurementCorrections_V1_0 = android::hardware::gnss::measurement_corrections::V1_0::MeasurementCorrections; using MeasurementCorrections_V1_1 = android::hardware::gnss::measurement_corrections::V1_1::MeasurementCorrections; using android::hardware::gnss::measurement_corrections::V1_0::SingleSatCorrection; using SingleSatCorrection_V1_0 = android::hardware::gnss::measurement_corrections::V1_0::SingleSatCorrection; using SingleSatCorrection_V1_1 = android::hardware::gnss::measurement_corrections::V1_1::SingleSatCorrection; using android::hardware::gnss::measurement_corrections::V1_0::ReflectingPlane; using android::hidl::base::V1_0::IBase; Loading Loading @@ -3124,66 +3127,34 @@ static jboolean return JNI_FALSE; } static jboolean android_location_GnssMeasurementCorrectionsProvider_inject_gnss_measurement_corrections( JNIEnv* env, jobject obj /* clazz*/, jobject correctionsObj) { if (gnssCorrectionsIface_V1_0 == nullptr && gnssCorrectionsIface_V1_1 == nullptr) { ALOGW("Trying to inject GNSS measurement corrections on a chipset that does not" " support them."); return JNI_FALSE; } jobject singleSatCorrectionList = env->CallObjectMethod(correctionsObj, method_correctionsGetSingleSatCorrectionList); auto len = (singleSatCorrectionList == nullptr) ? 0 : env->CallIntMethod(singleSatCorrectionList, method_listSize); if (len == 0) { ALOGI("Empty correction list injected....Returning with no HAL injection"); return JNI_TRUE; } hidl_vec<SingleSatCorrection> list(len); for (uint16_t i = 0; i < len; ++i) { jobject singleSatCorrectionObj = env->CallObjectMethod( singleSatCorrectionList, method_correctionListGet, i); jint correctionFlags = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatFlags); jint constType = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatConstType); jint satId = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatId); jfloat carrierFreqHz = env->CallFloatMethod( singleSatCorrectionObj, method_correctionSatCarrierFreq); jfloat probSatIsLos = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatIsLosProb); jfloat eplMeters = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatEpl); jfloat eplUncMeters = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatEplUnc); static SingleSatCorrection_V1_0 getSingleSatCorrection_1_0_withoutConstellation( JNIEnv* env, jobject singleSatCorrectionObj) { jint correctionFlags = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatFlags); jint satId = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatId); jfloat carrierFreqHz = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatCarrierFreq); jfloat probSatIsLos = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatIsLosProb); jfloat eplMeters = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatEpl); jfloat eplUncMeters = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatEplUnc); uint16_t corrFlags = static_cast<uint16_t>(correctionFlags); jobject reflectingPlaneObj; bool has_ref_plane = (corrFlags & GnssSingleSatCorrectionFlags::HAS_REFLECTING_PLANE) != 0; if (has_ref_plane) { reflectingPlaneObj = env->CallObjectMethod( singleSatCorrectionObj, method_correctionSatRefPlane); reflectingPlaneObj = env->CallObjectMethod(singleSatCorrectionObj, method_correctionSatRefPlane); } ReflectingPlane reflectingPlane; if (has_ref_plane) { jdouble latitudeDegreesRefPlane = env->CallDoubleMethod( reflectingPlaneObj, method_correctionPlaneLatDeg); jdouble longitudeDegreesRefPlane = env->CallDoubleMethod( reflectingPlaneObj, method_correctionPlaneLngDeg); jdouble altitudeDegreesRefPlane = env->CallDoubleMethod( reflectingPlaneObj, method_correctionPlaneAltDeg); jdouble azimuthDegreeRefPlane = env->CallDoubleMethod( reflectingPlaneObj, method_correctionPlaneAzimDeg); jdouble latitudeDegreesRefPlane = env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneLatDeg); jdouble longitudeDegreesRefPlane = env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneLngDeg); jdouble altitudeDegreesRefPlane = env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneAltDeg); jdouble azimuthDegreeRefPlane = env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneAzimDeg); reflectingPlane = { .latitudeDegrees = latitudeDegreesRefPlane, .longitudeDegrees = longitudeDegreesRefPlane, Loading @@ -3192,9 +3163,8 @@ static jboolean }; } SingleSatCorrection singleSatCorrection = { SingleSatCorrection_V1_0 singleSatCorrection = { .singleSatCorrectionFlags = corrFlags, .constellation = static_cast<GnssConstellationType_V1_0>(constType), .svid = static_cast<uint16_t>(satId), .carrierFrequencyHz = carrierFreqHz, .probSatIsLos = probSatIsLos, Loading @@ -3202,8 +3172,68 @@ static jboolean .excessPathLengthUncertaintyMeters = eplUncMeters, .reflectingPlane = reflectingPlane, }; return singleSatCorrection; } static void getSingleSatCorrectionList_1_1(JNIEnv* env, jobject singleSatCorrectionList, hidl_vec<SingleSatCorrection_V1_1>& list) { for (uint16_t i = 0; i < list.size(); ++i) { jobject singleSatCorrectionObj = env->CallObjectMethod(singleSatCorrectionList, method_correctionListGet, i); SingleSatCorrection_V1_0 singleSatCorrection_1_0 = getSingleSatCorrection_1_0_withoutConstellation(env, singleSatCorrectionObj); jint constType = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatConstType); SingleSatCorrection_V1_1 singleSatCorrection_1_1 = { .v1_0 = singleSatCorrection_1_0, .constellation = static_cast<GnssConstellationType_V2_0>(constType), }; list[i] = singleSatCorrection_1_1; } } static void getSingleSatCorrectionList_1_0(JNIEnv* env, jobject singleSatCorrectionList, hidl_vec<SingleSatCorrection_V1_0>& list) { for (uint16_t i = 0; i < list.size(); ++i) { jobject singleSatCorrectionObj = env->CallObjectMethod(singleSatCorrectionList, method_correctionListGet, i); SingleSatCorrection_V1_0 singleSatCorrection = getSingleSatCorrection_1_0_withoutConstellation(env, singleSatCorrectionObj); jint constType = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatConstType); singleSatCorrection.constellation = static_cast<GnssConstellationType_V1_0>(constType), list[i] = singleSatCorrection; } } static jboolean android_location_GnssMeasurementCorrectionsProvider_inject_gnss_measurement_corrections( JNIEnv* env, jobject obj /* clazz*/, jobject correctionsObj) { if (gnssCorrectionsIface_V1_0 == nullptr && gnssCorrectionsIface_V1_1 == nullptr) { ALOGW("Trying to inject GNSS measurement corrections on a chipset that does not" " support them."); return JNI_FALSE; } jobject singleSatCorrectionList = env->CallObjectMethod(correctionsObj, method_correctionsGetSingleSatCorrectionList); auto len = (singleSatCorrectionList == nullptr) ? 0 : env->CallIntMethod(singleSatCorrectionList, method_listSize); if (len == 0) { ALOGI("Empty correction list injected....Returning with no HAL injection"); return JNI_TRUE; } jdouble latitudeDegreesCorr = env->CallDoubleMethod( correctionsObj, method_correctionsGetLatitudeDegrees); Loading @@ -3225,7 +3255,6 @@ static jboolean .horizontalPositionUncertaintyMeters = horizontalPositionUncertaintyMeters, .verticalPositionUncertaintyMeters = verticalPositionUncertaintyMeters, .toaGpsNanosecondsOfWeek = static_cast<uint64_t>(toaGpsNanosOfWeek), .satCorrections = list, }; if (gnssCorrectionsIface_V1_1 != nullptr) { Loading @@ -3237,17 +3266,25 @@ static jboolean jfloat environmentBearingUncertaintyDegreesCorr = env->CallFloatMethod( correctionsObj, method_correctionsGetEnvironmentBearingUncertaintyDegrees); hidl_vec<SingleSatCorrection_V1_1> list(len); getSingleSatCorrectionList_1_1(env, singleSatCorrectionList, list); MeasurementCorrections_V1_1 measurementCorrections_1_1 = { .v1_0 = measurementCorrections_1_0, .hasEnvironmentBearing = static_cast<bool>(hasEnvironmentBearingCorr), .environmentBearingDegrees = environmentBearingDegreesCorr, .environmentBearingUncertaintyDegrees = environmentBearingUncertaintyDegreesCorr, .satCorrections = list, }; auto result = gnssCorrectionsIface_V1_1->setCorrections_1_1(measurementCorrections_1_1); return checkHidlReturn(result, "IMeasurementCorrections 1.1 setCorrections() failed."); } hidl_vec<SingleSatCorrection_V1_0> list(len); getSingleSatCorrectionList_1_0(env, singleSatCorrectionList, list); measurementCorrections_1_0.satCorrections = list; auto result = gnssCorrectionsIface_V1_0->setCorrections(measurementCorrections_1_0); return checkHidlReturn(result, "IMeasurementCorrections 1.0 setCorrections() failed."); } Loading