Merge "Add basebandCn0DbHz to GnssStatus"
This commit is contained in:
committed by
Android (Google) Code Review
commit
deaecab703
@@ -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