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