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
diff --git a/Android.bp b/Android.bp
index 180e1d3..63ce833 100644
--- a/Android.bp
+++ b/Android.bp
@@ -319,6 +319,7 @@
"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 f899e40..8b35b0d 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -22955,6 +22955,7 @@
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 @@
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 95b0cae..d24ee8a 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -1086,6 +1086,7 @@
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 @@
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 ba85ae6..3aa8187 100644
--- a/api/test-lint-baseline.txt
+++ b/api/test-lint-baseline.txt
@@ -399,6 +399,8 @@
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 9013a96..70abbb3 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 @@
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 @@
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 @@
mReceivedSvTimeNanos = measurement.mReceivedSvTimeNanos;
mReceivedSvTimeUncertaintyNanos = measurement.mReceivedSvTimeUncertaintyNanos;
mCn0DbHz = measurement.mCn0DbHz;
+ mBasebandCn0DbHz = measurement.mBasebandCn0DbHz;
mPseudorangeRateMetersPerSecond = measurement.mPseudorangeRateMetersPerSecond;
mPseudorangeRateUncertaintyMetersPerSecond =
measurement.mPseudorangeRateUncertaintyMetersPerSecond;
@@ -788,6 +796,49 @@
}
/**
+ * 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.
+ *
+ * <p>Typical range: 0-50 dB-Hz.
+ *
+ * <p>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.
*
* <p>The error estimate for this value is
@@ -1400,6 +1451,7 @@
gnssMeasurement.mSnrInDb = parcel.readDouble();
gnssMeasurement.mAutomaticGainControlLevelInDb = parcel.readDouble();
gnssMeasurement.mCodeType = parcel.readString();
+ gnssMeasurement.mBasebandCn0DbHz = parcel.readDouble();
return gnssMeasurement;
}
@@ -1433,6 +1485,7 @@
parcel.writeDouble(mSnrInDb);
parcel.writeDouble(mAutomaticGainControlLevelInDb);
parcel.writeString(mCodeType);
+ parcel.writeDouble(mBasebandCn0DbHz);
}
@Override
@@ -1461,6 +1514,9 @@
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 @@
resetSnrInDb();
resetAutomaticGainControlLevel();
resetCodeType();
+ resetBasebandCn0DbHz();
}
private void setFlag(int flag) {