Merge "Make GnssStatus and GpsStatus testable"

This commit is contained in:
Soonil Nagarkar
2019-11-14 22:04:37 +00:00
committed by Android (Google) Code Review
6 changed files with 306 additions and 203 deletions

View File

@@ -23039,17 +23039,17 @@ package android.location {
}
public final class GnssStatus {
method public float getAzimuthDegrees(int);
method public float getCarrierFrequencyHz(int);
method public float getCn0DbHz(int);
method public int getConstellationType(int);
method public float getElevationDegrees(int);
method public int getSatelliteCount();
method public int getSvid(int);
method public boolean hasAlmanacData(int);
method public boolean hasCarrierFrequencyHz(int);
method public boolean hasEphemerisData(int);
method public boolean usedInFix(int);
method @FloatRange(from=0, to=360) public float getAzimuthDegrees(@IntRange(from=0) int);
method @FloatRange(from=0) public float getCarrierFrequencyHz(@IntRange(from=0) int);
method @FloatRange(from=0, to=63) public float getCn0DbHz(@IntRange(from=0) int);
method public int getConstellationType(@IntRange(from=0) int);
method @FloatRange(from=0xffffffa6, to=90) public float getElevationDegrees(@IntRange(from=0) int);
method @IntRange(from=0) public int getSatelliteCount();
method @IntRange(from=1, to=200) public int getSvid(@IntRange(from=0) int);
method public boolean hasAlmanacData(@IntRange(from=0) int);
method public boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
method public boolean hasEphemerisData(@IntRange(from=0) int);
method public boolean usedInFix(@IntRange(from=0) int);
field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
field public static final int CONSTELLATION_GALILEO = 6; // 0x6
field public static final int CONSTELLATION_GLONASS = 3; // 0x3
@@ -23060,10 +23060,17 @@ package android.location {
field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
}
public static final class GnssStatus.Builder {
ctor public GnssStatus.Builder();
method @NonNull public android.location.GnssStatus.Builder addSatellite(int, @IntRange(from=1, to=200) int, @FloatRange(from=0, to=63) float, @FloatRange(from=0xffffffa6, to=90) float, @FloatRange(from=0, to=360) float, boolean, boolean, boolean, boolean, @FloatRange(from=0) float);
method @NonNull public android.location.GnssStatus build();
method @NonNull public android.location.GnssStatus.Builder clearSatellites();
}
public abstract static class GnssStatus.Callback {
ctor public GnssStatus.Callback();
method public void onFirstFix(int);
method public void onSatelliteStatusChanged(android.location.GnssStatus);
method public void onSatelliteStatusChanged(@NonNull android.location.GnssStatus);
method public void onStarted();
method public void onStopped();
}
@@ -23079,6 +23086,7 @@ package android.location {
}
@Deprecated public final class GpsStatus {
method @Deprecated @NonNull public static android.location.GpsStatus create(@NonNull android.location.GnssStatus, int);
method @Deprecated public int getMaxSatellites();
method @Deprecated public Iterable<android.location.GpsSatellite> getSatellites();
method @Deprecated public int getTimeToFirstFix();

View File

@@ -16,15 +16,21 @@
package android.location;
import android.annotation.FloatRange;
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
/**
* This class represents the current state of the GNSS engine.
* This class is used in conjunction with the {@link GnssStatus.Callback}.
* This class represents the current state of the GNSS engine and is used in conjunction with
* {@link GnssStatus.Callback}.
*
* @see LocationManager#registerGnssStatusCallback
* @see GnssStatus.Callback
*/
public final class GnssStatus {
@@ -52,75 +58,88 @@ public final class GnssStatus {
/** @hide */
public static final int CONSTELLATION_COUNT = 8;
/** @hide */
public static final int GNSS_SV_FLAGS_NONE = 0;
/** @hide */
public static final int GNSS_SV_FLAGS_HAS_EPHEMERIS_DATA = (1 << 0);
/** @hide */
public static final int GNSS_SV_FLAGS_HAS_ALMANAC_DATA = (1 << 1);
/** @hide */
public static final int GNSS_SV_FLAGS_USED_IN_FIX = (1 << 2);
/** @hide */
public static final int GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY = (1 << 3);
private static final int SVID_FLAGS_NONE = 0;
private static final int SVID_FLAGS_HAS_EPHEMERIS_DATA = (1 << 0);
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);
/** @hide */
public static final int SVID_SHIFT_WIDTH = 8;
/** @hide */
public static final int CONSTELLATION_TYPE_SHIFT_WIDTH = 4;
/** @hide */
public static final int CONSTELLATION_TYPE_MASK = 0xf;
private static final int SVID_SHIFT_WIDTH = 8;
private static final int CONSTELLATION_TYPE_SHIFT_WIDTH = 4;
private static final int CONSTELLATION_TYPE_MASK = 0xf;
/**
* Used for receiving notifications when GNSS events happen.
*
* @see LocationManager#registerGnssStatusCallback
*/
public static abstract class Callback {
/**
* Called when GNSS system has started.
*/
public void onStarted() {}
public void onStarted() {
}
/**
* Called when GNSS system has stopped.
*/
public void onStopped() {}
public void onStopped() {
}
/**
* Called when the GNSS system has received its first fix since starting.
*
* @param ttffMillis the time from start to first fix in milliseconds.
*/
public void onFirstFix(int ttffMillis) {}
public void onFirstFix(int ttffMillis) {
}
/**
* Called periodically to report GNSS satellite status.
*
* @param status the current status of all satellites.
*/
public void onSatelliteStatusChanged(GnssStatus status) {}
public void onSatelliteStatusChanged(@NonNull GnssStatus status) {
}
}
/**
* Constellation type.
*
* @hide
*/
@Retention(RetentionPolicy.SOURCE)
@IntDef({CONSTELLATION_UNKNOWN, CONSTELLATION_GPS, CONSTELLATION_SBAS, CONSTELLATION_GLONASS,
CONSTELLATION_QZSS, CONSTELLATION_BEIDOU, CONSTELLATION_GALILEO, CONSTELLATION_IRNSS})
public @interface ConstellationType {}
final int[] mSvidWithFlags;
final float[] mCn0DbHz;
final float[] mElevations;
final float[] mAzimuths;
final int mSvCount;
final float[] mCarrierFrequencies;
public @interface ConstellationType {
}
/**
* Create a GnssStatus that wraps the given arguments without any additional overhead. Callers
* are responsible for guaranteeing that the arguments are never modified after calling this
* method.
*
* @hide
*/
public GnssStatus(int svCount, int[] svidWithFlags, float[] cn0s, float[] elevations,
@NonNull
public static GnssStatus wrap(int svCount, int[] svidWithFlags, float[] cn0DbHzs,
float[] elevations, float[] azimuths, float[] carrierFrequencies) {
return new GnssStatus(svCount, svidWithFlags, cn0DbHzs, elevations, azimuths,
carrierFrequencies);
}
private final int mSvCount;
private final int[] mSvidWithFlags;
private final float[] mCn0DbHzs;
private final float[] mElevations;
private final float[] mAzimuths;
private final float[] mCarrierFrequencies;
private GnssStatus(int svCount, int[] svidWithFlags, float[] cn0DbHzs, float[] elevations,
float[] azimuths, float[] carrierFrequencies) {
mSvCount = svCount;
mSvidWithFlags = svidWithFlags;
mCn0DbHz = cn0s;
mCn0DbHzs = cn0DbHzs;
mElevations = elevations;
mAzimuths = azimuths;
mCarrierFrequencies = carrierFrequencies;
@@ -129,6 +148,7 @@ public final class GnssStatus {
/**
* Gets the total number of satellites in satellite list.
*/
@IntRange(from = 0)
public int getSatelliteCount() {
return mSvCount;
}
@@ -136,11 +156,11 @@ public final class GnssStatus {
/**
* Retrieves the constellation type of the satellite at the specified index.
*
* @param satIndex the index of the satellite in the list.
* @param satelliteIndex An index from zero to {@link #getSatelliteCount()} - 1
*/
@ConstellationType
public int getConstellationType(int satIndex) {
return ((mSvidWithFlags[satIndex] >> CONSTELLATION_TYPE_SHIFT_WIDTH)
public int getConstellationType(@IntRange(from = 0) int satelliteIndex) {
return ((mSvidWithFlags[satelliteIndex] >> CONSTELLATION_TYPE_SHIFT_WIDTH)
& CONSTELLATION_TYPE_MASK);
}
@@ -158,110 +178,113 @@ public final class GnssStatus {
* <li>SBAS: 120-151, 183-192</li>
* <li>GLONASS: One of: OSN, or FCN+100
* <ul>
* <li>1-24 as the orbital slot number (OSN) (preferred, if known)</li>
* <li>93-106 as the frequency channel number (FCN) (-7 to +6) plus 100.
* i.e. encode FCN of -7 as 93, 0 as 100, and +6 as 106</li>
* <li>1-24 as the orbital slot number (OSN) (preferred, if known)</li>
* <li>93-106 as the frequency channel number (FCN) (-7 to +6) plus 100.
* i.e. encode FCN of -7 as 93, 0 as 100, and +6 as 106</li>
* </ul></li>
* <li>QZSS: 193-200</li>
* <li>Galileo: 1-36</li>
* <li>Beidou: 1-37</li>
* </ul>
*
* @param satIndex the index of the satellite in the list.
* @param satelliteIndex An index from zero to {@link #getSatelliteCount()} - 1
*/
public int getSvid(int satIndex) {
return mSvidWithFlags[satIndex] >> SVID_SHIFT_WIDTH;
@IntRange(from = 1, to = 200)
public int getSvid(@IntRange(from = 0) int satelliteIndex) {
return mSvidWithFlags[satelliteIndex] >> SVID_SHIFT_WIDTH;
}
/**
* Retrieves the carrier-to-noise density at the antenna of the satellite at the specified index
* in dB-Hz.
*
* @param satIndex the index of the satellite in the list.
* @param satelliteIndex An index from zero to {@link #getSatelliteCount()} - 1
*/
public float getCn0DbHz(int satIndex) {
return mCn0DbHz[satIndex];
@FloatRange(from = 0, to = 63)
public float getCn0DbHz(@IntRange(from = 0) int satelliteIndex) {
return mCn0DbHzs[satelliteIndex];
}
/**
* Retrieves the elevation of the satellite at the specified index.
*
* @param satIndex the index of the satellite in the list.
* @param satelliteIndex An index from zero to {@link #getSatelliteCount()} - 1
*/
public float getElevationDegrees(int satIndex) {
return mElevations[satIndex];
@FloatRange(from = -90, to = 90)
public float getElevationDegrees(@IntRange(from = 0) int satelliteIndex) {
return mElevations[satelliteIndex];
}
/**
* Retrieves the azimuth the satellite at the specified index.
*
* @param satIndex the index of the satellite in the list.
* @param satelliteIndex An index from zero to {@link #getSatelliteCount()} - 1
*/
public float getAzimuthDegrees(int satIndex) {
return mAzimuths[satIndex];
@FloatRange(from = 0, to = 360)
public float getAzimuthDegrees(@IntRange(from = 0) int satelliteIndex) {
return mAzimuths[satelliteIndex];
}
/**
* Reports whether the satellite at the specified index has ephemeris data.
*
* @param satIndex the index of the satellite in the list.
* @param satelliteIndex An index from zero to {@link #getSatelliteCount()} - 1
*/
public boolean hasEphemerisData(int satIndex) {
return (mSvidWithFlags[satIndex] & GNSS_SV_FLAGS_HAS_EPHEMERIS_DATA) != 0;
public boolean hasEphemerisData(@IntRange(from = 0) int satelliteIndex) {
return (mSvidWithFlags[satelliteIndex] & SVID_FLAGS_HAS_EPHEMERIS_DATA) != 0;
}
/**
* Reports whether the satellite at the specified index has almanac data.
*
* @param satIndex the index of the satellite in the list.
* @param satelliteIndex An index from zero to {@link #getSatelliteCount()} - 1
*/
public boolean hasAlmanacData(int satIndex) {
return (mSvidWithFlags[satIndex] & GNSS_SV_FLAGS_HAS_ALMANAC_DATA) != 0;
public boolean hasAlmanacData(@IntRange(from = 0) int satelliteIndex) {
return (mSvidWithFlags[satelliteIndex] & SVID_FLAGS_HAS_ALMANAC_DATA) != 0;
}
/**
* Reports whether the satellite at the specified index was used in the calculation of the most
* recent position fix.
*
* @param satIndex the index of the satellite in the list.
* @param satelliteIndex An index from zero to {@link #getSatelliteCount()} - 1
*/
public boolean usedInFix(int satIndex) {
return (mSvidWithFlags[satIndex] & GNSS_SV_FLAGS_USED_IN_FIX) != 0;
public boolean usedInFix(@IntRange(from = 0) int satelliteIndex) {
return (mSvidWithFlags[satelliteIndex] & SVID_FLAGS_USED_IN_FIX) != 0;
}
/**
* Reports whether a valid {@link #getCarrierFrequencyHz(int satIndex)} is available.
* Reports whether a valid {@link #getCarrierFrequencyHz(int satelliteIndex)} is available.
*
* @param satIndex the index of the satellite in the list.
* @param satelliteIndex An index from zero to {@link #getSatelliteCount()} - 1
*/
public boolean hasCarrierFrequencyHz(int satIndex) {
return (mSvidWithFlags[satIndex] & GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY) != 0;
public boolean hasCarrierFrequencyHz(@IntRange(from = 0) int satelliteIndex) {
return (mSvidWithFlags[satelliteIndex] & SVID_FLAGS_HAS_CARRIER_FREQUENCY) != 0;
}
/**
* Gets the carrier frequency of the signal tracked.
*
* <p>For example it can be the GPS central frequency for L1 = 1575.45 MHz, or L2 = 1227.60 MHz,
* L5 = 1176.45 MHz, varying GLO channels, etc. If the field is not set, it is the primary
* <p>For example it can be the GPS central frequency for L1 = 1575.45 MHz, or L2 = 1227.60
* MHz, L5 = 1176.45 MHz, varying GLO channels, etc. If the field is not set, it is the primary
* common use central frequency, e.g. L1 = 1575.45 MHz for GPS.
*
* For an L1, L5 receiver tracking a satellite on L1 and L5 at the same time, two measurements
* will be reported for this same satellite, in one all the values related to L1 will be filled,
* and in the other all of the values related to L5 will be filled.
* will be reported for this same satellite, in one all the values related to L1 will be
* filled, and in the other all of the values related to L5 will be filled.
*
* <p>The value is only available if {@link #hasCarrierFrequencyHz(int satIndex)} is {@code true}.
* <p>The value is only available if {@link #hasCarrierFrequencyHz(int satelliteIndex)} is
* {@code true}.
*
* @param satIndex the index of the satellite in the list.
*
* @return the carrier frequency of the signal tracked in Hz.
* @param satelliteIndex An index from zero to {@link #getSatelliteCount()} - 1
*/
public float getCarrierFrequencyHz(int satIndex) {
return mCarrierFrequencies[satIndex];
@FloatRange(from = 0)
public float getCarrierFrequencyHz(@IntRange(from = 0) int satelliteIndex) {
return mCarrierFrequencies[satelliteIndex];
}
/**
* Returns the string representation of a constellation type. For example,
* {@link #CONSTELLATION_GPS} is represented by the string GPS.
* Returns the string representation of a constellation type.
*
* @param constellationType the constellation type.
* @return the string representation.
@@ -290,4 +313,108 @@ public final class GnssStatus {
return Integer.toString(constellationType);
}
}
/**
* Builder class to help create new GnssStatus instances.
*/
public static final class Builder {
private final ArrayList<GnssSvInfo> mSatellites = new ArrayList<>();
/**
* Adds a new satellite to the Builder.
*
* @param constellationType one of the CONSTELLATION_* constants
* @param svid the space vehicle identifier
* @param cn0DbHz carrier-to-noise density at the antenna in dB-Hz
* @param elevation satellite elevation in degrees
* @param azimuth satellite azimuth in degrees
* @param hasEphemeris whether the satellite has ephemeris data
* @param hasAlmanac whether the satellite has almanac data
* @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
*/
@NonNull
public Builder addSatellite(@ConstellationType int constellationType,
@IntRange(from = 1, to = 200) int svid,
@FloatRange(from = 0, to = 63) float cn0DbHz,
@FloatRange(from = -90, to = 90) float elevation,
@FloatRange(from = 0, to = 360) float azimuth,
boolean hasEphemeris,
boolean hasAlmanac,
boolean usedInFix,
boolean hasCarrierFrequency,
@FloatRange(from = 0) float carrierFrequency) {
mSatellites.add(new GnssSvInfo(constellationType, svid, cn0DbHz, elevation, azimuth,
hasEphemeris, hasAlmanac, usedInFix, hasCarrierFrequency, carrierFrequency));
return this;
}
/**
* Clears all satellites in the Builder.
*/
@NonNull
public Builder clearSatellites() {
mSatellites.clear();
return this;
}
/**
* Builds a new GnssStatus based on the satellite information in the Builder.
*/
@NonNull
public GnssStatus build() {
int svCount = mSatellites.size();
int[] svidWithFlags = new int[svCount];
float[] cn0DbHzs = new float[svCount];
float[] elevations = new float[svCount];
float[] azimuths = new float[svCount];
float[] carrierFrequencies = new float[svCount];
for (int i = 0; i < svidWithFlags.length; i++) {
svidWithFlags[i] = mSatellites.get(i).mSvidWithFlags;
}
for (int i = 0; i < cn0DbHzs.length; i++) {
cn0DbHzs[i] = mSatellites.get(i).mCn0DbHz;
}
for (int i = 0; i < elevations.length; i++) {
elevations[i] = mSatellites.get(i).mElevation;
}
for (int i = 0; i < azimuths.length; i++) {
azimuths[i] = mSatellites.get(i).mAzimuth;
}
for (int i = 0; i < carrierFrequencies.length; i++) {
carrierFrequencies[i] = mSatellites.get(i).mCarrierFrequency;
}
return wrap(svCount, svidWithFlags, cn0DbHzs, elevations, azimuths,
carrierFrequencies);
}
}
private static class GnssSvInfo {
private final int mSvidWithFlags;
private final float mCn0DbHz;
private final float mElevation;
private final float mAzimuth;
private final float mCarrierFrequency;
private GnssSvInfo(int constellationType, int svid, float cn0DbHz,
float elevation, float azimuth, boolean hasEphemeris, boolean hasAlmanac,
boolean usedInFix, boolean hasCarrierFrequency, float carrierFrequency) {
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);
mCn0DbHz = cn0DbHz;
mElevation = elevation;
mAzimuth = azimuth;
mCarrierFrequency = carrierFrequency;
}
}
}

View File

@@ -16,8 +16,7 @@
package android.location;
import android.annotation.UnsupportedAppUsage;
import android.os.Build;
import android.annotation.NonNull;
import android.util.SparseArray;
import java.util.Iterator;
@@ -25,20 +24,18 @@ import java.util.NoSuchElementException;
/**
* This class represents the current state of the GPS engine.
* This class represents the current state of the GPS engine and is used in conjunction with {@link
* GpsStatus.Listener}.
*
* <p>This class is used in conjunction with the {@link Listener} interface.
*
* @deprecated use {@link GnssStatus} and {@link GnssStatus.Callback}.
* @deprecated Use {@link GnssStatus} instead.
*/
@Deprecated
public final class GpsStatus {
private static final int NUM_SATELLITES = 255;
private static final int MAX_SATELLITES = 255;
private static final int GLONASS_SVID_OFFSET = 64;
private static final int BEIDOU_SVID_OFFSET = 200;
private static final int SBAS_SVID_OFFSET = -87;
/* These package private values are modified by the LocationManager class */
private int mTimeToFirstFix;
private final SparseArray<GpsSatellite> mSatellites = new SparseArray<>();
@@ -80,12 +77,7 @@ public final class GpsStatus {
}
}
private Iterable<GpsSatellite> mSatelliteList = new Iterable<GpsSatellite>() {
@Override
public Iterator<GpsSatellite> iterator() {
return new SatelliteIterator();
}
};
private Iterable<GpsSatellite> mSatelliteList = SatelliteIterator::new;
/**
* Event sent when the GPS system has started.
@@ -111,7 +103,8 @@ public final class GpsStatus {
/**
* Used for receiving notifications when GPS status has changed.
* @deprecated use {@link GnssStatus.Callback} instead.
*
* @deprecated Use {@link GnssStatus.Callback} instead.
*/
@Deprecated
public interface Listener {
@@ -148,17 +141,31 @@ public final class GpsStatus {
void onNmeaReceived(long timestamp, String nmea);
}
// For API-compat a public ctor() is not available
GpsStatus() {}
/**
* Builds a GpsStatus from the given GnssStatus.
*/
@NonNull
public static GpsStatus create(@NonNull GnssStatus gnssStatus, int timeToFirstFix) {
GpsStatus status = new GpsStatus();
status.setStatus(gnssStatus, timeToFirstFix);
return status;
}
private void setStatus(int svCount, int[] svidWithFlags, float[] cn0s, float[] elevations,
float[] azimuths) {
clearSatellites();
for (int i = 0; i < svCount; i++) {
final int constellationType =
(svidWithFlags[i] >> GnssStatus.CONSTELLATION_TYPE_SHIFT_WIDTH)
& GnssStatus.CONSTELLATION_TYPE_MASK;
int prn = svidWithFlags[i] >> GnssStatus.SVID_SHIFT_WIDTH;
private GpsStatus() {
}
/**
* @hide
*/
void setStatus(GnssStatus status, int timeToFirstFix) {
for (int i = 0; i < mSatellites.size(); i++) {
mSatellites.valueAt(i).mValid = false;
}
mTimeToFirstFix = timeToFirstFix;
for (int i = 0; i < status.getSatelliteCount(); i++) {
int constellationType = status.getConstellationType(i);
int prn = status.getSvid(i);
// Other satellites passed through these APIs before GnssSvStatus was availble.
// GPS, SBAS & QZSS can pass through at their nominally
// assigned prn number (as long as it fits in the valid 0-255 range below.)
@@ -175,44 +182,26 @@ public final class GpsStatus {
(constellationType != GnssStatus.CONSTELLATION_QZSS)) {
continue;
}
if (prn > 0 && prn <= NUM_SATELLITES) {
GpsSatellite satellite = mSatellites.get(prn);
if (satellite == null) {
satellite = new GpsSatellite(prn);
mSatellites.put(prn, satellite);
}
satellite.mValid = true;
satellite.mSnr = cn0s[i];
satellite.mElevation = elevations[i];
satellite.mAzimuth = azimuths[i];
satellite.mHasEphemeris =
(svidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_EPHEMERIS_DATA) != 0;
satellite.mHasAlmanac =
(svidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_ALMANAC_DATA) != 0;
satellite.mUsedInFix =
(svidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_USED_IN_FIX) != 0;
if (prn <= 0 || prn > MAX_SATELLITES) {
continue;
}
GpsSatellite satellite = mSatellites.get(prn);
if (satellite == null) {
satellite = new GpsSatellite(prn);
mSatellites.put(prn, satellite);
}
satellite.mValid = true;
satellite.mSnr = status.getCn0DbHz(i);
satellite.mElevation = status.getElevationDegrees(i);
satellite.mAzimuth = status.getAzimuthDegrees(i);
satellite.mHasEphemeris = status.hasEphemerisData(i);
satellite.mHasAlmanac = status.hasAlmanacData(i);
satellite.mUsedInFix = status.usedInFix(i);
}
}
/**
* Copies GPS satellites information from GnssStatus object.
* Since this method is only used within {@link LocationManager#getGpsStatus},
* it does not need to be synchronized.
* @hide
*/
void setStatus(GnssStatus status, int timeToFirstFix) {
mTimeToFirstFix = timeToFirstFix;
setStatus(status.mSvCount, status.mSvidWithFlags, status.mCn0DbHz, status.mElevations,
status.mAzimuths);
}
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
void setTimeToFirstFix(int ttff) {
mTimeToFirstFix = ttff;
}
/**
* Returns the time required to receive the first fix since the most recent
* restart of the GPS engine.
@@ -240,14 +229,7 @@ public final class GpsStatus {
* @return the maximum number of satellites
*/
public int getMaxSatellites() {
return NUM_SATELLITES;
return mSatellites.size();
}
private void clearSatellites() {
int satellitesCount = mSatellites.size();
for (int i = 0; i < satellitesCount; i++) {
GpsSatellite satellite = mSatellites.valueAt(i);
satellite.mValid = false;
}
}
}

View File

@@ -1818,15 +1818,14 @@ public class LocationManager {
Log.w(TAG, ex);
}
if (status == null) {
status = new GpsStatus();
}
// When mGnssStatus is null, that means that this method is called outside
// onGpsStatusChanged(). Return an empty status to maintain backwards compatibility.
GnssStatus gnssStatus = mGnssStatusListenerManager.getGnssStatus();
int ttff = mGnssStatusListenerManager.getTtff();
if (gnssStatus != null) {
status.setStatus(gnssStatus, ttff);
if (status == null) {
status = GpsStatus.create(gnssStatus, ttff);
} else {
status.setStatus(gnssStatus, ttff);
}
}
return status;
}
@@ -2820,8 +2819,8 @@ public class LocationManager {
@Override
public void onSvStatusChanged(int svCount, int[] svidWithFlags, float[] cn0s,
float[] elevations, float[] azimuths, float[] carrierFreqs) {
GnssStatus localStatus = new GnssStatus(svCount, svidWithFlags, cn0s, elevations,
azimuths, carrierFreqs);
GnssStatus localStatus = GnssStatus.wrap(svCount, svidWithFlags, cn0s,
elevations, azimuths, carrierFreqs);
mGnssStatus = localStatus;
execute((callback) -> callback.onSatelliteStatusChanged(localStatus));
}

View File

@@ -188,22 +188,18 @@ public class GnssMetrics {
/**
* Logs sv status data
*
* @param svCount
* @param svidWithFlags
* @param svCarrierFreqs
*/
public void logSvStatus(int svCount, int[] svidWithFlags, float[] svCarrierFreqs) {
public void logSvStatus(GnssStatus status) {
boolean isL5 = false;
// Calculate SvStatus Information
for (int i = 0; i < svCount; i++) {
if ((svidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY) != 0) {
for (int i = 0; i < status.getSatelliteCount(); i++) {
if (status.hasCarrierFrequencyHz(i)) {
mNumSvStatus++;
isL5 = isL5Sv(svCarrierFreqs[i]);
isL5 = isL5Sv(status.getCarrierFrequencyHz(i));
if (isL5) {
mNumL5SvStatus++;
}
if ((svidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_USED_IN_FIX) != 0) {
if (status.usedInFix(i)) {
mNumSvStatusUsedInFix++;
if (isL5) {
mNumL5SvStatusUsedInFix++;
@@ -211,15 +207,10 @@ public class GnssMetrics {
}
}
}
return;
}
/**
* Logs CN0 when at least 4 SVs are available L5 Only
*
* @param svCount
* @param cn0s
* @param svCarrierFreqs
*/
private void logCn0L5(int svCount, float[] cn0s, float[] svCarrierFreqs) {
if (svCount == 0 || cn0s == null || cn0s.length == 0 || cn0s.length < svCount

View File

@@ -1482,39 +1482,35 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
Log.v(TAG, "SV count: " + info.mSvCount);
}
// Calculate number of satellites used in fix.
GnssStatus gnssStatus = GnssStatus.wrap(
info.mSvCount,
info.mSvidWithFlags,
info.mCn0s,
info.mSvElevations,
info.mSvAzimuths,
info.mSvCarrierFreqs);
int usedInFixCount = 0;
int maxCn0 = 0;
int meanCn0 = 0;
for (int i = 0; i < info.mSvCount; i++) {
if ((info.mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_USED_IN_FIX) != 0) {
for (int i = 0; i < gnssStatus.getSatelliteCount(); i++) {
if (gnssStatus.usedInFix(i)) {
++usedInFixCount;
if (info.mCn0s[i] > maxCn0) {
maxCn0 = (int) info.mCn0s[i];
if (gnssStatus.getCn0DbHz(i) > maxCn0) {
maxCn0 = (int) gnssStatus.getCn0DbHz(i);
}
meanCn0 += info.mCn0s[i];
meanCn0 += gnssStatus.getCn0DbHz(i);
mGnssMetrics.logConstellationType(gnssStatus.getConstellationType(i));
}
if (VERBOSE) {
Log.v(TAG, "svid: " + (info.mSvidWithFlags[i] >> GnssStatus.SVID_SHIFT_WIDTH) +
" cn0: " + info.mCn0s[i] +
" elev: " + info.mSvElevations[i] +
" azimuth: " + info.mSvAzimuths[i] +
" carrier frequency: " + info.mSvCarrierFreqs[i] +
((info.mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_EPHEMERIS_DATA) == 0
? " " : " E") +
((info.mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_ALMANAC_DATA) == 0
? " " : " A") +
((info.mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_USED_IN_FIX) == 0
? "" : "U") +
((info.mSvidWithFlags[i] &
GnssStatus.GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY) == 0
? "" : "F"));
}
if ((info.mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_USED_IN_FIX) != 0) {
int constellationType =
(info.mSvidWithFlags[i] >> GnssStatus.CONSTELLATION_TYPE_SHIFT_WIDTH)
& GnssStatus.CONSTELLATION_TYPE_MASK;
mGnssMetrics.logConstellationType(constellationType);
Log.v(TAG, "svid: " + gnssStatus.getSvid(i)
+ " cn0: " + gnssStatus.getCn0DbHz(i)
+ " elev: " + gnssStatus.getElevationDegrees(i)
+ " azimuth: " + gnssStatus.getAzimuthDegrees(i)
+ " carrier frequency: " + gnssStatus.getCn0DbHz(i)
+ (gnssStatus.hasEphemerisData(i) ? " E" : " ")
+ (gnssStatus.hasAlmanacData(i) ? " A" : " ")
+ (gnssStatus.usedInFix(i) ? "U" : "")
+ (gnssStatus.hasCarrierFrequencyHz(i) ? "F" : ""));
}
}
if (usedInFixCount > 0) {
@@ -1523,7 +1519,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
// return number of sats used in fix instead of total reported
mLocationExtras.set(usedInFixCount, meanCn0, maxCn0);
mGnssMetrics.logSvStatus(info.mSvCount, info.mSvidWithFlags, info.mSvCarrierFreqs);
mGnssMetrics.logSvStatus(gnssStatus);
}
@NativeEntryPoint