diff options
-rw-r--r-- | Android.bp | 1 | ||||
-rw-r--r-- | api/current.txt | 14 | ||||
-rw-r--r-- | api/test-current.txt | 14 | ||||
-rw-r--r-- | api/test-lint-baseline.txt | 18 | ||||
-rw-r--r-- | location/java/android/location/GnssClock.java | 217 | ||||
-rw-r--r-- | location/java/android/location/GnssMeasurement.java | 320 | ||||
-rw-r--r-- | services/core/jni/com_android_server_location_GnssLocationProvider.cpp | 43 |
7 files changed, 550 insertions, 77 deletions
diff --git a/Android.bp b/Android.bp index 3ecb5a9340d2..9411eeca834c 100644 --- a/Android.bp +++ b/Android.bp @@ -340,6 +340,7 @@ java_library { "android.hardware.cas-V1.2-java", "android.hardware.contexthub-V1.0-java", "android.hardware.gnss-V1.0-java", + "android.hardware.gnss-V2.1-java", "android.hardware.health-V1.0-java-constants", "android.hardware.radio-V1.0-java", "android.hardware.radio-V1.1-java", diff --git a/api/current.txt b/api/current.txt index 6eb65824c5ab..8307fc58986c 100644 --- a/api/current.txt +++ b/api/current.txt @@ -23390,6 +23390,9 @@ package android.location { method public long getFullBiasNanos(); method public int getHardwareClockDiscontinuityCount(); method public int getLeapSecond(); + method @FloatRange(from=0.0) public double getReferenceCarrierFrequencyHzForIsb(); + method @NonNull public String getReferenceCodeTypeForIsb(); + method public int getReferenceConstellationTypeForIsb(); method public long getTimeNanos(); method @FloatRange(from=0.0f) public double getTimeUncertaintyNanos(); method public boolean hasBiasNanos(); @@ -23400,6 +23403,9 @@ package android.location { method public boolean hasElapsedRealtimeUncertaintyNanos(); method public boolean hasFullBiasNanos(); method public boolean hasLeapSecond(); + method public boolean hasReferenceCarrierFrequencyHzForIsb(); + method public boolean hasReferenceCodeTypeForIsb(); + method public boolean hasReferenceConstellationTypeForIsb(); method public boolean hasTimeUncertaintyNanos(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.location.GnssClock> CREATOR; @@ -23424,6 +23430,10 @@ package android.location { method public double getPseudorangeRateUncertaintyMetersPerSecond(); method public long getReceivedSvTimeNanos(); method public long getReceivedSvTimeUncertaintyNanos(); + method public double getReceiverInterSignalBiasNanos(); + method @FloatRange(from=0.0) public double getReceiverInterSignalBiasUncertaintyNanos(); + method public double getSatelliteInterSignalBiasNanos(); + method @FloatRange(from=0.0) public double getSatelliteInterSignalBiasUncertaintyNanos(); method public double getSnrInDb(); method public int getState(); method public int getSvid(); @@ -23435,6 +23445,10 @@ package android.location { method @Deprecated public boolean hasCarrierPhase(); method @Deprecated public boolean hasCarrierPhaseUncertainty(); method public boolean hasCodeType(); + method public boolean hasReceiverInterSignalBiasNanos(); + method public boolean hasReceiverInterSignalBiasUncertaintyNanos(); + method public boolean hasSatelliteInterSignalBiasNanos(); + method public boolean hasSatelliteInterSignalBiasUncertaintyNanos(); method public boolean hasSnrInDb(); method public void writeToParcel(android.os.Parcel, int); field public static final int ADR_STATE_CYCLE_SLIP = 4; // 0x4 diff --git a/api/test-current.txt b/api/test-current.txt index e2407d65ef5c..13a9cf428efa 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -1187,6 +1187,9 @@ package android.location { method public void resetElapsedRealtimeUncertaintyNanos(); method public void resetFullBiasNanos(); method public void resetLeapSecond(); + method public void resetReferenceCarrierFrequencyHzForIsb(); + method public void resetReferenceCodeTypeForIsb(); + method public void resetReferenceConstellationTypeForIsb(); method public void resetTimeUncertaintyNanos(); method public void set(android.location.GnssClock); method public void setBiasNanos(double); @@ -1198,6 +1201,9 @@ package android.location { method public void setFullBiasNanos(long); method public void setHardwareClockDiscontinuityCount(int); method public void setLeapSecond(int); + method public void setReferenceCarrierFrequencyHzForIsb(@FloatRange(from=0.0) double); + method public void setReferenceCodeTypeForIsb(@NonNull String); + method public void setReferenceConstellationTypeForIsb(int); method public void setTimeNanos(long); method public void setTimeUncertaintyNanos(@FloatRange(from=0.0f) double); } @@ -1212,6 +1218,10 @@ package android.location { method @Deprecated public void resetCarrierPhase(); method @Deprecated public void resetCarrierPhaseUncertainty(); method public void resetCodeType(); + method public void resetReceiverInterSignalBiasNanos(); + method public void resetReceiverInterSignalBiasUncertaintyNanos(); + method public void resetSatelliteInterSignalBiasNanos(); + method public void resetSatelliteInterSignalBiasUncertaintyNanos(); method public void resetSnrInDb(); method public void set(android.location.GnssMeasurement); method public void setAccumulatedDeltaRangeMeters(double); @@ -1231,6 +1241,10 @@ package android.location { method public void setPseudorangeRateUncertaintyMetersPerSecond(double); method public void setReceivedSvTimeNanos(long); method public void setReceivedSvTimeUncertaintyNanos(long); + method public void setReceiverInterSignalBiasNanos(double); + method public void setReceiverInterSignalBiasUncertaintyNanos(@FloatRange(from=0.0) double); + method public void setSatelliteInterSignalBiasNanos(double); + method public void setSatelliteInterSignalBiasUncertaintyNanos(@FloatRange(from=0.0) double); method public void setSnrInDb(double); method public void setState(int); method public void setSvid(int); diff --git a/api/test-lint-baseline.txt b/api/test-lint-baseline.txt index 54f7f68d96cb..a9c18363d8b0 100644 --- a/api/test-lint-baseline.txt +++ b/api/test-lint-baseline.txt @@ -406,7 +406,13 @@ GetterSetterNames: android.location.GnssClock#setElapsedRealtimeUncertaintyNanos GetterSetterNames: android.location.GnssClock#setFullBiasNanos(long): GetterSetterNames: android.location.GnssClock#setLeapSecond(int): - + +GetterSetterNames: android.location.GnssClock#setReferenceConstellationTypeForIsb(int): + +GetterSetterNames: android.location.GnssClock#setReferenceCarrierFrequencyHzForIsb(double): + +GetterSetterNames: android.location.GnssClock#setReferenceCodeTypeForIsb(String): + GetterSetterNames: android.location.GnssClock#setTimeUncertaintyNanos(double): GetterSetterNames: android.location.GnssMeasurement#setBasebandCn0DbHz(double): @@ -414,7 +420,15 @@ GetterSetterNames: android.location.GnssMeasurement#setBasebandCn0DbHz(double): GetterSetterNames: android.location.GnssMeasurement#setCarrierFrequencyHz(float): GetterSetterNames: android.location.GnssMeasurement#setCodeType(String): - + +GetterSetterNames: android.location.GnssMeasurement#setReceiverInterSignalBiasNanos(double): + +GetterSetterNames: android.location.GnssMeasurement#setReceiverInterSignalBiasUncertaintyNanos(double): + +GetterSetterNames: android.location.GnssMeasurement#setSatelliteInterSignalBiasNanos(double): + +GetterSetterNames: android.location.GnssMeasurement#setSatelliteInterSignalBiasUncertaintyNanos(double): + GetterSetterNames: android.location.GnssMeasurement#setSnrInDb(double): GetterSetterNames: android.location.LocationRequest#isLocationSettingsIgnored(): diff --git a/location/java/android/location/GnssClock.java b/location/java/android/location/GnssClock.java index 8a7878b46e89..ed4bf1b2d53e 100644 --- a/location/java/android/location/GnssClock.java +++ b/location/java/android/location/GnssClock.java @@ -17,6 +17,7 @@ package android.location; import android.annotation.FloatRange; +import android.annotation.NonNull; import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -39,6 +40,9 @@ public final class GnssClock implements Parcelable { private static final int HAS_DRIFT_UNCERTAINTY = (1<<6); private static final int HAS_ELAPSED_REALTIME_NANOS = (1 << 7); private static final int HAS_ELAPSED_REALTIME_UNCERTAINTY_NANOS = (1 << 8); + private static final int HAS_REFERENCE_CONSTELLATION_TYPE_FOR_ISB = (1 << 9); + private static final int HAS_REFERENCE_CARRIER_FREQUENCY_FOR_ISB = (1 << 10); + private static final int HAS_REFERENCE_CODE_TYPE_FOR_ISB = (1 << 11); // End enumerations in sync with gps.h @@ -54,6 +58,9 @@ public final class GnssClock implements Parcelable { private int mHardwareClockDiscontinuityCount; private long mElapsedRealtimeNanos; private double mElapsedRealtimeUncertaintyNanos; + private int mReferenceConstellationTypeForIsb; + private double mReferenceCarrierFrequencyHzForIsb; + private String mReferenceCodeTypeForIsb; /** * @hide @@ -81,6 +88,9 @@ public final class GnssClock implements Parcelable { mHardwareClockDiscontinuityCount = clock.mHardwareClockDiscontinuityCount; mElapsedRealtimeNanos = clock.mElapsedRealtimeNanos; mElapsedRealtimeUncertaintyNanos = clock.mElapsedRealtimeUncertaintyNanos; + mReferenceConstellationTypeForIsb = clock.mReferenceConstellationTypeForIsb; + mReferenceCarrierFrequencyHzForIsb = clock.mReferenceCarrierFrequencyHzForIsb; + mReferenceCodeTypeForIsb = clock.mReferenceCodeTypeForIsb; } /** @@ -196,7 +206,6 @@ public final class GnssClock implements Parcelable { @TestApi public void resetTimeUncertaintyNanos() { resetFlag(HAS_TIME_UNCERTAINTY); - mTimeUncertaintyNanos = Double.NaN; } /** @@ -286,7 +295,6 @@ public final class GnssClock implements Parcelable { @TestApi public void resetBiasNanos() { resetFlag(HAS_BIAS); - mBiasNanos = Double.NaN; } /** @@ -327,7 +335,6 @@ public final class GnssClock implements Parcelable { @TestApi public void resetBiasUncertaintyNanos() { resetFlag(HAS_BIAS_UNCERTAINTY); - mBiasUncertaintyNanos = Double.NaN; } /** @@ -371,7 +378,6 @@ public final class GnssClock implements Parcelable { @TestApi public void resetDriftNanosPerSecond() { resetFlag(HAS_DRIFT); - mDriftNanosPerSecond = Double.NaN; } /** @@ -411,7 +417,6 @@ public final class GnssClock implements Parcelable { @TestApi public void resetDriftUncertaintyNanosPerSecond() { resetFlag(HAS_DRIFT_UNCERTAINTY); - mDriftUncertaintyNanosPerSecond = Double.NaN; } /** @@ -495,7 +500,128 @@ public final class GnssClock implements Parcelable { @TestApi public void resetElapsedRealtimeUncertaintyNanos() { resetFlag(HAS_ELAPSED_REALTIME_UNCERTAINTY_NANOS); - mElapsedRealtimeUncertaintyNanos = Double.NaN; + } + + /** + * Returns {@code true} if {@link #getReferenceConstellationTypeForIsb()} is available, + * {@code false} otherwise. + */ + public boolean hasReferenceConstellationTypeForIsb() { + return isFlagSet(HAS_REFERENCE_CONSTELLATION_TYPE_FOR_ISB); + } + + /** + * Returns the reference constellation type for inter-signal bias. + * + * <p>The value is only available if {@link #hasReferenceConstellationTypeForIsb()} is + * {@code true}. + * + * <p>The return value is one of those constants with {@code CONSTELLATION_} prefix in + * {@link GnssStatus}. + */ + @GnssStatus.ConstellationType + public int getReferenceConstellationTypeForIsb() { + return mReferenceConstellationTypeForIsb; + } + + /** + * Sets the reference constellation type for inter-signal bias. + * @hide + */ + @TestApi + public void setReferenceConstellationTypeForIsb(@GnssStatus.ConstellationType int value) { + setFlag(HAS_REFERENCE_CONSTELLATION_TYPE_FOR_ISB); + mReferenceConstellationTypeForIsb = value; + } + + /** + * Resets the reference constellation type for inter-signal bias. + * @hide + */ + @TestApi + public void resetReferenceConstellationTypeForIsb() { + resetFlag(HAS_REFERENCE_CONSTELLATION_TYPE_FOR_ISB); + mReferenceConstellationTypeForIsb = GnssStatus.CONSTELLATION_UNKNOWN; + } + + /** + * Returns {@code true} if {@link #getReferenceCarrierFrequencyHzForIsb()} is available, {@code + * false} otherwise. + */ + public boolean hasReferenceCarrierFrequencyHzForIsb() { + return isFlagSet(HAS_REFERENCE_CARRIER_FREQUENCY_FOR_ISB); + } + + /** + * Returns the reference carrier frequency in Hz for inter-signal bias. + * + * <p>The value is only available if {@link #hasReferenceCarrierFrequencyHzForIsb()} is + * {@code true}. + */ + @FloatRange(from = 0.0) + public double getReferenceCarrierFrequencyHzForIsb() { + return mReferenceCarrierFrequencyHzForIsb; + } + + /** + * Sets the reference carrier frequency in Hz for inter-signal bias. + * @hide + */ + @TestApi + public void setReferenceCarrierFrequencyHzForIsb(@FloatRange(from = 0.0) double value) { + setFlag(HAS_REFERENCE_CARRIER_FREQUENCY_FOR_ISB); + mReferenceCarrierFrequencyHzForIsb = value; + } + + /** + * Resets the reference carrier frequency in Hz for inter-signal bias. + * @hide + */ + @TestApi + public void resetReferenceCarrierFrequencyHzForIsb() { + resetFlag(HAS_REFERENCE_CARRIER_FREQUENCY_FOR_ISB); + } + + /** + * Returns {@code true} if {@link #getReferenceCodeTypeForIsb()} is available, {@code + * false} otherwise. + */ + public boolean hasReferenceCodeTypeForIsb() { + return isFlagSet(HAS_REFERENCE_CODE_TYPE_FOR_ISB); + } + + /** + * Returns the reference code type for inter-signal bias. + * + * <p>The value is only available if {@link #hasReferenceCodeTypeForIsb()} is + * {@code true}. + * + * <p>The return value is one of those constants defined in + * {@link GnssMeasurement#getCodeType()}. + */ + @NonNull + public String getReferenceCodeTypeForIsb() { + return mReferenceCodeTypeForIsb; + } + + /** + * Sets the reference code type for inter-signal bias. + * @hide + */ + @TestApi + public void setReferenceCodeTypeForIsb(@NonNull String codeType) { + setFlag(HAS_REFERENCE_CODE_TYPE_FOR_ISB); + mReferenceCodeTypeForIsb = codeType; + } + + /** + * Resets the reference code type for inter-signal bias. + * @hide + */ + @TestApi + public void resetReferenceCodeTypeForIsb() { + resetFlag(HAS_REFERENCE_CODE_TYPE_FOR_ISB); + mReferenceCodeTypeForIsb = "UNKNOWN"; } /** @@ -543,6 +669,9 @@ public final class GnssClock implements Parcelable { gpsClock.mHardwareClockDiscontinuityCount = parcel.readInt(); gpsClock.mElapsedRealtimeNanos = parcel.readLong(); gpsClock.mElapsedRealtimeUncertaintyNanos = parcel.readDouble(); + gpsClock.mReferenceConstellationTypeForIsb = parcel.readInt(); + gpsClock.mReferenceCarrierFrequencyHzForIsb = parcel.readDouble(); + gpsClock.mReferenceCodeTypeForIsb = parcel.readString(); return gpsClock; } @@ -567,6 +696,9 @@ public final class GnssClock implements Parcelable { parcel.writeInt(mHardwareClockDiscontinuityCount); parcel.writeLong(mElapsedRealtimeNanos); parcel.writeDouble(mElapsedRealtimeUncertaintyNanos); + parcel.writeInt(mReferenceConstellationTypeForIsb); + parcel.writeDouble(mReferenceCarrierFrequencyHzForIsb); + parcel.writeString(mReferenceCodeTypeForIsb); } @Override @@ -580,7 +712,9 @@ public final class GnssClock implements Parcelable { final String formatWithUncertainty = " %-15s = %-25s %-26s = %s\n"; StringBuilder builder = new StringBuilder("GnssClock:\n"); - builder.append(String.format(format, "LeapSecond", hasLeapSecond() ? mLeapSecond : null)); + if (hasLeapSecond()) { + builder.append(String.format(format, "LeapSecond", mLeapSecond)); + } builder.append(String.format( formatWithUncertainty, @@ -589,39 +723,57 @@ public final class GnssClock implements Parcelable { "TimeUncertaintyNanos", hasTimeUncertaintyNanos() ? mTimeUncertaintyNanos : null)); - builder.append(String.format( - format, - "FullBiasNanos", - hasFullBiasNanos() ? mFullBiasNanos : null)); + if (hasFullBiasNanos()) { + builder.append(String.format(format, "FullBiasNanos", mFullBiasNanos)); + } - builder.append(String.format( - formatWithUncertainty, - "BiasNanos", - hasBiasNanos() ? mBiasNanos : null, - "BiasUncertaintyNanos", - hasBiasUncertaintyNanos() ? mBiasUncertaintyNanos : null)); + if (hasBiasNanos() || hasBiasUncertaintyNanos()) { + builder.append(String.format( + formatWithUncertainty, + "BiasNanos", + hasBiasNanos() ? mBiasNanos : null, + "BiasUncertaintyNanos", + hasBiasUncertaintyNanos() ? mBiasUncertaintyNanos : null)); + } - builder.append(String.format( - formatWithUncertainty, - "DriftNanosPerSecond", - hasDriftNanosPerSecond() ? mDriftNanosPerSecond : null, - "DriftUncertaintyNanosPerSecond", - hasDriftUncertaintyNanosPerSecond() ? mDriftUncertaintyNanosPerSecond : null)); + if (hasDriftNanosPerSecond() || hasDriftUncertaintyNanosPerSecond()) { + builder.append(String.format( + formatWithUncertainty, + "DriftNanosPerSecond", + hasDriftNanosPerSecond() ? mDriftNanosPerSecond : null, + "DriftUncertaintyNanosPerSecond", + hasDriftUncertaintyNanosPerSecond() ? mDriftUncertaintyNanosPerSecond : null)); + } builder.append(String.format( format, "HardwareClockDiscontinuityCount", mHardwareClockDiscontinuityCount)); - builder.append(String.format( - format, - "ElapsedRealtimeNanos", - hasElapsedRealtimeNanos() ? mElapsedRealtimeNanos : null)); + if (hasElapsedRealtimeNanos() || hasElapsedRealtimeUncertaintyNanos()) { + builder.append(String.format( + formatWithUncertainty, + "ElapsedRealtimeNanos", + hasElapsedRealtimeNanos() ? mElapsedRealtimeNanos : null, + "ElapsedRealtimeUncertaintyNanos", + hasElapsedRealtimeUncertaintyNanos() ? mElapsedRealtimeUncertaintyNanos + : null)); + } - builder.append(String.format( - format, - "ElapsedRealtimeUncertaintyNanos", - hasElapsedRealtimeUncertaintyNanos() ? mElapsedRealtimeUncertaintyNanos : null)); + if (hasReferenceConstellationTypeForIsb()) { + builder.append(String.format(format, "ReferenceConstellationTypeForIsb", + mReferenceConstellationTypeForIsb)); + } + + if (hasReferenceCarrierFrequencyHzForIsb()) { + builder.append(String.format(format, "ReferenceCarrierFrequencyHzForIsb", + mReferenceCarrierFrequencyHzForIsb)); + } + + if (hasReferenceCodeTypeForIsb()) { + builder.append( + String.format(format, "ReferenceCodeTypeForIsb", mReferenceCodeTypeForIsb)); + } return builder.toString(); } @@ -639,6 +791,9 @@ public final class GnssClock implements Parcelable { setHardwareClockDiscontinuityCount(Integer.MIN_VALUE); resetElapsedRealtimeNanos(); resetElapsedRealtimeUncertaintyNanos(); + resetReferenceConstellationTypeForIsb(); + resetReferenceCarrierFrequencyHzForIsb(); + resetReferenceCodeTypeForIsb(); } private void setFlag(int flag) { diff --git a/location/java/android/location/GnssMeasurement.java b/location/java/android/location/GnssMeasurement.java index 3eeb3a2051e9..83a8995bee13 100644 --- a/location/java/android/location/GnssMeasurement.java +++ b/location/java/android/location/GnssMeasurement.java @@ -16,11 +16,21 @@ package android.location; +import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_AUTOMATIC_GAIN_CONTROL; +import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_CARRIER_CYCLES; +import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_CARRIER_FREQUENCY; +import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_CARRIER_PHASE; +import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_CARRIER_PHASE_UNCERTAINTY; +import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_RECEIVER_ISB; +import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_RECEIVER_ISB_UNCERTAINTY; +import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_SATELLITE_ISB; +import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_SATELLITE_ISB_UNCERTAINTY; +import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_SNR; + import android.annotation.FloatRange; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.TestApi; -import android.hardware.gnss.V1_0.IGnssMeasurementCallback.GnssMeasurementFlags; import android.os.Parcel; import android.os.Parcelable; @@ -53,19 +63,14 @@ public final class GnssMeasurement implements Parcelable { private double mSnrInDb; private double mAutomaticGainControlLevelInDb; @NonNull private String mCodeType; + private double mReceiverInterSignalBiasNanos; + private double mReceiverInterSignalBiasUncertaintyNanos; + private double mSatelliteInterSignalBiasNanos; + private double mSatelliteInterSignalBiasUncertaintyNanos; // The following enumerations must be in sync with the values declared in GNSS HAL. private static final int HAS_NO_FLAGS = 0; - private static final int HAS_SNR = GnssMeasurementFlags.HAS_SNR; - private static final int HAS_CARRIER_FREQUENCY = GnssMeasurementFlags.HAS_CARRIER_FREQUENCY; - private static final int HAS_CARRIER_CYCLES = GnssMeasurementFlags.HAS_CARRIER_CYCLES; - private static final int HAS_CARRIER_PHASE = GnssMeasurementFlags.HAS_CARRIER_PHASE; - private static final int HAS_CARRIER_PHASE_UNCERTAINTY = - GnssMeasurementFlags.HAS_CARRIER_PHASE_UNCERTAINTY; - private static final int HAS_AUTOMATIC_GAIN_CONTROL = - GnssMeasurementFlags.HAS_AUTOMATIC_GAIN_CONTROL; - private static final int HAS_CODE_TYPE = (1 << 14); private static final int HAS_BASEBAND_CN0 = (1 << 15); @@ -263,6 +268,12 @@ public final class GnssMeasurement implements Parcelable { mSnrInDb = measurement.mSnrInDb; mAutomaticGainControlLevelInDb = measurement.mAutomaticGainControlLevelInDb; mCodeType = measurement.mCodeType; + mReceiverInterSignalBiasNanos = measurement.mReceiverInterSignalBiasNanos; + mReceiverInterSignalBiasUncertaintyNanos = + measurement.mReceiverInterSignalBiasUncertaintyNanos; + mSatelliteInterSignalBiasNanos = measurement.mSatelliteInterSignalBiasNanos; + mSatelliteInterSignalBiasUncertaintyNanos = + measurement.mSatelliteInterSignalBiasUncertaintyNanos; } /** @@ -838,7 +849,6 @@ public final class GnssMeasurement implements Parcelable { @TestApi public void resetBasebandCn0DbHz() { resetFlag(HAS_BASEBAND_CN0); - mBasebandCn0DbHz = Double.NaN; } /** @@ -1169,7 +1179,6 @@ public final class GnssMeasurement implements Parcelable { @Deprecated public void resetCarrierPhase() { resetFlag(HAS_CARRIER_PHASE); - mCarrierPhase = Double.NaN; } /** @@ -1224,7 +1233,6 @@ public final class GnssMeasurement implements Parcelable { @Deprecated public void resetCarrierPhaseUncertainty() { resetFlag(HAS_CARRIER_PHASE_UNCERTAINTY); - mCarrierPhaseUncertainty = Double.NaN; } /** @@ -1295,7 +1303,6 @@ public final class GnssMeasurement implements Parcelable { @TestApi public void resetSnrInDb() { resetFlag(HAS_SNR); - mSnrInDb = Double.NaN; } /** @@ -1343,7 +1350,6 @@ public final class GnssMeasurement implements Parcelable { @TestApi public void resetAutomaticGainControlLevel() { resetFlag(HAS_AUTOMATIC_GAIN_CONTROL); - mAutomaticGainControlLevelInDb = Double.NaN; } /** @@ -1428,7 +1434,200 @@ public final class GnssMeasurement implements Parcelable { mCodeType = "UNKNOWN"; } - public static final @android.annotation.NonNull Creator<GnssMeasurement> CREATOR = new Creator<GnssMeasurement>() { + /** + * Returns {@code true} if {@link #getReceiverInterSignalBiasNanos()} is available, + * {@code false} otherwise. + */ + public boolean hasReceiverInterSignalBiasNanos() { + return isFlagSet(HAS_RECEIVER_ISB); + } + + /** + * Gets the GNSS measurement's receiver inter-signal bias in nanoseconds with sub-nanosecond + * accuracy. + * + * <p>This value is the estimated receiver-side inter-system (different from the + * constellation in {@link GnssClock#getReferenceConstellationTypeForIsb()} bias and + * inter-frequency (different from the carrier frequency in + * {@link GnssClock#getReferenceCarrierFrequencyHzForIsb()}) bias. The reported receiver + * inter-signal bias must include signal delays caused by: + * + * <ul> + * <li>Receiver inter-constellation bias</li> + * <li>Receiver inter-frequency bias</li> + * <li>Receiver inter-code bias</li> + * </ul> + * + * <p>The value does not include the inter-frequency Ionospheric bias. + * + * <p>The value is only available if {@link #hasReceiverInterSignalBiasNanos()} is {@code true}. + */ + public double getReceiverInterSignalBiasNanos() { + return mReceiverInterSignalBiasNanos; + } + + /** + * Sets the GNSS measurement's receiver inter-signal bias in nanoseconds. + * + * @hide + */ + @TestApi + public void setReceiverInterSignalBiasNanos(double receiverInterSignalBiasNanos) { + setFlag(HAS_RECEIVER_ISB); + mReceiverInterSignalBiasNanos = receiverInterSignalBiasNanos; + } + + /** + * Resets the GNSS measurement's receiver inter-signal bias in nanoseconds. + * + * @hide + */ + @TestApi + public void resetReceiverInterSignalBiasNanos() { + resetFlag(HAS_RECEIVER_ISB); + } + + /** + * Returns {@code true} if {@link #getReceiverInterSignalBiasUncertaintyNanos()} is available, + * {@code false} otherwise. + */ + public boolean hasReceiverInterSignalBiasUncertaintyNanos() { + return isFlagSet(HAS_RECEIVER_ISB_UNCERTAINTY); + } + + /** + * Gets the GNSS measurement's receiver inter-signal bias uncertainty (1 sigma) in + * nanoseconds with sub-nanosecond accuracy. + * + * <p>The value is only available if {@link #hasReceiverInterSignalBiasUncertaintyNanos()} is + * {@code true}. + */ + @FloatRange(from = 0.0) + public double getReceiverInterSignalBiasUncertaintyNanos() { + return mReceiverInterSignalBiasUncertaintyNanos; + } + + /** + * Sets the GNSS measurement's receiver inter-signal bias uncertainty (1 sigma) in nanoseconds. + * + * @hide + */ + @TestApi + public void setReceiverInterSignalBiasUncertaintyNanos(@FloatRange(from = 0.0) + double receiverInterSignalBiasUncertaintyNanos) { + setFlag(HAS_RECEIVER_ISB_UNCERTAINTY); + mReceiverInterSignalBiasUncertaintyNanos = receiverInterSignalBiasUncertaintyNanos; + } + + /** + * Resets the GNSS measurement's receiver inter-signal bias uncertainty (1 sigma) in + * nanoseconds. + * + * @hide + */ + @TestApi + public void resetReceiverInterSignalBiasUncertaintyNanos() { + resetFlag(HAS_RECEIVER_ISB_UNCERTAINTY); + } + + /** + * Returns {@code true} if {@link #getSatelliteInterSignalBiasNanos()} is available, + * {@code false} otherwise. + */ + public boolean hasSatelliteInterSignalBiasNanos() { + return isFlagSet(HAS_SATELLITE_ISB); + } + + /** + * Gets the GNSS measurement's satellite inter-signal bias in nanoseconds with sub-nanosecond + * accuracy. + * + * <p>This value is the satellite-and-control-segment-side inter-system (different from the + * constellation in {@link GnssClock#getReferenceConstellationTypeForIsb()}) bias and + * inter-frequency (different from the carrier frequency in + * {@link GnssClock#getReferenceCarrierFrequencyHzForIsb()}) bias, including: + * + * <ul> + * <li>Master clock bias (e.g., GPS-GAL Time Offset (GGTO), GPT-UTC Time Offset (TauGps), + * BDS-GLO Time Offset (BGTO))</li> + * <li>Group delay (e.g., Total Group Delay (TGD))</li> + * <li>Satellite inter-signal bias, which includes satellite inter-frequency bias (GLO only), + * and satellite inter-code bias (e.g., Differential Code Bias (DCB)).</li> + * </ul> + * + * <p>The value is only available if {@link #hasSatelliteInterSignalBiasNanos()} is {@code + * true}. + */ + public double getSatelliteInterSignalBiasNanos() { + return mSatelliteInterSignalBiasNanos; + } + + /** + * Sets the GNSS measurement's satellite inter-signal bias in nanoseconds. + * + * @hide + */ + @TestApi + public void setSatelliteInterSignalBiasNanos(double satelliteInterSignalBiasNanos) { + setFlag(HAS_SATELLITE_ISB); + mSatelliteInterSignalBiasNanos = satelliteInterSignalBiasNanos; + } + + /** + * Resets the GNSS measurement's satellite inter-signal bias in nanoseconds. + * + * @hide + */ + @TestApi + public void resetSatelliteInterSignalBiasNanos() { + resetFlag(HAS_SATELLITE_ISB); + } + + /** + * Returns {@code true} if {@link #getSatelliteInterSignalBiasUncertaintyNanos()} is available, + * {@code false} otherwise. + */ + public boolean hasSatelliteInterSignalBiasUncertaintyNanos() { + return isFlagSet(HAS_SATELLITE_ISB_UNCERTAINTY); + } + + /** + * Gets the GNSS measurement's satellite inter-signal bias uncertainty (1 sigma) in + * nanoseconds with sub-nanosecond accuracy. + * + * <p>The value is only available if {@link #hasSatelliteInterSignalBiasUncertaintyNanos()} is + * {@code true}. + */ + @FloatRange(from = 0.0) + public double getSatelliteInterSignalBiasUncertaintyNanos() { + return mSatelliteInterSignalBiasUncertaintyNanos; + } + + /** + * Sets the GNSS measurement's satellite inter-signal bias uncertainty (1 sigma) in nanoseconds. + * + * @hide + */ + @TestApi + public void setSatelliteInterSignalBiasUncertaintyNanos(@FloatRange(from = 0.0) + double satelliteInterSignalBiasUncertaintyNanos) { + setFlag(HAS_SATELLITE_ISB_UNCERTAINTY); + mSatelliteInterSignalBiasUncertaintyNanos = satelliteInterSignalBiasUncertaintyNanos; + } + + /** + * Resets the GNSS measurement's satellite inter-signal bias uncertainty (1 sigma) in + * nanoseconds. + * + * @hide + */ + @TestApi + public void resetSatelliteInterSignalBiasUncertaintyNanos() { + resetFlag(HAS_SATELLITE_ISB_UNCERTAINTY); + } + + + public static final @NonNull Creator<GnssMeasurement> CREATOR = new Creator<GnssMeasurement>() { @Override public GnssMeasurement createFromParcel(Parcel parcel) { GnssMeasurement gnssMeasurement = new GnssMeasurement(); @@ -1455,6 +1654,10 @@ public final class GnssMeasurement implements Parcelable { gnssMeasurement.mAutomaticGainControlLevelInDb = parcel.readDouble(); gnssMeasurement.mCodeType = parcel.readString(); gnssMeasurement.mBasebandCn0DbHz = parcel.readDouble(); + gnssMeasurement.mReceiverInterSignalBiasNanos = parcel.readDouble(); + gnssMeasurement.mReceiverInterSignalBiasUncertaintyNanos = parcel.readDouble(); + gnssMeasurement.mSatelliteInterSignalBiasNanos = parcel.readDouble(); + gnssMeasurement.mSatelliteInterSignalBiasUncertaintyNanos = parcel.readDouble(); return gnssMeasurement; } @@ -1489,6 +1692,10 @@ public final class GnssMeasurement implements Parcelable { parcel.writeDouble(mAutomaticGainControlLevelInDb); parcel.writeString(mCodeType); parcel.writeDouble(mBasebandCn0DbHz); + parcel.writeDouble(mReceiverInterSignalBiasNanos); + parcel.writeDouble(mReceiverInterSignalBiasUncertaintyNanos); + parcel.writeDouble(mSatelliteInterSignalBiasNanos); + parcel.writeDouble(mSatelliteInterSignalBiasUncertaintyNanos); } @Override @@ -1517,8 +1724,9 @@ public final class GnssMeasurement implements Parcelable { builder.append(String.format(format, "Cn0DbHz", mCn0DbHz)); - builder.append(String.format(format, "BasebandCn0DbHz", - hasBasebandCn0DbHz() ? mBasebandCn0DbHz : null)); + if (hasBasebandCn0DbHz()) { + builder.append(String.format(format, "BasebandCn0DbHz", mBasebandCn0DbHz)); + } builder.append(String.format( formatWithUncertainty, @@ -1539,37 +1747,57 @@ public final class GnssMeasurement implements Parcelable { "AccumulatedDeltaRangeUncertaintyMeters", mAccumulatedDeltaRangeUncertaintyMeters)); - builder.append(String.format( - format, - "CarrierFrequencyHz", - hasCarrierFrequencyHz() ? mCarrierFrequencyHz : null)); + if (hasCarrierFrequencyHz()) { + builder.append(String.format(format, "CarrierFrequencyHz", mCarrierFrequencyHz)); + } - builder.append(String.format( - format, - "CarrierCycles", - hasCarrierCycles() ? mCarrierCycles : null)); + if (hasCarrierCycles()) { + builder.append(String.format(format, "CarrierCycles", mCarrierCycles)); + } - builder.append(String.format( - formatWithUncertainty, - "CarrierPhase", - hasCarrierPhase() ? mCarrierPhase : null, - "CarrierPhaseUncertainty", - hasCarrierPhaseUncertainty() ? mCarrierPhaseUncertainty : null)); + if (hasCarrierPhase() || hasCarrierPhaseUncertainty()) { + builder.append(String.format( + formatWithUncertainty, + "CarrierPhase", + hasCarrierPhase() ? mCarrierPhase : null, + "CarrierPhaseUncertainty", + hasCarrierPhaseUncertainty() ? mCarrierPhaseUncertainty : null)); + } builder.append(String.format(format, "MultipathIndicator", getMultipathIndicatorString())); - builder.append(String.format( - format, - "SnrInDb", - hasSnrInDb() ? mSnrInDb : null)); - builder.append(String.format( - format, - "AgcLevelDb", - hasAutomaticGainControlLevelDb() ? mAutomaticGainControlLevelInDb : null)); - builder.append(String.format( - format, - "CodeType", - hasCodeType() ? mCodeType : null)); + if (hasSnrInDb()) { + builder.append(String.format(format, "SnrInDb", mSnrInDb)); + } + + if (hasAutomaticGainControlLevelDb()) { + builder.append(String.format(format, "AgcLevelDb", mAutomaticGainControlLevelInDb)); + } + + if (hasCodeType()) { + builder.append(String.format(format, "CodeType", mCodeType)); + } + + if (hasReceiverInterSignalBiasNanos() || hasReceiverInterSignalBiasUncertaintyNanos()) { + builder.append(String.format( + formatWithUncertainty, + "ReceiverInterSignalBiasNs", + hasReceiverInterSignalBiasNanos() ? mReceiverInterSignalBiasNanos : null, + "ReceiverInterSignalBiasUncertaintyNs", + hasReceiverInterSignalBiasUncertaintyNanos() + ? mReceiverInterSignalBiasUncertaintyNanos : null)); + } + + if (hasSatelliteInterSignalBiasNanos() || hasSatelliteInterSignalBiasUncertaintyNanos()) { + builder.append(String.format( + formatWithUncertainty, + "SatelliteInterSignalBiasNs", + hasSatelliteInterSignalBiasNanos() ? mSatelliteInterSignalBiasNanos : null, + "SatelliteInterSignalBiasUncertaintyNs", + hasSatelliteInterSignalBiasUncertaintyNanos() + ? mSatelliteInterSignalBiasUncertaintyNanos + : null)); + } return builder.toString(); } @@ -1596,6 +1824,10 @@ public final class GnssMeasurement implements Parcelable { resetAutomaticGainControlLevel(); resetCodeType(); resetBasebandCn0DbHz(); + resetReceiverInterSignalBiasNanos(); + resetReceiverInterSignalBiasUncertaintyNanos(); + resetSatelliteInterSignalBiasNanos(); + resetSatelliteInterSignalBiasUncertaintyNanos(); } private void setFlag(int flag) { diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index 00436bb8ca70..08a759227526 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -1208,6 +1208,22 @@ void GnssMeasurementCallback::translateSingleGnssMeasurement translateSingleGnssMeasurement(&(measurement_V2_1->v2_0), object); SET(BasebandCn0DbHz, measurement_V2_1->basebandCN0DbHz); + + if (measurement_V2_1->flags & GnssMeasurementFlags::HAS_RECEIVER_ISB) { + SET(ReceiverInterSignalBiasNs, measurement_V2_1->receiverInterSignalBiasNs); + } + + if (measurement_V2_1->flags & GnssMeasurementFlags::HAS_RECEIVER_ISB_UNCERTAINTY) { + SET(ReceiverInterSignalBiasUncertaintyNs, measurement_V2_1->receiverInterSignalBiasUncertaintyNs); + } + + if (measurement_V2_1->flags & GnssMeasurementFlags::HAS_SATELLITE_ISB) { + SET(SatelliteInterSignalBiasNs, measurement_V2_1->satelliteInterSignalBiasNs); + } + + if (measurement_V2_1->flags & GnssMeasurementFlags::HAS_SATELLITE_ISB_UNCERTAINTY) { + SET(SatelliteInterSignalBiasUncertaintyNs, measurement_V2_1->satelliteInterSignalBiasUncertaintyNs); + } } template<class T> @@ -1253,6 +1269,19 @@ void GnssMeasurementCallback::translateGnssClock( template<> void GnssMeasurementCallback::translateGnssClock( + JavaObject& object, const IGnssMeasurementCallback_V2_1::GnssClock& clock) { + JNIEnv* env = getJniEnv(); + SET(ReferenceConstellationTypeForIsb, + static_cast<int32_t>(clock.referenceSignalTypeForIsb.constellation)); + SET(ReferenceCarrierFrequencyHzForIsb, clock.referenceSignalTypeForIsb.carrierFrequencyHz); + SET(ReferenceCodeTypeForIsb, + env->NewStringUTF(clock.referenceSignalTypeForIsb.codeType.c_str())); + + translateGnssClock(object, clock.v1_0); +} + +template<> +void GnssMeasurementCallback::translateGnssClock( JavaObject& object, const IGnssMeasurementCallback_V2_0::GnssData& data) { auto elapsedRealtime = data.elapsedRealtime; uint16_t flags = static_cast<uint16_t>(elapsedRealtime.flags); @@ -1265,6 +1294,20 @@ void GnssMeasurementCallback::translateGnssClock( translateGnssClock(object, data.clock); } +template<> +void GnssMeasurementCallback::translateGnssClock( + JavaObject& object, const IGnssMeasurementCallback_V2_1::GnssData& data) { + auto elapsedRealtime = data.elapsedRealtime; + uint16_t flags = static_cast<uint16_t>(elapsedRealtime.flags); + if (flags & ElapsedRealtimeFlags::HAS_TIMESTAMP_NS) { + SET(ElapsedRealtimeNanos, static_cast<uint64_t>(elapsedRealtime.timestampNs)); + } + if (flags & ElapsedRealtimeFlags::HAS_TIME_UNCERTAINTY_NS) { + SET(ElapsedRealtimeUncertaintyNanos, static_cast<double>(elapsedRealtime.timeUncertaintyNs)); + } + translateGnssClock(object, data.clock); +} + template<class T> jobjectArray GnssMeasurementCallback::translateAllGnssMeasurements(JNIEnv* env, const T* measurements, |