blob: b32199e884feda4e2492eed7e71218fa1bb68d1a [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ANDROID_INCLUDE_HARDWARE_GPS_MTK_H
#define ANDROID_INCLUDE_HARDWARE_GPS_MTK_H
#include <hardware/gps_internal.h>
__BEGIN_DECLS
// MTK extended GpsAidingData values.
#define GPS_DELETE_HOT_STILL 0x2000
#define GPS_DELETE_EPO 0x4000
// ====================vzw debug screen API =================
/**
* Name for the VZW debug interface.
*/
#define VZW_DEBUG_INTERFACE "vzw-debug"
#define VZW_DEBUG_STRING_MAXLEN 200
/** Represents data of VzwDebugData. */
typedef struct {
/** set to sizeof(VzwDebugData) */
size_t size;
char vzw_msg_data[VZW_DEBUG_STRING_MAXLEN];
} VzwDebugData;
typedef void (* vzw_debug_callback)(VzwDebugData* vzw_message);
/** Callback structure for the Vzw debug interface. */
typedef struct {
vzw_debug_callback vzw_debug_cb;
} VzwDebugCallbacks;
/** Extended interface for VZW DEBUG support. */
typedef struct {
/** set to sizeof(VzwDebugInterface) */
size_t size;
/** Registers the callbacks for Vzw debug message. */
int (*init)( VzwDebugCallbacks* callbacks );
/** Set Vzw debug screen enable/disable **/
void (*set_vzw_debug_screen)(bool enabled);
} VzwDebugInterface;
////////////////////// GNSS HIDL v1.0 ////////////////////////////
/** Represents a location. */
typedef struct {
GpsLocation legacyLocation;
/**
* Represents expected horizontal position accuracy, radial, in meters
* (68% confidence).
*/
float horizontalAccuracyMeters;
/**
* Represents expected vertical position accuracy in meters
* (68% confidence).
*/
float verticalAccuracyMeters;
/**
* Represents expected speed accuracy in meter per seconds
* (68% confidence).
*/
float speedAccuracyMetersPerSecond;
/**
* Represents expected bearing accuracy in degrees
* (68% confidence).
*/
float bearingAccuracyDegrees;
} GpsLocation_ext;
typedef struct {
GnssSvInfo legacySvInfo;
/// v1.0 ///
float carrier_frequency;
} GnssSvInfo_ext;
/**
* Represents SV status.
*/
typedef struct {
/** set to sizeof(GnssSvStatus) */
size_t size;
/** Number of GPS SVs currently visible, refers to the SVs stored in sv_list */
int num_svs;
/**
* Pointer to an array of SVs information for all GNSS constellations,
* except GPS, which is reported using sv_list
*/
GnssSvInfo_ext gnss_sv_list[GNSS_MAX_SVS];
} GnssSvStatus_ext;
/**
* Callback with location information. Can only be called from a thread created
* by create_thread_cb.
*/
typedef void (* gps_location_ext_callback)(GpsLocation_ext* location);
/**
* Callback with SV status information.
* Can only be called from a thread created by create_thread_cb.
*/
typedef void (* gnss_sv_status_ext_callback)(GnssSvStatus_ext* sv_info);
/**
* The callback associated with the geofence.
* Parameters:
* geofence_id - The id associated with the add_geofence_area.
* location - The current GPS location.
* transition - Can be one of GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED,
* GPS_GEOFENCE_UNCERTAIN.
* timestamp - Timestamp when the transition was detected.
*
* The callback should only be called when the caller is interested in that
* particular transition. For instance, if the caller is interested only in
* ENTERED transition, then the callback should NOT be called with the EXITED
* transition.
*
* IMPORTANT: If a transition is triggered resulting in this callback, the GPS
* subsystem will wake up the application processor, if its in suspend state.
*/
typedef void (*gps_geofence_transition_ext_callback) (int32_t geofence_id,
GpsLocation_ext* location, int32_t transition, GpsUtcTime timestamp);
/**
* The callback associated with the availability of the GPS system for geofencing
* monitoring. If the GPS system determines that it cannot monitor geofences
* because of lack of reliability or unavailability of the GPS signals, it will
* call this callback with GPS_GEOFENCE_UNAVAILABLE parameter.
*
* Parameters:
* status - GPS_GEOFENCE_UNAVAILABLE or GPS_GEOFENCE_AVAILABLE.
* last_location - Last known location.
*/
typedef void (*gps_geofence_status_ext_callback) (int32_t status,
GpsLocation_ext* last_location);
typedef struct {
gps_geofence_transition_ext_callback geofence_transition_callback;
gps_geofence_status_ext_callback geofence_status_callback;
gps_geofence_add_callback geofence_add_callback;
gps_geofence_remove_callback geofence_remove_callback;
gps_geofence_pause_callback geofence_pause_callback;
gps_geofence_resume_callback geofence_resume_callback;
gps_create_thread create_thread_cb;
} GpsGeofenceCallbacks_ext;
/** Extended interface for GPS_Geofencing support */
typedef struct {
/** set to sizeof(GpsGeofencingInterface) */
size_t size;
/**
* Opens the geofence interface and provides the callback routines
* to the implementation of this interface.
*/
void (*init)( GpsGeofenceCallbacks_ext* callbacks );
/**
* Add a geofence area. This api currently supports circular geofences.
* Parameters:
* geofence_id - The id for the geofence. If a geofence with this id
* already exists, an error value (GPS_GEOFENCE_ERROR_ID_EXISTS)
* should be returned.
* latitude, longtitude, radius_meters - The lat, long and radius
* (in meters) for the geofence
* last_transition - The current state of the geofence. For example, if
* the system already knows that the user is inside the geofence,
* this will be set to GPS_GEOFENCE_ENTERED. In most cases, it
* will be GPS_GEOFENCE_UNCERTAIN.
* monitor_transition - Which transitions to monitor. Bitwise OR of
* GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED and
* GPS_GEOFENCE_UNCERTAIN.
* notification_responsiveness_ms - Defines the best-effort description
* of how soon should the callback be called when the transition
* associated with the Geofence is triggered. For instance, if set
* to 1000 millseconds with GPS_GEOFENCE_ENTERED, the callback
* should be called 1000 milliseconds within entering the geofence.
* This parameter is defined in milliseconds.
* NOTE: This is not to be confused with the rate that the GPS is
* polled at. It is acceptable to dynamically vary the rate of
* sampling the GPS for power-saving reasons; thus the rate of
* sampling may be faster or slower than this.
* unknown_timer_ms - The time limit after which the UNCERTAIN transition
* should be triggered. This parameter is defined in milliseconds.
* See above for a detailed explanation.
*/
void (*add_geofence_area) (int32_t geofence_id, double latitude, double longitude,
double radius_meters, int last_transition, int monitor_transitions,
int notification_responsiveness_ms, int unknown_timer_ms);
/**
* Pause monitoring a particular geofence.
* Parameters:
* geofence_id - The id for the geofence.
*/
void (*pause_geofence) (int32_t geofence_id);
/**
* Resume monitoring a particular geofence.
* Parameters:
* geofence_id - The id for the geofence.
* monitor_transitions - Which transitions to monitor. Bitwise OR of
* GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED and
* GPS_GEOFENCE_UNCERTAIN.
* This supersedes the value associated provided in the
* add_geofence_area call.
*/
void (*resume_geofence) (int32_t geofence_id, int monitor_transitions);
/**
* Remove a geofence area. After the function returns, no notifications
* should be sent.
* Parameter:
* geofence_id - The id for the geofence.
*/
void (*remove_geofence_area) (int32_t geofence_id);
} GpsGeofencingInterface_ext;
typedef struct {
GnssMeasurement legacyMeasurement;
/**
* Automatic gain control (AGC) level. AGC acts as a variable gain
* amplifier adjusting the power of the incoming signal. The AGC level
* may be used to indicate potential interference. When AGC is at a
* nominal level, this value must be set as 0. Higher gain (and/or lower
* input power) must be output as a positive number. Hence in cases of
* strong jamming, in the band of this signal, this value must go more
* negative.
*
* Note: Different hardware designs (e.g. antenna, pre-amplification, or
* other RF HW components) may also affect the typical output of of this
* value on any given hardware design in an open sky test - the
* important aspect of this output is that changes in this value are
* indicative of changes on input signal power in the frequency band for
* this measurement.
*/
double agc_level_db;
} GnssMeasurement_ext;
/**
* Represents a reading of GNSS measurements. For devices where GnssSystemInfo's
* year_of_hw is set to 2016+, it is mandatory that these be provided, on
* request, when the GNSS receiver is searching/tracking signals.
*
* - Reporting of GPS constellation measurements is mandatory.
* - Reporting of all tracked constellations are encouraged.
*/
typedef struct {
/** set to sizeof(GnssData) */
size_t size;
/** Number of measurements. */
size_t measurement_count;
/** The array of measurements. */
GnssMeasurement_ext measurements[GNSS_MAX_MEASUREMENT];
/** The GPS clock time reading. */
GnssClock clock;
} GnssData_ext;
/**
* The callback for to report measurements from the HAL.
*
* Parameters:
* data - A data structure containing the measurements.
*/
typedef void (*gnss_measurement_ext_callback) (GnssData_ext* data);
typedef struct {
/** set to sizeof(GpsMeasurementCallbacks) */
size_t size;
gps_measurement_callback measurement_callback;
gnss_measurement_ext_callback gnss_measurement_callback;
} GpsMeasurementCallbacks_ext;
/////// Gnss debug ////
/** Milliseconds since January 1, 1970 */
typedef int64_t GnssUtcTime;
typedef enum {
/** Ephemeris is known for this satellite. */
EPHEMERIS,
/**
* Ephemeris is not known, but Almanac (approximate location) is known.
*/
ALMANAC_ONLY,
/**
* Both ephemeris & almanac are not known (e.g. during a cold start
* blind search.)
*/
NOT_AVAILABLE
} SatelliteEphemerisType;
typedef enum {
/**
* The ephemeris (or almanac only) information was demodulated from the
* signal received on the device
*/
DEMODULATED,
/**
* The ephemeris (or almanac only) information was received from a SUPL
* server.
*/
SUPL_PROVIDED,
/**
* The ephemeris (or almanac only) information was provided by another
* server.
*/
OTHER_SERVER_PROVIDED,
/**
* The ephemeris (or almanac only) information was provided by another
* method, e.g. injected via a local debug tool, from build defaults
* (e.g. almanac), or is from a satellite
* with SatelliteEphemerisType::NOT_AVAILABLE.
*/
OTHER
} SatelliteEphemerisSource;
typedef enum {
/** The ephemeris is known good. */
GOOD,
/** The ephemeris is known bad. */
BAD,
/** The ephemeris is unknown to be good or bad. */
UNKNOWN
} SatelliteEphemerisHealth;
/**
* Provides the current best known position from any
* source (GNSS or injected assistance).
*/
typedef struct {
/**
* Validity of the data in this struct. False only if no
* latitude/longitude information is known.
*/
bool valid;
/** Latitude expressed in degrees */
double latitudeDegrees;
/** Longitude expressed in degrees */
double longitudeDegrees;
/** Altitude above ellipsoid expressed in meters */
float altitudeMeters;
/** Represents horizontal speed in meters per second. */
float speedMetersPerSec;
/** Represents heading in degrees. */
float bearingDegrees;
/**
* Estimated horizontal accuracy of position expressed in meters,
* radial, 68% confidence.
*/
double horizontalAccuracyMeters;
/**
* Estimated vertical accuracy of position expressed in meters, with
* 68% confidence.
*/
double verticalAccuracyMeters;
/**
* Estimated speed accuracy in meters per second with 68% confidence.
*/
double speedAccuracyMetersPerSecond;
/**
* estimated bearing accuracy degrees with 68% confidence.
*/
double bearingAccuracyDegrees;
/**
* Time duration before this report that this position information was
* valid. This can, for example, be a previous injected location with
* an age potentially thousands of seconds old, or
* extrapolated to the current time (with appropriately increased
* accuracy estimates), with a (near) zero age.
*/
float ageSeconds;
} PositionDebug;
/**
* Provides the current best known UTC time estimate.
* If no fresh information is available, e.g. after a delete all,
* then whatever the effective defaults are on the device must be
* provided (e.g. Jan. 1, 2017, with an uncertainty of 5 years) expressed
* in the specified units.
*/
typedef struct {
/** UTC time estimate. */
GnssUtcTime timeEstimate;
/** 68% error estimate in time. */
float timeUncertaintyNs;
/**
* 68% error estimate in local clock drift,
* in nanoseconds per second (also known as parts per billion - ppb.)
*/
float frequencyUncertaintyNsPerSec;
} TimeDebug;
/**
* Provides a single satellite info that has decoded navigation data.
*/
typedef struct {
/** Satellite vehicle ID number */
int16_t svid;
/** Defines the constellation type of the given SV. */
GnssConstellationType constellation;
/**
* Defines the standard broadcast ephemeris or almanac availability for
* the satellite. To report status of predicted orbit and clock
* information, see the serverPrediction fields below.
*/
SatelliteEphemerisType ephemerisType;
/** Defines the ephemeris source of the satellite. */
SatelliteEphemerisSource ephemerisSource;
/**
* Defines whether the satellite is known healthy
* (safe for use in location calculation.)
*/
SatelliteEphemerisHealth ephemerisHealth;
/**
* Time duration from this report (current time), minus the
* effective time of the ephemeris source (e.g. TOE, TOA.)
* Set to 0 when ephemerisType is NOT_AVAILABLE.
*/
float ephemerisAgeSeconds;
/**
* True if a server has provided a predicted orbit and clock model for
* this satellite.
*/
bool serverPredictionIsAvailable;
/**
* Time duration from this report (current time) minus the time of the
* start of the server predicted information. For example, a 1 day
* old prediction would be reported as 86400 seconds here.
*/
float serverPredictionAgeSeconds;
} SatelliteData;
/**
* Provides a set of debug information that is filled by the GNSS chipset
* when the method getDebugData() is invoked.
*/
typedef struct {
/** Current best known position. */
PositionDebug position;
/** Current best know time estimate */
TimeDebug time;
/**
* Provides a list of the available satellite data, for all
* satellites and constellations the device can track,
* including GnssConstellationType UNKNOWN.
*/
SatelliteData satelliteDataArray[GNSS_MAX_SVS];
} DebugData;
/** Extended interface for DEBUG support. */
typedef struct {
/** set to sizeof(GpsDebugInterface) */
size_t size;
/**
* This function should return any information that the native
* implementation wishes to include in a bugreport.
*/
// size_t (*get_internal_state)(char* buffer, size_t bufferSize);
/// v1.0 ///
bool (*get_internal_state)(DebugData* debugData);
} GpsDebugInterface_ext;
////////////////////// GNSS HIDL v1.1 ////////////////////////////
/**
* Callback for reporting driver name information.
*/
typedef void (* gnss_set_name_callback)(const char* name, int length);
/**
* Callback for requesting framework NLP or Fused location injection.
*/
typedef void (* gnss_request_location_callback)(bool independentFromGnss);
/** New GPS callback structure. */
typedef struct {
/** set to sizeof(GpsCallbacks) */
size_t size;
gps_location_ext_callback location_cb;
gps_status_callback status_cb;
gps_sv_status_callback sv_status_cb;
gps_nmea_callback nmea_cb;
gps_set_capabilities set_capabilities_cb;
gps_acquire_wakelock acquire_wakelock_cb;
gps_release_wakelock release_wakelock_cb;
gps_create_thread create_thread_cb;
gps_request_utc_time request_utc_time_cb;
gnss_set_system_info set_system_info_cb;
gnss_sv_status_ext_callback gnss_sv_status_cb;
/////v1.1////
gnss_set_name_callback set_name_cb;
gnss_request_location_callback request_location_cb;
} GpsCallbacks_ext;
/** Represents the standard GPS interface. */
typedef struct {
/** set to sizeof(GpsInterface) */
size_t size;
/**
* Opens the interface and provides the callback routines
* to the implementation of this interface.
*/
/// v1.0 ///
// int (*init)( GpsCallbacks* callbacks );
/// v1.1 ///
int (*init)( GpsCallbacks_ext* callbacks );
/** Starts navigating. */
int (*start)( void );
/** Stops navigating. */
int (*stop)( void );
/** Closes the interface. */
void (*cleanup)( void );
/** Injects the current time. */
int (*inject_time)(GpsUtcTime time, int64_t timeReference,
int uncertainty);
/**
* Injects current location from another location provider (typically cell
* ID). Latitude and longitude are measured in degrees expected accuracy is
* measured in meters
*/
int (*inject_location)(double latitude, double longitude, float accuracy);
/**
* Specifies that the next call to start will not use the
* information defined in the flags. GPS_DELETE_ALL is passed for
* a cold start.
*/
void (*delete_aiding_data)(GpsAidingData flags);
/**
* min_interval represents the time between fixes in milliseconds.
* preferred_accuracy represents the requested fix accuracy in meters.
* preferred_time represents the requested time to first fix in milliseconds.
*
* 'mode' parameter should be one of GPS_POSITION_MODE_MS_BASED
* or GPS_POSITION_MODE_STANDALONE.
* It is allowed by the platform (and it is recommended) to fallback to
* GPS_POSITION_MODE_MS_BASED if GPS_POSITION_MODE_MS_ASSISTED is passed in, and
* GPS_POSITION_MODE_MS_BASED is supported.
*/
/// v1.0 ///
// int (*set_position_mode)(GpsPositionMode mode, GpsPositionRecurrence recurrence,
// uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time);
/// v1.1 ///
int (*set_position_mode)(GpsPositionMode mode, GpsPositionRecurrence recurrence,
uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time,
bool lowPowerMode);
/** Get a pointer to extension information. */
const void* (*get_extension)(const char* name);
/// v1.1 ///
int (*inject_fused_location)(double latitude, double longitude, float accuracy);
} GpsInterface_ext;
/**
* Extended interface for GPS Measurements support.
*/
typedef struct {
/** Set to sizeof(GpsMeasurementInterface_ext) */
size_t size;
/**
* Initializes the interface and registers the callback routines with the HAL.
* After a successful call to 'init' the HAL must begin to provide updates at its own phase.
*
* Status:
* GPS_MEASUREMENT_OPERATION_SUCCESS
* GPS_MEASUREMENT_ERROR_ALREADY_INIT - if a callback has already been registered without a
* corresponding call to 'close'
* GPS_MEASUREMENT_ERROR_GENERIC - if any other error occurred, it is expected that the HAL
* will not generate any updates upon returning this error code.
*/
/// v1.0 ///
// int (*init) (GpsMeasurementCallbacks* callbacks);
/// v1.1 ///
int (*init) (GpsMeasurementCallbacks_ext* callbacks, bool enableFullTracking);
/**
* Stops updates from the HAL, and unregisters the callback routines.
* After a call to stop, the previously registered callbacks must be considered invalid by the
* HAL.
* If stop is invoked without a previous 'init', this function should perform no work.
*/
void (*close) ();
} GpsMeasurementInterface_ext;
/**
* Interface for passing GNSS configuration contents from platform to HAL.
*/
typedef struct {
/** Set to sizeof(GnssConfigurationInterface) */
size_t size;
/**
* Deliver GNSS configuration contents to HAL.
* Parameters:
* config_data - a pointer to a char array which holds what usually is expected from
file(/etc/gps.conf), i.e., a sequence of UTF8 strings separated by '\n'.
* length - total number of UTF8 characters in configuraiton data.
*
* IMPORTANT:
* GPS HAL should expect this function can be called multiple times. And it may be
* called even when GpsLocationProvider is already constructed and enabled. GPS HAL
* should maintain the existing requests for various callback regardless the change
* in configuration data.
*/
void (*configuration_update) (const char* config_data, int32_t length);
//// v1.1 ////
void (*setBlacklist) (long long* blacklist, int32_t size);
} GnssConfigurationInterface_ext;
struct gps_device_t_ext {
struct hw_device_t common;
/**
* Set the provided lights to the provided values.
*
* Returns: 0 on succes, error code on failure.
*/
const GpsInterface_ext* (*get_gps_interface)(struct gps_device_t_ext* dev);
};
__END_DECLS
#endif /* ANDROID_INCLUDE_HARDWARE_GPS_MTK_H */