summaryrefslogtreecommitdiff
path: root/location/java
diff options
context:
space:
mode:
author Yu-Han Yang <yuhany@google.com> 2019-11-22 13:50:41 -0800
committer Yu-Han Yang <yuhany@google.com> 2019-11-26 16:37:16 +0000
commit15e4303a5bfe69a90c6003dd7fb90010ee70cd97 (patch)
tree066bc2040b5db329102ba4a1bd92e3e89f3aad62 /location/java
parentb485ee50a14c1b7838bedaae37dc7857d9f30869 (diff)
Add basebandCn0DbHz to GnssStatus
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 GnssStatusTest Change-Id: Idbfb611c6cb1c8d00c1f3bb719e422177a5ff7f2
Diffstat (limited to 'location/java')
-rw-r--r--location/java/android/location/GnssStatus.java59
-rw-r--r--location/java/android/location/IGnssStatusListener.aidl2
-rw-r--r--location/java/android/location/LocationManager.java5
3 files changed, 52 insertions, 14 deletions
diff --git a/location/java/android/location/GnssStatus.java b/location/java/android/location/GnssStatus.java
index 2f1eeda9c4cf..89a3bc070578 100644
--- a/location/java/android/location/GnssStatus.java
+++ b/location/java/android/location/GnssStatus.java
@@ -34,7 +34,7 @@ import java.util.ArrayList;
*/
public final class GnssStatus {
- // these must match the definitions in gps.h
+ // These must match the definitions in GNSS HAL.
//
// Note: these constants are also duplicated in GnssStatusCompat.java in the androidx support
// library. if adding a constellation, please update that file as well.
@@ -63,9 +63,10 @@ public final class GnssStatus {
private static final int SVID_FLAGS_HAS_ALMANAC_DATA = (1 << 1);
private static final int SVID_FLAGS_USED_IN_FIX = (1 << 2);
private static final int SVID_FLAGS_HAS_CARRIER_FREQUENCY = (1 << 3);
+ private static final int SVID_FLAGS_HAS_BASEBAND_CN0 = (1 << 4);
- private static final int SVID_SHIFT_WIDTH = 8;
- private static final int CONSTELLATION_TYPE_SHIFT_WIDTH = 4;
+ private static final int SVID_SHIFT_WIDTH = 12;
+ private static final int CONSTELLATION_TYPE_SHIFT_WIDTH = 8;
private static final int CONSTELLATION_TYPE_MASK = 0xf;
/**
@@ -123,9 +124,10 @@ public final class GnssStatus {
*/
@NonNull
public static GnssStatus wrap(int svCount, int[] svidWithFlags, float[] cn0DbHzs,
- float[] elevations, float[] azimuths, float[] carrierFrequencies) {
+ float[] elevations, float[] azimuths, float[] carrierFrequencies,
+ float[] basebandCn0DbHzs) {
return new GnssStatus(svCount, svidWithFlags, cn0DbHzs, elevations, azimuths,
- carrierFrequencies);
+ carrierFrequencies, basebandCn0DbHzs);
}
private final int mSvCount;
@@ -134,15 +136,17 @@ public final class GnssStatus {
private final float[] mElevations;
private final float[] mAzimuths;
private final float[] mCarrierFrequencies;
+ private final float[] mBasebandCn0DbHzs;
private GnssStatus(int svCount, int[] svidWithFlags, float[] cn0DbHzs, float[] elevations,
- float[] azimuths, float[] carrierFrequencies) {
+ float[] azimuths, float[] carrierFrequencies, float[] basebandCn0DbHzs) {
mSvCount = svCount;
mSvidWithFlags = svidWithFlags;
mCn0DbHzs = cn0DbHzs;
mElevations = elevations;
mAzimuths = azimuths;
mCarrierFrequencies = carrierFrequencies;
+ mBasebandCn0DbHzs = basebandCn0DbHzs;
}
/**
@@ -284,6 +288,26 @@ public final class GnssStatus {
}
/**
+ * Reports whether a valid {@link #getBasebandCn0DbHz(int satelliteIndex)} is available.
+ *
+ * @param satelliteIndex An index from zero to {@link #getSatelliteCount()} - 1
+ */
+ public boolean hasBasebandCn0DbHz(@IntRange(from = 0) int satelliteIndex) {
+ return (mSvidWithFlags[satelliteIndex] & SVID_FLAGS_HAS_BASEBAND_CN0) != 0;
+ }
+
+ /**
+ * Retrieves the baseband carrier-to-noise density of the satellite at the specified index in
+ * dB-Hz.
+ *
+ * @param satelliteIndex An index from zero to {@link #getSatelliteCount()} - 1
+ */
+ @FloatRange(from = 0, to = 63)
+ public float getBasebandCn0DbHz(@IntRange(from = 0) int satelliteIndex) {
+ return mBasebandCn0DbHzs[satelliteIndex];
+ }
+
+ /**
* Returns the string representation of a constellation type.
*
* @param constellationType the constellation type.
@@ -334,6 +358,8 @@ public final class GnssStatus {
* @param usedInFix whether the satellite was used in the most recent location fix
* @param hasCarrierFrequency whether carrier frequency data is available
* @param carrierFrequency satellite carrier frequency in Hz
+ * @param hasBasebandCn0DbHz whether baseband carrier-to-noise density is available
+ * @param basebandCn0DbHz baseband carrier-to-noise density in dB-Hz
*/
@NonNull
public Builder addSatellite(@ConstellationType int constellationType,
@@ -345,9 +371,12 @@ public final class GnssStatus {
boolean hasAlmanac,
boolean usedInFix,
boolean hasCarrierFrequency,
- @FloatRange(from = 0) float carrierFrequency) {
+ @FloatRange(from = 0) float carrierFrequency,
+ boolean hasBasebandCn0DbHz,
+ @FloatRange(from = 0, to = 63) float basebandCn0DbHz) {
mSatellites.add(new GnssSvInfo(constellationType, svid, cn0DbHz, elevation, azimuth,
- hasEphemeris, hasAlmanac, usedInFix, hasCarrierFrequency, carrierFrequency));
+ hasEphemeris, hasAlmanac, usedInFix, hasCarrierFrequency, carrierFrequency,
+ hasBasebandCn0DbHz, basebandCn0DbHz));
return this;
}
@@ -371,6 +400,7 @@ public final class GnssStatus {
float[] elevations = new float[svCount];
float[] azimuths = new float[svCount];
float[] carrierFrequencies = new float[svCount];
+ float[] basebandCn0DbHzs = new float[svCount];
for (int i = 0; i < svidWithFlags.length; i++) {
svidWithFlags[i] = mSatellites.get(i).mSvidWithFlags;
@@ -387,9 +417,12 @@ public final class GnssStatus {
for (int i = 0; i < carrierFrequencies.length; i++) {
carrierFrequencies[i] = mSatellites.get(i).mCarrierFrequency;
}
+ for (int i = 0; i < basebandCn0DbHzs.length; i++) {
+ basebandCn0DbHzs[i] = mSatellites.get(i).mBasebandCn0DbHz;
+ }
return wrap(svCount, svidWithFlags, cn0DbHzs, elevations, azimuths,
- carrierFrequencies);
+ carrierFrequencies, basebandCn0DbHzs);
}
}
@@ -400,21 +433,25 @@ public final class GnssStatus {
private final float mElevation;
private final float mAzimuth;
private final float mCarrierFrequency;
+ private final float mBasebandCn0DbHz;
private GnssSvInfo(int constellationType, int svid, float cn0DbHz,
float elevation, float azimuth, boolean hasEphemeris, boolean hasAlmanac,
- boolean usedInFix, boolean hasCarrierFrequency, float carrierFrequency) {
+ boolean usedInFix, boolean hasCarrierFrequency, float carrierFrequency,
+ boolean hasBasebandCn0DbHz, float basebandCn0DbHz) {
mSvidWithFlags = (svid << SVID_SHIFT_WIDTH)
| ((constellationType & CONSTELLATION_TYPE_MASK)
<< CONSTELLATION_TYPE_SHIFT_WIDTH)
| (hasEphemeris ? SVID_FLAGS_HAS_EPHEMERIS_DATA : SVID_FLAGS_NONE)
| (hasAlmanac ? SVID_FLAGS_HAS_ALMANAC_DATA : SVID_FLAGS_NONE)
| (usedInFix ? SVID_FLAGS_USED_IN_FIX : SVID_FLAGS_NONE)
- | (hasCarrierFrequency ? SVID_FLAGS_HAS_CARRIER_FREQUENCY : SVID_FLAGS_NONE);
+ | (hasCarrierFrequency ? SVID_FLAGS_HAS_CARRIER_FREQUENCY : SVID_FLAGS_NONE)
+ | (hasBasebandCn0DbHz ? SVID_FLAGS_HAS_BASEBAND_CN0 : SVID_FLAGS_NONE);
mCn0DbHz = cn0DbHz;
mElevation = elevation;
mAzimuth = azimuth;
mCarrierFrequency = carrierFrequency;
+ mBasebandCn0DbHz = basebandCn0DbHz;
}
}
}
diff --git a/location/java/android/location/IGnssStatusListener.aidl b/location/java/android/location/IGnssStatusListener.aidl
index d824cb18765a..1931a005d66f 100644
--- a/location/java/android/location/IGnssStatusListener.aidl
+++ b/location/java/android/location/IGnssStatusListener.aidl
@@ -28,6 +28,6 @@ oneway interface IGnssStatusListener
void onFirstFix(int ttff);
void onSvStatusChanged(int svCount, in int[] svidWithFlags, in float[] cn0s,
in float[] elevations, in float[] azimuths,
- in float[] carrierFreqs);
+ in float[] carrierFreqs, in float[] basebandCn0s);
void onNmeaReceived(long timestamp, String nmea);
}
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 75e1cd45689c..c0041722c475 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -2818,9 +2818,10 @@ public class LocationManager {
@Override
public void onSvStatusChanged(int svCount, int[] svidWithFlags, float[] cn0s,
- float[] elevations, float[] azimuths, float[] carrierFreqs) {
+ float[] elevations, float[] azimuths, float[] carrierFreqs,
+ float[] basebandCn0s) {
GnssStatus localStatus = GnssStatus.wrap(svCount, svidWithFlags, cn0s,
- elevations, azimuths, carrierFreqs);
+ elevations, azimuths, carrierFreqs, basebandCn0s);
mGnssStatus = localStatus;
execute((callback) -> callback.onSatelliteStatusChanged(localStatus));
}