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     * &amp; 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