Home | History | Annotate | Download | only in hardware
      1 /*
      2  * Copyright (C) 2013 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_FUSED_LOCATION_H
     18 #define ANDROID_INCLUDE_HARDWARE_FUSED_LOCATION_H
     19 
     20 #include <hardware/hardware.h>
     21 
     22 
     23 /**
     24  * This header file defines the interface of the Fused Location Provider.
     25  * Fused Location Provider is designed to fuse data from various sources
     26  * like GPS, Wifi, Cell, Sensors, Bluetooth etc to provide a fused location to the
     27  * upper layers. The advantage of doing fusion in hardware is power savings.
     28  * The goal is to do this without waking up the AP to get additional data.
     29  * The software implementation of FLP will decide when to use
     30  * the hardware fused location. Other location features like geofencing will
     31  * also be implemented using fusion in hardware.
     32  */
     33 __BEGIN_DECLS
     34 
     35 #define FLP_HEADER_VERSION          1
     36 #define FLP_MODULE_API_VERSION_0_1  HARDWARE_MODULE_API_VERSION(0, 1)
     37 #define FLP_DEVICE_API_VERSION_0_1  HARDWARE_DEVICE_API_VERSION_2(0, 1, FLP_HEADER_VERSION)
     38 
     39 /**
     40  * The id of this module
     41  */
     42 #define FUSED_LOCATION_HARDWARE_MODULE_ID "flp"
     43 
     44 /**
     45  * Name for the FLP location interface
     46  */
     47 #define FLP_LOCATION_INTERFACE     "flp_location"
     48 
     49 /**
     50  * Name for the FLP location interface
     51  */
     52 #define FLP_DIAGNOSTIC_INTERFACE     "flp_diagnostic"
     53 
     54 /**
     55  * Name for the FLP_Geofencing interface.
     56  */
     57 #define FLP_GEOFENCING_INTERFACE   "flp_geofencing"
     58 
     59 /**
     60  * Name for the FLP_device context interface.
     61  */
     62 #define FLP_DEVICE_CONTEXT_INTERFACE   "flp_device_context"
     63 
     64 /**
     65  * Constants to indicate the various subsystems
     66  * that will be used.
     67  */
     68 #define FLP_TECH_MASK_GNSS      (1U<<0)
     69 #define FLP_TECH_MASK_WIFI      (1U<<1)
     70 #define FLP_TECH_MASK_SENSORS   (1U<<2)
     71 #define FLP_TECH_MASK_CELL      (1U<<3)
     72 #define FLP_TECH_MASK_BLUETOOTH (1U<<4)
     73 
     74 /**
     75  * This constant is used with the batched locations
     76  * APIs. Batching is mandatory when FLP implementation
     77  * is supported. If the flag is set, the hardware implementation
     78  * will wake up the application processor when the FIFO is full,
     79  * If the flag is not set, the hardware implementation will drop
     80  * the oldest data when the FIFO is full.
     81  */
     82 #define FLP_BATCH_WAKEUP_ON_FIFO_FULL        0x0000001
     83 
     84 /**
     85  * While batching, the implementation should not call the
     86  * flp_location_callback on every location fix. However,
     87  * sometimes in high power mode, the system might need
     88  * a location callback every single time the location
     89  * fix has been obtained. This flag controls that option.
     90  * Its the responsibility of the upper layers (caller) to switch
     91  * it off, if it knows that the AP might go to sleep.
     92  * When this bit is on amidst a batching session, batching should
     93  * continue while location fixes are reported in real time.
     94  */
     95 #define FLP_BATCH_CALLBACK_ON_LOCATION_FIX   0x0000002
     96 
     97 /** Flags to indicate which values are valid in a FlpLocation. */
     98 typedef uint16_t FlpLocationFlags;
     99 
    100 // IMPORTANT: Note that the following values must match
    101 // constants in the corresponding java file.
    102 
    103 /** FlpLocation has valid latitude and longitude. */
    104 #define FLP_LOCATION_HAS_LAT_LONG   (1U<<0)
    105 /** FlpLocation has valid altitude. */
    106 #define FLP_LOCATION_HAS_ALTITUDE   (1U<<1)
    107 /** FlpLocation has valid speed. */
    108 #define FLP_LOCATION_HAS_SPEED      (1U<<2)
    109 /** FlpLocation has valid bearing. */
    110 #define FLP_LOCATION_HAS_BEARING    (1U<<4)
    111 /** FlpLocation has valid accuracy. */
    112 #define FLP_LOCATION_HAS_ACCURACY   (1U<<8)
    113 
    114 
    115 typedef int64_t FlpUtcTime;
    116 
    117 /** Represents a location. */
    118 typedef struct {
    119     /** set to sizeof(FlpLocation) */
    120     size_t          size;
    121 
    122     /** Flags associated with the location object. */
    123     FlpLocationFlags flags;
    124 
    125     /** Represents latitude in degrees. */
    126     double          latitude;
    127 
    128     /** Represents longitude in degrees. */
    129     double          longitude;
    130 
    131     /**
    132      * Represents altitude in meters above the WGS 84 reference
    133      * ellipsoid. */
    134     double          altitude;
    135 
    136     /** Represents speed in meters per second. */
    137     float           speed;
    138 
    139     /** Represents heading in degrees. */
    140     float           bearing;
    141 
    142     /** Represents expected accuracy in meters. */
    143     float           accuracy;
    144 
    145     /** Timestamp for the location fix. */
    146     FlpUtcTime      timestamp;
    147 
    148     /** Sources used, will be Bitwise OR of the FLP_TECH_MASK bits. */
    149     uint32_t         sources_used;
    150 } FlpLocation;
    151 
    152 typedef enum {
    153     ASSOCIATE_JVM,
    154     DISASSOCIATE_JVM,
    155 } ThreadEvent;
    156 
    157 /**
    158  *  Callback with location information.
    159  *  Can only be called from a thread associated to JVM using set_thread_event_cb.
    160  *  Parameters:
    161  *     num_locations is the number of batched locations available.
    162  *     location is the pointer to an array of pointers to location objects.
    163  */
    164 typedef void (*flp_location_callback)(int32_t num_locations, FlpLocation** location);
    165 
    166 /**
    167  * Callback utility for acquiring a wakelock.
    168  * This can be used to prevent the CPU from suspending while handling FLP events.
    169  */
    170 typedef void (*flp_acquire_wakelock)();
    171 
    172 /**
    173  * Callback utility for releasing the FLP wakelock.
    174  */
    175 typedef void (*flp_release_wakelock)();
    176 
    177 /**
    178  * Callback for associating a thread that can call into the Java framework code.
    179  * This must be used to initialize any threads that report events up to the framework.
    180  * Return value:
    181  *      FLP_RESULT_SUCCESS on success.
    182  *      FLP_RESULT_ERROR if the association failed in the current thread.
    183  */
    184 typedef int (*flp_set_thread_event)(ThreadEvent event);
    185 
    186 /** FLP callback structure. */
    187 typedef struct {
    188     /** set to sizeof(FlpCallbacks) */
    189     size_t      size;
    190     flp_location_callback location_cb;
    191     flp_acquire_wakelock acquire_wakelock_cb;
    192     flp_release_wakelock release_wakelock_cb;
    193     flp_set_thread_event set_thread_event_cb;
    194 } FlpCallbacks;
    195 
    196 
    197 /** Options with the batching FLP APIs */
    198 typedef struct {
    199     /**
    200      * Maximum power in mW that the underlying implementation
    201      * can use for this batching call.
    202      * If max_power_allocation_mW is 0, only fixes that are generated
    203      * at no additional cost of power shall be reported.
    204      */
    205     double max_power_allocation_mW;
    206 
    207     /** Bitwise OR of the FLP_TECH_MASKS to use */
    208     uint32_t sources_to_use;
    209 
    210     /**
    211      * FLP_BATCH_WAKEUP_ON_FIFO_FULL - If set the hardware
    212      * will wake up the AP when the buffer is full. If not set, the
    213      * hardware will drop the oldest location object.
    214      *
    215      * FLP_BATCH_CALLBACK_ON_LOCATION_FIX - If set the location
    216      * callback will be called every time there is a location fix.
    217      * Its the responsibility of the upper layers (caller) to switch
    218      * it off, if it knows that the AP might go to sleep. When this
    219      * bit is on amidst a batching session, batching should continue
    220      * while location fixes are reported in real time.
    221      *
    222      * Other flags to be bitwised ORed in the future.
    223      */
    224     uint32_t flags;
    225 
    226     /**
    227      * Frequency with which location needs to be batched in nano
    228      * seconds.
    229      */
    230     int64_t period_ns;
    231 } FlpBatchOptions;
    232 
    233 #define FLP_RESULT_SUCCESS                       0
    234 #define FLP_RESULT_ERROR                        -1
    235 #define FLP_RESULT_INSUFFICIENT_MEMORY          -2
    236 #define FLP_RESULT_TOO_MANY_GEOFENCES           -3
    237 #define FLP_RESULT_ID_EXISTS                    -4
    238 #define FLP_RESULT_ID_UNKNOWN                   -5
    239 #define FLP_RESULT_INVALID_GEOFENCE_TRANSITION  -6
    240 
    241 /**
    242  * Represents the standard FLP interface.
    243  */
    244 typedef struct {
    245     /**
    246      * set to sizeof(FlpLocationInterface)
    247      */
    248     size_t size;
    249 
    250     /**
    251      * Opens the interface and provides the callback routines
    252      * to the implemenation of this interface.
    253      */
    254     int (*init)(FlpCallbacks* callbacks );
    255 
    256     /**
    257      * Return the batch size (in number of FlpLocation objects)
    258      * available in the hardware.  Note, different HW implementations
    259      * may have different sample sizes.  This shall return number
    260      * of samples defined in the format of FlpLocation.
    261      * This will be used by the upper layer, to decide on the batching
    262      * interval and whether the AP should be woken up or not.
    263      */
    264     int (*get_batch_size)();
    265 
    266     /**
    267      * Start batching locations. This API is primarily used when the AP is
    268      * asleep and the device can batch locations in the hardware.
    269      *   flp_location_callback is used to return the locations. When the buffer
    270      * is full and FLP_BATCH_WAKEUP_ON_FIFO_FULL is used, the AP is woken up.
    271      * When the buffer is full and FLP_BATCH_WAKEUP_ON_FIFO_FULL is not set,
    272      * the oldest location object is dropped. In this case the  AP will not be
    273      * woken up. The upper layer will use get_batched_location
    274      * API to explicitly ask for the location.
    275      *   If FLP_BATCH_CALLBACK_ON_LOCATION_FIX is set, the implementation
    276      * will call the flp_location_callback every single time there is a location
    277      * fix. This overrides FLP_BATCH_WAKEUP_ON_FIFO_FULL flag setting.
    278      * It's the responsibility of the upper layers (caller) to switch
    279      * it off, if it knows that the AP might go to sleep. This is useful
    280      * for nagivational applications when the system is in high power mode.
    281      * Parameters:
    282      *    id - Id for the request.
    283      *    options - See FlpBatchOptions struct definition.
    284      * Return value:
    285      *    FLP_RESULT_SUCCESS on success, FLP_RESULT_INSUFFICIENT_MEMORY,
    286      *    FLP_RESULT_ID_EXISTS, FLP_RESULT_ERROR on failure.
    287      */
    288     int (*start_batching)(int id, FlpBatchOptions* options);
    289 
    290     /**
    291      * Update FlpBatchOptions associated with a batching request.
    292      * When a batching operation is in progress and a batching option
    293      * such as FLP_BATCH_WAKEUP_ON_FIFO_FULL needs to be updated, this API
    294      * will be used. For instance, this can happen when the AP is awake and
    295      * the maps application is being used.
    296      * Parameters:
    297      *    id - Id of an existing batch request.
    298      *    new_options - Updated FlpBatchOptions
    299      * Return value:
    300      *    FLP_RESULT_SUCCESS on success, FLP_RESULT_ID_UNKNOWN,
    301      *    FLP_RESULT_ERROR on error.
    302      */
    303     int (*update_batching_options)(int id, FlpBatchOptions* new_options);
    304 
    305     /**
    306      * Stop batching.
    307      * Parameters:
    308      *    id - Id for the request.
    309      * Return Value:
    310      *    FLP_RESULT_SUCCESS on success, FLP_RESULT_ID_UNKNOWN or
    311      *    FLP_RESULT_ERROR on failure.
    312      */
    313     int (*stop_batching)(int id);
    314 
    315     /**
    316      * Closes the interface. If any batch operations are in progress,
    317      * they should be stopped.
    318      */
    319     void (*cleanup)();
    320 
    321     /**
    322      * Get the fused location that was batched.
    323      *   flp_location_callback is used to return the location. The location object
    324      * is dropped from the buffer only when the buffer is full. Do not remove it
    325      * from the buffer just because it has been returned using the callback.
    326      * In other words, when there is no new location object, two calls to
    327      * get_batched_location(1) should return the same location object.
    328      * Parameters:
    329      *      last_n_locations - Number of locations to get. This can be one or many.
    330      *      If the last_n_locations is 1, you get the latest location known to the
    331      *      hardware.
    332      */
    333     void (*get_batched_location)(int last_n_locations);
    334 
    335     /**
    336      * Injects current location from another location provider
    337      * latitude and longitude are measured in degrees
    338      * expected accuracy is measured in meters
    339      * Parameters:
    340      *      location - The location object being injected.
    341      * Return value: FLP_RESULT_SUCCESS or FLP_RESULT_ERROR.
    342      */
    343     int  (*inject_location)(FlpLocation* location);
    344 
    345     /**
    346      * Get a pointer to extension information.
    347      */
    348     const void* (*get_extension)(const char* name);
    349 } FlpLocationInterface;
    350 
    351 struct flp_device_t {
    352     struct hw_device_t common;
    353 
    354     /**
    355      * Get a handle to the FLP Interface.
    356      */
    357     const FlpLocationInterface* (*get_flp_interface)(struct flp_device_t* dev);
    358 };
    359 
    360 /**
    361  * Callback for reports diagnostic data into the Java framework code.
    362 */
    363 typedef void (*report_data)(char* data, int length);
    364 
    365 /**
    366  * FLP diagnostic callback structure.
    367  * Currently, not used - but this for future extension.
    368  */
    369 typedef struct {
    370     /** set to sizeof(FlpDiagnosticCallbacks) */
    371     size_t      size;
    372 
    373     flp_set_thread_event set_thread_event_cb;
    374 
    375     /** reports diagnostic data into the Java framework code */
    376     report_data data_cb;
    377 } FlpDiagnosticCallbacks;
    378 
    379 /** Extended interface for diagnostic support. */
    380 typedef struct {
    381     /** set to sizeof(FlpDiagnosticInterface) */
    382     size_t          size;
    383 
    384     /**
    385      * Opens the diagnostic interface and provides the callback routines
    386      * to the implemenation of this interface.
    387      */
    388     void  (*init)(FlpDiagnosticCallbacks* callbacks);
    389 
    390     /**
    391      * Injects diagnostic data into the FLP subsystem.
    392      * Return 0 on success, -1 on error.
    393      **/
    394     int  (*inject_data)(char* data, int length );
    395 } FlpDiagnosticInterface;
    396 
    397 /**
    398  * Context setting information.
    399  * All these settings shall be injected to FLP HAL at FLP init time.
    400  * Following that, only the changed setting need to be re-injected
    401  * upon changes.
    402  */
    403 
    404 #define FLP_DEVICE_CONTEXT_GPS_ENABLED                     (1U<<0)
    405 #define FLP_DEVICE_CONTEXT_AGPS_ENABLED                    (1U<<1)
    406 #define FLP_DEVICE_CONTEXT_NETWORK_POSITIONING_ENABLED     (1U<<2)
    407 #define FLP_DEVICE_CONTEXT_WIFI_CONNECTIVITY_ENABLED       (1U<<3)
    408 #define FLP_DEVICE_CONTEXT_WIFI_POSITIONING_ENABLED        (1U<<4)
    409 #define FLP_DEVICE_CONTEXT_HW_NETWORK_POSITIONING_ENABLED  (1U<<5)
    410 #define FLP_DEVICE_CONTEXT_AIRPLANE_MODE_ON                (1U<<6)
    411 #define FLP_DEVICE_CONTEXT_DATA_ENABLED                    (1U<<7)
    412 #define FLP_DEVICE_CONTEXT_ROAMING_ENABLED                 (1U<<8)
    413 #define FLP_DEVICE_CONTEXT_CURRENTLY_ROAMING               (1U<<9)
    414 #define FLP_DEVICE_CONTEXT_SENSOR_ENABLED                  (1U<<10)
    415 #define FLP_DEVICE_CONTEXT_BLUETOOTH_ENABLED               (1U<<11)
    416 #define FLP_DEVICE_CONTEXT_CHARGER_ON                      (1U<<12)
    417 
    418 /** Extended interface for device context support. */
    419 typedef struct {
    420     /** set to sizeof(FlpDeviceContextInterface) */
    421     size_t          size;
    422 
    423     /**
    424      * Injects debug data into the FLP subsystem.
    425      * Return 0 on success, -1 on error.
    426      **/
    427     int  (*inject_device_context)(uint32_t enabledMask);
    428 } FlpDeviceContextInterface;
    429 
    430 
    431 /**
    432  * There are 3 states associated with a Geofence: Inside, Outside, Unknown.
    433  * There are 3 transitions: ENTERED, EXITED, UNCERTAIN.
    434  *
    435  * An example state diagram with confidence level: 95% and Unknown time limit
    436  * set as 30 secs is shown below. (confidence level and Unknown time limit are
    437  * explained latter)
    438  *                         ____________________________
    439  *                        |       Unknown (30 secs)   |
    440  *                         """"""""""""""""""""""""""""
    441  *                            ^ |                  |  ^
    442  *                   UNCERTAIN| |ENTERED     EXITED|  |UNCERTAIN
    443  *                            | v                  v  |
    444  *                        ________    EXITED     _________
    445  *                       | Inside | -----------> | Outside |
    446  *                       |        | <----------- |         |
    447  *                        """"""""    ENTERED    """""""""
    448  *
    449  * Inside state: We are 95% confident that the user is inside the geofence.
    450  * Outside state: We are 95% confident that the user is outside the geofence
    451  * Unknown state: Rest of the time.
    452  *
    453  * The Unknown state is better explained with an example:
    454  *
    455  *                            __________
    456  *                           |         c|
    457  *                           |  ___     |    _______
    458  *                           |  |a|     |   |   b   |
    459  *                           |  """     |    """""""
    460  *                           |          |
    461  *                            """"""""""
    462  * In the diagram above, "a" and "b" are 2 geofences and "c" is the accuracy
    463  * circle reported by the FLP subsystem. Now with regard to "b", the system is
    464  * confident that the user is outside. But with regard to "a" is not confident
    465  * whether it is inside or outside the geofence. If the accuracy remains the
    466  * same for a sufficient period of time, the UNCERTAIN transition would be
    467  * triggered with the state set to Unknown. If the accuracy improves later, an
    468  * appropriate transition should be triggered.  This "sufficient period of time"
    469  * is defined by the parameter in the add_geofence_area API.
    470  *     In other words, Unknown state can be interpreted as a state in which the
    471  * FLP subsystem isn't confident enough that the user is either inside or
    472  * outside the Geofence. It moves to Unknown state only after the expiry of the
    473  * timeout.
    474  *
    475  * The geofence callback needs to be triggered for the ENTERED and EXITED
    476  * transitions, when the FLP system is confident that the user has entered
    477  * (Inside state) or exited (Outside state) the Geofence. An implementation
    478  * which uses a value of 95% as the confidence is recommended. The callback
    479  * should be triggered only for the transitions requested by the
    480  * add_geofence_area call.
    481  *
    482  * Even though the diagram and explanation talks about states and transitions,
    483  * the callee is only interested in the transistions. The states are mentioned
    484  * here for illustrative purposes.
    485  *
    486  * Startup Scenario: When the device boots up, if an application adds geofences,
    487  * and then we get an accurate FLP location fix, it needs to trigger the
    488  * appropriate (ENTERED or EXITED) transition for every Geofence it knows about.
    489  * By default, all the Geofences will be in the Unknown state.
    490  *
    491  * When the FLP system is unavailable, flp_geofence_status_callback should be
    492  * called to inform the upper layers of the same. Similarly, when it becomes
    493  * available the callback should be called. This is a global state while the
    494  * UNKNOWN transition described above is per geofence.
    495  *
    496  */
    497 #define FLP_GEOFENCE_TRANSITION_ENTERED     (1L<<0)
    498 #define FLP_GEOFENCE_TRANSITION_EXITED      (1L<<1)
    499 #define FLP_GEOFENCE_TRANSITION_UNCERTAIN   (1L<<2)
    500 
    501 #define FLP_GEOFENCE_MONITOR_STATUS_UNAVAILABLE (1L<<0)
    502 #define FLP_GEOFENCE_MONITOR_STATUS_AVAILABLE   (1L<<1)
    503 
    504 /**
    505  * The callback associated with the geofence.
    506  * Parameters:
    507  *      geofence_id - The id associated with the add_geofence_area.
    508  *      location    - The current location as determined by the FLP subsystem.
    509  *      transition  - Can be one of FLP_GEOFENCE_TRANSITION_ENTERED, FLP_GEOFENCE_TRANSITION_EXITED,
    510  *                    FLP_GEOFENCE_TRANSITION_UNCERTAIN.
    511  *      timestamp   - Timestamp when the transition was detected; -1 if not available.
    512  *      sources_used - Bitwise OR of FLP_TECH_MASK flags indicating which
    513  *                     subsystems were used.
    514  *
    515  * The callback should only be called when the caller is interested in that
    516  * particular transition. For instance, if the caller is interested only in
    517  * ENTERED transition, then the callback should NOT be called with the EXITED
    518  * transition.
    519  *
    520  * IMPORTANT: If a transition is triggered resulting in this callback, the
    521  * subsystem will wake up the application processor, if its in suspend state.
    522  */
    523 typedef void (*flp_geofence_transition_callback) (int32_t geofence_id,  FlpLocation* location,
    524         int32_t transition, FlpUtcTime timestamp, uint32_t sources_used);
    525 
    526 /**
    527  * The callback associated with the availablity of one the sources used for geofence
    528  * monitoring by the FLP sub-system For example, if the GPS system determines that it cannot
    529  * monitor geofences because of lack of reliability or unavailability of the GPS signals,
    530  * it will call this callback with FLP_GEOFENCE_MONITOR_STATUS_UNAVAILABLE parameter and the
    531  * source set to FLP_TECH_MASK_GNSS.
    532  *
    533  * Parameters:
    534  *  status - FLP_GEOFENCE_MONITOR_STATUS_UNAVAILABLE or FLP_GEOFENCE_MONITOR_STATUS_AVAILABLE.
    535  *  source - One of the FLP_TECH_MASKS
    536  *  last_location - Last known location.
    537  */
    538 typedef void (*flp_geofence_monitor_status_callback) (int32_t status, uint32_t source,
    539                                                       FlpLocation* last_location);
    540 
    541 /**
    542  * The callback associated with the add_geofence call.
    543  *
    544  * Parameter:
    545  * geofence_id - Id of the geofence.
    546  * result - FLP_RESULT_SUCCESS
    547  *          FLP_RESULT_ERROR_TOO_MANY_GEOFENCES  - geofence limit has been reached.
    548  *          FLP_RESULT_ID_EXISTS  - geofence with id already exists
    549  *          FLP_RESULT_INVALID_GEOFENCE_TRANSITION - the monitorTransition contains an
    550  *              invalid transition
    551  *          FLP_RESULT_ERROR - for other errors.
    552  */
    553 typedef void (*flp_geofence_add_callback) (int32_t geofence_id, int32_t result);
    554 
    555 /**
    556  * The callback associated with the remove_geofence call.
    557  *
    558  * Parameter:
    559  * geofence_id - Id of the geofence.
    560  * result - FLP_RESULT_SUCCESS
    561  *          FLP_RESULT_ID_UNKNOWN - for invalid id
    562  *          FLP_RESULT_ERROR for others.
    563  */
    564 typedef void (*flp_geofence_remove_callback) (int32_t geofence_id, int32_t result);
    565 
    566 
    567 /**
    568  * The callback associated with the pause_geofence call.
    569  *
    570  * Parameter:
    571  * geofence_id - Id of the geofence.
    572  * result - FLP_RESULT_SUCCESS
    573  *          FLP_RESULT__ID_UNKNOWN - for invalid id
    574  *          FLP_RESULT_INVALID_TRANSITION -
    575  *                    when monitor_transitions is invalid
    576  *          FLP_RESULT_ERROR for others.
    577  */
    578 typedef void (*flp_geofence_pause_callback) (int32_t geofence_id, int32_t result);
    579 
    580 /**
    581  * The callback associated with the resume_geofence call.
    582  *
    583  * Parameter:
    584  * geofence_id - Id of the geofence.
    585  * result - FLP_RESULT_SUCCESS
    586  *          FLP_RESULT_ID_UNKNOWN - for invalid id
    587  *          FLP_RESULT_ERROR for others.
    588  */
    589 typedef void (*flp_geofence_resume_callback) (int32_t geofence_id, int32_t result);
    590 
    591 typedef struct {
    592     /** set to sizeof(FlpGeofenceCallbacks) */
    593     size_t size;
    594     flp_geofence_transition_callback geofence_transition_callback;
    595     flp_geofence_monitor_status_callback geofence_status_callback;
    596     flp_geofence_add_callback geofence_add_callback;
    597     flp_geofence_remove_callback geofence_remove_callback;
    598     flp_geofence_pause_callback geofence_pause_callback;
    599     flp_geofence_resume_callback geofence_resume_callback;
    600     flp_set_thread_event set_thread_event_cb;
    601 } FlpGeofenceCallbacks;
    602 
    603 
    604 /** Type of geofence */
    605 typedef enum {
    606     TYPE_CIRCLE = 0,
    607 } GeofenceType;
    608 
    609 /** Circular geofence is represented by lat / long / radius */
    610 typedef struct {
    611     double latitude;
    612     double longitude;
    613     double radius_m;
    614 } GeofenceCircle;
    615 
    616 /** Represents the type of geofence and data */
    617 typedef struct {
    618     GeofenceType type;
    619     union {
    620         GeofenceCircle circle;
    621     } geofence;
    622 } GeofenceData;
    623 
    624 /** Geofence Options */
    625 typedef struct {
    626    /**
    627     * The current state of the geofence. For example, if
    628     * the system already knows that the user is inside the geofence,
    629     * this will be set to FLP_GEOFENCE_TRANSITION_ENTERED. In most cases, it
    630     * will be FLP_GEOFENCE_TRANSITION_UNCERTAIN. */
    631     int last_transition;
    632 
    633    /**
    634     * Transitions to monitor. Bitwise OR of
    635     * FLP_GEOFENCE_TRANSITION_ENTERED, FLP_GEOFENCE_TRANSITION_EXITED and
    636     * FLP_GEOFENCE_TRANSITION_UNCERTAIN.
    637     */
    638     int monitor_transitions;
    639 
    640    /**
    641     * Defines the best-effort description
    642     * of how soon should the callback be called when the transition
    643     * associated with the Geofence is triggered. For instance, if set
    644     * to 1000 millseconds with FLP_GEOFENCE_TRANSITION_ENTERED, the callback
    645     * should be called 1000 milliseconds within entering the geofence.
    646     * This parameter is defined in milliseconds.
    647     * NOTE: This is not to be confused with the rate that the GPS is
    648     * polled at. It is acceptable to dynamically vary the rate of
    649     * sampling the GPS for power-saving reasons; thus the rate of
    650     * sampling may be faster or slower than this.
    651     */
    652     int notification_responsivenes_ms;
    653 
    654    /**
    655     * The time limit after which the UNCERTAIN transition
    656     * should be triggered. This paramter is defined in milliseconds.
    657     */
    658     int unknown_timer_ms;
    659 
    660     /**
    661      * The sources to use for monitoring geofences. Its a BITWISE-OR
    662      * of FLP_TECH_MASK flags.
    663      */
    664     uint32_t sources_to_use;
    665 } GeofenceOptions;
    666 
    667 /** Geofence struct */
    668 typedef struct {
    669     int32_t geofence_id;
    670     GeofenceData* data;
    671     GeofenceOptions* options;
    672 } Geofence;
    673 
    674 /** Extended interface for FLP_Geofencing support */
    675 typedef struct {
    676    /** set to sizeof(FlpGeofencingInterface) */
    677    size_t          size;
    678 
    679    /**
    680     * Opens the geofence interface and provides the callback routines
    681     * to the implemenation of this interface.
    682     */
    683    void  (*init)( FlpGeofenceCallbacks* callbacks );
    684 
    685    /**
    686     * Add a list of geofences.
    687     * Parameters:
    688     *     number_of_geofences - The number of geofences that needed to be added.
    689     *     geofences - Pointer to array of pointers to Geofence structure.
    690     */
    691    void (*add_geofences) (int32_t number_of_geofences, Geofence** geofences);
    692 
    693    /**
    694     * Pause monitoring a particular geofence.
    695     * Parameters:
    696     *   geofence_id - The id for the geofence.
    697     */
    698    void (*pause_geofence) (int32_t geofence_id);
    699 
    700    /**
    701     * Resume monitoring a particular geofence.
    702     * Parameters:
    703     *   geofence_id - The id for the geofence.
    704     *   monitor_transitions - Which transitions to monitor. Bitwise OR of
    705     *       FLP_GEOFENCE_TRANSITION_ENTERED, FLP_GEOFENCE_TRANSITION_EXITED and
    706     *       FLP_GEOFENCE_TRANSITION_UNCERTAIN.
    707     *       This supersedes the value associated provided in the
    708     *       add_geofence_area call.
    709     */
    710    void (*resume_geofence) (int32_t geofence_id, int monitor_transitions);
    711 
    712    /**
    713     * Modify a particular geofence option.
    714     * Parameters:
    715     *    geofence_id - The id for the geofence.
    716     *    options - Various options associated with the geofence. See
    717     *        GeofenceOptions structure for details.
    718     */
    719    void (*modify_geofence_option) (int32_t geofence_id, GeofenceOptions* options);
    720 
    721    /**
    722     * Remove a list of geofences. After the function returns, no notifications
    723     * should be sent.
    724     * Parameter:
    725     *     number_of_geofences - The number of geofences that needed to be added.
    726     *     geofence_id - Pointer to array of geofence_ids to be removed.
    727     */
    728    void (*remove_geofences) (int32_t number_of_geofences, int32_t* geofence_id);
    729 } FlpGeofencingInterface;
    730 
    731 __END_DECLS
    732 
    733 #endif /* ANDROID_INCLUDE_HARDWARE_FLP_H */
    734 
    735