summaryrefslogtreecommitdiffstats
path: root/location/java/android/location/GpsStatus.java
diff options
context:
space:
mode:
Diffstat (limited to 'location/java/android/location/GpsStatus.java')
-rw-r--r--location/java/android/location/GpsStatus.java200
1 files changed, 200 insertions, 0 deletions
diff --git a/location/java/android/location/GpsStatus.java b/location/java/android/location/GpsStatus.java
new file mode 100644
index 0000000..a40b1fb
--- /dev/null
+++ b/location/java/android/location/GpsStatus.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2008 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.Iterator;
+import java.util.NoSuchElementException;
+
+
+/**
+ * This class represents the current state of the GPS engine.
+ * This class is used in conjunction with the {@link Listener} interface.
+ */
+public final class GpsStatus {
+ private static final int NUM_SATELLITES = 32;
+
+ /* These package private values are modified by the LocationManager class */
+ private int mTimeToFirstFix;
+ private GpsSatellite mSatellites[] = new GpsSatellite[NUM_SATELLITES];
+
+ private final class SatelliteIterator implements Iterator<GpsSatellite> {
+
+ private GpsSatellite[] mSatellites;
+ int mIndex = 0;
+
+ SatelliteIterator(GpsSatellite[] satellites) {
+ mSatellites = satellites;
+ }
+
+ public boolean hasNext() {
+ for (int i = mIndex; i < mSatellites.length; i++) {
+ if (mSatellites[i].mValid) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public GpsSatellite next() {
+ while (mIndex < mSatellites.length) {
+ GpsSatellite satellite = mSatellites[mIndex++];
+ if (satellite.mValid) {
+ return satellite;
+ }
+ }
+ throw new NoSuchElementException();
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ private Iterable<GpsSatellite> mSatelliteList = new Iterable<GpsSatellite>() {
+ public Iterator<GpsSatellite> iterator() {
+ return new SatelliteIterator(mSatellites);
+ }
+ };
+
+ /**
+ * Event sent when the GPS system has started.
+ */
+ public static final int GPS_EVENT_STARTED = 1;
+
+ /**
+ * Event sent when the GPS system has stopped.
+ */
+ public static final int GPS_EVENT_STOPPED = 2;
+
+ /**
+ * Event sent when the GPS system has received its first fix since starting.
+ * Call {@link #getTimeToFirstFix()} to find the time from start to first fix.
+ */
+ public static final int GPS_EVENT_FIRST_FIX = 3;
+
+ /**
+ * Event sent periodically to report GPS satellite status.
+ * Call {@link #getSatellites()} to retrieve the status for each satellite.
+ */
+ public static final int GPS_EVENT_SATELLITE_STATUS = 4;
+
+ /**
+ * Used for receiving notifications when GPS status has changed.
+ */
+ public interface Listener {
+ /**
+ * Called to report changes in the GPS status.
+ * The event number is one of:
+ * <ul>
+ * <li> {@link GpsStatus#GPS_EVENT_STARTED}
+ * <li> {@link GpsStatus#GPS_EVENT_STOPPED}
+ * <li> {@link GpsStatus#GPS_EVENT_FIRST_FIX}
+ * <li> {@link GpsStatus#GPS_EVENT_SATELLITE_STATUS}
+ * </ul>
+ *
+ * When this method is called, the client should call
+ * {@link LocationManager#getGpsStatus} to get additional
+ * status information.
+ *
+ * @param event event number for this notification
+ */
+ void onGpsStatusChanged(int event);
+ }
+
+ GpsStatus() {
+ for (int i = 0; i < mSatellites.length; i++) {
+ mSatellites[i] = new GpsSatellite(i + 1);
+ }
+ }
+
+ /**
+ * Used internally within {@link LocationManager} to copy GPS status
+ * data from the Location Manager Service to its cached GpsStatus instance.
+ * Is synchronized to ensure that GPS status updates are atomic.
+ */
+ synchronized void setStatus(int svCount, int[] prns, float[] snrs,
+ float[] elevations, float[] azimuths, int ephemerisMask,
+ int almanacMask, int usedInFixMask) {
+ int i;
+
+ for (i = 0; i < mSatellites.length; i++) {
+ mSatellites[i].mValid = false;
+ }
+
+ for (i = 0; i < svCount; i++) {
+ int prn = prns[i] - 1;
+ int prnShift = (1 << prn);
+ GpsSatellite satellite = mSatellites[prn];
+
+ satellite.mValid = true;
+ satellite.mSnr = snrs[i];
+ satellite.mElevation = elevations[i];
+ satellite.mAzimuth = azimuths[i];
+ satellite.mHasEphemeris = ((ephemerisMask & prnShift) != 0);
+ satellite.mHasAlmanac = ((almanacMask & prnShift) != 0);
+ satellite.mUsedInFix = ((usedInFixMask & prnShift) != 0);
+ }
+ }
+
+ /**
+ * Used by {@link LocationManager#getGpsStatus} to copy LocationManager's
+ * cached GpsStatus instance to the client's copy.
+ * Since this method is only used within {@link LocationManager#getGpsStatus},
+ * it does not need to be synchronized.
+ */
+ void setStatus(GpsStatus status) {
+ mTimeToFirstFix = status.getTimeToFirstFix();
+
+ for (int i = 0; i < mSatellites.length; i++) {
+ mSatellites[i].setStatus(status.mSatellites[i]);
+ }
+ }
+
+ void setTimeToFirstFix(int ttff) {
+ mTimeToFirstFix = ttff;
+ }
+
+ /**
+ * Returns the time required to receive the first fix since the most recent
+ * restart of the GPS engine.
+ *
+ * @return time to first fix in milliseconds
+ */
+ public int getTimeToFirstFix() {
+ return mTimeToFirstFix;
+ }
+
+ /**
+ * Returns an array of {@link GpsSatellite} objects, which represent the
+ * current state of the GPS engine.
+ *
+ * @return the list of satellites
+ */
+ public Iterable<GpsSatellite> getSatellites() {
+ return mSatelliteList;
+ }
+
+ /**
+ * Returns the maximum number of satellites that can be in the satellite
+ * list that can be returned by {@link #getSatellites()}.
+ *
+ * @return the maximum number of satellites
+ */
+ public int getMaxSatellites() {
+ return NUM_SATELLITES;
+ }
+}