Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e4383d89 authored by Blake Kragten's avatar Blake Kragten Committed by Android (Google) Code Review
Browse files

Merge "GnssMetrics"

parents 75a0184b 6ce382a3
Loading
Loading
Loading
Loading
+66 −14
Original line number Diff line number Diff line
@@ -397,7 +397,7 @@ message Atom {
    }

    // Pulled events will start at field 10000.
    // Next: 10074
    // Next: 10075
    oneof pulled {
        WifiBytesTransfer wifi_bytes_transfer = 10000 [(module) = "framework"];
        WifiBytesTransferByFgBg wifi_bytes_transfer_by_fg_bg = 10001 [(module) = "framework"];
@@ -478,6 +478,7 @@ message Atom {
                10072 [(module) = "framework"];
        PackageNotificationChannelGroupPreferences package_notification_channel_group_preferences =
                10073 [(module) = "framework"];
        GnssStats gnss_stats = 10074 [(module) = "framework"];
    }

    // DO NOT USE field numbers above 100,000 in AOSP.
@@ -8553,3 +8554,54 @@ message AppFreezeChanged {
    // Time since last unfrozen.
    optional int64 time_unfrozen_millis = 4;
}

/**
 * Logs gnss stats from location service provider
 *
 * Pulled from:
 *  frameworks/base/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java
 */

message GnssStats {
    // Number of location reports since boot
    optional int64 location_reports = 1;

    // Total pulled reports of Location failures since boot
    optional int64 location_failure_reports = 2;

    // Number of time to first fix reports since boot
    optional int64 time_to_first_fix_reports = 3;

    // Total pulled reported time to first fix (in milli-seconds) since boot
    optional int64 time_to_first_fix_milli_s = 4;

    // Number of position accuracy reports since boot
    optional int64 position_accuracy_reports = 5;

    // Total pulled reported position accuracy (in meters) since boot
    optional int64 position_accuracy_meters = 6;

    // Number of top 4 average CN0 reports since boot
    optional int64 top_four_average_cn0_reports = 7;

    // Total pulled reported of top 4 average CN0 (dB-mHz) since boot
    optional int64 top_four_average_cn0_db_mhz = 8;

    // Number of l5 top 4 average CN0 reports since boot
    optional int64 l5_top_four_average_cn0_reports = 9;

    // Total pulled reported of l5 top 4 average CN0 (dB-mHz) since boot
    optional int64 l5_top_four_average_cn0_db_mhz = 10;

    // Total number of sv status messages reports since boot
    optional int64 sv_status_reports = 11;

    // Total number of sv status messages reports, where sv is used in fix since boot
    optional int64 sv_status_reports_used_in_fix = 12;

    // Total number of L5 sv status messages reports since boot
    optional int64 l5_sv_status_reports = 13;

    // Total number of L5 sv status messages reports, where sv is used in fix since boot
    optional int64 l5_sv_status_reports_used_in_fix = 14;
}
+101 −1
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.internal.location.gnssmetrics;

import android.app.StatsManager;
import android.content.Context;
import android.location.GnssStatus;
import android.os.SystemClock;
import android.os.SystemProperties;
@@ -24,16 +26,19 @@ import android.server.location.ServerLocationProtoEnums;
import android.text.format.DateUtils;
import android.util.Base64;
import android.util.Log;
import android.util.StatsEvent;
import android.util.TimeUtils;

import com.android.internal.app.IBatteryStats;
import com.android.internal.location.nano.GnssLogsProto.GnssLog;
import com.android.internal.location.nano.GnssLogsProto.PowerMetrics;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.FrameworkStatsLog;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * GnssMetrics: Is used for logging GNSS metrics
@@ -96,7 +101,34 @@ public class GnssMetrics {
    /** Total number of L5 sv status messages processed, where sv is used in fix */
    private int mNumL5SvStatusUsedInFix;

    public GnssMetrics(IBatteryStats stats) {
    /* Statsd Logging Variables Section Start */
    /** Location failure reports since boot used for statsd logging */
    private Statistics mLocationFailureReportsStatistics;
    /** Time to first fix milli-seconds since boot used for statsd logging */
    private Statistics mTimeToFirstFixMilliSReportsStatistics;
    /** Position accuracy meters since boot used for statsd logging  */
    private Statistics mPositionAccuracyMetersReportsStatistics;
    /** Top 4 average CN0 (db-mHz) since boot used for statsd logging  */
    private Statistics mTopFourAverageCn0DbmHzReportsStatistics;
    /** Top 4 average CN0 (db-mHz) L5 since boot used for statsd logging  */
    private Statistics mL5TopFourAverageCn0DbmHzReportsStatistics;
    /** Total number of sv status reports processed since boot used for statsd logging  */
    private long mSvStatusReports;
    /** Total number of L5 sv status reports processed since boot used for statsd logging  */
    private long mL5SvStatusReports;
    /** Total number of sv status reports processed, where sv is used in fix since boot used for
     * statsd logging  */
    private long mSvStatusReportsUsedInFix;
    /** Total number of L5 sv status reports processed, where sv is used in fix since boot used for
     * statsd logging  */
    private long mL5SvStatusReportsUsedInFix;
    /** Stats manager service for reporting atoms */
    private StatsManager mStatsManager;
    /** Pull atom callback, this is called when atom pull request occurs */
    private StatsPullAtomCallbackImpl mPullAtomCallback;
    /* Statds Logging Variables Section End */

    public GnssMetrics(Context context, IBatteryStats stats) {
        mGnssPowerMetrics = new GnssPowerMetrics(stats);
        mLocationFailureStatistics = new Statistics();
        mTimeToFirstFixSecStatistics = new Statistics();
@@ -104,6 +136,13 @@ public class GnssMetrics {
        mTopFourAverageCn0Statistics = new Statistics();
        mTopFourAverageCn0StatisticsL5 = new Statistics();
        reset();
        mLocationFailureReportsStatistics = new Statistics();
        mTimeToFirstFixMilliSReportsStatistics = new Statistics();
        mPositionAccuracyMetersReportsStatistics = new Statistics();
        mTopFourAverageCn0DbmHzReportsStatistics = new Statistics();
        mL5TopFourAverageCn0DbmHzReportsStatistics = new Statistics();
        mStatsManager = (StatsManager) context.getSystemService(Context.STATS_MANAGER);
        registerGnssStats();
    }

    /**
@@ -112,9 +151,11 @@ public class GnssMetrics {
    public void logReceivedLocationStatus(boolean isSuccessful) {
        if (!isSuccessful) {
            mLocationFailureStatistics.addItem(1.0);
            mLocationFailureReportsStatistics.addItem(1.0);
            return;
        }
        mLocationFailureStatistics.addItem(0.0);
        mLocationFailureReportsStatistics.addItem(0.0);
    }

    /**
@@ -127,6 +168,7 @@ public class GnssMetrics {
        if (numReportMissed > 0) {
            for (int i = 0; i < numReportMissed; i++) {
                mLocationFailureStatistics.addItem(1.0);
                mLocationFailureReportsStatistics.addItem(1.0);
            }
        }
    }
@@ -136,6 +178,7 @@ public class GnssMetrics {
     */
    public void logTimeToFirstFixMilliSecs(int timeToFirstFixMilliSeconds) {
        mTimeToFirstFixSecStatistics.addItem((double) (timeToFirstFixMilliSeconds / 1000));
        mTimeToFirstFixMilliSReportsStatistics.addItem(timeToFirstFixMilliSeconds);
    }

    /**
@@ -143,6 +186,7 @@ public class GnssMetrics {
     */
    public void logPositionAccuracyMeters(float positionAccuracyMeters) {
        mPositionAccuracyMeterStatistics.addItem((double) positionAccuracyMeters);
        mPositionAccuracyMetersReportsStatistics.addItem(positionAccuracyMeters);
    }

    /**
@@ -174,6 +218,8 @@ public class GnssMetrics {
            }
            top4AvgCn0 /= 4;
            mTopFourAverageCn0Statistics.addItem(top4AvgCn0);
            // Convert to mHz for accuracy
            mTopFourAverageCn0DbmHzReportsStatistics.addItem(top4AvgCn0 * 1000);
        }
    }
    /* Helper function to check if a SV is L5 */
@@ -191,14 +237,18 @@ public class GnssMetrics {
        for (int i = 0; i < status.getSatelliteCount(); i++) {
            if (status.hasCarrierFrequencyHz(i)) {
                mNumSvStatus++;
                mSvStatusReports++;
                isL5 = isL5Sv(status.getCarrierFrequencyHz(i));
                if (isL5) {
                    mNumL5SvStatus++;
                    mL5SvStatusReports++;
                }
                if (status.usedInFix(i)) {
                    mNumSvStatusUsedInFix++;
                    mSvStatusReportsUsedInFix++;
                    if (isL5) {
                        mNumL5SvStatusUsedInFix++;
                        mL5SvStatusReportsUsedInFix++;
                    }
                }
            }
@@ -233,6 +283,8 @@ public class GnssMetrics {
            }
            top4AvgCn0 /= 4;
            mTopFourAverageCn0StatisticsL5.addItem(top4AvgCn0);
            // Convert to mHz for accuracy
            mL5TopFourAverageCn0DbmHzReportsStatistics.addItem(top4AvgCn0 * 1000);
        }
        return;
    }
@@ -421,12 +473,14 @@ public class GnssMetrics {
        private int mCount;
        private double mSum;
        private double mSumSquare;
        private long mLongSum;

        /** Resets statistics */
        public void reset() {
            mCount = 0;
            mSum = 0.0;
            mSumSquare = 0.0;
            mLongSum = 0;
        }

        /** Adds an item */
@@ -434,6 +488,7 @@ public class GnssMetrics {
            mCount++;
            mSum += item;
            mSumSquare += item * item;
            mLongSum += item;
        }

        /** Returns number of items added */
@@ -456,6 +511,11 @@ public class GnssMetrics {
            }
            return 0;
        }

        /** Returns long sum */
        public long getLongSum() {
            return mLongSum;
        }
    }

    /* Class for handling GNSS power related metrics */
@@ -561,4 +621,44 @@ public class GnssMetrics {
            return GnssMetrics.GPS_SIGNAL_QUALITY_POOR;
        }
    }

    private void registerGnssStats() {
        mPullAtomCallback = new StatsPullAtomCallbackImpl();
        mStatsManager.registerPullAtomCallback(
                FrameworkStatsLog.GNSS_STATS,
                null, // use default PullAtomMetadata values
                BackgroundThread.getExecutor(), mPullAtomCallback);
    }

    /**
     * Stats Pull Atom Callback
     * Calls the pull method to fill out gnss stats
     */
    private class StatsPullAtomCallbackImpl implements StatsManager.StatsPullAtomCallback {
        @Override
        public int onPullAtom(int atomTag, List<StatsEvent> data) {
            if (atomTag != FrameworkStatsLog.GNSS_STATS) {
                throw new UnsupportedOperationException("Unknown tagId = " + atomTag);
            }
            StatsEvent e = StatsEvent.newBuilder()
                    .setAtomId(atomTag)
                    .writeLong(mLocationFailureReportsStatistics.getCount())
                    .writeLong(mLocationFailureReportsStatistics.getLongSum())
                    .writeLong(mTimeToFirstFixMilliSReportsStatistics.getCount())
                    .writeLong(mTimeToFirstFixMilliSReportsStatistics.getLongSum())
                    .writeLong(mPositionAccuracyMetersReportsStatistics.getCount())
                    .writeLong(mPositionAccuracyMetersReportsStatistics.getLongSum())
                    .writeLong(mTopFourAverageCn0DbmHzReportsStatistics.getCount())
                    .writeLong(mTopFourAverageCn0DbmHzReportsStatistics.getLongSum())
                    .writeLong(mL5TopFourAverageCn0DbmHzReportsStatistics.getCount())
                    .writeLong(mL5TopFourAverageCn0DbmHzReportsStatistics.getLongSum())
                    .writeLong(mSvStatusReports)
                    .writeLong(mSvStatusReportsUsedInFix)
                    .writeLong(mL5SvStatusReports)
                    .writeLong(mL5SvStatusReportsUsedInFix)
                    .build();
            data.add(e);
            return StatsManager.PULL_SUCCESS;
        }
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -714,7 +714,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
            }
        };

        mGnssMetrics = new GnssMetrics(mBatteryStats);
        mGnssMetrics = new GnssMetrics(mContext, mBatteryStats);
        mNtpTimeHelper = new NtpTimeHelper(mContext, mLooper, this);
        GnssSatelliteBlacklistHelper gnssSatelliteBlacklistHelper =
                new GnssSatelliteBlacklistHelper(mContext,