1951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
2951a39d68df598db08dfced8b4707755864a0492Ying Wang * Copyright (C) 2010 The Android Open Source Project
3951a39d68df598db08dfced8b4707755864a0492Ying Wang *
4951a39d68df598db08dfced8b4707755864a0492Ying Wang * Licensed under the Apache License, Version 2.0 (the "License");
5951a39d68df598db08dfced8b4707755864a0492Ying Wang * you may not use this file except in compliance with the License.
6951a39d68df598db08dfced8b4707755864a0492Ying Wang * You may obtain a copy of the License at
7951a39d68df598db08dfced8b4707755864a0492Ying Wang *
8951a39d68df598db08dfced8b4707755864a0492Ying Wang *      http://www.apache.org/licenses/LICENSE-2.0
9951a39d68df598db08dfced8b4707755864a0492Ying Wang *
10951a39d68df598db08dfced8b4707755864a0492Ying Wang * Unless required by applicable law or agreed to in writing, software
11951a39d68df598db08dfced8b4707755864a0492Ying Wang * distributed under the License is distributed on an "AS IS" BASIS,
12951a39d68df598db08dfced8b4707755864a0492Ying Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13951a39d68df598db08dfced8b4707755864a0492Ying Wang * See the License for the specific language governing permissions and
14951a39d68df598db08dfced8b4707755864a0492Ying Wang * limitations under the License.
15951a39d68df598db08dfced8b4707755864a0492Ying Wang */
16951a39d68df598db08dfced8b4707755864a0492Ying Wang
17951a39d68df598db08dfced8b4707755864a0492Ying Wang
18951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifndef ANDROID_SENSOR_H
19951a39d68df598db08dfced8b4707755864a0492Ying Wang#define ANDROID_SENSOR_H
20951a39d68df598db08dfced8b4707755864a0492Ying Wang
21951a39d68df598db08dfced8b4707755864a0492Ying Wang/******************************************************************
22951a39d68df598db08dfced8b4707755864a0492Ying Wang *
23951a39d68df598db08dfced8b4707755864a0492Ying Wang * IMPORTANT NOTICE:
24951a39d68df598db08dfced8b4707755864a0492Ying Wang *
25951a39d68df598db08dfced8b4707755864a0492Ying Wang *   This file is part of Android's set of stable system headers
26951a39d68df598db08dfced8b4707755864a0492Ying Wang *   exposed by the Android NDK (Native Development Kit).
27951a39d68df598db08dfced8b4707755864a0492Ying Wang *
28951a39d68df598db08dfced8b4707755864a0492Ying Wang *   Third-party source AND binary code relies on the definitions
29951a39d68df598db08dfced8b4707755864a0492Ying Wang *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
30951a39d68df598db08dfced8b4707755864a0492Ying Wang *
31951a39d68df598db08dfced8b4707755864a0492Ying Wang *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
32951a39d68df598db08dfced8b4707755864a0492Ying Wang *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
33951a39d68df598db08dfced8b4707755864a0492Ying Wang *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
34951a39d68df598db08dfced8b4707755864a0492Ying Wang *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
35951a39d68df598db08dfced8b4707755864a0492Ying Wang */
36951a39d68df598db08dfced8b4707755864a0492Ying Wang
37951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
38951a39d68df598db08dfced8b4707755864a0492Ying Wang * Structures and functions to receive and process sensor events in
39951a39d68df598db08dfced8b4707755864a0492Ying Wang * native code.
40951a39d68df598db08dfced8b4707755864a0492Ying Wang *
41951a39d68df598db08dfced8b4707755864a0492Ying Wang */
42951a39d68df598db08dfced8b4707755864a0492Ying Wang
43951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <sys/types.h>
44951a39d68df598db08dfced8b4707755864a0492Ying Wang
45951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <android/looper.h>
46951a39d68df598db08dfced8b4707755864a0492Ying Wang
47951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifdef __cplusplus
48951a39d68df598db08dfced8b4707755864a0492Ying Wangextern "C" {
49951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
50951a39d68df598db08dfced8b4707755864a0492Ying Wang
51951a39d68df598db08dfced8b4707755864a0492Ying Wang
52951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
53951a39d68df598db08dfced8b4707755864a0492Ying Wang * Sensor types
54951a39d68df598db08dfced8b4707755864a0492Ying Wang * (keep in sync with hardware/sensor.h)
55951a39d68df598db08dfced8b4707755864a0492Ying Wang */
56951a39d68df598db08dfced8b4707755864a0492Ying Wang
57951a39d68df598db08dfced8b4707755864a0492Ying Wangenum {
58951a39d68df598db08dfced8b4707755864a0492Ying Wang    ASENSOR_TYPE_ACCELEROMETER      = 1,
59951a39d68df598db08dfced8b4707755864a0492Ying Wang    ASENSOR_TYPE_MAGNETIC_FIELD     = 2,
60951a39d68df598db08dfced8b4707755864a0492Ying Wang    ASENSOR_TYPE_GYROSCOPE          = 4,
61951a39d68df598db08dfced8b4707755864a0492Ying Wang    ASENSOR_TYPE_LIGHT              = 5,
62951a39d68df598db08dfced8b4707755864a0492Ying Wang    ASENSOR_TYPE_PROXIMITY          = 8
63951a39d68df598db08dfced8b4707755864a0492Ying Wang};
64951a39d68df598db08dfced8b4707755864a0492Ying Wang
65951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
66951a39d68df598db08dfced8b4707755864a0492Ying Wang * Sensor accuracy measure
67951a39d68df598db08dfced8b4707755864a0492Ying Wang */
68951a39d68df598db08dfced8b4707755864a0492Ying Wangenum {
69951a39d68df598db08dfced8b4707755864a0492Ying Wang    ASENSOR_STATUS_UNRELIABLE       = 0,
70951a39d68df598db08dfced8b4707755864a0492Ying Wang    ASENSOR_STATUS_ACCURACY_LOW     = 1,
71951a39d68df598db08dfced8b4707755864a0492Ying Wang    ASENSOR_STATUS_ACCURACY_MEDIUM  = 2,
72951a39d68df598db08dfced8b4707755864a0492Ying Wang    ASENSOR_STATUS_ACCURACY_HIGH    = 3
73951a39d68df598db08dfced8b4707755864a0492Ying Wang};
74951a39d68df598db08dfced8b4707755864a0492Ying Wang
75951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
76951a39d68df598db08dfced8b4707755864a0492Ying Wang * A few useful constants
77951a39d68df598db08dfced8b4707755864a0492Ying Wang */
78951a39d68df598db08dfced8b4707755864a0492Ying Wang
79951a39d68df598db08dfced8b4707755864a0492Ying Wang/* Earth's gravity in m/s^2 */
80951a39d68df598db08dfced8b4707755864a0492Ying Wang#define ASENSOR_STANDARD_GRAVITY            (9.80665f)
81951a39d68df598db08dfced8b4707755864a0492Ying Wang/* Maximum magnetic field on Earth's surface in uT */
82951a39d68df598db08dfced8b4707755864a0492Ying Wang#define ASENSOR_MAGNETIC_FIELD_EARTH_MAX    (60.0f)
83951a39d68df598db08dfced8b4707755864a0492Ying Wang/* Minimum magnetic field on Earth's surface in uT*/
84951a39d68df598db08dfced8b4707755864a0492Ying Wang#define ASENSOR_MAGNETIC_FIELD_EARTH_MIN    (30.0f)
85951a39d68df598db08dfced8b4707755864a0492Ying Wang
86951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
87951a39d68df598db08dfced8b4707755864a0492Ying Wang * A sensor event.
88951a39d68df598db08dfced8b4707755864a0492Ying Wang */
89951a39d68df598db08dfced8b4707755864a0492Ying Wang
90951a39d68df598db08dfced8b4707755864a0492Ying Wang/* NOTE: Must match hardware/sensors.h */
91951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct ASensorVector {
92951a39d68df598db08dfced8b4707755864a0492Ying Wang    union {
93951a39d68df598db08dfced8b4707755864a0492Ying Wang        float v[3];
94951a39d68df598db08dfced8b4707755864a0492Ying Wang        struct {
95951a39d68df598db08dfced8b4707755864a0492Ying Wang            float x;
96951a39d68df598db08dfced8b4707755864a0492Ying Wang            float y;
97951a39d68df598db08dfced8b4707755864a0492Ying Wang            float z;
98951a39d68df598db08dfced8b4707755864a0492Ying Wang        };
99951a39d68df598db08dfced8b4707755864a0492Ying Wang        struct {
100951a39d68df598db08dfced8b4707755864a0492Ying Wang            float azimuth;
101951a39d68df598db08dfced8b4707755864a0492Ying Wang            float pitch;
102951a39d68df598db08dfced8b4707755864a0492Ying Wang            float roll;
103951a39d68df598db08dfced8b4707755864a0492Ying Wang        };
104951a39d68df598db08dfced8b4707755864a0492Ying Wang    };
105951a39d68df598db08dfced8b4707755864a0492Ying Wang    int8_t status;
106951a39d68df598db08dfced8b4707755864a0492Ying Wang    uint8_t reserved[3];
107951a39d68df598db08dfced8b4707755864a0492Ying Wang} ASensorVector;
108951a39d68df598db08dfced8b4707755864a0492Ying Wang
109951a39d68df598db08dfced8b4707755864a0492Ying Wang/* NOTE: Must match hardware/sensors.h */
110951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct ASensorEvent {
111951a39d68df598db08dfced8b4707755864a0492Ying Wang    int32_t version; /* sizeof(struct ASensorEvent) */
112951a39d68df598db08dfced8b4707755864a0492Ying Wang    int32_t sensor;
113951a39d68df598db08dfced8b4707755864a0492Ying Wang    int32_t type;
114951a39d68df598db08dfced8b4707755864a0492Ying Wang    int32_t reserved0;
115951a39d68df598db08dfced8b4707755864a0492Ying Wang    int64_t timestamp;
116951a39d68df598db08dfced8b4707755864a0492Ying Wang    union {
117951a39d68df598db08dfced8b4707755864a0492Ying Wang        float           data[16];
118951a39d68df598db08dfced8b4707755864a0492Ying Wang        ASensorVector   vector;
119951a39d68df598db08dfced8b4707755864a0492Ying Wang        ASensorVector   acceleration;
120951a39d68df598db08dfced8b4707755864a0492Ying Wang        ASensorVector   magnetic;
121951a39d68df598db08dfced8b4707755864a0492Ying Wang        float           temperature;
122951a39d68df598db08dfced8b4707755864a0492Ying Wang        float           distance;
123951a39d68df598db08dfced8b4707755864a0492Ying Wang        float           light;
124951a39d68df598db08dfced8b4707755864a0492Ying Wang        float           pressure;
125951a39d68df598db08dfced8b4707755864a0492Ying Wang    };
126951a39d68df598db08dfced8b4707755864a0492Ying Wang    int32_t reserved1[4];
127951a39d68df598db08dfced8b4707755864a0492Ying Wang} ASensorEvent;
128951a39d68df598db08dfced8b4707755864a0492Ying Wang
129951a39d68df598db08dfced8b4707755864a0492Ying Wang
130951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct ASensorManager;
131951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct ASensorManager ASensorManager;
132951a39d68df598db08dfced8b4707755864a0492Ying Wang
133951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct ASensorEventQueue;
134951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct ASensorEventQueue ASensorEventQueue;
135951a39d68df598db08dfced8b4707755864a0492Ying Wang
136951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct ASensor;
137951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct ASensor ASensor;
138951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef ASensor const* ASensorRef;
139951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef ASensorRef const* ASensorList;
140951a39d68df598db08dfced8b4707755864a0492Ying Wang
141951a39d68df598db08dfced8b4707755864a0492Ying Wang/*****************************************************************************/
142951a39d68df598db08dfced8b4707755864a0492Ying Wang
143951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
144951a39d68df598db08dfced8b4707755864a0492Ying Wang * Get a reference to the sensor manager. ASensorManager is a singleton.
145951a39d68df598db08dfced8b4707755864a0492Ying Wang *
146951a39d68df598db08dfced8b4707755864a0492Ying Wang * Example:
147951a39d68df598db08dfced8b4707755864a0492Ying Wang *
148951a39d68df598db08dfced8b4707755864a0492Ying Wang *     ASensorManager* sensorManager = ASensorManager_getInstance();
149951a39d68df598db08dfced8b4707755864a0492Ying Wang *
150951a39d68df598db08dfced8b4707755864a0492Ying Wang */
151951a39d68df598db08dfced8b4707755864a0492Ying WangASensorManager* ASensorManager_getInstance();
152951a39d68df598db08dfced8b4707755864a0492Ying Wang
153951a39d68df598db08dfced8b4707755864a0492Ying Wang
154951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
155951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns the list of available sensors.
156951a39d68df598db08dfced8b4707755864a0492Ying Wang */
157951a39d68df598db08dfced8b4707755864a0492Ying Wangint ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list);
158951a39d68df598db08dfced8b4707755864a0492Ying Wang
159951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
160951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns the default sensor for the given type, or NULL if no sensor
161951a39d68df598db08dfced8b4707755864a0492Ying Wang * of that type exist.
162951a39d68df598db08dfced8b4707755864a0492Ying Wang */
163951a39d68df598db08dfced8b4707755864a0492Ying WangASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type);
164951a39d68df598db08dfced8b4707755864a0492Ying Wang
165951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
166951a39d68df598db08dfced8b4707755864a0492Ying Wang * Creates a new sensor event queue and associate it with a looper.
167951a39d68df598db08dfced8b4707755864a0492Ying Wang */
168951a39d68df598db08dfced8b4707755864a0492Ying WangASensorEventQueue* ASensorManager_createEventQueue(ASensorManager* manager,
169951a39d68df598db08dfced8b4707755864a0492Ying Wang        ALooper* looper, int ident, ALooper_callbackFunc callback, void* data);
170951a39d68df598db08dfced8b4707755864a0492Ying Wang
171951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
172951a39d68df598db08dfced8b4707755864a0492Ying Wang * Destroys the event queue and free all resources associated to it.
173951a39d68df598db08dfced8b4707755864a0492Ying Wang */
174951a39d68df598db08dfced8b4707755864a0492Ying Wangint ASensorManager_destroyEventQueue(ASensorManager* manager, ASensorEventQueue* queue);
175951a39d68df598db08dfced8b4707755864a0492Ying Wang
176951a39d68df598db08dfced8b4707755864a0492Ying Wang
177951a39d68df598db08dfced8b4707755864a0492Ying Wang/*****************************************************************************/
178951a39d68df598db08dfced8b4707755864a0492Ying Wang
179951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
180951a39d68df598db08dfced8b4707755864a0492Ying Wang * Enable the selected sensor. Returns a negative error code on failure.
181951a39d68df598db08dfced8b4707755864a0492Ying Wang */
182951a39d68df598db08dfced8b4707755864a0492Ying Wangint ASensorEventQueue_enableSensor(ASensorEventQueue* queue, ASensor const* sensor);
183951a39d68df598db08dfced8b4707755864a0492Ying Wang
184951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
185951a39d68df598db08dfced8b4707755864a0492Ying Wang * Disable the selected sensor. Returns a negative error code on failure.
186951a39d68df598db08dfced8b4707755864a0492Ying Wang */
187951a39d68df598db08dfced8b4707755864a0492Ying Wangint ASensorEventQueue_disableSensor(ASensorEventQueue* queue, ASensor const* sensor);
188951a39d68df598db08dfced8b4707755864a0492Ying Wang
189951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
190951a39d68df598db08dfced8b4707755864a0492Ying Wang * Sets the delivery rate of events in microseconds for the given sensor.
191951a39d68df598db08dfced8b4707755864a0492Ying Wang * Note that this is a hint only, generally event will arrive at a higher
192951a39d68df598db08dfced8b4707755864a0492Ying Wang * rate. It is an error to set a rate inferior to the value returned by
193951a39d68df598db08dfced8b4707755864a0492Ying Wang * ASensor_getMinDelay().
194951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns a negative error code on failure.
195951a39d68df598db08dfced8b4707755864a0492Ying Wang */
196951a39d68df598db08dfced8b4707755864a0492Ying Wangint ASensorEventQueue_setEventRate(ASensorEventQueue* queue, ASensor const* sensor, int32_t usec);
197951a39d68df598db08dfced8b4707755864a0492Ying Wang
198951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
199951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns true if there are one or more events available in the
200951a39d68df598db08dfced8b4707755864a0492Ying Wang * sensor queue.  Returns 1 if the queue has events; 0 if
201951a39d68df598db08dfced8b4707755864a0492Ying Wang * it does not have events; and a negative value if there is an error.
202951a39d68df598db08dfced8b4707755864a0492Ying Wang */
203951a39d68df598db08dfced8b4707755864a0492Ying Wangint ASensorEventQueue_hasEvents(ASensorEventQueue* queue);
204951a39d68df598db08dfced8b4707755864a0492Ying Wang
205951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
206951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns the next available events from the queue.  Returns a negative
207951a39d68df598db08dfced8b4707755864a0492Ying Wang * value if no events are available or an error has occurred, otherwise
208951a39d68df598db08dfced8b4707755864a0492Ying Wang * the number of events returned.
209951a39d68df598db08dfced8b4707755864a0492Ying Wang *
210951a39d68df598db08dfced8b4707755864a0492Ying Wang * Examples:
211951a39d68df598db08dfced8b4707755864a0492Ying Wang *   ASensorEvent event;
212951a39d68df598db08dfced8b4707755864a0492Ying Wang *   ssize_t numEvent = ASensorEventQueue_getEvents(queue, &event, 1);
213951a39d68df598db08dfced8b4707755864a0492Ying Wang *
214951a39d68df598db08dfced8b4707755864a0492Ying Wang *   ASensorEvent eventBuffer[8];
215951a39d68df598db08dfced8b4707755864a0492Ying Wang *   ssize_t numEvent = ASensorEventQueue_getEvents(queue, eventBuffer, 8);
216951a39d68df598db08dfced8b4707755864a0492Ying Wang *
217951a39d68df598db08dfced8b4707755864a0492Ying Wang */
218951a39d68df598db08dfced8b4707755864a0492Ying Wangssize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue,
219951a39d68df598db08dfced8b4707755864a0492Ying Wang                ASensorEvent* events, size_t count);
220951a39d68df598db08dfced8b4707755864a0492Ying Wang
221951a39d68df598db08dfced8b4707755864a0492Ying Wang
222951a39d68df598db08dfced8b4707755864a0492Ying Wang/*****************************************************************************/
223951a39d68df598db08dfced8b4707755864a0492Ying Wang
224951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
225951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns this sensor's name (non localized)
226951a39d68df598db08dfced8b4707755864a0492Ying Wang */
227951a39d68df598db08dfced8b4707755864a0492Ying Wangconst char* ASensor_getName(ASensor const* sensor);
228951a39d68df598db08dfced8b4707755864a0492Ying Wang
229951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
230951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns this sensor's vendor's name (non localized)
231951a39d68df598db08dfced8b4707755864a0492Ying Wang */
232951a39d68df598db08dfced8b4707755864a0492Ying Wangconst char* ASensor_getVendor(ASensor const* sensor);
233951a39d68df598db08dfced8b4707755864a0492Ying Wang
234951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
235951a39d68df598db08dfced8b4707755864a0492Ying Wang * Return this sensor's type
236951a39d68df598db08dfced8b4707755864a0492Ying Wang */
237951a39d68df598db08dfced8b4707755864a0492Ying Wangint ASensor_getType(ASensor const* sensor);
238951a39d68df598db08dfced8b4707755864a0492Ying Wang
239951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
240951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns this sensors's resolution
241951a39d68df598db08dfced8b4707755864a0492Ying Wang */
242951a39d68df598db08dfced8b4707755864a0492Ying Wangfloat ASensor_getResolution(ASensor const* sensor);
243951a39d68df598db08dfced8b4707755864a0492Ying Wang
244951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
245951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns the minimum delay allowed between events in microseconds.
246951a39d68df598db08dfced8b4707755864a0492Ying Wang * A value of zero means that this sensor doesn't report events at a
247951a39d68df598db08dfced8b4707755864a0492Ying Wang * constant rate, but rather only when a new data is available.
248951a39d68df598db08dfced8b4707755864a0492Ying Wang */
249951a39d68df598db08dfced8b4707755864a0492Ying Wangint ASensor_getMinDelay(ASensor const* sensor);
250951a39d68df598db08dfced8b4707755864a0492Ying Wang
251951a39d68df598db08dfced8b4707755864a0492Ying Wang
252951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifdef __cplusplus
253951a39d68df598db08dfced8b4707755864a0492Ying Wang};
254951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
255951a39d68df598db08dfced8b4707755864a0492Ying Wang
256951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif // ANDROID_SENSOR_H
257