• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 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 
18 #ifndef ANDROID_SENSOR_H
19 #define ANDROID_SENSOR_H
20 
21 /******************************************************************
22  *
23  * IMPORTANT NOTICE:
24  *
25  *   This file is part of Android's set of stable system headers
26  *   exposed by the Android NDK (Native Development Kit).
27  *
28  *   Third-party source AND binary code relies on the definitions
29  *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
30  *
31  *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
32  *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
33  *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
34  *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
35  */
36 
37 /*
38  * Structures and functions to receive and process sensor events in
39  * native code.
40  *
41  */
42 
43 #include <sys/types.h>
44 
45 #include <android/looper.h>
46 
47 #ifdef __cplusplus
48 extern "C" {
49 #endif
50 
51 
52 /*
53  * Sensor types
54  * (keep in sync with hardware/sensor.h)
55  */
56 
57 enum {
58     ASENSOR_TYPE_ACCELEROMETER      = 1,
59     ASENSOR_TYPE_MAGNETIC_FIELD     = 2,
60     ASENSOR_TYPE_GYROSCOPE          = 4,
61     ASENSOR_TYPE_LIGHT              = 5,
62     ASENSOR_TYPE_PROXIMITY          = 8
63 };
64 
65 /*
66  * Sensor accuracy measure
67  */
68 enum {
69     ASENSOR_STATUS_UNRELIABLE       = 0,
70     ASENSOR_STATUS_ACCURACY_LOW     = 1,
71     ASENSOR_STATUS_ACCURACY_MEDIUM  = 2,
72     ASENSOR_STATUS_ACCURACY_HIGH    = 3
73 };
74 
75 /*
76  * A few useful constants
77  */
78 
79 /* Earth's gravity in m/s^2 */
80 #define ASENSOR_STANDARD_GRAVITY            (9.80665f)
81 /* Maximum magnetic field on Earth's surface in uT */
82 #define ASENSOR_MAGNETIC_FIELD_EARTH_MAX    (60.0f)
83 /* Minimum magnetic field on Earth's surface in uT*/
84 #define ASENSOR_MAGNETIC_FIELD_EARTH_MIN    (30.0f)
85 
86 /*
87  * A sensor event.
88  */
89 
90 /* NOTE: Must match hardware/sensors.h */
91 typedef struct ASensorVector {
92     union {
93         float v[3];
94         struct {
95             float x;
96             float y;
97             float z;
98         };
99         struct {
100             float azimuth;
101             float pitch;
102             float roll;
103         };
104     };
105     int8_t status;
106     uint8_t reserved[3];
107 } ASensorVector;
108 
109 /* NOTE: Must match hardware/sensors.h */
110 typedef struct ASensorEvent {
111     int32_t version; /* sizeof(struct ASensorEvent) */
112     int32_t sensor;
113     int32_t type;
114     int32_t reserved0;
115     int64_t timestamp;
116     union {
117         float           data[16];
118         ASensorVector   vector;
119         ASensorVector   acceleration;
120         ASensorVector   magnetic;
121         float           temperature;
122         float           distance;
123         float           light;
124         float           pressure;
125     };
126     int32_t reserved1[4];
127 } ASensorEvent;
128 
129 
130 struct ASensorManager;
131 typedef struct ASensorManager ASensorManager;
132 
133 struct ASensorEventQueue;
134 typedef struct ASensorEventQueue ASensorEventQueue;
135 
136 struct ASensor;
137 typedef struct ASensor ASensor;
138 typedef ASensor const* ASensorRef;
139 typedef ASensorRef const* ASensorList;
140 
141 /*****************************************************************************/
142 
143 /*
144  * Get a reference to the sensor manager. ASensorManager is a singleton.
145  *
146  * Example:
147  *
148  *     ASensorManager* sensorManager = ASensorManager_getInstance();
149  *
150  */
151 ASensorManager* ASensorManager_getInstance();
152 
153 
154 /*
155  * Returns the list of available sensors.
156  */
157 int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list);
158 
159 /*
160  * Returns the default sensor for the given type, or NULL if no sensor
161  * of that type exist.
162  */
163 ASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type);
164 
165 /*
166  * Creates a new sensor event queue and associate it with a looper.
167  */
168 ASensorEventQueue* ASensorManager_createEventQueue(ASensorManager* manager,
169         ALooper* looper, int ident, ALooper_callbackFunc callback, void* data);
170 
171 /*
172  * Destroys the event queue and free all resources associated to it.
173  */
174 int ASensorManager_destroyEventQueue(ASensorManager* manager, ASensorEventQueue* queue);
175 
176 
177 /*****************************************************************************/
178 
179 /*
180  * Enable the selected sensor. Returns a negative error code on failure.
181  */
182 int ASensorEventQueue_enableSensor(ASensorEventQueue* queue, ASensor const* sensor);
183 
184 /*
185  * Disable the selected sensor. Returns a negative error code on failure.
186  */
187 int ASensorEventQueue_disableSensor(ASensorEventQueue* queue, ASensor const* sensor);
188 
189 /*
190  * Sets the delivery rate of events in microseconds for the given sensor.
191  * Note that this is a hint only, generally event will arrive at a higher
192  * rate. It is an error to set a rate inferior to the value returned by
193  * ASensor_getMinDelay().
194  * Returns a negative error code on failure.
195  */
196 int ASensorEventQueue_setEventRate(ASensorEventQueue* queue, ASensor const* sensor, int32_t usec);
197 
198 /*
199  * Returns true if there are one or more events available in the
200  * sensor queue.  Returns 1 if the queue has events; 0 if
201  * it does not have events; and a negative value if there is an error.
202  */
203 int ASensorEventQueue_hasEvents(ASensorEventQueue* queue);
204 
205 /*
206  * Returns the next available events from the queue.  Returns a negative
207  * value if no events are available or an error has occurred, otherwise
208  * the number of events returned.
209  *
210  * Examples:
211  *   ASensorEvent event;
212  *   ssize_t numEvent = ASensorEventQueue_getEvents(queue, &event, 1);
213  *
214  *   ASensorEvent eventBuffer[8];
215  *   ssize_t numEvent = ASensorEventQueue_getEvents(queue, eventBuffer, 8);
216  *
217  */
218 ssize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue,
219                 ASensorEvent* events, size_t count);
220 
221 
222 /*****************************************************************************/
223 
224 /*
225  * Returns this sensor's name (non localized)
226  */
227 const char* ASensor_getName(ASensor const* sensor);
228 
229 /*
230  * Returns this sensor's vendor's name (non localized)
231  */
232 const char* ASensor_getVendor(ASensor const* sensor);
233 
234 /*
235  * Return this sensor's type
236  */
237 int ASensor_getType(ASensor const* sensor);
238 
239 /*
240  * Returns this sensors's resolution
241  */
242 float ASensor_getResolution(ASensor const* sensor) __NDK_FPABI__;
243 
244 /*
245  * Returns the minimum delay allowed between events in microseconds.
246  * A value of zero means that this sensor doesn't report events at a
247  * constant rate, but rather only when a new data is available.
248  */
249 int ASensor_getMinDelay(ASensor const* sensor);
250 
251 
252 #ifdef __cplusplus
253 };
254 #endif
255 
256 #endif // ANDROID_SENSOR_H
257