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;
20a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tangimport android.annotation.IntDef;
21ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaaimport android.os.Parcel;
22ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaaimport android.os.Parcelable;
23ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
24a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tangimport java.lang.annotation.Retention;
25a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tangimport java.lang.annotation.RetentionPolicy;
26a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tang
27ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa/**
289363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang * A class representing a GNSS satellite measurement, containing raw and computed information.
29ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */
30818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tangpublic final class GnssMeasurement implements Parcelable {
312102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private int mFlags;
3276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private int mSvid;
3376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private int mConstellationType;
3476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private double mTimeOffsetNanos;
3576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private int mState;
3676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private long mReceivedSvTimeNanos;
3776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private long mReceivedSvTimeUncertaintyNanos;
3876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private double mCn0DbHz;
3976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private double mPseudorangeRateMetersPerSecond;
4076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private double mPseudorangeRateUncertaintyMetersPerSecond;
4176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private int mAccumulatedDeltaRangeState;
4276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private double mAccumulatedDeltaRangeMeters;
4376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private double mAccumulatedDeltaRangeUncertaintyMeters;
4476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private float mCarrierFrequencyHz;
45ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    private long mCarrierCycles;
46ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    private double mCarrierPhase;
47ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    private double mCarrierPhaseUncertainty;
4876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private int mMultipathIndicator;
49ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    private double mSnrInDb;
50ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
51ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    // The following enumerations must be in sync with the values declared in gps.h
52ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
532102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private static final int HAS_NO_FLAGS = 0;
542102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private static final int HAS_SNR = (1<<0);
552102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private static final int HAS_CARRIER_FREQUENCY = (1<<9);
562102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private static final int HAS_CARRIER_CYCLES = (1<<10);
572102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private static final int HAS_CARRIER_PHASE = (1<<11);
582102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private static final int HAS_CARRIER_PHASE_UNCERTAINTY = (1<<12);
592102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
602b67c07d82f59f9b776414576c21dd31ed9dac48Julius D'souza    /**
612b67c07d82f59f9b776414576c21dd31ed9dac48Julius D'souza     * The status of the multipath indicator.
622b67c07d82f59f9b776414576c21dd31ed9dac48Julius D'souza     * @hide
632b67c07d82f59f9b776414576c21dd31ed9dac48Julius D'souza     */
64a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tang    @Retention(RetentionPolicy.SOURCE)
65a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tang    @IntDef({MULTIPATH_INDICATOR_UNKNOWN, MULTIPATH_INDICATOR_DETECTED,
66a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tang        MULTIPATH_INDICATOR_NOT_USED})
67a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tang    public @interface MultipathIndicator {}
68a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tang
69ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
70e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * The indicator is not available or the presence or absence of multipath is unknown.
71ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
7276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int MULTIPATH_INDICATOR_UNKNOWN = 0;
73ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
74ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
75e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * The measurement shows signs of multi-path.
76ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
7776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int MULTIPATH_INDICATOR_DETECTED = 1;
78ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
79ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
80e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * The measurement shows no signs of multi-path.
81ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
82e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang    public static final int MULTIPATH_INDICATOR_NOT_DETECTED = 2;
83e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang
84e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang    /** @removed */
8576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int MULTIPATH_INDICATOR_NOT_USED = 2;
862102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
87047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This GNSS measurement's tracking state is invalid or unknown. */
8876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATE_UNKNOWN = 0;
89047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This GNSS measurement's tracking state has code lock. */
9076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATE_CODE_LOCK = (1<<0);
91047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This GNSS measurement's tracking state has bit sync. */
9276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATE_BIT_SYNC = (1<<1);
93047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This GNSS measurement's tracking state has sub-frame sync. */
9476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATE_SUBFRAME_SYNC = (1<<2);
95047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This GNSS measurement's tracking state has time-of-week decoded. */
9676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATE_TOW_DECODED = (1<<3);
97047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This GNSS measurement's tracking state contains millisecond ambiguity. */
9876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATE_MSEC_AMBIGUOUS = (1<<4);
99047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This GNSS measurement's tracking state has symbol sync. */
100047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_SYMBOL_SYNC = (1<<5);
101047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This Glonass measurement's tracking state has string sync. */
102047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_GLO_STRING_SYNC = (1<<6);
103047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This Glonass measurement's tracking state has time-of-day decoded. */
104047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_GLO_TOD_DECODED = (1<<7);
105047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This Beidou measurement's tracking state has D2 bit sync. */
106047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_BDS_D2_BIT_SYNC = (1<<8);
107047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This Beidou measurement's tracking state has D2 sub-frame sync. */
108047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_BDS_D2_SUBFRAME_SYNC = (1<<9);
109047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This Galileo measurement's tracking state has E1B/C code lock. */
110047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_GAL_E1BC_CODE_LOCK = (1<<10);
111047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This Galileo measurement's tracking state has E1C secondary code lock. */
112047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_GAL_E1C_2ND_CODE_LOCK = (1<<11);
113047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This Galileo measurement's tracking state has E1B page sync. */
114047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_GAL_E1B_PAGE_SYNC = (1<<12);
115047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This SBAS measurement's tracking state has whole second level sync. */
116047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_SBAS_SYNC = (1<<13);
1175e72118f193258259912c0a51688bd4434c8896edestradaa
1185e72118f193258259912c0a51688bd4434c8896edestradaa    /**
119047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang     * All the GNSS receiver state flags, for bit masking purposes (not a sensible state for any
120047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang     * individual measurement.)
121c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa     */
122047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    private static final int STATE_ALL = 0x3fff;  // 2 bits + 4 bits + 4 bits + 4 bits = 14 bits
123c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa
124c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa    /**
1252102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * The state of the 'Accumulated Delta Range' is invalid or unknown.
1262102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
12776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int ADR_STATE_UNKNOWN = 0;
1282102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
1292102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
1302102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * The state of the 'Accumulated Delta Range' is valid.
1312102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
13276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int ADR_STATE_VALID = (1<<0);
1332102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
1342102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
1352102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * The state of the 'Accumulated Delta Range' has detected a reset.
1362102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
13776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int ADR_STATE_RESET = (1<<1);
1382102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
1392102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
1402102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * The state of the 'Accumulated Delta Range' has a cycle slip detected.
1412102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
14276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int ADR_STATE_CYCLE_SLIP = (1<<2);
143ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
144c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa    /**
145c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa     * All the 'Accumulated Delta Range' flags.
146c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa     */
14776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private static final int ADR_ALL = ADR_STATE_VALID | ADR_STATE_RESET | ADR_STATE_CYCLE_SLIP;
148c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa
149ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    // End enumerations in sync with gps.h
150ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
1510f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    /**
1520f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
1530f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     */
1540f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
1550f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    public GnssMeasurement() {
1562102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        initialize();
157ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
158ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
159ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
160ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets all contents to the values stored in the provided object.
1610f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
162ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
1630f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
164818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang    public void set(GnssMeasurement measurement) {
1652102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        mFlags = measurement.mFlags;
166120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        mSvid = measurement.mSvid;
1679363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang        mConstellationType = measurement.mConstellationType;
16876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mTimeOffsetNanos = measurement.mTimeOffsetNanos;
1692102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        mState = measurement.mState;
17076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mReceivedSvTimeNanos = measurement.mReceivedSvTimeNanos;
17176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mReceivedSvTimeUncertaintyNanos = measurement.mReceivedSvTimeUncertaintyNanos;
17276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mCn0DbHz = measurement.mCn0DbHz;
17376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mPseudorangeRateMetersPerSecond = measurement.mPseudorangeRateMetersPerSecond;
17476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mPseudorangeRateUncertaintyMetersPerSecond =
17576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                measurement.mPseudorangeRateUncertaintyMetersPerSecond;
1762102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        mAccumulatedDeltaRangeState = measurement.mAccumulatedDeltaRangeState;
17776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mAccumulatedDeltaRangeMeters = measurement.mAccumulatedDeltaRangeMeters;
17876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mAccumulatedDeltaRangeUncertaintyMeters =
17976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                measurement.mAccumulatedDeltaRangeUncertaintyMeters;
18076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mCarrierFrequencyHz = measurement.mCarrierFrequencyHz;
181ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierCycles = measurement.mCarrierCycles;
182ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierPhase = measurement.mCarrierPhase;
183ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierPhaseUncertainty = measurement.mCarrierPhaseUncertainty;
184ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mMultipathIndicator = measurement.mMultipathIndicator;
185ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mSnrInDb = measurement.mSnrInDb;
186ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
187ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
188ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
189ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets all the contents to its original state.
1900f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
191ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
1920f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
193ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void reset() {
1942102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        initialize();
195ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
196ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
197ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
198e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Gets the satellite ID.
199e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
200e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>Interpretation depends on {@link #getConstellationType()}.
201e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * See {@link GnssStatus#getSvid(int)}.
202ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
20376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getSvid() {
204120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        return mSvid;
205ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
206ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
207ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
208e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Sets the Satellite ID.
2090f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
210ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
2110f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
21276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setSvid(int value) {
213120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        mSvid = value;
214ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
215ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
216ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
217e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Gets the constellation type.
218e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
219e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The return value is one of those constants with {@code CONSTELLATION_} prefix in
220e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * {@link GnssStatus}.
2219363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     */
2229363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    @GnssStatus.ConstellationType
22376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getConstellationType() {
2249363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang        return mConstellationType;
2259363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    }
2269363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang
2279363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /**
2289363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     * Sets the constellation type.
2290f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
2309363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     */
2310f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
23276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setConstellationType(@GnssStatus.ConstellationType int value) {
2339363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang        mConstellationType = value;
2349363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    }
2359363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang
2369363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /**
2372102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Gets the time offset at which the measurement was taken in nanoseconds.
23838bce7925c58fe585144f25ea6c954bab4f5da42Lifu Tang     *
239e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The reference receiver's time from which this is offset is specified by
24076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * {@link GnssClock#getTimeNanos()}.
2412102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     *
242e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The sign of this value is given by the following equation:
243e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <pre>
244e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *      measurement time = TimeNanos + TimeOffsetNanos</pre>
2452102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     *
246e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The value provides an individual time-stamp for the measurement, and allows sub-nanosecond
2472102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * accuracy.
2482102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
24976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public double getTimeOffsetNanos() {
25076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mTimeOffsetNanos;
2512102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
2522102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
2532102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
2542102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Sets the time offset at which the measurement was taken in nanoseconds.
2550f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
2562102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
2570f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
25876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setTimeOffsetNanos(double value) {
25976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mTimeOffsetNanos = value;
2602102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
2612102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
2622102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
2632102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Gets per-satellite sync state.
2642102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     *
265e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>It represents the current sync state for the associated satellite.
266e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
267e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>This value helps interpret {@link #getReceivedSvTimeNanos()}.
268ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
26976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getState() {
2702102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return mState;
271ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
272ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
273ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
2742102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Sets the sync state.
2750f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
276ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
2770f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
27876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setState(int value) {
279c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        mState = value;
280ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
281ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
282ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
2832102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Gets a string representation of the 'sync state'.
284e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
285e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>For internal and logging use only.
2862102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
2872102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private String getStateString() {
288c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        if (mState == STATE_UNKNOWN) {
289c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            return "Unknown";
290c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
291047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang
292c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        StringBuilder builder = new StringBuilder();
293047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_CODE_LOCK) != 0) {
294c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("CodeLock|");
295c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
296047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_BIT_SYNC) != 0) {
297c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("BitSync|");
298c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
299047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_SUBFRAME_SYNC) != 0) {
300c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("SubframeSync|");
3012102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        }
302047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_TOW_DECODED) != 0) {
303c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("TowDecoded|");
304c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
305047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_MSEC_AMBIGUOUS) != 0) {
306047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("MsecAmbiguous|");
307047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
308047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_SYMBOL_SYNC) != 0) {
309047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("SymbolSync|");
310047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
311047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_GLO_STRING_SYNC) != 0) {
312047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("GloStringSync|");
313047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
314047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_GLO_TOD_DECODED) != 0) {
315047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("GloTodDecoded|");
3165e72118f193258259912c0a51688bd4434c8896edestradaa        }
317047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_BDS_D2_BIT_SYNC) != 0) {
318047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("BdsD2BitSync|");
319047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
320047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_BDS_D2_SUBFRAME_SYNC) != 0) {
321047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("BdsD2SubframeSync|");
322047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
323047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_GAL_E1BC_CODE_LOCK) != 0) {
324047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("GalE1bcCodeLock|");
325047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
326047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_GAL_E1C_2ND_CODE_LOCK) != 0) {
327047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("E1c2ndCodeLock|");
328047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
329047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_GAL_E1B_PAGE_SYNC) != 0) {
330047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("GalE1bPageSync|");
331047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
332047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_SBAS_SYNC) != 0) {
333047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("SbasSync|");
334047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
335047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang
336c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        int remainingStates = mState & ~STATE_ALL;
337c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        if (remainingStates > 0) {
338c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("Other(");
339c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append(Integer.toBinaryString(remainingStates));
340c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append(")|");
341c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
342047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        builder.setLength(builder.length() - 1);
343c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        return builder.toString();
3442102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
3452102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
3462102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
3479363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     * Gets the received GNSS satellite time, at the measurement time, in nanoseconds.
3489363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *
349e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>For GPS &amp; QZSS, this is:
350e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <ul>
351e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>Received GPS Time-of-Week at the measurement time, in nanoseconds.</li>
352e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>The value is relative to the beginning of the current GPS week.</li>
353e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * </ul>
3549363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *
355e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>Given the highest sync state that can be achieved, per each satellite, valid range
356e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * for this field can be:
357e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <pre>
3589363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     Searching       : [ 0       ]   : STATE_UNKNOWN
3599363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     C/A code lock   : [ 0   1ms ]   : STATE_CODE_LOCK is set
3609363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     Bit sync        : [ 0  20ms ]   : STATE_BIT_SYNC is set
3619363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     Subframe sync   : [ 0    6s ]   : STATE_SUBFRAME_SYNC is set
362e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *     TOW decoded     : [ 0 1week ]   : STATE_TOW_DECODED is set</pre>
3639363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *
364e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>Note well: if there is any ambiguity in integer millisecond, {@code STATE_MSEC_AMBIGUOUS}
365e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * should be set accordingly, in the 'state' field.
3669363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *
367e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>This value must be populated if 'state' != {@code STATE_UNKNOWN}.
3689363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *
369e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>For Glonass, this is:
370e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <ul>
371e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>Received Glonass time of day, at the measurement time in nanoseconds.</li>
372e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * </ul>
3739363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *
374e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>Given the highest sync state that can be achieved, per each satellite, valid range for
375e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * this field can be:
376e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <pre>
3779363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     Searching       : [ 0       ]   : STATE_UNKNOWN
3789363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     C/A code lock   : [ 0   1ms ]   : STATE_CODE_LOCK is set
379e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *     Symbol sync     : [ 0  10ms ]   : STATE_SYMBOL_SYNC is set
380e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *     Bit sync        : [ 0  20ms ]   : STATE_BIT_SYNC is set
381e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *     String sync     : [ 0    2s ]   : STATE_GLO_STRING_SYNC is set
382e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *     Time of day     : [ 0  1day ]   : STATE_GLO_TOD_DECODED is set</pre>
3839363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *
384e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>For Beidou, this is:
385e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <ul>
386e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>Received Beidou time of week, at the measurement time in nanoseconds.</li>
387e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * </ul>
3889363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *
389e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>Given the highest sync state that can be achieved, per each satellite, valid range for
390e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * this field can be:
391e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <pre>
3929363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     Searching       : [ 0       ]   : STATE_UNKNOWN
3939363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     C/A code lock   : [ 0   1ms ]   : STATE_CODE_LOCK is set
3949363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     Bit sync (D2)   : [ 0   2ms ]   : STATE_BDS_D2_BIT_SYNC is set
3959363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     Bit sync (D1)   : [ 0  20ms ]   : STATE_BIT_SYNC is set
3969363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     Subframe (D2)   : [ 0  0.6s ]   : STATE_BDS_D2_SUBFRAME_SYNC is set
3979363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     Subframe (D1)   : [ 0    6s ]   : STATE_SUBFRAME_SYNC is set
398e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *     Time of week    : [ 0 1week ]   : STATE_TOW_DECODED is set</pre>
399e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
400e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>For Galileo, this is:
401e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <ul>
402e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>Received Galileo time of week, at the measurement time in nanoseconds.</li>
403e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * </ul>
404e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <pre>
405e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *     E1BC code lock   : [ 0   4ms ]  : STATE_GAL_E1BC_CODE_LOCK is set
406e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *     E1C 2nd code lock: [ 0 100ms ]  : STATE_GAL_E1C_2ND_CODE_LOCK is set
407e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *     E1B page         : [ 0    2s ]  : STATE_GAL_E1B_PAGE_SYNC is set
408e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *     Time of week     : [ 0 1week ]  : STATE_GAL_TOW_DECODED is set</pre>
409e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
410e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>For SBAS, this is:
411e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <ul>
412e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>Received SBAS time, at the measurement time in nanoseconds.</li>
413e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * </ul>
414e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
415e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>Given the highest sync state that can be achieved, per each satellite, valid range for
416e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * this field can be:
417e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <pre>
4189363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     Searching       : [ 0       ]   : STATE_UNKNOWN
4199363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     C/A code lock   : [ 0   1ms ]   : STATE_CODE_LOCK is set
4209363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     Symbol sync     : [ 0   2ms ]   : STATE_SYMBOL_SYNC is set
421e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *     Message         : [ 0    1s ]   : STATE_SBAS_SYNC is set</pre>
422ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
42376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public long getReceivedSvTimeNanos() {
42476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mReceivedSvTimeNanos;
425ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
426ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
427ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
4289363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     * Sets the received GNSS time in nanoseconds.
4290f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
430ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
4310f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
43276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setReceivedSvTimeNanos(long value) {
43376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mReceivedSvTimeNanos = value;
434ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
435ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
436ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
437e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Gets the error estimate (1-sigma) for the received GNSS time, in nanoseconds.
43881cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa     */
43976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public long getReceivedSvTimeUncertaintyNanos() {
44076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mReceivedSvTimeUncertaintyNanos;
44181cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa    }
44281cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa
44381cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa    /**
4449363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     * Sets the received GNSS time uncertainty (1-Sigma) in nanoseconds.
4450f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
44681cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa     */
4470f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
44876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setReceivedSvTimeUncertaintyNanos(long value) {
44976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mReceivedSvTimeUncertaintyNanos = value;
45081cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa    }
45181cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa
45281cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa    /**
453ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the Carrier-to-noise density in dB-Hz.
454ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
455e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>Typical range: 10-50 db-Hz.
456e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
457e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The value contains the measured C/N0 for the signal at the antenna input.
458ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
45976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public double getCn0DbHz() {
46076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mCn0DbHz;
461ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
462ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
463ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
464ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the carrier-to-noise density in dB-Hz.
4650f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
466ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
4670f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
46876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setCn0DbHz(double value) {
46976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mCn0DbHz = value;
470ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
471ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
472ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
473ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the Pseudorange rate at the timestamp in m/s.
4745e72118f193258259912c0a51688bd4434c8896edestradaa     *
475e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The error estimate for this value is
476e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * {@link #getPseudorangeRateUncertaintyMetersPerSecond()}.
47776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     *
478e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The value is uncorrected, i.e. corrections for receiver and satellite clock frequency
479e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * errors are not included.
48076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     *
481e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>A positive 'uncorrected' value indicates that the SV is moving away from the receiver. The
48276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * sign of the 'uncorrected' 'pseudorange rate' and its relation to the sign of 'doppler shift'
48376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * is given by the equation:
4845e72118f193258259912c0a51688bd4434c8896edestradaa     *
485e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <pre>
486e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *      pseudorange rate = -k * doppler shift   (where k is a constant)</pre>
487ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
48876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public double getPseudorangeRateMetersPerSecond() {
48976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mPseudorangeRateMetersPerSecond;
490ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
491ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
492ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
493ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the pseudorange rate at the timestamp in m/s.
4940f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
495ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
4960f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
49776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setPseudorangeRateMetersPerSecond(double value) {
49876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mPseudorangeRateMetersPerSecond = value;
499ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
500ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
501ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
502ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the pseudorange's rate uncertainty (1-Sigma) in m/s.
503e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
504e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The uncertainty is represented as an absolute (single sided) value.
505ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
50676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public double getPseudorangeRateUncertaintyMetersPerSecond() {
50776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mPseudorangeRateUncertaintyMetersPerSecond;
508ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
509ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
510ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
511ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the pseudorange's rate uncertainty (1-Sigma) in m/s.
5120f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
513ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
5140f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
51576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setPseudorangeRateUncertaintyMetersPerSecond(double value) {
51676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mPseudorangeRateUncertaintyMetersPerSecond = value;
517ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
518ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
519ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
5202102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Gets 'Accumulated Delta Range' state.
521e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
522e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>It indicates whether {@link #getAccumulatedDeltaRangeMeters()} is reset or there is a
5232102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * cycle slip (indicating 'loss of lock').
5242102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
52576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getAccumulatedDeltaRangeState() {
5262102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return mAccumulatedDeltaRangeState;
5272102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
5282102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
5292102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
5302102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Sets the 'Accumulated Delta Range' state.
5310f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
5322102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
5330f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
53476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setAccumulatedDeltaRangeState(int value) {
535c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        mAccumulatedDeltaRangeState = value;
5362102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
5372102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
5382102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
5392102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Gets a string representation of the 'Accumulated Delta Range state'.
540e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
541e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>For internal and logging use only.
5422102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
5432102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private String getAccumulatedDeltaRangeStateString() {
544c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        if (mAccumulatedDeltaRangeState == ADR_STATE_UNKNOWN) {
545c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            return "Unknown";
546c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
547c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        StringBuilder builder = new StringBuilder();
548c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        if ((mAccumulatedDeltaRangeState & ADR_STATE_VALID) == ADR_STATE_VALID) {
549c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("Valid|");
550c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
551c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        if ((mAccumulatedDeltaRangeState & ADR_STATE_RESET) == ADR_STATE_RESET) {
552c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("Reset|");
5532102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        }
554c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        if ((mAccumulatedDeltaRangeState & ADR_STATE_CYCLE_SLIP) == ADR_STATE_CYCLE_SLIP) {
555c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("CycleSlip|");
556c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
557c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        int remainingStates = mAccumulatedDeltaRangeState & ~ADR_ALL;
558c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        if (remainingStates > 0) {
559c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("Other(");
560c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append(Integer.toBinaryString(remainingStates));
561c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append(")|");
562c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
563c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        builder.deleteCharAt(builder.length() - 1);
564c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        return builder.toString();
5652102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
5662102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
5672102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
568ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the accumulated delta range since the last channel reset, in meters.
5692102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     *
570e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The error estimate for this value is {@link #getAccumulatedDeltaRangeUncertaintyMeters()}.
571e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
572e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The availability of the value is represented by {@link #getAccumulatedDeltaRangeState()}.
5735e72118f193258259912c0a51688bd4434c8896edestradaa     *
574e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>A positive value indicates that the SV is moving away from the receiver.
57576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * The sign of {@link #getAccumulatedDeltaRangeMeters()} and its relation to the sign of
5765e72118f193258259912c0a51688bd4434c8896edestradaa     * {@link #getCarrierPhase()} is given by the equation:
577e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
578e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <pre>
579e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *          accumulated delta range = -k * carrier phase    (where k is a constant)</pre>
580ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
58176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public double getAccumulatedDeltaRangeMeters() {
58276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mAccumulatedDeltaRangeMeters;
583ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
584ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
585ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
586ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the accumulated delta range in meters.
5870f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
588ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
5890f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
59076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setAccumulatedDeltaRangeMeters(double value) {
59176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mAccumulatedDeltaRangeMeters = value;
592ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
593ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
594ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
595ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the accumulated delta range's uncertainty (1-Sigma) in meters.
5965e72118f193258259912c0a51688bd4434c8896edestradaa     *
597e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The uncertainty is represented as an absolute (single sided) value.
598e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
599e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The status of the value is represented by {@link #getAccumulatedDeltaRangeState()}.
600ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
60176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public double getAccumulatedDeltaRangeUncertaintyMeters() {
60276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mAccumulatedDeltaRangeUncertaintyMeters;
603ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
604ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
605ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
606ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the accumulated delta range's uncertainty (1-sigma) in meters.
6072102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     *
608e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The status of the value is represented by {@link #getAccumulatedDeltaRangeState()}.
6090f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     *
6100f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
611ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
6120f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
61376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setAccumulatedDeltaRangeUncertaintyMeters(double value) {
61476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mAccumulatedDeltaRangeUncertaintyMeters = value;
615ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
616ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
617ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
618e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Returns {@code true} if {@link #getCarrierFrequencyHz()} is available, {@code false}
619e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * otherwise.
620ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
62176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public boolean hasCarrierFrequencyHz() {
6222102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return isFlagSet(HAS_CARRIER_FREQUENCY);
623ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
624ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
625ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
626e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Gets the carrier frequency at which codes and messages are modulated.
627e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
628e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>For GPS, e.g., it can be L1 or L2.  If the field is not set, it is the primary common use
629e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * frequency, e.g. L1 for GPS.
630ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
631e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The value is only available if {@link #hasCarrierFrequencyHz()} is {@code true}.
632ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
63376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public float getCarrierFrequencyHz() {
63476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mCarrierFrequencyHz;
635ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
636ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
637ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
638ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the Carrier frequency (L1 or L2) in Hz.
6390f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
640ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
6410f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
64276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setCarrierFrequencyHz(float carrierFrequencyHz) {
6432102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setFlag(HAS_CARRIER_FREQUENCY);
64476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mCarrierFrequencyHz = carrierFrequencyHz;
645ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
646ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
647ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
648ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets the Carrier frequency (L1 or L2) in Hz.
6490f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
650ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
6510f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
65276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void resetCarrierFrequencyHz() {
6532102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetFlag(HAS_CARRIER_FREQUENCY);
65476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mCarrierFrequencyHz = Float.NaN;
655ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
656ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
657ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
658e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Returns {@code true} if {@link #getCarrierCycles()} is available, {@code false} otherwise.
659ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
660ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public boolean hasCarrierCycles() {
6612102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return isFlagSet(HAS_CARRIER_CYCLES);
662ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
663ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
664ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
665ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * The number of full carrier cycles between the satellite and the receiver.
666ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
667e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The reference frequency is given by the value of {@link #getCarrierFrequencyHz()}.
668e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
669e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The value is only available if {@link #hasCarrierCycles()} is {@code true}.
670ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
671ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public long getCarrierCycles() {
672ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        return mCarrierCycles;
673ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
674ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
675ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
676ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the number of full carrier cycles between the satellite and the receiver.
6770f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
678ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
6790f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
680ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void setCarrierCycles(long value) {
6812102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setFlag(HAS_CARRIER_CYCLES);
682ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierCycles = value;
683ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
684ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
685ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
686ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets the number of full carrier cycles between the satellite and the receiver.
6870f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
688ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
6890f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
690ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void resetCarrierCycles() {
6912102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetFlag(HAS_CARRIER_CYCLES);
692ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierCycles = Long.MIN_VALUE;
693ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
694ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
695ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
696e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Returns {@code true} if {@link #getCarrierPhase()} is available, {@code false} otherwise.
697ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
698ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public boolean hasCarrierPhase() {
6992102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return isFlagSet(HAS_CARRIER_PHASE);
700ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
701ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
702ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
703ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the RF phase detected by the receiver.
704ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
705e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>Range: [0.0, 1.0].
706e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
707e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>This is the fractional part of the complete carrier phase measurement.
708e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
709e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The reference frequency is given by the value of {@link #getCarrierFrequencyHz()}.
710ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
711e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The error estimate for this value is {@link #getCarrierPhaseUncertainty()}.
712e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
713e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The value is only available if {@link #hasCarrierPhase()} is {@code true}.
714ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
715ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public double getCarrierPhase() {
716ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        return mCarrierPhase;
717ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
718ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
719ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
720ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the RF phase detected by the receiver.
7210f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
722ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
7230f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
724ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void setCarrierPhase(double value) {
7252102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setFlag(HAS_CARRIER_PHASE);
726ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierPhase = value;
727ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
728ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
729ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
730ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets the RF phase detected by the receiver.
7310f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
732ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
7330f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
734ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void resetCarrierPhase() {
7352102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetFlag(HAS_CARRIER_PHASE);
736ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierPhase = Double.NaN;
737ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
738ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
739ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
740e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Returns {@code true} if {@link #getCarrierPhaseUncertainty()} is available, {@code false}
741e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * otherwise.
742ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
743ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public boolean hasCarrierPhaseUncertainty() {
7442102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return isFlagSet(HAS_CARRIER_PHASE_UNCERTAINTY);
745ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
746ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
747ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
748ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the carrier-phase's uncertainty (1-Sigma).
749ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
750e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The uncertainty is represented as an absolute (single sided) value.
751e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
752e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The value is only available if {@link #hasCarrierPhaseUncertainty()} is {@code true}.
753ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
754ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public double getCarrierPhaseUncertainty() {
755ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        return mCarrierPhaseUncertainty;
756ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
757ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
758ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
759ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the Carrier-phase's uncertainty (1-Sigma) in cycles.
7600f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
761ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
7620f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
763ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void setCarrierPhaseUncertainty(double value) {
7642102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setFlag(HAS_CARRIER_PHASE_UNCERTAINTY);
765ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierPhaseUncertainty = value;
766ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
767ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
768ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
769ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets the Carrier-phase's uncertainty (1-Sigma) in cycles.
7700f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
771ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
7720f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
773ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void resetCarrierPhaseUncertainty() {
7742102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetFlag(HAS_CARRIER_PHASE_UNCERTAINTY);
775ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierPhaseUncertainty = Double.NaN;
776ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
777ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
778ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
779ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets a value indicating the 'multipath' state of the event.
780ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
781a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tang    @MultipathIndicator
78276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getMultipathIndicator() {
783ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        return mMultipathIndicator;
784ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
785ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
786ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
787ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the 'multi-path' indicator.
7880f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
789ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
7900f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
79176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setMultipathIndicator(@MultipathIndicator int value) {
792c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        mMultipathIndicator = value;
793ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
794ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
795ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
796ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets a string representation of the 'multi-path indicator'.
797e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
798e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>For internal and logging use only.
799ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
800ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    private String getMultipathIndicatorString() {
801ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        switch(mMultipathIndicator) {
802ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa            case MULTIPATH_INDICATOR_UNKNOWN:
803ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                return "Unknown";
804ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa            case MULTIPATH_INDICATOR_DETECTED:
805ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                return "Detected";
806ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa            case MULTIPATH_INDICATOR_NOT_USED:
8072102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                return "NotUsed";
808ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa            default:
809c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa                return "<Invalid:" + mMultipathIndicator + ">";
810ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        }
811ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
812ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
813ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
814e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Returns {@code true} if {@link #getSnrInDb()} is available, {@code false} otherwise.
815ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
816ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public boolean hasSnrInDb() {
8172102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return isFlagSet(HAS_SNR);
818ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
819ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
820ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
821ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the Signal-to-Noise ratio (SNR) in dB.
822ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
823e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The value is only available if {@link #hasSnrInDb()} is {@code true}.
824ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
825ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public double getSnrInDb() {
826ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        return mSnrInDb;
827ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
828ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
829ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
830ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the Signal-to-noise ratio (SNR) in dB.
8310f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
832ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
8330f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
834ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void setSnrInDb(double snrInDb) {
8352102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setFlag(HAS_SNR);
836ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mSnrInDb = snrInDb;
837ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
838ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
839ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
840ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets the Signal-to-noise ratio (SNR) in dB.
8410f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
842ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
8430f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
844ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void resetSnrInDb() {
8452102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetFlag(HAS_SNR);
846ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mSnrInDb = Double.NaN;
847ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
848ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
849818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang    public static final Creator<GnssMeasurement> CREATOR = new Creator<GnssMeasurement>() {
850ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        @Override
851818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang        public GnssMeasurement createFromParcel(Parcel parcel) {
852818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            GnssMeasurement gnssMeasurement = new GnssMeasurement();
853818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang
854818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            gnssMeasurement.mFlags = parcel.readInt();
85576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mSvid = parcel.readInt();
85676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mConstellationType = parcel.readInt();
85776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mTimeOffsetNanos = parcel.readDouble();
85876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mState = parcel.readInt();
85976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mReceivedSvTimeNanos = parcel.readLong();
86076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mReceivedSvTimeUncertaintyNanos = parcel.readLong();
86176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mCn0DbHz = parcel.readDouble();
86276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mPseudorangeRateMetersPerSecond = parcel.readDouble();
86376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mPseudorangeRateUncertaintyMetersPerSecond = parcel.readDouble();
86476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mAccumulatedDeltaRangeState = parcel.readInt();
86576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mAccumulatedDeltaRangeMeters = parcel.readDouble();
86676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mAccumulatedDeltaRangeUncertaintyMeters = parcel.readDouble();
86776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mCarrierFrequencyHz = parcel.readFloat();
868818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            gnssMeasurement.mCarrierCycles = parcel.readLong();
869818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            gnssMeasurement.mCarrierPhase = parcel.readDouble();
870818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            gnssMeasurement.mCarrierPhaseUncertainty = parcel.readDouble();
87176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mMultipathIndicator = parcel.readInt();
872818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            gnssMeasurement.mSnrInDb = parcel.readDouble();
873818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang
874818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            return gnssMeasurement;
875ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        }
876ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
877ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        @Override
878818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang        public GnssMeasurement[] newArray(int i) {
879818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            return new GnssMeasurement[i];
880ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        }
881ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    };
882ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
883120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang    @Override
884ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void writeToParcel(Parcel parcel, int flags) {
8852102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        parcel.writeInt(mFlags);
886120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        parcel.writeInt(mSvid);
88776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeInt(mConstellationType);
88876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeDouble(mTimeOffsetNanos);
8892102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        parcel.writeInt(mState);
89076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeLong(mReceivedSvTimeNanos);
89176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeLong(mReceivedSvTimeUncertaintyNanos);
89276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeDouble(mCn0DbHz);
89376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeDouble(mPseudorangeRateMetersPerSecond);
89476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeDouble(mPseudorangeRateUncertaintyMetersPerSecond);
8952102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        parcel.writeInt(mAccumulatedDeltaRangeState);
89676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeDouble(mAccumulatedDeltaRangeMeters);
89776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeDouble(mAccumulatedDeltaRangeUncertaintyMeters);
89876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeFloat(mCarrierFrequencyHz);
899ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        parcel.writeLong(mCarrierCycles);
900ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        parcel.writeDouble(mCarrierPhase);
901ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        parcel.writeDouble(mCarrierPhaseUncertainty);
90276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeInt(mMultipathIndicator);
903ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        parcel.writeDouble(mSnrInDb);
904ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
905ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
906ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    @Override
907ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public int describeContents() {
908ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        return 0;
909ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
910ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
911ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    @Override
912ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public String toString() {
913ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        final String format = "   %-29s = %s\n";
914ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        final String formatWithUncertainty = "   %-29s = %-25s   %-40s = %s\n";
915818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang        StringBuilder builder = new StringBuilder("GnssMeasurement:\n");
916ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
917120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        builder.append(String.format(format, "Svid", mSvid));
9189363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang        builder.append(String.format(format, "ConstellationType", mConstellationType));
91976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        builder.append(String.format(format, "TimeOffsetNanos", mTimeOffsetNanos));
9202102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
9212102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        builder.append(String.format(format, "State", getStateString()));
922ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
92381cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa        builder.append(String.format(
92481cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa                formatWithUncertainty,
92576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "ReceivedSvTimeNanos",
92676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                mReceivedSvTimeNanos,
92776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "ReceivedSvTimeUncertaintyNanos",
92876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                mReceivedSvTimeUncertaintyNanos));
929ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
93076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        builder.append(String.format(format, "Cn0DbHz", mCn0DbHz));
931ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
932ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        builder.append(String.format(
933ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                formatWithUncertainty,
93476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "PseudorangeRateMetersPerSecond",
93576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                mPseudorangeRateMetersPerSecond,
93676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "PseudorangeRateUncertaintyMetersPerSecond",
93776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                mPseudorangeRateUncertaintyMetersPerSecond));
938ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
939ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        builder.append(String.format(
9402102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                format,
9412102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                "AccumulatedDeltaRangeState",
9422102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                getAccumulatedDeltaRangeStateString()));
9432102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
9442102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        builder.append(String.format(
945ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                formatWithUncertainty,
94676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "AccumulatedDeltaRangeMeters",
94776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                mAccumulatedDeltaRangeMeters,
94876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "AccumulatedDeltaRangeUncertaintyMeters",
94976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                mAccumulatedDeltaRangeUncertaintyMeters));
950ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
951ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        builder.append(String.format(
952ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                format,
95376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "CarrierFrequencyHz",
95476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                hasCarrierFrequencyHz() ? mCarrierFrequencyHz : null));
955ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
956ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        builder.append(String.format(
957ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                format,
958ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                "CarrierCycles",
9592102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                hasCarrierCycles() ? mCarrierCycles : null));
960ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
961ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        builder.append(String.format(
962ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                formatWithUncertainty,
963ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                "CarrierPhase",
9642102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                hasCarrierPhase() ? mCarrierPhase : null,
965ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                "CarrierPhaseUncertainty",
9662102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                hasCarrierPhaseUncertainty() ? mCarrierPhaseUncertainty : null));
967ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
968ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        builder.append(String.format(format, "MultipathIndicator", getMultipathIndicatorString()));
969ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
970ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        builder.append(String.format(
971ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                format,
972ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                "SnrInDb",
9732102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                hasSnrInDb() ? mSnrInDb : null));
974ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
975ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        return builder.toString();
976ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
9772102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
9782102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private void initialize() {
9792102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        mFlags = HAS_NO_FLAGS;
98076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setSvid(0);
98176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setTimeOffsetNanos(Long.MIN_VALUE);
9822102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setState(STATE_UNKNOWN);
98376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setReceivedSvTimeNanos(Long.MIN_VALUE);
98476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setReceivedSvTimeUncertaintyNanos(Long.MAX_VALUE);
98576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setCn0DbHz(Double.MIN_VALUE);
98676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setPseudorangeRateMetersPerSecond(Double.MIN_VALUE);
98776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setPseudorangeRateUncertaintyMetersPerSecond(Double.MIN_VALUE);
9882102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setAccumulatedDeltaRangeState(ADR_STATE_UNKNOWN);
98976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setAccumulatedDeltaRangeMeters(Double.MIN_VALUE);
99076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setAccumulatedDeltaRangeUncertaintyMeters(Double.MIN_VALUE);
99176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        resetCarrierFrequencyHz();
9922102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetCarrierCycles();
9932102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetCarrierPhase();
9942102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetCarrierPhaseUncertainty();
9952102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setMultipathIndicator(MULTIPATH_INDICATOR_UNKNOWN);
9962102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetSnrInDb();
9972102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
9982102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
9992102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private void setFlag(int flag) {
10002102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        mFlags |= flag;
10012102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
10022102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
10032102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private void resetFlag(int flag) {
10042102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        mFlags &= ~flag;
10052102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
10062102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
10072102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private boolean isFlagSet(int flag) {
10082102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return (mFlags & flag) == flag;
10092102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
1010ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa}
1011