1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef _CHRE_COMMON_H_ 18 #define _CHRE_COMMON_H_ 19 20 /** 21 * @file 22 * Definitions shared across multiple CHRE header files 23 */ 24 25 #include <stdbool.h> 26 #include <stdint.h> 27 28 #ifdef __cplusplus 29 extern "C" { 30 #endif 31 32 /** 33 * Mask of the 5 most significant bytes in a 64-bit nanoapp or CHRE platform 34 * identifier, which represents the vendor ID portion of the ID. 35 */ 36 #define CHRE_VENDOR_ID_MASK UINT64_C(0xFFFFFFFFFF000000) 37 38 /** 39 * Vendor ID "Googl". Used in nanoapp IDs and CHRE platform IDs developed and 40 * released by Google. 41 */ 42 #define CHRE_VENDOR_ID_GOOGLE UINT64_C(0x476F6F676C000000) 43 44 /** 45 * Vendor ID "GoogT". Used for nanoapp IDs associated with testing done by 46 * Google. 47 */ 48 #define CHRE_VENDOR_ID_GOOGLE_TEST UINT64_C(0x476F6F6754000000) 49 50 /** 51 * Helper macro to mask off all bytes other than the vendor ID (most significant 52 * 5 bytes) in 64-bit nanoapp and CHRE platform identifiers. 53 * 54 * @see chreGetNanoappInfo() 55 * @see chreGetPlatformId() 56 */ 57 #define CHRE_EXTRACT_VENDOR_ID(id) ((id) & CHRE_VENDOR_ID_MASK) 58 59 /** 60 * Number of nanoseconds in one second, represented as an unsigned 64-bit 61 * integer 62 */ 63 #define CHRE_NSEC_PER_SEC UINT64_C(1000000000) 64 65 /** 66 * General timeout for asynchronous API requests. Unless specified otherwise, a 67 * function call that returns data asynchronously via an event, such as 68 * CHRE_EVENT_ASYNC_GNSS_RESULT, must do so within this amount of time. 69 */ 70 #define CHRE_ASYNC_RESULT_TIMEOUT_NS (5 * CHRE_NSEC_PER_SEC) 71 72 73 /** 74 * A generic listing of error codes for use in {@link #chreAsyncResult} and 75 * elsewhere. In general, module-specific error codes may be added to this enum, 76 * but effort should be made to come up with a generic name that still captures 77 * the meaning of the error. 78 */ 79 enum chreError { 80 //! No error occurred 81 CHRE_ERROR_NONE = 0, 82 83 //! An unspecified failure occurred 84 CHRE_ERROR = 1, 85 86 //! One or more supplied arguments are invalid 87 CHRE_ERROR_INVALID_ARGUMENT = 2, 88 89 //! Unable to satisfy request because the system is busy 90 CHRE_ERROR_BUSY = 3, 91 92 //! Unable to allocate memory 93 CHRE_ERROR_NO_MEMORY = 4, 94 95 //! The requested feature is not supported 96 CHRE_ERROR_NOT_SUPPORTED = 5, 97 98 //! A timeout occurred while processing the request 99 CHRE_ERROR_TIMEOUT = 6, 100 101 //! The relevant capability is disabled, for example due to a user 102 //! configuration that takes precedence over this request 103 CHRE_ERROR_FUNCTION_DISABLED = 7, 104 105 //! The request was rejected due to internal rate limiting of the requested 106 //! functionality - the client may try its request again after waiting an 107 //! unspecified amount of time 108 CHRE_ERROR_REJECTED_RATE_LIMIT = 8, 109 110 //! The requested functionality is not currently accessible from the CHRE, 111 //! because another master, such as the main applications processor, is 112 //! currently controlling it. 113 CHRE_ERROR_FUNCTION_RESTRICTED_TO_OTHER_MASTER = 9, 114 115 //!< Do not exceed this value when adding new error codes 116 CHRE_ERROR_LAST = UINT8_MAX, 117 }; 118 119 /** 120 * Generic data structure to indicate the result of an asynchronous operation. 121 * 122 * @note 123 * The general model followed by CHRE for asynchronous operations is that a 124 * request function returns a boolean value that indicates whether the request 125 * was accepted for further processing. The actual result of the operation is 126 * provided in a subsequent event sent with an event type that is defined in the 127 * specific API. Typically, a "cookie" parameter is supplied to allow the client 128 * to tie the response to a specific request, or pass data through, etc. The 129 * response is expected to be delivered within CHRE_ASYNC_RESULT_TIMEOUT_NS if 130 * not specified otherwise. 131 * 132 * The CHRE implementation must allow for multiple asynchronous requests to be 133 * outstanding at a given time, under reasonable resource constraints. Further, 134 * requests must be processed in the same order as supplied by the client of the 135 * API in order to maintain causality. Using GNSS as an example, if a client 136 * calls chreGnssLocationSessionStartAsync() and then immediately calls 137 * chreGnssLocationSessionStopAsync(), the final result must be that the 138 * location session is stopped. Whether requests always complete in the 139 * order that they are given is implementation-defined. For example, if a client 140 * calls chreGnssLocationSessionStart() and then immediately calls 141 * chreGnssMeasurementSessionStart(), it is possible for the 142 * CHRE_EVENT_GNSS_RESULT associated with the measurement session to be 143 * delivered before the one for the location session. 144 */ 145 struct chreAsyncResult { 146 //! Indicates the request associated with this result. The interpretation of 147 //! values in this field is dependent upon the event type provided when this 148 //! result was delivered. 149 uint8_t requestType; 150 151 //! Set to true if the request was successfully processed 152 bool success; 153 154 //! If the request failed (success is false), this is set to a value from 155 //! enum chreError (other than CHRE_ERROR_NONE), which may provide 156 //! additional information about the nature of the failure. 157 //! @see #chreError 158 uint8_t errorCode; 159 160 //! Reserved for future use, set to 0 161 uint8_t reserved; 162 163 //! Set to the cookie parameter given to the request function tied to this 164 //! result 165 const void *cookie; 166 }; 167 168 169 #ifdef __cplusplus 170 } 171 #endif 172 173 #endif /* _CHRE_COMMON_H_ */ 174