diff --git a/services/core/java/com/android/server/location/gnss/GnssManagerService.java b/services/core/java/com/android/server/location/gnss/GnssManagerService.java index bcdfed45bd9c6..21946ca88401e 100644 --- a/services/core/java/com/android/server/location/gnss/GnssManagerService.java +++ b/services/core/java/com/android/server/location/gnss/GnssManagerService.java @@ -81,7 +81,7 @@ public class GnssManagerService { mGnssNative = gnssNative; mGnssMetrics = new GnssMetrics(mContext, IBatteryStats.Stub.asInterface( - ServiceManager.getService(BatteryStats.SERVICE_NAME))); + ServiceManager.getService(BatteryStats.SERVICE_NAME)), mGnssNative); mGnssLocationProvider = new GnssLocationProvider(mContext, injector, mGnssNative, mGnssMetrics); diff --git a/services/core/java/com/android/server/location/gnss/GnssMetrics.java b/services/core/java/com/android/server/location/gnss/GnssMetrics.java index c7d8144342ab7..dbc903d35cc82 100644 --- a/services/core/java/com/android/server/location/gnss/GnssMetrics.java +++ b/services/core/java/com/android/server/location/gnss/GnssMetrics.java @@ -35,6 +35,7 @@ import com.android.internal.location.nano.GnssLogsProto.GnssLog; import com.android.internal.location.nano.GnssLogsProto.PowerMetrics; import com.android.internal.util.ConcurrentUtils; import com.android.internal.util.FrameworkStatsLog; +import com.android.server.location.gnss.hal.GnssNative; import java.util.ArrayList; import java.util.Arrays; @@ -52,11 +53,14 @@ public class GnssMetrics { /** Default time between location fixes (in millisecs) */ 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 */ 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 long mLogStartInElapsedRealtimeMs; GnssPowerMetrics mGnssPowerMetrics; @@ -88,8 +92,10 @@ public class GnssMetrics { long mL5SvStatusReportsUsedInFix; 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); mLocationFailureStatistics = 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) { boolean isL5; // 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) { if (gnssStatus.getSatelliteCount() == 0) { return; @@ -432,7 +438,8 @@ public class GnssMetrics { private double mSumSquare; private long mLongSum; - Statistics() {} + Statistics() { + } /** Resets statistics */ public synchronized void reset() { @@ -498,7 +505,7 @@ public class GnssMetrics { GnssPowerMetrics(IBatteryStats stats) { mBatteryStats = stats; // 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 mLastAverageCn0 = -100.0; mLastSignalLevel = GnssSignalQuality.GNSS_SIGNAL_QUALITY_UNKNOWN; @@ -585,6 +592,10 @@ public class GnssMetrics { FrameworkStatsLog.GNSS_STATS, null, // use default PullAtomMetadata values 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 { - StatsPullAtomCallbackImpl() {} + StatsPullAtomCallbackImpl() { + } @Override public int onPullAtom(int atomTag, List 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); } - 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; } } -} +} \ No newline at end of file