1f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/*
2f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
4f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * you may not use this file except in compliance with the License.
6f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * You may obtain a copy of the License at
7f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
8f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
10f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * See the License for the specific language governing permissions and
14f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * limitations under the License.
15f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
16f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
17f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#ifndef ANDROID_SENSORS_INTERFACE_H
18f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define ANDROID_SENSORS_INTERFACE_H
19f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
20f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#include <stdint.h>
21f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#include <sys/cdefs.h>
22f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#include <sys/types.h>
23f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
24f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#include <hardware/hardware.h>
2521b652f933b21aa37bd73364b486347fcc333d5cMike Lockwood#include <cutils/native_handle.h>
26f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
27f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project__BEGIN_DECLS
28f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
29f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
30f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * The id of this module
31f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
32f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define SENSORS_HARDWARE_MODULE_ID "sensors"
33f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
34f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
35f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Name of the sensors device to open
36f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
37b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian#define SENSORS_HARDWARE_POLL       "poll"
38f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
39f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
40f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Handles must be higher than SENSORS_HANDLE_BASE and must be unique.
41f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * A Handle identifies a given sensors. The handle is used to activate
42f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * and/or deactivate sensors.
43f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * In this version of the API there can only be 256 handles.
44f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
45f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define SENSORS_HANDLE_BASE             0
46f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define SENSORS_HANDLE_BITS             8
47f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define SENSORS_HANDLE_COUNT            (1<<SENSORS_HANDLE_BITS)
48f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
49f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
50f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
51f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Sensor types
52f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
53f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define SENSOR_TYPE_ACCELEROMETER       1
54f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define SENSOR_TYPE_MAGNETIC_FIELD      2
55f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define SENSOR_TYPE_ORIENTATION         3
56f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define SENSOR_TYPE_GYROSCOPE           4
57f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define SENSOR_TYPE_LIGHT               5
58f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define SENSOR_TYPE_PRESSURE            6
5954f9dd032dfbd336ca90e3b44047373f0297c3a5Mathias Agopian#define SENSOR_TYPE_TEMPERATURE         7   // deprecated
60f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define SENSOR_TYPE_PROXIMITY           8
61b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell#define SENSOR_TYPE_GRAVITY             9
62b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell#define SENSOR_TYPE_LINEAR_ACCELERATION 10
63b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell#define SENSOR_TYPE_ROTATION_VECTOR     11
64d2ed15a6b81a9a2fd95c1a565f72796869545115Urs Fleisch#define SENSOR_TYPE_RELATIVE_HUMIDITY   12
6554f9dd032dfbd336ca90e3b44047373f0297c3a5Mathias Agopian#define SENSOR_TYPE_AMBIENT_TEMPERATURE 13
66f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
67f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
68f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Values returned by the accelerometer in various locations in the universe.
69f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * all values are in SI units (m/s^2)
70f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
71f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
72f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define GRAVITY_SUN             (275.0f)
73f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define GRAVITY_EARTH           (9.80665f)
74f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
75f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/** Maximum magnetic field on Earth's surface */
76f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define MAGNETIC_FIELD_EARTH_MAX    (60.0f)
77f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
78f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/** Minimum magnetic field on Earth's surface */
79f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define MAGNETIC_FIELD_EARTH_MIN    (30.0f)
80f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
81f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
82f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
83f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * status of each sensor
84f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
85f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
86f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define SENSOR_STATUS_UNRELIABLE        0
87f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define SENSOR_STATUS_ACCURACY_LOW      1
88f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define SENSOR_STATUS_ACCURACY_MEDIUM   2
89f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define SENSOR_STATUS_ACCURACY_HIGH     3
90f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
91f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
92f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Definition of the axis
93f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * ----------------------
94f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
95f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * This API is relative to the screen of the device in its default orientation,
96f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * that is, if the device can be used in portrait or landscape, this API
97f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * is only relative to the NATURAL orientation of the screen. In other words,
98f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * the axis are not swapped when the device's screen orientation changes.
99f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Higher level services /may/ perform this transformation.
100f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
101f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *   x<0         x>0
102f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *                ^
103f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *                |
104f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    +-----------+-->  y>0
105f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    |           |
106f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    |           |
107f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    |           |
108f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    |           |   / z<0
109f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    |           |  /
110f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    |           | /
111f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    O-----------+/
112f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    |[]  [ ]  []/
113f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    +----------/+     y<0
114f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *              /
115f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *             /
116f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *           |/ z>0 (toward the sky)
117f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
118f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    O: Origin (x=0,y=0,z=0)
119f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
120f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
121e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * SENSOR_TYPE_ORIENTATION
122e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * -----------------------
123f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
124f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * All values are angles in degrees.
125f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
12666a4095ca0ecfe89b10abe5402617450f57759cdMathias Agopian * Orientation sensors return sensor events for all 3 axes at a constant
12766a4095ca0ecfe89b10abe5402617450f57759cdMathias Agopian * rate defined by setDelay().
12866a4095ca0ecfe89b10abe5402617450f57759cdMathias Agopian *
129f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * azimuth: angle between the magnetic north direction and the Y axis, around
130f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *  the Z axis (0<=azimuth<360).
131f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *      0=North, 90=East, 180=South, 270=West
132f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
133f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * pitch: Rotation around X axis (-180<=pitch<=180), with positive values when
134f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *  the z-axis moves toward the y-axis.
135f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
136f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * roll: Rotation around Y axis (-90<=roll<=90), with positive values when
13719ea59f86521c1b3ef72999e3cccc47b48c445adMathias Agopian *  the x-axis moves towards the z-axis.
13819ea59f86521c1b3ef72999e3cccc47b48c445adMathias Agopian *
13919ea59f86521c1b3ef72999e3cccc47b48c445adMathias Agopian * Note: For historical reasons the roll angle is positive in the clockwise
14019ea59f86521c1b3ef72999e3cccc47b48c445adMathias Agopian *  direction (mathematically speaking, it should be positive in the
14119ea59f86521c1b3ef72999e3cccc47b48c445adMathias Agopian *  counter-clockwise direction):
14219ea59f86521c1b3ef72999e3cccc47b48c445adMathias Agopian *
14319ea59f86521c1b3ef72999e3cccc47b48c445adMathias Agopian *                Z
14419ea59f86521c1b3ef72999e3cccc47b48c445adMathias Agopian *                ^
14519ea59f86521c1b3ef72999e3cccc47b48c445adMathias Agopian *  (+roll)  .--> |
14619ea59f86521c1b3ef72999e3cccc47b48c445adMathias Agopian *          /     |
14719ea59f86521c1b3ef72999e3cccc47b48c445adMathias Agopian *         |      |  roll: rotation around Y axis
14819ea59f86521c1b3ef72999e3cccc47b48c445adMathias Agopian *     X <-------(.)
14919ea59f86521c1b3ef72999e3cccc47b48c445adMathias Agopian *                 Y
15019ea59f86521c1b3ef72999e3cccc47b48c445adMathias Agopian *       note that +Y == -roll
15119ea59f86521c1b3ef72999e3cccc47b48c445adMathias Agopian *
15219ea59f86521c1b3ef72999e3cccc47b48c445adMathias Agopian *
15319ea59f86521c1b3ef72999e3cccc47b48c445adMathias Agopian *
154f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Note: This definition is different from yaw, pitch and roll used in aviation
155f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *  where the X axis is along the long side of the plane (tail to nose).
156f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
157f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
158e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * SENSOR_TYPE_ACCELEROMETER
159e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * -------------------------
160f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
161f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *  All values are in SI units (m/s^2) and measure the acceleration of the
162f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *  device minus the force of gravity.
163f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
16466a4095ca0ecfe89b10abe5402617450f57759cdMathias Agopian *  Acceleration sensors return sensor events for all 3 axes at a constant
16566a4095ca0ecfe89b10abe5402617450f57759cdMathias Agopian *  rate defined by setDelay().
16666a4095ca0ecfe89b10abe5402617450f57759cdMathias Agopian *
167f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *  x: Acceleration minus Gx on the x-axis
168f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *  y: Acceleration minus Gy on the y-axis
169f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *  z: Acceleration minus Gz on the z-axis
170f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
171f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *  Examples:
172f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    When the device lies flat on a table and is pushed on its left side
173f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    toward the right, the x acceleration value is positive.
174f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
175f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    When the device lies flat on a table, the acceleration value is +9.81,
176f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    which correspond to the acceleration of the device (0 m/s^2) minus the
177f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    force of gravity (-9.81 m/s^2).
178f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
179f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    When the device lies flat on a table and is pushed toward the sky, the
180f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    acceleration value is greater than +9.81, which correspond to the
181f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    acceleration of the device (+A m/s^2) minus the force of
182f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *    gravity (-9.81 m/s^2).
183f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
184f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
185e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * SENSOR_TYPE_MAGNETIC_FIELD
186e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * --------------------------
187f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
188f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *  All values are in micro-Tesla (uT) and measure the ambient magnetic
189f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *  field in the X, Y and Z axis.
190a2414316075dde4ca5c1393c662f224b36dd3fdcMike Lockwood *
19166a4095ca0ecfe89b10abe5402617450f57759cdMathias Agopian *  Magnetic Field sensors return sensor events for all 3 axes at a constant
19266a4095ca0ecfe89b10abe5402617450f57759cdMathias Agopian *  rate defined by setDelay().
19366a4095ca0ecfe89b10abe5402617450f57759cdMathias Agopian *
194e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * SENSOR_TYPE_GYROSCOPE
195e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * ---------------------
196e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian *
197b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell *  All values are in radians/second and measure the rate of rotation
198b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell *  around the X, Y and Z axis.  The coordinate system is the same as is
199c04e5f68905127ae4c1a0c17d225db9cebe66a07Mathias Agopian *  used for the acceleration sensor. Rotation is positive in the
200c04e5f68905127ae4c1a0c17d225db9cebe66a07Mathias Agopian *  counter-clockwise direction (right-hand rule). That is, an observer
201c04e5f68905127ae4c1a0c17d225db9cebe66a07Mathias Agopian *  looking from some positive location on the x, y or z axis at a device
202c04e5f68905127ae4c1a0c17d225db9cebe66a07Mathias Agopian *  positioned on the origin would report positive rotation if the device
203c04e5f68905127ae4c1a0c17d225db9cebe66a07Mathias Agopian *  appeared to be rotating counter clockwise. Note that this is the
204c04e5f68905127ae4c1a0c17d225db9cebe66a07Mathias Agopian *  standard mathematical definition of positive rotation and does not agree
205c04e5f68905127ae4c1a0c17d225db9cebe66a07Mathias Agopian *  with the definition of roll given earlier.
206c04e5f68905127ae4c1a0c17d225db9cebe66a07Mathias Agopian *  The range should at least be 17.45 rad/s (ie: ~1000 deg/s).
207b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell *
208e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * SENSOR_TYPE_PROXIMITY
209e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * ----------------------
210a2414316075dde4ca5c1393c662f224b36dd3fdcMike Lockwood *
211a2414316075dde4ca5c1393c662f224b36dd3fdcMike Lockwood * The distance value is measured in centimeters.  Note that some proximity
212a2414316075dde4ca5c1393c662f224b36dd3fdcMike Lockwood * sensors only support a binary "close" or "far" measurement.  In this case,
213a2414316075dde4ca5c1393c662f224b36dd3fdcMike Lockwood * the sensor should report its maxRange value in the "far" state and a value
214a2414316075dde4ca5c1393c662f224b36dd3fdcMike Lockwood * less than maxRange in the "near" state.
215a2414316075dde4ca5c1393c662f224b36dd3fdcMike Lockwood *
216478994a758e48b0de7f56f3de0678d5c2b6a4b61Mathias Agopian * Proximity sensors report a value only when it changes and each time the
21715879d89af055f6cd651a94125a3802b526c3d66Mathias Agopian * sensor is enabled.
21866a4095ca0ecfe89b10abe5402617450f57759cdMathias Agopian *
219e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * SENSOR_TYPE_LIGHT
220e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * -----------------
221a2414316075dde4ca5c1393c662f224b36dd3fdcMike Lockwood *
222a2414316075dde4ca5c1393c662f224b36dd3fdcMike Lockwood * The light sensor value is returned in SI lux units.
223a2414316075dde4ca5c1393c662f224b36dd3fdcMike Lockwood *
224478994a758e48b0de7f56f3de0678d5c2b6a4b61Mathias Agopian * Light sensors report a value only when it changes and each time the
22515879d89af055f6cd651a94125a3802b526c3d66Mathias Agopian * sensor is enabled.
22666a4095ca0ecfe89b10abe5402617450f57759cdMathias Agopian *
227e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * SENSOR_TYPE_PRESSURE
228e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * --------------------
2291832f55760fff86d00b5d808b3da8f1e55a889e5Mathias Agopian *
230e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * The pressure sensor return the athmospheric pressure in hectopascal (hPa)
2311832f55760fff86d00b5d808b3da8f1e55a889e5Mathias Agopian *
2321832f55760fff86d00b5d808b3da8f1e55a889e5Mathias Agopian * Pressure sensors report events at a constant rate defined by setDelay().
2331832f55760fff86d00b5d808b3da8f1e55a889e5Mathias Agopian *
234e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * SENSOR_TYPE_GRAVITY
235e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * -------------------
2363120b58768ff6aad5ad169b9c18f962ef6abb3c5Makarand Karvekar *
237e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * A gravity output indicates the direction of and magnitude of gravity in
238e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * the devices's coordinates.  On Earth, the magnitude is 9.8 m/s^2.
239e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * Units are m/s^2.  The coordinate system is the same as is used for the
240e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * acceleration sensor. When the device is at rest, the output of the
241e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * gravity sensor should be identical to that of the accelerometer.
2423120b58768ff6aad5ad169b9c18f962ef6abb3c5Makarand Karvekar *
243e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * SENSOR_TYPE_LINEAR_ACCELERATION
244e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * --------------------------------
2453120b58768ff6aad5ad169b9c18f962ef6abb3c5Makarand Karvekar *
246e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * Indicates the linear acceleration of the device in device coordinates,
247e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * not including gravity.
248e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * This output is essentially Acceleration - Gravity.  Units are m/s^2.
249e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * The coordinate system is the same as is used for the acceleration sensor.
250b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell *
25142b743c85597e982ff1122b972862396f131db34Mathias Agopian *
252e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * SENSOR_TYPE_ROTATION_VECTOR
253e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * ---------------------------
25442b743c85597e982ff1122b972862396f131db34Mathias Agopian *
255b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell * A rotation vector represents the orientation of the device as a combination
256b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell * of an angle and an axis, in which the device has rotated through an angle
257b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell * theta around an axis <x, y, z>. The three elements of the rotation vector
258b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell * are <x*sin(theta/2), y*sin(theta/2), z*sin(theta/2)>, such that the magnitude
259b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell * of the rotation vector is equal to sin(theta/2), and the direction of the
260b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell * rotation vector is equal to the direction of the axis of rotation. The three
261b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell * elements of the rotation vector are equal to the last three components of a
262b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell * unit quaternion <cos(theta/2), x*sin(theta/2), y*sin(theta/2), z*sin(theta/2)>.
263b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell * Elements of the rotation vector are unitless.  The x, y, and z axis are defined
264b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell * in the same was as for the acceleration sensor.
26542b743c85597e982ff1122b972862396f131db34Mathias Agopian *
266d93ff971bd507e92ac81c149079906d2123795afMathias Agopian * The reference coordinate system is defined as a direct orthonormal basis,
267d93ff971bd507e92ac81c149079906d2123795afMathias Agopian * where:
268d93ff971bd507e92ac81c149079906d2123795afMathias Agopian *
269d93ff971bd507e92ac81c149079906d2123795afMathias Agopian * - X is defined as the vector product Y.Z (It is tangential to
270d93ff971bd507e92ac81c149079906d2123795afMathias Agopian * the ground at the device's current location and roughly points East).
271d93ff971bd507e92ac81c149079906d2123795afMathias Agopian *
272d93ff971bd507e92ac81c149079906d2123795afMathias Agopian * - Y is tangential to the ground at the device's current location and
273d93ff971bd507e92ac81c149079906d2123795afMathias Agopian * points towards the magnetic North Pole.
274d93ff971bd507e92ac81c149079906d2123795afMathias Agopian *
275d93ff971bd507e92ac81c149079906d2123795afMathias Agopian * - Z points towards the sky and is perpendicular to the ground.
276d93ff971bd507e92ac81c149079906d2123795afMathias Agopian *
277d93ff971bd507e92ac81c149079906d2123795afMathias Agopian *
27842b743c85597e982ff1122b972862396f131db34Mathias Agopian * The rotation-vector is stored as:
27942b743c85597e982ff1122b972862396f131db34Mathias Agopian *
28042b743c85597e982ff1122b972862396f131db34Mathias Agopian *   sensors_event_t.data[0] = x*sin(theta/2)
28142b743c85597e982ff1122b972862396f131db34Mathias Agopian *   sensors_event_t.data[1] = y*sin(theta/2)
28242b743c85597e982ff1122b972862396f131db34Mathias Agopian *   sensors_event_t.data[2] = z*sin(theta/2)
28342b743c85597e982ff1122b972862396f131db34Mathias Agopian *   sensors_event_t.data[3] =   cos(theta/2)
28442b743c85597e982ff1122b972862396f131db34Mathias Agopian *
2856e17d2c46caad76497da1070efd41481b0f40b27Jean-Baptiste Queru *
286e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * SENSOR_TYPE_RELATIVE_HUMIDITY
287e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * ------------------------------
288d2ed15a6b81a9a2fd95c1a565f72796869545115Urs Fleisch *
289d2ed15a6b81a9a2fd95c1a565f72796869545115Urs Fleisch * A relative humidity sensor measures relative ambient air humidity and
290d2ed15a6b81a9a2fd95c1a565f72796869545115Urs Fleisch * returns a value in percent.
291d2ed15a6b81a9a2fd95c1a565f72796869545115Urs Fleisch *
292d2ed15a6b81a9a2fd95c1a565f72796869545115Urs Fleisch * Relative humidity sensors report a value only when it changes and each
29315879d89af055f6cd651a94125a3802b526c3d66Mathias Agopian * time the sensor is enabled.
2946e17d2c46caad76497da1070efd41481b0f40b27Jean-Baptiste Queru *
2956e17d2c46caad76497da1070efd41481b0f40b27Jean-Baptiste Queru *
296e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * SENSOR_TYPE_AMBIENT_TEMPERATURE
297e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian * -------------------------------
29854f9dd032dfbd336ca90e3b44047373f0297c3a5Mathias Agopian *
29954f9dd032dfbd336ca90e3b44047373f0297c3a5Mathias Agopian * The ambient (room) temperature in degree Celsius.
30054f9dd032dfbd336ca90e3b44047373f0297c3a5Mathias Agopian *
30154f9dd032dfbd336ca90e3b44047373f0297c3a5Mathias Agopian * Temperature sensors report a value only when it changes and each time the
30215879d89af055f6cd651a94125a3802b526c3d66Mathias Agopian * sensor is enabled.
30354f9dd032dfbd336ca90e3b44047373f0297c3a5Mathias Agopian *
304f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
305b01a043df41e987321f6c01930ac306befb1d3dcKevin Powell
306f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Projecttypedef struct {
307f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    union {
308f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project        float v[3];
309f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project        struct {
310f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project            float x;
311f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project            float y;
312f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project            float z;
313f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project        };
314f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project        struct {
315f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project            float azimuth;
316f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project            float pitch;
317f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project            float roll;
318f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project        };
319f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    };
320f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    int8_t status;
321f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    uint8_t reserved[3];
322f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project} sensors_vec_t;
323f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
324f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
325f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Union of the various types of sensor data
326f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * that can be returned.
327f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
328cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopiantypedef struct sensors_event_t {
329cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian    /* must be sizeof(struct sensors_event_t) */
330cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian    int32_t version;
331cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian
332cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian    /* sensor identifier */
333cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian    int32_t sensor;
334cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian
335cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian    /* sensor type */
336cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian    int32_t type;
337cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian
338cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian    /* reserved */
339cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian    int32_t reserved0;
340cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian
341cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian    /* time is in nanosecond */
342cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian    int64_t timestamp;
343cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian
344cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian    union {
345cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian        float           data[16];
346cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian
347cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian        /* acceleration values are in meter per second per second (m/s^2) */
348cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian        sensors_vec_t   acceleration;
349cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian
350cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian        /* magnetic vector values are in micro-Tesla (uT) */
351cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian        sensors_vec_t   magnetic;
352cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian
353cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian        /* orientation values are in degrees */
354cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian        sensors_vec_t   orientation;
355cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian
356c04e5f68905127ae4c1a0c17d225db9cebe66a07Mathias Agopian        /* gyroscope values are in rad/s */
357c04e5f68905127ae4c1a0c17d225db9cebe66a07Mathias Agopian        sensors_vec_t   gyro;
3583120b58768ff6aad5ad169b9c18f962ef6abb3c5Makarand Karvekar
359cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian        /* temperature is in degrees centigrade (Celsius) */
360cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian        float           temperature;
361cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian
362cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian        /* distance in centimeters */
363cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian        float           distance;
364cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian
365cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian        /* light in SI lux units */
366cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian        float           light;
3671832f55760fff86d00b5d808b3da8f1e55a889e5Mathias Agopian
3681832f55760fff86d00b5d808b3da8f1e55a889e5Mathias Agopian        /* pressure in hectopascal (hPa) */
3691832f55760fff86d00b5d808b3da8f1e55a889e5Mathias Agopian        float           pressure;
370d2ed15a6b81a9a2fd95c1a565f72796869545115Urs Fleisch
371d2ed15a6b81a9a2fd95c1a565f72796869545115Urs Fleisch        /* relative humidity in percent */
372d2ed15a6b81a9a2fd95c1a565f72796869545115Urs Fleisch        float           relative_humidity;
373cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian    };
374cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian    uint32_t        reserved1[4];
375cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian} sensors_event_t;
376cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian
377cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian
378cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian
379f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Projectstruct sensor_t;
380f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
381f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
382f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
383f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * and the fields of this data structure must begin with hw_module_t
384f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * followed by module specific information.
385f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
386f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Projectstruct sensors_module_t {
387f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    struct hw_module_t common;
388f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
389f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /**
390f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project     * Enumerate all available sensors. The list is returned in "list".
391f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project     * @return number of sensors in the list
392f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project     */
393f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    int (*get_sensors_list)(struct sensors_module_t* module,
394f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project            struct sensor_t const** list);
395f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project};
396f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
397f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Projectstruct sensor_t {
398f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /* name of this sensors */
399f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    const char*     name;
400f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /* vendor of the hardware part */
401f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    const char*     vendor;
402e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian    /* version of the hardware part + driver. The value of this field
403e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian     * must increase when the driver is updated in a way that changes the
404e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian     * output of this sensor. This is important for fused sensors when the
405e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian     * fusion algorithm is updated.
406f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project     */
407f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    int             version;
408f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /* handle that identifies this sensors. This handle is used to activate
409f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project     * and deactivate this sensor. The value of the handle must be 8 bits
410f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project     * in this version of the API.
411f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project     */
412f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    int             handle;
413f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /* this sensor's type. */
414f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    int             type;
415f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /* maximaum range of this sensor's value in SI units */
416f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    float           maxRange;
417f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /* smallest difference between two values reported by this sensor */
418f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    float           resolution;
419f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /* rough estimate of this sensor's power consumption in mA */
420f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    float           power;
4211511e20fbbdfe7bf30b9de73f06fc981eb494f09Mathias Agopian    /* minimum delay allowed between events in microseconds. A value of zero
4221511e20fbbdfe7bf30b9de73f06fc981eb494f09Mathias Agopian     * means that this sensor doesn't report events at a constant rate, but
4231511e20fbbdfe7bf30b9de73f06fc981eb494f09Mathias Agopian     * rather only when a new data is available */
4241511e20fbbdfe7bf30b9de73f06fc981eb494f09Mathias Agopian    int32_t         minDelay;
425f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /* reserved fields, must be zero */
4261511e20fbbdfe7bf30b9de73f06fc981eb494f09Mathias Agopian    void*           reserved[8];
427f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project};
428f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
429f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
430f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
431f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Every device data structure must begin with hw_device_t
432f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * followed by module specific public methods and attributes.
433f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
434b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopianstruct sensors_poll_device_t {
435b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian    struct hw_device_t common;
436b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian
437b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian    /** Activate/deactivate one sensor.
438b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian     *
439b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian     * @param handle is the handle of the sensor to change.
440b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian     * @param enabled set to 1 to enable, or 0 to disable the sensor.
441b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian     *
442b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian     * @return 0 on success, negative errno code otherwise
443b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian     */
444b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian    int (*activate)(struct sensors_poll_device_t *dev,
445b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian            int handle, int enabled);
446b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian
447b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian    /**
4481511e20fbbdfe7bf30b9de73f06fc981eb494f09Mathias Agopian     * Set the delay between sensor events in nanoseconds for a given sensor.
44915879d89af055f6cd651a94125a3802b526c3d66Mathias Agopian     *
450e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian     * If the requested value is less than sensor_t::minDelay, then it's
451e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian     * silently clamped to sensor_t::minDelay unless sensor_t::minDelay is
452e9eaf3721dd715901d669df6488b1ecd63b1e634Mathias Agopian     * 0, in which case it is clamped to >= 1ms.
453b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian     *
454b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian     * @return 0 if successful, < 0 on error
455b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian     */
456b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian    int (*setDelay)(struct sensors_poll_device_t *dev,
457b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian            int handle, int64_t ns);
458b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian
459b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian    /**
460b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian     * Returns an array of sensor data.
4611511e20fbbdfe7bf30b9de73f06fc981eb494f09Mathias Agopian     * This function must block until events are available.
462b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian     *
463b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian     * @return the number of events read on success, or -errno in case of an error.
4641511e20fbbdfe7bf30b9de73f06fc981eb494f09Mathias Agopian     * This function should never return 0 (no event).
465b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian     *
466b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian     */
467b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian    int (*poll)(struct sensors_poll_device_t *dev,
468cdefccdba52337df41f577d9ebfcfd67c05708cfMathias Agopian            sensors_event_t* data, int count);
469b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian};
470b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian
471f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/** convenience API for opening and closing a device */
472f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
473b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopianstatic inline int sensors_open(const struct hw_module_t* module,
474b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian        struct sensors_poll_device_t** device) {
475b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian    return module->methods->open(module,
476b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian            SENSORS_HARDWARE_POLL, (struct hw_device_t**)device);
477b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian}
478b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian
479b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopianstatic inline int sensors_close(struct sensors_poll_device_t* device) {
480b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian    return device->common.close(&device->common);
481b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian}
482b1e212e7b6fce2bc5c743b05853129e19760d7a4Mathias Agopian
483f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project__END_DECLS
484f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
485f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#endif  // ANDROID_SENSORS_INTERFACE_H
486