blob: 005b3c12d806a04f6c61bee04da6aeed7dd8d463 [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.
*/
#ifndef CHRE_PAL_GNSS_H_
#define CHRE_PAL_GNSS_H_
/**
* @file
* Defines the interface between the common CHRE core system and the
* platform-specific GNSS module. This API is largely asynchronous - any
* implementation must be able to handle multiple outstanding requests to
* asynchronous APIs such as controlLocationSession() under reasonable resource
* constraints. Requests to the same API and their associated responses must be
* handled strictly in-order. Refer to {@link #chreAsyncResult} for more
* information.
*/
#include <stdbool.h>
#include <stdint.h>
#include "chre/pal/system.h"
#include "chre/pal/version.h"
#include "chre_api/chre/common.h"
#include "chre_api/chre/gnss.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* Initial version of the CHRE GNSS PAL, tied to CHRE API v1.1.
*/
#define CHRE_PAL_GNSS_API_V1_0 CHRE_PAL_CREATE_API_VERSION(1, 0)
// v1.1 skipped to avoid confusion with CHRE API v1.1
/**
* Introduced alongside CHRE API v1.2, adding support for listening in on GNSS
* fixes initiated by other clients of the GNSS engine via
* configurePassiveLocationListener().
*/
#define CHRE_PAL_GNSS_API_V1_2 CHRE_PAL_CREATE_API_VERSION(1, 2)
/**
* Introduced alongside CHRE API v1.3, adding support for altitude/speed/bearing
* accuracy in chreGnssLocationEvent delivered by locationEventCallback.
*/
#define CHRE_PAL_GNSS_API_V1_3 CHRE_PAL_CREATE_API_VERSION(1, 3)
/**
* Introduced alongside CHRE API v1.4, adding support for carrier frequency in
* chreGnssMeasurement delivered by measurementStatusChangeCallback.
*/
#define CHRE_PAL_GNSS_API_V1_4 CHRE_PAL_CREATE_API_VERSION(1, 4)
/**
* The version of the CHRE GNSS PAL defined in this header file.
*/
#define CHRE_PAL_GNSS_API_CURRENT_VERSION CHRE_PAL_GNSS_API_V1_4
struct chrePalGnssCallbacks {
/**
* This function can be used by the PAL module to request that the core CHRE
* system re-send requests for any active sessions and its current passive
* location listener setting. For example, if the GNSS subsystem has
* recovered from a system crash, this function can be used to silently
* (from the client's perspective) restore open sessions.
*/
void (*requestStateResync)(void);
/**
* Callback invoked to inform the CHRE of the result of changes to the
* location session status requested via controlLocationSession in struct
* chrePalGnssApi.
*
* Unsolicited calls to this function must not be made. In other words,
* this callback should only be invoked as the direct result of an earlier
* call to controlLocationSession. If the location session is terminated on
* the remote end, then requestStateResync() should be used if it is due to
* a recoverable condition, otherwise the PAL should leave the location
* session in the "enabled" state even though it does not expect to deliver
* new location events.
*
* @param enabled true if the location session is currently active, false
* otherwise
* @param errorCode An error code from enum chreError
*
* @see chrePalGnssApi.controlLocationSession
* @see #chreError
*/
void (*locationStatusChangeCallback)(bool enabled, uint8_t errorCode);
/**
* Callback used to pass GNSS location fixes to the core CHRE system, which
* distributes it to clients (nanoapps). These events are only delivered
* while a location session is active, i.e. locationStatusChangeCallback was
* previously invoked with enabled=true.
*
* This function call passes ownership of the event memory to the core CHRE
* system, i.e. the PAL module must not modify the referenced data until the
* associated API function is called to release the memory.
*
* @param event Event data to distribute to clients. The GNSS module
* must ensure that this memory remains accessible until it is passed
* to the releaseLocationEvent function in struct chrePalGnssApi.
*/
void (*locationEventCallback)(struct chreGnssLocationEvent *event);
/**
* Callback invoked to inform the CHRE of the result of changes to the raw
* GNSS measurement session status requested via controlMeasurementSession
* in struct chrePalGnssApi.
*
* Unsolicited calls to this function must not be made. See
* locationStatusChangeCallback() for more information.
*
* @param enabled true if the measurement session is currently active, false
* otherwise
* @param errorCode An error code from enum chreError
*/
void (*measurementStatusChangeCallback)(bool enabled, uint8_t errorCode);
/**
* Callback used to pass raw GNSS measurement data from the GNSS module to
* the core CHRE system, which distributes it to clients (nanoapps).
*
* This function call passes ownership of the event memory to the core CHRE
* system, i.e. the PAL module must not modify the referenced data until the
* associated API function is called to release the memory.
*
* @param event Event data to distribute to clients. The GNSS module
* must ensure that this memory remains accessible until it is passed
* to the releaseMeasurementDataEvent() function in struct
* chrePalGnssApi.
*/
void (*measurementEventCallback)(struct chreGnssDataEvent *event);
};
struct chrePalGnssApi {
/**
* Version of the module providing this API. This value should be
* constructed from CHRE_PAL_CREATE_MODULE_VERSION using the supported
* API version constant (CHRE_PAL_GNSS_API_*) and the module-specific patch
* version.
*/
uint32_t moduleVersion;
/**
* Initializes the GNSS module. Initialization must complete synchronously.
*
* @param systemApi Structure containing CHRE system function pointers which
* the PAL implementation should prefer to use over equivalent
* functionality exposed by the underlying platform. The module does
* not need to deep-copy this structure; its memory remains
* accessible at least until after close() is called.
* @param callbacks Structure containing entry points to the core CHRE
* system. The module does not need to deep-copy this structure; its
* memory remains accessible at least until after close() is called.
*
* @return true if initialization was successful, false otherwise
*/
bool (*open)(const struct chrePalSystemApi *systemApi,
const struct chrePalGnssCallbacks *callbacks);
/**
* Performs clean shutdown of the GNSS module, usually done in preparation
* for stopping the CHRE. The GNSS module must end any active sessions,
* ensure that it will not invoke any callbacks past this point, and
* complete any relevant teardown activities before returning from this
* function.
*/
void (*close)(void);
/**
* Retrieves information about the features supported by this module. The
* value returned from this function must not change for the duration of
* execution.
*
* @return See chreGnssGetCapabilities()
*
* @see chreGnssGetCapabilities()
*/
uint32_t (*getCapabilities)(void);
/**
* Start/stop/modify the GNSS location session used for clients of the CHRE
* API.
*
* @param enable true to start/modify the session, false to stop the
* session. If false, other parameters are ignored.
* @param minIntervalMs See chreGnssLocationSessionStartAsync()
* @param minTimeToNextFixMs See chreGnssLocationSessionStartAsync()
*
* @return true if the request was accepted for further processing, in which
* case its result will be indicated via a call to the location
* session status change callback
*
* @see chreGnssLocationSessionStartAsync()
* @see chreGnssLocationSessionStopAsync()
*/
bool (*controlLocationSession)(bool enable, uint32_t minIntervalMs,
uint32_t minTimeToNextFixMs);
/**
* Invoked when the core CHRE system no longer needs a location event
* structure that was provided to it via locationEventCallback(). The GNSS
* module may use this to free associated memory, etc.
*/
void (*releaseLocationEvent)(struct chreGnssLocationEvent *event);
/**
* Start/stop/modify the raw GNSS measurement session used for clients of
* the CHRE API.
*
* @param enable true to start/modify the session, false to stop the
* session. If false, other parameters are ignored.
* @param minIntervalMs See chreGnssMeasurementSessionStartAsync()
*
* @return true if the request was accepted for further processing, in which
* case its result will be indicated via a call to the measurement
* session status change callback.
*
* @see chreGnssMeasurementSessionStartAsync()
* @see chreGnssMeasurementSessionStopAsync()
*/
bool (*controlMeasurementSession)(bool enable, uint32_t minIntervalMs);
/**
* Invoked when the core CHRE system no longer needs a raw measurement event
* structure that was provided to it via measurementEventCallback(). The
* GNSS module may use this to free associated memory, etc.
*
* @param event Event data to release
*/
void (*releaseMeasurementDataEvent)(struct chreGnssDataEvent *event);
/**
* Configures whether locationEventCallback() is used to opportunistically
* deliver any location fixes produced for other clients of the GNSS
* engine. For example, when the passive location listener is enabled, the
* PAL implementation will deliver location fixes computed as a result of
* requests from the applications processor. Note that this only controls
* receipt of location fixes that CHRE would not otherwise receive - it must
* not result in duplication of location events from an active location
* session initiated by controlLocationSession().
*
* This feature is supported when the
* CHRE_GNSS_CAPABILITIES_GNSS_ENGINE_BASED_PASSIVE_LISTENER bit is returned
* in getCapabilities(). If not supported, this function must always return
* false.
*
* This configuration represents CHRE's interest in receiving all available
* GNSS fixes, independent of the state of CHRE's own location or
* measurement sessions as set by controlLocationSession() and
* controlMeasurementSession(), respectively. For example, toggling this
* setting on and off must not have any impact on the behavior of an ongoing
* location session.
*
* This setting must either persist across restarts of the GNSS engine, or
* the PAL must use the requestStateResync() callback to retrieve the
* current requested passive location listener state after the GNSS engine
* has recovered from a restart.
*
* @param enable true to turn the passive location listener on, false to
* turn it off
*
* @return true if the feature is supported and the request was received,
* false otherwise
*
* @since v1.2
*/
bool (*configurePassiveLocationListener)(bool enable);
};
/**
* Retrieve a handle for the CHRE GNSS PAL.
*
* @param requestedApiVersion The implementation of this function must return a
* pointer to a structure with the same major version as requested.
*
* @return Pointer to API handle, or NULL if a compatible API version is not
* supported by the module, or the API as a whole is not implemented. If
* non-NULL, the returned API handle must be valid as long as this
* module is loaded.
*/
const struct chrePalGnssApi *chrePalGnssGetApi(uint32_t requestedApiVersion);
#ifdef __cplusplus
}
#endif
#endif // CHRE_PAL_GNSS_H_