From 9fe06ddab868e54fb3f492884304f4551fad7597 Mon Sep 17 00:00:00 2001 From: Yu-Han Yang Date: Mon, 18 Nov 2019 16:23:31 -0800 Subject: [PATCH] Add basebandCn0Dbhz to GnssMeasurement The new basebandCn0DbHz is the carrier-to-noise density measured at the baseband. The old Cn0DbHz is measured at the attenna port. Adding the new field so that ecosystem will report both and avoid reporting inconsistent signal strengths in one field. See go/r-gnss-hal for detailed design. Bug: 136136192 Test: atest GnssMeasurementTest Change-Id: Ia8d3711e7422db5cae05d66138a3fae61bec0ae1 --- Android.bp | 1 + api/current.txt | 2 + api/test-current.txt | 2 + api/test-lint-baseline.txt | 2 + .../android/location/GnssMeasurement.java | 71 +++++++++++++++++-- 5 files changed, 71 insertions(+), 7 deletions(-) diff --git a/Android.bp b/Android.bp index 180e1d3c5deaf..63ce833998f07 100644 --- a/Android.bp +++ b/Android.bp @@ -319,6 +319,7 @@ java_library { "android.hardware.cas-V1.1-java", "android.hardware.cas-V1.0-java", "android.hardware.contexthub-V1.0-java", + "android.hardware.gnss-V1.0-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 f899e40edab45..8b35b0dd120fe 100644 --- a/api/current.txt +++ b/api/current.txt @@ -22955,6 +22955,7 @@ package android.location { method public int getAccumulatedDeltaRangeState(); method public double getAccumulatedDeltaRangeUncertaintyMeters(); method public double getAutomaticGainControlLevelDb(); + method @FloatRange(from=0, to=50) public double getBasebandCn0DbHz(); method @Deprecated public long getCarrierCycles(); method public float getCarrierFrequencyHz(); method @Deprecated public double getCarrierPhase(); @@ -22972,6 +22973,7 @@ package android.location { method public int getSvid(); method public double getTimeOffsetNanos(); method public boolean hasAutomaticGainControlLevelDb(); + method public boolean hasBasebandCn0DbHz(); method @Deprecated public boolean hasCarrierCycles(); method public boolean hasCarrierFrequencyHz(); method @Deprecated public boolean hasCarrierPhase(); diff --git a/api/test-current.txt b/api/test-current.txt index 95b0caea0d436..d24ee8a142ffd 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -1086,6 +1086,7 @@ package android.location { ctor public GnssMeasurement(); method public void reset(); method public void resetAutomaticGainControlLevel(); + method public void resetBasebandCn0DbHz(); method @Deprecated public void resetCarrierCycles(); method public void resetCarrierFrequencyHz(); method @Deprecated public void resetCarrierPhase(); @@ -1097,6 +1098,7 @@ package android.location { method public void setAccumulatedDeltaRangeState(int); method public void setAccumulatedDeltaRangeUncertaintyMeters(double); method public void setAutomaticGainControlLevelInDb(double); + method public void setBasebandCn0DbHz(double); method @Deprecated public void setCarrierCycles(long); method public void setCarrierFrequencyHz(float); method @Deprecated public void setCarrierPhase(double); diff --git a/api/test-lint-baseline.txt b/api/test-lint-baseline.txt index ba85ae66cd1ac..3aa8187c0a79d 100644 --- a/api/test-lint-baseline.txt +++ b/api/test-lint-baseline.txt @@ -399,6 +399,8 @@ GetterSetterNames: android.location.GnssClock#setLeapSecond(int): GetterSetterNames: android.location.GnssClock#setTimeUncertaintyNanos(double): +GetterSetterNames: android.location.GnssMeasurement#setBasebandCn0DbHz(double): + GetterSetterNames: android.location.GnssMeasurement#setCarrierFrequencyHz(float): GetterSetterNames: android.location.GnssMeasurement#setCodeType(String): diff --git a/location/java/android/location/GnssMeasurement.java b/location/java/android/location/GnssMeasurement.java index 9013a96035590..70abbb3019fcb 100644 --- a/location/java/android/location/GnssMeasurement.java +++ b/location/java/android/location/GnssMeasurement.java @@ -16,9 +16,11 @@ package android.location; +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; @@ -37,6 +39,7 @@ public final class GnssMeasurement implements Parcelable { private long mReceivedSvTimeNanos; private long mReceivedSvTimeUncertaintyNanos; private double mCn0DbHz; + private double mBasebandCn0DbHz; private double mPseudorangeRateMetersPerSecond; private double mPseudorangeRateUncertaintyMetersPerSecond; private int mAccumulatedDeltaRangeState; @@ -51,16 +54,20 @@ public final class GnssMeasurement implements Parcelable { private double mAutomaticGainControlLevelInDb; @NonNull private String mCodeType; - // The following enumerations must be in sync with the values declared in gps.h + // 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 = (1<<0); - private static final int HAS_CARRIER_FREQUENCY = (1<<9); - private static final int HAS_CARRIER_CYCLES = (1<<10); - private static final int HAS_CARRIER_PHASE = (1<<11); - private static final int HAS_CARRIER_PHASE_UNCERTAINTY = (1<<12); - private static final int HAS_AUTOMATIC_GAIN_CONTROL = (1<<13); + 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); /** * The status of the multipath indicator. @@ -240,6 +247,7 @@ public final class GnssMeasurement implements Parcelable { mReceivedSvTimeNanos = measurement.mReceivedSvTimeNanos; mReceivedSvTimeUncertaintyNanos = measurement.mReceivedSvTimeUncertaintyNanos; mCn0DbHz = measurement.mCn0DbHz; + mBasebandCn0DbHz = measurement.mBasebandCn0DbHz; mPseudorangeRateMetersPerSecond = measurement.mPseudorangeRateMetersPerSecond; mPseudorangeRateUncertaintyMetersPerSecond = measurement.mPseudorangeRateUncertaintyMetersPerSecond; @@ -787,6 +795,49 @@ public final class GnssMeasurement implements Parcelable { mCn0DbHz = value; } + /** + * Returns {@code true} if {@link #getBasebandCn0DbHz()} is available, {@code false} otherwise. + */ + public boolean hasBasebandCn0DbHz() { + return isFlagSet(HAS_BASEBAND_CN0); + } + + /** + * Gets the baseband carrier-to-noise density in dB-Hz. + * + *

Typical range: 0-50 dB-Hz. + * + *

The value contains the measured C/N0 for the signal at the baseband. This is typically + * a few dB weaker than the value estimated for C/N0 at the antenna port, which is reported + * in {@link #getCn0DbHz()}. + */ + @FloatRange(from = 0, to = 50) + public double getBasebandCn0DbHz() { + return mBasebandCn0DbHz; + } + + /** + * Sets the baseband carrier-to-noise density in dB-Hz. + * + * @hide + */ + @TestApi + public void setBasebandCn0DbHz(double value) { + setFlag(HAS_BASEBAND_CN0); + mBasebandCn0DbHz = value; + } + + /** + * Resets the baseband carrier-to-noise density in dB-Hz. + * + * @hide + */ + @TestApi + public void resetBasebandCn0DbHz() { + resetFlag(HAS_BASEBAND_CN0); + mBasebandCn0DbHz = Double.NaN; + } + /** * Gets the Pseudorange rate at the timestamp in m/s. * @@ -1400,6 +1451,7 @@ public final class GnssMeasurement implements Parcelable { gnssMeasurement.mSnrInDb = parcel.readDouble(); gnssMeasurement.mAutomaticGainControlLevelInDb = parcel.readDouble(); gnssMeasurement.mCodeType = parcel.readString(); + gnssMeasurement.mBasebandCn0DbHz = parcel.readDouble(); return gnssMeasurement; } @@ -1433,6 +1485,7 @@ public final class GnssMeasurement implements Parcelable { parcel.writeDouble(mSnrInDb); parcel.writeDouble(mAutomaticGainControlLevelInDb); parcel.writeString(mCodeType); + parcel.writeDouble(mBasebandCn0DbHz); } @Override @@ -1461,6 +1514,9 @@ public final class GnssMeasurement implements Parcelable { builder.append(String.format(format, "Cn0DbHz", mCn0DbHz)); + builder.append(String.format(format, "BasebandCn0DbHz", + hasBasebandCn0DbHz() ? mBasebandCn0DbHz : null)); + builder.append(String.format( formatWithUncertainty, "PseudorangeRateMetersPerSecond", @@ -1536,6 +1592,7 @@ public final class GnssMeasurement implements Parcelable { resetSnrInDb(); resetAutomaticGainControlLevel(); resetCodeType(); + resetBasebandCn0DbHz(); } private void setFlag(int flag) {