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. */
98typedef 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
115typedef int64_t FlpUtcTime;
116
117/** Represents a location. */
118typedef 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
152typedef 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 */
164typedef 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 */
170typedef void (*flp_acquire_wakelock)();
171
172/**
173 * Callback utility for releasing the FLP wakelock.
174 */
175typedef 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 */
184typedef int (*flp_set_thread_event)(ThreadEvent event);
185
186/** FLP callback structure. */
187typedef 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 */
198typedef 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 */
244typedef 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
351struct 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*/
363typedef void (*report_data)(char* data, int length);
364
365/**
366 * FLP diagnostic callback structure.
367 * Currently, not used - but this for future extension.
368 */
369typedef 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. */
380typedef 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. */
419typedef 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 */
523typedef 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 */
538typedef 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 */
553typedef 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 */
564typedef 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 */
578typedef 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 */
589typedef void (*flp_geofence_resume_callback) (int32_t geofence_id, int32_t result);
590
591typedef 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 */
605typedef enum {
606    TYPE_CIRCLE = 0,
607} GeofenceType;
608
609/** Circular geofence is represented by lat / long / radius */
610typedef struct {
611    double latitude;
612    double longitude;
613    double radius_m;
614} GeofenceCircle;
615
616/** Represents the type of geofence and data */
617typedef struct {
618    GeofenceType type;
619    union {
620        GeofenceCircle circle;
621    } geofence;
622} GeofenceData;
623
624/** Geofence Options */
625typedef 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 */
668typedef struct {
669    int32_t geofence_id;
670    GeofenceData* data;
671    GeofenceOptions* options;
672} Geofence;
673
674/** Extended interface for FLP_Geofencing support */
675typedef 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