xref: /nrf52832-nimble/rt-thread/components/drivers/sensors/sensor.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2014-08-03     Bernard      the first version
9*10465441SEvalZero  */
10*10465441SEvalZero 
11*10465441SEvalZero /* Modified from: https://github.com/android/platform_hardware_libhardware/blob/master/include/hardware/sensors.h */
12*10465441SEvalZero 
13*10465441SEvalZero /*
14*10465441SEvalZero  * Copyright (C) 2012 The Android Open Source Project
15*10465441SEvalZero  *
16*10465441SEvalZero  * Licensed under the Apache License, Version 2.0 (the "License");
17*10465441SEvalZero  * you may not use this file except in compliance with the License.
18*10465441SEvalZero  * You may obtain a copy of the License at
19*10465441SEvalZero  *
20*10465441SEvalZero  *      http://www.apache.org/licenses/LICENSE-2.0
21*10465441SEvalZero  *
22*10465441SEvalZero  * Unless required by applicable law or agreed to in writing, software
23*10465441SEvalZero  * distributed under the License is distributed on an "AS IS" BASIS,
24*10465441SEvalZero  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
25*10465441SEvalZero  * See the License for the specific language governing permissions and
26*10465441SEvalZero  * limitations under the License.
27*10465441SEvalZero  */
28*10465441SEvalZero 
29*10465441SEvalZero #ifndef SENSORS_H__
30*10465441SEvalZero #define SENSORS_H__
31*10465441SEvalZero 
32*10465441SEvalZero #include <rtdevice.h>
33*10465441SEvalZero #include <stdint.h>
34*10465441SEvalZero 
35*10465441SEvalZero #ifdef __CC_ARM /* skip warning in armcc */
36*10465441SEvalZero #pragma anon_unions
37*10465441SEvalZero #endif
38*10465441SEvalZero 
39*10465441SEvalZero /**
40*10465441SEvalZero  * Handles must be higher than SENSORS_HANDLE_BASE and must be unique.
41*10465441SEvalZero  * A Handle identifies a given sensors. The handle is used to activate
42*10465441SEvalZero  * and/or deactivate sensors.
43*10465441SEvalZero  * In this version of the API there can only be 256 handles.
44*10465441SEvalZero  */
45*10465441SEvalZero #define SENSORS_HANDLE_BASE             0
46*10465441SEvalZero #define SENSORS_HANDLE_BITS             8
47*10465441SEvalZero #define SENSORS_HANDLE_COUNT            (1<<SENSORS_HANDLE_BITS)
48*10465441SEvalZero 
49*10465441SEvalZero 
50*10465441SEvalZero /*
51*10465441SEvalZero  * flags for (*batch)()
52*10465441SEvalZero  * Availability: SENSORS_DEVICE_API_VERSION_1_0
53*10465441SEvalZero  * see (*batch)() documentation for details
54*10465441SEvalZero  */
55*10465441SEvalZero enum
56*10465441SEvalZero {
57*10465441SEvalZero     SENSORS_BATCH_DRY_RUN               = 0x00000001,
58*10465441SEvalZero     SENSORS_BATCH_WAKE_UPON_FIFO_FULL   = 0x00000002
59*10465441SEvalZero };
60*10465441SEvalZero 
61*10465441SEvalZero /*
62*10465441SEvalZero  * what field for meta_data_event_t
63*10465441SEvalZero  */
64*10465441SEvalZero enum
65*10465441SEvalZero {
66*10465441SEvalZero     /* a previous flush operation has completed */
67*10465441SEvalZero     META_DATA_FLUSH_COMPLETE = 1,
68*10465441SEvalZero     META_DATA_VERSION   /* always last, leave auto-assigned */
69*10465441SEvalZero };
70*10465441SEvalZero 
71*10465441SEvalZero /**
72*10465441SEvalZero  * Definition of the axis used by the sensor HAL API
73*10465441SEvalZero  *
74*10465441SEvalZero  * This API is relative to the screen of the device in its default orientation,
75*10465441SEvalZero  * that is, if the device can be used in portrait or landscape, this API
76*10465441SEvalZero  * is only relative to the NATURAL orientation of the screen. In other words,
77*10465441SEvalZero  * the axis are not swapped when the device's screen orientation changes.
78*10465441SEvalZero  * Higher level services /may/ perform this transformation.
79*10465441SEvalZero  *
80*10465441SEvalZero  *   x<0         x>0
81*10465441SEvalZero  *                ^
82*10465441SEvalZero  *                |
83*10465441SEvalZero  *    +-----------+-->  y>0
84*10465441SEvalZero  *    |           |
85*10465441SEvalZero  *    |           |
86*10465441SEvalZero  *    |           |
87*10465441SEvalZero  *    |           |   / z<0
88*10465441SEvalZero  *    |           |  /
89*10465441SEvalZero  *    |           | /
90*10465441SEvalZero  *    O-----------+/
91*10465441SEvalZero  *    |[]  [ ]  []/
92*10465441SEvalZero  *    +----------/+     y<0
93*10465441SEvalZero  *              /
94*10465441SEvalZero  *             /
95*10465441SEvalZero  *           |/ z>0 (toward the sky)
96*10465441SEvalZero  *
97*10465441SEvalZero  *    O: Origin (x=0,y=0,z=0)
98*10465441SEvalZero  *
99*10465441SEvalZero  */
100*10465441SEvalZero 
101*10465441SEvalZero /*
102*10465441SEvalZero  * Interaction with suspend mode
103*10465441SEvalZero  *
104*10465441SEvalZero  * Unless otherwise noted, an enabled sensor shall not prevent the
105*10465441SEvalZero  * SoC to go into suspend mode. It is the responsibility of applications
106*10465441SEvalZero  * to keep a partial wake-lock should they wish to receive sensor
107*10465441SEvalZero  * events while the screen is off. While in suspend mode, and unless
108*10465441SEvalZero  * otherwise noted (batch mode, sensor particularities, ...), enabled sensors'
109*10465441SEvalZero  * events are lost.
110*10465441SEvalZero  *
111*10465441SEvalZero  * Note that conceptually, the sensor itself is not de-activated while in
112*10465441SEvalZero  * suspend mode -- it's just that the data it returns are lost. As soon as
113*10465441SEvalZero  * the SoC gets out of suspend mode, operations resume as usual. Of course,
114*10465441SEvalZero  * in practice sensors shall be disabled while in suspend mode to
115*10465441SEvalZero  * save power, unless batch mode is active, in which case they must
116*10465441SEvalZero  * continue fill their internal FIFO (see the documentation of batch() to
117*10465441SEvalZero  * learn how suspend interacts with batch mode).
118*10465441SEvalZero  *
119*10465441SEvalZero  * In batch mode, and only when the flag SENSORS_BATCH_WAKE_UPON_FIFO_FULL is
120*10465441SEvalZero  * set and supported, the specified sensor must be able to wake-up the SoC and
121*10465441SEvalZero  * be able to buffer at least 10 seconds worth of the requested sensor events.
122*10465441SEvalZero  *
123*10465441SEvalZero  * There are notable exceptions to this behavior, which are sensor-dependent
124*10465441SEvalZero  * (see sensor types definitions below)
125*10465441SEvalZero  *
126*10465441SEvalZero  *
127*10465441SEvalZero  * The sensor type documentation below specifies the wake-up behavior of
128*10465441SEvalZero  * each sensor:
129*10465441SEvalZero  *   wake-up: yes     this sensor must wake-up the SoC to deliver events
130*10465441SEvalZero  *   wake-up: no      this sensor shall not wake-up the SoC, events are dropped
131*10465441SEvalZero  *
132*10465441SEvalZero  */
133*10465441SEvalZero 
134*10465441SEvalZero /*
135*10465441SEvalZero  * Sensor type
136*10465441SEvalZero  *
137*10465441SEvalZero  * Each sensor has a type which defines what this sensor measures and how
138*10465441SEvalZero  * measures are reported. All types are defined below.
139*10465441SEvalZero  *
140*10465441SEvalZero  * Device manufacturers (OEMs) can define their own sensor types, for
141*10465441SEvalZero  * their private use by applications or services provided by them. Such
142*10465441SEvalZero  * sensor types are specific to an OEM and can't be exposed in the SDK.
143*10465441SEvalZero  * These types must start at SENSOR_TYPE_DEVICE_PRIVATE_BASE.
144*10465441SEvalZero  */
145*10465441SEvalZero 
146*10465441SEvalZero /*
147*10465441SEvalZero  * Base for device manufacturers private sensor types.
148*10465441SEvalZero  * These sensor types can't be exposed in the SDK.
149*10465441SEvalZero  */
150*10465441SEvalZero #define SENSOR_TYPE_DEVICE_PRIVATE_BASE     0x10000
151*10465441SEvalZero 
152*10465441SEvalZero /*
153*10465441SEvalZero  * Sensor fusion and virtual sensors
154*10465441SEvalZero  *
155*10465441SEvalZero  * Many sensor types are or can be implemented as virtual sensors from
156*10465441SEvalZero  * physical sensors on the device. For instance the rotation vector sensor,
157*10465441SEvalZero  * orientation sensor, step-detector, step-counter, etc...
158*10465441SEvalZero  *
159*10465441SEvalZero  * From the point of view of this API these virtual sensors MUST appear as
160*10465441SEvalZero  * real, individual sensors. It is the responsibility of the driver and HAL
161*10465441SEvalZero  * to make sure this is the case.
162*10465441SEvalZero  *
163*10465441SEvalZero  * In particular, all sensors must be able to function concurrently.
164*10465441SEvalZero  * For example, if defining both an accelerometer and a step counter,
165*10465441SEvalZero  * then both must be able to work concurrently.
166*10465441SEvalZero  */
167*10465441SEvalZero 
168*10465441SEvalZero /*
169*10465441SEvalZero  * Trigger modes
170*10465441SEvalZero  *
171*10465441SEvalZero  * Sensors can report events in different ways called trigger modes,
172*10465441SEvalZero  * each sensor type has one and only one trigger mode associated to it.
173*10465441SEvalZero  * Currently there are four trigger modes defined:
174*10465441SEvalZero  *
175*10465441SEvalZero  * continuous: events are reported at a constant rate defined by setDelay().
176*10465441SEvalZero  *             eg: accelerometers, gyroscopes.
177*10465441SEvalZero  * on-change:  events are reported only if the sensor's value has changed.
178*10465441SEvalZero  *             setDelay() is used to set a lower limit to the reporting
179*10465441SEvalZero  *             period (minimum time between two events).
180*10465441SEvalZero  *             The HAL must return an event immediately when an on-change
181*10465441SEvalZero  *             sensor is activated.
182*10465441SEvalZero  *             eg: proximity, light sensors
183*10465441SEvalZero  * one-shot:   upon detection of an event, the sensor deactivates itself and
184*10465441SEvalZero  *             then sends a single event. Order matters to avoid race
185*10465441SEvalZero  *             conditions. No other event is sent until the sensor get
186*10465441SEvalZero  *             reactivated. setDelay() is ignored.
187*10465441SEvalZero  *             eg: significant motion sensor
188*10465441SEvalZero  * special:    see details in the sensor type specification below
189*10465441SEvalZero  *
190*10465441SEvalZero  */
191*10465441SEvalZero 
192*10465441SEvalZero /*
193*10465441SEvalZero  * SENSOR_TYPE_META_DATA
194*10465441SEvalZero  * trigger-mode: n/a
195*10465441SEvalZero  * wake-up sensor: n/a
196*10465441SEvalZero  *
197*10465441SEvalZero  * NO SENSOR OF THAT TYPE MUST BE RETURNED (*get_sensors_list)()
198*10465441SEvalZero  *
199*10465441SEvalZero  * SENSOR_TYPE_META_DATA is a special token used to populate the
200*10465441SEvalZero  * sensors_meta_data_event structure. It doesn't correspond to a physical
201*10465441SEvalZero  * sensor. sensors_meta_data_event are special, they exist only inside
202*10465441SEvalZero  * the HAL and are generated spontaneously, as opposed to be related to
203*10465441SEvalZero  * a physical sensor.
204*10465441SEvalZero  *
205*10465441SEvalZero  *   sensors_meta_data_event_t.version must be META_DATA_VERSION
206*10465441SEvalZero  *   sensors_meta_data_event_t.sensor must be 0
207*10465441SEvalZero  *   sensors_meta_data_event_t.type must be SENSOR_TYPE_META_DATA
208*10465441SEvalZero  *   sensors_meta_data_event_t.reserved must be 0
209*10465441SEvalZero  *   sensors_meta_data_event_t.timestamp must be 0
210*10465441SEvalZero  *
211*10465441SEvalZero  * The payload is a meta_data_event_t, where:
212*10465441SEvalZero  * meta_data_event_t.what can take the following values:
213*10465441SEvalZero  *
214*10465441SEvalZero  * META_DATA_FLUSH_COMPLETE
215*10465441SEvalZero  *   This event indicates that a previous (*flush)() call has completed for the sensor
216*10465441SEvalZero  *   handle specified in meta_data_event_t.sensor.
217*10465441SEvalZero  *   see (*flush)() for more details
218*10465441SEvalZero  *
219*10465441SEvalZero  * All other values for meta_data_event_t.what are reserved and
220*10465441SEvalZero  * must not be used.
221*10465441SEvalZero  *
222*10465441SEvalZero  */
223*10465441SEvalZero #define SENSOR_TYPE_META_DATA                           (0)
224*10465441SEvalZero 
225*10465441SEvalZero /*
226*10465441SEvalZero  * SENSOR_TYPE_ACCELEROMETER
227*10465441SEvalZero  * trigger-mode: continuous
228*10465441SEvalZero  * wake-up sensor: no
229*10465441SEvalZero  *
230*10465441SEvalZero  *  All values are in SI units (m/s^2) and measure the acceleration of the
231*10465441SEvalZero  *  device minus the force of gravity.
232*10465441SEvalZero  *
233*10465441SEvalZero  *  Acceleration sensors return sensor events for all 3 axes at a constant
234*10465441SEvalZero  *  rate defined by setDelay().
235*10465441SEvalZero  *
236*10465441SEvalZero  *  x: Acceleration on the x-axis
237*10465441SEvalZero  *  y: Acceleration on the y-axis
238*10465441SEvalZero  *  z: Acceleration on the z-axis
239*10465441SEvalZero  *
240*10465441SEvalZero  * Note that the readings from the accelerometer include the acceleration
241*10465441SEvalZero  * due to gravity (which is opposite to the direction of the gravity vector).
242*10465441SEvalZero  *
243*10465441SEvalZero  *  Examples:
244*10465441SEvalZero  *    The norm of <x, y, z>  should be close to 0 when in free fall.
245*10465441SEvalZero  *
246*10465441SEvalZero  *    When the device lies flat on a table and is pushed on its left side
247*10465441SEvalZero  *    toward the right, the x acceleration value is positive.
248*10465441SEvalZero  *
249*10465441SEvalZero  *    When the device lies flat on a table, the acceleration value is +9.81,
250*10465441SEvalZero  *    which correspond to the acceleration of the device (0 m/s^2) minus the
251*10465441SEvalZero  *    force of gravity (-9.81 m/s^2).
252*10465441SEvalZero  *
253*10465441SEvalZero  *    When the device lies flat on a table and is pushed toward the sky, the
254*10465441SEvalZero  *    acceleration value is greater than +9.81, which correspond to the
255*10465441SEvalZero  *    acceleration of the device (+A m/s^2) minus the force of
256*10465441SEvalZero  *    gravity (-9.81 m/s^2).
257*10465441SEvalZero  */
258*10465441SEvalZero #define SENSOR_TYPE_ACCELEROMETER                    (1)
259*10465441SEvalZero 
260*10465441SEvalZero /*
261*10465441SEvalZero  * SENSOR_TYPE_GEOMAGNETIC_FIELD
262*10465441SEvalZero  * trigger-mode: continuous
263*10465441SEvalZero  * wake-up sensor: no
264*10465441SEvalZero  *
265*10465441SEvalZero  *  All values are in micro-Tesla (uT) and measure the geomagnetic
266*10465441SEvalZero  *  field in the X, Y and Z axis.
267*10465441SEvalZero  *
268*10465441SEvalZero  *  Returned values include calibration mechanisms such that the vector is
269*10465441SEvalZero  *  aligned with the magnetic declination and heading of the earth's
270*10465441SEvalZero  *  geomagnetic field.
271*10465441SEvalZero  *
272*10465441SEvalZero  *  Magnetic Field sensors return sensor events for all 3 axes at a constant
273*10465441SEvalZero  *  rate defined by setDelay().
274*10465441SEvalZero  */
275*10465441SEvalZero #define SENSOR_TYPE_GEOMAGNETIC_FIELD                (2)
276*10465441SEvalZero #define SENSOR_TYPE_MAGNETIC_FIELD  SENSOR_TYPE_GEOMAGNETIC_FIELD
277*10465441SEvalZero 
278*10465441SEvalZero /*
279*10465441SEvalZero  * SENSOR_TYPE_ORIENTATION
280*10465441SEvalZero  * trigger-mode: continuous
281*10465441SEvalZero  * wake-up sensor: no
282*10465441SEvalZero  *
283*10465441SEvalZero  * All values are angles in degrees.
284*10465441SEvalZero  *
285*10465441SEvalZero  * Orientation sensors return sensor events for all 3 axes at a constant
286*10465441SEvalZero  * rate defined by setDelay().
287*10465441SEvalZero  *
288*10465441SEvalZero  * azimuth: angle between the magnetic north direction and the Y axis, around
289*10465441SEvalZero  *  the Z axis (0<=azimuth<360).
290*10465441SEvalZero  *      0=North, 90=East, 180=South, 270=West
291*10465441SEvalZero  *
292*10465441SEvalZero  * pitch: Rotation around X axis (-180<=pitch<=180), with positive values when
293*10465441SEvalZero  *  the z-axis moves toward the y-axis.
294*10465441SEvalZero  *
295*10465441SEvalZero  * roll: Rotation around Y axis (-90<=roll<=90), with positive values when
296*10465441SEvalZero  *  the x-axis moves towards the z-axis.
297*10465441SEvalZero  *
298*10465441SEvalZero  * Note: For historical reasons the roll angle is positive in the clockwise
299*10465441SEvalZero  *  direction (mathematically speaking, it should be positive in the
300*10465441SEvalZero  *  counter-clockwise direction):
301*10465441SEvalZero  *
302*10465441SEvalZero  *                Z
303*10465441SEvalZero  *                ^
304*10465441SEvalZero  *  (+roll)  .--> |
305*10465441SEvalZero  *          /     |
306*10465441SEvalZero  *         |      |  roll: rotation around Y axis
307*10465441SEvalZero  *     X <-------(.)
308*10465441SEvalZero  *                 Y
309*10465441SEvalZero  *       note that +Y == -roll
310*10465441SEvalZero  *
311*10465441SEvalZero  *
312*10465441SEvalZero  *
313*10465441SEvalZero  * Note: This definition is different from yaw, pitch and roll used in aviation
314*10465441SEvalZero  *  where the X axis is along the long side of the plane (tail to nose).
315*10465441SEvalZero  */
316*10465441SEvalZero #define SENSOR_TYPE_ORIENTATION                      (3)
317*10465441SEvalZero 
318*10465441SEvalZero /*
319*10465441SEvalZero  * SENSOR_TYPE_GYROSCOPE
320*10465441SEvalZero  * trigger-mode: continuous
321*10465441SEvalZero  * wake-up sensor: no
322*10465441SEvalZero  *
323*10465441SEvalZero  *  All values are in radians/second and measure the rate of rotation
324*10465441SEvalZero  *  around the X, Y and Z axis.  The coordinate system is the same as is
325*10465441SEvalZero  *  used for the acceleration sensor. Rotation is positive in the
326*10465441SEvalZero  *  counter-clockwise direction (right-hand rule). That is, an observer
327*10465441SEvalZero  *  looking from some positive location on the x, y or z axis at a device
328*10465441SEvalZero  *  positioned on the origin would report positive rotation if the device
329*10465441SEvalZero  *  appeared to be rotating counter clockwise. Note that this is the
330*10465441SEvalZero  *  standard mathematical definition of positive rotation and does not agree
331*10465441SEvalZero  *  with the definition of roll given earlier.
332*10465441SEvalZero  *  The range should at least be 17.45 rad/s (ie: ~1000 deg/s).
333*10465441SEvalZero  *
334*10465441SEvalZero  *  automatic gyro-drift compensation is allowed but not required.
335*10465441SEvalZero  */
336*10465441SEvalZero #define SENSOR_TYPE_GYROSCOPE                        (4)
337*10465441SEvalZero 
338*10465441SEvalZero /*
339*10465441SEvalZero  * SENSOR_TYPE_LIGHT
340*10465441SEvalZero  * trigger-mode: on-change
341*10465441SEvalZero  * wake-up sensor: no
342*10465441SEvalZero  *
343*10465441SEvalZero  * The light sensor value is returned in SI lux units.
344*10465441SEvalZero  */
345*10465441SEvalZero #define SENSOR_TYPE_LIGHT                            (5)
346*10465441SEvalZero 
347*10465441SEvalZero /*
348*10465441SEvalZero  * SENSOR_TYPE_PRESSURE
349*10465441SEvalZero  * trigger-mode: continuous
350*10465441SEvalZero  * wake-up sensor: no
351*10465441SEvalZero  *
352*10465441SEvalZero  * The pressure sensor return the athmospheric pressure in hectopascal (hPa)
353*10465441SEvalZero  */
354*10465441SEvalZero #define SENSOR_TYPE_PRESSURE                         (6)
355*10465441SEvalZero 
356*10465441SEvalZero /* SENSOR_TYPE_TEMPERATURE is deprecated in the HAL */
357*10465441SEvalZero #define SENSOR_TYPE_TEMPERATURE                      (7)
358*10465441SEvalZero 
359*10465441SEvalZero /*
360*10465441SEvalZero  * SENSOR_TYPE_PROXIMITY
361*10465441SEvalZero  * trigger-mode: on-change
362*10465441SEvalZero  * wake-up sensor: yes
363*10465441SEvalZero  *
364*10465441SEvalZero  * The distance value is measured in centimeters.  Note that some proximity
365*10465441SEvalZero  * sensors only support a binary "close" or "far" measurement.  In this case,
366*10465441SEvalZero  * the sensor should report its maxRange value in the "far" state and a value
367*10465441SEvalZero  * less than maxRange in the "near" state.
368*10465441SEvalZero  */
369*10465441SEvalZero #define SENSOR_TYPE_PROXIMITY                        (8)
370*10465441SEvalZero 
371*10465441SEvalZero /*
372*10465441SEvalZero  * SENSOR_TYPE_GRAVITY
373*10465441SEvalZero  * trigger-mode: continuous
374*10465441SEvalZero  * wake-up sensor: no
375*10465441SEvalZero  *
376*10465441SEvalZero  * A gravity output indicates the direction of and magnitude of gravity in
377*10465441SEvalZero  * the devices's coordinates.  On Earth, the magnitude is 9.8 m/s^2.
378*10465441SEvalZero  * Units are m/s^2.  The coordinate system is the same as is used for the
379*10465441SEvalZero  * acceleration sensor. When the device is at rest, the output of the
380*10465441SEvalZero  * gravity sensor should be identical to that of the accelerometer.
381*10465441SEvalZero  */
382*10465441SEvalZero #define SENSOR_TYPE_GRAVITY                          (9)
383*10465441SEvalZero 
384*10465441SEvalZero /*
385*10465441SEvalZero  * SENSOR_TYPE_LINEAR_ACCELERATION
386*10465441SEvalZero  * trigger-mode: continuous
387*10465441SEvalZero  * wake-up sensor: no
388*10465441SEvalZero  *
389*10465441SEvalZero  * Indicates the linear acceleration of the device in device coordinates,
390*10465441SEvalZero  * not including gravity.
391*10465441SEvalZero  *
392*10465441SEvalZero  * The output is conceptually:
393*10465441SEvalZero  *    output of TYPE_ACCELERATION - output of TYPE_GRAVITY
394*10465441SEvalZero  *
395*10465441SEvalZero  * Readings on all axes should be close to 0 when device lies on a table.
396*10465441SEvalZero  * Units are m/s^2.
397*10465441SEvalZero  * The coordinate system is the same as is used for the acceleration sensor.
398*10465441SEvalZero  */
399*10465441SEvalZero #define SENSOR_TYPE_LINEAR_ACCELERATION             (10)
400*10465441SEvalZero 
401*10465441SEvalZero /*
402*10465441SEvalZero  * SENSOR_TYPE_ROTATION_VECTOR
403*10465441SEvalZero  * trigger-mode: continuous
404*10465441SEvalZero  * wake-up sensor: no
405*10465441SEvalZero  *
406*10465441SEvalZero  * The rotation vector symbolizes the orientation of the device relative to the
407*10465441SEvalZero  * East-North-Up coordinates frame. It is usually obtained by integration of
408*10465441SEvalZero  * accelerometer, gyroscope and magnetometer readings.
409*10465441SEvalZero  *
410*10465441SEvalZero  * The East-North-Up coordinate system is defined as a direct orthonormal basis
411*10465441SEvalZero  * where:
412*10465441SEvalZero  * - X points east and is tangential to the ground.
413*10465441SEvalZero  * - Y points north and is tangential to the ground.
414*10465441SEvalZero  * - Z points towards the sky and is perpendicular to the ground.
415*10465441SEvalZero  *
416*10465441SEvalZero  * The orientation of the phone is represented by the rotation necessary to
417*10465441SEvalZero  * align the East-North-Up coordinates with the phone's coordinates. That is,
418*10465441SEvalZero  * applying the rotation to the world frame (X,Y,Z) would align them with the
419*10465441SEvalZero  * phone coordinates (x,y,z).
420*10465441SEvalZero  *
421*10465441SEvalZero  * The rotation can be seen as rotating the phone by an angle theta around
422*10465441SEvalZero  * an axis rot_axis to go from the reference (East-North-Up aligned) device
423*10465441SEvalZero  * orientation to the current device orientation.
424*10465441SEvalZero  *
425*10465441SEvalZero  * The rotation is encoded as the 4 (reordered) components of a unit quaternion:
426*10465441SEvalZero  *   sensors_event_t.data[0] = rot_axis.x*sin(theta/2)
427*10465441SEvalZero  *   sensors_event_t.data[1] = rot_axis.y*sin(theta/2)
428*10465441SEvalZero  *   sensors_event_t.data[2] = rot_axis.z*sin(theta/2)
429*10465441SEvalZero  *   sensors_event_t.data[3] = cos(theta/2)
430*10465441SEvalZero  * where
431*10465441SEvalZero  *   - rot_axis.x,y,z are the North-East-Up coordinates of a unit length vector
432*10465441SEvalZero  *     representing the rotation axis
433*10465441SEvalZero  *   - theta is the rotation angle
434*10465441SEvalZero  *
435*10465441SEvalZero  * The quaternion must be of norm 1 (it is a unit quaternion). Failure to ensure
436*10465441SEvalZero  * this will cause erratic client behaviour.
437*10465441SEvalZero  *
438*10465441SEvalZero  * In addition, this sensor reports an estimated heading accuracy.
439*10465441SEvalZero  *   sensors_event_t.data[4] = estimated_accuracy (in radians)
440*10465441SEvalZero  * The heading error must be less than estimated_accuracy 95% of the time
441*10465441SEvalZero  *
442*10465441SEvalZero  * This sensor must use a gyroscope and an accelerometer as main orientation
443*10465441SEvalZero  * change input.
444*10465441SEvalZero  *
445*10465441SEvalZero  * This sensor can also include magnetometer input to make up for gyro drift,
446*10465441SEvalZero  * but it cannot be implemented using only a magnetometer.
447*10465441SEvalZero  */
448*10465441SEvalZero #define SENSOR_TYPE_ROTATION_VECTOR                 (11)
449*10465441SEvalZero 
450*10465441SEvalZero /*
451*10465441SEvalZero  * SENSOR_TYPE_RELATIVE_HUMIDITY
452*10465441SEvalZero  * trigger-mode: on-change
453*10465441SEvalZero  * wake-up sensor: no
454*10465441SEvalZero  *
455*10465441SEvalZero  * A relative humidity sensor measures relative ambient air humidity and
456*10465441SEvalZero  * returns a value in percent.
457*10465441SEvalZero  */
458*10465441SEvalZero #define SENSOR_TYPE_RELATIVE_HUMIDITY               (12)
459*10465441SEvalZero 
460*10465441SEvalZero /*
461*10465441SEvalZero  * SENSOR_TYPE_AMBIENT_TEMPERATURE
462*10465441SEvalZero  * trigger-mode: on-change
463*10465441SEvalZero  * wake-up sensor: no
464*10465441SEvalZero  *
465*10465441SEvalZero  * The ambient (room) temperature in degree Celsius.
466*10465441SEvalZero  */
467*10465441SEvalZero #define SENSOR_TYPE_AMBIENT_TEMPERATURE             (13)
468*10465441SEvalZero 
469*10465441SEvalZero /*
470*10465441SEvalZero  * SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED
471*10465441SEvalZero  * trigger-mode: continuous
472*10465441SEvalZero  * wake-up sensor: no
473*10465441SEvalZero  *
474*10465441SEvalZero  *  Similar to SENSOR_TYPE_MAGNETIC_FIELD, but the hard iron calibration is
475*10465441SEvalZero  *  reported separately instead of being included in the measurement.
476*10465441SEvalZero  *  Factory calibration and temperature compensation should still be applied to
477*10465441SEvalZero  *  the "uncalibrated" measurement.
478*10465441SEvalZero  *  Separating away the hard iron calibration estimation allows the system to
479*10465441SEvalZero  *  better recover from bad hard iron estimation.
480*10465441SEvalZero  *
481*10465441SEvalZero  *  All values are in micro-Tesla (uT) and measure the ambient magnetic
482*10465441SEvalZero  *  field in the X, Y and Z axis. Assumptions that the the magnetic field
483*10465441SEvalZero  *  is due to the Earth's poles should be avoided.
484*10465441SEvalZero  *
485*10465441SEvalZero  *  The uncalibrated_magnetic event contains
486*10465441SEvalZero  *  - 3 fields for uncalibrated measurement: x_uncalib, y_uncalib, z_uncalib.
487*10465441SEvalZero  *    Each is a component of the measured magnetic field, with soft iron
488*10465441SEvalZero  *    and temperature compensation applied, but not hard iron calibration.
489*10465441SEvalZero  *    These values should be continuous (no re-calibration should cause a jump).
490*10465441SEvalZero  *  - 3 fields for hard iron bias estimates: x_bias, y_bias, z_bias.
491*10465441SEvalZero  *    Each field is a component of the estimated hard iron calibration.
492*10465441SEvalZero  *    They represent the offsets to apply to the calibrated readings to obtain
493*10465441SEvalZero  *    uncalibrated readings (x_uncalib ~= x_calibrated + x_bias)
494*10465441SEvalZero  *    These values are expected to jump as soon as the estimate of the hard iron
495*10465441SEvalZero  *    changes, and they should be stable the rest of the time.
496*10465441SEvalZero  *
497*10465441SEvalZero  *  If this sensor is present, then the corresponding
498*10465441SEvalZero  *  SENSOR_TYPE_MAGNETIC_FIELD must be present and both must return the
499*10465441SEvalZero  *  same sensor_t::name and sensor_t::vendor.
500*10465441SEvalZero  *
501*10465441SEvalZero  *  Minimum filtering should be applied to this sensor. In particular, low pass
502*10465441SEvalZero  *  filters should be avoided.
503*10465441SEvalZero  *
504*10465441SEvalZero  * See SENSOR_TYPE_MAGNETIC_FIELD for more information
505*10465441SEvalZero  */
506*10465441SEvalZero #define SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED     (14)
507*10465441SEvalZero 
508*10465441SEvalZero /*
509*10465441SEvalZero  * SENSOR_TYPE_GAME_ROTATION_VECTOR
510*10465441SEvalZero  * trigger-mode: continuous
511*10465441SEvalZero  * wake-up sensor: no
512*10465441SEvalZero  *
513*10465441SEvalZero  *  Similar to SENSOR_TYPE_ROTATION_VECTOR, but not using the geomagnetic
514*10465441SEvalZero  *  field. Therefore the Y axis doesn't point north, but instead to some other
515*10465441SEvalZero  *  reference. That reference is allowed to drift by the same order of
516*10465441SEvalZero  *  magnitude than the gyroscope drift around the Z axis.
517*10465441SEvalZero  *
518*10465441SEvalZero  *  This sensor does not report an estimated heading accuracy:
519*10465441SEvalZero  *    sensors_event_t.data[4] is reserved and should be set to 0
520*10465441SEvalZero  *
521*10465441SEvalZero  *  In the ideal case, a phone rotated and returning to the same real-world
522*10465441SEvalZero  *  orientation should report the same game rotation vector
523*10465441SEvalZero  *  (without using the earth's geomagnetic field).
524*10465441SEvalZero  *
525*10465441SEvalZero  *  This sensor must be based on a gyroscope. It cannot be implemented using
526*10465441SEvalZero  *  a magnetometer.
527*10465441SEvalZero  *
528*10465441SEvalZero  * see SENSOR_TYPE_ROTATION_VECTOR for more details
529*10465441SEvalZero  */
530*10465441SEvalZero #define SENSOR_TYPE_GAME_ROTATION_VECTOR            (15)
531*10465441SEvalZero 
532*10465441SEvalZero /*
533*10465441SEvalZero  * SENSOR_TYPE_GYROSCOPE_UNCALIBRATED
534*10465441SEvalZero  * trigger-mode: continuous
535*10465441SEvalZero  * wake-up sensor: no
536*10465441SEvalZero  *
537*10465441SEvalZero  *  All values are in radians/second and measure the rate of rotation
538*10465441SEvalZero  *  around the X, Y and Z axis. An estimation of the drift on each axis is
539*10465441SEvalZero  *  reported as well.
540*10465441SEvalZero  *
541*10465441SEvalZero  *  No gyro-drift compensation shall be performed.
542*10465441SEvalZero  *  Factory calibration and temperature compensation should still be applied
543*10465441SEvalZero  *  to the rate of rotation (angular speeds).
544*10465441SEvalZero  *
545*10465441SEvalZero  *  The coordinate system is the same as is
546*10465441SEvalZero  *  used for the acceleration sensor. Rotation is positive in the
547*10465441SEvalZero  *  counter-clockwise direction (right-hand rule). That is, an observer
548*10465441SEvalZero  *  looking from some positive location on the x, y or z axis at a device
549*10465441SEvalZero  *  positioned on the origin would report positive rotation if the device
550*10465441SEvalZero  *  appeared to be rotating counter clockwise. Note that this is the
551*10465441SEvalZero  *  standard mathematical definition of positive rotation and does not agree
552*10465441SEvalZero  *  with the definition of roll given earlier.
553*10465441SEvalZero  *  The range should at least be 17.45 rad/s (ie: ~1000 deg/s).
554*10465441SEvalZero  *
555*10465441SEvalZero  *  Content of an uncalibrated_gyro event: (units are rad/sec)
556*10465441SEvalZero  *   x_uncalib : angular speed (w/o drift compensation) around the X axis
557*10465441SEvalZero  *   y_uncalib : angular speed (w/o drift compensation) around the Y axis
558*10465441SEvalZero  *   z_uncalib : angular speed (w/o drift compensation) around the Z axis
559*10465441SEvalZero  *   x_bias : estimated drift around X axis in rad/s
560*10465441SEvalZero  *   y_bias : estimated drift around Y axis in rad/s
561*10465441SEvalZero  *   z_bias : estimated drift around Z axis in rad/s
562*10465441SEvalZero  *
563*10465441SEvalZero  *  IMPLEMENTATION NOTES:
564*10465441SEvalZero  *
565*10465441SEvalZero  *  If the implementation is not able to estimate the drift, then this
566*10465441SEvalZero  *  sensor MUST NOT be reported by this HAL. Instead, the regular
567*10465441SEvalZero  *  SENSOR_TYPE_GYROSCOPE is used without drift compensation.
568*10465441SEvalZero  *
569*10465441SEvalZero  *  If this sensor is present, then the corresponding
570*10465441SEvalZero  *  SENSOR_TYPE_GYROSCOPE must be present and both must return the
571*10465441SEvalZero  *  same sensor_t::name and sensor_t::vendor.
572*10465441SEvalZero  */
573*10465441SEvalZero #define SENSOR_TYPE_GYROSCOPE_UNCALIBRATED          (16)
574*10465441SEvalZero 
575*10465441SEvalZero /*
576*10465441SEvalZero  * SENSOR_TYPE_SIGNIFICANT_MOTION
577*10465441SEvalZero  * trigger-mode: one-shot
578*10465441SEvalZero  * wake-up sensor: yes
579*10465441SEvalZero  *
580*10465441SEvalZero  * A sensor of this type triggers an event each time significant motion
581*10465441SEvalZero  * is detected and automatically disables itself.
582*10465441SEvalZero  * The only allowed value to return is 1.0.
583*10465441SEvalZero  *
584*10465441SEvalZero  * A significant motion is a motion that might lead to a change in the user
585*10465441SEvalZero  * location.
586*10465441SEvalZero  * Examples of such motions are:
587*10465441SEvalZero  *   walking, biking, sitting in a moving car, coach or train.
588*10465441SEvalZero  * Examples of situations that should not trigger significant motion:
589*10465441SEvalZero  * - phone in pocket and person is not moving
590*10465441SEvalZero  * - phone is on a table, even if the table shakes a bit due to nearby traffic
591*10465441SEvalZero  *   or washing machine
592*10465441SEvalZero  *
593*10465441SEvalZero  * A note on false positive / false negative / power consumption tradeoff
594*10465441SEvalZero  *  - The goal of this sensor is to save power.
595*10465441SEvalZero  *  - Triggering an event when the user is not moving (false positive) is costly
596*10465441SEvalZero  *    in terms of power, so it should be avoided.
597*10465441SEvalZero  *  - Not triggering an event when the user is moving (false negative) is
598*10465441SEvalZero  *    acceptable as long as it is not done repeatedly. If the user has been
599*10465441SEvalZero  *    walking for 10 seconds, not triggering an event within those 10 seconds
600*10465441SEvalZero  *    is not acceptable.
601*10465441SEvalZero  *
602*10465441SEvalZero  *  IMPORTANT NOTE: this sensor type is very different from other types
603*10465441SEvalZero  *  in that it must work when the screen is off without the need of
604*10465441SEvalZero  *  holding a partial wake-lock and MUST allow the SoC to go into suspend.
605*10465441SEvalZero  *  When significant motion is detected, the sensor must awaken the SoC and
606*10465441SEvalZero  *  the event be reported.
607*10465441SEvalZero  *
608*10465441SEvalZero  *  If a particular hardware cannot support this mode of operation then this
609*10465441SEvalZero  *  sensor type MUST NOT be reported by the HAL. ie: it is not acceptable
610*10465441SEvalZero  *  to "emulate" this sensor in the HAL.
611*10465441SEvalZero  *
612*10465441SEvalZero  *  The whole point of this sensor type is to save power by keeping the
613*10465441SEvalZero  *  SoC in suspend mode when the device is at rest.
614*10465441SEvalZero  *
615*10465441SEvalZero  *  When the sensor is not activated, it must also be deactivated in the
616*10465441SEvalZero  *  hardware: it must not wake up the SoC anymore, even in case of
617*10465441SEvalZero  *  significant motion.
618*10465441SEvalZero  *
619*10465441SEvalZero  *  setDelay() has no effect and is ignored.
620*10465441SEvalZero  *  Once a "significant motion" event is returned, a sensor of this type
621*10465441SEvalZero  *  must disables itself automatically, as if activate(..., 0) had been called.
622*10465441SEvalZero  */
623*10465441SEvalZero 
624*10465441SEvalZero #define SENSOR_TYPE_SIGNIFICANT_MOTION              (17)
625*10465441SEvalZero 
626*10465441SEvalZero /*
627*10465441SEvalZero  * SENSOR_TYPE_STEP_DETECTOR
628*10465441SEvalZero  * trigger-mode: special
629*10465441SEvalZero  * wake-up sensor: no
630*10465441SEvalZero  *
631*10465441SEvalZero  * A sensor of this type triggers an event each time a step is taken
632*10465441SEvalZero  * by the user. The only allowed value to return is 1.0 and an event is
633*10465441SEvalZero  * generated for each step. Like with any other event, the timestamp
634*10465441SEvalZero  * indicates when the event (here the step) occurred, this corresponds to when
635*10465441SEvalZero  * the foot hit the ground, generating a high variation in acceleration.
636*10465441SEvalZero  *
637*10465441SEvalZero  * While this sensor operates, it shall not disrupt any other sensors, in
638*10465441SEvalZero  * particular, but not limited to, the accelerometer; which might very well
639*10465441SEvalZero  * be in use as well.
640*10465441SEvalZero  *
641*10465441SEvalZero  * This sensor must be low power. That is, if the step detection cannot be
642*10465441SEvalZero  * done in hardware, this sensor should not be defined. Also, when the
643*10465441SEvalZero  * step detector is activated and the accelerometer is not, only steps should
644*10465441SEvalZero  * trigger interrupts (not accelerometer data).
645*10465441SEvalZero  *
646*10465441SEvalZero  * setDelay() has no impact on this sensor type
647*10465441SEvalZero  */
648*10465441SEvalZero 
649*10465441SEvalZero #define SENSOR_TYPE_STEP_DETECTOR                   (18)
650*10465441SEvalZero 
651*10465441SEvalZero /*
652*10465441SEvalZero  * SENSOR_TYPE_STEP_COUNTER
653*10465441SEvalZero  * trigger-mode: on-change
654*10465441SEvalZero  * wake-up sensor: no
655*10465441SEvalZero  *
656*10465441SEvalZero  * A sensor of this type returns the number of steps taken by the user since
657*10465441SEvalZero  * the last reboot while activated. The value is returned as a uint64_t and is
658*10465441SEvalZero  * reset to zero only on a system / android reboot.
659*10465441SEvalZero  *
660*10465441SEvalZero  * The timestamp of the event is set to the time when the first step
661*10465441SEvalZero  * for that event was taken.
662*10465441SEvalZero  * See SENSOR_TYPE_STEP_DETECTOR for the signification of the time of a step.
663*10465441SEvalZero  *
664*10465441SEvalZero  *  The minimum size of the hardware's internal counter shall be 16 bits
665*10465441SEvalZero  *  (this restriction is here to avoid too frequent wake-ups when the
666*10465441SEvalZero  *  delay is very large).
667*10465441SEvalZero  *
668*10465441SEvalZero  *  IMPORTANT NOTE: this sensor type is different from other types
669*10465441SEvalZero  *  in that it must work when the screen is off without the need of
670*10465441SEvalZero  *  holding a partial wake-lock and MUST allow the SoC to go into suspend.
671*10465441SEvalZero  *  Unlike other sensors, while in suspend mode this sensor must stay active,
672*10465441SEvalZero  *  no events are reported during that time but, steps continue to be
673*10465441SEvalZero  *  accounted for; an event will be reported as soon as the SoC resumes if
674*10465441SEvalZero  *  the timeout has expired.
675*10465441SEvalZero  *
676*10465441SEvalZero  *    In other words, when the screen is off and the device allowed to
677*10465441SEvalZero  *    go into suspend mode, we don't want to be woken up, regardless of the
678*10465441SEvalZero  *    setDelay() value, but the steps shall continue to be counted.
679*10465441SEvalZero  *
680*10465441SEvalZero  *    The driver must however ensure that the internal step count never
681*10465441SEvalZero  *    overflows. It is allowed in this situation to wake the SoC up so the
682*10465441SEvalZero  *    driver can do the counter maintenance.
683*10465441SEvalZero  *
684*10465441SEvalZero  *  While this sensor operates, it shall not disrupt any other sensors, in
685*10465441SEvalZero  *  particular, but not limited to, the accelerometer; which might very well
686*10465441SEvalZero  *  be in use as well.
687*10465441SEvalZero  *
688*10465441SEvalZero  *  If a particular hardware cannot support these modes of operation then this
689*10465441SEvalZero  *  sensor type MUST NOT be reported by the HAL. ie: it is not acceptable
690*10465441SEvalZero  *  to "emulate" this sensor in the HAL.
691*10465441SEvalZero  *
692*10465441SEvalZero  * This sensor must be low power. That is, if the step detection cannot be
693*10465441SEvalZero  * done in hardware, this sensor should not be defined. Also, when the
694*10465441SEvalZero  * step counter is activated and the accelerometer is not, only steps should
695*10465441SEvalZero  * trigger interrupts (not accelerometer data).
696*10465441SEvalZero  *
697*10465441SEvalZero  *  The whole point of this sensor type is to save power by keeping the
698*10465441SEvalZero  *  SoC in suspend mode when the device is at rest.
699*10465441SEvalZero  */
700*10465441SEvalZero 
701*10465441SEvalZero #define SENSOR_TYPE_STEP_COUNTER                    (19)
702*10465441SEvalZero 
703*10465441SEvalZero /*
704*10465441SEvalZero  * SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR
705*10465441SEvalZero  * trigger-mode: continuous
706*10465441SEvalZero  * wake-up sensor: no
707*10465441SEvalZero  *
708*10465441SEvalZero  *  Similar to SENSOR_TYPE_ROTATION_VECTOR, but using a magnetometer instead
709*10465441SEvalZero  *  of using a gyroscope.
710*10465441SEvalZero  *
711*10465441SEvalZero  *  This sensor must be based on a magnetometer. It cannot be implemented using
712*10465441SEvalZero  *  a gyroscope, and gyroscope input cannot be used by this sensor, as the
713*10465441SEvalZero  *  goal of this sensor is to be low power.
714*10465441SEvalZero  *  The accelerometer can be (and usually is) used.
715*10465441SEvalZero  *
716*10465441SEvalZero  *  Just like SENSOR_TYPE_ROTATION_VECTOR, this sensor reports an estimated
717*10465441SEvalZero  *  heading accuracy:
718*10465441SEvalZero  *    sensors_event_t.data[4] = estimated_accuracy (in radians)
719*10465441SEvalZero  *  The heading error must be less than estimated_accuracy 95% of the time
720*10465441SEvalZero  *
721*10465441SEvalZero  * see SENSOR_TYPE_ROTATION_VECTOR for more details
722*10465441SEvalZero  */
723*10465441SEvalZero #define SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR            (20)
724*10465441SEvalZero 
725*10465441SEvalZero /**
726*10465441SEvalZero  * Values returned by the accelerometer in various locations in the universe.
727*10465441SEvalZero  * all values are in SI units (m/s^2)
728*10465441SEvalZero  */
729*10465441SEvalZero #define SENSORS_GRAVITY_SUN                 (275.0f)
730*10465441SEvalZero #define SENSORS_GRAVITY_MOON                (1.6f)
731*10465441SEvalZero #define SENSORS_GRAVITY_EARTH               (9.80665f)
732*10465441SEvalZero #define SENSORS_GRAVITY_STANDARD            (SENSORS_GRAVITY_EARTH)
733*10465441SEvalZero 
734*10465441SEvalZero /** Maximum magnetic field on Earth's surface */
735*10465441SEvalZero #define MAGNETIC_FIELD_EARTH_MAX            (60.0f)
736*10465441SEvalZero 
737*10465441SEvalZero /** Minimum magnetic field on Earth's surface */
738*10465441SEvalZero #define MAGNETIC_FIELD_EARTH_MIN            (30.0f)
739*10465441SEvalZero 
740*10465441SEvalZero /** Average sea level pressure is 1013.25 hPa */
741*10465441SEvalZero #define SENSORS_PRESSURE_SEALEVELHPA        (1013.25F)
742*10465441SEvalZero 
743*10465441SEvalZero /** Degrees/s to rad/s multiplier */
744*10465441SEvalZero #define SENSORS_DPS_TO_RADS                 (0.017453293F)
745*10465441SEvalZero /** Gauss to micro-Tesla multiplier */
746*10465441SEvalZero #define SENSORS_GAUSS_TO_MICROTESLA         (100)
747*10465441SEvalZero 
748*10465441SEvalZero /**
749*10465441SEvalZero  * status of orientation sensor
750*10465441SEvalZero  */
751*10465441SEvalZero #define SENSOR_STATUS_UNRELIABLE        0
752*10465441SEvalZero #define SENSOR_STATUS_ACCURACY_LOW      1
753*10465441SEvalZero #define SENSOR_STATUS_ACCURACY_MEDIUM   2
754*10465441SEvalZero #define SENSOR_STATUS_ACCURACY_HIGH     3
755*10465441SEvalZero 
756*10465441SEvalZero /**
757*10465441SEvalZero  * sensor event data
758*10465441SEvalZero  */
759*10465441SEvalZero typedef struct
760*10465441SEvalZero {
761*10465441SEvalZero     union
762*10465441SEvalZero     {
763*10465441SEvalZero         float v[3];
764*10465441SEvalZero         struct
765*10465441SEvalZero         {
766*10465441SEvalZero             float x;
767*10465441SEvalZero             float y;
768*10465441SEvalZero             float z;
769*10465441SEvalZero         };
770*10465441SEvalZero         struct
771*10465441SEvalZero         {
772*10465441SEvalZero             float azimuth;
773*10465441SEvalZero             float pitch;
774*10465441SEvalZero             float roll;
775*10465441SEvalZero         };
776*10465441SEvalZero     };
777*10465441SEvalZero     int8_t status;
778*10465441SEvalZero     uint8_t reserved[3];
779*10465441SEvalZero } sensors_vec_t;
780*10465441SEvalZero 
781*10465441SEvalZero /**
782*10465441SEvalZero  * sensor raw vector data
783*10465441SEvalZero  */
784*10465441SEvalZero typedef struct
785*10465441SEvalZero {
786*10465441SEvalZero     struct
787*10465441SEvalZero     {
788*10465441SEvalZero         int16_t x;
789*10465441SEvalZero         int16_t y;
790*10465441SEvalZero         int16_t z;
791*10465441SEvalZero     };
792*10465441SEvalZero 
793*10465441SEvalZero     int8_t status;
794*10465441SEvalZero     uint8_t reserved[1];
795*10465441SEvalZero } sensors_raw_vec_t;
796*10465441SEvalZero 
797*10465441SEvalZero /**
798*10465441SEvalZero  * uncalibrated gyroscope and magnetometer event data
799*10465441SEvalZero  */
800*10465441SEvalZero typedef struct
801*10465441SEvalZero {
802*10465441SEvalZero     union
803*10465441SEvalZero     {
804*10465441SEvalZero         float uncalib[3];
805*10465441SEvalZero         struct
806*10465441SEvalZero         {
807*10465441SEvalZero             float x_uncalib;
808*10465441SEvalZero             float y_uncalib;
809*10465441SEvalZero             float z_uncalib;
810*10465441SEvalZero         };
811*10465441SEvalZero     };
812*10465441SEvalZero     union
813*10465441SEvalZero     {
814*10465441SEvalZero         float bias[3];
815*10465441SEvalZero         struct
816*10465441SEvalZero         {
817*10465441SEvalZero             float x_bias;
818*10465441SEvalZero             float y_bias;
819*10465441SEvalZero             float z_bias;
820*10465441SEvalZero         };
821*10465441SEvalZero     };
822*10465441SEvalZero } uncalibrated_event_t;
823*10465441SEvalZero 
824*10465441SEvalZero typedef struct meta_data_event
825*10465441SEvalZero {
826*10465441SEvalZero     int32_t what;
827*10465441SEvalZero     int32_t sensor;
828*10465441SEvalZero } meta_data_event_t;
829*10465441SEvalZero 
830*10465441SEvalZero /**
831*10465441SEvalZero  * Union of the various types of sensor data
832*10465441SEvalZero  * that can be returned.
833*10465441SEvalZero  */
834*10465441SEvalZero typedef struct sensors_event_t
835*10465441SEvalZero {
836*10465441SEvalZero     /* must be sizeof(struct sensors_event_t) */
837*10465441SEvalZero     int32_t version;
838*10465441SEvalZero 
839*10465441SEvalZero     /* sensor identifier */
840*10465441SEvalZero     int32_t sensor;
841*10465441SEvalZero 
842*10465441SEvalZero     /* sensor type */
843*10465441SEvalZero     int32_t type;
844*10465441SEvalZero 
845*10465441SEvalZero     /* reserved */
846*10465441SEvalZero     int32_t reserved0;
847*10465441SEvalZero 
848*10465441SEvalZero     /* time is in nanosecond */
849*10465441SEvalZero     int64_t timestamp;
850*10465441SEvalZero 
851*10465441SEvalZero     union
852*10465441SEvalZero     {
853*10465441SEvalZero         union
854*10465441SEvalZero         {
855*10465441SEvalZero             float           data[16];
856*10465441SEvalZero 
857*10465441SEvalZero             /* acceleration values are in meter per second per second (m/s^2) */
858*10465441SEvalZero             sensors_vec_t   acceleration;
859*10465441SEvalZero             /* raw acceleration data */
860*10465441SEvalZero             sensors_raw_vec_t raw_acceleration;
861*10465441SEvalZero 
862*10465441SEvalZero             /* magnetic vector values are in micro-Tesla (uT) */
863*10465441SEvalZero             sensors_vec_t   magnetic;
864*10465441SEvalZero             /* raw magnetic data */
865*10465441SEvalZero             sensors_raw_vec_t raw_magnetic;
866*10465441SEvalZero 
867*10465441SEvalZero             /* orientation values are in degrees */
868*10465441SEvalZero             sensors_vec_t   orientation;
869*10465441SEvalZero 
870*10465441SEvalZero             /* gyroscope values are in rad/s */
871*10465441SEvalZero             sensors_vec_t   gyro;
872*10465441SEvalZero             /* raw gyroscope data */
873*10465441SEvalZero             sensors_raw_vec_t raw_gyro;
874*10465441SEvalZero 
875*10465441SEvalZero             /* temperature is in degrees centigrade (Celsius) */
876*10465441SEvalZero             float           temperature;
877*10465441SEvalZero 
878*10465441SEvalZero             /* distance in centimeters */
879*10465441SEvalZero             float           distance;
880*10465441SEvalZero 
881*10465441SEvalZero             /* light in SI lux units */
882*10465441SEvalZero             float           light;
883*10465441SEvalZero 
884*10465441SEvalZero             /* pressure in hectopascal (hPa) */
885*10465441SEvalZero             float           pressure;
886*10465441SEvalZero 
887*10465441SEvalZero             /* relative humidity in percent */
888*10465441SEvalZero             float           relative_humidity;
889*10465441SEvalZero 
890*10465441SEvalZero             /* uncalibrated gyroscope values are in rad/s */
891*10465441SEvalZero             uncalibrated_event_t uncalibrated_gyro;
892*10465441SEvalZero 
893*10465441SEvalZero             /* uncalibrated magnetometer values are in micro-Teslas */
894*10465441SEvalZero             uncalibrated_event_t uncalibrated_magnetic;
895*10465441SEvalZero 
896*10465441SEvalZero             /* this is a special event. see SENSOR_TYPE_META_DATA above.
897*10465441SEvalZero              * sensors_meta_data_event_t events are all reported with a type of
898*10465441SEvalZero              * SENSOR_TYPE_META_DATA. The handle is ignored and must be zero.
899*10465441SEvalZero              */
900*10465441SEvalZero             meta_data_event_t meta_data;
901*10465441SEvalZero         };
902*10465441SEvalZero 
903*10465441SEvalZero         union
904*10465441SEvalZero         {
905*10465441SEvalZero             uint64_t        data[8];
906*10465441SEvalZero 
907*10465441SEvalZero             /* step-counter */
908*10465441SEvalZero             uint64_t        step_counter;
909*10465441SEvalZero         } u64;
910*10465441SEvalZero     };
911*10465441SEvalZero     uint32_t reserved1[4];
912*10465441SEvalZero } sensors_event_t;
913*10465441SEvalZero 
914*10465441SEvalZero /* see SENSOR_TYPE_META_DATA */
915*10465441SEvalZero typedef sensors_event_t sensors_meta_data_event_t;
916*10465441SEvalZero 
917*10465441SEvalZero typedef struct sensor_t
918*10465441SEvalZero {
919*10465441SEvalZero     /* Name of this sensor.
920*10465441SEvalZero      * All sensors of the same "type" must have a different "name".
921*10465441SEvalZero      */
922*10465441SEvalZero     const char     *name;
923*10465441SEvalZero 
924*10465441SEvalZero     /* vendor of the hardware part */
925*10465441SEvalZero     const char     *vendor;
926*10465441SEvalZero 
927*10465441SEvalZero     /* version of the hardware part + driver. The value of this field
928*10465441SEvalZero      * must increase when the driver is updated in a way that changes the
929*10465441SEvalZero      * output of this sensor. This is important for fused sensors when the
930*10465441SEvalZero      * fusion algorithm is updated.
931*10465441SEvalZero      */
932*10465441SEvalZero     int             version;
933*10465441SEvalZero 
934*10465441SEvalZero     /* handle that identifies this sensors. This handle is used to reference
935*10465441SEvalZero      * this sensor throughout the HAL API.
936*10465441SEvalZero      */
937*10465441SEvalZero     int             handle;
938*10465441SEvalZero 
939*10465441SEvalZero     /* this sensor's type. */
940*10465441SEvalZero     int             type;
941*10465441SEvalZero 
942*10465441SEvalZero     /* maximum range of this sensor's value in SI units */
943*10465441SEvalZero     float           maxRange;
944*10465441SEvalZero 
945*10465441SEvalZero     /* smallest difference between two values reported by this sensor */
946*10465441SEvalZero     float           resolution;
947*10465441SEvalZero 
948*10465441SEvalZero     /* rough estimate of this sensor's power consumption in mA */
949*10465441SEvalZero     float           power;
950*10465441SEvalZero 
951*10465441SEvalZero     /* this value depends on the trigger mode:
952*10465441SEvalZero      *
953*10465441SEvalZero      *   continuous: minimum sample period allowed in microseconds
954*10465441SEvalZero      *   on-change : 0
955*10465441SEvalZero      *   one-shot  :-1
956*10465441SEvalZero      *   special   : 0, unless otherwise noted
957*10465441SEvalZero      */
958*10465441SEvalZero     int32_t         minDelay;
959*10465441SEvalZero 
960*10465441SEvalZero     /* number of events reserved for this sensor in the batch mode FIFO.
961*10465441SEvalZero      * If there is a dedicated FIFO for this sensor, then this is the
962*10465441SEvalZero      * size of this FIFO. If the FIFO is shared with other sensors,
963*10465441SEvalZero      * this is the size reserved for that sensor and it can be zero.
964*10465441SEvalZero      */
965*10465441SEvalZero     uint32_t        fifoReservedEventCount;
966*10465441SEvalZero 
967*10465441SEvalZero     /* maximum number of events of this sensor that could be batched.
968*10465441SEvalZero      * This is especially relevant when the FIFO is shared between
969*10465441SEvalZero      * several sensors; this value is then set to the size of that FIFO.
970*10465441SEvalZero      */
971*10465441SEvalZero     uint32_t        fifoMaxEventCount;
972*10465441SEvalZero 
973*10465441SEvalZero     /* reserved fields, must be zero */
974*10465441SEvalZero     void           *reserved[6];
975*10465441SEvalZero } sensor_t;
976*10465441SEvalZero 
977*10465441SEvalZero enum SensorMode
978*10465441SEvalZero {
979*10465441SEvalZero     SENSOR_MODE_RAW,
980*10465441SEvalZero     SENSOR_MODE_CALIBRATED,
981*10465441SEvalZero     SENSOR_MODE_NORMAL,
982*10465441SEvalZero };
983*10465441SEvalZero 
984*10465441SEvalZero enum SensorAccelRange
985*10465441SEvalZero {
986*10465441SEvalZero     SENSOR_ACCEL_RANGE_2G,
987*10465441SEvalZero     SENSOR_ACCEL_RANGE_4G,
988*10465441SEvalZero     SENSOR_ACCEL_RANGE_8G,
989*10465441SEvalZero     SENSOR_ACCEL_RANGE_16G,
990*10465441SEvalZero };
991*10465441SEvalZero #define SENSOR_ACCEL_SENSITIVITY_2G  ((float)2/32768)
992*10465441SEvalZero #define SENSOR_ACCEL_SENSITIVITY_4G  ((float)4/32768)
993*10465441SEvalZero #define SENSOR_ACCEL_SENSITIVITY_8G  ((float)8/32768)
994*10465441SEvalZero #define SENSOR_ACCEL_SENSITIVITY_16G ((float)16/32768)
995*10465441SEvalZero 
996*10465441SEvalZero enum SensorGyroRange
997*10465441SEvalZero {
998*10465441SEvalZero     SENSOR_GYRO_RANGE_250DPS,
999*10465441SEvalZero     SENSOR_GYRO_RANGE_500DPS,
1000*10465441SEvalZero     SENSOR_GYRO_RANGE_1000DPS,
1001*10465441SEvalZero     SENSOR_GYRO_RANGE_2000DPS,
1002*10465441SEvalZero };
1003*10465441SEvalZero #define SENSOR_GYRO_SENSITIVITY_250DPS  (0.00875F)
1004*10465441SEvalZero #define SENSOR_GYRO_SENSITIVITY_500DPS  (0.0175F)
1005*10465441SEvalZero #define SENSOR_GYRO_SENSITIVITY_1000DPS (0.035F)
1006*10465441SEvalZero #define SENSOR_GYRO_SENSITIVITY_2000DPS (0.070F)
1007*10465441SEvalZero 
1008*10465441SEvalZero enum SensorDataRate
1009*10465441SEvalZero {
1010*10465441SEvalZero     SENSOR_DATARATE_3200HZ,
1011*10465441SEvalZero     SENSOR_DATARATE_1600HZ,
1012*10465441SEvalZero     SENSOR_DATARATE_800HZ,
1013*10465441SEvalZero     SENSOR_DATARATE_400HZ,
1014*10465441SEvalZero     SENSOR_DATARATE_200HZ,
1015*10465441SEvalZero     SENSOR_DATARATE_100HZ,
1016*10465441SEvalZero     SENSOR_DATARATE_50HZ,
1017*10465441SEvalZero     SENSOR_DATARATE_25HZ,
1018*10465441SEvalZero     SENSOR_DATARATE_12_5HZ,
1019*10465441SEvalZero     SENSOR_DATARATE_6_25HZ,
1020*10465441SEvalZero     SENSOR_DATARATE_3_13HZ,
1021*10465441SEvalZero     SENSOR_DATARATE_1_56HZ,
1022*10465441SEvalZero     SENSOR_DATARATE_0_78HZ,
1023*10465441SEvalZero     SENSOR_DATARATE_0_39HZ,
1024*10465441SEvalZero     SENSOR_DATARATE_0_20HZ,
1025*10465441SEvalZero     SENSOR_DATARATE_0_10HZ,
1026*10465441SEvalZero };
1027*10465441SEvalZero 
1028*10465441SEvalZero /**
1029*10465441SEvalZero  * Sensor Configuration
1030*10465441SEvalZero  */
1031*10465441SEvalZero typedef struct SensorConfig
1032*10465441SEvalZero {
1033*10465441SEvalZero     int mode;
1034*10465441SEvalZero 
1035*10465441SEvalZero     enum SensorDataRate data_rate;
1036*10465441SEvalZero 
1037*10465441SEvalZero     union range
1038*10465441SEvalZero     {
1039*10465441SEvalZero         int range;
1040*10465441SEvalZero         enum SensorAccelRange accel_range;
1041*10465441SEvalZero         enum SensorGyroRange  gyro_range;
1042*10465441SEvalZero     } range;
1043*10465441SEvalZero }SensorConfig;
1044*10465441SEvalZero 
1045*10465441SEvalZero typedef void (*SensorEventHandler_t)(void *user_data);
1046*10465441SEvalZero 
1047*10465441SEvalZero #ifdef __cplusplus
1048*10465441SEvalZero class SensorBase;
1049*10465441SEvalZero class SensorManager;
1050*10465441SEvalZero 
1051*10465441SEvalZero /**
1052*10465441SEvalZero  * Sensor Base Class
1053*10465441SEvalZero  */
1054*10465441SEvalZero class SensorBase
1055*10465441SEvalZero {
1056*10465441SEvalZero private:
1057*10465441SEvalZero     int type;
1058*10465441SEvalZero 
1059*10465441SEvalZero public:
1060*10465441SEvalZero     SensorBase(int type);
1061*10465441SEvalZero     ~SensorBase();
1062*10465441SEvalZero 
1063*10465441SEvalZero     virtual int configure(SensorConfig *config) = 0;
1064*10465441SEvalZero     virtual int activate(int enable) = 0;
1065*10465441SEvalZero 
1066*10465441SEvalZero     virtual int poll(sensors_event_t *events) = 0;
1067*10465441SEvalZero     virtual void getSensor(struct sensor_t *sensor) = 0;
1068*10465441SEvalZero 
1069*10465441SEvalZero     int getType(void);
1070*10465441SEvalZero 
1071*10465441SEvalZero     int setConfig(SensorConfig *config);
1072*10465441SEvalZero     int getConfig(SensorConfig *config);
1073*10465441SEvalZero 
1074*10465441SEvalZero     int subscribe(SensorEventHandler_t handler, void *user_data);
1075*10465441SEvalZero     int publish(void);
1076*10465441SEvalZero 
1077*10465441SEvalZero protected:
1078*10465441SEvalZero     SensorBase *next;
1079*10465441SEvalZero     SensorBase *prev;
1080*10465441SEvalZero 
1081*10465441SEvalZero     /* sensor configuration */
1082*10465441SEvalZero     SensorConfig config;
1083*10465441SEvalZero 
1084*10465441SEvalZero     SensorEventHandler_t evtHandler;
1085*10465441SEvalZero     void *userData;
1086*10465441SEvalZero 
1087*10465441SEvalZero     friend class SensorManager;
1088*10465441SEvalZero };
1089*10465441SEvalZero 
1090*10465441SEvalZero /**
1091*10465441SEvalZero  * Sensor Manager
1092*10465441SEvalZero  */
1093*10465441SEvalZero class SensorManager
1094*10465441SEvalZero {
1095*10465441SEvalZero public:
1096*10465441SEvalZero     SensorManager();
1097*10465441SEvalZero     ~SensorManager();
1098*10465441SEvalZero 
1099*10465441SEvalZero     static int registerSensor(SensorBase *sensor);
1100*10465441SEvalZero     static int unregisterSensor(SensorBase *sensor);
1101*10465441SEvalZero 
1102*10465441SEvalZero     static SensorBase *getDefaultSensor(int type);
1103*10465441SEvalZero     static int subscribe(int type, SensorEventHandler_t handler, void *user_data);
1104*10465441SEvalZero 
1105*10465441SEvalZero     static int sensorEventReady(SensorBase *sensor);
1106*10465441SEvalZero     static int pollSensor(SensorBase *sensor, sensors_event_t *events, int number, int duration);
1107*10465441SEvalZero };
1108*10465441SEvalZero #endif
1109*10465441SEvalZero 
1110*10465441SEvalZero /* C programming language APIs */
1111*10465441SEvalZero /* rt_sensor_t is a C typedef for SensorBase */
1112*10465441SEvalZero typedef void* rt_sensor_t;
1113*10465441SEvalZero 
1114*10465441SEvalZero #ifdef __cplusplus
1115*10465441SEvalZero extern "C" {
1116*10465441SEvalZero #endif
1117*10465441SEvalZero 
1118*10465441SEvalZero rt_sensor_t rt_sensor_get_default(int type);
1119*10465441SEvalZero 
1120*10465441SEvalZero int rt_sensor_subscribe(rt_sensor_t sensor, SensorEventHandler_t handler, void *user_data);
1121*10465441SEvalZero int rt_sensor_activate (rt_sensor_t sensor, int enable);
1122*10465441SEvalZero int rt_sensor_configure(rt_sensor_t sensor, SensorConfig *config);
1123*10465441SEvalZero int rt_sensor_poll(rt_sensor_t sensor, sensors_event_t *event);
1124*10465441SEvalZero 
1125*10465441SEvalZero #ifdef __cplusplus
1126*10465441SEvalZero }
1127*10465441SEvalZero #endif
1128*10465441SEvalZero 
1129*10465441SEvalZero #endif
1130