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