Merge changes from topic "gnss-correlation-vector-aidl"

* changes:
  Add CorrelationVector AIDL (framework/base)
  Add CorrelationVector AIDL in JNI
This commit is contained in:
Shinru Han
2021-01-15 04:04:53 +00:00
committed by Android (Google) Code Review
16 changed files with 568 additions and 40 deletions

View File

@@ -3983,6 +3983,25 @@ package android.location {
method public void onLocationBatch(java.util.List<android.location.Location>);
}
public final class CorrelationVector implements android.os.Parcelable {
method public int describeContents();
method @IntRange(from=0) public int getFrequencyOffsetMetersPerSecond();
method @NonNull public int[] getMagnitude();
method @FloatRange(from=0.0f) public double getSamplingStartMeters();
method @FloatRange(from=0.0f, fromInclusive=false) public double getSamplingWidthMeters();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.location.CorrelationVector> CREATOR;
}
public static final class CorrelationVector.Builder {
ctor public CorrelationVector.Builder();
method @NonNull public android.location.CorrelationVector build();
method @NonNull public android.location.CorrelationVector.Builder setFrequencyOffsetMetersPerSecond(@IntRange(from=0) int);
method @NonNull public android.location.CorrelationVector.Builder setMagnitude(@NonNull int[]);
method @NonNull public android.location.CorrelationVector.Builder setSamplingStartMeters(@FloatRange(from=0.0f) double);
method @NonNull public android.location.CorrelationVector.Builder setSamplingWidthMeters(@FloatRange(from=0.0f, fromInclusive=false) double);
}
public final class GnssCapabilities implements android.os.Parcelable {
method public boolean hasGeofencing();
method public boolean hasLowPowerMode();
@@ -3991,6 +4010,7 @@ package android.location {
method public boolean hasMeasurementCorrectionsLosSats();
method @Deprecated public boolean hasMeasurementCorrectionsReflectingPane();
method public boolean hasMeasurementCorrectionsReflectingPlane();
method public boolean hasMeasurementCorrelationVectors();
method @Deprecated public boolean hasNavMessages();
method @Deprecated public boolean hasSatelliteBlacklist();
method public boolean hasSatelliteBlocklist();
@@ -4004,12 +4024,15 @@ package android.location {
method @NonNull public android.location.GnssCapabilities.Builder setHasMeasurementCorrectionsExcessPathLength(boolean);
method @NonNull public android.location.GnssCapabilities.Builder setHasMeasurementCorrectionsLosSats(boolean);
method @NonNull public android.location.GnssCapabilities.Builder setHasMeasurementCorrectionsReflectingPlane(boolean);
method @NonNull public android.location.GnssCapabilities.Builder setHasMeasurementCorrelationVectors(boolean);
method @NonNull public android.location.GnssCapabilities.Builder setHasSatelliteBlocklist(boolean);
method @NonNull public android.location.GnssCapabilities.Builder setHasSatellitePvt(boolean);
}
public final class GnssMeasurement implements android.os.Parcelable {
method @Nullable public java.util.Collection<android.location.CorrelationVector> getCorrelationVectors();
method @Nullable public android.location.SatellitePvt getSatellitePvt();
method public boolean hasCorrelationVectors();
method public boolean hasSatellitePvt();
}
@@ -4043,6 +4066,14 @@ package android.location {
method @NonNull public android.location.GnssMeasurementCorrections.Builder setVerticalPositionUncertaintyMeters(@FloatRange(from=0.0f) double);
}
public final class GnssMeasurementRequest implements android.os.Parcelable {
method public boolean isCorrelationVectorOutputsEnabled();
}
public static final class GnssMeasurementRequest.Builder {
method @NonNull public android.location.GnssMeasurementRequest.Builder setCorrelationVectorOutputsEnabled(boolean);
}
public final class GnssReflectingPlane implements android.os.Parcelable {
method public int describeContents();
method @FloatRange(from=-1000.0F, to=10000.0f) public double getAltitudeMeters();

View File

@@ -941,6 +941,7 @@ package android.location {
method @Deprecated public void resetCarrierPhase();
method @Deprecated public void resetCarrierPhaseUncertainty();
method public void resetCodeType();
method public void resetCorrelationVectors();
method public void resetFullInterSignalBiasNanos();
method public void resetFullInterSignalBiasUncertaintyNanos();
method public void resetSatelliteInterSignalBiasNanos();
@@ -960,6 +961,7 @@ package android.location {
method public void setCn0DbHz(double);
method public void setCodeType(@NonNull String);
method public void setConstellationType(int);
method public void setCorrelationVectors(@Nullable java.util.Collection<android.location.CorrelationVector>);
method public void setFullInterSignalBiasNanos(double);
method public void setFullInterSignalBiasUncertaintyNanos(@FloatRange(from=0.0) double);
method public void setMultipathIndicator(int);

View File

@@ -468,6 +468,8 @@ GetterSetterNames: android.location.GnssMeasurement#setBasebandCn0DbHz(double):
GetterSetterNames: android.location.GnssMeasurement#setCarrierFrequencyHz(float):
GetterSetterNames: android.location.GnssMeasurement#setCodeType(String):
GetterSetterNames: android.location.GnssMeasurement#setCorrelationVectors(java.util.Collection<android.location.CorrelationVector>):
GetterSetterNames: android.location.GnssMeasurement#setFullInterSignalBiasNanos(double):

View File

@@ -0,0 +1,228 @@
/*
* Copyright (C) 2020 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.
*/
package android.location;
import android.annotation.FloatRange;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import com.android.internal.util.Preconditions;
import java.util.Arrays;
import java.util.Objects;
/**
* Contains info about the correlation output of incoming GNSS signal and a local copy of
* its corresponding spreading code at a given frequency offset.
*
* @hide
*/
@SystemApi
public final class CorrelationVector implements Parcelable {
private final double mSamplingWidthMeters;
private final double mSamplingStartMeters;
private final int mFrequencyOffsetMetersPerSecond;
@NonNull private final int[] mMagnitude;
/**
* Returns the space between correlation samples in meters.
*/
@FloatRange(from = 0.0f, fromInclusive = false)
public double getSamplingWidthMeters() {
return mSamplingWidthMeters;
}
/**
* Returns the offset of the first sampling bin in meters.
*
* <p>The following sampling bins are located at positive offsets from this value as follows:
* samplingStartMeters, samplingStartMeters + samplingWidthMeters, ... , samplingStartMeters +
* (magnitude.size-1) * samplingWidthMeters.
*
*/
@FloatRange(from = 0.0f)
public double getSamplingStartMeters() {
return mSamplingStartMeters;
}
/**
* Returns the frequency offset from reported pseudorange rate for this CorrelationVector.
*/
@IntRange(from = 0)
public int getFrequencyOffsetMetersPerSecond() {
return mFrequencyOffsetMetersPerSecond;
}
/**
* Returns the data array representing normalized correlation magnitude values.
*
* <p>The data are normalized correlation magnitude values from -1 to 1, the reported value must
* be encoded as signed 16 bit integer where 1 is represented by 32767 and -1 is represented
* by -32768.
*
*/
@NonNull
public int[] getMagnitude() {
return mMagnitude.clone();
}
private CorrelationVector(Builder builder) {
Preconditions.checkNotNull(builder.mMagnitude, "Magnitude array must not be null");
Preconditions.checkArgumentPositive(builder.mMagnitude.length,
"Magnitude array must have non-zero length");
Preconditions.checkArgumentNonNegative(builder.mFrequencyOffsetMetersPerSecond,
"FrequencyOffsetMetersPerSecond must be non-negative (greater than or equal to 0)");
Preconditions.checkArgument(builder.mSamplingWidthMeters > 0.0,
"SamplingWidthMeters must be positive (greater than 0)");
Preconditions.checkArgument(builder.mSamplingStartMeters >= 0.0,
"SamplingStartMeters must be non-negative (greater than or equal to 0)");
mMagnitude = builder.mMagnitude;
mFrequencyOffsetMetersPerSecond = builder.mFrequencyOffsetMetersPerSecond;
mSamplingWidthMeters = builder.mSamplingWidthMeters;
mSamplingStartMeters = builder.mSamplingStartMeters;
}
private CorrelationVector(Parcel in) {
mSamplingWidthMeters = in.readDouble();
mSamplingStartMeters = in.readDouble();
mFrequencyOffsetMetersPerSecond = in.readInt();
mMagnitude = new int[in.readInt()];
in.readIntArray(mMagnitude);
}
/*
* Method definitions to support Parcelable operations.
*/
public static final @NonNull Parcelable.Creator<CorrelationVector> CREATOR =
new Parcelable.Creator<CorrelationVector>() {
@Override
public CorrelationVector createFromParcel(Parcel parcel) {
return new CorrelationVector(parcel);
}
@Override
public CorrelationVector[] newArray(int size) {
return new CorrelationVector[size];
}
};
@Override
public int describeContents() {
return 0;
}
@NonNull
@Override
public String toString() {
return "CorrelationVector{"
+ "FrequencyOffsetMetersPerSecond=" + mFrequencyOffsetMetersPerSecond
+ ", SamplingWidthMeters=" + mSamplingWidthMeters
+ ", SamplingStartMeters=" + mSamplingStartMeters
+ ", Magnitude=" + Arrays.toString(mMagnitude)
+ '}';
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeDouble(mSamplingWidthMeters);
dest.writeDouble(mSamplingStartMeters);
dest.writeInt(mFrequencyOffsetMetersPerSecond);
dest.writeInt(mMagnitude.length);
dest.writeIntArray(mMagnitude);
}
/**
* Returns true if this {@link CorrelationVector} is equivalent to the given object.
* Returns false otherwise.
*/
@Override
public boolean equals(Object object) {
if (object == this) {
return true;
}
if (!(object instanceof CorrelationVector)) {
return false;
}
CorrelationVector c = (CorrelationVector) object;
return Arrays.equals(mMagnitude, c.getMagnitude())
&& Double.compare(mSamplingWidthMeters, c.getSamplingWidthMeters()) == 0
&& Double.compare(mSamplingStartMeters, c.getSamplingStartMeters()) == 0
&& Integer.compare(mFrequencyOffsetMetersPerSecond,
c.getFrequencyOffsetMetersPerSecond()) == 0;
}
@Override
public int hashCode() {
return Objects.hash(mSamplingWidthMeters, mSamplingStartMeters,
mFrequencyOffsetMetersPerSecond, Arrays.hashCode(mMagnitude));
}
/**
* Builder class for CorrelationVector.
*/
public static final class Builder {
private double mSamplingWidthMeters;
private double mSamplingStartMeters;
private int mFrequencyOffsetMetersPerSecond;
@NonNull private int[] mMagnitude;
/** Sets the space between correlation samples in meters. */
@NonNull
public Builder setSamplingWidthMeters(
@FloatRange(from = 0.0f, fromInclusive = false) double samplingWidthMeters) {
mSamplingWidthMeters = samplingWidthMeters;
return this;
}
/** Sets the offset of the first sampling bin in meters. */
@NonNull
public Builder setSamplingStartMeters(@FloatRange(from = 0.0f) double samplingStartMeters) {
mSamplingStartMeters = samplingStartMeters;
return this;
}
/** Sets the frequency offset from reported pseudorange rate for this CorrelationVector */
@NonNull
public Builder setFrequencyOffsetMetersPerSecond(
@IntRange(from = 0) int frequencyOffsetMetersPerSecond) {
mFrequencyOffsetMetersPerSecond = frequencyOffsetMetersPerSecond;
return this;
}
/** Sets the data array representing normalized correlation magnitude values. */
@NonNull
public Builder setMagnitude(@NonNull int[] magnitude) {
mMagnitude = magnitude;
return this;
}
/**
* Build CorrelationVector object.
*
* @return instance of CorrelationVector
*/
@NonNull
public CorrelationVector build() {
return new CorrelationVector(this);
}
}
}

View File

@@ -58,6 +58,8 @@ public final class GnssCapabilities implements Parcelable {
/** @hide */
public static final int TOP_HAL_CAPABILITY_ANTENNA_INFO = 2048;
/** @hide */
public static final int TOP_HAL_CAPABILITY_CORRELATION_VECTOR = 4096;
/** @hide */
public static final int TOP_HAL_CAPABILITY_SATELLITE_PVT = 8192;
/** @hide */
@@ -67,7 +69,8 @@ public final class GnssCapabilities implements Parcelable {
TOP_HAL_CAPABILITY_MEASUREMENTS, TOP_HAL_CAPABILITY_NAV_MESSAGES,
TOP_HAL_CAPABILITY_LOW_POWER_MODE, TOP_HAL_CAPABILITY_SATELLITE_BLOCKLIST,
TOP_HAL_CAPABILITY_MEASUREMENT_CORRECTIONS, TOP_HAL_CAPABILITY_ANTENNA_INFO,
TOP_HAL_CAPABILITY_SATELLITE_PVT})
TOP_HAL_CAPABILITY_CORRELATION_VECTOR, TOP_HAL_CAPABILITY_SATELLITE_PVT})
@Retention(RetentionPolicy.SOURCE)
public @interface TopHalCapabilityFlags {}
@@ -336,6 +339,17 @@ public final class GnssCapabilities implements Parcelable {
return (mTopFlags & TOP_HAL_CAPABILITY_ANTENNA_INFO) != 0;
}
/**
* Returns {@code true} if GNSS chipset supports correlation vectors as part of measurements
* outputs, {@code false} otherwise.
*
* @hide
*/
@SystemApi
public boolean hasMeasurementCorrelationVectors() {
return (mTopFlags & TOP_HAL_CAPABILITY_CORRELATION_VECTOR) != 0;
}
/**
* Returns {@code true} if GNSS chipset supports line-of-sight satellite identification
* measurement corrections, {@code false} otherwise.
@@ -533,6 +547,9 @@ public final class GnssCapabilities implements Parcelable {
if (hasAntennaInfo()) {
builder.append("ANTENNA_INFO ");
}
if (hasMeasurementCorrelationVectors()) {
builder.append("MEASUREMENT_CORRELATION_VECTORS ");
}
if (hasMeasurementCorrectionsLosSats()) {
builder.append("LOS_SATS ");
}
@@ -719,6 +736,17 @@ public final class GnssCapabilities implements Parcelable {
return this;
}
/**
* Sets correlation vector capability.
*
* @hide
*/
@SystemApi
public @NonNull Builder setHasMeasurementCorrelationVectors(boolean capable) {
mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_CORRELATION_VECTOR, capable);
return this;
}
/**
* Sets measurement corrections line-of-sight satellites capabilitity.
*

View File

@@ -38,6 +38,9 @@ import android.os.Parcelable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
/**
* A class representing a GNSS satellite measurement, containing raw and computed information.
@@ -70,6 +73,7 @@ public final class GnssMeasurement implements Parcelable {
private double mSatelliteInterSignalBiasNanos;
private double mSatelliteInterSignalBiasUncertaintyNanos;
@Nullable private SatellitePvt mSatellitePvt;
@Nullable private Collection<CorrelationVector> mReadOnlyCorrelationVectors;
// The following enumerations must be in sync with the values declared in GNSS HAL.
@@ -77,6 +81,7 @@ public final class GnssMeasurement implements Parcelable {
private static final int HAS_CODE_TYPE = (1 << 14);
private static final int HAS_BASEBAND_CN0 = (1 << 15);
private static final int HAS_SATELLITE_PVT = (1 << 20);
private static final int HAS_CORRELATION_VECTOR = (1 << 21);
/**
* The status of the multipath indicator.
@@ -279,6 +284,7 @@ public final class GnssMeasurement implements Parcelable {
mSatelliteInterSignalBiasUncertaintyNanos =
measurement.mSatelliteInterSignalBiasUncertaintyNanos;
mSatellitePvt = measurement.mSatellitePvt;
mReadOnlyCorrelationVectors = measurement.mReadOnlyCorrelationVectors;
}
/**
@@ -1712,6 +1718,7 @@ public final class GnssMeasurement implements Parcelable {
*
* <p>The value is only available if {@link #hasSatellitePvt()} is
* {@code true}.
*
* @hide
*/
@Nullable
@@ -1745,6 +1752,58 @@ public final class GnssMeasurement implements Parcelable {
resetFlag(HAS_SATELLITE_PVT);
}
/**
* Returns {@code true} if {@link #getCorrelationVectors()} is available,
* {@code false} otherwise.
*
* @hide
*/
@SystemApi
public boolean hasCorrelationVectors() {
return isFlagSet(HAS_CORRELATION_VECTOR);
}
/**
* Gets read-only collection of CorrelationVector with each CorrelationVector corresponding to a
* frequency offset.
*
* <p>To represent correlation values over a 2D spaces (delay and frequency), a
* CorrelationVector is required per frequency offset, and each CorrelationVector contains
* correlation values at equally spaced spatial offsets.
*
* @hide
*/
@Nullable
@SystemApi
public Collection<CorrelationVector> getCorrelationVectors() {
return mReadOnlyCorrelationVectors;
}
/**
* Sets the CorrelationVectors.
*
* @hide
*/
@TestApi
public void setCorrelationVectors(@Nullable Collection<CorrelationVector> correlationVectors) {
if (correlationVectors == null || correlationVectors.isEmpty()) {
resetCorrelationVectors();
} else {
setFlag(HAS_CORRELATION_VECTOR);
mReadOnlyCorrelationVectors = Collections.unmodifiableCollection(correlationVectors);
}
}
/**
* Resets the CorrelationVectors.
*
* @hide
*/
@TestApi
public void resetCorrelationVectors() {
resetFlag(HAS_CORRELATION_VECTOR);
mReadOnlyCorrelationVectors = null;
}
public static final @NonNull Creator<GnssMeasurement> CREATOR = new Creator<GnssMeasurement>() {
@Override
@@ -1781,6 +1840,15 @@ public final class GnssMeasurement implements Parcelable {
ClassLoader classLoader = getClass().getClassLoader();
gnssMeasurement.mSatellitePvt = parcel.readParcelable(classLoader);
}
if (gnssMeasurement.hasCorrelationVectors()) {
CorrelationVector[] correlationVectorsArray =
new CorrelationVector[parcel.readInt()];
parcel.readTypedArray(correlationVectorsArray, CorrelationVector.CREATOR);
Collection<CorrelationVector> corrVecCollection =
Arrays.asList(correlationVectorsArray);
gnssMeasurement.mReadOnlyCorrelationVectors =
Collections.unmodifiableCollection(corrVecCollection);
}
return gnssMeasurement;
}
@@ -1821,6 +1889,13 @@ public final class GnssMeasurement implements Parcelable {
if (hasSatellitePvt()) {
parcel.writeParcelable(mSatellitePvt, flags);
}
if (hasCorrelationVectors()) {
int correlationVectorCount = mReadOnlyCorrelationVectors.size();
CorrelationVector[] correlationVectorArray =
mReadOnlyCorrelationVectors.toArray(new CorrelationVector[correlationVectorCount]);
parcel.writeInt(correlationVectorArray.length);
parcel.writeTypedArray(correlationVectorArray, flags);
}
}
@Override
@@ -1928,6 +2003,13 @@ public final class GnssMeasurement implements Parcelable {
builder.append(mSatellitePvt.toString());
}
if (hasCorrelationVectors()) {
for (CorrelationVector correlationVector : mReadOnlyCorrelationVectors) {
builder.append(correlationVector.toString());
builder.append("\n");
}
}
return builder.toString();
}
@@ -1958,6 +2040,7 @@ public final class GnssMeasurement implements Parcelable {
resetSatelliteInterSignalBiasNanos();
resetSatelliteInterSignalBiasUncertaintyNanos();
resetSatellitePvt();
resetCorrelationVectors();
}
private void setFlag(int flag) {

View File

@@ -17,20 +17,38 @@
package android.location;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.Objects;
/**
* This class contains extra parameters to pass in a GNSS measurement request.
*/
public final class GnssMeasurementRequest implements Parcelable {
private final boolean mCorrelationVectorOutputsEnabled;
private final boolean mFullTracking;
/**
* Creates a {@link GnssMeasurementRequest} with a full list of parameters.
*/
private GnssMeasurementRequest(boolean fullTracking) {
private GnssMeasurementRequest(boolean fullTracking, boolean correlationVectorOutputsEnabled) {
mFullTracking = fullTracking;
mCorrelationVectorOutputsEnabled = correlationVectorOutputsEnabled;
}
/**
* Represents whether to enable correlation vector outputs.
*
* <p>If true, enable correlation vectors as part of the raw GNSS measurements outputs.
* If false, disable correlation vectors.
*
* @hide
*/
@SystemApi
public boolean isCorrelationVectorOutputsEnabled() {
return mCorrelationVectorOutputsEnabled;
}
/**
@@ -56,7 +74,7 @@ public final class GnssMeasurementRequest implements Parcelable {
@Override
@NonNull
public GnssMeasurementRequest createFromParcel(@NonNull Parcel parcel) {
return new GnssMeasurementRequest(parcel.readBoolean());
return new GnssMeasurementRequest(parcel.readBoolean(), parcel.readBoolean());
}
@Override
@@ -68,6 +86,7 @@ public final class GnssMeasurementRequest implements Parcelable {
@Override
public void writeToParcel(@NonNull Parcel parcel, int flags) {
parcel.writeBoolean(mFullTracking);
parcel.writeBoolean(mCorrelationVectorOutputsEnabled);
}
@NonNull
@@ -78,6 +97,9 @@ public final class GnssMeasurementRequest implements Parcelable {
if (mFullTracking) {
s.append("FullTracking");
}
if (mCorrelationVectorOutputsEnabled) {
s.append(", CorrelationVectorOutPuts");
}
s.append(']');
return s.toString();
}
@@ -90,13 +112,15 @@ public final class GnssMeasurementRequest implements Parcelable {
GnssMeasurementRequest other = (GnssMeasurementRequest) obj;
if (mFullTracking != other.mFullTracking) return false;
if (mCorrelationVectorOutputsEnabled != other.mCorrelationVectorOutputsEnabled) {
return false;
}
return true;
}
@Override
public int hashCode() {
return mFullTracking ? 1 : 0;
return Objects.hash(mFullTracking, mCorrelationVectorOutputsEnabled);
}
@Override
@@ -106,6 +130,7 @@ public final class GnssMeasurementRequest implements Parcelable {
/** Builder for {@link GnssMeasurementRequest} */
public static final class Builder {
private boolean mCorrelationVectorOutputsEnabled;
private boolean mFullTracking;
/**
@@ -118,9 +143,24 @@ public final class GnssMeasurementRequest implements Parcelable {
* Constructs a {@link Builder} instance by copying a {@link GnssMeasurementRequest}.
*/
public Builder(@NonNull GnssMeasurementRequest request) {
mCorrelationVectorOutputsEnabled = request.isCorrelationVectorOutputsEnabled();
mFullTracking = request.isFullTracking();
}
/**
* Set the value of whether to enable correlation vector outputs, which is false by default.
*
* <p>If true, enable correlation vectors as part of the raw GNSS measurements outputs.
* If false, disable correlation vectors.
*
* @hide
*/
@SystemApi
@NonNull public Builder setCorrelationVectorOutputsEnabled(boolean value) {
mCorrelationVectorOutputsEnabled = value;
return this;
}
/**
* Set the value of whether to enable full GNSS tracking, which is false by default.
*
@@ -146,7 +186,7 @@ public final class GnssMeasurementRequest implements Parcelable {
/** Builds a {@link GnssMeasurementRequest} instance as specified by this builder. */
@NonNull
public GnssMeasurementRequest build() {
return new GnssMeasurementRequest(mFullTracking);
return new GnssMeasurementRequest(mFullTracking, mCorrelationVectorOutputsEnabled);
}
}
}

View File

@@ -3171,7 +3171,9 @@ public class LocationManager {
for (GnssMeasurementRequest request : requests) {
if (request.isFullTracking()) {
builder.setFullTracking(true);
break;
}
if (request.isCorrelationVectorOutputsEnabled()) {
builder.setCorrelationVectorOutputsEnabled(true);
}
}

View File

@@ -193,7 +193,9 @@ public class GnssManagerService {
IGnssMeasurementsListener listener, String packageName,
@Nullable String attributionTag) {
mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION, null);
if (request.isCorrelationVectorOutputsEnabled()) {
mContext.enforceCallingOrSelfPermission(Manifest.permission.LOCATION_HARDWARE, null);
}
CallerIdentity identity = CallerIdentity.fromBinder(mContext, packageName, attributionTag);
mGnssMeasurementsProvider.addListener(request, identity, listener);
}

View File

@@ -118,7 +118,8 @@ public final class GnssMeasurementsProvider extends
@Override
protected boolean registerWithService(GnssMeasurementRequest request,
Collection<GnssListenerRegistration> registrations) {
if (mGnssNative.startMeasurementCollection(request.isFullTracking())) {
if (mGnssNative.startMeasurementCollection(request.isFullTracking(),
request.isCorrelationVectorOutputsEnabled())) {
if (D) {
Log.d(TAG, "starting gnss measurements (" + request + ")");
}
@@ -160,18 +161,26 @@ public final class GnssMeasurementsProvider extends
protected GnssMeasurementRequest mergeRegistrations(
Collection<GnssListenerRegistration> registrations) {
boolean fullTracking = false;
boolean enableCorrVecOutputs = false;
if (mSettingsHelper.isGnssMeasurementsFullTrackingEnabled()) {
fullTracking = true;
} else {
for (GnssListenerRegistration registration : registrations) {
if (registration.getRequest().isFullTracking()) {
fullTracking = true;
break;
}
}
for (GnssListenerRegistration registration : registrations) {
GnssMeasurementRequest request = registration.getRequest();
if (request.isFullTracking()) {
fullTracking = true;
}
if (request.isCorrelationVectorOutputsEnabled()) {
enableCorrVecOutputs = true;
}
}
return new GnssMeasurementRequest.Builder().setFullTracking(fullTracking).build();
return new GnssMeasurementRequest.Builder()
.setFullTracking(fullTracking)
.setCorrelationVectorOutputsEnabled(enableCorrVecOutputs)
.build();
}
@Override

View File

@@ -733,9 +733,10 @@ public class GnssNative {
/**
* Starts measurement collection.
*/
public boolean startMeasurementCollection(boolean enableFullTracking) {
public boolean startMeasurementCollection(boolean enableFullTracking,
boolean enableCorrVecOutputs) {
Preconditions.checkState(mRegistered);
return mGnssHal.startMeasurementCollection(enableFullTracking);
return mGnssHal.startMeasurementCollection(enableFullTracking, enableCorrVecOutputs);
}
/**
@@ -1274,8 +1275,9 @@ public class GnssNative {
return native_is_measurement_supported();
}
protected boolean startMeasurementCollection(boolean enableFullTracking) {
return native_start_measurement_collection(enableFullTracking);
protected boolean startMeasurementCollection(boolean enableFullTracking,
boolean enableCorrVecOutputs) {
return native_start_measurement_collection(enableFullTracking, enableCorrVecOutputs);
}
protected boolean stopMeasurementCollection() {
@@ -1438,7 +1440,8 @@ public class GnssNative {
private static native boolean native_is_measurement_supported();
private static native boolean native_start_measurement_collection(boolean enableFullTracking);
private static native boolean native_start_measurement_collection(boolean enableFullTracking,
boolean enableCorrVecOutputs);
private static native boolean native_stop_measurement_collection();

View File

@@ -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",

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);

View File

@@ -233,6 +233,7 @@ public final class FakeGnssHal extends GnssNative.GnssHal {
private boolean mAntennaInfoListeningStarted = false;
private boolean mMeasurementCollectionStarted = false;
private boolean mMeasurementCollectionFullTracking = false;
private boolean mMeasurementCollectionCorrVecOutputsEnabled = false;
private GnssHalPositionMode mPositionMode = new GnssHalPositionMode();
private GnssHalBatchingMode mBatchingMode = new GnssHalBatchingMode();
private final ArrayList<Location> mBatchedLocations = new ArrayList<>();
@@ -521,9 +522,11 @@ public final class FakeGnssHal extends GnssNative.GnssHal {
}
@Override
protected boolean startMeasurementCollection(boolean enableFullTracking) {
protected boolean startMeasurementCollection(boolean enableFullTracking,
boolean enableCorrVecOutputs) {
mState.mMeasurementCollectionStarted = true;
mState.mMeasurementCollectionFullTracking = enableFullTracking;
mState.mMeasurementCollectionCorrVecOutputsEnabled = enableCorrVecOutputs;
return true;
}
@@ -531,6 +534,7 @@ public final class FakeGnssHal extends GnssNative.GnssHal {
protected boolean stopMeasurementCollection() {
mState.mMeasurementCollectionStarted = false;
mState.mMeasurementCollectionFullTracking = false;
mState.mMeasurementCollectionCorrVecOutputsEnabled = false;
return true;
}