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;
50127ba323d9ae2107ed58039f24ffade2c27ff7c9gomo    private double mAutomaticGainControlLevelInDb;
51ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
52ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    // The following enumerations must be in sync with the values declared in gps.h
53ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
542102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private static final int HAS_NO_FLAGS = 0;
552102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private static final int HAS_SNR = (1<<0);
562102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private static final int HAS_CARRIER_FREQUENCY = (1<<9);
572102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private static final int HAS_CARRIER_CYCLES = (1<<10);
582102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private static final int HAS_CARRIER_PHASE = (1<<11);
592102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private static final int HAS_CARRIER_PHASE_UNCERTAINTY = (1<<12);
604402af6be9de4782d218170203033618f079551dgomo    private static final int HAS_AUTOMATIC_GAIN_CONTROL = (1<<13);
612102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
622b67c07d82f59f9b776414576c21dd31ed9dac48Julius D'souza    /**
632b67c07d82f59f9b776414576c21dd31ed9dac48Julius D'souza     * The status of the multipath indicator.
642b67c07d82f59f9b776414576c21dd31ed9dac48Julius D'souza     * @hide
652b67c07d82f59f9b776414576c21dd31ed9dac48Julius D'souza     */
66a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tang    @Retention(RetentionPolicy.SOURCE)
67a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tang    @IntDef({MULTIPATH_INDICATOR_UNKNOWN, MULTIPATH_INDICATOR_DETECTED,
68a2bbfbcf8920ecec5700c1824b0436118cada5beWyatt Riley            MULTIPATH_INDICATOR_NOT_DETECTED})
69a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tang    public @interface MultipathIndicator {}
70a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tang
71ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
72e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * The indicator is not available or the presence or absence of multipath is unknown.
73ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
7476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int MULTIPATH_INDICATOR_UNKNOWN = 0;
75ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
76ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
77e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * The measurement shows signs of multi-path.
78ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
7976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int MULTIPATH_INDICATOR_DETECTED = 1;
80ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
81ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
82e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * The measurement shows no signs of multi-path.
83ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
84e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang    public static final int MULTIPATH_INDICATOR_NOT_DETECTED = 2;
85e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang
864cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    /**
874cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * GNSS measurement tracking loop state
884cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * @hide
894cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     */
904cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @IntDef(flag = true, prefix = { "STATE_" }, value = {
914cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley            STATE_CODE_LOCK, STATE_BIT_SYNC, STATE_SUBFRAME_SYNC,
924cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley            STATE_TOW_DECODED, STATE_MSEC_AMBIGUOUS, STATE_SYMBOL_SYNC, STATE_GLO_STRING_SYNC,
934cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley            STATE_GLO_TOD_DECODED, STATE_BDS_D2_BIT_SYNC, STATE_BDS_D2_SUBFRAME_SYNC,
944cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley            STATE_GAL_E1BC_CODE_LOCK, STATE_GAL_E1C_2ND_CODE_LOCK, STATE_GAL_E1B_PAGE_SYNC,
954cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley            STATE_SBAS_SYNC, STATE_TOW_KNOWN, STATE_GLO_TOD_KNOWN
964cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    })
974cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @Retention(RetentionPolicy.SOURCE)
984cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    public @interface State {}
994cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley
100047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This GNSS measurement's tracking state is invalid or unknown. */
10176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATE_UNKNOWN = 0;
102047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This GNSS measurement's tracking state has code lock. */
10376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATE_CODE_LOCK = (1<<0);
104047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This GNSS measurement's tracking state has bit sync. */
10576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATE_BIT_SYNC = (1<<1);
106047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This GNSS measurement's tracking state has sub-frame sync. */
10776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATE_SUBFRAME_SYNC = (1<<2);
108047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This GNSS measurement's tracking state has time-of-week decoded. */
10976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATE_TOW_DECODED = (1<<3);
110047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This GNSS measurement's tracking state contains millisecond ambiguity. */
11176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int STATE_MSEC_AMBIGUOUS = (1<<4);
112047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This GNSS measurement's tracking state has symbol sync. */
113047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_SYMBOL_SYNC = (1<<5);
114047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This Glonass measurement's tracking state has string sync. */
115047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_GLO_STRING_SYNC = (1<<6);
116047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This Glonass measurement's tracking state has time-of-day decoded. */
117047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_GLO_TOD_DECODED = (1<<7);
118047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This Beidou measurement's tracking state has D2 bit sync. */
119047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_BDS_D2_BIT_SYNC = (1<<8);
120047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This Beidou measurement's tracking state has D2 sub-frame sync. */
121047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_BDS_D2_SUBFRAME_SYNC = (1<<9);
122047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This Galileo measurement's tracking state has E1B/C code lock. */
123047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_GAL_E1BC_CODE_LOCK = (1<<10);
124047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This Galileo measurement's tracking state has E1C secondary code lock. */
125047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_GAL_E1C_2ND_CODE_LOCK = (1<<11);
126047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This Galileo measurement's tracking state has E1B page sync. */
127047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_GAL_E1B_PAGE_SYNC = (1<<12);
128047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    /** This SBAS measurement's tracking state has whole second level sync. */
129047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    public static final int STATE_SBAS_SYNC = (1<<13);
1304402af6be9de4782d218170203033618f079551dgomo    /**
1314402af6be9de4782d218170203033618f079551dgomo     * This GNSS measurement's tracking state has time-of-week known, possibly not decoded
1324402af6be9de4782d218170203033618f079551dgomo     * over the air but has been determined from other sources. If TOW decoded is set then TOW Known
1334402af6be9de4782d218170203033618f079551dgomo     * will also be set.
1344402af6be9de4782d218170203033618f079551dgomo     */
1354402af6be9de4782d218170203033618f079551dgomo    public static final int STATE_TOW_KNOWN = (1<<14);
1364402af6be9de4782d218170203033618f079551dgomo    /**
1374402af6be9de4782d218170203033618f079551dgomo     * This Glonass measurement's tracking state has time-of-day known, possibly not decoded
1384402af6be9de4782d218170203033618f079551dgomo     * over the air but has been determined from other sources. If TOD decoded is set then TOD Known
1394402af6be9de4782d218170203033618f079551dgomo     * will also be set.
1404402af6be9de4782d218170203033618f079551dgomo     */
1414402af6be9de4782d218170203033618f079551dgomo    public static final int STATE_GLO_TOD_KNOWN = (1<<15);
1425e72118f193258259912c0a51688bd4434c8896edestradaa
1435e72118f193258259912c0a51688bd4434c8896edestradaa    /**
144047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang     * All the GNSS receiver state flags, for bit masking purposes (not a sensible state for any
145047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang     * individual measurement.)
146c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa     */
147047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang    private static final int STATE_ALL = 0x3fff;  // 2 bits + 4 bits + 4 bits + 4 bits = 14 bits
148c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa
149c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa    /**
1504cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * GNSS measurement accumulated delta range state
1514cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * @hide
1524cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     */
1534cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @IntDef(flag = true, prefix = { "ADR_STATE_" }, value = {
1544cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley            ADR_STATE_VALID, ADR_STATE_RESET, ADR_STATE_CYCLE_SLIP, ADR_STATE_HALF_CYCLE_RESOLVED,
1554cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley            ADR_STATE_HALF_CYCLE_REPORTED
1564cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    })
1574cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @Retention(RetentionPolicy.SOURCE)
1584cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    public @interface AdrState {}
1594cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley
1604cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    /**
1614cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * The state of the value {@link #getAccumulatedDeltaRangeMeters()} is invalid or unknown.
1622102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
16376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int ADR_STATE_UNKNOWN = 0;
1642102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
1652102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
1664cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * The state of the {@link #getAccumulatedDeltaRangeMeters()} is valid.
1672102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
16876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int ADR_STATE_VALID = (1<<0);
1692102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
1702102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
1714cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * The state of the {@link #getAccumulatedDeltaRangeMeters()} has detected a reset.
1722102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
17376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int ADR_STATE_RESET = (1<<1);
1742102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
1752102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
1764cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * The state of the {@link #getAccumulatedDeltaRangeMeters()} has a cycle slip detected.
1772102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
17876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public static final int ADR_STATE_CYCLE_SLIP = (1<<2);
179ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
180c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa    /**
1814cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * Reports whether the value {@link #getAccumulatedDeltaRangeMeters()} has resolved the half
1824cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * cycle ambiguity.
1834cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
1844cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * <p> When this bit is set, the {@link #getAccumulatedDeltaRangeMeters()} corresponds to the
1854cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * carrier phase measurement plus an accumulated integer number of carrier full cycles.
1864cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
1874cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * <p> When this bit is unset, the {@link #getAccumulatedDeltaRangeMeters()} corresponds to the
1884cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * carrier phase measurement plus an accumulated integer number of carrier half cycles.
1894cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     */
1904cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    public static final int ADR_STATE_HALF_CYCLE_RESOLVED = (1<<3);
1914cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley
1924cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    /**
1934cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * Reports whether the flag {@link #ADR_STATE_HALF_CYCLE_RESOLVED} has been reported by the
1944cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * GNSS hardware.
1954cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
1964cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * <p> When this bit is set, the value of {@link #getAccumulatedDeltaRangeUncertaintyMeters()}
1974cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * can be low (centimeter level) whether or not the half cycle ambiguity is resolved.
1984cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
1994cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * <p> When this bit is unset, the value of {@link #getAccumulatedDeltaRangeUncertaintyMeters()}
2004cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * is larger, to cover the potential error due to half cycle ambiguity being unresolved.
2014cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     */
2024cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    public static final int ADR_STATE_HALF_CYCLE_REPORTED = (1<<4);
2034cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley
2044cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    /**
205c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa     * All the 'Accumulated Delta Range' flags.
2064cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * @hide
207c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa     */
2084cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @TestApi
2094cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    public static final int ADR_STATE_ALL =
2104cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley            ADR_STATE_VALID | ADR_STATE_RESET | ADR_STATE_CYCLE_SLIP |
2114cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley            ADR_STATE_HALF_CYCLE_RESOLVED | ADR_STATE_HALF_CYCLE_REPORTED;
212c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa
213ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    // End enumerations in sync with gps.h
214ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
2150f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    /**
2160f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
2170f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     */
2180f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
2190f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    public GnssMeasurement() {
2202102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        initialize();
221ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
222ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
223ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
224ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets all contents to the values stored in the provided object.
2250f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
226ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
2270f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
228818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang    public void set(GnssMeasurement measurement) {
2292102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        mFlags = measurement.mFlags;
230120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        mSvid = measurement.mSvid;
2319363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang        mConstellationType = measurement.mConstellationType;
23276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mTimeOffsetNanos = measurement.mTimeOffsetNanos;
2332102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        mState = measurement.mState;
23476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mReceivedSvTimeNanos = measurement.mReceivedSvTimeNanos;
23576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mReceivedSvTimeUncertaintyNanos = measurement.mReceivedSvTimeUncertaintyNanos;
23676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mCn0DbHz = measurement.mCn0DbHz;
23776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mPseudorangeRateMetersPerSecond = measurement.mPseudorangeRateMetersPerSecond;
23876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mPseudorangeRateUncertaintyMetersPerSecond =
23976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                measurement.mPseudorangeRateUncertaintyMetersPerSecond;
2402102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        mAccumulatedDeltaRangeState = measurement.mAccumulatedDeltaRangeState;
24176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mAccumulatedDeltaRangeMeters = measurement.mAccumulatedDeltaRangeMeters;
24276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mAccumulatedDeltaRangeUncertaintyMeters =
24376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                measurement.mAccumulatedDeltaRangeUncertaintyMeters;
24476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mCarrierFrequencyHz = measurement.mCarrierFrequencyHz;
245ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierCycles = measurement.mCarrierCycles;
246ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierPhase = measurement.mCarrierPhase;
247ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierPhaseUncertainty = measurement.mCarrierPhaseUncertainty;
248ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mMultipathIndicator = measurement.mMultipathIndicator;
249ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mSnrInDb = measurement.mSnrInDb;
250127ba323d9ae2107ed58039f24ffade2c27ff7c9gomo        mAutomaticGainControlLevelInDb = measurement.mAutomaticGainControlLevelInDb;
251ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
252ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
253ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
254ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets all the contents to its original state.
2550f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
256ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
2570f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
258ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void reset() {
2592102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        initialize();
260ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
261ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
262ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
263e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Gets the satellite ID.
264e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
265e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>Interpretation depends on {@link #getConstellationType()}.
266e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * See {@link GnssStatus#getSvid(int)}.
267ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
26876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getSvid() {
269120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        return mSvid;
270ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
271ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
272ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
273e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Sets the Satellite ID.
2740f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
275ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
2760f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
27776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setSvid(int value) {
278120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        mSvid = value;
279ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
280ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
281ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
282e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Gets the constellation type.
283e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
284e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The return value is one of those constants with {@code CONSTELLATION_} prefix in
285e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * {@link GnssStatus}.
2869363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     */
2879363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    @GnssStatus.ConstellationType
28876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getConstellationType() {
2899363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang        return mConstellationType;
2909363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    }
2919363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang
2929363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /**
2939363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     * Sets the constellation type.
2940f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
2959363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     */
2960f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
29776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setConstellationType(@GnssStatus.ConstellationType int value) {
2989363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang        mConstellationType = value;
2999363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    }
3009363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang
3019363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang    /**
3022102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Gets the time offset at which the measurement was taken in nanoseconds.
30338bce7925c58fe585144f25ea6c954bab4f5da42Lifu Tang     *
304e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The reference receiver's time from which this is offset is specified by
30576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * {@link GnssClock#getTimeNanos()}.
3062102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     *
307e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The sign of this value is given by the following equation:
308e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <pre>
309e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *      measurement time = TimeNanos + TimeOffsetNanos</pre>
3102102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     *
311e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The value provides an individual time-stamp for the measurement, and allows sub-nanosecond
3122102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * accuracy.
3132102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
31476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public double getTimeOffsetNanos() {
31576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mTimeOffsetNanos;
3162102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
3172102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
3182102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
3192102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Sets the time offset at which the measurement was taken in nanoseconds.
3200f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
3212102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
3220f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
32376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setTimeOffsetNanos(double value) {
32476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mTimeOffsetNanos = value;
3252102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
3262102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
3272102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
3282102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Gets per-satellite sync state.
3292102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     *
330e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>It represents the current sync state for the associated satellite.
331e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
332e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>This value helps interpret {@link #getReceivedSvTimeNanos()}.
333ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
3344cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @State
33576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getState() {
3362102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return mState;
337ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
338ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
339ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
3402102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Sets the sync state.
3410f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
342ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
3430f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
3444cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    public void setState(@State int value) {
345c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        mState = value;
346ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
347ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
348ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
3492102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Gets a string representation of the 'sync state'.
350e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
351e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>For internal and logging use only.
3522102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
3532102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private String getStateString() {
354c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        if (mState == STATE_UNKNOWN) {
355c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            return "Unknown";
356c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
357047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang
358c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        StringBuilder builder = new StringBuilder();
359047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_CODE_LOCK) != 0) {
360c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("CodeLock|");
361c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
362047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_BIT_SYNC) != 0) {
363c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("BitSync|");
364c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
365047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_SUBFRAME_SYNC) != 0) {
366c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("SubframeSync|");
3672102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        }
368047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_TOW_DECODED) != 0) {
369c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("TowDecoded|");
370c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
3714402af6be9de4782d218170203033618f079551dgomo        if ((mState & STATE_TOW_KNOWN) != 0) {
3724402af6be9de4782d218170203033618f079551dgomo          builder.append("TowKnown|");
3734402af6be9de4782d218170203033618f079551dgomo        }
374047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_MSEC_AMBIGUOUS) != 0) {
375047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("MsecAmbiguous|");
376047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
377047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_SYMBOL_SYNC) != 0) {
378047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("SymbolSync|");
379047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
380047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_GLO_STRING_SYNC) != 0) {
381047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("GloStringSync|");
382047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
383047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_GLO_TOD_DECODED) != 0) {
384047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("GloTodDecoded|");
3855e72118f193258259912c0a51688bd4434c8896edestradaa        }
3864402af6be9de4782d218170203033618f079551dgomo        if ((mState & STATE_GLO_TOD_KNOWN) != 0) {
3874402af6be9de4782d218170203033618f079551dgomo          builder.append("GloTodKnown|");
3884402af6be9de4782d218170203033618f079551dgomo        }
389047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_BDS_D2_BIT_SYNC) != 0) {
390047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("BdsD2BitSync|");
391047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
392047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_BDS_D2_SUBFRAME_SYNC) != 0) {
393047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("BdsD2SubframeSync|");
394047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
395047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_GAL_E1BC_CODE_LOCK) != 0) {
396047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("GalE1bcCodeLock|");
397047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
398047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_GAL_E1C_2ND_CODE_LOCK) != 0) {
399047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("E1c2ndCodeLock|");
400047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
401047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_GAL_E1B_PAGE_SYNC) != 0) {
402047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("GalE1bPageSync|");
403047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
404047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        if ((mState & STATE_SBAS_SYNC) != 0) {
405047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang            builder.append("SbasSync|");
406047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        }
407047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang
408c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        int remainingStates = mState & ~STATE_ALL;
409c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        if (remainingStates > 0) {
410c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("Other(");
411c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append(Integer.toBinaryString(remainingStates));
412c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append(")|");
413c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
414047b05ea6e290997f1bcc29fd6c4ec5f81708f9fLifu Tang        builder.setLength(builder.length() - 1);
415c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        return builder.toString();
4162102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
4172102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
4182102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
4199363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     * Gets the received GNSS satellite time, at the measurement time, in nanoseconds.
4209363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *
421e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>For GPS &amp; QZSS, this is:
422e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <ul>
423e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>Received GPS Time-of-Week at the measurement time, in nanoseconds.</li>
424e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>The value is relative to the beginning of the current GPS week.</li>
425e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * </ul>
4269363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *
427e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>Given the highest sync state that can be achieved, per each satellite, valid range
428e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * for this field can be:
429e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <pre>
4309363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     Searching       : [ 0       ]   : STATE_UNKNOWN
4319363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     C/A code lock   : [ 0   1ms ]   : STATE_CODE_LOCK is set
4329363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     Bit sync        : [ 0  20ms ]   : STATE_BIT_SYNC is set
4339363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     Subframe sync   : [ 0    6s ]   : STATE_SUBFRAME_SYNC is set
4344402af6be9de4782d218170203033618f079551dgomo     *     TOW decoded     : [ 0 1week ]   : STATE_TOW_DECODED is set
4354402af6be9de4782d218170203033618f079551dgomo     *     TOW Known       : [ 0 1week ]   : STATE_TOW_KNOWN set</pre>
4364402af6be9de4782d218170203033618f079551dgomo     *
4374402af6be9de4782d218170203033618f079551dgomo     * Note: TOW Known refers to the case where TOW is possibly not decoded over the air but has
4384402af6be9de4782d218170203033618f079551dgomo     * been determined from other sources. If TOW decoded is set then TOW Known must also be set.
4399363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *
440e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>Note well: if there is any ambiguity in integer millisecond, {@code STATE_MSEC_AMBIGUOUS}
4414402af6be9de4782d218170203033618f079551dgomo     * must be set accordingly, in the 'state' field.
4429363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *
443e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>This value must be populated if 'state' != {@code STATE_UNKNOWN}.
4449363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *
445e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>For Glonass, this is:
446e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <ul>
447e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>Received Glonass time of day, at the measurement time in nanoseconds.</li>
448e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * </ul>
4499363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *
450e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>Given the highest sync state that can be achieved, per each satellite, valid range for
451e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * this field can be:
452e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <pre>
4534402af6be9de4782d218170203033618f079551dgomo     *     Searching           : [ 0       ]   : STATE_UNKNOWN
4544402af6be9de4782d218170203033618f079551dgomo     *     C/A code lock       : [ 0   1ms ]   : STATE_CODE_LOCK is set
4554402af6be9de4782d218170203033618f079551dgomo     *     Symbol sync         : [ 0  10ms ]   : STATE_SYMBOL_SYNC is set
4564402af6be9de4782d218170203033618f079551dgomo     *     Bit sync            : [ 0  20ms ]   : STATE_BIT_SYNC is set
4574402af6be9de4782d218170203033618f079551dgomo     *     String sync         : [ 0    2s ]   : STATE_GLO_STRING_SYNC is set
4584402af6be9de4782d218170203033618f079551dgomo     *     Time of day decoded : [ 0  1day ]   : STATE_GLO_TOD_DECODED is set
4594402af6be9de4782d218170203033618f079551dgomo     *     Time of day known   : [ 0  1day ]   : STATE_GLO_TOD_KNOWN set</pre>
4604402af6be9de4782d218170203033618f079551dgomo     *
4614402af6be9de4782d218170203033618f079551dgomo     * Note: Time of day known refers to the case where it is possibly not decoded over the air but
4624402af6be9de4782d218170203033618f079551dgomo     * has been determined from other sources. If Time of day decoded is set then Time of day known
4634402af6be9de4782d218170203033618f079551dgomo     * must also be set.
4649363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *
465e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>For Beidou, this is:
466e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <ul>
467e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>Received Beidou time of week, at the measurement time in nanoseconds.</li>
468e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * </ul>
4699363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *
470e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>Given the highest sync state that can be achieved, per each satellite, valid range for
471e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * this field can be:
472e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <pre>
4734402af6be9de4782d218170203033618f079551dgomo     *     Searching              : [ 0       ]   : STATE_UNKNOWN
4744402af6be9de4782d218170203033618f079551dgomo     *     C/A code lock          : [ 0   1ms ]   : STATE_CODE_LOCK is set
4754402af6be9de4782d218170203033618f079551dgomo     *     Bit sync (D2)          : [ 0   2ms ]   : STATE_BDS_D2_BIT_SYNC is set
4764402af6be9de4782d218170203033618f079551dgomo     *     Bit sync (D1)          : [ 0  20ms ]   : STATE_BIT_SYNC is set
4774402af6be9de4782d218170203033618f079551dgomo     *     Subframe (D2)          : [ 0  0.6s ]   : STATE_BDS_D2_SUBFRAME_SYNC is set
4784402af6be9de4782d218170203033618f079551dgomo     *     Subframe (D1)          : [ 0    6s ]   : STATE_SUBFRAME_SYNC is set
4794402af6be9de4782d218170203033618f079551dgomo     *     Time of week decoded   : [ 0 1week ]   : STATE_TOW_DECODED is set
4804402af6be9de4782d218170203033618f079551dgomo     *     Time of week known     : [ 0 1week ]   : STATE_TOW_KNOWN set</pre>
4814402af6be9de4782d218170203033618f079551dgomo     *
4824402af6be9de4782d218170203033618f079551dgomo     * Note: TOW Known refers to the case where TOW is possibly not decoded over the air but has
4834402af6be9de4782d218170203033618f079551dgomo     * been determined from other sources. If TOW decoded is set then TOW Known must also be set.
484e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
485e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>For Galileo, this is:
486e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <ul>
487e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>Received Galileo time of week, at the measurement time in nanoseconds.</li>
488e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * </ul>
489e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <pre>
4904402af6be9de4782d218170203033618f079551dgomo     *     E1BC code lock       : [ 0   4ms ]  : STATE_GAL_E1BC_CODE_LOCK is set
4914402af6be9de4782d218170203033618f079551dgomo     *     E1C 2nd code lock    : [ 0 100ms ]  : STATE_GAL_E1C_2ND_CODE_LOCK is set
4924402af6be9de4782d218170203033618f079551dgomo     *     E1B page             : [ 0    2s ]  : STATE_GAL_E1B_PAGE_SYNC is set
493455c3037c14b3fc4693c75b87cc57423cc8318c9Wyatt Riley     *     Time of week decoded : [ 0 1week ]  : STATE_TOW_DECODED is set
494455c3037c14b3fc4693c75b87cc57423cc8318c9Wyatt Riley     *     Time of week known   : [ 0 1week ]  : STATE_TOW_KNOWN set</pre>
4954402af6be9de4782d218170203033618f079551dgomo     *
4964402af6be9de4782d218170203033618f079551dgomo     * Note: TOW Known refers to the case where TOW is possibly not decoded over the air but has
4974402af6be9de4782d218170203033618f079551dgomo     * been determined from other sources. If TOW decoded is set then TOW Known must also be set.
498e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
499e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>For SBAS, this is:
500e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <ul>
501e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <li>Received SBAS time, at the measurement time in nanoseconds.</li>
502e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * </ul>
503e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
504e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>Given the highest sync state that can be achieved, per each satellite, valid range for
505e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * this field can be:
506e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <pre>
5079363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     Searching       : [ 0       ]   : STATE_UNKNOWN
5089363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     C/A code lock   : [ 0   1ms ]   : STATE_CODE_LOCK is set
5099363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     *     Symbol sync     : [ 0   2ms ]   : STATE_SYMBOL_SYNC is set
510e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *     Message         : [ 0    1s ]   : STATE_SBAS_SYNC is set</pre>
511ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
51276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public long getReceivedSvTimeNanos() {
51376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mReceivedSvTimeNanos;
514ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
515ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
516ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
5179363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     * Sets the received GNSS time in nanoseconds.
5180f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
519ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
5200f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
52176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setReceivedSvTimeNanos(long value) {
52276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mReceivedSvTimeNanos = value;
523ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
524ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
525ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
526e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Gets the error estimate (1-sigma) for the received GNSS time, in nanoseconds.
52781cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa     */
52876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public long getReceivedSvTimeUncertaintyNanos() {
52976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mReceivedSvTimeUncertaintyNanos;
53081cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa    }
53181cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa
53281cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa    /**
5339363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang     * Sets the received GNSS time uncertainty (1-Sigma) in nanoseconds.
5340f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
53581cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa     */
5360f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
53776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setReceivedSvTimeUncertaintyNanos(long value) {
53876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mReceivedSvTimeUncertaintyNanos = value;
53981cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa    }
54081cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa
54181cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa    /**
542ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the Carrier-to-noise density in dB-Hz.
543ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
544e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>Typical range: 10-50 db-Hz.
545e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
546e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The value contains the measured C/N0 for the signal at the antenna input.
547ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
54876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public double getCn0DbHz() {
54976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mCn0DbHz;
550ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
551ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
552ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
553ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the carrier-to-noise density in dB-Hz.
5540f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
555ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
5560f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
55776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setCn0DbHz(double value) {
55876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mCn0DbHz = value;
559ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
560ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
561ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
562ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the Pseudorange rate at the timestamp in m/s.
5635e72118f193258259912c0a51688bd4434c8896edestradaa     *
564e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The error estimate for this value is
565e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * {@link #getPseudorangeRateUncertaintyMetersPerSecond()}.
56676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     *
567e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The value is uncorrected, i.e. corrections for receiver and satellite clock frequency
568e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * errors are not included.
56976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     *
570e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>A positive 'uncorrected' value indicates that the SV is moving away from the receiver. The
57176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * sign of the 'uncorrected' 'pseudorange rate' and its relation to the sign of 'doppler shift'
57276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * is given by the equation:
5735e72118f193258259912c0a51688bd4434c8896edestradaa     *
574e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <pre>
575e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *      pseudorange rate = -k * doppler shift   (where k is a constant)</pre>
576ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
57776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public double getPseudorangeRateMetersPerSecond() {
57876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mPseudorangeRateMetersPerSecond;
579ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
580ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
581ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
582ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the pseudorange rate at the timestamp in m/s.
5830f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
584ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
5850f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
58676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setPseudorangeRateMetersPerSecond(double value) {
58776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mPseudorangeRateMetersPerSecond = value;
588ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
589ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
590ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
591ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the pseudorange's rate uncertainty (1-Sigma) in m/s.
592e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
593e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The uncertainty is represented as an absolute (single sided) value.
594ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
59576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public double getPseudorangeRateUncertaintyMetersPerSecond() {
59676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mPseudorangeRateUncertaintyMetersPerSecond;
597ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
598ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
599ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
600ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the pseudorange's rate uncertainty (1-Sigma) in m/s.
6010f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
602ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
6030f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
60476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setPseudorangeRateUncertaintyMetersPerSecond(double value) {
60576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mPseudorangeRateUncertaintyMetersPerSecond = value;
606ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
607ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
608ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
6092102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Gets 'Accumulated Delta Range' state.
610e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
611e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>It indicates whether {@link #getAccumulatedDeltaRangeMeters()} is reset or there is a
6122102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * cycle slip (indicating 'loss of lock').
6132102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
6144cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @AdrState
61576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getAccumulatedDeltaRangeState() {
6162102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return mAccumulatedDeltaRangeState;
6172102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
6182102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
6192102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
6202102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Sets the 'Accumulated Delta Range' state.
6210f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
6222102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
6230f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
6244cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    public void setAccumulatedDeltaRangeState(@AdrState int value) {
625c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        mAccumulatedDeltaRangeState = value;
6262102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
6272102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
6282102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
6292102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     * Gets a string representation of the 'Accumulated Delta Range state'.
630e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
631e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>For internal and logging use only.
6322102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     */
6332102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private String getAccumulatedDeltaRangeStateString() {
634c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        if (mAccumulatedDeltaRangeState == ADR_STATE_UNKNOWN) {
635c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            return "Unknown";
636c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
637c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        StringBuilder builder = new StringBuilder();
638c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        if ((mAccumulatedDeltaRangeState & ADR_STATE_VALID) == ADR_STATE_VALID) {
639c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("Valid|");
640c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
641c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        if ((mAccumulatedDeltaRangeState & ADR_STATE_RESET) == ADR_STATE_RESET) {
642c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("Reset|");
6432102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        }
644c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        if ((mAccumulatedDeltaRangeState & ADR_STATE_CYCLE_SLIP) == ADR_STATE_CYCLE_SLIP) {
645c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("CycleSlip|");
646c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
6474cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley        if ((mAccumulatedDeltaRangeState & ADR_STATE_HALF_CYCLE_RESOLVED) ==
6484cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley                ADR_STATE_HALF_CYCLE_RESOLVED) {
6494cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley            builder.append("HalfCycleResolved|");
6504cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley        }
6514cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley        if ((mAccumulatedDeltaRangeState & ADR_STATE_HALF_CYCLE_REPORTED)
6524cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley                == ADR_STATE_HALF_CYCLE_REPORTED) {
6534cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley            builder.append("HalfCycleReported|");
6544cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley        }
6554cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley        int remainingStates = mAccumulatedDeltaRangeState & ~ADR_STATE_ALL;
656c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        if (remainingStates > 0) {
657c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append("Other(");
658c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append(Integer.toBinaryString(remainingStates));
659c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa            builder.append(")|");
660c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        }
661c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        builder.deleteCharAt(builder.length() - 1);
662c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        return builder.toString();
6632102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
6642102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
6652102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    /**
666ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the accumulated delta range since the last channel reset, in meters.
6672102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     *
668e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The error estimate for this value is {@link #getAccumulatedDeltaRangeUncertaintyMeters()}.
669e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
670e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The availability of the value is represented by {@link #getAccumulatedDeltaRangeState()}.
6715e72118f193258259912c0a51688bd4434c8896edestradaa     *
672e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>A positive value indicates that the SV is moving away from the receiver.
67376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang     * The sign of {@link #getAccumulatedDeltaRangeMeters()} and its relation to the sign of
6745e72118f193258259912c0a51688bd4434c8896edestradaa     * {@link #getCarrierPhase()} is given by the equation:
675e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
676e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <pre>
677e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *          accumulated delta range = -k * carrier phase    (where k is a constant)</pre>
678252e0908bd729eaf41c6d53af0ea8111bd9464d7Wyatt Riley     *
679252e0908bd729eaf41c6d53af0ea8111bd9464d7Wyatt Riley     * <p>Similar to the concept of an RTCM "Phaserange", when the accumulated delta range is
680252e0908bd729eaf41c6d53af0ea8111bd9464d7Wyatt Riley     * initially chosen, and whenever it is reset, it will retain the integer nature
681252e0908bd729eaf41c6d53af0ea8111bd9464d7Wyatt Riley     * of the relative carrier phase offset between satellites observed by this receiver, such that
682252e0908bd729eaf41c6d53af0ea8111bd9464d7Wyatt Riley     * the double difference of this value between receivers and satellites may be used, together
683252e0908bd729eaf41c6d53af0ea8111bd9464d7Wyatt Riley     * with integer ambiguity resolution, to determine highly precise relative location between
684252e0908bd729eaf41c6d53af0ea8111bd9464d7Wyatt Riley     * receivers.
685252e0908bd729eaf41c6d53af0ea8111bd9464d7Wyatt Riley     *
686252e0908bd729eaf41c6d53af0ea8111bd9464d7Wyatt Riley     * <p>This includes ensuring that all half-cycle ambiguities are resolved before this value is
687252e0908bd729eaf41c6d53af0ea8111bd9464d7Wyatt Riley     * reported as {@link #ADR_STATE_VALID}.
688ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
68976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public double getAccumulatedDeltaRangeMeters() {
69076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mAccumulatedDeltaRangeMeters;
691ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
692ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
693ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
694ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the accumulated delta range in meters.
6950f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
696ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
6970f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
69876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setAccumulatedDeltaRangeMeters(double value) {
69976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mAccumulatedDeltaRangeMeters = value;
700ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
701ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
702ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
703ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the accumulated delta range's uncertainty (1-Sigma) in meters.
7045e72118f193258259912c0a51688bd4434c8896edestradaa     *
705e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The uncertainty is represented as an absolute (single sided) value.
706e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
707e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The status of the value is represented by {@link #getAccumulatedDeltaRangeState()}.
708ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
70976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public double getAccumulatedDeltaRangeUncertaintyMeters() {
71076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mAccumulatedDeltaRangeUncertaintyMeters;
711ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
712ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
713ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
714ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the accumulated delta range's uncertainty (1-sigma) in meters.
7152102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa     *
716e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The status of the value is represented by {@link #getAccumulatedDeltaRangeState()}.
7170f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     *
7180f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
719ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
7200f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
72176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setAccumulatedDeltaRangeUncertaintyMeters(double value) {
72276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mAccumulatedDeltaRangeUncertaintyMeters = value;
723ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
724ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
725ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
726e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Returns {@code true} if {@link #getCarrierFrequencyHz()} is available, {@code false}
727e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * otherwise.
728ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
72976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public boolean hasCarrierFrequencyHz() {
7302102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return isFlagSet(HAS_CARRIER_FREQUENCY);
731ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
732ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
733ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
7344402af6be9de4782d218170203033618f079551dgomo     * Gets the carrier frequency of the tracked signal.
735e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
736d1e856cb9e664c6167141b97e0aa0830c898083agomo     * <p>For example it can be the GPS central frequency for L1 = 1575.45 MHz, or L2 = 1227.60 MHz,
737d1e856cb9e664c6167141b97e0aa0830c898083agomo     * L5 = 1176.45 MHz, varying GLO channels, etc. If the field is not set, it is the primary
738d1e856cb9e664c6167141b97e0aa0830c898083agomo     * common use central frequency, e.g. L1 = 1575.45 MHz for GPS.
739d1e856cb9e664c6167141b97e0aa0830c898083agomo     *
7404cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * <p> For an L1, L5 receiver tracking a satellite on L1 and L5 at the same time, two raw
741d1e856cb9e664c6167141b97e0aa0830c898083agomo     * measurement objects will be reported for this same satellite, in one of the measurement
742d1e856cb9e664c6167141b97e0aa0830c898083agomo     * objects, all the values related to L1 will be filled, and in the other all of the values
743d1e856cb9e664c6167141b97e0aa0830c898083agomo     * related to L5 will be filled.
744ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
745e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The value is only available if {@link #hasCarrierFrequencyHz()} is {@code true}.
7460e342e1fdb892529b9fbc073dbe18c8704af0355Yu Liu     *
7470e342e1fdb892529b9fbc073dbe18c8704af0355Yu Liu     * @return the carrier frequency of the signal tracked in Hz.
748ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
74976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public float getCarrierFrequencyHz() {
75076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        return mCarrierFrequencyHz;
751ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
752ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
753ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
7544402af6be9de4782d218170203033618f079551dgomo     * Sets the Carrier frequency in Hz.
7550f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
756ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
7570f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
75876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setCarrierFrequencyHz(float carrierFrequencyHz) {
7592102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setFlag(HAS_CARRIER_FREQUENCY);
76076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mCarrierFrequencyHz = carrierFrequencyHz;
761ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
762ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
763ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
7644402af6be9de4782d218170203033618f079551dgomo     * Resets the Carrier frequency in Hz.
7650f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
766ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
7670f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
76876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void resetCarrierFrequencyHz() {
7692102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetFlag(HAS_CARRIER_FREQUENCY);
77076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        mCarrierFrequencyHz = Float.NaN;
771ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
772ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
773ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
774e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Returns {@code true} if {@link #getCarrierCycles()} is available, {@code false} otherwise.
7754cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
7764cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * @deprecated use {@link #getAccumulatedDeltaRangeState()} instead.
777ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
7784cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @Deprecated
779ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public boolean hasCarrierCycles() {
7802102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return isFlagSet(HAS_CARRIER_CYCLES);
781ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
782ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
783ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
784ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * The number of full carrier cycles between the satellite and the receiver.
785ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
786e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The reference frequency is given by the value of {@link #getCarrierFrequencyHz()}.
787e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
788e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The value is only available if {@link #hasCarrierCycles()} is {@code true}.
7894cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
7904cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * @deprecated use {@link #getAccumulatedDeltaRangeMeters()} instead.
791ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
7924cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @Deprecated
793ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public long getCarrierCycles() {
794ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        return mCarrierCycles;
795ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
796ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
797ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
798ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the number of full carrier cycles between the satellite and the receiver.
7994cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
8004cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * @deprecated use {@link #setAccumulatedDeltaRangeMeters(double)}
8014cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * and {@link #setAccumulatedDeltaRangeState(int)} instead.
8024cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
8030f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
804ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
8050f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
8064cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @Deprecated
807ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void setCarrierCycles(long value) {
8082102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setFlag(HAS_CARRIER_CYCLES);
809ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierCycles = value;
810ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
811ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
812ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
813ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets the number of full carrier cycles between the satellite and the receiver.
8144cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
8154cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * @deprecated use {@link #setAccumulatedDeltaRangeMeters(double)}
8164cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * and {@link #setAccumulatedDeltaRangeState(int)} instead.
8170f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
818ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
8190f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
8204cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @Deprecated
821ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void resetCarrierCycles() {
8222102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetFlag(HAS_CARRIER_CYCLES);
823ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierCycles = Long.MIN_VALUE;
824ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
825ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
826ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
827e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Returns {@code true} if {@link #getCarrierPhase()} is available, {@code false} otherwise.
8284cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
8294cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * @deprecated use {@link #getAccumulatedDeltaRangeState()} instead.
830ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
8314cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @Deprecated
832ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public boolean hasCarrierPhase() {
8332102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return isFlagSet(HAS_CARRIER_PHASE);
834ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
835ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
836ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
837ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the RF phase detected by the receiver.
838ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
839e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>Range: [0.0, 1.0].
840e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
841e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>This is the fractional part of the complete carrier phase measurement.
842e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
843e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The reference frequency is given by the value of {@link #getCarrierFrequencyHz()}.
844ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
845e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The error estimate for this value is {@link #getCarrierPhaseUncertainty()}.
846e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
847e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The value is only available if {@link #hasCarrierPhase()} is {@code true}.
8484cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
8494cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * @deprecated use {@link #getAccumulatedDeltaRangeMeters()} instead.
850ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
8514cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @Deprecated
852ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public double getCarrierPhase() {
853ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        return mCarrierPhase;
854ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
855ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
856ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
857ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the RF phase detected by the receiver.
8584cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
8594cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * @deprecated use {@link #setAccumulatedDeltaRangeMeters(double)}
8604cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * and {@link #setAccumulatedDeltaRangeState(int)} instead.
8614cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
8620f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
863ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
8640f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
8654cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @Deprecated
866ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void setCarrierPhase(double value) {
8672102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setFlag(HAS_CARRIER_PHASE);
868ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierPhase = value;
869ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
870ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
871ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
872ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets the RF phase detected by the receiver.
8734cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
8744cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * @deprecated use {@link #setAccumulatedDeltaRangeMeters(double)}
8754cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * and {@link #setAccumulatedDeltaRangeState(int)} instead.
8764cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
8770f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
878ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
8790f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
8804cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @Deprecated
881ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void resetCarrierPhase() {
8822102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetFlag(HAS_CARRIER_PHASE);
883ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierPhase = Double.NaN;
884ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
885ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
886ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
887e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Returns {@code true} if {@link #getCarrierPhaseUncertainty()} is available, {@code false}
888e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * otherwise.
8894cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
8904cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * @deprecated use {@link #getAccumulatedDeltaRangeState()} instead.
891ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
8924cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @Deprecated
893ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public boolean hasCarrierPhaseUncertainty() {
8942102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return isFlagSet(HAS_CARRIER_PHASE_UNCERTAINTY);
895ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
896ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
897ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
898ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets the carrier-phase's uncertainty (1-Sigma).
899ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
900e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The uncertainty is represented as an absolute (single sided) value.
901e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
902e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The value is only available if {@link #hasCarrierPhaseUncertainty()} is {@code true}.
9034cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
9044cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * @deprecated use {@link #getAccumulatedDeltaRangeUncertaintyMeters()} instead.
905ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
9064cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @Deprecated
907ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public double getCarrierPhaseUncertainty() {
908ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        return mCarrierPhaseUncertainty;
909ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
910ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
911ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
912ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the Carrier-phase's uncertainty (1-Sigma) in cycles.
9134cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
9144cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * @deprecated use {@link #setAccumulatedDeltaRangeUncertaintyMeters(double)}
9154cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * and {@link #setAccumulatedDeltaRangeState(int)} instead.
9164cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
9170f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
918ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
9190f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
9204cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @Deprecated
921ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void setCarrierPhaseUncertainty(double value) {
9222102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setFlag(HAS_CARRIER_PHASE_UNCERTAINTY);
923ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierPhaseUncertainty = value;
924ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
925ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
926ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
927ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets the Carrier-phase's uncertainty (1-Sigma) in cycles.
9284cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
9294cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * @deprecated use {@link #setAccumulatedDeltaRangeUncertaintyMeters(double)}
9304cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * and {@link #setAccumulatedDeltaRangeState(int)} instead.
9314cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
9320f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
933ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
9340f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
9354cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley    @Deprecated
936ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void resetCarrierPhaseUncertainty() {
9372102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetFlag(HAS_CARRIER_PHASE_UNCERTAINTY);
938ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mCarrierPhaseUncertainty = Double.NaN;
939ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
940ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
941ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
942ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets a value indicating the 'multipath' state of the event.
943ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
944a8b7bb5a50d8ad197c6f32eb308919c11b52ce74Lifu Tang    @MultipathIndicator
94576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public int getMultipathIndicator() {
946ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        return mMultipathIndicator;
947ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
948ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
949ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
950ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the 'multi-path' indicator.
9510f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
952ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
9530f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
95476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    public void setMultipathIndicator(@MultipathIndicator int value) {
955c91ac688295e3d64ad1dd7539a713f5de60fea05destradaa        mMultipathIndicator = value;
956ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
957ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
958ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
959ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Gets a string representation of the 'multi-path indicator'.
960e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     *
961e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>For internal and logging use only.
962ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
963ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    private String getMultipathIndicatorString() {
964ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        switch(mMultipathIndicator) {
965ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa            case MULTIPATH_INDICATOR_UNKNOWN:
966ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                return "Unknown";
967ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa            case MULTIPATH_INDICATOR_DETECTED:
968ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                return "Detected";
969a2bbfbcf8920ecec5700c1824b0436118cada5beWyatt Riley            case MULTIPATH_INDICATOR_NOT_DETECTED:
970a2bbfbcf8920ecec5700c1824b0436118cada5beWyatt Riley                return "NotDetected";
971ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa            default:
9724cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley                return "<Invalid: " + mMultipathIndicator + ">";
973ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        }
974ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
975ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
976ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
977e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * Returns {@code true} if {@link #getSnrInDb()} is available, {@code false} otherwise.
978ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
979ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public boolean hasSnrInDb() {
9802102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return isFlagSet(HAS_SNR);
981ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
982ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
983ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
984252e0908bd729eaf41c6d53af0ea8111bd9464d7Wyatt Riley     * Gets the (post-correlation & integration) Signal-to-Noise ratio (SNR) in dB.
985ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     *
986e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * <p>The value is only available if {@link #hasSnrInDb()} is {@code true}.
987ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
988ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public double getSnrInDb() {
989ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        return mSnrInDb;
990ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
991ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
992ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
993ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Sets the Signal-to-noise ratio (SNR) in dB.
9940f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
995ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
9960f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
997ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void setSnrInDb(double snrInDb) {
9982102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setFlag(HAS_SNR);
999ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mSnrInDb = snrInDb;
1000ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
1001ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
1002ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    /**
1003ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     * Resets the Signal-to-noise ratio (SNR) in dB.
10040f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang     * @hide
1005ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa     */
10060f1ab04516d3e9a72eda22c998910f49f2bd40bbLifu Tang    @TestApi
1007ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void resetSnrInDb() {
10082102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetFlag(HAS_SNR);
1009ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        mSnrInDb = Double.NaN;
1010ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
1011ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
10124402af6be9de4782d218170203033618f079551dgomo    /**
10130e342e1fdb892529b9fbc073dbe18c8704af0355Yu Liu     * Returns {@code true} if {@link #getAutomaticGainControlLevelDb()} is available,
1014127ba323d9ae2107ed58039f24ffade2c27ff7c9gomo     * {@code false} otherwise.
10154402af6be9de4782d218170203033618f079551dgomo     */
10160e342e1fdb892529b9fbc073dbe18c8704af0355Yu Liu    public boolean hasAutomaticGainControlLevelDb() {
10174402af6be9de4782d218170203033618f079551dgomo        return isFlagSet(HAS_AUTOMATIC_GAIN_CONTROL);
10184402af6be9de4782d218170203033618f079551dgomo    }
10194402af6be9de4782d218170203033618f079551dgomo
10204402af6be9de4782d218170203033618f079551dgomo    /**
10214402af6be9de4782d218170203033618f079551dgomo     * Gets the Automatic Gain Control level in dB.
10224402af6be9de4782d218170203033618f079551dgomo     *
1023d1e856cb9e664c6167141b97e0aa0830c898083agomo     * <p> AGC acts as a variable gain amplifier adjusting the power of the incoming signal. The AGC
1024d1e856cb9e664c6167141b97e0aa0830c898083agomo     * level may be used to indicate potential interference. When AGC is at a nominal level, this
1025d1e856cb9e664c6167141b97e0aa0830c898083agomo     * value must be set as 0. Higher gain (and/or lower input power) shall be output as a positive
1026d1e856cb9e664c6167141b97e0aa0830c898083agomo     * number. Hence in cases of strong jamming, in the band of this signal, this value will go more
1027d1e856cb9e664c6167141b97e0aa0830c898083agomo     * negative.
1028d1e856cb9e664c6167141b97e0aa0830c898083agomo     *
10294cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * <p> Note: Different hardware designs (e.g. antenna, pre-amplification, or other RF HW
10304402af6be9de4782d218170203033618f079551dgomo     * components) may also affect the typical output of of this value on any given hardware design
10314402af6be9de4782d218170203033618f079551dgomo     * in an open sky test - the important aspect of this output is that changes in this value are
10324402af6be9de4782d218170203033618f079551dgomo     * indicative of changes on input signal power in the frequency band for this measurement.
10334cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     *
10344cbcb411b1198f14fbd41a231cc7fb738c958f1bWyatt Riley     * <p> The value is only available if {@link #hasAutomaticGainControlLevelDb()} is {@code true}
10354402af6be9de4782d218170203033618f079551dgomo     */
10360e342e1fdb892529b9fbc073dbe18c8704af0355Yu Liu    public double getAutomaticGainControlLevelDb() {
1037127ba323d9ae2107ed58039f24ffade2c27ff7c9gomo        return mAutomaticGainControlLevelInDb;
10384402af6be9de4782d218170203033618f079551dgomo    }
10394402af6be9de4782d218170203033618f079551dgomo
10404402af6be9de4782d218170203033618f079551dgomo    /**
10414402af6be9de4782d218170203033618f079551dgomo     * Sets the Automatic Gain Control level in dB.
10424402af6be9de4782d218170203033618f079551dgomo     * @hide
10434402af6be9de4782d218170203033618f079551dgomo     */
1044127ba323d9ae2107ed58039f24ffade2c27ff7c9gomo    @TestApi
1045127ba323d9ae2107ed58039f24ffade2c27ff7c9gomo    public void setAutomaticGainControlLevelInDb(double agcLevelDb) {
10464402af6be9de4782d218170203033618f079551dgomo        setFlag(HAS_AUTOMATIC_GAIN_CONTROL);
1047127ba323d9ae2107ed58039f24ffade2c27ff7c9gomo        mAutomaticGainControlLevelInDb = agcLevelDb;
10484402af6be9de4782d218170203033618f079551dgomo    }
10494402af6be9de4782d218170203033618f079551dgomo
10504402af6be9de4782d218170203033618f079551dgomo    /**
10514402af6be9de4782d218170203033618f079551dgomo     * Resets the Automatic Gain Control level.
10524402af6be9de4782d218170203033618f079551dgomo     * @hide
10534402af6be9de4782d218170203033618f079551dgomo     */
1054127ba323d9ae2107ed58039f24ffade2c27ff7c9gomo    @TestApi
1055127ba323d9ae2107ed58039f24ffade2c27ff7c9gomo    public void resetAutomaticGainControlLevel() {
10564402af6be9de4782d218170203033618f079551dgomo        resetFlag(HAS_AUTOMATIC_GAIN_CONTROL);
1057127ba323d9ae2107ed58039f24ffade2c27ff7c9gomo        mAutomaticGainControlLevelInDb = Double.NaN;
10584402af6be9de4782d218170203033618f079551dgomo    }
10594402af6be9de4782d218170203033618f079551dgomo
1060818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang    public static final Creator<GnssMeasurement> CREATOR = new Creator<GnssMeasurement>() {
1061ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        @Override
1062818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang        public GnssMeasurement createFromParcel(Parcel parcel) {
1063818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            GnssMeasurement gnssMeasurement = new GnssMeasurement();
1064818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang
1065818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            gnssMeasurement.mFlags = parcel.readInt();
106676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mSvid = parcel.readInt();
106776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mConstellationType = parcel.readInt();
106876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mTimeOffsetNanos = parcel.readDouble();
106976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mState = parcel.readInt();
107076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mReceivedSvTimeNanos = parcel.readLong();
107176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mReceivedSvTimeUncertaintyNanos = parcel.readLong();
107276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mCn0DbHz = parcel.readDouble();
107376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mPseudorangeRateMetersPerSecond = parcel.readDouble();
107476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mPseudorangeRateUncertaintyMetersPerSecond = parcel.readDouble();
107576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mAccumulatedDeltaRangeState = parcel.readInt();
107676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mAccumulatedDeltaRangeMeters = parcel.readDouble();
107776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mAccumulatedDeltaRangeUncertaintyMeters = parcel.readDouble();
107876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mCarrierFrequencyHz = parcel.readFloat();
1079818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            gnssMeasurement.mCarrierCycles = parcel.readLong();
1080818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            gnssMeasurement.mCarrierPhase = parcel.readDouble();
1081818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            gnssMeasurement.mCarrierPhaseUncertainty = parcel.readDouble();
108276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang            gnssMeasurement.mMultipathIndicator = parcel.readInt();
1083818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            gnssMeasurement.mSnrInDb = parcel.readDouble();
1084127ba323d9ae2107ed58039f24ffade2c27ff7c9gomo            gnssMeasurement.mAutomaticGainControlLevelInDb = parcel.readDouble();
1085818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang
1086818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            return gnssMeasurement;
1087ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        }
1088ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
1089ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        @Override
1090818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang        public GnssMeasurement[] newArray(int i) {
1091818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang            return new GnssMeasurement[i];
1092ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        }
1093ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    };
1094ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
1095120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang    @Override
1096ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void writeToParcel(Parcel parcel, int flags) {
10972102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        parcel.writeInt(mFlags);
1098120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        parcel.writeInt(mSvid);
109976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeInt(mConstellationType);
110076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeDouble(mTimeOffsetNanos);
11012102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        parcel.writeInt(mState);
110276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeLong(mReceivedSvTimeNanos);
110376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeLong(mReceivedSvTimeUncertaintyNanos);
110476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeDouble(mCn0DbHz);
110576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeDouble(mPseudorangeRateMetersPerSecond);
110676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeDouble(mPseudorangeRateUncertaintyMetersPerSecond);
11072102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        parcel.writeInt(mAccumulatedDeltaRangeState);
110876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeDouble(mAccumulatedDeltaRangeMeters);
110976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeDouble(mAccumulatedDeltaRangeUncertaintyMeters);
111076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeFloat(mCarrierFrequencyHz);
1111ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        parcel.writeLong(mCarrierCycles);
1112ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        parcel.writeDouble(mCarrierPhase);
1113ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        parcel.writeDouble(mCarrierPhaseUncertainty);
111476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        parcel.writeInt(mMultipathIndicator);
1115ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        parcel.writeDouble(mSnrInDb);
1116127ba323d9ae2107ed58039f24ffade2c27ff7c9gomo        parcel.writeDouble(mAutomaticGainControlLevelInDb);
1117ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
1118ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
1119ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    @Override
1120ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public int describeContents() {
1121ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        return 0;
1122ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
1123ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
1124ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    @Override
1125ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public String toString() {
1126ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        final String format = "   %-29s = %s\n";
1127ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        final String formatWithUncertainty = "   %-29s = %-25s   %-40s = %s\n";
1128818aa2c2c46addae934fb6cd42f889affc9ef747Lifu Tang        StringBuilder builder = new StringBuilder("GnssMeasurement:\n");
1129ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
1130120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang        builder.append(String.format(format, "Svid", mSvid));
11319363b949a104786c87cd2cd18f206ff3c1957e5eLifu Tang        builder.append(String.format(format, "ConstellationType", mConstellationType));
113276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        builder.append(String.format(format, "TimeOffsetNanos", mTimeOffsetNanos));
11332102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
11342102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        builder.append(String.format(format, "State", getStateString()));
1135ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
113681cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa        builder.append(String.format(
113781cabb8a7fb5b61f16bf49c2757ccb51bc88e708destradaa                formatWithUncertainty,
113876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "ReceivedSvTimeNanos",
113976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                mReceivedSvTimeNanos,
114076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "ReceivedSvTimeUncertaintyNanos",
114176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                mReceivedSvTimeUncertaintyNanos));
1142ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
114376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        builder.append(String.format(format, "Cn0DbHz", mCn0DbHz));
1144ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
1145ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        builder.append(String.format(
1146ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                formatWithUncertainty,
114776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "PseudorangeRateMetersPerSecond",
114876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                mPseudorangeRateMetersPerSecond,
114976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "PseudorangeRateUncertaintyMetersPerSecond",
115076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                mPseudorangeRateUncertaintyMetersPerSecond));
1151ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
1152ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        builder.append(String.format(
11532102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                format,
11542102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                "AccumulatedDeltaRangeState",
11552102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                getAccumulatedDeltaRangeStateString()));
11562102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
11572102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        builder.append(String.format(
1158ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                formatWithUncertainty,
115976a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "AccumulatedDeltaRangeMeters",
116076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                mAccumulatedDeltaRangeMeters,
116176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "AccumulatedDeltaRangeUncertaintyMeters",
116276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                mAccumulatedDeltaRangeUncertaintyMeters));
1163ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
1164ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        builder.append(String.format(
1165ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                format,
116676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                "CarrierFrequencyHz",
116776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                hasCarrierFrequencyHz() ? mCarrierFrequencyHz : null));
1168ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
1169ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        builder.append(String.format(
1170ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                format,
1171ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                "CarrierCycles",
11722102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                hasCarrierCycles() ? mCarrierCycles : null));
1173ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
1174ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        builder.append(String.format(
1175ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                formatWithUncertainty,
1176ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                "CarrierPhase",
11772102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                hasCarrierPhase() ? mCarrierPhase : null,
1178ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                "CarrierPhaseUncertainty",
11792102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                hasCarrierPhaseUncertainty() ? mCarrierPhaseUncertainty : null));
1180ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
1181ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        builder.append(String.format(format, "MultipathIndicator", getMultipathIndicatorString()));
1182ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
1183ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        builder.append(String.format(
1184ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                format,
1185ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                "SnrInDb",
11862102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa                hasSnrInDb() ? mSnrInDb : null));
11874402af6be9de4782d218170203033618f079551dgomo        builder.append(String.format(
11884402af6be9de4782d218170203033618f079551dgomo            format,
11894402af6be9de4782d218170203033618f079551dgomo            "AgcLevelDb",
11900e342e1fdb892529b9fbc073dbe18c8704af0355Yu Liu            hasAutomaticGainControlLevelDb() ? mAutomaticGainControlLevelInDb : null));
1191ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
1192ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        return builder.toString();
1193ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
11942102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
11952102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private void initialize() {
11962102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        mFlags = HAS_NO_FLAGS;
119776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setSvid(0);
119876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setTimeOffsetNanos(Long.MIN_VALUE);
11992102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setState(STATE_UNKNOWN);
120076a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setReceivedSvTimeNanos(Long.MIN_VALUE);
120176a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setReceivedSvTimeUncertaintyNanos(Long.MAX_VALUE);
120276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setCn0DbHz(Double.MIN_VALUE);
120376a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setPseudorangeRateMetersPerSecond(Double.MIN_VALUE);
120476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setPseudorangeRateUncertaintyMetersPerSecond(Double.MIN_VALUE);
12052102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setAccumulatedDeltaRangeState(ADR_STATE_UNKNOWN);
120676a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setAccumulatedDeltaRangeMeters(Double.MIN_VALUE);
120776a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setAccumulatedDeltaRangeUncertaintyMeters(Double.MIN_VALUE);
120876a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        resetCarrierFrequencyHz();
12092102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetCarrierCycles();
12102102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetCarrierPhase();
12112102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetCarrierPhaseUncertainty();
12122102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        setMultipathIndicator(MULTIPATH_INDICATOR_UNKNOWN);
12132102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        resetSnrInDb();
1214127ba323d9ae2107ed58039f24ffade2c27ff7c9gomo        resetAutomaticGainControlLevel();
12152102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
12162102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
12172102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private void setFlag(int flag) {
12182102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        mFlags |= flag;
12192102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
12202102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
12212102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private void resetFlag(int flag) {
12222102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        mFlags &= ~flag;
12232102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
12242102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa
12252102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    private boolean isFlagSet(int flag) {
12262102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa        return (mFlags & flag) == flag;
12272102dd725540bcf51bf324a2775fbcffe45dd32fdestradaa    }
1228ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa}
1229