Merge "Add GnssPowerStats Metrics" into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
dd33639b16
@@ -81,7 +81,7 @@ public class GnssManagerService {
|
|||||||
mGnssNative = gnssNative;
|
mGnssNative = gnssNative;
|
||||||
|
|
||||||
mGnssMetrics = new GnssMetrics(mContext, IBatteryStats.Stub.asInterface(
|
mGnssMetrics = new GnssMetrics(mContext, IBatteryStats.Stub.asInterface(
|
||||||
ServiceManager.getService(BatteryStats.SERVICE_NAME)));
|
ServiceManager.getService(BatteryStats.SERVICE_NAME)), mGnssNative);
|
||||||
|
|
||||||
mGnssLocationProvider = new GnssLocationProvider(mContext, injector, mGnssNative,
|
mGnssLocationProvider = new GnssLocationProvider(mContext, injector, mGnssNative,
|
||||||
mGnssMetrics);
|
mGnssMetrics);
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import com.android.internal.location.nano.GnssLogsProto.GnssLog;
|
|||||||
import com.android.internal.location.nano.GnssLogsProto.PowerMetrics;
|
import com.android.internal.location.nano.GnssLogsProto.PowerMetrics;
|
||||||
import com.android.internal.util.ConcurrentUtils;
|
import com.android.internal.util.ConcurrentUtils;
|
||||||
import com.android.internal.util.FrameworkStatsLog;
|
import com.android.internal.util.FrameworkStatsLog;
|
||||||
|
import com.android.server.location.gnss.hal.GnssNative;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -52,11 +53,14 @@ public class GnssMetrics {
|
|||||||
|
|
||||||
/** Default time between location fixes (in millisecs) */
|
/** Default time between location fixes (in millisecs) */
|
||||||
private static final int DEFAULT_TIME_BETWEEN_FIXES_MILLISECS = 1000;
|
private static final int DEFAULT_TIME_BETWEEN_FIXES_MILLISECS = 1000;
|
||||||
|
private static final int CONVERT_MILLI_TO_MICRO = 1000;
|
||||||
|
private static final int VENDOR_SPECIFIC_POWER_MODES_SIZE = 10;
|
||||||
|
|
||||||
/** Frequency range of GPS L5, Galileo E5a, QZSS J5 frequency band */
|
/** Frequency range of GPS L5, Galileo E5a, QZSS J5 frequency band */
|
||||||
private static final double L5_CARRIER_FREQ_RANGE_LOW_HZ = 1164 * 1e6;
|
private static final double L5_CARRIER_FREQ_RANGE_LOW_HZ = 1164 * 1e6;
|
||||||
private static final double L5_CARRIER_FREQ_RANGE_HIGH_HZ = 1189 * 1e6;
|
private static final double L5_CARRIER_FREQ_RANGE_HIGH_HZ = 1189 * 1e6;
|
||||||
|
|
||||||
|
|
||||||
private long mLogStartInElapsedRealtimeMs;
|
private long mLogStartInElapsedRealtimeMs;
|
||||||
|
|
||||||
GnssPowerMetrics mGnssPowerMetrics;
|
GnssPowerMetrics mGnssPowerMetrics;
|
||||||
@@ -88,8 +92,10 @@ public class GnssMetrics {
|
|||||||
long mL5SvStatusReportsUsedInFix;
|
long mL5SvStatusReportsUsedInFix;
|
||||||
|
|
||||||
private final StatsManager mStatsManager;
|
private final StatsManager mStatsManager;
|
||||||
|
private final GnssNative mGnssNative;
|
||||||
|
|
||||||
public GnssMetrics(Context context, IBatteryStats stats) {
|
public GnssMetrics(Context context, IBatteryStats stats, GnssNative gnssNative) {
|
||||||
|
mGnssNative = gnssNative;
|
||||||
mGnssPowerMetrics = new GnssPowerMetrics(stats);
|
mGnssPowerMetrics = new GnssPowerMetrics(stats);
|
||||||
mLocationFailureStatistics = new Statistics();
|
mLocationFailureStatistics = new Statistics();
|
||||||
mTimeToFirstFixSecStatistics = new Statistics();
|
mTimeToFirstFixSecStatistics = new Statistics();
|
||||||
@@ -189,8 +195,8 @@ public class GnssMetrics {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logs sv status data
|
* Logs sv status data
|
||||||
*/
|
*/
|
||||||
public void logSvStatus(GnssStatus status) {
|
public void logSvStatus(GnssStatus status) {
|
||||||
boolean isL5;
|
boolean isL5;
|
||||||
// Calculate SvStatus Information
|
// Calculate SvStatus Information
|
||||||
@@ -216,8 +222,8 @@ public class GnssMetrics {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logs CN0 when at least 4 SVs are available L5 Only
|
* Logs CN0 when at least 4 SVs are available L5 Only
|
||||||
*/
|
*/
|
||||||
private void logCn0L5(GnssStatus gnssStatus) {
|
private void logCn0L5(GnssStatus gnssStatus) {
|
||||||
if (gnssStatus.getSatelliteCount() == 0) {
|
if (gnssStatus.getSatelliteCount() == 0) {
|
||||||
return;
|
return;
|
||||||
@@ -432,7 +438,8 @@ public class GnssMetrics {
|
|||||||
private double mSumSquare;
|
private double mSumSquare;
|
||||||
private long mLongSum;
|
private long mLongSum;
|
||||||
|
|
||||||
Statistics() {}
|
Statistics() {
|
||||||
|
}
|
||||||
|
|
||||||
/** Resets statistics */
|
/** Resets statistics */
|
||||||
public synchronized void reset() {
|
public synchronized void reset() {
|
||||||
@@ -498,7 +505,7 @@ public class GnssMetrics {
|
|||||||
GnssPowerMetrics(IBatteryStats stats) {
|
GnssPowerMetrics(IBatteryStats stats) {
|
||||||
mBatteryStats = stats;
|
mBatteryStats = stats;
|
||||||
// Used to initialize the variable to a very small value (unachievable in practice)
|
// Used to initialize the variable to a very small value (unachievable in practice)
|
||||||
// so that
|
// so that
|
||||||
// the first CNO report will trigger an update to BatteryStats
|
// the first CNO report will trigger an update to BatteryStats
|
||||||
mLastAverageCn0 = -100.0;
|
mLastAverageCn0 = -100.0;
|
||||||
mLastSignalLevel = GnssSignalQuality.GNSS_SIGNAL_QUALITY_UNKNOWN;
|
mLastSignalLevel = GnssSignalQuality.GNSS_SIGNAL_QUALITY_UNKNOWN;
|
||||||
@@ -585,6 +592,10 @@ public class GnssMetrics {
|
|||||||
FrameworkStatsLog.GNSS_STATS,
|
FrameworkStatsLog.GNSS_STATS,
|
||||||
null, // use default PullAtomMetadata values
|
null, // use default PullAtomMetadata values
|
||||||
ConcurrentUtils.DIRECT_EXECUTOR, pullAtomCallback);
|
ConcurrentUtils.DIRECT_EXECUTOR, pullAtomCallback);
|
||||||
|
mStatsManager.setPullAtomCallback(
|
||||||
|
FrameworkStatsLog.GNSS_POWER_STATS,
|
||||||
|
null, // use default PullAtomMetadata values
|
||||||
|
ConcurrentUtils.DIRECT_EXECUTOR, pullAtomCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -593,26 +604,68 @@ public class GnssMetrics {
|
|||||||
*/
|
*/
|
||||||
private class StatsPullAtomCallbackImpl implements StatsManager.StatsPullAtomCallback {
|
private class StatsPullAtomCallbackImpl implements StatsManager.StatsPullAtomCallback {
|
||||||
|
|
||||||
StatsPullAtomCallbackImpl() {}
|
StatsPullAtomCallbackImpl() {
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int onPullAtom(int atomTag, List<StatsEvent> data) {
|
public int onPullAtom(int atomTag, List<StatsEvent> data) {
|
||||||
if (atomTag != FrameworkStatsLog.GNSS_STATS) {
|
if (atomTag == FrameworkStatsLog.GNSS_STATS) {
|
||||||
|
data.add(FrameworkStatsLog.buildStatsEvent(atomTag,
|
||||||
|
mLocationFailureReportsStatistics.getCount(),
|
||||||
|
mLocationFailureReportsStatistics.getLongSum(),
|
||||||
|
mTimeToFirstFixMilliSReportsStatistics.getCount(),
|
||||||
|
mTimeToFirstFixMilliSReportsStatistics.getLongSum(),
|
||||||
|
mPositionAccuracyMetersReportsStatistics.getCount(),
|
||||||
|
mPositionAccuracyMetersReportsStatistics.getLongSum(),
|
||||||
|
mTopFourAverageCn0DbmHzReportsStatistics.getCount(),
|
||||||
|
mTopFourAverageCn0DbmHzReportsStatistics.getLongSum(),
|
||||||
|
mL5TopFourAverageCn0DbmHzReportsStatistics.getCount(),
|
||||||
|
mL5TopFourAverageCn0DbmHzReportsStatistics.getLongSum(), mSvStatusReports,
|
||||||
|
mSvStatusReportsUsedInFix, mL5SvStatusReports,
|
||||||
|
mL5SvStatusReportsUsedInFix));
|
||||||
|
} else if (atomTag == FrameworkStatsLog.GNSS_POWER_STATS) {
|
||||||
|
mGnssNative.requestPowerStats();
|
||||||
|
GnssPowerStats gnssPowerStats = mGnssNative.getPowerStats();
|
||||||
|
if (gnssPowerStats == null) {
|
||||||
|
return StatsManager.PULL_SKIP;
|
||||||
|
}
|
||||||
|
double[] otherModesEnergyMilliJoule = new double[VENDOR_SPECIFIC_POWER_MODES_SIZE];
|
||||||
|
double[] tempGnssPowerStatsOtherModes =
|
||||||
|
gnssPowerStats.getOtherModesEnergyMilliJoule();
|
||||||
|
if (tempGnssPowerStatsOtherModes.length < VENDOR_SPECIFIC_POWER_MODES_SIZE) {
|
||||||
|
System.arraycopy(tempGnssPowerStatsOtherModes, 0,
|
||||||
|
otherModesEnergyMilliJoule, 0,
|
||||||
|
tempGnssPowerStatsOtherModes.length);
|
||||||
|
} else {
|
||||||
|
System.arraycopy(tempGnssPowerStatsOtherModes, 0,
|
||||||
|
otherModesEnergyMilliJoule, 0,
|
||||||
|
VENDOR_SPECIFIC_POWER_MODES_SIZE);
|
||||||
|
}
|
||||||
|
data.add(FrameworkStatsLog.buildStatsEvent(atomTag,
|
||||||
|
(long) (gnssPowerStats.getElapsedRealtimeUncertaintyNanos()),
|
||||||
|
(long) (gnssPowerStats.getTotalEnergyMilliJoule() * CONVERT_MILLI_TO_MICRO),
|
||||||
|
(long) (gnssPowerStats.getSinglebandTrackingModeEnergyMilliJoule()
|
||||||
|
* CONVERT_MILLI_TO_MICRO),
|
||||||
|
(long) (gnssPowerStats.getMultibandTrackingModeEnergyMilliJoule()
|
||||||
|
* CONVERT_MILLI_TO_MICRO),
|
||||||
|
(long) (gnssPowerStats.getSinglebandAcquisitionModeEnergyMilliJoule()
|
||||||
|
* CONVERT_MILLI_TO_MICRO),
|
||||||
|
(long) (gnssPowerStats.getMultibandAcquisitionModeEnergyMilliJoule()
|
||||||
|
* CONVERT_MILLI_TO_MICRO),
|
||||||
|
(long) (otherModesEnergyMilliJoule[0] * CONVERT_MILLI_TO_MICRO),
|
||||||
|
(long) (otherModesEnergyMilliJoule[1] * CONVERT_MILLI_TO_MICRO),
|
||||||
|
(long) (otherModesEnergyMilliJoule[2] * CONVERT_MILLI_TO_MICRO),
|
||||||
|
(long) (otherModesEnergyMilliJoule[3] * CONVERT_MILLI_TO_MICRO),
|
||||||
|
(long) (otherModesEnergyMilliJoule[4] * CONVERT_MILLI_TO_MICRO),
|
||||||
|
(long) (otherModesEnergyMilliJoule[5] * CONVERT_MILLI_TO_MICRO),
|
||||||
|
(long) (otherModesEnergyMilliJoule[6] * CONVERT_MILLI_TO_MICRO),
|
||||||
|
(long) (otherModesEnergyMilliJoule[7] * CONVERT_MILLI_TO_MICRO),
|
||||||
|
(long) (otherModesEnergyMilliJoule[8] * CONVERT_MILLI_TO_MICRO),
|
||||||
|
(long) (otherModesEnergyMilliJoule[9] * CONVERT_MILLI_TO_MICRO)));
|
||||||
|
} else {
|
||||||
throw new UnsupportedOperationException("Unknown tagId = " + atomTag);
|
throw new UnsupportedOperationException("Unknown tagId = " + atomTag);
|
||||||
}
|
}
|
||||||
data.add(FrameworkStatsLog.buildStatsEvent(atomTag,
|
|
||||||
mLocationFailureReportsStatistics.getCount(),
|
|
||||||
mLocationFailureReportsStatistics.getLongSum(),
|
|
||||||
mTimeToFirstFixMilliSReportsStatistics.getCount(),
|
|
||||||
mTimeToFirstFixMilliSReportsStatistics.getLongSum(),
|
|
||||||
mPositionAccuracyMetersReportsStatistics.getCount(),
|
|
||||||
mPositionAccuracyMetersReportsStatistics.getLongSum(),
|
|
||||||
mTopFourAverageCn0DbmHzReportsStatistics.getCount(),
|
|
||||||
mTopFourAverageCn0DbmHzReportsStatistics.getLongSum(),
|
|
||||||
mL5TopFourAverageCn0DbmHzReportsStatistics.getCount(),
|
|
||||||
mL5TopFourAverageCn0DbmHzReportsStatistics.getLongSum(), mSvStatusReports,
|
|
||||||
mSvStatusReportsUsedInFix, mL5SvStatusReports, mL5SvStatusReportsUsedInFix));
|
|
||||||
return StatsManager.PULL_SUCCESS;
|
return StatsManager.PULL_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user