GnssClock.java revision 76a620f0482ba54a4921c7c7e7eeb8ea87c12d3e
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
19ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaaimport android.os.Parcel;
20ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaaimport android.os.Parcelable;
21ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
22ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa/**
23ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * A class containing a GPS clock timestamp.
24ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * It represents a measurement of the GPS receiver's clock.
25ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */
26818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tangpublic final class GnssClock implements Parcelable {
272102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    // The following enumerations must be in sync with the values declared in gps.h
282102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
2976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private static final int HAS_NO_FLAGS = 0;
3076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private static final int HAS_LEAP_SECOND = (1<<0);
3176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private static final int HAS_TIME_UNCERTAINTY = (1<<1);
3276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private static final int HAS_FULL_BIAS = (1<<2);
3376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private static final int HAS_BIAS = (1<<3);
3476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private static final int HAS_BIAS_UNCERTAINTY = (1<<4);
3576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private static final int HAS_DRIFT = (1<<5);
3676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private static final int HAS_DRIFT_UNCERTAINTY = (1<<6);
372102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
382102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    // End enumerations in sync with gps.h
392102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
4076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private int mFlags;
4176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private int mLeapSecond;
4276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private long mTimeNanos;
4376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private double mTimeUncertaintyNanos;
4476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private long mFullBiasNanos;
4576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private double mBiasNanos;
4676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private double mBiasUncertaintyNanos;
4776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private double mDriftNanosPerSecond;
4876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private double mDriftUncertaintyNanosPerSecond;
499363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    private int mHardwareClockDiscontinuityCount;
50ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
51818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang    GnssClock() {
522102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        initialize();
53ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
54ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
55ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
56ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets all contents to the values stored in the provided object.
57ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
58818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang    public void set(GnssClock clock) {
592102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        mFlags = clock.mFlags;
60ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mLeapSecond = clock.mLeapSecond;
6176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mTimeNanos = clock.mTimeNanos;
6276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mTimeUncertaintyNanos = clock.mTimeUncertaintyNanos;
6376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mFullBiasNanos = clock.mFullBiasNanos;
6476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mBiasNanos = clock.mBiasNanos;
6576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mBiasUncertaintyNanos = clock.mBiasUncertaintyNanos;
6676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mDriftNanosPerSecond = clock.mDriftNanosPerSecond;
6776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mDriftUncertaintyNanosPerSecond = clock.mDriftUncertaintyNanosPerSecond;
689363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang        mHardwareClockDiscontinuityCount = clock.mHardwareClockDiscontinuityCount;
69ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
70ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
71ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
72ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets all the contents to its original state.
73ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
74ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void reset() {
752102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        initialize();
762102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
77ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
782102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
79ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Returns true if {@link #getLeapSecond()} is available, false otherwise.
80ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
81ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public boolean hasLeapSecond() {
822102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return isFlagSet(HAS_LEAP_SECOND);
83ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
84ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
85ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
86ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the leap second associated with the clock's time.
872102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * The sign of the value is defined by the following equation:
882102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     *      utc_time_ns = time_ns + (full_bias_ns + bias_ns) - leap_second * 1,000,000,000
89ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
90ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * The value is only available if {@link #hasLeapSecond()} is true.
91ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
9276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getLeapSecond() {
93ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        return mLeapSecond;
94ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
95ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
96ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
97ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the leap second associated with the clock's time.
98ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
9976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setLeapSecond(int leapSecond) {
1002102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setFlag(HAS_LEAP_SECOND);
101ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mLeapSecond = leapSecond;
102ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
103ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
104ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
105ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets the leap second associated with the clock's time.
106ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
107ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void resetLeapSecond() {
1082102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetFlag(HAS_LEAP_SECOND);
10976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mLeapSecond = Integer.MIN_VALUE;
110ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
111ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
112ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
11338bce7925c58fe585144f25ea6c954bab4f5da42Lifu Tang     * Gets the GNSS receiver internal clock value in nanoseconds.
1142102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     *
1152102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * For 'local hardware clock' this value is expected to be monotonically increasing during the
1162102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * reporting session. The real GPS time can be derived by compensating
11776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * {@link #getFullBiasNanos()} (when it is available) from this value.
1182102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     *
1192102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * For 'GPS time' this value is expected to be the best estimation of current GPS time that GPS
12076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * receiver can achieve. {@link #getTimeUncertaintyNanos()} should be available when GPS time is
1212102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * specified.
1222102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     *
12376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * Sub-nanosecond accuracy can be provided by means of {@link #getBiasNanos()}.
12476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * The reported time includes {@link #getTimeUncertaintyNanos()}.
125ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
12676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public long getTimeNanos() {
12776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mTimeNanos;
128ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
129ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
130ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
13176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * Sets the GNSS receiver internal clock in nanoseconds.
132ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
13376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setTimeNanos(long timeNanos) {
13476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mTimeNanos = timeNanos;
135ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
136ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
137ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
13876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * Returns true if {@link #getTimeUncertaintyNanos()} is available, false otherwise.
139ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
14076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public boolean hasTimeUncertaintyNanos() {
1412102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return isFlagSet(HAS_TIME_UNCERTAINTY);
142ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
143ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
144ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
145ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the clock's time Uncertainty (1-Sigma) in nanoseconds.
1462102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * The uncertainty is represented as an absolute (single sided) value.
147ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
14876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * The value is only available if {@link #hasTimeUncertaintyNanos()} is true.
149ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
15076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public double getTimeUncertaintyNanos() {
15176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mTimeUncertaintyNanos;
152ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
153ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
154ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
155ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the clock's Time Uncertainty (1-Sigma) in nanoseconds.
156ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
15776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setTimeUncertaintyNanos(double timeUncertaintyNanos) {
1582102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setFlag(HAS_TIME_UNCERTAINTY);
15976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mTimeUncertaintyNanos = timeUncertaintyNanos;
160ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
161ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
162ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
163ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets the clock's Time Uncertainty (1-Sigma) in nanoseconds.
164ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
16576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void resetTimeUncertaintyNanos() {
1662102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetFlag(HAS_TIME_UNCERTAINTY);
16776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mTimeUncertaintyNanos = Double.NaN;
168ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
169ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
170ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
17176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * Returns true if {@link #getFullBiasNanos()} is available, false otherwise.
1722102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
17376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public boolean hasFullBiasNanos() {
1742102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return isFlagSet(HAS_FULL_BIAS);
1752102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
1762102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
1772102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
17876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * Gets the difference between hardware clock ({@link #getTimeNanos()}) inside GPS receiver and
1792102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * the true GPS time since 0000Z, January 6, 1980, in nanoseconds.
1802102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     *
18138bce7925c58fe585144f25ea6c954bab4f5da42Lifu Tang     * This value is available if the receiver has estimated GPS time. If the computed time is for a
18238bce7925c58fe585144f25ea6c954bab4f5da42Lifu Tang     * non-GPS constellation, the time offset of that constellation to GPS has to be applied to fill
18376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * this value. The value contains the 'bias uncertainty' {@link #getBiasUncertaintyNanos()} in
18438bce7925c58fe585144f25ea6c954bab4f5da42Lifu Tang     * it, and it should be used for quality check. The value is only available if
18576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * {@link #hasFullBiasNanos()} is true.
1862102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     *
1872102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * The sign of the value is defined by the following equation:
18838bce7925c58fe585144f25ea6c954bab4f5da42Lifu Tang     *      local estimate of GPS time = time_ns + (full_bias_ns + bias_ns)
1892102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
19076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public long getFullBiasNanos() {
19176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mFullBiasNanos;
1922102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
1932102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
1942102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
1952102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Sets the full bias in nanoseconds.
1962102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
19776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setFullBiasNanos(long value) {
1982102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setFlag(HAS_FULL_BIAS);
19976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mFullBiasNanos = value;
2002102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
2012102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
2022102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
2032102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Resets the full bias in nanoseconds.
2042102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
20576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void resetFullBiasNanos() {
2062102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetFlag(HAS_FULL_BIAS);
20776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mFullBiasNanos = Long.MIN_VALUE;
2082102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
2092102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
2102102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
21176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * Returns true if {@link #getBiasNanos()} is available, false otherwise.
212ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
21376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public boolean hasBiasNanos() {
2142102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return isFlagSet(HAS_BIAS);
215ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
216ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
217ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
2182102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Gets the clock's sub-nanosecond bias.
21976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * The reported bias includes {@link #getBiasUncertaintyNanos()}.
220ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
22176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * The value is only available if {@link #hasBiasNanos()} is true.
222ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
22376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public double getBiasNanos() {
22476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mBiasNanos;
225ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
226ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
227ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
2282102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Sets the sub-nanosecond bias.
229ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
23076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setBiasNanos(double biasNanos) {
2312102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setFlag(HAS_BIAS);
23276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mBiasNanos = biasNanos;
233ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
234ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
235ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
236ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets the clock's Bias in nanoseconds.
237ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
23876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void resetBiasNanos() {
2392102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetFlag(HAS_BIAS);
24076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mBiasNanos = Double.NaN;
241ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
242ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
243ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
24476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * Returns true if {@link #getBiasUncertaintyNanos()} is available, false otherwise.
245ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
24676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public boolean hasBiasUncertaintyNanos() {
2472102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return isFlagSet(HAS_BIAS_UNCERTAINTY);
248ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
249ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
250ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
251ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the clock's Bias Uncertainty (1-Sigma) in nanoseconds.
252ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
25376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * The value is only available if {@link #hasBiasUncertaintyNanos()} is true.
254ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
25576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public double getBiasUncertaintyNanos() {
25676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mBiasUncertaintyNanos;
257ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
258ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
259ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
260ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the clock's Bias Uncertainty (1-Sigma) in nanoseconds.
261ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
26276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setBiasUncertaintyNanos(double biasUncertaintyNanos) {
2632102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setFlag(HAS_BIAS_UNCERTAINTY);
26476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mBiasUncertaintyNanos = biasUncertaintyNanos;
265ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
266ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
267ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
268ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets the clock's Bias Uncertainty (1-Sigma) in nanoseconds.
269ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
27076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void resetBiasUncertaintyNanos() {
2712102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetFlag(HAS_BIAS_UNCERTAINTY);
27276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mBiasUncertaintyNanos = Double.NaN;
273ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
274ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
275ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
27676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * Returns true if {@link #getDriftNanosPerSecond()} is available, false otherwise.
277ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
27876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public boolean hasDriftNanosPerSecond() {
2792102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return isFlagSet(HAS_DRIFT);
280ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
281ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
282ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
283ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the clock's Drift in nanoseconds per second.
284ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * A positive value indicates that the frequency is higher than the nominal frequency.
28576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * The reported drift includes {@link #getDriftUncertaintyNanosPerSecond()}.
286ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
28776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * The value is only available if {@link #hasDriftNanosPerSecond()} is true.
288ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
28976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public double getDriftNanosPerSecond() {
29076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mDriftNanosPerSecond;
291ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
292ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
293ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
294ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the clock's Drift in nanoseconds per second.
295ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
29676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setDriftNanosPerSecond(double driftNanosPerSecond) {
2972102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setFlag(HAS_DRIFT);
29876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mDriftNanosPerSecond = driftNanosPerSecond;
299ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
300ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
301ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
302ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets the clock's Drift in nanoseconds per second.
303ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
30476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void resetDriftNanosPerSecond() {
3052102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetFlag(HAS_DRIFT);
30676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mDriftNanosPerSecond = Double.NaN;
307ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
308ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
309ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
31076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * Returns true if {@link #getDriftUncertaintyNanosPerSecond()} is available, false otherwise.
311ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
31276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public boolean hasDriftUncertaintyNanosPerSecond() {
3132102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return isFlagSet(HAS_DRIFT_UNCERTAINTY);
314ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
315ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
316ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
317ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the clock's Drift Uncertainty (1-Sigma) in nanoseconds per second.
318ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
31976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * The value is only available if {@link #hasDriftUncertaintyNanosPerSecond()} is true.
320ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
32176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public double getDriftUncertaintyNanosPerSecond() {
32276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mDriftUncertaintyNanosPerSecond;
323ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
324ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
325ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
326ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the clock's Drift Uncertainty (1-Sigma) in nanoseconds per second.
327ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
32876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setDriftUncertaintyNanosPerSecond(double driftUncertaintyNanosPerSecond) {
3292102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setFlag(HAS_DRIFT_UNCERTAINTY);
33076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mDriftUncertaintyNanosPerSecond = driftUncertaintyNanosPerSecond;
331ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
332ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
333ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
3349363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     * Gets count of last hardware clock discontinuity.
335e5a0e21b6fcba32e6d7486c5e7736d7d0348d55cLifu Tang     */
3369363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    public int getHardwareClockDiscontinuityCount() {
3379363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang        return mHardwareClockDiscontinuityCount;
338e5a0e21b6fcba32e6d7486c5e7736d7d0348d55cLifu Tang    }
339e5a0e21b6fcba32e6d7486c5e7736d7d0348d55cLifu Tang
340e5a0e21b6fcba32e6d7486c5e7736d7d0348d55cLifu Tang    /**
3419363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     * Sets count of last hardware clock discontinuity.
342e5a0e21b6fcba32e6d7486c5e7736d7d0348d55cLifu Tang     */
3439363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    public void setHardwareClockDiscontinuityCount(int value) {
3449363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang        mHardwareClockDiscontinuityCount = value;
345e5a0e21b6fcba32e6d7486c5e7736d7d0348d55cLifu Tang    }
346e5a0e21b6fcba32e6d7486c5e7736d7d0348d55cLifu Tang
347e5a0e21b6fcba32e6d7486c5e7736d7d0348d55cLifu Tang    /**
348ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets the clock's Drift Uncertainty (1-Sigma) in nanoseconds per second.
349ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
35076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void resetDriftUncertaintyNanosPerSecond() {
3512102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetFlag(HAS_DRIFT_UNCERTAINTY);
35276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mDriftUncertaintyNanosPerSecond = Double.NaN;
353ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
354ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
355818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang    public static final Creator<GnssClock> CREATOR = new Creator<GnssClock>() {
356ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        @Override
357818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang        public GnssClock createFromParcel(Parcel parcel) {
358818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            GnssClock gpsClock = new GnssClock();
359ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
36076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gpsClock.mFlags = parcel.readInt();
36176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gpsClock.mLeapSecond = parcel.readInt();
36276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gpsClock.mTimeNanos = parcel.readLong();
36376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gpsClock.mTimeUncertaintyNanos = parcel.readDouble();
36476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gpsClock.mFullBiasNanos = parcel.readLong();
36576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gpsClock.mBiasNanos = parcel.readDouble();
36676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gpsClock.mBiasUncertaintyNanos = parcel.readDouble();
36776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gpsClock.mDriftNanosPerSecond = parcel.readDouble();
36876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gpsClock.mDriftUncertaintyNanosPerSecond = parcel.readDouble();
3699363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang            gpsClock.mHardwareClockDiscontinuityCount = parcel.readInt();
370ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
371ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa            return gpsClock;
372ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        }
373ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
374ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        @Override
375818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang        public GnssClock[] newArray(int size) {
376818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            return new GnssClock[size];
377ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        }
378ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    };
379ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
3809363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    @Override
381ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void writeToParcel(Parcel parcel, int flags) {
3822102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        parcel.writeInt(mFlags);
383ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        parcel.writeInt(mLeapSecond);
38476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeLong(mTimeNanos);
38576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeDouble(mTimeUncertaintyNanos);
38676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeLong(mFullBiasNanos);
38776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeDouble(mBiasNanos);
38876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeDouble(mBiasUncertaintyNanos);
38976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeDouble(mDriftNanosPerSecond);
39076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeDouble(mDriftUncertaintyNanosPerSecond);
3919363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang        parcel.writeInt(mHardwareClockDiscontinuityCount);
392ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
393ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
394ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    @Override
395ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public int describeContents() {
396ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        return 0;
397ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
398ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
399ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    @Override
400ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public String toString() {
4012102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        final String format = "   %-15s = %s\n";
4022102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        final String formatWithUncertainty = "   %-15s = %-25s   %-26s = %s\n";
403818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang        StringBuilder builder = new StringBuilder("GnssClock:\n");
404ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
4052102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        builder.append(String.format(format, "LeapSecond", hasLeapSecond() ? mLeapSecond : null));
406ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
407ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        builder.append(String.format(
4082102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                formatWithUncertainty,
40976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "TimeNanos",
41076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                mTimeNanos,
41176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "TimeUncertaintyNanos",
41276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                hasTimeUncertaintyNanos() ? mTimeUncertaintyNanos : null));
413ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
414ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        builder.append(String.format(
415ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                format,
41676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "FullBiasNanos",
41776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                hasFullBiasNanos() ? mFullBiasNanos : null));
4182102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
4192102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        builder.append(String.format(
4202102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                formatWithUncertainty,
42176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "BiasNanos",
42276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                hasBiasNanos() ? mBiasNanos : null,
42376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "BiasUncertaintyNanos",
42476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                hasBiasUncertaintyNanos() ? mBiasUncertaintyNanos : null));
425ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
426ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        builder.append(String.format(
4272102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                formatWithUncertainty,
42876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "DriftNanosPerSecond",
42976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                hasDriftNanosPerSecond() ? mDriftNanosPerSecond : null,
43076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "DriftUncertaintyNanosPerSecond",
43176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                hasDriftUncertaintyNanosPerSecond() ? mDriftUncertaintyNanosPerSecond : null));
432ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
433ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        return builder.toString();
434ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
4352102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
4362102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private void initialize() {
4372102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        mFlags = HAS_NO_FLAGS;
4382102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetLeapSecond();
43976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setTimeNanos(Long.MIN_VALUE);
44076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        resetTimeUncertaintyNanos();
44176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        resetFullBiasNanos();
44276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        resetBiasNanos();
44376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        resetBiasUncertaintyNanos();
44476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        resetDriftNanosPerSecond();
44576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        resetDriftUncertaintyNanosPerSecond();
4469363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang        setHardwareClockDiscontinuityCount(Integer.MIN_VALUE);
4472102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
4482102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
44976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private void setFlag(int flag) {
4502102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        mFlags |= flag;
4512102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
4522102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
45376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private void resetFlag(int flag) {
4542102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        mFlags &= ~flag;
4552102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
4562102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
45776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private boolean isFlagSet(int flag) {
4582102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return (mFlags & flag) == flag;
4592102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
460ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa}
461