1ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa/* 2ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Copyright (C) 2014 The Android Open Source Project 3ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * 4ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Licensed under the Apache License, Version 2.0 (the "License"); 5ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * you may not use this file except in compliance with the License. 6ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * You may obtain a copy of the License at 7ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * 8ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * http://www.apache.org/licenses/LICENSE-2.0 9ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * 10ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Unless required by applicable law or agreed to in writing, software 11ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * distributed under the License is distributed on an "AS IS" BASIS, 12ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * See the License for the specific language governing permissions and 14ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * limitations under the License 15ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 16ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 17ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaapackage android.location; 18ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 190f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tangimport android.annotation.TestApi; 20ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaaimport android.os.Parcel; 21ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaaimport android.os.Parcelable; 22ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 23ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa/** 24ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * A class containing a GPS clock timestamp. 25e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * 26e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>It represents a measurement of the GPS receiver's clock. 27ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 28818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tangpublic final class GnssClock implements Parcelable { 292102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa // The following enumerations must be in sync with the values declared in gps.h 302102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa 3176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private static final int HAS_NO_FLAGS = 0; 3276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private static final int HAS_LEAP_SECOND = (1<<0); 3376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private static final int HAS_TIME_UNCERTAINTY = (1<<1); 3476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private static final int HAS_FULL_BIAS = (1<<2); 3576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private static final int HAS_BIAS = (1<<3); 3676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private static final int HAS_BIAS_UNCERTAINTY = (1<<4); 3776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private static final int HAS_DRIFT = (1<<5); 3876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private static final int HAS_DRIFT_UNCERTAINTY = (1<<6); 392102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa 402102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa // End enumerations in sync with gps.h 412102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa 4276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private int mFlags; 4376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private int mLeapSecond; 4476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private long mTimeNanos; 4576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private double mTimeUncertaintyNanos; 4676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private long mFullBiasNanos; 4776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private double mBiasNanos; 4876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private double mBiasUncertaintyNanos; 4976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private double mDriftNanosPerSecond; 5076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private double mDriftUncertaintyNanosPerSecond; 519363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang private int mHardwareClockDiscontinuityCount; 52ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 530f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang /** 540f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 550f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang */ 560f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 570f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang public GnssClock() { 582102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa initialize(); 59ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 60ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 61ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 62ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Sets all contents to the values stored in the provided object. 630f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 64ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 650f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 66818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang public void set(GnssClock clock) { 672102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa mFlags = clock.mFlags; 68ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa mLeapSecond = clock.mLeapSecond; 6976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mTimeNanos = clock.mTimeNanos; 7076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mTimeUncertaintyNanos = clock.mTimeUncertaintyNanos; 7176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mFullBiasNanos = clock.mFullBiasNanos; 7276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mBiasNanos = clock.mBiasNanos; 7376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mBiasUncertaintyNanos = clock.mBiasUncertaintyNanos; 7476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mDriftNanosPerSecond = clock.mDriftNanosPerSecond; 7576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mDriftUncertaintyNanosPerSecond = clock.mDriftUncertaintyNanosPerSecond; 769363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang mHardwareClockDiscontinuityCount = clock.mHardwareClockDiscontinuityCount; 77ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 78ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 79ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 80ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Resets all the contents to its original state. 810f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 82ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 830f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 84ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa public void reset() { 852102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa initialize(); 862102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa } 87ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 882102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa /** 89e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * Returns {@code true} if {@link #getLeapSecond()} is available, {@code false} otherwise. 90ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 91ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa public boolean hasLeapSecond() { 922102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa return isFlagSet(HAS_LEAP_SECOND); 93ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 94ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 95ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 96ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Gets the leap second associated with the clock's time. 97ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * 98e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>The sign of the value is defined by the following equation: 99e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <pre> 100e50607efab69c62d1a7b5ba9bb3dff47449483c9Lifu Tang * UtcTimeNanos = TimeNanos - (FullBiasNanos + BiasNanos) - LeapSecond * 1,000,000,000</pre> 101e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * 102e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>The value is only available if {@link #hasLeapSecond()} is {@code true}. 103ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 10476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public int getLeapSecond() { 105ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return mLeapSecond; 106ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 107ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 108ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 109ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Sets the leap second associated with the clock's time. 1100f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 111ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 1120f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 11376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public void setLeapSecond(int leapSecond) { 1142102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa setFlag(HAS_LEAP_SECOND); 115ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa mLeapSecond = leapSecond; 116ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 117ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 118ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 119ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Resets the leap second associated with the clock's time. 1200f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 121ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 1220f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 123ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa public void resetLeapSecond() { 1242102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa resetFlag(HAS_LEAP_SECOND); 12576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mLeapSecond = Integer.MIN_VALUE; 126ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 127ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 128ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 129e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * Gets the GNSS receiver internal hardware clock value in nanoseconds. 1302102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa * 131e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>This value is expected to be monotonically increasing while the hardware clock remains 132e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * powered on. For the case of a hardware clock that is not continuously on, see the 133e50607efab69c62d1a7b5ba9bb3dff47449483c9Lifu Tang * {@link #getHardwareClockDiscontinuityCount} field. The GPS time can be derived by subtracting 134e50607efab69c62d1a7b5ba9bb3dff47449483c9Lifu Tang * the sum of {@link #getFullBiasNanos()} and {@link #getBiasNanos()} (when they are available) 135e50607efab69c62d1a7b5ba9bb3dff47449483c9Lifu Tang * from this value. Sub-nanosecond accuracy can be provided by means of {@link #getBiasNanos()}. 1362102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa * 137e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>The error estimate for this value (if applicable) is {@link #getTimeUncertaintyNanos()}. 138ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 13976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public long getTimeNanos() { 14076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang return mTimeNanos; 141ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 142ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 143ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 14476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang * Sets the GNSS receiver internal clock in nanoseconds. 1450f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 146ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 1470f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 14876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public void setTimeNanos(long timeNanos) { 14976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mTimeNanos = timeNanos; 150ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 151ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 152ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 153e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * Returns {@code true} if {@link #getTimeUncertaintyNanos()} is available, {@code false} 154e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * otherwise. 155ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 15676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public boolean hasTimeUncertaintyNanos() { 1572102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa return isFlagSet(HAS_TIME_UNCERTAINTY); 158ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 159ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 160ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 161ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Gets the clock's time Uncertainty (1-Sigma) in nanoseconds. 162ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * 163e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>The uncertainty is represented as an absolute (single sided) value. 164e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * 165e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>The value is only available if {@link #hasTimeUncertaintyNanos()} is {@code true}. 166e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * 167e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>This value is often effectively zero (it is the reference clock by which all other times 168e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * and time uncertainties are measured), and thus this field may often be 0, or not provided. 169ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 17076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public double getTimeUncertaintyNanos() { 17176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang return mTimeUncertaintyNanos; 172ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 173ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 174ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 175ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Sets the clock's Time Uncertainty (1-Sigma) in nanoseconds. 1760f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 177ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 1780f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 17976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public void setTimeUncertaintyNanos(double timeUncertaintyNanos) { 1802102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa setFlag(HAS_TIME_UNCERTAINTY); 18176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mTimeUncertaintyNanos = timeUncertaintyNanos; 182ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 183ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 184ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 185ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Resets the clock's Time Uncertainty (1-Sigma) in nanoseconds. 1860f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 187ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 1880f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 18976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public void resetTimeUncertaintyNanos() { 1902102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa resetFlag(HAS_TIME_UNCERTAINTY); 19176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mTimeUncertaintyNanos = Double.NaN; 192ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 193ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 194ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 195e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * Returns {@code true} if {@link #getFullBiasNanos()} is available, {@code false} otherwise. 1962102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa */ 19776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public boolean hasFullBiasNanos() { 1982102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa return isFlagSet(HAS_FULL_BIAS); 1992102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa } 2002102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa 2012102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa /** 20276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang * Gets the difference between hardware clock ({@link #getTimeNanos()}) inside GPS receiver and 2032102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa * the true GPS time since 0000Z, January 6, 1980, in nanoseconds. 2042102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa * 205e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>This value is available if the receiver has estimated GPS time. If the computed time is 206e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * for a non-GPS constellation, the time offset of that constellation to GPS has to be applied 207e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * to fill this value. The value is only available if {@link #hasFullBiasNanos()} is 208e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * {@code true}. 2092102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa * 210e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>The error estimate for the sum of this field and {@link #getBiasNanos} is 211e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * {@link #getBiasUncertaintyNanos()}. 212e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * 213e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>The sign of the value is defined by the following equation: 214e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * 215e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <pre> 216e50607efab69c62d1a7b5ba9bb3dff47449483c9Lifu Tang * local estimate of GPS time = TimeNanos - (FullBiasNanos + BiasNanos)</pre> 2172102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa */ 21876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public long getFullBiasNanos() { 21976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang return mFullBiasNanos; 2202102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa } 2212102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa 2222102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa /** 2232102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa * Sets the full bias in nanoseconds. 2240f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 2252102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa */ 2260f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 22776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public void setFullBiasNanos(long value) { 2282102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa setFlag(HAS_FULL_BIAS); 22976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mFullBiasNanos = value; 2302102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa } 2312102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa 2322102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa /** 2332102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa * Resets the full bias in nanoseconds. 2340f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 2352102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa */ 2360f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 23776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public void resetFullBiasNanos() { 2382102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa resetFlag(HAS_FULL_BIAS); 23976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mFullBiasNanos = Long.MIN_VALUE; 2402102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa } 2412102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa 2422102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa /** 243e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * Returns {@code true} if {@link #getBiasNanos()} is available, {@code false} otherwise. 244ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 24576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public boolean hasBiasNanos() { 2462102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa return isFlagSet(HAS_BIAS); 247ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 248ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 249ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 2502102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa * Gets the clock's sub-nanosecond bias. 251ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * 252e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>See the description of how this field is part of converting from hardware clock time, to 253e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * GPS time, in {@link #getFullBiasNanos()}. 254e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * 255e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>The error estimate for the sum of this field and {@link #getFullBiasNanos} is 256e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * {@link #getBiasUncertaintyNanos()}. 257e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * 258e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>The value is only available if {@link #hasBiasNanos()} is {@code true}. 259ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 26076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public double getBiasNanos() { 26176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang return mBiasNanos; 262ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 263ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 264ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 2652102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa * Sets the sub-nanosecond bias. 2660f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 267ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 2680f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 26976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public void setBiasNanos(double biasNanos) { 2702102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa setFlag(HAS_BIAS); 27176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mBiasNanos = biasNanos; 272ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 273ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 274ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 275ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Resets the clock's Bias in nanoseconds. 2760f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 277ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 2780f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 27976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public void resetBiasNanos() { 2802102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa resetFlag(HAS_BIAS); 28176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mBiasNanos = Double.NaN; 282ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 283ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 284ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 285e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * Returns {@code true} if {@link #getBiasUncertaintyNanos()} is available, {@code false} 286e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * otherwise. 287ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 28876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public boolean hasBiasUncertaintyNanos() { 2892102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa return isFlagSet(HAS_BIAS_UNCERTAINTY); 290ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 291ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 292ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 293ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Gets the clock's Bias Uncertainty (1-Sigma) in nanoseconds. 294ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * 295e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>See the description of how this field provides the error estimate in the conversion from 296e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * hardware clock time, to GPS time, in {@link #getFullBiasNanos()}. 297e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * 298e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>The value is only available if {@link #hasBiasUncertaintyNanos()} is {@code true}. 299ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 30076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public double getBiasUncertaintyNanos() { 30176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang return mBiasUncertaintyNanos; 302ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 303ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 304ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 305ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Sets the clock's Bias Uncertainty (1-Sigma) in nanoseconds. 3060f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 307ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 3080f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 30976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public void setBiasUncertaintyNanos(double biasUncertaintyNanos) { 3102102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa setFlag(HAS_BIAS_UNCERTAINTY); 31176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mBiasUncertaintyNanos = biasUncertaintyNanos; 312ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 313ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 314ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 315ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Resets the clock's Bias Uncertainty (1-Sigma) in nanoseconds. 3160f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 317ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 3180f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 31976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public void resetBiasUncertaintyNanos() { 3202102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa resetFlag(HAS_BIAS_UNCERTAINTY); 32176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mBiasUncertaintyNanos = Double.NaN; 322ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 323ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 324ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 325e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * Returns {@code true} if {@link #getDriftNanosPerSecond()} is available, {@code false} 326e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * otherwise. 327ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 32876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public boolean hasDriftNanosPerSecond() { 3292102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa return isFlagSet(HAS_DRIFT); 330ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 331ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 332ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 333ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Gets the clock's Drift in nanoseconds per second. 334ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * 335e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>A positive value indicates that the frequency is higher than the nominal (e.g. GPS master 336e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * clock) frequency. The error estimate for this reported drift is 337e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * {@link #getDriftUncertaintyNanosPerSecond()}. 338e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * 339e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>The value is only available if {@link #hasDriftNanosPerSecond()} is {@code true}. 340ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 34176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public double getDriftNanosPerSecond() { 34276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang return mDriftNanosPerSecond; 343ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 344ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 345ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 346ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Sets the clock's Drift in nanoseconds per second. 3470f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 348ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 3490f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 35076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public void setDriftNanosPerSecond(double driftNanosPerSecond) { 3512102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa setFlag(HAS_DRIFT); 35276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mDriftNanosPerSecond = driftNanosPerSecond; 353ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 354ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 355ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 356ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Resets the clock's Drift in nanoseconds per second. 3570f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 358ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 3590f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 36076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public void resetDriftNanosPerSecond() { 3612102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa resetFlag(HAS_DRIFT); 36276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mDriftNanosPerSecond = Double.NaN; 363ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 364ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 365ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 366e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * Returns {@code true} if {@link #getDriftUncertaintyNanosPerSecond()} is available, 367e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * {@code false} otherwise. 368ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 36976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public boolean hasDriftUncertaintyNanosPerSecond() { 3702102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa return isFlagSet(HAS_DRIFT_UNCERTAINTY); 371ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 372ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 373ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 374ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Gets the clock's Drift Uncertainty (1-Sigma) in nanoseconds per second. 375ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * 376e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>The value is only available if {@link #hasDriftUncertaintyNanosPerSecond()} is 377e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * {@code true}. 378ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 37976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public double getDriftUncertaintyNanosPerSecond() { 38076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang return mDriftUncertaintyNanosPerSecond; 381ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 382ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 383ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 384ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Sets the clock's Drift Uncertainty (1-Sigma) in nanoseconds per second. 3850f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 386ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */ 3870f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 38876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang public void setDriftUncertaintyNanosPerSecond(double driftUncertaintyNanosPerSecond) { 3892102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa setFlag(HAS_DRIFT_UNCERTAINTY); 39076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mDriftUncertaintyNanosPerSecond = driftUncertaintyNanosPerSecond; 391ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 392ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 393ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa /** 394e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * Resets the clock's Drift Uncertainty (1-Sigma) in nanoseconds per second. 395e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * @hide 396e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang */ 397e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang @TestApi 398e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang public void resetDriftUncertaintyNanosPerSecond() { 399e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang resetFlag(HAS_DRIFT_UNCERTAINTY); 400e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang mDriftUncertaintyNanosPerSecond = Double.NaN; 401e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang } 402e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang 403e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang /** 404e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * Gets count of hardware clock discontinuities. 405e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * 406e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>When this value stays the same, vs. a value in a previously reported {@link GnssClock}, it 407e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * can be safely assumed that the {@code TimeNanos} value has been derived from a clock that has 408e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * been running continuously - e.g. a single continuously powered crystal oscillator, and thus 409e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * the {@code (FullBiasNanos + BiasNanos)} offset can be modelled with traditional clock bias 410e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * & drift models. 411e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * 412e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>Each time this value changes, vs. the value in a previously reported {@link GnssClock}, 413e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * that suggests the hardware clock may have experienced a discontinuity (e.g. a power cycle or 414e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * other anomaly), so that any assumptions about modelling a smoothly changing 415e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * {@code (FullBiasNanos + BiasNanos)} offset, and a smoothly growing {@code (TimeNanos)} 416e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * between this and the previously reported {@code GnssClock}, should be reset. 417e5a0e21b6fcba32e6d7486c5e7736d7d0348d55cLifu Tang */ 4189363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang public int getHardwareClockDiscontinuityCount() { 4199363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang return mHardwareClockDiscontinuityCount; 420e5a0e21b6fcba32e6d7486c5e7736d7d0348d55cLifu Tang } 421e5a0e21b6fcba32e6d7486c5e7736d7d0348d55cLifu Tang 422e5a0e21b6fcba32e6d7486c5e7736d7d0348d55cLifu Tang /** 4239363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang * Sets count of last hardware clock discontinuity. 4240f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang * @hide 425e5a0e21b6fcba32e6d7486c5e7736d7d0348d55cLifu Tang */ 4260f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang @TestApi 4279363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang public void setHardwareClockDiscontinuityCount(int value) { 4289363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang mHardwareClockDiscontinuityCount = value; 429e5a0e21b6fcba32e6d7486c5e7736d7d0348d55cLifu Tang } 430e5a0e21b6fcba32e6d7486c5e7736d7d0348d55cLifu Tang 431818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang public static final Creator<GnssClock> CREATOR = new Creator<GnssClock>() { 432ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa @Override 433818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang public GnssClock createFromParcel(Parcel parcel) { 434818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang GnssClock gpsClock = new GnssClock(); 435ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 43676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang gpsClock.mFlags = parcel.readInt(); 43776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang gpsClock.mLeapSecond = parcel.readInt(); 43876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang gpsClock.mTimeNanos = parcel.readLong(); 43976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang gpsClock.mTimeUncertaintyNanos = parcel.readDouble(); 44076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang gpsClock.mFullBiasNanos = parcel.readLong(); 44176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang gpsClock.mBiasNanos = parcel.readDouble(); 44276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang gpsClock.mBiasUncertaintyNanos = parcel.readDouble(); 44376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang gpsClock.mDriftNanosPerSecond = parcel.readDouble(); 44476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang gpsClock.mDriftUncertaintyNanosPerSecond = parcel.readDouble(); 4459363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang gpsClock.mHardwareClockDiscontinuityCount = parcel.readInt(); 446ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 447ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return gpsClock; 448ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 449ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 450ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa @Override 451818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang public GnssClock[] newArray(int size) { 452818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang return new GnssClock[size]; 453ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 454ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa }; 455ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 4569363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang @Override 457ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa public void writeToParcel(Parcel parcel, int flags) { 4582102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa parcel.writeInt(mFlags); 459ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa parcel.writeInt(mLeapSecond); 46076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang parcel.writeLong(mTimeNanos); 46176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang parcel.writeDouble(mTimeUncertaintyNanos); 46276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang parcel.writeLong(mFullBiasNanos); 46376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang parcel.writeDouble(mBiasNanos); 46476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang parcel.writeDouble(mBiasUncertaintyNanos); 46576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang parcel.writeDouble(mDriftNanosPerSecond); 46676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang parcel.writeDouble(mDriftUncertaintyNanosPerSecond); 4679363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang parcel.writeInt(mHardwareClockDiscontinuityCount); 468ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 469ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 470ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa @Override 471ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa public int describeContents() { 472ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return 0; 473ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 474ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 475ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa @Override 476ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa public String toString() { 4772102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa final String format = " %-15s = %s\n"; 4782102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa final String formatWithUncertainty = " %-15s = %-25s %-26s = %s\n"; 479818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang StringBuilder builder = new StringBuilder("GnssClock:\n"); 480ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 4812102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa builder.append(String.format(format, "LeapSecond", hasLeapSecond() ? mLeapSecond : null)); 482ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 483ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa builder.append(String.format( 4842102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa formatWithUncertainty, 48576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang "TimeNanos", 48676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang mTimeNanos, 48776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang "TimeUncertaintyNanos", 48876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang hasTimeUncertaintyNanos() ? mTimeUncertaintyNanos : null)); 489ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 490ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa builder.append(String.format( 491ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa format, 49276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang "FullBiasNanos", 49376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang hasFullBiasNanos() ? mFullBiasNanos : null)); 4942102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa 4952102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa builder.append(String.format( 4962102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa formatWithUncertainty, 49776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang "BiasNanos", 49876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang hasBiasNanos() ? mBiasNanos : null, 49976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang "BiasUncertaintyNanos", 50076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang hasBiasUncertaintyNanos() ? mBiasUncertaintyNanos : null)); 501ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 502ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa builder.append(String.format( 5032102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa formatWithUncertainty, 50476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang "DriftNanosPerSecond", 50576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang hasDriftNanosPerSecond() ? mDriftNanosPerSecond : null, 50676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang "DriftUncertaintyNanosPerSecond", 50776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang hasDriftUncertaintyNanosPerSecond() ? mDriftUncertaintyNanosPerSecond : null)); 508ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa 50917350f925f5ee4d4df92c768c92e442179b1a420Lifu Tang builder.append(String.format( 51017350f925f5ee4d4df92c768c92e442179b1a420Lifu Tang format, 51117350f925f5ee4d4df92c768c92e442179b1a420Lifu Tang "HardwareClockDiscontinuityCount", 51217350f925f5ee4d4df92c768c92e442179b1a420Lifu Tang mHardwareClockDiscontinuityCount)); 51317350f925f5ee4d4df92c768c92e442179b1a420Lifu Tang 514ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa return builder.toString(); 515ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa } 5162102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa 5172102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa private void initialize() { 5182102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa mFlags = HAS_NO_FLAGS; 5192102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa resetLeapSecond(); 52076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang setTimeNanos(Long.MIN_VALUE); 52176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang resetTimeUncertaintyNanos(); 52276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang resetFullBiasNanos(); 52376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang resetBiasNanos(); 52476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang resetBiasUncertaintyNanos(); 52576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang resetDriftNanosPerSecond(); 52676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang resetDriftUncertaintyNanosPerSecond(); 5279363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang setHardwareClockDiscontinuityCount(Integer.MIN_VALUE); 5282102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa } 5292102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa 53076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private void setFlag(int flag) { 5312102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa mFlags |= flag; 5322102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa } 5332102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa 53476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private void resetFlag(int flag) { 5352102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa mFlags &= ~flag; 5362102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa } 5372102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa 53876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang private boolean isFlagSet(int flag) { 5392102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa return (mFlags & flag) == flag; 5402102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa } 541ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa} 542