xref: /aosp_15_r20/hardware/interfaces/gnss/1.0/IGnssMeasurementCallback.hal (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker/*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker *
4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker *
8*4d7e907cSAndroid Build Coastguard Worker *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker *
10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker */
16*4d7e907cSAndroid Build Coastguard Worker
17*4d7e907cSAndroid Build Coastguard Workerpackage [email protected];
18*4d7e907cSAndroid Build Coastguard Worker
19*4d7e907cSAndroid Build Coastguard Worker/** The callback interface to report measurements from the HAL. */
20*4d7e907cSAndroid Build Coastguard Workerinterface IGnssMeasurementCallback {
21*4d7e907cSAndroid Build Coastguard Worker    /**
22*4d7e907cSAndroid Build Coastguard Worker     * Flags to indicate what fields in GnssClock are valid.
23*4d7e907cSAndroid Build Coastguard Worker     */
24*4d7e907cSAndroid Build Coastguard Worker    @export(name="", value_prefix="GNSS_CLOCK_")
25*4d7e907cSAndroid Build Coastguard Worker    enum GnssClockFlags : uint16_t {
26*4d7e907cSAndroid Build Coastguard Worker        /** A valid 'leap second' is stored in the data structure. */
27*4d7e907cSAndroid Build Coastguard Worker        HAS_LEAP_SECOND        = 1 << 0,
28*4d7e907cSAndroid Build Coastguard Worker        /** A valid 'time uncertainty' is stored in the data structure. */
29*4d7e907cSAndroid Build Coastguard Worker        HAS_TIME_UNCERTAINTY   = 1 << 1,
30*4d7e907cSAndroid Build Coastguard Worker        /** A valid 'full bias' is stored in the data structure. */
31*4d7e907cSAndroid Build Coastguard Worker        HAS_FULL_BIAS          = 1 << 2,
32*4d7e907cSAndroid Build Coastguard Worker        /** A valid 'bias' is stored in the data structure. */
33*4d7e907cSAndroid Build Coastguard Worker        HAS_BIAS               = 1 << 3,
34*4d7e907cSAndroid Build Coastguard Worker        /** A valid 'bias uncertainty' is stored in the data structure. */
35*4d7e907cSAndroid Build Coastguard Worker        HAS_BIAS_UNCERTAINTY   = 1 << 4,
36*4d7e907cSAndroid Build Coastguard Worker        /** A valid 'drift' is stored in the data structure. */
37*4d7e907cSAndroid Build Coastguard Worker        HAS_DRIFT              = 1 << 5,
38*4d7e907cSAndroid Build Coastguard Worker        /** A valid 'drift uncertainty' is stored in the data structure. */
39*4d7e907cSAndroid Build Coastguard Worker        HAS_DRIFT_UNCERTAINTY  = 1 << 6
40*4d7e907cSAndroid Build Coastguard Worker    };
41*4d7e907cSAndroid Build Coastguard Worker
42*4d7e907cSAndroid Build Coastguard Worker    /**
43*4d7e907cSAndroid Build Coastguard Worker     * Flags to indicate what fields in GnssMeasurement are valid.
44*4d7e907cSAndroid Build Coastguard Worker     */
45*4d7e907cSAndroid Build Coastguard Worker    @export(name="", value_prefix="GNSS_MEASUREMENT_")
46*4d7e907cSAndroid Build Coastguard Worker    enum GnssMeasurementFlags : uint32_t {
47*4d7e907cSAndroid Build Coastguard Worker        /** A valid 'snr' is stored in the data structure. */
48*4d7e907cSAndroid Build Coastguard Worker        HAS_SNR                        = 1 << 0,
49*4d7e907cSAndroid Build Coastguard Worker        /** A valid 'carrier frequency' is stored in the data structure. */
50*4d7e907cSAndroid Build Coastguard Worker        HAS_CARRIER_FREQUENCY          = 1 << 9,
51*4d7e907cSAndroid Build Coastguard Worker        /** A valid 'carrier cycles' is stored in the data structure. */
52*4d7e907cSAndroid Build Coastguard Worker        HAS_CARRIER_CYCLES             = 1 << 10,
53*4d7e907cSAndroid Build Coastguard Worker        /** A valid 'carrier phase' is stored in the data structure. */
54*4d7e907cSAndroid Build Coastguard Worker        HAS_CARRIER_PHASE              = 1 << 11,
55*4d7e907cSAndroid Build Coastguard Worker        /** A valid 'carrier phase uncertainty' is stored in the data structure. */
56*4d7e907cSAndroid Build Coastguard Worker        HAS_CARRIER_PHASE_UNCERTAINTY  = 1 << 12,
57*4d7e907cSAndroid Build Coastguard Worker        /** A valid automatic gain control is stored in the data structure. */
58*4d7e907cSAndroid Build Coastguard Worker        HAS_AUTOMATIC_GAIN_CONTROL     = 1 << 13
59*4d7e907cSAndroid Build Coastguard Worker    };
60*4d7e907cSAndroid Build Coastguard Worker
61*4d7e907cSAndroid Build Coastguard Worker    /**
62*4d7e907cSAndroid Build Coastguard Worker     * Enumeration of available values for the GNSS Measurement's multipath
63*4d7e907cSAndroid Build Coastguard Worker     * indicator.
64*4d7e907cSAndroid Build Coastguard Worker     */
65*4d7e907cSAndroid Build Coastguard Worker    @export(name="", value_prefix="GNSS_MULTIPATH_")
66*4d7e907cSAndroid Build Coastguard Worker    enum GnssMultipathIndicator : uint8_t {
67*4d7e907cSAndroid Build Coastguard Worker        /** The indicator is not available or unknown. */
68*4d7e907cSAndroid Build Coastguard Worker        INDICATOR_UNKNOWN      = 0,
69*4d7e907cSAndroid Build Coastguard Worker        /** The measurement is indicated to be affected by multipath. */
70*4d7e907cSAndroid Build Coastguard Worker        INDICATOR_PRESENT      = 1,
71*4d7e907cSAndroid Build Coastguard Worker        /** The measurement is indicated to be not affected by multipath. */
72*4d7e907cSAndroid Build Coastguard Worker        INDICATIOR_NOT_PRESENT = 2
73*4d7e907cSAndroid Build Coastguard Worker    };
74*4d7e907cSAndroid Build Coastguard Worker
75*4d7e907cSAndroid Build Coastguard Worker    /**
76*4d7e907cSAndroid Build Coastguard Worker     * Flags indicating the GNSS measurement state.
77*4d7e907cSAndroid Build Coastguard Worker     *
78*4d7e907cSAndroid Build Coastguard Worker     * The expected behavior here is for GNSS HAL to set all the flags that applies.
79*4d7e907cSAndroid Build Coastguard Worker     * For example, if the state for a satellite is only C/A code locked and bit
80*4d7e907cSAndroid Build Coastguard Worker     * synchronized, and there is still millisecond ambiguity, the state must be
81*4d7e907cSAndroid Build Coastguard Worker     * set as:
82*4d7e907cSAndroid Build Coastguard Worker     *
83*4d7e907cSAndroid Build Coastguard Worker     * STATE_CODE_LOCK | STATE_BIT_SYNC |  STATE_MSEC_AMBIGUOUS
84*4d7e907cSAndroid Build Coastguard Worker     *
85*4d7e907cSAndroid Build Coastguard Worker     * If GNSS is still searching for a satellite, the corresponding state must be
86*4d7e907cSAndroid Build Coastguard Worker     * set to STATE_UNKNOWN(0).
87*4d7e907cSAndroid Build Coastguard Worker     */
88*4d7e907cSAndroid Build Coastguard Worker    @export(name="", value_prefix="GNSS_MEASUREMENT_")
89*4d7e907cSAndroid Build Coastguard Worker    enum GnssMeasurementState : uint32_t {
90*4d7e907cSAndroid Build Coastguard Worker        STATE_UNKNOWN                = 0,
91*4d7e907cSAndroid Build Coastguard Worker        STATE_CODE_LOCK              = 1 << 0,
92*4d7e907cSAndroid Build Coastguard Worker        STATE_BIT_SYNC               = 1 << 1,
93*4d7e907cSAndroid Build Coastguard Worker        STATE_SUBFRAME_SYNC          = 1 << 2,
94*4d7e907cSAndroid Build Coastguard Worker        STATE_TOW_DECODED            = 1 << 3,
95*4d7e907cSAndroid Build Coastguard Worker        STATE_MSEC_AMBIGUOUS         = 1 << 4,
96*4d7e907cSAndroid Build Coastguard Worker        STATE_SYMBOL_SYNC            = 1 << 5,
97*4d7e907cSAndroid Build Coastguard Worker        STATE_GLO_STRING_SYNC        = 1 << 6,
98*4d7e907cSAndroid Build Coastguard Worker        STATE_GLO_TOD_DECODED        = 1 << 7,
99*4d7e907cSAndroid Build Coastguard Worker        STATE_BDS_D2_BIT_SYNC        = 1 << 8,
100*4d7e907cSAndroid Build Coastguard Worker        STATE_BDS_D2_SUBFRAME_SYNC   = 1 << 9,
101*4d7e907cSAndroid Build Coastguard Worker        STATE_GAL_E1BC_CODE_LOCK     = 1 << 10,
102*4d7e907cSAndroid Build Coastguard Worker        STATE_GAL_E1C_2ND_CODE_LOCK  = 1 << 11,
103*4d7e907cSAndroid Build Coastguard Worker        STATE_GAL_E1B_PAGE_SYNC      = 1 << 12,
104*4d7e907cSAndroid Build Coastguard Worker        STATE_SBAS_SYNC              = 1 << 13,
105*4d7e907cSAndroid Build Coastguard Worker        STATE_TOW_KNOWN              = 1 << 14,
106*4d7e907cSAndroid Build Coastguard Worker        STATE_GLO_TOD_KNOWN          = 1 << 15,
107*4d7e907cSAndroid Build Coastguard Worker    };
108*4d7e907cSAndroid Build Coastguard Worker
109*4d7e907cSAndroid Build Coastguard Worker     /**
110*4d7e907cSAndroid Build Coastguard Worker     * Flags indicating the Accumulated Delta Range's states.
111*4d7e907cSAndroid Build Coastguard Worker     *
112*4d7e907cSAndroid Build Coastguard Worker     * See the table below for a detailed interpretation of each state.
113*4d7e907cSAndroid Build Coastguard Worker     *
114*4d7e907cSAndroid Build Coastguard Worker     * +---------------------+-------------------+-----------------------------+
115*4d7e907cSAndroid Build Coastguard Worker     * | ADR_STATE           | Time of relevance | Interpretation              |
116*4d7e907cSAndroid Build Coastguard Worker     * +---------------------+-------------------+-----------------------------+
117*4d7e907cSAndroid Build Coastguard Worker     * | UNKNOWN             | ADR(t)            | No valid carrier phase      |
118*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | information is available    |
119*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | at time t.                  |
120*4d7e907cSAndroid Build Coastguard Worker     * +---------------------+-------------------+-----------------------------+
121*4d7e907cSAndroid Build Coastguard Worker     * | VALID               | ADR(t)            | Valid carrier phase         |
122*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | information is available    |
123*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | at time t. This indicates   |
124*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | that this measurement can   |
125*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | be used as a reference for  |
126*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | future measurements.        |
127*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | However, to compare it to   |
128*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | previous measurements to    |
129*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | compute delta range,        |
130*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | other bits should be        |
131*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | checked. Specifically, it   |
132*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | can be used for delta range |
133*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | computation if it is valid  |
134*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | and has no reset or cycle   |
135*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | slip at this epoch i.e.     |
136*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | if VALID_BIT == 1 &&        |
137*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | CYCLE_SLIP_BIT == 0 &&      |
138*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | RESET_BIT == 0.             |
139*4d7e907cSAndroid Build Coastguard Worker     * +---------------------+-------------------+-----------------------------+
140*4d7e907cSAndroid Build Coastguard Worker     * | RESET               | ADR(t) - ADR(t-1) | Carrier phase accumulation  |
141*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | has been restarted between  |
142*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | current time t and previous |
143*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | time t-1. This indicates    |
144*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | that this measurement can   |
145*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | be used as a reference for  |
146*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | future measurements, but it |
147*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | should not be compared to   |
148*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | previous measurements to    |
149*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | compute delta range.        |
150*4d7e907cSAndroid Build Coastguard Worker     * +---------------------+-------------------+-----------------------------+
151*4d7e907cSAndroid Build Coastguard Worker     * | CYCLE_SLIP          | ADR(t) - ADR(t-1) | Cycle slip(s) have been     |
152*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | detected between the        |
153*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | current time t and previous |
154*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | time t-1. This indicates    |
155*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | that this measurement can   |
156*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | be used as a reference for  |
157*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | future measurements.        |
158*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | Clients can use a           |
159*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | measurement with a cycle    |
160*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | slip to compute delta range |
161*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | against previous            |
162*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | measurements at their own   |
163*4d7e907cSAndroid Build Coastguard Worker     * |                     |                   | risk.                       |
164*4d7e907cSAndroid Build Coastguard Worker     * +---------------------+-------------------+-----------------------------+
165*4d7e907cSAndroid Build Coastguard Worker     *
166*4d7e907cSAndroid Build Coastguard Worker     */
167*4d7e907cSAndroid Build Coastguard Worker    @export(name="", value_prefix="GNSS_")
168*4d7e907cSAndroid Build Coastguard Worker    enum GnssAccumulatedDeltaRangeState : uint16_t {
169*4d7e907cSAndroid Build Coastguard Worker        ADR_STATE_UNKNOWN    = 0,
170*4d7e907cSAndroid Build Coastguard Worker        ADR_STATE_VALID      = 1 << 0,
171*4d7e907cSAndroid Build Coastguard Worker        ADR_STATE_RESET      = 1 << 1,
172*4d7e907cSAndroid Build Coastguard Worker        ADR_STATE_CYCLE_SLIP = 1 << 2,
173*4d7e907cSAndroid Build Coastguard Worker    };
174*4d7e907cSAndroid Build Coastguard Worker
175*4d7e907cSAndroid Build Coastguard Worker    /**
176*4d7e907cSAndroid Build Coastguard Worker     * Represents an estimate of the GNSS clock time.
177*4d7e907cSAndroid Build Coastguard Worker     */
178*4d7e907cSAndroid Build Coastguard Worker    struct GnssClock {
179*4d7e907cSAndroid Build Coastguard Worker        /**
180*4d7e907cSAndroid Build Coastguard Worker         * A set of flags indicating the validity of the fields in this data
181*4d7e907cSAndroid Build Coastguard Worker         * structure.
182*4d7e907cSAndroid Build Coastguard Worker         *
183*4d7e907cSAndroid Build Coastguard Worker         * Fields for which there is no corresponding flag must be filled in
184*4d7e907cSAndroid Build Coastguard Worker         * with a valid value.  For convenience, these are marked as mandatory.
185*4d7e907cSAndroid Build Coastguard Worker         *
186*4d7e907cSAndroid Build Coastguard Worker         * Others fields may have invalid information in them, if not marked as
187*4d7e907cSAndroid Build Coastguard Worker         * valid by the corresponding bit in gnssClockFlags.
188*4d7e907cSAndroid Build Coastguard Worker         */
189*4d7e907cSAndroid Build Coastguard Worker        bitfield<GnssClockFlags> gnssClockFlags;
190*4d7e907cSAndroid Build Coastguard Worker
191*4d7e907cSAndroid Build Coastguard Worker        /**
192*4d7e907cSAndroid Build Coastguard Worker         * Leap second data.
193*4d7e907cSAndroid Build Coastguard Worker         * The sign of the value is defined by the following equation:
194*4d7e907cSAndroid Build Coastguard Worker         *      utcTimeNs = timeNs - (fullBiasNs + biasNs) - leapSecond *
195*4d7e907cSAndroid Build Coastguard Worker         *      1,000,000,000
196*4d7e907cSAndroid Build Coastguard Worker         *
197*4d7e907cSAndroid Build Coastguard Worker         * If this data is available, gnssClockFlags must contain
198*4d7e907cSAndroid Build Coastguard Worker         * HAS_LEAP_SECOND.
199*4d7e907cSAndroid Build Coastguard Worker         */
200*4d7e907cSAndroid Build Coastguard Worker        int16_t leapSecond;
201*4d7e907cSAndroid Build Coastguard Worker
202*4d7e907cSAndroid Build Coastguard Worker        /**
203*4d7e907cSAndroid Build Coastguard Worker         * The GNSS receiver internal clock value. This is the local hardware clock
204*4d7e907cSAndroid Build Coastguard Worker         * value.
205*4d7e907cSAndroid Build Coastguard Worker         *
206*4d7e907cSAndroid Build Coastguard Worker         * For local hardware clock, this value is expected to be monotonically
207*4d7e907cSAndroid Build Coastguard Worker         * increasing while the hardware clock remains powered on. (For the case of a
208*4d7e907cSAndroid Build Coastguard Worker         * HW clock that is not continuously on, see the
209*4d7e907cSAndroid Build Coastguard Worker         * hwClockDiscontinuityCount field). The receiver's estimate of GNSS time
210*4d7e907cSAndroid Build Coastguard Worker         * can be derived by subtracting the sum of fullBiasNs and biasNs (when
211*4d7e907cSAndroid Build Coastguard Worker         * available) from this value.
212*4d7e907cSAndroid Build Coastguard Worker         *
213*4d7e907cSAndroid Build Coastguard Worker         * This GNSS time must be the best estimate of current GNSS time
214*4d7e907cSAndroid Build Coastguard Worker         * that GNSS receiver can achieve.
215*4d7e907cSAndroid Build Coastguard Worker         *
216*4d7e907cSAndroid Build Coastguard Worker         * Sub-nanosecond accuracy can be provided by means of the 'biasNs' field.
217*4d7e907cSAndroid Build Coastguard Worker         * The value contains the timeUncertaintyNs in it.
218*4d7e907cSAndroid Build Coastguard Worker         *
219*4d7e907cSAndroid Build Coastguard Worker         * This value is mandatory.
220*4d7e907cSAndroid Build Coastguard Worker         */
221*4d7e907cSAndroid Build Coastguard Worker        int64_t timeNs;
222*4d7e907cSAndroid Build Coastguard Worker
223*4d7e907cSAndroid Build Coastguard Worker        /**
224*4d7e907cSAndroid Build Coastguard Worker         * 1-Sigma uncertainty associated with the clock's time in nanoseconds.
225*4d7e907cSAndroid Build Coastguard Worker         * The uncertainty is represented as an absolute (single sided) value.
226*4d7e907cSAndroid Build Coastguard Worker         *
227*4d7e907cSAndroid Build Coastguard Worker         * If the data is available, gnssClockFlags must contain
228*4d7e907cSAndroid Build Coastguard Worker         * HAS_TIME_UNCERTAINTY. Ths value is ideally zero, as the time
229*4d7e907cSAndroid Build Coastguard Worker         * 'latched' by timeNs is defined as the reference clock vs. which all
230*4d7e907cSAndroid Build Coastguard Worker         * other times (and corresponding uncertainties) are measured.
231*4d7e907cSAndroid Build Coastguard Worker         */
232*4d7e907cSAndroid Build Coastguard Worker        double timeUncertaintyNs;
233*4d7e907cSAndroid Build Coastguard Worker
234*4d7e907cSAndroid Build Coastguard Worker        /**
235*4d7e907cSAndroid Build Coastguard Worker         * The difference between hardware clock ('time' field) inside GNSS receiver
236*4d7e907cSAndroid Build Coastguard Worker         * and the true GPS time since 0000Z, January 6, 1980, in nanoseconds.
237*4d7e907cSAndroid Build Coastguard Worker         *
238*4d7e907cSAndroid Build Coastguard Worker         * The sign of the value is defined by the following equation:
239*4d7e907cSAndroid Build Coastguard Worker         *      local estimate of GPS time = timeNs - (fullBiasNs + biasNs)
240*4d7e907cSAndroid Build Coastguard Worker         *
241*4d7e907cSAndroid Build Coastguard Worker         * If receiver has computed time for a non-GPS constellation, the time offset of
242*4d7e907cSAndroid Build Coastguard Worker         * that constellation versus GPS time must be applied to fill this value.
243*4d7e907cSAndroid Build Coastguard Worker         *
244*4d7e907cSAndroid Build Coastguard Worker         * The error estimate for the sum of this and the biasNs is the biasUncertaintyNs.
245*4d7e907cSAndroid Build Coastguard Worker         *
246*4d7e907cSAndroid Build Coastguard Worker         * If the data is available gnssClockFlags must contain HAS_FULL_BIAS.
247*4d7e907cSAndroid Build Coastguard Worker         *
248*4d7e907cSAndroid Build Coastguard Worker         * This value is mandatory if the receiver has estimated GPS time.
249*4d7e907cSAndroid Build Coastguard Worker         */
250*4d7e907cSAndroid Build Coastguard Worker        int64_t fullBiasNs;
251*4d7e907cSAndroid Build Coastguard Worker
252*4d7e907cSAndroid Build Coastguard Worker        /**
253*4d7e907cSAndroid Build Coastguard Worker         * Sub-nanosecond bias - used with fullBiasNS, see fullBiasNs for details.
254*4d7e907cSAndroid Build Coastguard Worker         *
255*4d7e907cSAndroid Build Coastguard Worker         * The error estimate for the sum of this and the fullBiasNs is the
256*4d7e907cSAndroid Build Coastguard Worker         * biasUncertaintyNs.
257*4d7e907cSAndroid Build Coastguard Worker         *
258*4d7e907cSAndroid Build Coastguard Worker         * If the data is available gnssClockFlags must contain HAS_BIAS.
259*4d7e907cSAndroid Build Coastguard Worker         *
260*4d7e907cSAndroid Build Coastguard Worker         * This value is mandatory if the receiver has estimated GPS time.
261*4d7e907cSAndroid Build Coastguard Worker         */
262*4d7e907cSAndroid Build Coastguard Worker        double biasNs;
263*4d7e907cSAndroid Build Coastguard Worker
264*4d7e907cSAndroid Build Coastguard Worker        /**
265*4d7e907cSAndroid Build Coastguard Worker         * 1-Sigma uncertainty associated with the local estimate of GNSS time (clock
266*4d7e907cSAndroid Build Coastguard Worker         * bias) in nanoseconds. The uncertainty is represented as an absolute
267*4d7e907cSAndroid Build Coastguard Worker         * (single sided) value.
268*4d7e907cSAndroid Build Coastguard Worker         *
269*4d7e907cSAndroid Build Coastguard Worker         * The caller is responsible for using this uncertainty (it can be very
270*4d7e907cSAndroid Build Coastguard Worker         * large before the GPS time has been fully resolved.)
271*4d7e907cSAndroid Build Coastguard Worker         *
272*4d7e907cSAndroid Build Coastguard Worker         * If the data is available gnssClockFlags must contain HAS_BIAS_UNCERTAINTY.
273*4d7e907cSAndroid Build Coastguard Worker         *
274*4d7e907cSAndroid Build Coastguard Worker         * This value is mandatory if the receiver has estimated GPS time.
275*4d7e907cSAndroid Build Coastguard Worker         */
276*4d7e907cSAndroid Build Coastguard Worker        double biasUncertaintyNs;
277*4d7e907cSAndroid Build Coastguard Worker
278*4d7e907cSAndroid Build Coastguard Worker        /**
279*4d7e907cSAndroid Build Coastguard Worker         * The clock's drift in nanoseconds (per second).
280*4d7e907cSAndroid Build Coastguard Worker         *
281*4d7e907cSAndroid Build Coastguard Worker         * A positive value means that the frequency is higher than the nominal
282*4d7e907cSAndroid Build Coastguard Worker         * frequency, and that the (fullBiasNs + biasNs) is growing more positive
283*4d7e907cSAndroid Build Coastguard Worker         * over time.
284*4d7e907cSAndroid Build Coastguard Worker         *
285*4d7e907cSAndroid Build Coastguard Worker         * If the data is available gnssClockFlags must contain HAS_DRIFT.
286*4d7e907cSAndroid Build Coastguard Worker         *
287*4d7e907cSAndroid Build Coastguard Worker         * This value is mandatory if the receiver has estimated GPS time.
288*4d7e907cSAndroid Build Coastguard Worker         */
289*4d7e907cSAndroid Build Coastguard Worker        double driftNsps;
290*4d7e907cSAndroid Build Coastguard Worker
291*4d7e907cSAndroid Build Coastguard Worker        /**
292*4d7e907cSAndroid Build Coastguard Worker         * 1-Sigma uncertainty associated with the clock's drift in nanoseconds (per
293*4d7e907cSAndroid Build Coastguard Worker         * second).
294*4d7e907cSAndroid Build Coastguard Worker         * The uncertainty is represented as an absolute (single sided) value.
295*4d7e907cSAndroid Build Coastguard Worker         *
296*4d7e907cSAndroid Build Coastguard Worker         * If the data is available gnssClockFlags must contain HAS_DRIFT_UNCERTAINTY.
297*4d7e907cSAndroid Build Coastguard Worker         *
298*4d7e907cSAndroid Build Coastguard Worker         * This value is mandatory if the receiver has estimated GPS time.
299*4d7e907cSAndroid Build Coastguard Worker         */
300*4d7e907cSAndroid Build Coastguard Worker        double driftUncertaintyNsps;
301*4d7e907cSAndroid Build Coastguard Worker
302*4d7e907cSAndroid Build Coastguard Worker        /**
303*4d7e907cSAndroid Build Coastguard Worker         * This field must be incremented, when there are discontinuities in the
304*4d7e907cSAndroid Build Coastguard Worker         * hardware clock.
305*4d7e907cSAndroid Build Coastguard Worker         *
306*4d7e907cSAndroid Build Coastguard Worker         * A "discontinuity" is meant to cover the case of a switch from one source
307*4d7e907cSAndroid Build Coastguard Worker         * of clock to another.  A single free-running crystal oscillator (XO)
308*4d7e907cSAndroid Build Coastguard Worker         * will generally not have any discontinuities, and this can be set and
309*4d7e907cSAndroid Build Coastguard Worker         * left at 0.
310*4d7e907cSAndroid Build Coastguard Worker         *
311*4d7e907cSAndroid Build Coastguard Worker         * If, however, the timeNs value (HW clock) is derived from a composite of
312*4d7e907cSAndroid Build Coastguard Worker         * sources, that is not as smooth as a typical XO, or is otherwise stopped &
313*4d7e907cSAndroid Build Coastguard Worker         * restarted, then this value shall be incremented each time a discontinuity
314*4d7e907cSAndroid Build Coastguard Worker         * occurs.  (E.g. this value can start at zero at device boot-up and
315*4d7e907cSAndroid Build Coastguard Worker         * increment each time there is a change in clock continuity. In the
316*4d7e907cSAndroid Build Coastguard Worker         * unlikely event that this value reaches full scale, rollover (not
317*4d7e907cSAndroid Build Coastguard Worker         * clamping) is required, such that this value continues to change, during
318*4d7e907cSAndroid Build Coastguard Worker         * subsequent discontinuity events.)
319*4d7e907cSAndroid Build Coastguard Worker         *
320*4d7e907cSAndroid Build Coastguard Worker         * While this number stays the same, between GnssClock reports, it can be
321*4d7e907cSAndroid Build Coastguard Worker         * safely assumed that the timeNs value has been running continuously, e.g.
322*4d7e907cSAndroid Build Coastguard Worker         * derived from a single, high quality clock (XO like, or better, that is
323*4d7e907cSAndroid Build Coastguard Worker         * typically used during continuous GNSS signal sampling.)
324*4d7e907cSAndroid Build Coastguard Worker         *
325*4d7e907cSAndroid Build Coastguard Worker         * It is expected, esp. during periods where there are few GNSS signals
326*4d7e907cSAndroid Build Coastguard Worker         * available, that the HW clock be discontinuity-free as long as possible,
327*4d7e907cSAndroid Build Coastguard Worker         * as this avoids the need to use (waste) a GNSS measurement to fully
328*4d7e907cSAndroid Build Coastguard Worker         * re-solve for the GNSS clock bias and drift, when using the accompanying
329*4d7e907cSAndroid Build Coastguard Worker         * measurements, from consecutive GnssData reports.
330*4d7e907cSAndroid Build Coastguard Worker         *
331*4d7e907cSAndroid Build Coastguard Worker         * This value is mandatory.
332*4d7e907cSAndroid Build Coastguard Worker         */
333*4d7e907cSAndroid Build Coastguard Worker        uint32_t hwClockDiscontinuityCount;
334*4d7e907cSAndroid Build Coastguard Worker
335*4d7e907cSAndroid Build Coastguard Worker    };
336*4d7e907cSAndroid Build Coastguard Worker
337*4d7e907cSAndroid Build Coastguard Worker    /**
338*4d7e907cSAndroid Build Coastguard Worker     * Represents a GNSS Measurement, it contains raw and computed information.
339*4d7e907cSAndroid Build Coastguard Worker     *
340*4d7e907cSAndroid Build Coastguard Worker     * All signal measurement information (e.g. svTime,
341*4d7e907cSAndroid Build Coastguard Worker     * pseudorangeRate, multipathIndicator) reported in this struct must be
342*4d7e907cSAndroid Build Coastguard Worker     * based on GNSS signal measurements only. You must not synthesize measurements
343*4d7e907cSAndroid Build Coastguard Worker     * by calculating or reporting expected measurements based on known or estimated
344*4d7e907cSAndroid Build Coastguard Worker     * position, velocity, or time.
345*4d7e907cSAndroid Build Coastguard Worker     */
346*4d7e907cSAndroid Build Coastguard Worker    struct GnssMeasurement{
347*4d7e907cSAndroid Build Coastguard Worker        /**
348*4d7e907cSAndroid Build Coastguard Worker         * A set of flags indicating the validity of the fields in this data
349*4d7e907cSAndroid Build Coastguard Worker         * structure.
350*4d7e907cSAndroid Build Coastguard Worker         *
351*4d7e907cSAndroid Build Coastguard Worker         * Fields for which there is no corresponding flag must be filled in
352*4d7e907cSAndroid Build Coastguard Worker         * with a valid value.  For convenience, these are marked as mandatory.
353*4d7e907cSAndroid Build Coastguard Worker         *
354*4d7e907cSAndroid Build Coastguard Worker         * Others fields may have invalid information in them, if not marked as
355*4d7e907cSAndroid Build Coastguard Worker         * valid by the corresponding bit in flags.
356*4d7e907cSAndroid Build Coastguard Worker         */
357*4d7e907cSAndroid Build Coastguard Worker        bitfield<GnssMeasurementFlags> flags;
358*4d7e907cSAndroid Build Coastguard Worker
359*4d7e907cSAndroid Build Coastguard Worker        /**
360*4d7e907cSAndroid Build Coastguard Worker         * Satellite vehicle ID number, as defined in GnssSvInfo::svid
361*4d7e907cSAndroid Build Coastguard Worker         *
362*4d7e907cSAndroid Build Coastguard Worker         * This value is mandatory.
363*4d7e907cSAndroid Build Coastguard Worker         */
364*4d7e907cSAndroid Build Coastguard Worker        int16_t svid;
365*4d7e907cSAndroid Build Coastguard Worker
366*4d7e907cSAndroid Build Coastguard Worker        /**
367*4d7e907cSAndroid Build Coastguard Worker         * Defines the constellation of the given SV.
368*4d7e907cSAndroid Build Coastguard Worker         *
369*4d7e907cSAndroid Build Coastguard Worker         * This value is mandatory.
370*4d7e907cSAndroid Build Coastguard Worker         */
371*4d7e907cSAndroid Build Coastguard Worker        GnssConstellationType constellation;
372*4d7e907cSAndroid Build Coastguard Worker
373*4d7e907cSAndroid Build Coastguard Worker        /**
374*4d7e907cSAndroid Build Coastguard Worker         * Time offset at which the measurement was taken in nanoseconds.
375*4d7e907cSAndroid Build Coastguard Worker         * The reference receiver's time is specified by GnssData::clock::timeNs.
376*4d7e907cSAndroid Build Coastguard Worker         *
377*4d7e907cSAndroid Build Coastguard Worker         * The sign of timeOffsetNs is given by the following equation:
378*4d7e907cSAndroid Build Coastguard Worker         *      measurement time = GnssClock::timeNs + timeOffsetNs
379*4d7e907cSAndroid Build Coastguard Worker         *
380*4d7e907cSAndroid Build Coastguard Worker         * It provides an individual time-stamp for the measurement, and allows
381*4d7e907cSAndroid Build Coastguard Worker         * sub-nanosecond accuracy. It may be zero if all measurements are
382*4d7e907cSAndroid Build Coastguard Worker         * aligned to a common time.
383*4d7e907cSAndroid Build Coastguard Worker         *
384*4d7e907cSAndroid Build Coastguard Worker         * This value is mandatory.
385*4d7e907cSAndroid Build Coastguard Worker         */
386*4d7e907cSAndroid Build Coastguard Worker        double timeOffsetNs;
387*4d7e907cSAndroid Build Coastguard Worker
388*4d7e907cSAndroid Build Coastguard Worker        /**
389*4d7e907cSAndroid Build Coastguard Worker         * Per satellite sync state. It represents the current sync state for the
390*4d7e907cSAndroid Build Coastguard Worker         * associated satellite.
391*4d7e907cSAndroid Build Coastguard Worker         * Based on the sync state, the 'received GNSS tow' field must be interpreted
392*4d7e907cSAndroid Build Coastguard Worker         * accordingly.
393*4d7e907cSAndroid Build Coastguard Worker         *
394*4d7e907cSAndroid Build Coastguard Worker         * This value is mandatory.
395*4d7e907cSAndroid Build Coastguard Worker         */
396*4d7e907cSAndroid Build Coastguard Worker        bitfield<GnssMeasurementState> state;
397*4d7e907cSAndroid Build Coastguard Worker
398*4d7e907cSAndroid Build Coastguard Worker        /**
399*4d7e907cSAndroid Build Coastguard Worker         * The received GNSS Time-of-Week at the measurement time, in nanoseconds.
400*4d7e907cSAndroid Build Coastguard Worker         * For GNSS & QZSS, this is the received GNSS Time-of-Week at the
401*4d7e907cSAndroid Build Coastguard Worker         * measurement time, in nanoseconds. The value is relative to the
402*4d7e907cSAndroid Build Coastguard Worker         * beginning of the current GNSS week.
403*4d7e907cSAndroid Build Coastguard Worker         *
404*4d7e907cSAndroid Build Coastguard Worker         * Given the highest sync state that can be achieved, per each satellite,
405*4d7e907cSAndroid Build Coastguard Worker         * valid range for this field can be:
406*4d7e907cSAndroid Build Coastguard Worker         * Searching       : [ 0       ] : STATE_UNKNOWN
407*4d7e907cSAndroid Build Coastguard Worker         * C/A code lock   : [ 0 1ms   ] : STATE_CODE_LOCK set
408*4d7e907cSAndroid Build Coastguard Worker         * Bit sync        : [ 0 20ms  ] : STATE_BIT_SYNC set
409*4d7e907cSAndroid Build Coastguard Worker         * Subframe sync   : [ 0  6s   ] : STATE_SUBFRAME_SYNC set
410*4d7e907cSAndroid Build Coastguard Worker         * TOW decoded     : [ 0 1week ] : STATE_TOW_DECODED set
411*4d7e907cSAndroid Build Coastguard Worker         * TOW Known       : [ 0 1week ] : STATE_TOW_KNOWN set
412*4d7e907cSAndroid Build Coastguard Worker         *
413*4d7e907cSAndroid Build Coastguard Worker         * Note: TOW Known refers to the case where TOW is possibly not decoded
414*4d7e907cSAndroid Build Coastguard Worker         * over the air but has been determined from other sources. If TOW
415*4d7e907cSAndroid Build Coastguard Worker         * decoded is set then TOW Known must also be set.
416*4d7e907cSAndroid Build Coastguard Worker         *
417*4d7e907cSAndroid Build Coastguard Worker         * Note: If there is any ambiguity in integer millisecond,
418*4d7e907cSAndroid Build Coastguard Worker         * GNSS_MEASUREMENT_STATE_MSEC_AMBIGUOUS must be set accordingly, in the
419*4d7e907cSAndroid Build Coastguard Worker         * 'state' field.
420*4d7e907cSAndroid Build Coastguard Worker         *
421*4d7e907cSAndroid Build Coastguard Worker         * This value must be populated if 'state' != STATE_UNKNOWN.
422*4d7e907cSAndroid Build Coastguard Worker         *
423*4d7e907cSAndroid Build Coastguard Worker         * For Glonass, this is the received Glonass time of day, at the
424*4d7e907cSAndroid Build Coastguard Worker         * measurement time in nanoseconds.
425*4d7e907cSAndroid Build Coastguard Worker         *
426*4d7e907cSAndroid Build Coastguard Worker         * Given the highest sync state that can be achieved, per each satellite,
427*4d7e907cSAndroid Build Coastguard Worker         * valid range for this field can be:
428*4d7e907cSAndroid Build Coastguard Worker         * Searching           : [ 0       ] : STATE_UNKNOWN set
429*4d7e907cSAndroid Build Coastguard Worker         * C/A code lock       : [ 0   1ms ] : STATE_CODE_LOCK set
430*4d7e907cSAndroid Build Coastguard Worker         * Symbol sync         : [ 0  10ms ] : STATE_SYMBOL_SYNC set
431*4d7e907cSAndroid Build Coastguard Worker         * Bit sync            : [ 0  20ms ] : STATE_BIT_SYNC set
432*4d7e907cSAndroid Build Coastguard Worker         * String sync         : [ 0    2s ] : STATE_GLO_STRING_SYNC set
433*4d7e907cSAndroid Build Coastguard Worker         * Time of day decoded : [ 0  1day ] : STATE_GLO_TOD_DECODED set
434*4d7e907cSAndroid Build Coastguard Worker         * Time of day known   : [ 0  1day ] : STATE_GLO_TOD_KNOWN set
435*4d7e907cSAndroid Build Coastguard Worker         *
436*4d7e907cSAndroid Build Coastguard Worker         * Note: Time of day known refers to the case where it is possibly not
437*4d7e907cSAndroid Build Coastguard Worker         * decoded over the air but has been determined from other sources. If
438*4d7e907cSAndroid Build Coastguard Worker         * Time of day decoded is set then Time of day known must also be set.
439*4d7e907cSAndroid Build Coastguard Worker         *
440*4d7e907cSAndroid Build Coastguard Worker         * For Beidou, this is the received Beidou time of week,
441*4d7e907cSAndroid Build Coastguard Worker         * at the measurement time in nanoseconds.
442*4d7e907cSAndroid Build Coastguard Worker         *
443*4d7e907cSAndroid Build Coastguard Worker         * Given the highest sync state that can be achieved, per each satellite,
444*4d7e907cSAndroid Build Coastguard Worker         * valid range for this field can be:
445*4d7e907cSAndroid Build Coastguard Worker         * Searching            : [ 0       ] : STATE_UNKNOWN set.
446*4d7e907cSAndroid Build Coastguard Worker         * C/A code lock        : [ 0   1ms ] : STATE_CODE_LOCK set.
447*4d7e907cSAndroid Build Coastguard Worker         * Bit sync (D2)        : [ 0   2ms ] : STATE_BDS_D2_BIT_SYNC set.
448*4d7e907cSAndroid Build Coastguard Worker         * Bit sync (D1)        : [ 0  20ms ] : STATE_BIT_SYNC set.
449*4d7e907cSAndroid Build Coastguard Worker         * Subframe (D2)        : [ 0  0.6s ] : STATE_BDS_D2_SUBFRAME_SYNC set.
450*4d7e907cSAndroid Build Coastguard Worker         * Subframe (D1)        : [ 0    6s ] : STATE_SUBFRAME_SYNC set.
451*4d7e907cSAndroid Build Coastguard Worker         * Time of week decoded : [ 0 1week ] : STATE_TOW_DECODED set.
452*4d7e907cSAndroid Build Coastguard Worker         * Time of week known   : [ 0 1week ] : STATE_TOW_KNOWN set
453*4d7e907cSAndroid Build Coastguard Worker         *
454*4d7e907cSAndroid Build Coastguard Worker         * Note: TOW Known refers to the case where TOW is possibly not decoded
455*4d7e907cSAndroid Build Coastguard Worker         * over the air but has been determined from other sources. If TOW
456*4d7e907cSAndroid Build Coastguard Worker         * decoded is set then TOW Known must also be set.
457*4d7e907cSAndroid Build Coastguard Worker         *
458*4d7e907cSAndroid Build Coastguard Worker         * For Galileo, this is the received Galileo time of week,
459*4d7e907cSAndroid Build Coastguard Worker         * at the measurement time in nanoseconds.
460*4d7e907cSAndroid Build Coastguard Worker         *
461*4d7e907cSAndroid Build Coastguard Worker         * E1BC code lock       : [ 0  4ms ] : STATE_GAL_E1BC_CODE_LOCK set.
462*4d7e907cSAndroid Build Coastguard Worker         * E1C 2nd code lock    : [ 0 100ms] : STATE_GAL_E1C_2ND_CODE_LOCK set.
463*4d7e907cSAndroid Build Coastguard Worker         * E1B page             : [ 0   2s ] : STATE_GAL_E1B_PAGE_SYNC set.
464*4d7e907cSAndroid Build Coastguard Worker         * Time of week decoded : [ 0 1week] : STATE_TOW_DECODED is set.
465*4d7e907cSAndroid Build Coastguard Worker         * Time of week known   : [ 0 1week] : STATE_TOW_KNOWN set
466*4d7e907cSAndroid Build Coastguard Worker         *
467*4d7e907cSAndroid Build Coastguard Worker         * Note: TOW Known refers to the case where TOW is possibly not decoded
468*4d7e907cSAndroid Build Coastguard Worker         * over the air but has been determined from other sources. If TOW
469*4d7e907cSAndroid Build Coastguard Worker         * decoded is set then TOW Known must also be set.
470*4d7e907cSAndroid Build Coastguard Worker         *
471*4d7e907cSAndroid Build Coastguard Worker         * For SBAS, this is received SBAS time, at the measurement time in
472*4d7e907cSAndroid Build Coastguard Worker         * nanoseconds.
473*4d7e907cSAndroid Build Coastguard Worker         *
474*4d7e907cSAndroid Build Coastguard Worker         * Given the highest sync state that can be achieved, per each satellite,
475*4d7e907cSAndroid Build Coastguard Worker         * valid range for this field can be:
476*4d7e907cSAndroid Build Coastguard Worker         * Searching    : [ 0     ] : STATE_UNKNOWN
477*4d7e907cSAndroid Build Coastguard Worker         * C/A code lock: [ 0 1ms ] : STATE_CODE_LOCK is set
478*4d7e907cSAndroid Build Coastguard Worker         * Symbol sync  : [ 0 2ms ] : STATE_SYMBOL_SYNC is set
479*4d7e907cSAndroid Build Coastguard Worker         * Message      : [ 0  1s ] : STATE_SBAS_SYNC is set
480*4d7e907cSAndroid Build Coastguard Worker         */
481*4d7e907cSAndroid Build Coastguard Worker        int64_t receivedSvTimeInNs;
482*4d7e907cSAndroid Build Coastguard Worker
483*4d7e907cSAndroid Build Coastguard Worker        /**
484*4d7e907cSAndroid Build Coastguard Worker         * 1-Sigma uncertainty of the Received GNSS Time-of-Week in nanoseconds.
485*4d7e907cSAndroid Build Coastguard Worker         *
486*4d7e907cSAndroid Build Coastguard Worker         * This value must be populated if 'state' != STATE_UNKNOWN.
487*4d7e907cSAndroid Build Coastguard Worker         */
488*4d7e907cSAndroid Build Coastguard Worker        int64_t receivedSvTimeUncertaintyInNs;
489*4d7e907cSAndroid Build Coastguard Worker
490*4d7e907cSAndroid Build Coastguard Worker        /**
491*4d7e907cSAndroid Build Coastguard Worker         * Carrier-to-noise density in dB-Hz, typically in the range [0, 63].
492*4d7e907cSAndroid Build Coastguard Worker         * It contains the measured C/N0 value for the signal at the antenna port.
493*4d7e907cSAndroid Build Coastguard Worker         *
494*4d7e907cSAndroid Build Coastguard Worker         * If a signal has separate components (e.g. Pilot and Data channels) and
495*4d7e907cSAndroid Build Coastguard Worker         * the receiver only processes one of the components, then the reported
496*4d7e907cSAndroid Build Coastguard Worker         * cN0DbHz reflects only the component that is processed.
497*4d7e907cSAndroid Build Coastguard Worker         *
498*4d7e907cSAndroid Build Coastguard Worker         * This value is mandatory.
499*4d7e907cSAndroid Build Coastguard Worker         */
500*4d7e907cSAndroid Build Coastguard Worker        double cN0DbHz;
501*4d7e907cSAndroid Build Coastguard Worker
502*4d7e907cSAndroid Build Coastguard Worker        /**
503*4d7e907cSAndroid Build Coastguard Worker         * Pseudorange rate at the timestamp in m/s. The correction of a given
504*4d7e907cSAndroid Build Coastguard Worker         * Pseudorange Rate value includes corrections for receiver and satellite
505*4d7e907cSAndroid Build Coastguard Worker         * clock frequency errors. Ensure that this field is independent (see
506*4d7e907cSAndroid Build Coastguard Worker         * comment at top of GnssMeasurement struct.)
507*4d7e907cSAndroid Build Coastguard Worker         *
508*4d7e907cSAndroid Build Coastguard Worker         * It is mandatory to provide the 'uncorrected' 'pseudorange rate', and
509*4d7e907cSAndroid Build Coastguard Worker         * provide GnssClock's 'drift' field as well. When providing the
510*4d7e907cSAndroid Build Coastguard Worker         * uncorrected pseudorange rate, do not apply the corrections described above.)
511*4d7e907cSAndroid Build Coastguard Worker         *
512*4d7e907cSAndroid Build Coastguard Worker         * The value includes the 'pseudorange rate uncertainty' in it.
513*4d7e907cSAndroid Build Coastguard Worker         * A positive 'uncorrected' value indicates that the SV is moving away from
514*4d7e907cSAndroid Build Coastguard Worker         * the receiver.
515*4d7e907cSAndroid Build Coastguard Worker         *
516*4d7e907cSAndroid Build Coastguard Worker         * The sign of the 'uncorrected' 'pseudorange rate' and its relation to the
517*4d7e907cSAndroid Build Coastguard Worker         * sign of 'doppler shift' is given by the equation:
518*4d7e907cSAndroid Build Coastguard Worker         *      pseudorange rate = -k * doppler shift   (where k is a constant)
519*4d7e907cSAndroid Build Coastguard Worker         *
520*4d7e907cSAndroid Build Coastguard Worker         * This must be the most accurate pseudorange rate available, based on
521*4d7e907cSAndroid Build Coastguard Worker         * fresh signal measurements from this channel.
522*4d7e907cSAndroid Build Coastguard Worker         *
523*4d7e907cSAndroid Build Coastguard Worker         * It is mandatory that this value be provided at typical carrier phase PRR
524*4d7e907cSAndroid Build Coastguard Worker         * quality (few cm/sec per second of uncertainty, or better) - when signals
525*4d7e907cSAndroid Build Coastguard Worker         * are sufficiently strong & stable, e.g. signals from a GNSS simulator at >=
526*4d7e907cSAndroid Build Coastguard Worker         * 35 dB-Hz.
527*4d7e907cSAndroid Build Coastguard Worker         */
528*4d7e907cSAndroid Build Coastguard Worker        double pseudorangeRateMps;
529*4d7e907cSAndroid Build Coastguard Worker
530*4d7e907cSAndroid Build Coastguard Worker        /**
531*4d7e907cSAndroid Build Coastguard Worker         * 1-Sigma uncertainty of the pseudorangeRateMps.
532*4d7e907cSAndroid Build Coastguard Worker         * The uncertainty is represented as an absolute (single sided) value.
533*4d7e907cSAndroid Build Coastguard Worker         *
534*4d7e907cSAndroid Build Coastguard Worker         * This value is mandatory.
535*4d7e907cSAndroid Build Coastguard Worker         */
536*4d7e907cSAndroid Build Coastguard Worker        double pseudorangeRateUncertaintyMps;
537*4d7e907cSAndroid Build Coastguard Worker
538*4d7e907cSAndroid Build Coastguard Worker        /**
539*4d7e907cSAndroid Build Coastguard Worker         * Accumulated delta range's state. It indicates whether ADR is reset or
540*4d7e907cSAndroid Build Coastguard Worker         * there is a cycle slip(indicating loss of lock).
541*4d7e907cSAndroid Build Coastguard Worker         *
542*4d7e907cSAndroid Build Coastguard Worker         * This value is mandatory.
543*4d7e907cSAndroid Build Coastguard Worker         */
544*4d7e907cSAndroid Build Coastguard Worker        bitfield<GnssAccumulatedDeltaRangeState> accumulatedDeltaRangeState;
545*4d7e907cSAndroid Build Coastguard Worker
546*4d7e907cSAndroid Build Coastguard Worker        /**
547*4d7e907cSAndroid Build Coastguard Worker         * Accumulated delta range since the last channel reset in meters.
548*4d7e907cSAndroid Build Coastguard Worker         * A positive value indicates that the SV is moving away from the receiver.
549*4d7e907cSAndroid Build Coastguard Worker         *
550*4d7e907cSAndroid Build Coastguard Worker         * The sign of the 'accumulated delta range' and its relation to the sign of
551*4d7e907cSAndroid Build Coastguard Worker         * 'carrier phase' is given by the equation:
552*4d7e907cSAndroid Build Coastguard Worker         * accumulated delta range = -k * carrier phase (where k is a constant)
553*4d7e907cSAndroid Build Coastguard Worker         *
554*4d7e907cSAndroid Build Coastguard Worker         * This value must be populated if 'accumulated delta range state' !=
555*4d7e907cSAndroid Build Coastguard Worker         * ADR_STATE_UNKNOWN.
556*4d7e907cSAndroid Build Coastguard Worker         * However, it is expected that the data is only accurate when:
557*4d7e907cSAndroid Build Coastguard Worker         *      'accumulated delta range state' == ADR_STATE_VALID.
558*4d7e907cSAndroid Build Coastguard Worker         */
559*4d7e907cSAndroid Build Coastguard Worker        double accumulatedDeltaRangeM;
560*4d7e907cSAndroid Build Coastguard Worker
561*4d7e907cSAndroid Build Coastguard Worker        /**
562*4d7e907cSAndroid Build Coastguard Worker         * 1-Sigma uncertainty of the accumulated delta range in meters.
563*4d7e907cSAndroid Build Coastguard Worker         * This value must be populated if 'accumulated delta range state' !=
564*4d7e907cSAndroid Build Coastguard Worker         * ADR_STATE_UNKNOWN.
565*4d7e907cSAndroid Build Coastguard Worker         */
566*4d7e907cSAndroid Build Coastguard Worker        double accumulatedDeltaRangeUncertaintyM;
567*4d7e907cSAndroid Build Coastguard Worker
568*4d7e907cSAndroid Build Coastguard Worker        /**
569*4d7e907cSAndroid Build Coastguard Worker         * Carrier frequency of the signal tracked, for example it can be the
570*4d7e907cSAndroid Build Coastguard Worker         * GPS central frequency for L1 = 1575.45 MHz, or L2 = 1227.60 MHz, L5 =
571*4d7e907cSAndroid Build Coastguard Worker         * 1176.45 MHz, varying GLO channels, etc. If the field is not set, it
572*4d7e907cSAndroid Build Coastguard Worker         * is the primary common use central frequency, e.g. L1 = 1575.45 MHz
573*4d7e907cSAndroid Build Coastguard Worker         * for GPS.
574*4d7e907cSAndroid Build Coastguard Worker         *
575*4d7e907cSAndroid Build Coastguard Worker         * For an L1, L5 receiver tracking a satellite on L1 and L5 at the same
576*4d7e907cSAndroid Build Coastguard Worker         * time, two raw measurement structs must be reported for this same
577*4d7e907cSAndroid Build Coastguard Worker         * satellite, in one of the measurement structs, all the values related
578*4d7e907cSAndroid Build Coastguard Worker         * to L1 must be filled, and in the other all of the values related to
579*4d7e907cSAndroid Build Coastguard Worker         * L5 must be filled.
580*4d7e907cSAndroid Build Coastguard Worker         *
581*4d7e907cSAndroid Build Coastguard Worker         * If the data is available, gnssMeasurementFlags must contain
582*4d7e907cSAndroid Build Coastguard Worker         * HAS_CARRIER_FREQUENCY.
583*4d7e907cSAndroid Build Coastguard Worker         */
584*4d7e907cSAndroid Build Coastguard Worker        float carrierFrequencyHz;
585*4d7e907cSAndroid Build Coastguard Worker
586*4d7e907cSAndroid Build Coastguard Worker        /**
587*4d7e907cSAndroid Build Coastguard Worker         * The number of full carrier cycles between the satellite and the
588*4d7e907cSAndroid Build Coastguard Worker         * receiver. The reference frequency is given by the field
589*4d7e907cSAndroid Build Coastguard Worker         * 'carrierFrequencyHz'. Indications of possible cycle slips and
590*4d7e907cSAndroid Build Coastguard Worker         * resets in the accumulation of this value can be inferred from the
591*4d7e907cSAndroid Build Coastguard Worker         * accumulatedDeltaRangeState flags.
592*4d7e907cSAndroid Build Coastguard Worker         *
593*4d7e907cSAndroid Build Coastguard Worker         * If the data is available, gnssMeasurementFlags must contain
594*4d7e907cSAndroid Build Coastguard Worker         * HAS_CARRIER_CYCLES.
595*4d7e907cSAndroid Build Coastguard Worker         */
596*4d7e907cSAndroid Build Coastguard Worker        int64_t carrierCycles;
597*4d7e907cSAndroid Build Coastguard Worker
598*4d7e907cSAndroid Build Coastguard Worker        /**
599*4d7e907cSAndroid Build Coastguard Worker         * The RF phase detected by the receiver, in the range [0.0, 1.0].
600*4d7e907cSAndroid Build Coastguard Worker         * This is usually the fractional part of the complete carrier phase
601*4d7e907cSAndroid Build Coastguard Worker         * measurement.
602*4d7e907cSAndroid Build Coastguard Worker         *
603*4d7e907cSAndroid Build Coastguard Worker         * The reference frequency is given by the field 'carrierFrequencyHz'.
604*4d7e907cSAndroid Build Coastguard Worker         * The value contains the 'carrier-phase uncertainty' in it.
605*4d7e907cSAndroid Build Coastguard Worker         *
606*4d7e907cSAndroid Build Coastguard Worker         * If the data is available, gnssMeasurementFlags must contain
607*4d7e907cSAndroid Build Coastguard Worker         * HAS_CARRIER_PHASE.
608*4d7e907cSAndroid Build Coastguard Worker         */
609*4d7e907cSAndroid Build Coastguard Worker        double carrierPhase;
610*4d7e907cSAndroid Build Coastguard Worker
611*4d7e907cSAndroid Build Coastguard Worker        /**
612*4d7e907cSAndroid Build Coastguard Worker         * 1-Sigma uncertainty of the carrier-phase.
613*4d7e907cSAndroid Build Coastguard Worker         * If the data is available, gnssMeasurementFlags must contain
614*4d7e907cSAndroid Build Coastguard Worker         * HAS_CARRIER_PHASE_UNCERTAINTY.
615*4d7e907cSAndroid Build Coastguard Worker         */
616*4d7e907cSAndroid Build Coastguard Worker        double carrierPhaseUncertainty;
617*4d7e907cSAndroid Build Coastguard Worker
618*4d7e907cSAndroid Build Coastguard Worker        /**
619*4d7e907cSAndroid Build Coastguard Worker         * An enumeration that indicates the 'multipath' state of the event.
620*4d7e907cSAndroid Build Coastguard Worker         *
621*4d7e907cSAndroid Build Coastguard Worker         * The multipath Indicator is intended to report the presence of overlapping
622*4d7e907cSAndroid Build Coastguard Worker         * signals that manifest as distorted correlation peaks.
623*4d7e907cSAndroid Build Coastguard Worker         *
624*4d7e907cSAndroid Build Coastguard Worker         * - if there is a distorted correlation peak shape, report that multipath
625*4d7e907cSAndroid Build Coastguard Worker         *   is MULTIPATH_INDICATOR_PRESENT.
626*4d7e907cSAndroid Build Coastguard Worker         * - if there is no distorted correlation peak shape, report
627*4d7e907cSAndroid Build Coastguard Worker         *   MULTIPATH_INDICATOR_NOT_PRESENT
628*4d7e907cSAndroid Build Coastguard Worker         * - if signals are too weak to discern this information, report
629*4d7e907cSAndroid Build Coastguard Worker         *   MULTIPATH_INDICATOR_UNKNOWN
630*4d7e907cSAndroid Build Coastguard Worker         *
631*4d7e907cSAndroid Build Coastguard Worker         * Example: when doing the standardized overlapping Multipath Performance
632*4d7e907cSAndroid Build Coastguard Worker         * test (3GPP TS 34.171) the Multipath indicator must report
633*4d7e907cSAndroid Build Coastguard Worker         * MULTIPATH_INDICATOR_PRESENT for those signals that are tracked, and
634*4d7e907cSAndroid Build Coastguard Worker         * contain multipath, and MULTIPATH_INDICATOR_NOT_PRESENT for those
635*4d7e907cSAndroid Build Coastguard Worker         * signals that are tracked and do not contain multipath.
636*4d7e907cSAndroid Build Coastguard Worker         */
637*4d7e907cSAndroid Build Coastguard Worker        GnssMultipathIndicator multipathIndicator;
638*4d7e907cSAndroid Build Coastguard Worker
639*4d7e907cSAndroid Build Coastguard Worker        /**
640*4d7e907cSAndroid Build Coastguard Worker         * Signal-to-noise ratio at correlator output in dB.
641*4d7e907cSAndroid Build Coastguard Worker         * If the data is available, GnssMeasurementFlags must contain HAS_SNR.
642*4d7e907cSAndroid Build Coastguard Worker         * This is the power ratio of the "correlation peak height above the
643*4d7e907cSAndroid Build Coastguard Worker         * observed noise floor" to "the noise RMS".
644*4d7e907cSAndroid Build Coastguard Worker         */
645*4d7e907cSAndroid Build Coastguard Worker        double snrDb;
646*4d7e907cSAndroid Build Coastguard Worker
647*4d7e907cSAndroid Build Coastguard Worker
648*4d7e907cSAndroid Build Coastguard Worker    /**
649*4d7e907cSAndroid Build Coastguard Worker     * Automatic gain control (AGC) level. AGC acts as a variable gain amplifier adjusting the power
650*4d7e907cSAndroid Build Coastguard Worker     * of the incoming signal. The AGC level may be used to indicate potential interference. Higher
651*4d7e907cSAndroid Build Coastguard Worker     * gain (and/or lower input power) must be output as a positive number. Hence in cases of strong
652*4d7e907cSAndroid Build Coastguard Worker     * jamming, in the band of this signal, this value must go more negative. This value must be
653*4d7e907cSAndroid Build Coastguard Worker     * consistent given the same level of the incoming signal power.
654*4d7e907cSAndroid Build Coastguard Worker     *
655*4d7e907cSAndroid Build Coastguard Worker     * Note: Different hardware designs (e.g. antenna, pre-amplification, or other RF HW components)
656*4d7e907cSAndroid Build Coastguard Worker     * may also affect the typical output of this value on any given hardware design in an open sky
657*4d7e907cSAndroid Build Coastguard Worker     * test - the important aspect of this output is that changes in this value are indicative of
658*4d7e907cSAndroid Build Coastguard Worker     * changes on input signal power in the frequency band for this measurement.
659*4d7e907cSAndroid Build Coastguard Worker     */
660*4d7e907cSAndroid Build Coastguard Worker        double agcLevelDb;
661*4d7e907cSAndroid Build Coastguard Worker    };
662*4d7e907cSAndroid Build Coastguard Worker
663*4d7e907cSAndroid Build Coastguard Worker    /**
664*4d7e907cSAndroid Build Coastguard Worker     * Represents a reading of GNSS measurements. For devices where GnssSystemInfo's
665*4d7e907cSAndroid Build Coastguard Worker     * yearOfHw is set to 2016+, it is mandatory that these be provided, on
666*4d7e907cSAndroid Build Coastguard Worker     * request, when the GNSS receiver is searching/tracking signals.
667*4d7e907cSAndroid Build Coastguard Worker     *
668*4d7e907cSAndroid Build Coastguard Worker     * - Reporting of GNSS constellation measurements is mandatory.
669*4d7e907cSAndroid Build Coastguard Worker     * - Reporting of all tracked constellations are encouraged.
670*4d7e907cSAndroid Build Coastguard Worker     */
671*4d7e907cSAndroid Build Coastguard Worker    struct GnssData {
672*4d7e907cSAndroid Build Coastguard Worker        /** Number of GnssMeasurement elements. */
673*4d7e907cSAndroid Build Coastguard Worker        uint32_t measurementCount;
674*4d7e907cSAndroid Build Coastguard Worker
675*4d7e907cSAndroid Build Coastguard Worker        /** The array of measurements. */
676*4d7e907cSAndroid Build Coastguard Worker        GnssMeasurement[GnssMax:SVS_COUNT] measurements;
677*4d7e907cSAndroid Build Coastguard Worker
678*4d7e907cSAndroid Build Coastguard Worker        /** The GNSS clock time reading. */
679*4d7e907cSAndroid Build Coastguard Worker        GnssClock clock;
680*4d7e907cSAndroid Build Coastguard Worker    };
681*4d7e907cSAndroid Build Coastguard Worker
682*4d7e907cSAndroid Build Coastguard Worker    /**
683*4d7e907cSAndroid Build Coastguard Worker     * Callback for the hal to pass a GnssData structure back to the client.
684*4d7e907cSAndroid Build Coastguard Worker     *
685*4d7e907cSAndroid Build Coastguard Worker     * @param data Contains a reading of GNSS measurements.
686*4d7e907cSAndroid Build Coastguard Worker     */
687*4d7e907cSAndroid Build Coastguard Worker    GnssMeasurementCb(GnssData data);
688*4d7e907cSAndroid Build Coastguard Worker};
689