1b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/*
2b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Copyright (C) 2013 The Android Open Source Project
3b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
4b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Licensed under the Apache License, Version 2.0 (the "License");
5b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * you may not use this file except in compliance with the License.
6b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * You may obtain a copy of the License at
7b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
8b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *      http://www.apache.org/licenses/LICENSE-2.0
9b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
10b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Unless required by applicable law or agreed to in writing, software
11b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * distributed under the License is distributed on an "AS IS" BASIS,
12b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * See the License for the specific language governing permissions and
14b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * limitations under the License.
15b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
16b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
17b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#ifndef ANDROID_INCLUDE_HARDWARE_FUSED_LOCATION_H
18b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define ANDROID_INCLUDE_HARDWARE_FUSED_LOCATION_H
19b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
20b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#include <hardware/hardware.h>
21b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
22b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
23b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
24b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * This header file defines the interface of the Fused Location Provider.
25b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Fused Location Provider is designed to fuse data from various sources
26b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * like GPS, Wifi, Cell, Sensors, Bluetooth etc to provide a fused location to the
27b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * upper layers. The advantage of doing fusion in hardware is power savings.
28b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * The goal is to do this without waking up the AP to get additional data.
29b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * The software implementation of FLP will decide when to use
30b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * the hardware fused location. Other location features like geofencing will
31b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * also be implemented using fusion in hardware.
32b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
33b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh__BEGIN_DECLS
34b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
35b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_HEADER_VERSION          1
36b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_MODULE_API_VERSION_0_1  HARDWARE_MODULE_API_VERSION(0, 1)
37b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_DEVICE_API_VERSION_0_1  HARDWARE_DEVICE_API_VERSION_2(0, 1, FLP_HEADER_VERSION)
38b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
39b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
40b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * The id of this module
41b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
42b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FUSED_LOCATION_HARDWARE_MODULE_ID "flp"
43b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
44b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
45b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Name for the FLP location interface
46b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
47b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_LOCATION_INTERFACE     "flp_location"
48b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
49b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
50b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Name for the FLP location interface
51b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
52d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang#define FLP_DIAGNOSTIC_INTERFACE     "flp_diagnostic"
53b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
54b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
55b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Name for the FLP_Geofencing interface.
56b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
57b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_GEOFENCING_INTERFACE   "flp_geofencing"
58b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
59b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
60d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang * Name for the FLP_device context interface.
61d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang */
62d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang#define FLP_DEVICE_CONTEXT_INTERFACE   "flp_device_context"
63d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang
64d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang/**
65b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Constants to indicate the various subsystems
66b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * that will be used.
67b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
68b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_TECH_MASK_GNSS      (1U<<0)
69b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_TECH_MASK_WIFI      (1U<<1)
70b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_TECH_MASK_SENSORS   (1U<<2)
71b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_TECH_MASK_CELL      (1U<<3)
72b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_TECH_MASK_BLUETOOTH (1U<<4)
73b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
74b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
756e4b504920f2852763a6003fb7371fca111373b9David Christie * Set when your implementation can produce GNNS-derived locations,
766e4b504920f2852763a6003fb7371fca111373b9David Christie * for use with flp_capabilities_callback.
776e4b504920f2852763a6003fb7371fca111373b9David Christie *
786e4b504920f2852763a6003fb7371fca111373b9David Christie * GNNS is a required capability for a particular feature to be used
796e4b504920f2852763a6003fb7371fca111373b9David Christie * (batching or geofencing).  If not supported that particular feature
806e4b504920f2852763a6003fb7371fca111373b9David Christie * won't be used by the upper layer.
816e4b504920f2852763a6003fb7371fca111373b9David Christie */
826e4b504920f2852763a6003fb7371fca111373b9David Christie#define CAPABILITY_GNSS         (1U<<0)
836e4b504920f2852763a6003fb7371fca111373b9David Christie/**
846e4b504920f2852763a6003fb7371fca111373b9David Christie * Set when your implementation can produce WiFi-derived locations, for
856e4b504920f2852763a6003fb7371fca111373b9David Christie * use with flp_capabilities_callback.
866e4b504920f2852763a6003fb7371fca111373b9David Christie */
876e4b504920f2852763a6003fb7371fca111373b9David Christie#define CAPABILITY_WIFI         (1U<<1)
886e4b504920f2852763a6003fb7371fca111373b9David Christie/**
896e4b504920f2852763a6003fb7371fca111373b9David Christie * Set when your implementation can produce cell-derived locations, for
906e4b504920f2852763a6003fb7371fca111373b9David Christie * use with flp_capabilities_callback.
916e4b504920f2852763a6003fb7371fca111373b9David Christie */
926e4b504920f2852763a6003fb7371fca111373b9David Christie#define CAPABILITY_CELL         (1U<<3)
936e4b504920f2852763a6003fb7371fca111373b9David Christie
946e4b504920f2852763a6003fb7371fca111373b9David Christie/**
955cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie * Status to return in flp_status_callback when your implementation transitions
965cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie * from being unsuccessful in determining location to being successful.
975cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie */
985cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie#define FLP_STATUS_LOCATION_AVAILABLE         0
995cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie/**
1005cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie * Status to return in flp_status_callback when your implementation transitions
1015cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie * from being successful in determining location to being unsuccessful.
1025cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie */
1035cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie#define FLP_STATUS_LOCATION_UNAVAILABLE       1
1045cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie
1055cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie/**
106b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * This constant is used with the batched locations
107b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * APIs. Batching is mandatory when FLP implementation
108b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * is supported. If the flag is set, the hardware implementation
109b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * will wake up the application processor when the FIFO is full,
110b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * If the flag is not set, the hardware implementation will drop
111b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * the oldest data when the FIFO is full.
112b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
113b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_BATCH_WAKEUP_ON_FIFO_FULL        0x0000001
114b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
115b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
116b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * While batching, the implementation should not call the
117b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * flp_location_callback on every location fix. However,
118b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * sometimes in high power mode, the system might need
119b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * a location callback every single time the location
120b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * fix has been obtained. This flag controls that option.
121b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Its the responsibility of the upper layers (caller) to switch
122b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * it off, if it knows that the AP might go to sleep.
123d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang * When this bit is on amidst a batching session, batching should
124d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang * continue while location fixes are reported in real time.
125b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
126b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_BATCH_CALLBACK_ON_LOCATION_FIX   0x0000002
127b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
128b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/** Flags to indicate which values are valid in a FlpLocation. */
129b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef uint16_t FlpLocationFlags;
130b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
131b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh// IMPORTANT: Note that the following values must match
132b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh// constants in the corresponding java file.
133b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
134b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/** FlpLocation has valid latitude and longitude. */
135b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_LOCATION_HAS_LAT_LONG   (1U<<0)
136b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/** FlpLocation has valid altitude. */
137b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_LOCATION_HAS_ALTITUDE   (1U<<1)
138b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/** FlpLocation has valid speed. */
139b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_LOCATION_HAS_SPEED      (1U<<2)
140b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/** FlpLocation has valid bearing. */
141b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_LOCATION_HAS_BEARING    (1U<<4)
142b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/** FlpLocation has valid accuracy. */
143b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_LOCATION_HAS_ACCURACY   (1U<<8)
144b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
145b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
146b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef int64_t FlpUtcTime;
147b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
148b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/** Represents a location. */
149b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef struct {
150b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /** set to sizeof(FlpLocation) */
151b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    size_t          size;
152b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
153b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /** Flags associated with the location object. */
154b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    FlpLocationFlags flags;
155b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
156b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /** Represents latitude in degrees. */
157b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    double          latitude;
158b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
159b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /** Represents longitude in degrees. */
160b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    double          longitude;
161b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
162b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
163b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Represents altitude in meters above the WGS 84 reference
164b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * ellipsoid. */
165b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    double          altitude;
166b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
167b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /** Represents speed in meters per second. */
168b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    float           speed;
169b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
170b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /** Represents heading in degrees. */
171b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    float           bearing;
172b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
173b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /** Represents expected accuracy in meters. */
174b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    float           accuracy;
175b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
176b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /** Timestamp for the location fix. */
177b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    FlpUtcTime      timestamp;
178b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
179b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /** Sources used, will be Bitwise OR of the FLP_TECH_MASK bits. */
180b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    uint32_t         sources_used;
181b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh} FlpLocation;
182b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
183b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef enum {
184b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    ASSOCIATE_JVM,
185b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    DISASSOCIATE_JVM,
186b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh} ThreadEvent;
187b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
188b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
189b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *  Callback with location information.
190b89487944dfe0934f9d29265037c515e539ff31cdestradaa *  Can only be called from a thread associated to JVM using set_thread_event_cb.
191b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *  Parameters:
192b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *     num_locations is the number of batched locations available.
193b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *     location is the pointer to an array of pointers to location objects.
194b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
195b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef void (*flp_location_callback)(int32_t num_locations, FlpLocation** location);
196b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
197b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
198b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Callback utility for acquiring a wakelock.
199b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * This can be used to prevent the CPU from suspending while handling FLP events.
200b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
201b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef void (*flp_acquire_wakelock)();
202b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
203b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
204b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Callback utility for releasing the FLP wakelock.
205b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
206b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef void (*flp_release_wakelock)();
207b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
208b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
209b89487944dfe0934f9d29265037c515e539ff31cdestradaa * Callback for associating a thread that can call into the Java framework code.
210b89487944dfe0934f9d29265037c515e539ff31cdestradaa * This must be used to initialize any threads that report events up to the framework.
211b89487944dfe0934f9d29265037c515e539ff31cdestradaa * Return value:
212b89487944dfe0934f9d29265037c515e539ff31cdestradaa *      FLP_RESULT_SUCCESS on success.
213b89487944dfe0934f9d29265037c515e539ff31cdestradaa *      FLP_RESULT_ERROR if the association failed in the current thread.
214b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
215b89487944dfe0934f9d29265037c515e539ff31cdestradaatypedef int (*flp_set_thread_event)(ThreadEvent event);
216b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
2176e4b504920f2852763a6003fb7371fca111373b9David Christie/**
2186e4b504920f2852763a6003fb7371fca111373b9David Christie * Callback for technologies supported by this implementation.
2196e4b504920f2852763a6003fb7371fca111373b9David Christie *
2206e4b504920f2852763a6003fb7371fca111373b9David Christie * Parameters: capabilities is a bitmask of FLP_CAPABILITY_* values describing
2216e4b504920f2852763a6003fb7371fca111373b9David Christie * which features your implementation supports.  You should support
2226e4b504920f2852763a6003fb7371fca111373b9David Christie * CAPABILITY_GNSS at a minimum for your implementation to be utilized.  You can
2236e4b504920f2852763a6003fb7371fca111373b9David Christie * return 0 in FlpGeofenceCallbacks to indicate you don't support geofencing,
2246e4b504920f2852763a6003fb7371fca111373b9David Christie * or 0 in FlpCallbacks to indicate you don't support location batching.
2256e4b504920f2852763a6003fb7371fca111373b9David Christie */
2266e4b504920f2852763a6003fb7371fca111373b9David Christietypedef void (*flp_capabilities_callback)(int capabilities);
2276e4b504920f2852763a6003fb7371fca111373b9David Christie
2285cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie/**
2295cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie * Callback with status information on the ability to compute location.
2305cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie * To avoid waking up the application processor you should only send
2315cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie * changes in status (you shouldn't call this method twice in a row
2325cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie * with the same status value).  As a guideline you should not call this
2335cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie * more frequently then the requested batch period set with period_ns
2345cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie * in FlpBatchOptions.  For example if period_ns is set to 5 minutes and
2355cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie * the status changes many times in that interval, you should only report
2365cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie * one status change every 5 minutes.
2375cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie *
2385cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie * Parameters:
2395cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie *     status is one of FLP_STATUS_LOCATION_AVAILABLE
2405cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie *     or FLP_STATUS_LOCATION_UNAVAILABLE.
2415cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie */
2425cf80e50033cbb2be14dbee1b97ae5ded648b252David Christietypedef void (*flp_status_callback)(int32_t status);
2435cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie
244b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/** FLP callback structure. */
245b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef struct {
246b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /** set to sizeof(FlpCallbacks) */
247b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    size_t      size;
248b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    flp_location_callback location_cb;
249b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    flp_acquire_wakelock acquire_wakelock_cb;
250b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    flp_release_wakelock release_wakelock_cb;
251b89487944dfe0934f9d29265037c515e539ff31cdestradaa    flp_set_thread_event set_thread_event_cb;
2526e4b504920f2852763a6003fb7371fca111373b9David Christie    flp_capabilities_callback flp_capabilities_cb;
2535cf80e50033cbb2be14dbee1b97ae5ded648b252David Christie    flp_status_callback flp_status_cb;
254b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh} FlpCallbacks;
255b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
256b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
257b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/** Options with the batching FLP APIs */
258b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef struct {
259b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
260b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Maximum power in mW that the underlying implementation
261b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * can use for this batching call.
262d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang     * If max_power_allocation_mW is 0, only fixes that are generated
263d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang     * at no additional cost of power shall be reported.
264b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     */
265b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    double max_power_allocation_mW;
266b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
267b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /** Bitwise OR of the FLP_TECH_MASKS to use */
268b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    uint32_t sources_to_use;
269b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
270b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
271b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * FLP_BATCH_WAKEUP_ON_FIFO_FULL - If set the hardware
272b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * will wake up the AP when the buffer is full. If not set, the
273b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * hardware will drop the oldest location object.
274b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *
275b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * FLP_BATCH_CALLBACK_ON_LOCATION_FIX - If set the location
276b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * callback will be called every time there is a location fix.
277b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Its the responsibility of the upper layers (caller) to switch
278d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang     * it off, if it knows that the AP might go to sleep. When this
279d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang     * bit is on amidst a batching session, batching should continue
280d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang     * while location fixes are reported in real time.
281b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *
282b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Other flags to be bitwised ORed in the future.
283b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     */
284b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    uint32_t flags;
285b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
286b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
287b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Frequency with which location needs to be batched in nano
288b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * seconds.
289b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     */
290b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    int64_t period_ns;
291b3a7d37fa20457e62fd4c30c02dcd14400f0839eDavid Christie
292b3a7d37fa20457e62fd4c30c02dcd14400f0839eDavid Christie    /**
293b3a7d37fa20457e62fd4c30c02dcd14400f0839eDavid Christie     * The smallest displacement between reported locations in meters.
294b3a7d37fa20457e62fd4c30c02dcd14400f0839eDavid Christie     *
295b3a7d37fa20457e62fd4c30c02dcd14400f0839eDavid Christie     * If set to 0, then you should report locations at the requested
296b3a7d37fa20457e62fd4c30c02dcd14400f0839eDavid Christie     * interval even if the device is stationary.  If positive, you
297b3a7d37fa20457e62fd4c30c02dcd14400f0839eDavid Christie     * can use this parameter as a hint to save power (e.g. throttling
298b3a7d37fa20457e62fd4c30c02dcd14400f0839eDavid Christie     * location period if the user hasn't traveled close to the displacement
299b3a7d37fa20457e62fd4c30c02dcd14400f0839eDavid Christie     * threshold).  Even small positive values can be interpreted to mean
300b3a7d37fa20457e62fd4c30c02dcd14400f0839eDavid Christie     * that you don't have to compute location when the device is stationary.
301b3a7d37fa20457e62fd4c30c02dcd14400f0839eDavid Christie     *
302b3a7d37fa20457e62fd4c30c02dcd14400f0839eDavid Christie     * There is no need to filter location delivery based on this parameter.
303b3a7d37fa20457e62fd4c30c02dcd14400f0839eDavid Christie     * Locations can be delivered even if they have a displacement smaller than
304b3a7d37fa20457e62fd4c30c02dcd14400f0839eDavid Christie     * requested. This parameter can safely be ignored at the cost of potential
305b3a7d37fa20457e62fd4c30c02dcd14400f0839eDavid Christie     * power savings.
306b3a7d37fa20457e62fd4c30c02dcd14400f0839eDavid Christie     */
307b3a7d37fa20457e62fd4c30c02dcd14400f0839eDavid Christie    float smallest_displacement_meters;
308b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh} FlpBatchOptions;
309b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
310b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_RESULT_SUCCESS                       0
311b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_RESULT_ERROR                        -1
312b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_RESULT_INSUFFICIENT_MEMORY          -2
313b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_RESULT_TOO_MANY_GEOFENCES           -3
314b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_RESULT_ID_EXISTS                    -4
315b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_RESULT_ID_UNKNOWN                   -5
316b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_RESULT_INVALID_GEOFENCE_TRANSITION  -6
317b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
318b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
319b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Represents the standard FLP interface.
320b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
321b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef struct {
322b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
323b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * set to sizeof(FlpLocationInterface)
324b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     */
325b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    size_t size;
326b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
327b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
328b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Opens the interface and provides the callback routines
3296e4b504920f2852763a6003fb7371fca111373b9David Christie     * to the implementation of this interface.  Once called you should respond
3306e4b504920f2852763a6003fb7371fca111373b9David Christie     * by calling the flp_capabilities_callback in FlpCallbacks to
3316e4b504920f2852763a6003fb7371fca111373b9David Christie     * specify the capabilities that your implementation supports.
332b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     */
333b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    int (*init)(FlpCallbacks* callbacks );
334b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
335b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
336d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang     * Return the batch size (in number of FlpLocation objects)
337d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang     * available in the hardware.  Note, different HW implementations
338d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang     * may have different sample sizes.  This shall return number
339d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang     * of samples defined in the format of FlpLocation.
340b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * This will be used by the upper layer, to decide on the batching
341b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * interval and whether the AP should be woken up or not.
342b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     */
343b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    int (*get_batch_size)();
344b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
345b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
346b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Start batching locations. This API is primarily used when the AP is
347b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * asleep and the device can batch locations in the hardware.
348b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *   flp_location_callback is used to return the locations. When the buffer
349b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * is full and FLP_BATCH_WAKEUP_ON_FIFO_FULL is used, the AP is woken up.
350b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * When the buffer is full and FLP_BATCH_WAKEUP_ON_FIFO_FULL is not set,
351b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * the oldest location object is dropped. In this case the  AP will not be
352b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * woken up. The upper layer will use get_batched_location
353b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * API to explicitly ask for the location.
354b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *   If FLP_BATCH_CALLBACK_ON_LOCATION_FIX is set, the implementation
355b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * will call the flp_location_callback every single time there is a location
356b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * fix. This overrides FLP_BATCH_WAKEUP_ON_FIFO_FULL flag setting.
357b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * It's the responsibility of the upper layers (caller) to switch
358b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * it off, if it knows that the AP might go to sleep. This is useful
359b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * for nagivational applications when the system is in high power mode.
360b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Parameters:
361b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *    id - Id for the request.
362b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *    options - See FlpBatchOptions struct definition.
363b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Return value:
364b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *    FLP_RESULT_SUCCESS on success, FLP_RESULT_INSUFFICIENT_MEMORY,
365b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *    FLP_RESULT_ID_EXISTS, FLP_RESULT_ERROR on failure.
366b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     */
367b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    int (*start_batching)(int id, FlpBatchOptions* options);
368b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
369b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
370b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Update FlpBatchOptions associated with a batching request.
371b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * When a batching operation is in progress and a batching option
372b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * such as FLP_BATCH_WAKEUP_ON_FIFO_FULL needs to be updated, this API
373b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * will be used. For instance, this can happen when the AP is awake and
374b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * the maps application is being used.
375b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Parameters:
376b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *    id - Id of an existing batch request.
377b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *    new_options - Updated FlpBatchOptions
378b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Return value:
379b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *    FLP_RESULT_SUCCESS on success, FLP_RESULT_ID_UNKNOWN,
380b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *    FLP_RESULT_ERROR on error.
381b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     */
382b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    int (*update_batching_options)(int id, FlpBatchOptions* new_options);
383b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
384b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
385b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Stop batching.
386b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Parameters:
387b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *    id - Id for the request.
388b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Return Value:
389b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *    FLP_RESULT_SUCCESS on success, FLP_RESULT_ID_UNKNOWN or
390b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *    FLP_RESULT_ERROR on failure.
391b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     */
392b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    int (*stop_batching)(int id);
393b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
394b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
395b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Closes the interface. If any batch operations are in progress,
396b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * they should be stopped.
397b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     */
398b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    void (*cleanup)();
399b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
400b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
401b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Get the fused location that was batched.
402b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *   flp_location_callback is used to return the location. The location object
403b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * is dropped from the buffer only when the buffer is full. Do not remove it
404b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * from the buffer just because it has been returned using the callback.
405b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * In other words, when there is no new location object, two calls to
406b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * get_batched_location(1) should return the same location object.
407b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Parameters:
408b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *      last_n_locations - Number of locations to get. This can be one or many.
409b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *      If the last_n_locations is 1, you get the latest location known to the
410b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *      hardware.
411b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     */
412b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    void (*get_batched_location)(int last_n_locations);
413b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
414b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
415b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Injects current location from another location provider
416b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * latitude and longitude are measured in degrees
417b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * expected accuracy is measured in meters
418b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Parameters:
419b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     *      location - The location object being injected.
420b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Return value: FLP_RESULT_SUCCESS or FLP_RESULT_ERROR.
421b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     */
422b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    int  (*inject_location)(FlpLocation* location);
423b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
424b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
425b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Get a pointer to extension information.
426b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     */
427b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    const void* (*get_extension)(const char* name);
4284b49035055487058cb0f82db6eb8b3ec740934d8David Christie
4294b49035055487058cb0f82db6eb8b3ec740934d8David Christie    /**
4304b49035055487058cb0f82db6eb8b3ec740934d8David Christie     * Retrieve all batched locations currently stored and clear the buffer.
4314b49035055487058cb0f82db6eb8b3ec740934d8David Christie     * flp_location_callback MUST be called in response, even if there are
4324b49035055487058cb0f82db6eb8b3ec740934d8David Christie     * no locations to flush (in which case num_locations should be 0).
4334b49035055487058cb0f82db6eb8b3ec740934d8David Christie     * Subsequent calls to get_batched_location or flush_batched_locations
4344b49035055487058cb0f82db6eb8b3ec740934d8David Christie     * should not return any of the locations returned in this call.
4354b49035055487058cb0f82db6eb8b3ec740934d8David Christie     */
4364b49035055487058cb0f82db6eb8b3ec740934d8David Christie    void (*flush_batched_locations)();
437b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh} FlpLocationInterface;
438b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
439b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshstruct flp_device_t {
440b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    struct hw_device_t common;
441b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
442b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
443b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Get a handle to the FLP Interface.
444b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     */
445b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    const FlpLocationInterface* (*get_flp_interface)(struct flp_device_t* dev);
446b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh};
447b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
448b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
449d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang * Callback for reports diagnostic data into the Java framework code.
450d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang*/
451d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tangtypedef void (*report_data)(char* data, int length);
452d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang
453d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang/**
454d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang * FLP diagnostic callback structure.
455b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Currently, not used - but this for future extension.
456b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
457b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef struct {
458d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang    /** set to sizeof(FlpDiagnosticCallbacks) */
459b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    size_t      size;
460d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang
461b89487944dfe0934f9d29265037c515e539ff31cdestradaa    flp_set_thread_event set_thread_event_cb;
462b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
463d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang    /** reports diagnostic data into the Java framework code */
464d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang    report_data data_cb;
465d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang} FlpDiagnosticCallbacks;
466d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang
467d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang/** Extended interface for diagnostic support. */
468b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef struct {
469d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang    /** set to sizeof(FlpDiagnosticInterface) */
470b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    size_t          size;
471b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
472b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
473d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang     * Opens the diagnostic interface and provides the callback routines
474b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * to the implemenation of this interface.
475b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     */
476d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang    void  (*init)(FlpDiagnosticCallbacks* callbacks);
477d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang
478d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang    /**
479d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang     * Injects diagnostic data into the FLP subsystem.
480d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang     * Return 0 on success, -1 on error.
481d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang     **/
482d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang    int  (*inject_data)(char* data, int length );
483d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang} FlpDiagnosticInterface;
484d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang
485d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang/**
486d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang * Context setting information.
487d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang * All these settings shall be injected to FLP HAL at FLP init time.
488d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang * Following that, only the changed setting need to be re-injected
489d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang * upon changes.
490d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang */
491d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang
492d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang#define FLP_DEVICE_CONTEXT_GPS_ENABLED                     (1U<<0)
493d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang#define FLP_DEVICE_CONTEXT_AGPS_ENABLED                    (1U<<1)
494d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang#define FLP_DEVICE_CONTEXT_NETWORK_POSITIONING_ENABLED     (1U<<2)
495d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang#define FLP_DEVICE_CONTEXT_WIFI_CONNECTIVITY_ENABLED       (1U<<3)
496d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang#define FLP_DEVICE_CONTEXT_WIFI_POSITIONING_ENABLED        (1U<<4)
49706b77aa4e1abafdba19bbf30b5409bc1ec6db68edestradaa#define FLP_DEVICE_CONTEXT_HW_NETWORK_POSITIONING_ENABLED  (1U<<5)
498d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang#define FLP_DEVICE_CONTEXT_AIRPLANE_MODE_ON                (1U<<6)
499d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang#define FLP_DEVICE_CONTEXT_DATA_ENABLED                    (1U<<7)
500d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang#define FLP_DEVICE_CONTEXT_ROAMING_ENABLED                 (1U<<8)
501d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang#define FLP_DEVICE_CONTEXT_CURRENTLY_ROAMING               (1U<<9)
502d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang#define FLP_DEVICE_CONTEXT_SENSOR_ENABLED                  (1U<<10)
503d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang#define FLP_DEVICE_CONTEXT_BLUETOOTH_ENABLED               (1U<<11)
504d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang#define FLP_DEVICE_CONTEXT_CHARGER_ON                      (1U<<12)
505d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang
506d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang/** Extended interface for device context support. */
507d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tangtypedef struct {
508d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang    /** set to sizeof(FlpDeviceContextInterface) */
509d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang    size_t          size;
510b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
511b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
512b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Injects debug data into the FLP subsystem.
513b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * Return 0 on success, -1 on error.
514b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     **/
515d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang    int  (*inject_device_context)(uint32_t enabledMask);
516d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang} FlpDeviceContextInterface;
517b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
518b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
519b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
520b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * There are 3 states associated with a Geofence: Inside, Outside, Unknown.
521b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * There are 3 transitions: ENTERED, EXITED, UNCERTAIN.
522b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
523b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * An example state diagram with confidence level: 95% and Unknown time limit
524b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * set as 30 secs is shown below. (confidence level and Unknown time limit are
525b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * explained latter)
526b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                         ____________________________
527b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                        |       Unknown (30 secs)   |
528b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                         """"""""""""""""""""""""""""
529b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                            ^ |                  |  ^
530b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                   UNCERTAIN| |ENTERED     EXITED|  |UNCERTAIN
531b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                            | v                  v  |
532b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                        ________    EXITED     _________
533b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                       | Inside | -----------> | Outside |
534b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                       |        | <----------- |         |
535b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                        """"""""    ENTERED    """""""""
536b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
537b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Inside state: We are 95% confident that the user is inside the geofence.
538b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Outside state: We are 95% confident that the user is outside the geofence
539b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Unknown state: Rest of the time.
540b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
541b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * The Unknown state is better explained with an example:
542b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
543b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                            __________
544b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                           |         c|
545b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                           |  ___     |    _______
546b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                           |  |a|     |   |   b   |
547b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                           |  """     |    """""""
548b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                           |          |
549b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                            """"""""""
550b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * In the diagram above, "a" and "b" are 2 geofences and "c" is the accuracy
551b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * circle reported by the FLP subsystem. Now with regard to "b", the system is
552b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * confident that the user is outside. But with regard to "a" is not confident
553b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * whether it is inside or outside the geofence. If the accuracy remains the
554b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * same for a sufficient period of time, the UNCERTAIN transition would be
555b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * triggered with the state set to Unknown. If the accuracy improves later, an
556b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * appropriate transition should be triggered.  This "sufficient period of time"
557b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * is defined by the parameter in the add_geofence_area API.
558b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *     In other words, Unknown state can be interpreted as a state in which the
559b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * FLP subsystem isn't confident enough that the user is either inside or
560b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * outside the Geofence. It moves to Unknown state only after the expiry of the
561b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * timeout.
562b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
563b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * The geofence callback needs to be triggered for the ENTERED and EXITED
564b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * transitions, when the FLP system is confident that the user has entered
565b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * (Inside state) or exited (Outside state) the Geofence. An implementation
566b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * which uses a value of 95% as the confidence is recommended. The callback
567b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * should be triggered only for the transitions requested by the
568b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * add_geofence_area call.
569b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
570b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Even though the diagram and explanation talks about states and transitions,
571b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * the callee is only interested in the transistions. The states are mentioned
572b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * here for illustrative purposes.
573b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
574b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Startup Scenario: When the device boots up, if an application adds geofences,
575b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * and then we get an accurate FLP location fix, it needs to trigger the
576b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * appropriate (ENTERED or EXITED) transition for every Geofence it knows about.
577b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * By default, all the Geofences will be in the Unknown state.
578b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
579b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * When the FLP system is unavailable, flp_geofence_status_callback should be
580b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * called to inform the upper layers of the same. Similarly, when it becomes
581b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * available the callback should be called. This is a global state while the
582b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * UNKNOWN transition described above is per geofence.
583b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
584b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
585b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_GEOFENCE_TRANSITION_ENTERED     (1L<<0)
586b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_GEOFENCE_TRANSITION_EXITED      (1L<<1)
587b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_GEOFENCE_TRANSITION_UNCERTAIN   (1L<<2)
588b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
589b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_GEOFENCE_MONITOR_STATUS_UNAVAILABLE (1L<<0)
590b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#define FLP_GEOFENCE_MONITOR_STATUS_AVAILABLE   (1L<<1)
591b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
592b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
593b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * The callback associated with the geofence.
594b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Parameters:
595b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *      geofence_id - The id associated with the add_geofence_area.
596b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *      location    - The current location as determined by the FLP subsystem.
597b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *      transition  - Can be one of FLP_GEOFENCE_TRANSITION_ENTERED, FLP_GEOFENCE_TRANSITION_EXITED,
598b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                    FLP_GEOFENCE_TRANSITION_UNCERTAIN.
599d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang *      timestamp   - Timestamp when the transition was detected; -1 if not available.
600b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *      sources_used - Bitwise OR of FLP_TECH_MASK flags indicating which
601b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                     subsystems were used.
602b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
603b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * The callback should only be called when the caller is interested in that
604b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * particular transition. For instance, if the caller is interested only in
605b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * ENTERED transition, then the callback should NOT be called with the EXITED
606b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * transition.
607b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
608b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * IMPORTANT: If a transition is triggered resulting in this callback, the
609b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * subsystem will wake up the application processor, if its in suspend state.
610b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
611b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef void (*flp_geofence_transition_callback) (int32_t geofence_id,  FlpLocation* location,
612b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh        int32_t transition, FlpUtcTime timestamp, uint32_t sources_used);
613b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
614b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
615b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * The callback associated with the availablity of one the sources used for geofence
616b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * monitoring by the FLP sub-system For example, if the GPS system determines that it cannot
617b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * monitor geofences because of lack of reliability or unavailability of the GPS signals,
618b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * it will call this callback with FLP_GEOFENCE_MONITOR_STATUS_UNAVAILABLE parameter and the
619b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * source set to FLP_TECH_MASK_GNSS.
620b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
621b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Parameters:
622b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *  status - FLP_GEOFENCE_MONITOR_STATUS_UNAVAILABLE or FLP_GEOFENCE_MONITOR_STATUS_AVAILABLE.
623b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *  source - One of the FLP_TECH_MASKS
624b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *  last_location - Last known location.
625b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
626b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef void (*flp_geofence_monitor_status_callback) (int32_t status, uint32_t source,
627b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh                                                      FlpLocation* last_location);
628b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
629b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
630b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * The callback associated with the add_geofence call.
631b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
632b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Parameter:
633b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * geofence_id - Id of the geofence.
634b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * result - FLP_RESULT_SUCCESS
635b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *          FLP_RESULT_ERROR_TOO_MANY_GEOFENCES  - geofence limit has been reached.
636b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *          FLP_RESULT_ID_EXISTS  - geofence with id already exists
637b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *          FLP_RESULT_INVALID_GEOFENCE_TRANSITION - the monitorTransition contains an
638b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *              invalid transition
639b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *          FLP_RESULT_ERROR - for other errors.
640b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
641b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef void (*flp_geofence_add_callback) (int32_t geofence_id, int32_t result);
642b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
643b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
644b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * The callback associated with the remove_geofence call.
645b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
646b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Parameter:
647b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * geofence_id - Id of the geofence.
648b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * result - FLP_RESULT_SUCCESS
649b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *          FLP_RESULT_ID_UNKNOWN - for invalid id
650b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *          FLP_RESULT_ERROR for others.
651b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
652b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef void (*flp_geofence_remove_callback) (int32_t geofence_id, int32_t result);
653b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
654b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
655b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
656b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * The callback associated with the pause_geofence call.
657b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
658b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Parameter:
659b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * geofence_id - Id of the geofence.
660b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * result - FLP_RESULT_SUCCESS
661b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *          FLP_RESULT__ID_UNKNOWN - for invalid id
662b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *          FLP_RESULT_INVALID_TRANSITION -
663b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *                    when monitor_transitions is invalid
664b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *          FLP_RESULT_ERROR for others.
665b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
666b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef void (*flp_geofence_pause_callback) (int32_t geofence_id, int32_t result);
667b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
668b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/**
669b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * The callback associated with the resume_geofence call.
670b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *
671b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * Parameter:
672b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * geofence_id - Id of the geofence.
673b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh * result - FLP_RESULT_SUCCESS
674b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *          FLP_RESULT_ID_UNKNOWN - for invalid id
675b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh *          FLP_RESULT_ERROR for others.
676b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh */
677b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef void (*flp_geofence_resume_callback) (int32_t geofence_id, int32_t result);
678b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
679b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef struct {
680b89487944dfe0934f9d29265037c515e539ff31cdestradaa    /** set to sizeof(FlpGeofenceCallbacks) */
681b89487944dfe0934f9d29265037c515e539ff31cdestradaa    size_t size;
682b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    flp_geofence_transition_callback geofence_transition_callback;
683b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    flp_geofence_monitor_status_callback geofence_status_callback;
684b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    flp_geofence_add_callback geofence_add_callback;
685b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    flp_geofence_remove_callback geofence_remove_callback;
686b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    flp_geofence_pause_callback geofence_pause_callback;
687b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    flp_geofence_resume_callback geofence_resume_callback;
688b89487944dfe0934f9d29265037c515e539ff31cdestradaa    flp_set_thread_event set_thread_event_cb;
6896e4b504920f2852763a6003fb7371fca111373b9David Christie    flp_capabilities_callback flp_capabilities_cb;
690b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh} FlpGeofenceCallbacks;
691b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
692b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
693b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/** Type of geofence */
694b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef enum {
695b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    TYPE_CIRCLE = 0,
696b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh} GeofenceType;
697b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
698b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/** Circular geofence is represented by lat / long / radius */
699b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef struct {
700b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    double latitude;
701b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    double longitude;
702b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    double radius_m;
703b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh} GeofenceCircle;
704b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
705b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/** Represents the type of geofence and data */
706b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef struct {
707b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    GeofenceType type;
708b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    union {
709b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh        GeofenceCircle circle;
710b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    } geofence;
711b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh} GeofenceData;
712b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
713b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/** Geofence Options */
714b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef struct {
715b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh   /**
716b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * The current state of the geofence. For example, if
717b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * the system already knows that the user is inside the geofence,
718b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * this will be set to FLP_GEOFENCE_TRANSITION_ENTERED. In most cases, it
719b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * will be FLP_GEOFENCE_TRANSITION_UNCERTAIN. */
720b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    int last_transition;
721b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
722b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh   /**
723b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * Transitions to monitor. Bitwise OR of
724b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * FLP_GEOFENCE_TRANSITION_ENTERED, FLP_GEOFENCE_TRANSITION_EXITED and
725b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * FLP_GEOFENCE_TRANSITION_UNCERTAIN.
726b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    */
727b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    int monitor_transitions;
728b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
729b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh   /**
730b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * Defines the best-effort description
731b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * of how soon should the callback be called when the transition
732b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * associated with the Geofence is triggered. For instance, if set
733b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * to 1000 millseconds with FLP_GEOFENCE_TRANSITION_ENTERED, the callback
734b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * should be called 1000 milliseconds within entering the geofence.
735b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * This parameter is defined in milliseconds.
736b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * NOTE: This is not to be confused with the rate that the GPS is
737b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * polled at. It is acceptable to dynamically vary the rate of
738b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * sampling the GPS for power-saving reasons; thus the rate of
739b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * sampling may be faster or slower than this.
740b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    */
741b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    int notification_responsivenes_ms;
742b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
743b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh   /**
744b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * The time limit after which the UNCERTAIN transition
745b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * should be triggered. This paramter is defined in milliseconds.
746b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    */
747b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    int unknown_timer_ms;
748b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
749b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    /**
750b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * The sources to use for monitoring geofences. Its a BITWISE-OR
751b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     * of FLP_TECH_MASK flags.
752b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh     */
753b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    uint32_t sources_to_use;
754b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh} GeofenceOptions;
755b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
756b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/** Geofence struct */
757b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef struct {
758b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    int32_t geofence_id;
759b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    GeofenceData* data;
760b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    GeofenceOptions* options;
761b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh} Geofence;
762b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
763b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh/** Extended interface for FLP_Geofencing support */
764b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganeshtypedef struct {
765b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh   /** set to sizeof(FlpGeofencingInterface) */
766b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh   size_t          size;
767b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
768b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh   /**
769b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * Opens the geofence interface and provides the callback routines
7706e4b504920f2852763a6003fb7371fca111373b9David Christie    * to the implemenation of this interface.  Once called you should respond
7716e4b504920f2852763a6003fb7371fca111373b9David Christie    * by calling the flp_capabilities_callback in FlpGeofenceCallbacks to
7726e4b504920f2852763a6003fb7371fca111373b9David Christie    * specify the capabilities that your implementation supports.
773b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    */
774b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh   void  (*init)( FlpGeofenceCallbacks* callbacks );
775b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
776b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh   /**
777b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * Add a list of geofences.
778b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * Parameters:
779b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    *     number_of_geofences - The number of geofences that needed to be added.
780b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    *     geofences - Pointer to array of pointers to Geofence structure.
781b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    */
782b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh   void (*add_geofences) (int32_t number_of_geofences, Geofence** geofences);
783b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
784b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh   /**
785b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * Pause monitoring a particular geofence.
786b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * Parameters:
787b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    *   geofence_id - The id for the geofence.
788b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    */
789b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh   void (*pause_geofence) (int32_t geofence_id);
790b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
791b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh   /**
792b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * Resume monitoring a particular geofence.
793b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * Parameters:
794b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    *   geofence_id - The id for the geofence.
795b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    *   monitor_transitions - Which transitions to monitor. Bitwise OR of
796b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    *       FLP_GEOFENCE_TRANSITION_ENTERED, FLP_GEOFENCE_TRANSITION_EXITED and
797b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    *       FLP_GEOFENCE_TRANSITION_UNCERTAIN.
798b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    *       This supersedes the value associated provided in the
799b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    *       add_geofence_area call.
800b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    */
801b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh   void (*resume_geofence) (int32_t geofence_id, int monitor_transitions);
802b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
803b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh   /**
804d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang    * Modify a particular geofence option.
805d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang    * Parameters:
806d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang    *    geofence_id - The id for the geofence.
807d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang    *    options - Various options associated with the geofence. See
808d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang    *        GeofenceOptions structure for details.
809d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang    */
810d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang   void (*modify_geofence_option) (int32_t geofence_id, GeofenceOptions* options);
811d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang
812d2c966fa2b7b12a6162371ac3a99b7fa1daf365aKevin Tang   /**
813b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * Remove a list of geofences. After the function returns, no notifications
814b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * should be sent.
815b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    * Parameter:
816b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    *     number_of_geofences - The number of geofences that needed to be added.
817b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    *     geofence_id - Pointer to array of geofence_ids to be removed.
818b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh    */
819b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh   void (*remove_geofences) (int32_t number_of_geofences, int32_t* geofence_id);
820b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh} FlpGeofencingInterface;
821b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
822b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh__END_DECLS
823b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
824b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh#endif /* ANDROID_INCLUDE_HARDWARE_FLP_H */
825b951dee9e65cf8dbb52407bf0f562ff41122bc33Jaikumar Ganesh
826