blob: a73790a21187c9bb673da7b5995a9f5cff2e69bc [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.hardware.gnss@1.0;
/**
* GNSS Geofence.
* There are 3 states associated with a Geofence: Inside, Outside, Unknown.
* There are 3 transitions: ENTERED, EXITED, UNCERTAIN.
*
* An example state diagram with confidence level: 95% and Unknown time limit
* set as 30 secs is shown below. (confidence level and Unknown time limit are
* explained latter).
* ____________________________
* | Unknown (30 secs) |
* """"""""""""""""""""""""""""
* ^ | | ^
* UNCERTAIN| |ENTERED EXITED| |UNCERTAIN
* | v v |
* ________ EXITED _________
* | Inside | -----------> | Outside |
* | | <----------- | |
* """""""" ENTERED """""""""
*
* Inside state: We are 95% confident that the user is inside the geofence.
* Outside state: We are 95% confident that the user is outside the geofence
* Unknown state: Rest of the time.
*
* The Unknown state is better explained with an example:
*
* __________
* | c|
* | ___ | _______
* | |a| | | b |
* | """ | """""""
* | |
* """"""""""
* In the diagram above, "a" and "b" are 2 geofences and "c" is the accuracy
* circle reported by the GNSS subsystem. Now with regard to "b", the system is
* confident that the user is outside. But with regard to "a" is not confident
* whether it is inside or outside the geofence. If the accuracy remains the
* same for a sufficient period of time, the UNCERTAIN transition must be
* triggered with the state set to Unknown. If the accuracy improves later, an
* appropriate transition must be triggered. This "sufficient period of time"
* is defined by the parameter in the addGeofenceArea API.
* In other words, Unknown state can be interpreted as a state in which the
* GNSS subsystem isn't confident enough that the user is either inside or
* outside the Geofence. It moves to Unknown state only after the expiry of the
* timeout.
*
* The geofence callback needs to be triggered for the ENTERED and EXITED
* transitions, when the GNSS system is confident that the user has entered
* (Inside state) or exited (Outside state) the Geofence. An implementation
* which uses a value of 95% as the confidence is recommended. The callback
* must be triggered only for the transitions requested by the
* addGeofenceArea method.
*
* Even though the diagram and explanation talks about states and transitions,
* the callee is only interested in the transitions. The states are mentioned
* here for illustrative purposes.
*
* Startup Scenario: When the device boots up, if an application adds geofences,
* and then we get an accurate GNSS location fix, it needs to trigger the
* appropriate (ENTERED or EXITED) transition for every Geofence it knows about.
* By default, all the Geofences will be in the Unknown state.
*
* When the GNSS system is unavailable, gnssGeofenceStatusCb must be
* called to inform the upper layers of the same. Similarly, when it becomes
* available the callback must be called. This is a global state while the
* UNKNOWN transition described above is per geofence.
*
* An important aspect to note is that users of this API (framework), will use
* other subsystems like wifi, sensors, cell to handle Unknown case and
* hopefully provide a definitive state transition to the third party
* application. GNSS Geofence will just be a signal indicating what the GNSS
* subsystem knows about the Geofence.
*
*/
interface IGnssGeofenceCallback {
@export(name="", value_prefix="GPS_GEOFENCE_")
enum GeofenceTransition : int32_t {
ENTERED = (1 << 0L),
EXITED = (1 << 1L),
UNCERTAIN = (1 << 2L),
};
@export(name="", value_prefix="GPS_GEOFENCE_")
enum GeofenceAvailability : int32_t {
UNAVAILABLE = (1 << 0L),
AVAILABLE = (1 << 1L),
};
@export(name="", value_prefix="GPS_GEOFENCE_")
enum GeofenceStatus : int32_t {
OPERATION_SUCCESS = 0,
ERROR_TOO_MANY_GEOFENCES = -100,
ERROR_ID_EXISTS = -101,
ERROR_ID_UNKNOWN = -102,
ERROR_INVALID_TRANSITION = -103,
ERROR_GENERIC = -149
};
/**
* The callback associated with the geofence transition.
* The callback must only be called when the caller is interested in that
* particular transition. For instance, if the caller is interested only in
* ENTERED transition, then the callback must not be called with the EXITED
* transition.
*
* IMPORTANT: If a transition is triggered resulting in this callback, the
* GNSS subsystem will wake up the application processor, if its in suspend
* state.
*
* @param geofenceId The id associated with the addGeofenceArea.
* @param location The current GNSS location.
* @param transition Can be one of ENTERED, EXITED or UNCERTAIN.
* @param timestamp Timestamp when the transition was detected.
*
*/
gnssGeofenceTransitionCb(int32_t geofenceId, GnssLocation location,
GeofenceTransition transition, GnssUtcTime timestamp);
/**
* The callback associated with the availability of the GNSS system for
* geofencing monitoring. If the GNSS system determines that it cannot monitor
* geofences because of lack of reliability or unavailability of the GNSS
* signals, it will call this callback with UNAVAILABLE parameter.
*
* @param status - UNAVAILABLE or AVAILABLE.
* @param lastLocation - Last known location.
*/
gnssGeofenceStatusCb(GeofenceAvailability status, GnssLocation lastLocation);
/**
* The callback associated with the addGeofence call.
*
* @param geofenceId Id of the geofence.
* @param status Will be OPERATION_SUCCESS if the geofence
* add was successful. Will be ERROR_TOO_MANY_GEOFENCES if the
* geofence limit has been reached.
* Will be ERROR_ID_EXISTS if geofence with id already exists.
* Will be ERROR_INVALID_TRANSITION if the monitorTransition contains an
* invalid transition.
* Will be ERROR_GENERIC for other errors.
*/
gnssGeofenceAddCb(int32_t geofenceId, GeofenceStatus status);
/**
* The callback associated with the removeGeofence call.
*
* @param geofenceId Id of the geofence.
* @param status Will return OPERATION_SUCCESS if successful.
* Will be ERROR_ID_UNKNOWN for invalid id and
* ERROR_GENERIC for others.
*/
gnssGeofenceRemoveCb(int32_t geofenceId, GeofenceStatus status);
/**
* The callback associated with the pauseGeofence call.
*
* @param geofenceId Id of the geofence.
* @param status Will be OPERATION_SUCCESS if success.
* Will be ERROR_ID_UNKNOWN for invalid id. Will be
* ERROR_INVALID_TRANSITION when monitorTransitions is invalid.
* Will be ERROR_GENERIC for other err errors.
*/
gnssGeofencePauseCb(int32_t geofenceId, GeofenceStatus status);
/**
* The callback associated with the resumeGeofence call.
*
* @param geofenceId - Id of the geofence.
* @param status Will be OPERATION_SUCCESS if successful.
* Will be ERROR_ID_UNKNOWN for invalid id and ERROR_GENERIC for others.
*/
gnssGeofenceResumeCb(int32_t geofenceId, GeofenceStatus status);
};