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
This commit is contained in:
@@ -23063,6 +23063,7 @@ package android.location {
|
||||
|
||||
public final class GnssStatus {
|
||||
method @FloatRange(from=0, to=360) public float getAzimuthDegrees(@IntRange(from=0) int);
|
||||
method @FloatRange(from=0, to=63) public float getBasebandCn0DbHz(@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);
|
||||
@@ -23070,6 +23071,7 @@ package android.location {
|
||||
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 hasBasebandCn0DbHz(@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);
|
||||
@@ -23085,7 +23087,7 @@ package android.location {
|
||||
|
||||
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.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, boolean, @FloatRange(from=0, to=63) float);
|
||||
method @NonNull public android.location.GnssStatus build();
|
||||
method @NonNull public android.location.GnssStatus.Builder clearSatellites();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -283,6 +287,26 @@ public final class GnssStatus {
|
||||
return mCarrierFrequencies[satelliteIndex];
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -1,130 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2017 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License
|
||||
*/
|
||||
|
||||
package android.location;
|
||||
|
||||
import android.test.suitebuilder.annotation.SmallTest;
|
||||
import android.util.Log;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link GnssStatus}.
|
||||
*/
|
||||
@SmallTest
|
||||
public class GnssStatusTest extends TestCase {
|
||||
|
||||
private static final String TAG = GnssStatusTest.class.getSimpleName();
|
||||
public void setUp() throws Exception {
|
||||
super.setUp();
|
||||
}
|
||||
|
||||
/*
|
||||
* Create {@link GnssStatus} with default value, verify whether its fields are set correctly.
|
||||
*
|
||||
*/
|
||||
public void testEmptyGnssStatus() throws Exception {
|
||||
Log.i(TAG, "testEmptyGnssStatus");
|
||||
List<SatelliteInfo> svInfos = new ArrayList<>();
|
||||
GnssStatus gnssStatus = createGnssStatus(svInfos);
|
||||
verifyGnssStatus(svInfos, gnssStatus);
|
||||
}
|
||||
|
||||
/*
|
||||
* Create {@link GnssStatus} with only one satellite info, verify whether its fields are set
|
||||
* correctly.
|
||||
*/
|
||||
public void testOneSatelliteGnssStatus() throws Exception {
|
||||
Log.i(TAG, "testOneSatelliteGnssStatus");
|
||||
List<SatelliteInfo> svInfos = new ArrayList<>();
|
||||
SatelliteInfo svInfo =
|
||||
new SatelliteInfo(100,1, true, true, true, true, 100f, 20.3f, 45.5f, 100.23f);
|
||||
svInfos.add(svInfo);
|
||||
GnssStatus gnssStatus = createGnssStatus(svInfos);
|
||||
verifyGnssStatus(svInfos, gnssStatus);
|
||||
}
|
||||
|
||||
/*
|
||||
* Create {@link GnssStatus} with multiple satellite info, verify whether its fields are set
|
||||
* correctly.
|
||||
*/
|
||||
public void testMultipleSatellitesGnssStatus() throws Exception {
|
||||
Log.i(TAG, "testMultipleSatellitesGnssStatus");
|
||||
List<SatelliteInfo> svInfos = new ArrayList<>();
|
||||
SatelliteInfo svInfo1 =
|
||||
new SatelliteInfo(20, 1,true, true, true, true, 10.1f, 20.3f, 45.5f, 111.23f);
|
||||
SatelliteInfo svInfo2 =
|
||||
new SatelliteInfo(50, 2, true, false, true, false, 20.2f, 21.3f, 46.5f, 222.23f);
|
||||
SatelliteInfo svInfo3 =
|
||||
new SatelliteInfo(192, 3, false, true, false, true, 30.3f, 22.3f, 47.5f, 333.23f);
|
||||
SatelliteInfo svInfo4 =
|
||||
new SatelliteInfo(250, 4, false, false, false, false, 40.4f, 23.3f, 48.5f, 444.23f);
|
||||
svInfos.add(svInfo1);
|
||||
svInfos.add(svInfo2);
|
||||
svInfos.add(svInfo3);
|
||||
svInfos.add(svInfo4);
|
||||
GnssStatus gnssStatus = createGnssStatus(svInfos);
|
||||
verifyGnssStatus(svInfos, gnssStatus);
|
||||
}
|
||||
|
||||
private void verifyGnssStatus(List<SatelliteInfo> svInfos, GnssStatus gnssStatus) {
|
||||
Log.i(TAG, String.format("Verifing {0} satellites info.",svInfos.size()));
|
||||
assertEquals(TAG + "::SatelliteCount", svInfos.size(),
|
||||
gnssStatus.getSatelliteCount());
|
||||
for (int i = 0; i< svInfos.size(); i++) {
|
||||
SatelliteInfo svInfo = svInfos.get(i);
|
||||
assertEquals(TAG + "::Svid", svInfo.mSvid, gnssStatus.getSvid(i));
|
||||
assertEquals(TAG + "::ConstellationType", svInfo.mConstellationType,
|
||||
gnssStatus.getConstellationType(i));
|
||||
assertEquals(TAG + "::Cn0DbHz", svInfo.mCn0DbHz, gnssStatus.getCn0DbHz(i));
|
||||
assertEquals(TAG + "::Elevation", svInfo.mElevation,
|
||||
gnssStatus.getElevationDegrees(i));
|
||||
assertEquals(TAG + "::Azimuth", svInfo.mAzimuth, gnssStatus.getAzimuthDegrees(i));
|
||||
assertEquals(TAG + "::CarrierFrequencyHz", svInfo.mCarrierFrequency,
|
||||
gnssStatus.getCarrierFrequencyHz(i));
|
||||
assertEquals(TAG + "::hasEphemerisData", svInfo.mHasEphemris,
|
||||
gnssStatus.hasEphemerisData(i));
|
||||
assertEquals(TAG + "::HasAlmanacData", svInfo.mHasAlmanac,
|
||||
gnssStatus.hasAlmanacData(i));
|
||||
assertEquals(TAG + "::UsedInFix", svInfo.mUsedInFix, gnssStatus.usedInFix(i));
|
||||
assertEquals(TAG + "::HasCarrierFrequencyHz", svInfo.mHasCarriesFrequency,
|
||||
gnssStatus.hasCarrierFrequencyHz(i));
|
||||
}
|
||||
}
|
||||
|
||||
private static GnssStatus createGnssStatus(List<SatelliteInfo> svInfos) throws Exception {
|
||||
Class<?> intClass = Integer.TYPE;
|
||||
Class<?> floatArrayClass = Class.forName("[F");
|
||||
Class<?> intArrayClass = Class.forName("[I");
|
||||
Class[] cArg = new Class[6];
|
||||
cArg[0] = intClass;
|
||||
cArg[1] = intArrayClass;
|
||||
cArg[2] = floatArrayClass;
|
||||
cArg[3] = floatArrayClass;
|
||||
cArg[4] = floatArrayClass;
|
||||
cArg[5] = floatArrayClass;
|
||||
Constructor<GnssStatus> ctor = GnssStatus.class.getDeclaredConstructor(cArg);
|
||||
ctor.setAccessible(true);
|
||||
return ctor.newInstance(svInfos.size(),
|
||||
SatelliteInfo.getSvidWithFlagsArray(svInfos),
|
||||
SatelliteInfo.getCn0sArray(svInfos),
|
||||
SatelliteInfo.getElevationsArray(svInfos),
|
||||
SatelliteInfo.getAzimuthsArray(svInfos),
|
||||
SatelliteInfo.getCarrierFrequencyArray(svInfos));
|
||||
}
|
||||
}
|
||||
@@ -1,155 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2017 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License
|
||||
*/
|
||||
|
||||
package android.location;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/*
|
||||
* Helper class to store single Satellite info, only used it in the unit test.
|
||||
*/
|
||||
public class SatelliteInfo {
|
||||
private static final int SVID_MAX_BIT_INDEX = 32;
|
||||
private static final int SVID_SHIFT_WIDTH = 8;
|
||||
private static final int CONSTELLATION_TYPE_SHIFT_WIDTH = 4;
|
||||
|
||||
// Index for the bits in mSvidWithFlag
|
||||
private static final int GNSS_SV_FLAGS_HAS_EPHEMERIS_DATA_BIT_INDEX = 0;
|
||||
private static final int GNSS_SV_FLAGS_HAS_ALMANAC_DATA_BIT_INDEX = 1;
|
||||
private static final int GNSS_SV_FLAGS_USED_IN_FIX_BIT_INDEX = 2;
|
||||
private static final int GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY_BIT_INDEX = 3;
|
||||
public int mSvid;
|
||||
public int mSvidWithFlag;
|
||||
public float mCn0DbHz;
|
||||
public float mElevation;
|
||||
public float mAzimuth;
|
||||
public float mCarrierFrequency;
|
||||
|
||||
/*
|
||||
* Flag fields, it stores the same information as svidWithFlag, but in different format, easy for
|
||||
* the unit test.
|
||||
*/
|
||||
public int mConstellationType;
|
||||
public boolean mHasEphemris;
|
||||
public boolean mHasAlmanac;
|
||||
public boolean mUsedInFix;
|
||||
public boolean mHasCarriesFrequency;
|
||||
|
||||
public SatelliteInfo(int svid, int constellationType, boolean hasEphemris, boolean hasAlmanac,
|
||||
boolean usedInFix, boolean hasCarriesFrequency, float cn0, float elevation, float azimuth,
|
||||
float carrierFrequency) {
|
||||
mSvidWithFlag =
|
||||
setRange(mSvidWithFlag, constellationType, CONSTELLATION_TYPE_SHIFT_WIDTH, SVID_SHIFT_WIDTH);
|
||||
mSvidWithFlag = setRange(mSvidWithFlag, svid, SVID_SHIFT_WIDTH, SVID_MAX_BIT_INDEX);
|
||||
mSvidWithFlag = setBit(mSvidWithFlag, hasEphemris, GNSS_SV_FLAGS_HAS_EPHEMERIS_DATA_BIT_INDEX);
|
||||
mSvidWithFlag = setBit(mSvidWithFlag, hasAlmanac, GNSS_SV_FLAGS_HAS_ALMANAC_DATA_BIT_INDEX);
|
||||
mSvidWithFlag = setBit(mSvidWithFlag, usedInFix, GNSS_SV_FLAGS_USED_IN_FIX_BIT_INDEX);
|
||||
mSvidWithFlag =
|
||||
setBit(mSvidWithFlag, hasCarriesFrequency, GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY_BIT_INDEX);
|
||||
this.mSvid = svid;
|
||||
this.mConstellationType = constellationType;
|
||||
this.mCn0DbHz = cn0;
|
||||
this.mElevation = elevation;
|
||||
this.mAzimuth = azimuth;
|
||||
this.mCarrierFrequency = carrierFrequency;
|
||||
this.mHasEphemris = hasEphemris;
|
||||
this.mHasAlmanac = hasAlmanac;
|
||||
this.mUsedInFix = usedInFix;
|
||||
this.mHasCarriesFrequency = hasCarriesFrequency;
|
||||
}
|
||||
|
||||
/*
|
||||
* Gernerate svidWithFlags array from svInfos
|
||||
*/
|
||||
public static int[] getSvidWithFlagsArray(List<SatelliteInfo> svInfos) {
|
||||
int[] svidWithFlags = new int[svInfos.size()];
|
||||
for (int i = 0; i< svInfos.size(); i++) {
|
||||
svidWithFlags[i] = svInfos.get(i).mSvidWithFlag;
|
||||
}
|
||||
return svidWithFlags;
|
||||
}
|
||||
|
||||
/*
|
||||
* Gernerate cn0s array from svInfos
|
||||
*/
|
||||
public static float[] getCn0sArray(List<SatelliteInfo> svInfos) {
|
||||
float[] cn0s = new float[svInfos.size()];
|
||||
for (int i = 0; i< svInfos.size(); i++) {
|
||||
cn0s[i] = svInfos.get(i).mCn0DbHz;
|
||||
}
|
||||
return cn0s;
|
||||
}
|
||||
|
||||
/*
|
||||
* Gernerate elevations array from svInfos
|
||||
*/
|
||||
public static float[] getElevationsArray(List<SatelliteInfo> svInfos) {
|
||||
float[] elevations = new float[svInfos.size()];
|
||||
for (int i = 0; i< svInfos.size(); i++) {
|
||||
elevations[i] = svInfos.get(i).mElevation;
|
||||
}
|
||||
return elevations;
|
||||
}
|
||||
|
||||
/*
|
||||
* Gernerate azimuths array from svInfos
|
||||
*/
|
||||
public static float[] getAzimuthsArray(List<SatelliteInfo> svInfos) {
|
||||
float[] azimuths = new float[svInfos.size()];
|
||||
for (int i = 0; i< svInfos.size(); i++) {
|
||||
azimuths[i] = svInfos.get(i).mAzimuth;
|
||||
}
|
||||
return azimuths;
|
||||
}
|
||||
|
||||
/*
|
||||
* Gernerate carrierFrequency array from svInfos
|
||||
*/
|
||||
public static float[] getCarrierFrequencyArray(List<SatelliteInfo> svInfos) {
|
||||
float[] carrierFrequencies = new float[svInfos.size()];
|
||||
for (int i = 0; i< svInfos.size(); i++) {
|
||||
carrierFrequencies[i] = svInfos.get(i).mCarrierFrequency;
|
||||
}
|
||||
return carrierFrequencies;
|
||||
}
|
||||
|
||||
private int setBit(int targetValue, boolean value, int index) {
|
||||
if (value) {
|
||||
targetValue = targetValue | (1 << index);
|
||||
} else {
|
||||
targetValue = targetValue & ~(1 << index);
|
||||
}
|
||||
return targetValue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the bit in the range [fromIndex, toIndex), index start from the lowest bit.
|
||||
* value -> 1 1 0 1 1 0 1 0
|
||||
* index -> 7 6 5 4 3 2 1 0
|
||||
* This function will set the bit in the range to the lowest X bits of the value.
|
||||
*/
|
||||
private int setRange(int targetValue, int value, int fromIndex, int toIndex) {
|
||||
int rangeLen = toIndex - fromIndex;
|
||||
int valueMask = (1 << rangeLen) -1;
|
||||
value &= valueMask;
|
||||
value = value << fromIndex;
|
||||
valueMask = valueMask << fromIndex;
|
||||
targetValue &= (~valueMask);
|
||||
targetValue |= value;
|
||||
return targetValue;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1447,11 +1447,13 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
|
||||
private float[] mSvElevations;
|
||||
private float[] mSvAzimuths;
|
||||
private float[] mSvCarrierFreqs;
|
||||
private float[] mBasebandCn0s;
|
||||
}
|
||||
|
||||
@NativeEntryPoint
|
||||
private void reportSvStatus(int svCount, int[] svidWithFlags, float[] cn0s,
|
||||
float[] svElevations, float[] svAzimuths, float[] svCarrierFreqs) {
|
||||
float[] svElevations, float[] svAzimuths, float[] svCarrierFreqs,
|
||||
float[] basebandCn0s) {
|
||||
SvStatusInfo svStatusInfo = new SvStatusInfo();
|
||||
svStatusInfo.mSvCount = svCount;
|
||||
svStatusInfo.mSvidWithFlags = svidWithFlags;
|
||||
@@ -1459,6 +1461,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
|
||||
svStatusInfo.mSvElevations = svElevations;
|
||||
svStatusInfo.mSvAzimuths = svAzimuths;
|
||||
svStatusInfo.mSvCarrierFreqs = svCarrierFreqs;
|
||||
svStatusInfo.mBasebandCn0s = basebandCn0s;
|
||||
|
||||
sendMessage(REPORT_SV_STATUS, 0, svStatusInfo);
|
||||
}
|
||||
@@ -1470,7 +1473,8 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
|
||||
info.mCn0s,
|
||||
info.mSvElevations,
|
||||
info.mSvAzimuths,
|
||||
info.mSvCarrierFreqs);
|
||||
info.mSvCarrierFreqs,
|
||||
info.mBasebandCn0s);
|
||||
|
||||
// Log CN0 as part of GNSS metrics
|
||||
mGnssMetrics.logCn0(info.mCn0s, info.mSvCount, info.mSvCarrierFreqs);
|
||||
@@ -1485,7 +1489,8 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
|
||||
info.mCn0s,
|
||||
info.mSvElevations,
|
||||
info.mSvAzimuths,
|
||||
info.mSvCarrierFreqs);
|
||||
info.mSvCarrierFreqs,
|
||||
info.mBasebandCn0s);
|
||||
int usedInFixCount = 0;
|
||||
int maxCn0 = 0;
|
||||
int meanCn0 = 0;
|
||||
@@ -1501,13 +1506,15 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
|
||||
if (VERBOSE) {
|
||||
Log.v(TAG, "svid: " + gnssStatus.getSvid(i)
|
||||
+ " cn0: " + gnssStatus.getCn0DbHz(i)
|
||||
+ " basebandCn0: " + gnssStatus.getBasebandCn0DbHz(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" : ""));
|
||||
+ (gnssStatus.hasCarrierFrequencyHz(i) ? "F" : "")
|
||||
+ (gnssStatus.hasBasebandCn0DbHz(i) ? "B" : ""));
|
||||
}
|
||||
}
|
||||
if (usedInFixCount > 0) {
|
||||
|
||||
@@ -71,7 +71,8 @@ public abstract class GnssStatusListenerHelper extends RemoteListenerHelper<IGns
|
||||
final float[] cn0s,
|
||||
final float[] elevations,
|
||||
final float[] azimuths,
|
||||
final float[] carrierFreqs) {
|
||||
final float[] carrierFreqs,
|
||||
final float[] basebandCn0s) {
|
||||
foreach((IGnssStatusListener listener, CallerIdentity callerIdentity) -> {
|
||||
if (!hasPermission(mContext, callerIdentity)) {
|
||||
logPermissionDisabledEventNotReported(TAG, callerIdentity.mPackageName,
|
||||
@@ -79,7 +80,7 @@ public abstract class GnssStatusListenerHelper extends RemoteListenerHelper<IGns
|
||||
return;
|
||||
}
|
||||
listener.onSvStatusChanged(svCount, prnWithFlags, cn0s, elevations, azimuths,
|
||||
carrierFreqs);
|
||||
carrierFreqs, basebandCn0s);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -704,20 +704,22 @@ Return<void> GnssCallback::gnssSvStatusCbImpl(const T& svStatus) {
|
||||
jfloatArray elevArray = env->NewFloatArray(listSize);
|
||||
jfloatArray azimArray = env->NewFloatArray(listSize);
|
||||
jfloatArray carrierFreqArray = env->NewFloatArray(listSize);
|
||||
jfloatArray basebandCn0Array = env->NewFloatArray(listSize);
|
||||
|
||||
jint* svidWithFlags = env->GetIntArrayElements(svidWithFlagArray, 0);
|
||||
jfloat* cn0s = env->GetFloatArrayElements(cn0Array, 0);
|
||||
jfloat* elev = env->GetFloatArrayElements(elevArray, 0);
|
||||
jfloat* azim = env->GetFloatArrayElements(azimArray, 0);
|
||||
jfloat* carrierFreq = env->GetFloatArrayElements(carrierFreqArray, 0);
|
||||
jfloat* basebandCn0s = env->GetFloatArrayElements(basebandCn0Array, 0);
|
||||
|
||||
/*
|
||||
* Read GNSS SV info.
|
||||
*/
|
||||
for (size_t i = 0; i < listSize; ++i) {
|
||||
enum ShiftWidth: uint8_t {
|
||||
SVID_SHIFT_WIDTH = 8,
|
||||
CONSTELLATION_TYPE_SHIFT_WIDTH = 4
|
||||
SVID_SHIFT_WIDTH = 12,
|
||||
CONSTELLATION_TYPE_SHIFT_WIDTH = 8
|
||||
};
|
||||
|
||||
const IGnssCallback_V1_0::GnssSvInfo& info = getGnssSvInfoOfIndex(svStatus, i);
|
||||
@@ -728,6 +730,8 @@ Return<void> GnssCallback::gnssSvStatusCbImpl(const T& svStatus) {
|
||||
elev[i] = info.elevationDegrees;
|
||||
azim[i] = info.azimuthDegrees;
|
||||
carrierFreq[i] = info.carrierFrequencyHz;
|
||||
// TODO(b/144850155): fill svidWithFlags with hasBasebandCn0DbHz based on HAL versions
|
||||
basebandCn0s[i] = 0.0;
|
||||
}
|
||||
|
||||
env->ReleaseIntArrayElements(svidWithFlagArray, svidWithFlags, 0);
|
||||
@@ -735,10 +739,11 @@ Return<void> GnssCallback::gnssSvStatusCbImpl(const T& svStatus) {
|
||||
env->ReleaseFloatArrayElements(elevArray, elev, 0);
|
||||
env->ReleaseFloatArrayElements(azimArray, azim, 0);
|
||||
env->ReleaseFloatArrayElements(carrierFreqArray, carrierFreq, 0);
|
||||
env->ReleaseFloatArrayElements(basebandCn0Array, basebandCn0s, 0);
|
||||
|
||||
env->CallVoidMethod(mCallbacksObj, method_reportSvStatus,
|
||||
static_cast<jint>(listSize), svidWithFlagArray, cn0Array, elevArray, azimArray,
|
||||
carrierFreqArray);
|
||||
carrierFreqArray, basebandCn0Array);
|
||||
|
||||
checkAndClearExceptionFromCallback(env, __FUNCTION__);
|
||||
return Void();
|
||||
@@ -1545,7 +1550,7 @@ static void android_location_GnssLocationProvider_class_init_native(JNIEnv* env,
|
||||
method_reportLocation = env->GetMethodID(clazz, "reportLocation",
|
||||
"(ZLandroid/location/Location;)V");
|
||||
method_reportStatus = env->GetMethodID(clazz, "reportStatus", "(I)V");
|
||||
method_reportSvStatus = env->GetMethodID(clazz, "reportSvStatus", "(I[I[F[F[F[F)V");
|
||||
method_reportSvStatus = env->GetMethodID(clazz, "reportSvStatus", "(I[I[F[F[F[F[F)V");
|
||||
method_reportAGpsStatus = env->GetMethodID(clazz, "reportAGpsStatus", "(II[B)V");
|
||||
method_reportNmea = env->GetMethodID(clazz, "reportNmea", "(J)V");
|
||||
method_setTopHalCapabilities = env->GetMethodID(clazz, "setTopHalCapabilities", "(I)V");
|
||||
|
||||
Reference in New Issue
Block a user