Home | History | Annotate | Download | only in hardware
      1 /*
      2  * Copyright (C) 2010 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 
     17 #ifndef ANDROID_INCLUDE_HARDWARE_GPS_H
     18 #define ANDROID_INCLUDE_HARDWARE_GPS_H
     19 
     20 #include <stdint.h>
     21 #include <sys/cdefs.h>
     22 #include <sys/types.h>
     23 #include <pthread.h>
     24 #include <sys/socket.h>
     25 #include <stdbool.h>
     26 
     27 #include <hardware/hardware.h>
     28 
     29 __BEGIN_DECLS
     30 
     31 /**
     32  * The id of this module
     33  */
     34 #define GPS_HARDWARE_MODULE_ID "gps"
     35 
     36 
     37 /** Milliseconds since January 1, 1970 */
     38 typedef int64_t GpsUtcTime;
     39 
     40 /** Maximum number of SVs for gps_sv_status_callback(). */
     41 #define GPS_MAX_SVS 32
     42 /** Maximum number of SVs for gps_sv_status_callback(). */
     43 #define GNSS_MAX_SVS 64
     44 
     45 /** Maximum number of Measurements in gps_measurement_callback(). */
     46 #define GPS_MAX_MEASUREMENT   32
     47 
     48 /** Maximum number of Measurements in gnss_measurement_callback(). */
     49 #define GNSS_MAX_MEASUREMENT   64
     50 
     51 /** Requested operational mode for GPS operation. */
     52 typedef uint32_t GpsPositionMode;
     53 /* IMPORTANT: Note that the following values must match
     54  * constants in GpsLocationProvider.java. */
     55 /** Mode for running GPS standalone (no assistance). */
     56 #define GPS_POSITION_MODE_STANDALONE    0
     57 /** AGPS MS-Based mode. */
     58 #define GPS_POSITION_MODE_MS_BASED      1
     59 /**
     60  * AGPS MS-Assisted mode. This mode is not maintained by the platform anymore.
     61  * It is strongly recommended to use GPS_POSITION_MODE_MS_BASED instead.
     62  */
     63 #define GPS_POSITION_MODE_MS_ASSISTED   2
     64 
     65 /** Requested recurrence mode for GPS operation. */
     66 typedef uint32_t GpsPositionRecurrence;
     67 /* IMPORTANT: Note that the following values must match
     68  * constants in GpsLocationProvider.java. */
     69 /** Receive GPS fixes on a recurring basis at a specified period. */
     70 #define GPS_POSITION_RECURRENCE_PERIODIC    0
     71 /** Request a single shot GPS fix. */
     72 #define GPS_POSITION_RECURRENCE_SINGLE      1
     73 
     74 /** GPS status event values. */
     75 typedef uint16_t GpsStatusValue;
     76 /* IMPORTANT: Note that the following values must match
     77  * constants in GpsLocationProvider.java. */
     78 /** GPS status unknown. */
     79 #define GPS_STATUS_NONE             0
     80 /** GPS has begun navigating. */
     81 #define GPS_STATUS_SESSION_BEGIN    1
     82 /** GPS has stopped navigating. */
     83 #define GPS_STATUS_SESSION_END      2
     84 /** GPS has powered on but is not navigating. */
     85 #define GPS_STATUS_ENGINE_ON        3
     86 /** GPS is powered off. */
     87 #define GPS_STATUS_ENGINE_OFF       4
     88 
     89 /** Flags to indicate which values are valid in a GpsLocation. */
     90 typedef uint16_t GpsLocationFlags;
     91 /* IMPORTANT: Note that the following values must match
     92  * constants in GpsLocationProvider.java. */
     93 /** GpsLocation has valid latitude and longitude. */
     94 #define GPS_LOCATION_HAS_LAT_LONG   0x0001
     95 /** GpsLocation has valid altitude. */
     96 #define GPS_LOCATION_HAS_ALTITUDE   0x0002
     97 /** GpsLocation has valid speed. */
     98 #define GPS_LOCATION_HAS_SPEED      0x0004
     99 /** GpsLocation has valid bearing. */
    100 #define GPS_LOCATION_HAS_BEARING    0x0008
    101 /** GpsLocation has valid accuracy. */
    102 #define GPS_LOCATION_HAS_ACCURACY   0x0010
    103 
    104 /** Flags for the gps_set_capabilities callback. */
    105 
    106 /**
    107  * GPS HAL schedules fixes for GPS_POSITION_RECURRENCE_PERIODIC mode. If this is
    108  * not set, then the framework will use 1000ms for min_interval and will start
    109  * and call start() and stop() to schedule the GPS.
    110  */
    111 #define GPS_CAPABILITY_SCHEDULING       (1 << 0)
    112 /** GPS supports MS-Based AGPS mode */
    113 #define GPS_CAPABILITY_MSB              (1 << 1)
    114 /** GPS supports MS-Assisted AGPS mode */
    115 #define GPS_CAPABILITY_MSA              (1 << 2)
    116 /** GPS supports single-shot fixes */
    117 #define GPS_CAPABILITY_SINGLE_SHOT      (1 << 3)
    118 /** GPS supports on demand time injection */
    119 #define GPS_CAPABILITY_ON_DEMAND_TIME   (1 << 4)
    120 /** GPS supports Geofencing  */
    121 #define GPS_CAPABILITY_GEOFENCING       (1 << 5)
    122 /** GPS supports Measurements. */
    123 #define GPS_CAPABILITY_MEASUREMENTS     (1 << 6)
    124 /** GPS supports Navigation Messages */
    125 #define GPS_CAPABILITY_NAV_MESSAGES     (1 << 7)
    126 
    127 /**
    128  * Flags used to specify which aiding data to delete when calling
    129  * delete_aiding_data().
    130  */
    131 typedef uint16_t GpsAidingData;
    132 /* IMPORTANT: Note that the following values must match
    133  * constants in GpsLocationProvider.java. */
    134 #define GPS_DELETE_EPHEMERIS        0x0001
    135 #define GPS_DELETE_ALMANAC          0x0002
    136 #define GPS_DELETE_POSITION         0x0004
    137 #define GPS_DELETE_TIME             0x0008
    138 #define GPS_DELETE_IONO             0x0010
    139 #define GPS_DELETE_UTC              0x0020
    140 #define GPS_DELETE_HEALTH           0x0040
    141 #define GPS_DELETE_SVDIR            0x0080
    142 #define GPS_DELETE_SVSTEER          0x0100
    143 #define GPS_DELETE_SADATA           0x0200
    144 #define GPS_DELETE_RTI              0x0400
    145 #define GPS_DELETE_CELLDB_INFO      0x8000
    146 #define GPS_DELETE_ALL              0xFFFF
    147 
    148 /** AGPS type */
    149 typedef uint16_t AGpsType;
    150 #define AGPS_TYPE_SUPL          1
    151 #define AGPS_TYPE_C2K           2
    152 
    153 typedef uint16_t AGpsSetIDType;
    154 #define AGPS_SETID_TYPE_NONE    0
    155 #define AGPS_SETID_TYPE_IMSI    1
    156 #define AGPS_SETID_TYPE_MSISDN  2
    157 
    158 typedef uint16_t ApnIpType;
    159 #define APN_IP_INVALID          0
    160 #define APN_IP_IPV4             1
    161 #define APN_IP_IPV6             2
    162 #define APN_IP_IPV4V6           3
    163 
    164 /**
    165  * String length constants
    166  */
    167 #define GPS_NI_SHORT_STRING_MAXLEN      256
    168 #define GPS_NI_LONG_STRING_MAXLEN       2048
    169 
    170 /**
    171  * GpsNiType constants
    172  */
    173 typedef uint32_t GpsNiType;
    174 #define GPS_NI_TYPE_VOICE              1
    175 #define GPS_NI_TYPE_UMTS_SUPL          2
    176 #define GPS_NI_TYPE_UMTS_CTRL_PLANE    3
    177 
    178 /**
    179  * GpsNiNotifyFlags constants
    180  */
    181 typedef uint32_t GpsNiNotifyFlags;
    182 /** NI requires notification */
    183 #define GPS_NI_NEED_NOTIFY          0x0001
    184 /** NI requires verification */
    185 #define GPS_NI_NEED_VERIFY          0x0002
    186 /** NI requires privacy override, no notification/minimal trace */
    187 #define GPS_NI_PRIVACY_OVERRIDE     0x0004
    188 
    189 /**
    190  * GPS NI responses, used to define the response in
    191  * NI structures
    192  */
    193 typedef int GpsUserResponseType;
    194 #define GPS_NI_RESPONSE_ACCEPT         1
    195 #define GPS_NI_RESPONSE_DENY           2
    196 #define GPS_NI_RESPONSE_NORESP         3
    197 
    198 /**
    199  * NI data encoding scheme
    200  */
    201 typedef int GpsNiEncodingType;
    202 #define GPS_ENC_NONE                   0
    203 #define GPS_ENC_SUPL_GSM_DEFAULT       1
    204 #define GPS_ENC_SUPL_UTF8              2
    205 #define GPS_ENC_SUPL_UCS2              3
    206 #define GPS_ENC_UNKNOWN                -1
    207 
    208 /** AGPS status event values. */
    209 typedef uint16_t AGpsStatusValue;
    210 /** GPS requests data connection for AGPS. */
    211 #define GPS_REQUEST_AGPS_DATA_CONN  1
    212 /** GPS releases the AGPS data connection. */
    213 #define GPS_RELEASE_AGPS_DATA_CONN  2
    214 /** AGPS data connection initiated */
    215 #define GPS_AGPS_DATA_CONNECTED     3
    216 /** AGPS data connection completed */
    217 #define GPS_AGPS_DATA_CONN_DONE     4
    218 /** AGPS data connection failed */
    219 #define GPS_AGPS_DATA_CONN_FAILED   5
    220 
    221 typedef uint16_t AGpsRefLocationType;
    222 #define AGPS_REF_LOCATION_TYPE_GSM_CELLID   1
    223 #define AGPS_REF_LOCATION_TYPE_UMTS_CELLID  2
    224 #define AGPS_REF_LOCATION_TYPE_MAC          3
    225 #define AGPS_REF_LOCATION_TYPE_LTE_CELLID   4
    226 
    227 /* Deprecated, to be removed in the next Android release. */
    228 #define AGPS_REG_LOCATION_TYPE_MAC          3
    229 
    230 /** Network types for update_network_state "type" parameter */
    231 #define AGPS_RIL_NETWORK_TYPE_MOBILE        0
    232 #define AGPS_RIL_NETWORK_TYPE_WIFI          1
    233 #define AGPS_RIL_NETWORK_TYPE_MOBILE_MMS    2
    234 #define AGPS_RIL_NETWORK_TYPE_MOBILE_SUPL   3
    235 #define AGPS_RIL_NETWORK_TTYPE_MOBILE_DUN   4
    236 #define AGPS_RIL_NETWORK_TTYPE_MOBILE_HIPRI 5
    237 #define AGPS_RIL_NETWORK_TTYPE_WIMAX        6
    238 
    239 /* The following typedef together with its constants below are deprecated, and
    240  * will be removed in the next release. */
    241 typedef uint16_t GpsClockFlags;
    242 #define GPS_CLOCK_HAS_LEAP_SECOND               (1<<0)
    243 #define GPS_CLOCK_HAS_TIME_UNCERTAINTY          (1<<1)
    244 #define GPS_CLOCK_HAS_FULL_BIAS                 (1<<2)
    245 #define GPS_CLOCK_HAS_BIAS                      (1<<3)
    246 #define GPS_CLOCK_HAS_BIAS_UNCERTAINTY          (1<<4)
    247 #define GPS_CLOCK_HAS_DRIFT                     (1<<5)
    248 #define GPS_CLOCK_HAS_DRIFT_UNCERTAINTY         (1<<6)
    249 
    250 /**
    251  * Flags to indicate what fields in GnssClock are valid.
    252  */
    253 typedef uint16_t GnssClockFlags;
    254 /** A valid 'leap second' is stored in the data structure. */
    255 #define GNSS_CLOCK_HAS_LEAP_SECOND               (1<<0)
    256 /** A valid 'time uncertainty' is stored in the data structure. */
    257 #define GNSS_CLOCK_HAS_TIME_UNCERTAINTY          (1<<1)
    258 /** A valid 'full bias' is stored in the data structure. */
    259 #define GNSS_CLOCK_HAS_FULL_BIAS                 (1<<2)
    260 /** A valid 'bias' is stored in the data structure. */
    261 #define GNSS_CLOCK_HAS_BIAS                      (1<<3)
    262 /** A valid 'bias uncertainty' is stored in the data structure. */
    263 #define GNSS_CLOCK_HAS_BIAS_UNCERTAINTY          (1<<4)
    264 /** A valid 'drift' is stored in the data structure. */
    265 #define GNSS_CLOCK_HAS_DRIFT                     (1<<5)
    266 /** A valid 'drift uncertainty' is stored in the data structure. */
    267 #define GNSS_CLOCK_HAS_DRIFT_UNCERTAINTY         (1<<6)
    268 
    269 /* The following typedef together with its constants below are deprecated, and
    270  * will be removed in the next release. */
    271 typedef uint8_t GpsClockType;
    272 #define GPS_CLOCK_TYPE_UNKNOWN                  0
    273 #define GPS_CLOCK_TYPE_LOCAL_HW_TIME            1
    274 #define GPS_CLOCK_TYPE_GPS_TIME                 2
    275 
    276 /* The following typedef together with its constants below are deprecated, and
    277  * will be removed in the next release. */
    278 typedef uint32_t GpsMeasurementFlags;
    279 #define GPS_MEASUREMENT_HAS_SNR                               (1<<0)
    280 #define GPS_MEASUREMENT_HAS_ELEVATION                         (1<<1)
    281 #define GPS_MEASUREMENT_HAS_ELEVATION_UNCERTAINTY             (1<<2)
    282 #define GPS_MEASUREMENT_HAS_AZIMUTH                           (1<<3)
    283 #define GPS_MEASUREMENT_HAS_AZIMUTH_UNCERTAINTY               (1<<4)
    284 #define GPS_MEASUREMENT_HAS_PSEUDORANGE                       (1<<5)
    285 #define GPS_MEASUREMENT_HAS_PSEUDORANGE_UNCERTAINTY           (1<<6)
    286 #define GPS_MEASUREMENT_HAS_CODE_PHASE                        (1<<7)
    287 #define GPS_MEASUREMENT_HAS_CODE_PHASE_UNCERTAINTY            (1<<8)
    288 #define GPS_MEASUREMENT_HAS_CARRIER_FREQUENCY                 (1<<9)
    289 #define GPS_MEASUREMENT_HAS_CARRIER_CYCLES                    (1<<10)
    290 #define GPS_MEASUREMENT_HAS_CARRIER_PHASE                     (1<<11)
    291 #define GPS_MEASUREMENT_HAS_CARRIER_PHASE_UNCERTAINTY         (1<<12)
    292 #define GPS_MEASUREMENT_HAS_BIT_NUMBER                        (1<<13)
    293 #define GPS_MEASUREMENT_HAS_TIME_FROM_LAST_BIT                (1<<14)
    294 #define GPS_MEASUREMENT_HAS_DOPPLER_SHIFT                     (1<<15)
    295 #define GPS_MEASUREMENT_HAS_DOPPLER_SHIFT_UNCERTAINTY         (1<<16)
    296 #define GPS_MEASUREMENT_HAS_USED_IN_FIX                       (1<<17)
    297 #define GPS_MEASUREMENT_HAS_UNCORRECTED_PSEUDORANGE_RATE      (1<<18)
    298 
    299 /**
    300  * Flags to indicate what fields in GnssMeasurement are valid.
    301  */
    302 typedef uint32_t GnssMeasurementFlags;
    303 /** A valid 'snr' is stored in the data structure. */
    304 #define GNSS_MEASUREMENT_HAS_SNR                               (1<<0)
    305 /** A valid 'carrier frequency' is stored in the data structure. */
    306 #define GNSS_MEASUREMENT_HAS_CARRIER_FREQUENCY                 (1<<9)
    307 /** A valid 'carrier cycles' is stored in the data structure. */
    308 #define GNSS_MEASUREMENT_HAS_CARRIER_CYCLES                    (1<<10)
    309 /** A valid 'carrier phase' is stored in the data structure. */
    310 #define GNSS_MEASUREMENT_HAS_CARRIER_PHASE                     (1<<11)
    311 /** A valid 'carrier phase uncertainty' is stored in the data structure. */
    312 #define GNSS_MEASUREMENT_HAS_CARRIER_PHASE_UNCERTAINTY         (1<<12)
    313 
    314 /* The following typedef together with its constants below are deprecated, and
    315  * will be removed in the next release. */
    316 typedef uint8_t GpsLossOfLock;
    317 #define GPS_LOSS_OF_LOCK_UNKNOWN                            0
    318 #define GPS_LOSS_OF_LOCK_OK                                 1
    319 #define GPS_LOSS_OF_LOCK_CYCLE_SLIP                         2
    320 
    321 /* The following typedef together with its constants below are deprecated, and
    322  * will be removed in the next release. Use GnssMultipathIndicator instead.
    323  */
    324 typedef uint8_t GpsMultipathIndicator;
    325 #define GPS_MULTIPATH_INDICATOR_UNKNOWN                 0
    326 #define GPS_MULTIPATH_INDICATOR_DETECTED                1
    327 #define GPS_MULTIPATH_INDICATOR_NOT_USED                2
    328 
    329 /**
    330  * Enumeration of available values for the GNSS Measurement's multipath
    331  * indicator.
    332  */
    333 typedef uint8_t GnssMultipathIndicator;
    334 /** The indicator is not available or unknown. */
    335 #define GNSS_MULTIPATH_INDICATOR_UNKNOWN                 0
    336 /** The measurement is indicated to be affected by multipath. */
    337 #define GNSS_MULTIPATH_INDICATOR_PRESENT                 1
    338 /** The measurement is indicated to be not affected by multipath. */
    339 #define GNSS_MULTIPATH_INDICATOR_NOT_PRESENT             2
    340 
    341 /* The following typedef together with its constants below are deprecated, and
    342  * will be removed in the next release. */
    343 typedef uint16_t GpsMeasurementState;
    344 #define GPS_MEASUREMENT_STATE_UNKNOWN                   0
    345 #define GPS_MEASUREMENT_STATE_CODE_LOCK             (1<<0)
    346 #define GPS_MEASUREMENT_STATE_BIT_SYNC              (1<<1)
    347 #define GPS_MEASUREMENT_STATE_SUBFRAME_SYNC         (1<<2)
    348 #define GPS_MEASUREMENT_STATE_TOW_DECODED           (1<<3)
    349 #define GPS_MEASUREMENT_STATE_MSEC_AMBIGUOUS        (1<<4)
    350 
    351 /**
    352  * Flags indicating the GNSS measurement state.
    353  *
    354  * The expected behavior here is for GPS HAL to set all the flags that applies.
    355  * For example, if the state for a satellite is only C/A code locked and bit
    356  * synchronized, and there is still millisecond ambiguity, the state should be
    357  * set as:
    358  *
    359  * GNSS_MEASUREMENT_STATE_CODE_LOCK | GNSS_MEASUREMENT_STATE_BIT_SYNC |
    360  *         GNSS_MEASUREMENT_STATE_MSEC_AMBIGUOUS
    361  *
    362  * If GNSS is still searching for a satellite, the corresponding state should be
    363  * set to GNSS_MEASUREMENT_STATE_UNKNOWN(0).
    364  */
    365 typedef uint32_t GnssMeasurementState;
    366 #define GNSS_MEASUREMENT_STATE_UNKNOWN                   0
    367 #define GNSS_MEASUREMENT_STATE_CODE_LOCK             (1<<0)
    368 #define GNSS_MEASUREMENT_STATE_BIT_SYNC              (1<<1)
    369 #define GNSS_MEASUREMENT_STATE_SUBFRAME_SYNC         (1<<2)
    370 #define GNSS_MEASUREMENT_STATE_TOW_DECODED           (1<<3)
    371 #define GNSS_MEASUREMENT_STATE_MSEC_AMBIGUOUS        (1<<4)
    372 #define GNSS_MEASUREMENT_STATE_SYMBOL_SYNC           (1<<5)
    373 #define GNSS_MEASUREMENT_STATE_GLO_STRING_SYNC       (1<<6)
    374 #define GNSS_MEASUREMENT_STATE_GLO_TOD_DECODED       (1<<7)
    375 #define GNSS_MEASUREMENT_STATE_BDS_D2_BIT_SYNC       (1<<8)
    376 #define GNSS_MEASUREMENT_STATE_BDS_D2_SUBFRAME_SYNC  (1<<9)
    377 #define GNSS_MEASUREMENT_STATE_GAL_E1BC_CODE_LOCK    (1<<10)
    378 #define GNSS_MEASUREMENT_STATE_GAL_E1C_2ND_CODE_LOCK (1<<11)
    379 #define GNSS_MEASUREMENT_STATE_GAL_E1B_PAGE_SYNC     (1<<12)
    380 #define GNSS_MEASUREMENT_STATE_SBAS_SYNC             (1<<13)
    381 
    382 /* The following typedef together with its constants below are deprecated, and
    383  * will be removed in the next release. */
    384 typedef uint16_t GpsAccumulatedDeltaRangeState;
    385 #define GPS_ADR_STATE_UNKNOWN                       0
    386 #define GPS_ADR_STATE_VALID                     (1<<0)
    387 #define GPS_ADR_STATE_RESET                     (1<<1)
    388 #define GPS_ADR_STATE_CYCLE_SLIP                (1<<2)
    389 
    390 /**
    391  * Flags indicating the Accumulated Delta Range's states.
    392  */
    393 typedef uint16_t GnssAccumulatedDeltaRangeState;
    394 #define GNSS_ADR_STATE_UNKNOWN                       0
    395 #define GNSS_ADR_STATE_VALID                     (1<<0)
    396 #define GNSS_ADR_STATE_RESET                     (1<<1)
    397 #define GNSS_ADR_STATE_CYCLE_SLIP                (1<<2)
    398 
    399 /* The following typedef together with its constants below are deprecated, and
    400  * will be removed in the next release. */
    401 typedef uint8_t GpsNavigationMessageType;
    402 #define GPS_NAVIGATION_MESSAGE_TYPE_UNKNOWN         0
    403 #define GPS_NAVIGATION_MESSAGE_TYPE_L1CA            1
    404 #define GPS_NAVIGATION_MESSAGE_TYPE_L2CNAV          2
    405 #define GPS_NAVIGATION_MESSAGE_TYPE_L5CNAV          3
    406 #define GPS_NAVIGATION_MESSAGE_TYPE_CNAV2           4
    407 
    408 /**
    409  * Enumeration of available values to indicate the GNSS Navigation message
    410  * types.
    411  *
    412  * For convenience, first byte is the GnssConstellationType on which that signal
    413  * is typically transmitted
    414  */
    415 typedef int16_t GnssNavigationMessageType;
    416 
    417 #define GNSS_NAVIGATION_MESSAGE_TYPE_UNKNOWN       0
    418 /** GPS L1 C/A message contained in the structure.  */
    419 #define GNSS_NAVIGATION_MESSAGE_TYPE_GPS_L1CA      0x0101
    420 /** GPS L2-CNAV message contained in the structure. */
    421 #define GNSS_NAVIGATION_MESSAGE_TYPE_GPS_L2CNAV    0x0102
    422 /** GPS L5-CNAV message contained in the structure. */
    423 #define GNSS_NAVIGATION_MESSAGE_TYPE_GPS_L5CNAV    0x0103
    424 /** GPS CNAV-2 message contained in the structure. */
    425 #define GNSS_NAVIGATION_MESSAGE_TYPE_GPS_CNAV2     0x0104
    426 /** Glonass L1 CA message contained in the structure. */
    427 #define GNSS_NAVIGATION_MESSAGE_TYPE_GLO_L1CA      0x0301
    428 /** Beidou D1 message contained in the structure. */
    429 #define GNSS_NAVIGATION_MESSAGE_TYPE_BDS_D1        0x0501
    430 /** Beidou D2 message contained in the structure. */
    431 #define GNSS_NAVIGATION_MESSAGE_TYPE_BDS_D2        0x0502
    432 /** Galileo I/NAV message contained in the structure. */
    433 #define GNSS_NAVIGATION_MESSAGE_TYPE_GAL_I         0x0601
    434 /** Galileo F/NAV message contained in the structure. */
    435 #define GNSS_NAVIGATION_MESSAGE_TYPE_GAL_F         0x0602
    436 
    437 /**
    438  * Status of Navigation Message
    439  * When a message is received properly without any parity error in its navigation words, the
    440  * status should be set to NAV_MESSAGE_STATUS_PARITY_PASSED. But if a message is received
    441  * with words that failed parity check, but GPS is able to correct those words, the status
    442  * should be set to NAV_MESSAGE_STATUS_PARITY_REBUILT.
    443  * No need to send any navigation message that contains words with parity error and cannot be
    444  * corrected.
    445  */
    446 typedef uint16_t NavigationMessageStatus;
    447 #define NAV_MESSAGE_STATUS_UNKNOWN              0
    448 #define NAV_MESSAGE_STATUS_PARITY_PASSED   (1<<0)
    449 #define NAV_MESSAGE_STATUS_PARITY_REBUILT  (1<<1)
    450 
    451 /* This constant is deprecated, and will be removed in the next release. */
    452 #define NAV_MESSAGE_STATUS_UNKONW              0
    453 
    454 /**
    455  * Flags that indicate information about the satellite
    456  */
    457 typedef uint8_t                                 GnssSvFlags;
    458 #define GNSS_SV_FLAGS_NONE                      0
    459 #define GNSS_SV_FLAGS_HAS_EPHEMERIS_DATA        (1 << 0)
    460 #define GNSS_SV_FLAGS_HAS_ALMANAC_DATA          (1 << 1)
    461 #define GNSS_SV_FLAGS_USED_IN_FIX               (1 << 2)
    462 
    463 /**
    464  * Constellation type of GnssSvInfo
    465  */
    466 typedef uint8_t                         GnssConstellationType;
    467 #define GNSS_CONSTELLATION_UNKNOWN      0
    468 #define GNSS_CONSTELLATION_GPS          1
    469 #define GNSS_CONSTELLATION_SBAS         2
    470 #define GNSS_CONSTELLATION_GLONASS      3
    471 #define GNSS_CONSTELLATION_QZSS         4
    472 #define GNSS_CONSTELLATION_BEIDOU       5
    473 #define GNSS_CONSTELLATION_GALILEO      6
    474 
    475 /**
    476  * Name for the GPS XTRA interface.
    477  */
    478 #define GPS_XTRA_INTERFACE      "gps-xtra"
    479 
    480 /**
    481  * Name for the GPS DEBUG interface.
    482  */
    483 #define GPS_DEBUG_INTERFACE      "gps-debug"
    484 
    485 /**
    486  * Name for the AGPS interface.
    487  */
    488 #define AGPS_INTERFACE      "agps"
    489 
    490 /**
    491  * Name of the Supl Certificate interface.
    492  */
    493 #define SUPL_CERTIFICATE_INTERFACE  "supl-certificate"
    494 
    495 /**
    496  * Name for NI interface
    497  */
    498 #define GPS_NI_INTERFACE "gps-ni"
    499 
    500 /**
    501  * Name for the AGPS-RIL interface.
    502  */
    503 #define AGPS_RIL_INTERFACE      "agps_ril"
    504 
    505 /**
    506  * Name for the GPS_Geofencing interface.
    507  */
    508 #define GPS_GEOFENCING_INTERFACE   "gps_geofencing"
    509 
    510 /**
    511  * Name of the GPS Measurements interface.
    512  */
    513 #define GPS_MEASUREMENT_INTERFACE   "gps_measurement"
    514 
    515 /**
    516  * Name of the GPS navigation message interface.
    517  */
    518 #define GPS_NAVIGATION_MESSAGE_INTERFACE     "gps_navigation_message"
    519 
    520 /**
    521  * Name of the GNSS/GPS configuration interface.
    522  */
    523 #define GNSS_CONFIGURATION_INTERFACE     "gnss_configuration"
    524 
    525 
    526 /** Represents a location. */
    527 typedef struct {
    528     /** set to sizeof(GpsLocation) */
    529     size_t          size;
    530     /** Contains GpsLocationFlags bits. */
    531     uint16_t        flags;
    532     /** Represents latitude in degrees. */
    533     double          latitude;
    534     /** Represents longitude in degrees. */
    535     double          longitude;
    536     /**
    537      * Represents altitude in meters above the WGS 84 reference ellipsoid.
    538      */
    539     double          altitude;
    540     /** Represents speed in meters per second. */
    541     float           speed;
    542     /** Represents heading in degrees. */
    543     float           bearing;
    544     /** Represents expected accuracy in meters. */
    545     float           accuracy;
    546     /** Timestamp for the location fix. */
    547     GpsUtcTime      timestamp;
    548 } GpsLocation;
    549 
    550 /** Represents the status. */
    551 typedef struct {
    552     /** set to sizeof(GpsStatus) */
    553     size_t          size;
    554     GpsStatusValue status;
    555 } GpsStatus;
    556 
    557 /**
    558  * Legacy struct to represents SV information.
    559  * Deprecated, to be removed in the next Android release.
    560  * Use GnssSvInfo instead.
    561  */
    562 typedef struct {
    563     /** set to sizeof(GpsSvInfo) */
    564     size_t          size;
    565     /** Pseudo-random number for the SV. */
    566     int     prn;
    567     /** Signal to noise ratio. */
    568     float   snr;
    569     /** Elevation of SV in degrees. */
    570     float   elevation;
    571     /** Azimuth of SV in degrees. */
    572     float   azimuth;
    573 } GpsSvInfo;
    574 
    575 typedef struct {
    576     /** set to sizeof(GnssSvInfo) */
    577     size_t size;
    578 
    579     /**
    580      * Pseudo-random number for the SV, or FCN/OSN number for Glonass. The
    581      * distinction is made by looking at constellation field. Values should be
    582      * in the range of:
    583      *
    584      * - GPS:     1-32
    585      * - SBAS:    120-151, 183-192
    586      * - GLONASS: 1-24, the orbital slot number (OSN), if known.  Or, if not:
    587      *            93-106, the frequency channel number (FCN) (-7 to +6) offset by + 100
    588      *            i.e. report an FCN of -7 as 93, FCN of 0 as 100, and FCN of +6 as 106.
    589      * - QZSS:    193-200
    590      * - Galileo: 1-36
    591      * - Beidou:  1-37
    592      */
    593     int16_t svid;
    594 
    595     /**
    596      * Defines the constellation of the given SV. Value should be one of those
    597      * GNSS_CONSTELLATION_* constants
    598      */
    599     GnssConstellationType constellation;
    600 
    601     /**
    602      * Carrier-to-noise density in dB-Hz, typically in the range [0, 63].
    603      * It contains the measured C/N0 value for the signal at the antenna port.
    604      *
    605      * This is a mandatory value.
    606      */
    607     float c_n0_dbhz;
    608 
    609     /** Elevation of SV in degrees. */
    610     float elevation;
    611 
    612     /** Azimuth of SV in degrees. */
    613     float azimuth;
    614 
    615     /**
    616      * Contains additional data about the given SV. Value should be one of those
    617      * GNSS_SV_FLAGS_* constants
    618      */
    619     GnssSvFlags flags;
    620 
    621 } GnssSvInfo;
    622 
    623 /**
    624  * Legacy struct to represents SV status.
    625  * Deprecated, to be removed in the next Android release.
    626  * Use GnssSvStatus instead.
    627  */
    628 typedef struct {
    629     /** set to sizeof(GpsSvStatus) */
    630     size_t size;
    631     int num_svs;
    632     GpsSvInfo sv_list[GPS_MAX_SVS];
    633     uint32_t ephemeris_mask;
    634     uint32_t almanac_mask;
    635     uint32_t used_in_fix_mask;
    636 } GpsSvStatus;
    637 
    638 /**
    639  * Represents SV status.
    640  */
    641 typedef struct {
    642     /** set to sizeof(GnssSvStatus) */
    643     size_t size;
    644 
    645     /** Number of GPS SVs currently visible, refers to the SVs stored in sv_list */
    646     int num_svs;
    647     /**
    648      * Pointer to an array of SVs information for all GNSS constellations,
    649      * except GPS, which is reported using sv_list
    650      */
    651     GnssSvInfo gnss_sv_list[GNSS_MAX_SVS];
    652 
    653 } GnssSvStatus;
    654 
    655 /* CellID for 2G, 3G and LTE, used in AGPS. */
    656 typedef struct {
    657     AGpsRefLocationType type;
    658     /** Mobile Country Code. */
    659     uint16_t mcc;
    660     /** Mobile Network Code .*/
    661     uint16_t mnc;
    662     /** Location Area Code in 2G, 3G and LTE. In 3G lac is discarded. In LTE,
    663      * lac is populated with tac, to ensure that we don't break old clients that
    664      * might rely in the old (wrong) behavior.
    665      */
    666     uint16_t lac;
    667     /** Cell id in 2G. Utran Cell id in 3G. Cell Global Id EUTRA in LTE. */
    668     uint32_t cid;
    669     /** Tracking Area Code in LTE. */
    670     uint16_t tac;
    671     /** Physical Cell id in LTE (not used in 2G and 3G) */
    672     uint16_t pcid;
    673 } AGpsRefLocationCellID;
    674 
    675 typedef struct {
    676     uint8_t mac[6];
    677 } AGpsRefLocationMac;
    678 
    679 /** Represents ref locations */
    680 typedef struct {
    681     AGpsRefLocationType type;
    682     union {
    683         AGpsRefLocationCellID   cellID;
    684         AGpsRefLocationMac      mac;
    685     } u;
    686 } AGpsRefLocation;
    687 
    688 /**
    689  * Callback with location information. Can only be called from a thread created
    690  * by create_thread_cb.
    691  */
    692 typedef void (* gps_location_callback)(GpsLocation* location);
    693 
    694 /**
    695  * Callback with status information. Can only be called from a thread created by
    696  * create_thread_cb.
    697  */
    698 typedef void (* gps_status_callback)(GpsStatus* status);
    699 
    700 /**
    701  * Legacy callback with SV status information.
    702  * Can only be called from a thread created by create_thread_cb.
    703  *
    704  * This callback is deprecated, and will be removed in the next release. Use
    705  * gnss_sv_status_callback() instead.
    706  */
    707 typedef void (* gps_sv_status_callback)(GpsSvStatus* sv_info);
    708 
    709 /**
    710  * Callback with SV status information.
    711  * Can only be called from a thread created by create_thread_cb.
    712  */
    713 typedef void (* gnss_sv_status_callback)(GnssSvStatus* sv_info);
    714 
    715 /**
    716  * Callback for reporting NMEA sentences. Can only be called from a thread
    717  * created by create_thread_cb.
    718  */
    719 typedef void (* gps_nmea_callback)(GpsUtcTime timestamp, const char* nmea, int length);
    720 
    721 /**
    722  * Callback to inform framework of the GPS engine's capabilities. Capability
    723  * parameter is a bit field of GPS_CAPABILITY_* flags.
    724  */
    725 typedef void (* gps_set_capabilities)(uint32_t capabilities);
    726 
    727 /**
    728  * Callback utility for acquiring the GPS wakelock. This can be used to prevent
    729  * the CPU from suspending while handling GPS events.
    730  */
    731 typedef void (* gps_acquire_wakelock)();
    732 
    733 /** Callback utility for releasing the GPS wakelock. */
    734 typedef void (* gps_release_wakelock)();
    735 
    736 /** Callback for requesting NTP time */
    737 typedef void (* gps_request_utc_time)();
    738 
    739 /**
    740  * Callback for creating a thread that can call into the Java framework code.
    741  * This must be used to create any threads that report events up to the
    742  * framework.
    743  */
    744 typedef pthread_t (* gps_create_thread)(const char* name, void (*start)(void *), void* arg);
    745 
    746 /**
    747  * Provides information about how new the underlying GPS/GNSS hardware and
    748  * software is.
    749  *
    750  * This information will be available for Android Test Applications. If a GPS
    751  * HAL does not provide this information, it will be considered "2015 or
    752  * earlier".
    753  *
    754  * If a GPS HAL does provide this information, then newer years will need to
    755  * meet newer CTS standards. E.g. if the date are 2016 or above, then N+ level
    756  * GpsMeasurement support will be verified.
    757  */
    758 typedef struct {
    759     /** Set to sizeof(GnssSystemInfo) */
    760     size_t   size;
    761     /* year in which the last update was made to the underlying hardware/firmware
    762      * used to capture GNSS signals, e.g. 2016 */
    763     uint16_t year_of_hw;
    764 } GnssSystemInfo;
    765 
    766 /**
    767  * Callback to inform framework of the engine's hardware version information.
    768  */
    769 typedef void (*gnss_set_system_info)(const GnssSystemInfo* info);
    770 
    771 /** New GPS callback structure. */
    772 typedef struct {
    773     /** set to sizeof(GpsCallbacks) */
    774     size_t      size;
    775     gps_location_callback location_cb;
    776     gps_status_callback status_cb;
    777     gps_sv_status_callback sv_status_cb;
    778     gps_nmea_callback nmea_cb;
    779     gps_set_capabilities set_capabilities_cb;
    780     gps_acquire_wakelock acquire_wakelock_cb;
    781     gps_release_wakelock release_wakelock_cb;
    782     gps_create_thread create_thread_cb;
    783     gps_request_utc_time request_utc_time_cb;
    784 
    785     gnss_set_system_info set_system_info_cb;
    786     gnss_sv_status_callback gnss_sv_status_cb;
    787 } GpsCallbacks;
    788 
    789 /** Represents the standard GPS interface. */
    790 typedef struct {
    791     /** set to sizeof(GpsInterface) */
    792     size_t          size;
    793     /**
    794      * Opens the interface and provides the callback routines
    795      * to the implementation of this interface.
    796      */
    797     int   (*init)( GpsCallbacks* callbacks );
    798 
    799     /** Starts navigating. */
    800     int   (*start)( void );
    801 
    802     /** Stops navigating. */
    803     int   (*stop)( void );
    804 
    805     /** Closes the interface. */
    806     void  (*cleanup)( void );
    807 
    808     /** Injects the current time. */
    809     int   (*inject_time)(GpsUtcTime time, int64_t timeReference,
    810                          int uncertainty);
    811 
    812     /**
    813      * Injects current location from another location provider (typically cell
    814      * ID). Latitude and longitude are measured in degrees expected accuracy is
    815      * measured in meters
    816      */
    817     int  (*inject_location)(double latitude, double longitude, float accuracy);
    818 
    819     /**
    820      * Specifies that the next call to start will not use the
    821      * information defined in the flags. GPS_DELETE_ALL is passed for
    822      * a cold start.
    823      */
    824     void  (*delete_aiding_data)(GpsAidingData flags);
    825 
    826     /**
    827      * min_interval represents the time between fixes in milliseconds.
    828      * preferred_accuracy represents the requested fix accuracy in meters.
    829      * preferred_time represents the requested time to first fix in milliseconds.
    830      *
    831      * 'mode' parameter should be one of GPS_POSITION_MODE_MS_BASED
    832      * or GPS_POSITION_MODE_STANDALONE.
    833      * It is allowed by the platform (and it is recommended) to fallback to
    834      * GPS_POSITION_MODE_MS_BASED if GPS_POSITION_MODE_MS_ASSISTED is passed in, and
    835      * GPS_POSITION_MODE_MS_BASED is supported.
    836      */
    837     int   (*set_position_mode)(GpsPositionMode mode, GpsPositionRecurrence recurrence,
    838             uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time);
    839 
    840     /** Get a pointer to extension information. */
    841     const void* (*get_extension)(const char* name);
    842 } GpsInterface;
    843 
    844 /**
    845  * Callback to request the client to download XTRA data. The client should
    846  * download XTRA data and inject it by calling inject_xtra_data(). Can only be
    847  * called from a thread created by create_thread_cb.
    848  */
    849 typedef void (* gps_xtra_download_request)();
    850 
    851 /** Callback structure for the XTRA interface. */
    852 typedef struct {
    853     gps_xtra_download_request download_request_cb;
    854     gps_create_thread create_thread_cb;
    855 } GpsXtraCallbacks;
    856 
    857 /** Extended interface for XTRA support. */
    858 typedef struct {
    859     /** set to sizeof(GpsXtraInterface) */
    860     size_t          size;
    861     /**
    862      * Opens the XTRA interface and provides the callback routines
    863      * to the implementation of this interface.
    864      */
    865     int  (*init)( GpsXtraCallbacks* callbacks );
    866     /** Injects XTRA data into the GPS. */
    867     int  (*inject_xtra_data)( char* data, int length );
    868 } GpsXtraInterface;
    869 
    870 /** Extended interface for DEBUG support. */
    871 typedef struct {
    872     /** set to sizeof(GpsDebugInterface) */
    873     size_t          size;
    874 
    875     /**
    876      * This function should return any information that the native
    877      * implementation wishes to include in a bugreport.
    878      */
    879     size_t (*get_internal_state)(char* buffer, size_t bufferSize);
    880 } GpsDebugInterface;
    881 
    882 /*
    883  * Represents the status of AGPS augmented to support IPv4 and IPv6.
    884  */
    885 typedef struct {
    886     /** set to sizeof(AGpsStatus) */
    887     size_t                  size;
    888 
    889     AGpsType                type;
    890     AGpsStatusValue         status;
    891 
    892     /**
    893      * Must be set to a valid IPv4 address if the field 'addr' contains an IPv4
    894      * address, or set to INADDR_NONE otherwise.
    895      */
    896     uint32_t                ipaddr;
    897 
    898     /**
    899      * Must contain the IPv4 (AF_INET) or IPv6 (AF_INET6) address to report.
    900      * Any other value of addr.ss_family will be rejected.
    901      */
    902     struct sockaddr_storage addr;
    903 } AGpsStatus;
    904 
    905 /**
    906  * Callback with AGPS status information. Can only be called from a thread
    907  * created by create_thread_cb.
    908  */
    909 typedef void (* agps_status_callback)(AGpsStatus* status);
    910 
    911 /** Callback structure for the AGPS interface. */
    912 typedef struct {
    913     agps_status_callback status_cb;
    914     gps_create_thread create_thread_cb;
    915 } AGpsCallbacks;
    916 
    917 /**
    918  * Extended interface for AGPS support, it is augmented to enable to pass
    919  * extra APN data.
    920  */
    921 typedef struct {
    922     /** set to sizeof(AGpsInterface) */
    923     size_t size;
    924 
    925     /**
    926      * Opens the AGPS interface and provides the callback routines to the
    927      * implementation of this interface.
    928      */
    929     void (*init)(AGpsCallbacks* callbacks);
    930     /**
    931      * Deprecated.
    932      * If the HAL supports AGpsInterface_v2 this API will not be used, see
    933      * data_conn_open_with_apn_ip_type for more information.
    934      */
    935     int (*data_conn_open)(const char* apn);
    936     /**
    937      * Notifies that the AGPS data connection has been closed.
    938      */
    939     int (*data_conn_closed)();
    940     /**
    941      * Notifies that a data connection is not available for AGPS.
    942      */
    943     int (*data_conn_failed)();
    944     /**
    945      * Sets the hostname and port for the AGPS server.
    946      */
    947     int (*set_server)(AGpsType type, const char* hostname, int port);
    948 
    949     /**
    950      * Notifies that a data connection is available and sets the name of the
    951      * APN, and its IP type, to be used for SUPL connections.
    952      */
    953     int (*data_conn_open_with_apn_ip_type)(
    954             const char* apn,
    955             ApnIpType apnIpType);
    956 } AGpsInterface;
    957 
    958 /** Error codes associated with certificate operations */
    959 #define AGPS_CERTIFICATE_OPERATION_SUCCESS               0
    960 #define AGPS_CERTIFICATE_ERROR_GENERIC                -100
    961 #define AGPS_CERTIFICATE_ERROR_TOO_MANY_CERTIFICATES  -101
    962 
    963 /** A data structure that represents an X.509 certificate using DER encoding */
    964 typedef struct {
    965     size_t  length;
    966     u_char* data;
    967 } DerEncodedCertificate;
    968 
    969 /**
    970  * A type definition for SHA1 Fingerprints used to identify X.509 Certificates
    971  * The Fingerprint is a digest of the DER Certificate that uniquely identifies it.
    972  */
    973 typedef struct {
    974     u_char data[20];
    975 } Sha1CertificateFingerprint;
    976 
    977 /** AGPS Interface to handle SUPL certificate operations */
    978 typedef struct {
    979     /** set to sizeof(SuplCertificateInterface) */
    980     size_t size;
    981 
    982     /**
    983      * Installs a set of Certificates used for SUPL connections to the AGPS server.
    984      * If needed the HAL should find out internally any certificates that need to be removed to
    985      * accommodate the certificates to install.
    986      * The certificates installed represent a full set of valid certificates needed to connect to
    987      * AGPS SUPL servers.
    988      * The list of certificates is required, and all must be available at the same time, when trying
    989      * to establish a connection with the AGPS Server.
    990      *
    991      * Parameters:
    992      *      certificates - A pointer to an array of DER encoded certificates that are need to be
    993      *                     installed in the HAL.
    994      *      length - The number of certificates to install.
    995      * Returns:
    996      *      AGPS_CERTIFICATE_OPERATION_SUCCESS if the operation is completed successfully
    997      *      AGPS_CERTIFICATE_ERROR_TOO_MANY_CERTIFICATES if the HAL cannot store the number of
    998      *          certificates attempted to be installed, the state of the certificates stored should
    999      *          remain the same as before on this error case.
   1000      *
   1001      * IMPORTANT:
   1002      *      If needed the HAL should find out internally the set of certificates that need to be
   1003      *      removed to accommodate the certificates to install.
   1004      */
   1005     int  (*install_certificates) ( const DerEncodedCertificate* certificates, size_t length );
   1006 
   1007     /**
   1008      * Notifies the HAL that a list of certificates used for SUPL connections are revoked. It is
   1009      * expected that the given set of certificates is removed from the internal store of the HAL.
   1010      *
   1011      * Parameters:
   1012      *      fingerprints - A pointer to an array of SHA1 Fingerprints to identify the set of
   1013      *                     certificates to revoke.
   1014      *      length - The number of fingerprints provided.
   1015      * Returns:
   1016      *      AGPS_CERTIFICATE_OPERATION_SUCCESS if the operation is completed successfully.
   1017      *
   1018      * IMPORTANT:
   1019      *      If any of the certificates provided (through its fingerprint) is not known by the HAL,
   1020      *      it should be ignored and continue revoking/deleting the rest of them.
   1021      */
   1022     int  (*revoke_certificates) ( const Sha1CertificateFingerprint* fingerprints, size_t length );
   1023 } SuplCertificateInterface;
   1024 
   1025 /** Represents an NI request */
   1026 typedef struct {
   1027     /** set to sizeof(GpsNiNotification) */
   1028     size_t          size;
   1029 
   1030     /**
   1031      * An ID generated by HAL to associate NI notifications and UI
   1032      * responses
   1033      */
   1034     int             notification_id;
   1035 
   1036     /**
   1037      * An NI type used to distinguish different categories of NI
   1038      * events, such as GPS_NI_TYPE_VOICE, GPS_NI_TYPE_UMTS_SUPL, ...
   1039      */
   1040     GpsNiType       ni_type;
   1041 
   1042     /**
   1043      * Notification/verification options, combinations of GpsNiNotifyFlags constants
   1044      */
   1045     GpsNiNotifyFlags notify_flags;
   1046 
   1047     /**
   1048      * Timeout period to wait for user response.
   1049      * Set to 0 for no time out limit.
   1050      */
   1051     int             timeout;
   1052 
   1053     /**
   1054      * Default response when time out.
   1055      */
   1056     GpsUserResponseType default_response;
   1057 
   1058     /**
   1059      * Requestor ID
   1060      */
   1061     char            requestor_id[GPS_NI_SHORT_STRING_MAXLEN];
   1062 
   1063     /**
   1064      * Notification message. It can also be used to store client_id in some cases
   1065      */
   1066     char            text[GPS_NI_LONG_STRING_MAXLEN];
   1067 
   1068     /**
   1069      * Client name decoding scheme
   1070      */
   1071     GpsNiEncodingType requestor_id_encoding;
   1072 
   1073     /**
   1074      * Client name decoding scheme
   1075      */
   1076     GpsNiEncodingType text_encoding;
   1077 
   1078     /**
   1079      * A pointer to extra data. Format:
   1080      * key_1 = value_1
   1081      * key_2 = value_2
   1082      */
   1083     char           extras[GPS_NI_LONG_STRING_MAXLEN];
   1084 
   1085 } GpsNiNotification;
   1086 
   1087 /**
   1088  * Callback with NI notification. Can only be called from a thread created by
   1089  * create_thread_cb.
   1090  */
   1091 typedef void (*gps_ni_notify_callback)(GpsNiNotification *notification);
   1092 
   1093 /** GPS NI callback structure. */
   1094 typedef struct
   1095 {
   1096     /**
   1097      * Sends the notification request from HAL to GPSLocationProvider.
   1098      */
   1099     gps_ni_notify_callback notify_cb;
   1100     gps_create_thread create_thread_cb;
   1101 } GpsNiCallbacks;
   1102 
   1103 /**
   1104  * Extended interface for Network-initiated (NI) support.
   1105  */
   1106 typedef struct
   1107 {
   1108     /** set to sizeof(GpsNiInterface) */
   1109     size_t          size;
   1110 
   1111    /** Registers the callbacks for HAL to use. */
   1112    void (*init) (GpsNiCallbacks *callbacks);
   1113 
   1114    /** Sends a response to HAL. */
   1115    void (*respond) (int notif_id, GpsUserResponseType user_response);
   1116 } GpsNiInterface;
   1117 
   1118 struct gps_device_t {
   1119     struct hw_device_t common;
   1120 
   1121     /**
   1122      * Set the provided lights to the provided values.
   1123      *
   1124      * Returns: 0 on succes, error code on failure.
   1125      */
   1126     const GpsInterface* (*get_gps_interface)(struct gps_device_t* dev);
   1127 };
   1128 
   1129 #define AGPS_RIL_REQUEST_SETID_IMSI     (1<<0L)
   1130 #define AGPS_RIL_REQUEST_SETID_MSISDN   (1<<1L)
   1131 
   1132 #define AGPS_RIL_REQUEST_REFLOC_CELLID  (1<<0L)
   1133 #define AGPS_RIL_REQUEST_REFLOC_MAC     (1<<1L)
   1134 
   1135 typedef void (*agps_ril_request_set_id)(uint32_t flags);
   1136 typedef void (*agps_ril_request_ref_loc)(uint32_t flags);
   1137 
   1138 typedef struct {
   1139     agps_ril_request_set_id request_setid;
   1140     agps_ril_request_ref_loc request_refloc;
   1141     gps_create_thread create_thread_cb;
   1142 } AGpsRilCallbacks;
   1143 
   1144 /** Extended interface for AGPS_RIL support. */
   1145 typedef struct {
   1146     /** set to sizeof(AGpsRilInterface) */
   1147     size_t          size;
   1148     /**
   1149      * Opens the AGPS interface and provides the callback routines
   1150      * to the implementation of this interface.
   1151      */
   1152     void  (*init)( AGpsRilCallbacks* callbacks );
   1153 
   1154     /**
   1155      * Sets the reference location.
   1156      */
   1157     void (*set_ref_location) (const AGpsRefLocation *agps_reflocation, size_t sz_struct);
   1158     /**
   1159      * Sets the set ID.
   1160      */
   1161     void (*set_set_id) (AGpsSetIDType type, const char* setid);
   1162 
   1163     /**
   1164      * Send network initiated message.
   1165      */
   1166     void (*ni_message) (uint8_t *msg, size_t len);
   1167 
   1168     /**
   1169      * Notify GPS of network status changes.
   1170      * These parameters match values in the android.net.NetworkInfo class.
   1171      */
   1172     void (*update_network_state) (int connected, int type, int roaming, const char* extra_info);
   1173 
   1174     /**
   1175      * Notify GPS of network status changes.
   1176      * These parameters match values in the android.net.NetworkInfo class.
   1177      */
   1178     void (*update_network_availability) (int avaiable, const char* apn);
   1179 } AGpsRilInterface;
   1180 
   1181 /**
   1182  * GPS Geofence.
   1183  *      There are 3 states associated with a Geofence: Inside, Outside, Unknown.
   1184  * There are 3 transitions: ENTERED, EXITED, UNCERTAIN.
   1185  *
   1186  * An example state diagram with confidence level: 95% and Unknown time limit
   1187  * set as 30 secs is shown below. (confidence level and Unknown time limit are
   1188  * explained latter)
   1189  *                         ____________________________
   1190  *                        |       Unknown (30 secs)   |
   1191  *                         """"""""""""""""""""""""""""
   1192  *                            ^ |                  |  ^
   1193  *                   UNCERTAIN| |ENTERED     EXITED|  |UNCERTAIN
   1194  *                            | v                  v  |
   1195  *                        ________    EXITED     _________
   1196  *                       | Inside | -----------> | Outside |
   1197  *                       |        | <----------- |         |
   1198  *                        """"""""    ENTERED    """""""""
   1199  *
   1200  * Inside state: We are 95% confident that the user is inside the geofence.
   1201  * Outside state: We are 95% confident that the user is outside the geofence
   1202  * Unknown state: Rest of the time.
   1203  *
   1204  * The Unknown state is better explained with an example:
   1205  *
   1206  *                            __________
   1207  *                           |         c|
   1208  *                           |  ___     |    _______
   1209  *                           |  |a|     |   |   b   |
   1210  *                           |  """     |    """""""
   1211  *                           |          |
   1212  *                            """"""""""
   1213  * In the diagram above, "a" and "b" are 2 geofences and "c" is the accuracy
   1214  * circle reported by the GPS subsystem. Now with regard to "b", the system is
   1215  * confident that the user is outside. But with regard to "a" is not confident
   1216  * whether it is inside or outside the geofence. If the accuracy remains the
   1217  * same for a sufficient period of time, the UNCERTAIN transition would be
   1218  * triggered with the state set to Unknown. If the accuracy improves later, an
   1219  * appropriate transition should be triggered.  This "sufficient period of time"
   1220  * is defined by the parameter in the add_geofence_area API.
   1221  *     In other words, Unknown state can be interpreted as a state in which the
   1222  * GPS subsystem isn't confident enough that the user is either inside or
   1223  * outside the Geofence. It moves to Unknown state only after the expiry of the
   1224  * timeout.
   1225  *
   1226  * The geofence callback needs to be triggered for the ENTERED and EXITED
   1227  * transitions, when the GPS system is confident that the user has entered
   1228  * (Inside state) or exited (Outside state) the Geofence. An implementation
   1229  * which uses a value of 95% as the confidence is recommended. The callback
   1230  * should be triggered only for the transitions requested by the
   1231  * add_geofence_area call.
   1232  *
   1233  * Even though the diagram and explanation talks about states and transitions,
   1234  * the callee is only interested in the transistions. The states are mentioned
   1235  * here for illustrative purposes.
   1236  *
   1237  * Startup Scenario: When the device boots up, if an application adds geofences,
   1238  * and then we get an accurate GPS location fix, it needs to trigger the
   1239  * appropriate (ENTERED or EXITED) transition for every Geofence it knows about.
   1240  * By default, all the Geofences will be in the Unknown state.
   1241  *
   1242  * When the GPS system is unavailable, gps_geofence_status_callback should be
   1243  * called to inform the upper layers of the same. Similarly, when it becomes
   1244  * available the callback should be called. This is a global state while the
   1245  * UNKNOWN transition described above is per geofence.
   1246  *
   1247  * An important aspect to note is that users of this API (framework), will use
   1248  * other subsystems like wifi, sensors, cell to handle Unknown case and
   1249  * hopefully provide a definitive state transition to the third party
   1250  * application. GPS Geofence will just be a signal indicating what the GPS
   1251  * subsystem knows about the Geofence.
   1252  *
   1253  */
   1254 #define GPS_GEOFENCE_ENTERED     (1<<0L)
   1255 #define GPS_GEOFENCE_EXITED      (1<<1L)
   1256 #define GPS_GEOFENCE_UNCERTAIN   (1<<2L)
   1257 
   1258 #define GPS_GEOFENCE_UNAVAILABLE (1<<0L)
   1259 #define GPS_GEOFENCE_AVAILABLE   (1<<1L)
   1260 
   1261 #define GPS_GEOFENCE_OPERATION_SUCCESS           0
   1262 #define GPS_GEOFENCE_ERROR_TOO_MANY_GEOFENCES -100
   1263 #define GPS_GEOFENCE_ERROR_ID_EXISTS          -101
   1264 #define GPS_GEOFENCE_ERROR_ID_UNKNOWN         -102
   1265 #define GPS_GEOFENCE_ERROR_INVALID_TRANSITION -103
   1266 #define GPS_GEOFENCE_ERROR_GENERIC            -149
   1267 
   1268 /**
   1269  * The callback associated with the geofence.
   1270  * Parameters:
   1271  *      geofence_id - The id associated with the add_geofence_area.
   1272  *      location    - The current GPS location.
   1273  *      transition  - Can be one of GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED,
   1274  *                    GPS_GEOFENCE_UNCERTAIN.
   1275  *      timestamp   - Timestamp when the transition was detected.
   1276  *
   1277  * The callback should only be called when the caller is interested in that
   1278  * particular transition. For instance, if the caller is interested only in
   1279  * ENTERED transition, then the callback should NOT be called with the EXITED
   1280  * transition.
   1281  *
   1282  * IMPORTANT: If a transition is triggered resulting in this callback, the GPS
   1283  * subsystem will wake up the application processor, if its in suspend state.
   1284  */
   1285 typedef void (*gps_geofence_transition_callback) (int32_t geofence_id,  GpsLocation* location,
   1286         int32_t transition, GpsUtcTime timestamp);
   1287 
   1288 /**
   1289  * The callback associated with the availability of the GPS system for geofencing
   1290  * monitoring. If the GPS system determines that it cannot monitor geofences
   1291  * because of lack of reliability or unavailability of the GPS signals, it will
   1292  * call this callback with GPS_GEOFENCE_UNAVAILABLE parameter.
   1293  *
   1294  * Parameters:
   1295  *  status - GPS_GEOFENCE_UNAVAILABLE or GPS_GEOFENCE_AVAILABLE.
   1296  *  last_location - Last known location.
   1297  */
   1298 typedef void (*gps_geofence_status_callback) (int32_t status, GpsLocation* last_location);
   1299 
   1300 /**
   1301  * The callback associated with the add_geofence call.
   1302  *
   1303  * Parameter:
   1304  * geofence_id - Id of the geofence.
   1305  * status - GPS_GEOFENCE_OPERATION_SUCCESS
   1306  *          GPS_GEOFENCE_ERROR_TOO_MANY_GEOFENCES  - geofence limit has been reached.
   1307  *          GPS_GEOFENCE_ERROR_ID_EXISTS  - geofence with id already exists
   1308  *          GPS_GEOFENCE_ERROR_INVALID_TRANSITION - the monitorTransition contains an
   1309  *              invalid transition
   1310  *          GPS_GEOFENCE_ERROR_GENERIC - for other errors.
   1311  */
   1312 typedef void (*gps_geofence_add_callback) (int32_t geofence_id, int32_t status);
   1313 
   1314 /**
   1315  * The callback associated with the remove_geofence call.
   1316  *
   1317  * Parameter:
   1318  * geofence_id - Id of the geofence.
   1319  * status - GPS_GEOFENCE_OPERATION_SUCCESS
   1320  *          GPS_GEOFENCE_ERROR_ID_UNKNOWN - for invalid id
   1321  *          GPS_GEOFENCE_ERROR_GENERIC for others.
   1322  */
   1323 typedef void (*gps_geofence_remove_callback) (int32_t geofence_id, int32_t status);
   1324 
   1325 
   1326 /**
   1327  * The callback associated with the pause_geofence call.
   1328  *
   1329  * Parameter:
   1330  * geofence_id - Id of the geofence.
   1331  * status - GPS_GEOFENCE_OPERATION_SUCCESS
   1332  *          GPS_GEOFENCE_ERROR_ID_UNKNOWN - for invalid id
   1333  *          GPS_GEOFENCE_ERROR_INVALID_TRANSITION -
   1334  *                    when monitor_transitions is invalid
   1335  *          GPS_GEOFENCE_ERROR_GENERIC for others.
   1336  */
   1337 typedef void (*gps_geofence_pause_callback) (int32_t geofence_id, int32_t status);
   1338 
   1339 /**
   1340  * The callback associated with the resume_geofence call.
   1341  *
   1342  * Parameter:
   1343  * geofence_id - Id of the geofence.
   1344  * status - GPS_GEOFENCE_OPERATION_SUCCESS
   1345  *          GPS_GEOFENCE_ERROR_ID_UNKNOWN - for invalid id
   1346  *          GPS_GEOFENCE_ERROR_GENERIC for others.
   1347  */
   1348 typedef void (*gps_geofence_resume_callback) (int32_t geofence_id, int32_t status);
   1349 
   1350 typedef struct {
   1351     gps_geofence_transition_callback geofence_transition_callback;
   1352     gps_geofence_status_callback geofence_status_callback;
   1353     gps_geofence_add_callback geofence_add_callback;
   1354     gps_geofence_remove_callback geofence_remove_callback;
   1355     gps_geofence_pause_callback geofence_pause_callback;
   1356     gps_geofence_resume_callback geofence_resume_callback;
   1357     gps_create_thread create_thread_cb;
   1358 } GpsGeofenceCallbacks;
   1359 
   1360 /** Extended interface for GPS_Geofencing support */
   1361 typedef struct {
   1362    /** set to sizeof(GpsGeofencingInterface) */
   1363    size_t          size;
   1364 
   1365    /**
   1366     * Opens the geofence interface and provides the callback routines
   1367     * to the implementation of this interface.
   1368     */
   1369    void  (*init)( GpsGeofenceCallbacks* callbacks );
   1370 
   1371    /**
   1372     * Add a geofence area. This api currently supports circular geofences.
   1373     * Parameters:
   1374     *    geofence_id - The id for the geofence. If a geofence with this id
   1375     *       already exists, an error value (GPS_GEOFENCE_ERROR_ID_EXISTS)
   1376     *       should be returned.
   1377     *    latitude, longtitude, radius_meters - The lat, long and radius
   1378     *       (in meters) for the geofence
   1379     *    last_transition - The current state of the geofence. For example, if
   1380     *       the system already knows that the user is inside the geofence,
   1381     *       this will be set to GPS_GEOFENCE_ENTERED. In most cases, it
   1382     *       will be GPS_GEOFENCE_UNCERTAIN.
   1383     *    monitor_transition - Which transitions to monitor. Bitwise OR of
   1384     *       GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED and
   1385     *       GPS_GEOFENCE_UNCERTAIN.
   1386     *    notification_responsiveness_ms - Defines the best-effort description
   1387     *       of how soon should the callback be called when the transition
   1388     *       associated with the Geofence is triggered. For instance, if set
   1389     *       to 1000 millseconds with GPS_GEOFENCE_ENTERED, the callback
   1390     *       should be called 1000 milliseconds within entering the geofence.
   1391     *       This parameter is defined in milliseconds.
   1392     *       NOTE: This is not to be confused with the rate that the GPS is
   1393     *       polled at. It is acceptable to dynamically vary the rate of
   1394     *       sampling the GPS for power-saving reasons; thus the rate of
   1395     *       sampling may be faster or slower than this.
   1396     *    unknown_timer_ms - The time limit after which the UNCERTAIN transition
   1397     *       should be triggered. This parameter is defined in milliseconds.
   1398     *       See above for a detailed explanation.
   1399     */
   1400    void (*add_geofence_area) (int32_t geofence_id, double latitude, double longitude,
   1401        double radius_meters, int last_transition, int monitor_transitions,
   1402        int notification_responsiveness_ms, int unknown_timer_ms);
   1403 
   1404    /**
   1405     * Pause monitoring a particular geofence.
   1406     * Parameters:
   1407     *   geofence_id - The id for the geofence.
   1408     */
   1409    void (*pause_geofence) (int32_t geofence_id);
   1410 
   1411    /**
   1412     * Resume monitoring a particular geofence.
   1413     * Parameters:
   1414     *   geofence_id - The id for the geofence.
   1415     *   monitor_transitions - Which transitions to monitor. Bitwise OR of
   1416     *       GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED and
   1417     *       GPS_GEOFENCE_UNCERTAIN.
   1418     *       This supersedes the value associated provided in the
   1419     *       add_geofence_area call.
   1420     */
   1421    void (*resume_geofence) (int32_t geofence_id, int monitor_transitions);
   1422 
   1423    /**
   1424     * Remove a geofence area. After the function returns, no notifications
   1425     * should be sent.
   1426     * Parameter:
   1427     *   geofence_id - The id for the geofence.
   1428     */
   1429    void (*remove_geofence_area) (int32_t geofence_id);
   1430 } GpsGeofencingInterface;
   1431 
   1432 /**
   1433  * Legacy struct to represent an estimate of the GPS clock time.
   1434  * Deprecated, to be removed in the next Android release.
   1435  * Use GnssClock instead.
   1436  */
   1437 typedef struct {
   1438     /** set to sizeof(GpsClock) */
   1439     size_t size;
   1440     GpsClockFlags flags;
   1441     int16_t leap_second;
   1442     GpsClockType type;
   1443     int64_t time_ns;
   1444     double time_uncertainty_ns;
   1445     int64_t full_bias_ns;
   1446     double bias_ns;
   1447     double bias_uncertainty_ns;
   1448     double drift_nsps;
   1449     double drift_uncertainty_nsps;
   1450 } GpsClock;
   1451 
   1452 /**
   1453  * Represents an estimate of the GPS clock time.
   1454  */
   1455 typedef struct {
   1456     /** set to sizeof(GnssClock) */
   1457     size_t size;
   1458 
   1459     /**
   1460      * A set of flags indicating the validity of the fields in this data
   1461      * structure.
   1462      */
   1463     GnssClockFlags flags;
   1464 
   1465     /**
   1466      * Leap second data.
   1467      * The sign of the value is defined by the following equation:
   1468      *      utc_time_ns = time_ns - (full_bias_ns + bias_ns) - leap_second *
   1469      *      1,000,000,000
   1470      *
   1471      * If the data is available 'flags' must contain GNSS_CLOCK_HAS_LEAP_SECOND.
   1472      */
   1473     int16_t leap_second;
   1474 
   1475     /**
   1476      * The GNSS receiver internal clock value. This is the local hardware clock
   1477      * value.
   1478      *
   1479      * For local hardware clock, this value is expected to be monotonically
   1480      * increasing while the hardware clock remains power on. (For the case of a
   1481      * HW clock that is not continuously on, see the
   1482      * hw_clock_discontinuity_count field). The receiver's estimate of GPS time
   1483      * can be derived by substracting the sum of full_bias_ns and bias_ns (when
   1484      * available) from this value.
   1485      *
   1486      * This GPS time is expected to be the best estimate of current GPS time
   1487      * that GNSS receiver can achieve.
   1488      *
   1489      * Sub-nanosecond accuracy can be provided by means of the 'bias_ns' field.
   1490      * The value contains the 'time uncertainty' in it.
   1491      *
   1492      * This field is mandatory.
   1493      */
   1494     int64_t time_ns;
   1495 
   1496     /**
   1497      * 1-Sigma uncertainty associated with the clock's time in nanoseconds.
   1498      * The uncertainty is represented as an absolute (single sided) value.
   1499      *
   1500      * If the data is available, 'flags' must contain
   1501      * GNSS_CLOCK_HAS_TIME_UNCERTAINTY. This value is effectively zero (it is
   1502      * the reference local clock, by which all other times and time
   1503      * uncertainties are measured.)  (And thus this field can be not provided,
   1504      * per GNSS_CLOCK_HAS_TIME_UNCERTAINTY flag, or provided & set to 0.)
   1505      */
   1506     double time_uncertainty_ns;
   1507 
   1508     /**
   1509      * The difference between hardware clock ('time' field) inside GPS receiver
   1510      * and the true GPS time since 0000Z, January 6, 1980, in nanoseconds.
   1511      *
   1512      * The sign of the value is defined by the following equation:
   1513      *      local estimate of GPS time = time_ns - (full_bias_ns + bias_ns)
   1514      *
   1515      * This value is mandatory if the receiver has estimated GPS time. If the
   1516      * computed time is for a non-GPS constellation, the time offset of that
   1517      * constellation to GPS has to be applied to fill this value. The error
   1518      * estimate for the sum of this and the bias_ns is the bias_uncertainty_ns,
   1519      * and the caller is responsible for using this uncertainty (it can be very
   1520      * large before the GPS time has been solved for.) If the data is available
   1521      * 'flags' must contain GNSS_CLOCK_HAS_FULL_BIAS.
   1522      */
   1523     int64_t full_bias_ns;
   1524 
   1525     /**
   1526      * Sub-nanosecond bias.
   1527      * The error estimate for the sum of this and the full_bias_ns is the
   1528      * bias_uncertainty_ns
   1529      *
   1530      * If the data is available 'flags' must contain GNSS_CLOCK_HAS_BIAS. If GPS
   1531      * has computed a position fix. This value is mandatory if the receiver has
   1532      * estimated GPS time.
   1533      */
   1534     double bias_ns;
   1535 
   1536     /**
   1537      * 1-Sigma uncertainty associated with the local estimate of GPS time (clock
   1538      * bias) in nanoseconds. The uncertainty is represented as an absolute
   1539      * (single sided) value.
   1540      *
   1541      * If the data is available 'flags' must contain
   1542      * GNSS_CLOCK_HAS_BIAS_UNCERTAINTY. This value is mandatory if the receiver
   1543      * has estimated GPS time.
   1544      */
   1545     double bias_uncertainty_ns;
   1546 
   1547     /**
   1548      * The clock's drift in nanoseconds (per second).
   1549      *
   1550      * A positive value means that the frequency is higher than the nominal
   1551      * frequency, and that the (full_bias_ns + bias_ns) is growing more positive
   1552      * over time.
   1553      *
   1554      * The value contains the 'drift uncertainty' in it.
   1555      * If the data is available 'flags' must contain GNSS_CLOCK_HAS_DRIFT.
   1556      *
   1557      * This value is mandatory if the receiver has estimated GNSS time
   1558      */
   1559     double drift_nsps;
   1560 
   1561     /**
   1562      * 1-Sigma uncertainty associated with the clock's drift in nanoseconds (per second).
   1563      * The uncertainty is represented as an absolute (single sided) value.
   1564      *
   1565      * If the data is available 'flags' must contain
   1566      * GNSS_CLOCK_HAS_DRIFT_UNCERTAINTY. If GPS has computed a position fix this
   1567      * field is mandatory and must be populated.
   1568      */
   1569     double drift_uncertainty_nsps;
   1570 
   1571     /**
   1572      * When there are any discontinuities in the HW clock, this field is
   1573      * mandatory.
   1574      *
   1575      * A "discontinuity" is meant to cover the case of a switch from one source
   1576      * of clock to another.  A single free-running crystal oscillator (XO)
   1577      * should generally not have any discontinuities, and this can be set and
   1578      * left at 0.
   1579      *
   1580      * If, however, the time_ns value (HW clock) is derived from a composite of
   1581      * sources, that is not as smooth as a typical XO, or is otherwise stopped &
   1582      * restarted, then this value shall be incremented each time a discontinuity
   1583      * occurs.  (E.g. this value may start at zero at device boot-up and
   1584      * increment each time there is a change in clock continuity. In the
   1585      * unlikely event that this value reaches full scale, rollover (not
   1586      * clamping) is required, such that this value continues to change, during
   1587      * subsequent discontinuity events.)
   1588      *
   1589      * While this number stays the same, between GnssClock reports, it can be
   1590      * safely assumed that the time_ns value has been running continuously, e.g.
   1591      * derived from a single, high quality clock (XO like, or better, that's
   1592      * typically used during continuous GNSS signal sampling.)
   1593      *
   1594      * It is expected, esp. during periods where there are few GNSS signals
   1595      * available, that the HW clock be discontinuity-free as long as possible,
   1596      * as this avoids the need to use (waste) a GNSS measurement to fully
   1597      * re-solve for the GPS clock bias and drift, when using the accompanying
   1598      * measurements, from consecutive GnssData reports.
   1599      */
   1600     uint32_t hw_clock_discontinuity_count;
   1601 
   1602 } GnssClock;
   1603 
   1604 /**
   1605  * Legacy struct to represent a GPS Measurement, it contains raw and computed
   1606  * information.
   1607  * Deprecated, to be removed in the next Android release.
   1608  * Use GnssMeasurement instead.
   1609  */
   1610 typedef struct {
   1611     /** set to sizeof(GpsMeasurement) */
   1612     size_t size;
   1613     GpsMeasurementFlags flags;
   1614     int8_t prn;
   1615     double time_offset_ns;
   1616     GpsMeasurementState state;
   1617     int64_t received_gps_tow_ns;
   1618     int64_t received_gps_tow_uncertainty_ns;
   1619     double c_n0_dbhz;
   1620     double pseudorange_rate_mps;
   1621     double pseudorange_rate_uncertainty_mps;
   1622     GpsAccumulatedDeltaRangeState accumulated_delta_range_state;
   1623     double accumulated_delta_range_m;
   1624     double accumulated_delta_range_uncertainty_m;
   1625     double pseudorange_m;
   1626     double pseudorange_uncertainty_m;
   1627     double code_phase_chips;
   1628     double code_phase_uncertainty_chips;
   1629     float carrier_frequency_hz;
   1630     int64_t carrier_cycles;
   1631     double carrier_phase;
   1632     double carrier_phase_uncertainty;
   1633     GpsLossOfLock loss_of_lock;
   1634     int32_t bit_number;
   1635     int16_t time_from_last_bit_ms;
   1636     double doppler_shift_hz;
   1637     double doppler_shift_uncertainty_hz;
   1638     GpsMultipathIndicator multipath_indicator;
   1639     double snr_db;
   1640     double elevation_deg;
   1641     double elevation_uncertainty_deg;
   1642     double azimuth_deg;
   1643     double azimuth_uncertainty_deg;
   1644     bool used_in_fix;
   1645 } GpsMeasurement;
   1646 
   1647 /**
   1648  * Represents a GNSS Measurement, it contains raw and computed information.
   1649  *
   1650  * Independence - All signal measurement information (e.g. sv_time,
   1651  * pseudorange_rate, multipath_indicator) reported in this struct should be
   1652  * based on GNSS signal measurements only. You may not synthesize measurements
   1653  * by calculating or reporting expected measurements based on known or estimated
   1654  * position, velocity, or time.
   1655  */
   1656 typedef struct {
   1657     /** set to sizeof(GpsMeasurement) */
   1658     size_t size;
   1659 
   1660     /** A set of flags indicating the validity of the fields in this data structure. */
   1661     GnssMeasurementFlags flags;
   1662 
   1663     /**
   1664      * Satellite vehicle ID number, as defined in GnssSvInfo::svid
   1665      * This is a mandatory value.
   1666      */
   1667     int16_t svid;
   1668 
   1669     /**
   1670      * Defines the constellation of the given SV. Value should be one of those
   1671      * GNSS_CONSTELLATION_* constants
   1672      */
   1673     GnssConstellationType constellation;
   1674 
   1675     /**
   1676      * Time offset at which the measurement was taken in nanoseconds.
   1677      * The reference receiver's time is specified by GpsData::clock::time_ns and should be
   1678      * interpreted in the same way as indicated by GpsClock::type.
   1679      *
   1680      * The sign of time_offset_ns is given by the following equation:
   1681      *      measurement time = GpsClock::time_ns + time_offset_ns
   1682      *
   1683      * It provides an individual time-stamp for the measurement, and allows sub-nanosecond accuracy.
   1684      * This is a mandatory value.
   1685      */
   1686     double time_offset_ns;
   1687 
   1688     /**
   1689      * Per satellite sync state. It represents the current sync state for the associated satellite.
   1690      * Based on the sync state, the 'received GPS tow' field should be interpreted accordingly.
   1691      *
   1692      * This is a mandatory value.
   1693      */
   1694     GnssMeasurementState state;
   1695 
   1696     /**
   1697      * The received GNSS Time-of-Week at the measurement time, in nanoseconds.
   1698      * Ensure that this field is independent (see comment at top of
   1699      * GnssMeasurement struct.)
   1700      *
   1701      * For GPS & QZSS, this is:
   1702      *   Received GPS Time-of-Week at the measurement time, in nanoseconds.
   1703      *   The value is relative to the beginning of the current GPS week.
   1704      *
   1705      *   Given the highest sync state that can be achieved, per each satellite, valid range
   1706      *   for this field can be:
   1707      *     Searching       : [ 0       ]   : GNSS_MEASUREMENT_STATE_UNKNOWN
   1708      *     C/A code lock   : [ 0   1ms ]   : GNSS_MEASUREMENT_STATE_CODE_LOCK is set
   1709      *     Bit sync        : [ 0  20ms ]   : GNSS_MEASUREMENT_STATE_BIT_SYNC is set
   1710      *     Subframe sync   : [ 0    6s ]   : GNSS_MEASUREMENT_STATE_SUBFRAME_SYNC is set
   1711      *     TOW decoded     : [ 0 1week ]   : GNSS_MEASUREMENT_STATE_TOW_DECODED is set
   1712      *
   1713      *   Note well: if there is any ambiguity in integer millisecond,
   1714      *   GNSS_MEASUREMENT_STATE_MSEC_AMBIGUOUS should be set accordingly, in the 'state' field.
   1715      *
   1716      *   This value must be populated if 'state' != GNSS_MEASUREMENT_STATE_UNKNOWN.
   1717      *
   1718      * For Glonass, this is:
   1719      *   Received Glonass time of day, at the measurement time in nanoseconds.
   1720      *
   1721      *   Given the highest sync state that can be achieved, per each satellite, valid range for
   1722      *   this field can be:
   1723      *     Searching       : [ 0       ]   : GNSS_MEASUREMENT_STATE_UNKNOWN
   1724      *     C/A code lock   : [ 0   1ms ]   : GNSS_MEASUREMENT_STATE_CODE_LOCK is set
   1725      *     Symbol sync     : [ 0  10ms ]   : GNSS_MEASUREMENT_STATE_SYMBOL_SYNC is set
   1726      *     Bit sync        : [ 0  20ms ]   : GNSS_MEASUREMENT_STATE_BIT_SYNC is set
   1727      *     String sync     : [ 0    2s ]   : GNSS_MEASUREMENT_STATE_GLO_STRING_SYNC is set
   1728      *     Time of day     : [ 0  1day ]   : GNSS_MEASUREMENT_STATE_GLO_TOD_DECODED is set
   1729      *
   1730      * For Beidou, this is:
   1731      *   Received Beidou time of week, at the measurement time in nanoseconds.
   1732      *
   1733      *   Given the highest sync state that can be achieved, per each satellite, valid range for
   1734      *   this field can be:
   1735      *     Searching    : [ 0       ] : GNSS_MEASUREMENT_STATE_UNKNOWN
   1736      *     C/A code lock: [ 0   1ms ] : GNSS_MEASUREMENT_STATE_CODE_LOCK is set
   1737      *     Bit sync (D2): [ 0   2ms ] : GNSS_MEASUREMENT_STATE_BDS_D2_BIT_SYNC is set
   1738      *     Bit sync (D1): [ 0  20ms ] : GNSS_MEASUREMENT_STATE_BIT_SYNC is set
   1739      *     Subframe (D2): [ 0  0.6s ] : GNSS_MEASUREMENT_STATE_BDS_D2_SUBFRAME_SYNC is set
   1740      *     Subframe (D1): [ 0    6s ] : GNSS_MEASUREMENT_STATE_SUBFRAME_SYNC is set
   1741      *     Time of week : [ 0 1week ] : GNSS_MEASUREMENT_STATE_TOW_DECODED is set
   1742      *
   1743      * For Galileo, this is:
   1744      *   Received Galileo time of week, at the measurement time in nanoseconds.
   1745      *
   1746      *     E1BC code lock   : [ 0   4ms ]   : GNSS_MEASUREMENT_STATE_GAL_E1BC_CODE_LOCK is set
   1747      *     E1C 2nd code lock: [ 0 100ms ]   :
   1748      *     GNSS_MEASUREMENT_STATE_GAL_E1C_2ND_CODE_LOCK is set
   1749      *
   1750      *     E1B page    : [ 0    2s ] : GNSS_MEASUREMENT_STATE_GAL_E1B_PAGE_SYNC is set
   1751      *     Time of week: [ 0 1week ] : GNSS_MEASUREMENT_STATE_TOW_DECODED is set
   1752      *
   1753      * For SBAS, this is:
   1754      *   Received SBAS time, at the measurement time in nanoseconds.
   1755      *
   1756      *   Given the highest sync state that can be achieved, per each satellite,
   1757      *   valid range for this field can be:
   1758      *     Searching    : [ 0     ] : GNSS_MEASUREMENT_STATE_UNKNOWN
   1759      *     C/A code lock: [ 0 1ms ] : GNSS_MEASUREMENT_STATE_CODE_LOCK is set
   1760      *     Symbol sync  : [ 0 2ms ] : GNSS_MEASUREMENT_STATE_SYMBOL_SYNC is set
   1761      *     Message      : [ 0  1s ] : GNSS_MEASUREMENT_STATE_SBAS_SYNC is set
   1762     */
   1763     int64_t received_sv_time_in_ns;
   1764 
   1765     /**
   1766      * 1-Sigma uncertainty of the Received GPS Time-of-Week in nanoseconds.
   1767      *
   1768      * This value must be populated if 'state' != GPS_MEASUREMENT_STATE_UNKNOWN.
   1769      */
   1770     int64_t received_sv_time_uncertainty_in_ns;
   1771 
   1772     /**
   1773      * Carrier-to-noise density in dB-Hz, typically in the range [0, 63].
   1774      * It contains the measured C/N0 value for the signal at the antenna port.
   1775      *
   1776      * This is a mandatory value.
   1777      */
   1778     double c_n0_dbhz;
   1779 
   1780     /**
   1781      * Pseudorange rate at the timestamp in m/s. The correction of a given
   1782      * Pseudorange Rate value includes corrections for receiver and satellite
   1783      * clock frequency errors. Ensure that this field is independent (see
   1784      * comment at top of GnssMeasurement struct.)
   1785      *
   1786      * It is mandatory to provide the 'uncorrected' 'pseudorange rate', and provide GpsClock's
   1787      * 'drift' field as well (When providing the uncorrected pseudorange rate, do not apply the
   1788      * corrections described above.)
   1789      *
   1790      * The value includes the 'pseudorange rate uncertainty' in it.
   1791      * A positive 'uncorrected' value indicates that the SV is moving away from the receiver.
   1792      *
   1793      * The sign of the 'uncorrected' 'pseudorange rate' and its relation to the sign of 'doppler
   1794      * shift' is given by the equation:
   1795      *      pseudorange rate = -k * doppler shift   (where k is a constant)
   1796      *
   1797      * This should be the most accurate pseudorange rate available, based on
   1798      * fresh signal measurements from this channel.
   1799      *
   1800      * It is mandatory that this value be provided at typical carrier phase PRR
   1801      * quality (few cm/sec per second of uncertainty, or better) - when signals
   1802      * are sufficiently strong & stable, e.g. signals from a GPS simulator at >=
   1803      * 35 dB-Hz.
   1804      */
   1805     double pseudorange_rate_mps;
   1806 
   1807     /**
   1808      * 1-Sigma uncertainty of the pseudorange_rate_mps.
   1809      * The uncertainty is represented as an absolute (single sided) value.
   1810      *
   1811      * This is a mandatory value.
   1812      */
   1813     double pseudorange_rate_uncertainty_mps;
   1814 
   1815     /**
   1816      * Accumulated delta range's state. It indicates whether ADR is reset or there is a cycle slip
   1817      * (indicating loss of lock).
   1818      *
   1819      * This is a mandatory value.
   1820      */
   1821     GnssAccumulatedDeltaRangeState accumulated_delta_range_state;
   1822 
   1823     /**
   1824      * Accumulated delta range since the last channel reset in meters.
   1825      * A positive value indicates that the SV is moving away from the receiver.
   1826      *
   1827      * The sign of the 'accumulated delta range' and its relation to the sign of 'carrier phase'
   1828      * is given by the equation:
   1829      *          accumulated delta range = -k * carrier phase    (where k is a constant)
   1830      *
   1831      * This value must be populated if 'accumulated delta range state' != GPS_ADR_STATE_UNKNOWN.
   1832      * However, it is expected that the data is only accurate when:
   1833      *      'accumulated delta range state' == GPS_ADR_STATE_VALID.
   1834      */
   1835     double accumulated_delta_range_m;
   1836 
   1837     /**
   1838      * 1-Sigma uncertainty of the accumulated delta range in meters.
   1839      * This value must be populated if 'accumulated delta range state' != GPS_ADR_STATE_UNKNOWN.
   1840      */
   1841     double accumulated_delta_range_uncertainty_m;
   1842 
   1843     /**
   1844      * Carrier frequency at which codes and messages are modulated, it can be L1 or L2.
   1845      * If the field is not set, the carrier frequency is assumed to be L1.
   1846      *
   1847      * If the data is available, 'flags' must contain
   1848      * GNSS_MEASUREMENT_HAS_CARRIER_FREQUENCY.
   1849      */
   1850     float carrier_frequency_hz;
   1851 
   1852     /**
   1853      * The number of full carrier cycles between the satellite and the receiver.
   1854      * The reference frequency is given by the field 'carrier_frequency_hz'.
   1855      * Indications of possible cycle slips and resets in the accumulation of
   1856      * this value can be inferred from the accumulated_delta_range_state flags.
   1857      *
   1858      * If the data is available, 'flags' must contain
   1859      * GNSS_MEASUREMENT_HAS_CARRIER_CYCLES.
   1860      */
   1861     int64_t carrier_cycles;
   1862 
   1863     /**
   1864      * The RF phase detected by the receiver, in the range [0.0, 1.0].
   1865      * This is usually the fractional part of the complete carrier phase measurement.
   1866      *
   1867      * The reference frequency is given by the field 'carrier_frequency_hz'.
   1868      * The value contains the 'carrier-phase uncertainty' in it.
   1869      *
   1870      * If the data is available, 'flags' must contain
   1871      * GNSS_MEASUREMENT_HAS_CARRIER_PHASE.
   1872      */
   1873     double carrier_phase;
   1874 
   1875     /**
   1876      * 1-Sigma uncertainty of the carrier-phase.
   1877      * If the data is available, 'flags' must contain
   1878      * GNSS_MEASUREMENT_HAS_CARRIER_PHASE_UNCERTAINTY.
   1879      */
   1880     double carrier_phase_uncertainty;
   1881 
   1882     /**
   1883      * An enumeration that indicates the 'multipath' state of the event.
   1884      *
   1885      * The multipath Indicator is intended to report the presence of overlapping
   1886      * signals that manifest as distorted correlation peaks.
   1887      *
   1888      * - if there is a distorted correlation peak shape, report that multipath
   1889      *   is GNSS_MULTIPATH_INDICATOR_PRESENT.
   1890      * - if there is not a distorted correlation peak shape, report
   1891      *   GNSS_MULTIPATH_INDICATOR_NOT_PRESENT
   1892      * - if signals are too weak to discern this information, report
   1893      *   GNSS_MULTIPATH_INDICATOR_UNKNOWN
   1894      *
   1895      * Example: when doing the standardized overlapping Multipath Performance
   1896      * test (3GPP TS 34.171) the Multipath indicator should report
   1897      * GNSS_MULTIPATH_INDICATOR_PRESENT for those signals that are tracked, and
   1898      * contain multipath, and GNSS_MULTIPATH_INDICATOR_NOT_PRESENT for those
   1899      * signals that are tracked and do not contain multipath.
   1900      */
   1901     GnssMultipathIndicator multipath_indicator;
   1902 
   1903     /**
   1904      * Signal-to-noise ratio at correlator output in dB.
   1905      * If the data is available, 'flags' must contain GNSS_MEASUREMENT_HAS_SNR.
   1906      * This is the power ratio of the "correlation peak height above the
   1907      * observed noise floor" to "the noise RMS".
   1908      */
   1909     double snr_db;
   1910 } GnssMeasurement;
   1911 
   1912 /**
   1913  * Legacy struct to represents a reading of GPS measurements.
   1914  * Deprecated, to be removed in the next Android release.
   1915  * Use GnssData instead.
   1916  */
   1917 typedef struct {
   1918     /** set to sizeof(GpsData) */
   1919     size_t size;
   1920     size_t measurement_count;
   1921     GpsMeasurement measurements[GPS_MAX_MEASUREMENT];
   1922 
   1923     /** The GPS clock time reading. */
   1924     GpsClock clock;
   1925 } GpsData;
   1926 
   1927 /**
   1928  * Represents a reading of GNSS measurements. For devices where GnssSystemInfo's
   1929  * year_of_hw is set to 2016+, it is mandatory that these be provided, on
   1930  * request, when the GNSS receiver is searching/tracking signals.
   1931  *
   1932  * - Reporting of GPS constellation measurements is mandatory.
   1933  * - Reporting of all tracked constellations are encouraged.
   1934  */
   1935 typedef struct {
   1936     /** set to sizeof(GnssData) */
   1937     size_t size;
   1938 
   1939     /** Number of measurements. */
   1940     size_t measurement_count;
   1941 
   1942     /** The array of measurements. */
   1943     GnssMeasurement measurements[GNSS_MAX_MEASUREMENT];
   1944 
   1945     /** The GPS clock time reading. */
   1946     GnssClock clock;
   1947 } GnssData;
   1948 
   1949 /**
   1950  * The legacy callback for to report measurements from the HAL.
   1951  *
   1952  * This callback is deprecated, and will be removed in the next release. Use
   1953  * gnss_measurement_callback() instead.
   1954  *
   1955  * Parameters:
   1956  *    data - A data structure containing the measurements.
   1957  */
   1958 typedef void (*gps_measurement_callback) (GpsData* data);
   1959 
   1960 /**
   1961  * The callback for to report measurements from the HAL.
   1962  *
   1963  * Parameters:
   1964  *    data - A data structure containing the measurements.
   1965  */
   1966 typedef void (*gnss_measurement_callback) (GnssData* data);
   1967 
   1968 typedef struct {
   1969     /** set to sizeof(GpsMeasurementCallbacks) */
   1970     size_t size;
   1971     gps_measurement_callback measurement_callback;
   1972     gnss_measurement_callback gnss_measurement_callback;
   1973 } GpsMeasurementCallbacks;
   1974 
   1975 #define GPS_MEASUREMENT_OPERATION_SUCCESS          0
   1976 #define GPS_MEASUREMENT_ERROR_ALREADY_INIT      -100
   1977 #define GPS_MEASUREMENT_ERROR_GENERIC           -101
   1978 
   1979 /**
   1980  * Extended interface for GPS Measurements support.
   1981  */
   1982 typedef struct {
   1983     /** Set to sizeof(GpsMeasurementInterface) */
   1984     size_t size;
   1985 
   1986     /**
   1987      * Initializes the interface and registers the callback routines with the HAL.
   1988      * After a successful call to 'init' the HAL must begin to provide updates at its own phase.
   1989      *
   1990      * Status:
   1991      *    GPS_MEASUREMENT_OPERATION_SUCCESS
   1992      *    GPS_MEASUREMENT_ERROR_ALREADY_INIT - if a callback has already been registered without a
   1993      *              corresponding call to 'close'
   1994      *    GPS_MEASUREMENT_ERROR_GENERIC - if any other error occurred, it is expected that the HAL
   1995      *              will not generate any updates upon returning this error code.
   1996      */
   1997     int (*init) (GpsMeasurementCallbacks* callbacks);
   1998 
   1999     /**
   2000      * Stops updates from the HAL, and unregisters the callback routines.
   2001      * After a call to stop, the previously registered callbacks must be considered invalid by the
   2002      * HAL.
   2003      * If stop is invoked without a previous 'init', this function should perform no work.
   2004      */
   2005     void (*close) ();
   2006 
   2007 } GpsMeasurementInterface;
   2008 
   2009 /**
   2010  * Legacy struct to represents a GPS navigation message (or a fragment of it).
   2011  * Deprecated, to be removed in the next Android release.
   2012  * Use GnssNavigationMessage instead.
   2013  */
   2014 typedef struct {
   2015     /** set to sizeof(GpsNavigationMessage) */
   2016     size_t size;
   2017     int8_t prn;
   2018     GpsNavigationMessageType type;
   2019     NavigationMessageStatus status;
   2020     int16_t message_id;
   2021     int16_t submessage_id;
   2022     size_t data_length;
   2023     uint8_t* data;
   2024 } GpsNavigationMessage;
   2025 
   2026 /** Represents a GPS navigation message (or a fragment of it). */
   2027 typedef struct {
   2028     /** set to sizeof(GnssNavigationMessage) */
   2029     size_t size;
   2030 
   2031     /**
   2032      * Satellite vehicle ID number, as defined in GnssSvInfo::svid
   2033      * This is a mandatory value.
   2034      */
   2035     int16_t svid;
   2036 
   2037     /**
   2038      * The type of message contained in the structure.
   2039      * This is a mandatory value.
   2040      */
   2041     GnssNavigationMessageType type;
   2042 
   2043     /**
   2044      * The status of the received navigation message.
   2045      * No need to send any navigation message that contains words with parity error and cannot be
   2046      * corrected.
   2047      */
   2048     NavigationMessageStatus status;
   2049 
   2050     /**
   2051      * Message identifier. It provides an index so the complete Navigation
   2052      * Message can be assembled.
   2053      *
   2054      * - For GPS L1 C/A subframe 4 and 5, this value corresponds to the 'frame
   2055      *   id' of the navigation message, in the range of 1-25 (Subframe 1, 2, 3
   2056      *   does not contain a 'frame id' and this value can be set to -1.)
   2057      *
   2058      * - For Glonass L1 C/A, this refers to the frame ID, in the range of 1-5.
   2059      *
   2060      * - For BeiDou D1, this refers to the frame number in the range of 1-24
   2061      *
   2062      * - For Beidou D2, this refers to the frame number, in the range of 1-120
   2063      *
   2064      * - For Galileo F/NAV nominal frame structure, this refers to the subframe
   2065      *   number, in the range of 1-12
   2066      *
   2067      * - For Galileo I/NAV nominal frame structure, this refers to the subframe
   2068      *   number in the range of 1-24
   2069      */
   2070     int16_t message_id;
   2071 
   2072     /**
   2073      * Sub-message identifier. If required by the message 'type', this value
   2074      * contains a sub-index within the current message (or frame) that is being
   2075      * transmitted.
   2076      *
   2077      * - For GPS L1 C/A, BeiDou D1 & BeiDou D2, the submessage id corresponds to
   2078      *   the subframe number of the navigation message, in the range of 1-5.
   2079      *
   2080      * - For Glonass L1 C/A, this refers to the String number, in the range from
   2081      *   1-15
   2082      *
   2083      * - For Galileo F/NAV, this refers to the page type in the range 1-6
   2084      *
   2085      * - For Galileo I/NAV, this refers to the word type in the range 1-10+
   2086      */
   2087     int16_t submessage_id;
   2088 
   2089     /**
   2090      * The length of the data (in bytes) contained in the current message.
   2091      * If this value is different from zero, 'data' must point to an array of the same size.
   2092      * e.g. for L1 C/A the size of the sub-frame will be 40 bytes (10 words, 30 bits/word).
   2093      *
   2094      * This is a mandatory value.
   2095      */
   2096     size_t data_length;
   2097 
   2098     /**
   2099      * The data of the reported GPS message. The bytes (or words) specified
   2100      * using big endian format (MSB first).
   2101      *
   2102      * - For GPS L1 C/A, Beidou D1 & Beidou D2, each subframe contains 10 30-bit
   2103      *   words. Each word (30 bits) should be fit into the last 30 bits in a
   2104      *   4-byte word (skip B31 and B32), with MSB first, for a total of 40
   2105      *   bytes, covering a time period of 6, 6, and 0.6 seconds, respectively.
   2106      *
   2107      * - For Glonass L1 C/A, each string contains 85 data bits, including the
   2108      *   checksum.  These bits should be fit into 11 bytes, with MSB first (skip
   2109      *   B86-B88), covering a time period of 2 seconds.
   2110      *
   2111      * - For Galileo F/NAV, each word consists of 238-bit (sync & tail symbols
   2112      *   excluded). Each word should be fit into 30-bytes, with MSB first (skip
   2113      *   B239, B240), covering a time period of 10 seconds.
   2114      *
   2115      * - For Galileo I/NAV, each page contains 2 page parts, even and odd, with
   2116      *   a total of 2x114 = 228 bits, (sync & tail excluded) that should be fit
   2117      *   into 29 bytes, with MSB first (skip B229-B232).
   2118      */
   2119     uint8_t* data;
   2120 
   2121 } GnssNavigationMessage;
   2122 
   2123 /**
   2124  * The legacy callback to report an available fragment of a GPS navigation
   2125  * messages from the HAL.
   2126  *
   2127  * This callback is deprecated, and will be removed in the next release. Use
   2128  * gnss_navigation_message_callback() instead.
   2129  *
   2130  * Parameters:
   2131  *      message - The GPS navigation submessage/subframe representation.
   2132  */
   2133 typedef void (*gps_navigation_message_callback) (GpsNavigationMessage* message);
   2134 
   2135 /**
   2136  * The callback to report an available fragment of a GPS navigation messages from the HAL.
   2137  *
   2138  * Parameters:
   2139  *      message - The GPS navigation submessage/subframe representation.
   2140  */
   2141 typedef void (*gnss_navigation_message_callback) (GnssNavigationMessage* message);
   2142 
   2143 typedef struct {
   2144     /** set to sizeof(GpsNavigationMessageCallbacks) */
   2145     size_t size;
   2146     gps_navigation_message_callback navigation_message_callback;
   2147     gnss_navigation_message_callback gnss_navigation_message_callback;
   2148 } GpsNavigationMessageCallbacks;
   2149 
   2150 #define GPS_NAVIGATION_MESSAGE_OPERATION_SUCCESS             0
   2151 #define GPS_NAVIGATION_MESSAGE_ERROR_ALREADY_INIT         -100
   2152 #define GPS_NAVIGATION_MESSAGE_ERROR_GENERIC              -101
   2153 
   2154 /**
   2155  * Extended interface for GPS navigation message reporting support.
   2156  */
   2157 typedef struct {
   2158     /** Set to sizeof(GpsNavigationMessageInterface) */
   2159     size_t size;
   2160 
   2161     /**
   2162      * Initializes the interface and registers the callback routines with the HAL.
   2163      * After a successful call to 'init' the HAL must begin to provide updates as they become
   2164      * available.
   2165      *
   2166      * Status:
   2167      *      GPS_NAVIGATION_MESSAGE_OPERATION_SUCCESS
   2168      *      GPS_NAVIGATION_MESSAGE_ERROR_ALREADY_INIT - if a callback has already been registered
   2169      *              without a corresponding call to 'close'.
   2170      *      GPS_NAVIGATION_MESSAGE_ERROR_GENERIC - if any other error occurred, it is expected that
   2171      *              the HAL will not generate any updates upon returning this error code.
   2172      */
   2173     int (*init) (GpsNavigationMessageCallbacks* callbacks);
   2174 
   2175     /**
   2176      * Stops updates from the HAL, and unregisters the callback routines.
   2177      * After a call to stop, the previously registered callbacks must be considered invalid by the
   2178      * HAL.
   2179      * If stop is invoked without a previous 'init', this function should perform no work.
   2180      */
   2181     void (*close) ();
   2182 
   2183 } GpsNavigationMessageInterface;
   2184 
   2185 /**
   2186  * Interface for passing GNSS configuration contents from platform to HAL.
   2187  */
   2188 typedef struct {
   2189     /** Set to sizeof(GnssConfigurationInterface) */
   2190     size_t size;
   2191 
   2192     /**
   2193      * Deliver GNSS configuration contents to HAL.
   2194      * Parameters:
   2195      *     config_data - a pointer to a char array which holds what usually is expected from
   2196                          file(/etc/gps.conf), i.e., a sequence of UTF8 strings separated by '\n'.
   2197      *     length - total number of UTF8 characters in configuraiton data.
   2198      *
   2199      * IMPORTANT:
   2200      *      GPS HAL should expect this function can be called multiple times. And it may be
   2201      *      called even when GpsLocationProvider is already constructed and enabled. GPS HAL
   2202      *      should maintain the existing requests for various callback regardless the change
   2203      *      in configuration data.
   2204      */
   2205     void (*configuration_update) (const char* config_data, int32_t length);
   2206 } GnssConfigurationInterface;
   2207 
   2208 __END_DECLS
   2209 
   2210 #endif /* ANDROID_INCLUDE_HARDWARE_GPS_H */
   2211 
   2212