/*
 * 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_H_
#define _CHRE_H_

/**
 * @file
 * This header file includes all the headers which combine to fully define the
 * interface for the Context Hub Runtime Environment (CHRE).  This interface is
 * of interest to both implementers of CHREs and authors of nanoapps.  The API
 * documentation attempts to address concerns of both.
 *
 * See individual header files for API details, and general comments below
 * for overall platform information.
 */

#include <chre/audio.h>
#include <chre/ble.h>
#include <chre/common.h>
#include <chre/event.h>
#include <chre/gnss.h>
#include <chre/nanoapp.h>
#include <chre/re.h>
#include <chre/sensor.h>
#include <chre/toolchain.h>
#include <chre/user_settings.h>
#include <chre/version.h>
#include <chre/wifi.h>
#include <chre/wwan.h>

/**
 * @mainpage
 * CHRE is the Context Hub Runtime Environment.  CHRE is used in Android to run
 * contextual applications, called nanoapps, in a low-power processing domain
 * other than the applications processor that runs Android itself.  The CHRE
 * API, documented herein, is the common interface exposed to nanoapps for any
 * compatible CHRE implementation.  The CHRE API provides the ability for
 * creating nanoapps that are code-compatible across different CHRE
 * implementations and underlying platforms. Refer to the following sections for
 * a discussion on some important details of CHRE that aren't explicitly exposed
 * in the API itself.
 *
 * @section entry_points Entry points
 *
 * The following entry points are used to bind a nanoapp to the CHRE system, and
 * all three must be implemented by any nanoapp (see chre/nanoapp.h):
 * - nanoappStart: initialization
 * - nanoappHandleEvent: hook for event-driven processing
 * - nanoappEnd: graceful teardown
 *
 * The CHRE implementation must also ensure that it performs these functions
 * prior to invoking nanoappStart, or after nanoappEnd returns:
 * - bss section zeroed out (prior to nanoappStart)
 * - static variables initialized (prior to nanoappStart)
 * - global C++ constructors called (prior to nanoappStart)
 * - global C++ destructors called (after nanoappEnd)
 *
 * @section threading Threading model
 *
 * A CHRE implementation is free to choose among many different
 * threading models, including a single-threaded system or a multi-threaded
 * system with preemption.  The current platform definition is agnostic to this
 * underlying choice.  However, the CHRE implementation must ensure that time
 * spent executing within a nanoapp does not significantly degrade or otherwise
 * interfere with other functions of the system in which CHRE is implemented,
 * especially latency-sensitive tasks such as sensor event delivery to the AP.
 * In other words, it must ensure that these functions can either occur in
 * parallel or preempt a nanoapp's execution.  The current version of the API
 * does not specify whether the implementation allows for CPU sharing between
 * nanoapps on a more granular level than the handling of individual events [1].
 * In any case, event ordering from the perspective of an individual nanoapp
 * must be FIFO, but the CHRE implementation may choose to violate total
 * ordering of events across all nanoapps to achieve more fair resource sharing,
 * but this is not required.
 *
 * This version of the CHRE API does require that all nanoapps are treated as
 * non-reentrant, meaning that only one instance of program flow can be inside
 * an individual nanoapp at any given time.  That is, any of the functions of
 * the nanoapp, including the entry points and all other callbacks, cannot be
 * invoked if a previous invocation to the same or any other function in the
 * nanoapp has not completed yet.
 *
 * For example, if a nanoapp is currently in nanoappHandleEvent(), the CHRE is
 * not allowed to call nanoappHandleEvent() again, or to call a memory freeing
 * callback.  Similarly, if a nanoapp is currently in a memory freeing
 * callback, the CHRE is not allowed to call nanoappHandleEvent(), or invoke
 * another memory freeing callback.
 *
 * There are two exceptions to this rule: If an invocation of chreSendEvent()
 * fails (returns 'false'), it is allowed to immediately invoke the memory
 * freeing callback passed into that function.  This is a rare case, and one
 * where otherwise a CHRE implementation is likely to leak memory. Similarly,
 * chreSendMessageToHost() is allowed to invoke the memory freeing callback
 * directly, whether it returns 'true' or 'false'.  This is because the CHRE
 * implementation may copy the message data to its own buffer, and therefore
 * wouldn't need the nanoapp-supplied buffer after chreSendMessageToHost()
 * returns.
 *
 * For a nanoapp author, this means no thought needs to be given to
 * synchronization issues with global objects, as they will, by definition,
 * only be accessed by a single thread at once.
 *
 * [1]: Note to CHRE implementers: A future version of the CHRE platform may
 * require multi-threading with preemption.  This is mentioned as a heads up,
 * and to allow implementors deciding between implementation approaches to
 * make the most informed choice.
 *
 * @section timing Timing
 *
 * Nanoapps should expect to be running on a highly constrained system, with
 * little memory and little CPU.  Any single nanoapp should expect to
 * be one of several nanoapps on the system, which also share the CPU with the
 * CHRE and possibly other services as well.
 *
 * Thus, a nanoapp needs to be efficient in its memory and CPU usage.
 * Also, as noted in the Threading Model section, a CHRE implementation may
 * be single threaded.  As a result, all methods invoked in a nanoapp
 * (like nanoappStart, nanoappHandleEvent, memory free callbacks, etc.)
 * must run "quickly".  "Quickly" is difficult to define, as there is a
 * diversity of Context Hub hardware.  Nanoapp authors are strongly recommended
 * to limit their application to consuming no more than 1 second of CPU time
 * prior to returning control to the CHRE implementation.  A CHRE implementation
 * may consider a nanoapp as unresponsive if it spends more time than this to
 * process a single event, and take corrective action.
 *
 * A nanoapp may have the need to occasionally perform a large block of
 * calculations that exceeds the 1 second guidance.  The recommended approach in
 * this case is to split up the large block of calculations into smaller
 * batches.  In one call into the nanoapp, the nanoapp can perform the first
 * batch, and then set a timer or send an event (chreSendEvent()) to itself
 * indicating which batch should be done next. This will allow the nanoapp to
 * perform the entire calculation over time, without monopolizing system
 * resources.
 *
 * @section floats Floating point support
 *
 * The C type 'float' is used in this API, and thus a CHRE implementation
 * is required to support 'float's.
 *
 * Support of the C types 'double' and 'long double' is optional for a
 * CHRE implementation.  Note that if a CHRE decides to support them, unlike
 * 'float' support, there is no requirement that this support is particularly
 * efficient.  So nanoapp authors should be aware this may be inefficient.
 *
 * If a CHRE implementation chooses not to support 'double' or
 * 'long double', then the build toolchain setup provided needs to set
 * the preprocessor define CHRE_NO_DOUBLE_SUPPORT.
 *
 * @section compat CHRE and Nanoapp compatibility
 *
 * CHRE implementations must make affordances to maintain binary compatibility
 * across minor revisions of the API version (e.g. v1.1 to v1.2).  This applies
 * to both running a nanoapp compiled for a newer version of the API on a CHRE
 * implementation built against an older version (backwards compatibility), and
 * vice versa (forwards compatibility).  API changes that are acceptable in
 * minor version changes that may require special measures to ensure binary
 * compatibility include: addition of new functions; addition of arguments to
 * existing functions when the default value used for nanoapps compiled against
 * the old version is well-defined and does not affect existing functionality;
 * and addition of fields to existing structures, even when this induces a
 * binary layout change (this should be made rare via judicious use of reserved
 * fields).  API changes that must only occur alongside a major version change
 * and are therefore not compatible include: removal of any function, argument,
 * field in a data structure, or mandatory functional behavior that a nanoapp
 * may depend on; any change in the interpretation of an existing data structure
 * field that alters the way it was defined previously (changing the units of a
 * field would fall under this, but appropriating a previously reserved field
 * for some new functionality would not); and any change in functionality or
 * expected behavior that conflicts with the previous definition.
 *
 * Note that the CHRE API only specifies the software interface between a
 * nanoapp and the CHRE system - the binary interface (ABI) between nanoapp and
 * CHRE is necessarily implementation-dependent.  Therefore, the recommended
 * approach to accomplish binary compatibility is to build a Nanoapp Support
 * Library (NSL) that is specific to the CHRE implementation into the nanoapp
 * binary, and use it to handle ABI details in a way that ensures compatibility.
 * In addition, to accomplish forwards compatibility, the CHRE implementation is
 * expected to recognize the CHRE API version that a nanoapp is targeting and
 * engage compatibility behaviors where necessary.
 *
 * By definition, major API version changes (e.g. v1.1 to v2.0) break
 * compatibility.  Therefore, a CHRE implementation must not attempt to load a
 * nanoapp that is targeting a newer major API version.
 */

#endif  /* _CHRE_H_ */

