1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.hardware.gnss@1.0;
18
19/**
20 * The interface is required for the HAL to communicate certain information
21 * like status and location info back to the platform, the platform implements
22 * the interfaces and passes a handle to the HAL.
23 */
24interface IGnssCallback {
25    /** Flags for the gnssSetCapabilities callback. */
26    @export(name="", value_prefix="GPS_CAPABILITY_")
27    enum Capabilities : uint32_t {
28        /**
29         * GNSS HAL schedules fixes for RECURRENCE_PERIODIC mode.
30         * If this is not set, then the framework will use 1000ms for
31         * minInterval and will call start() and stop() to schedule the GNSS.
32         */
33        SCHEDULING                      = 1 << 0,
34        /** GNSS supports MS-Based AGNSS mode */
35        MSB                             = 1 << 1,
36        /** GNSS supports MS-Assisted AGNSS mode */
37        MSA                             = 1 << 2,
38        /** GNSS supports single-shot fixes */
39        SINGLE_SHOT                     = 1 << 3,
40        /**
41         * The platform periodically injects time to GNSS in addition to
42         * on-demand and occasional time updates.
43         *
44         * Note: The naming of "on demand" should be "periodic" instead.  This
45         * is the result of a historic implementation bug, b/73893222.
46         */
47        ON_DEMAND_TIME                  = 1 << 4,
48        /** GNSS supports Geofencing  */
49        GEOFENCING                      = 1 << 5,
50        /** GNSS supports Measurements for at least GPS. */
51        MEASUREMENTS                    = 1 << 6,
52        /** GNSS supports Navigation Messages */
53        NAV_MESSAGES                    = 1 << 7
54    };
55
56    /** GNSS status event values. */
57    @export(name="", value_prefix="GPS_STATUS_")
58    enum GnssStatusValue : uint8_t {
59        /** GNSS status unknown. */
60        NONE           = 0,
61        /** GNSS has begun navigating. */
62        SESSION_BEGIN  = 1,
63        /** GNSS has stopped navigating. */
64        SESSION_END    = 2,
65        /** GNSS has powered on but is not navigating. */
66        ENGINE_ON      = 3,
67        /** GNSS is powered off. */
68        ENGINE_OFF     = 4
69    };
70
71    /**
72     * Flags that indicate information about the satellite
73     */
74    @export(name="", value_prefix="GNSS_SV_FLAGS_")
75    enum GnssSvFlags : uint8_t {
76        NONE                  = 0,
77        HAS_EPHEMERIS_DATA    = 1 << 0,
78        HAS_ALMANAC_DATA      = 1 << 1,
79        USED_IN_FIX           = 1 << 2,
80        HAS_CARRIER_FREQUENCY = 1 << 3
81    };
82
83    struct GnssSvInfo {
84        /**
85         * Pseudo-random or satellite ID number for the satellite, a.k.a. Space Vehicle (SV), or
86         * FCN/OSN number for Glonass. The distinction is made by looking at constellation field.
87         * Values must be in the range of:
88         *
89         * - GNSS:    1-32
90         * - SBAS:    120-151, 183-192
91         * - GLONASS: 1-24, the orbital slot number (OSN), if known.  Or, if not:
92         *            93-106, the frequency channel number (FCN) (-7 to +6) offset by
93         *            + 100
94         *            i.e. report an FCN of -7 as 93, FCN of 0 as 100, and FCN of +6
95         *            as 106.
96         * - QZSS:    193-200
97         * - Galileo: 1-36
98         * - Beidou:  1-37
99         * - IRNSS:   1-14
100         */
101        int16_t svid;
102
103        /**
104         * Defines the constellation of the given SV.
105         */
106        GnssConstellationType constellation;
107
108        /**
109         * Carrier-to-noise density in dB-Hz, typically in the range [0, 63].
110         * It contains the measured C/N0 value for the signal at the antenna port.
111         *
112         * This is a mandatory value.
113         */
114        float cN0Dbhz;
115
116        /** Elevation of SV in degrees. */
117        float elevationDegrees;
118
119        /** Azimuth of SV in degrees. */
120        float azimuthDegrees;
121
122        /**
123         * Carrier frequency of the signal tracked, for example it can be the
124         * GPS central frequency for L1 = 1575.45 MHz, or L2 = 1227.60 MHz, L5 =
125         * 1176.45 MHz, varying GLO channels, etc. If the field is zero, it is
126         * the primary common use central frequency, e.g. L1 = 1575.45 MHz for
127         * GPS.
128         *
129         * For an L1, L5 receiver tracking a satellite on L1 and L5 at the same
130         * time, two GnssSvInfo structs must be reported for this same
131         * satellite, in one of the structs, all the values related
132         * to L1 must be filled, and in the other all of the values related to
133         * L5 must be filled.
134         *
135         * If the data is available, svFlag must contain HAS_CARRIER_FREQUENCY.
136         */
137        float carrierFrequencyHz;
138
139        /**
140         * Contains additional data about the given SV.
141         */
142        bitfield<GnssSvFlags> svFlag;
143    };
144
145    /**
146     * Represents SV status.
147     */
148    struct GnssSvStatus {
149        /**
150         * Number of GNSS SVs currently visible, refers to the SVs stored in sv_list
151         */
152        uint32_t numSvs;
153
154        /**
155         * Pointer to an array of SVs information for all GNSS constellations,
156         * except GNSS, which is reported using svList
157         */
158        GnssSvInfo[GnssMax:SVS_COUNT] gnssSvList;
159
160    };
161
162    /**
163     * Called when a GNSS location is available.
164     *
165     * @param location Location information from HAL.
166     */
167    gnssLocationCb(GnssLocation location);
168
169    /**
170     * Called to communicate the status of the GNSS engine.
171     *
172     * @param status Status information from HAL.
173     */
174    gnssStatusCb(GnssStatusValue status);
175
176    /**
177     * @param svInfo SV status information from HAL.
178     */
179    gnssSvStatusCb(GnssSvStatus svInfo);
180
181    /**
182     * Called when NMEA data is available.
183     * Callback for reporting NMEA sentences.
184     *
185     * @param timestamp Marks the instance of reporting.
186     * @param nmea Follows standard NMEA 0183. Each sentence begins with a '$'
187     * and ends with a carriage return/line feed sequence and can be no longer
188     * than 80 characters of visible text (plus the line terminators). The data
189     * is contained within this single line with data items separated by commas.
190     * The data itself is just ascii text and may extend over multiple sentences
191     * in certain specialized instances but is normally fully contained in one
192     * variable length sentence. The data may vary in the amount of precision
193     * contained in the message. For example time might be indicated to decimal
194     * parts of a second or location may be shown with 3 or even 4 digits after
195     * the decimal point. Programs that read the data must only use the commas
196     * to determine the field boundaries and not depend on column positions.
197     * There is a provision for a checksum at the end of each sentence which may
198     * or may not be checked by the unit that reads the data. The checksum field
199     * consists of a '*' and two hex digits representing an 8 bit exclusive OR
200     * of all characters between, but not including, the '$' and '*'.
201     */
202    gnssNmeaCb(GnssUtcTime timestamp, string nmea);
203
204    /**
205     * Callback to inform framework of the GNSS engine's capabilities.
206     *
207     * @param capabilities Capability parameter is a bit field of
208     * the Capabilities enum.
209     */
210    gnssSetCapabilitesCb(bitfield<Capabilities> capabilities);
211
212    /**
213     * Callback utility for acquiring the GNSS wakelock. This can be used to prevent
214     * the CPU from suspending while handling GNSS events.
215     */
216    gnssAcquireWakelockCb();
217
218    /** Callback utility for releasing the GNSS wakelock. */
219    gnssReleaseWakelockCb();
220
221    /** Callback for requesting NTP time */
222    gnssRequestTimeCb();
223
224    /**
225     * Provides information about how new the underlying GPS/GNSS hardware and
226     * software is.
227     *
228     * This information will be available for Android Test Applications. If a GNSS
229     * HAL does not provide this information, it will be considered "2015 or
230     * earlier".
231     *
232     * If a GNSS HAL does provide this information, then newer years will need to
233     * meet newer CTS standards. E.g. if the date are 2016 or above, then N+ level
234     * GnssMeasurement support will be verified.
235     */
236    struct GnssSystemInfo{
237        /**
238         * year in which the last update was made to the underlying hardware/firmware
239         * used to capture GNSS signals, e.g. 2016
240         */
241        uint16_t yearOfHw;
242    };
243
244    /**
245     * Callback to inform framework of the engine's hardware version information.
246     *
247     * @param info GnssSystemInfo about the GPS/GNSS hardware.
248     */
249    gnssSetSystemInfoCb(GnssSystemInfo info);
250};
251