Home | History | Annotate | Download | only in hardware
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_SENSORS_INTERFACE_H
     18 #define ANDROID_SENSORS_INTERFACE_H
     19 
     20 #include <stdint.h>
     21 #include <sys/cdefs.h>
     22 #include <sys/types.h>
     23 
     24 #include <hardware/hardware.h>
     25 #include <cutils/native_handle.h>
     26 
     27 __BEGIN_DECLS
     28 
     29 /*****************************************************************************/
     30 
     31 #define SENSORS_HEADER_VERSION          1
     32 #define SENSORS_MODULE_API_VERSION_0_1  HARDWARE_MODULE_API_VERSION(0, 1)
     33 #define SENSORS_DEVICE_API_VERSION_0_1  HARDWARE_DEVICE_API_VERSION_2(0, 1, SENSORS_HEADER_VERSION)
     34 #define SENSORS_DEVICE_API_VERSION_1_0  HARDWARE_DEVICE_API_VERSION_2(1, 0, SENSORS_HEADER_VERSION)
     35 
     36 /**
     37  * The id of this module
     38  */
     39 #define SENSORS_HARDWARE_MODULE_ID "sensors"
     40 
     41 /**
     42  * Name of the sensors device to open
     43  */
     44 #define SENSORS_HARDWARE_POLL       "poll"
     45 
     46 /**
     47  * Handles must be higher than SENSORS_HANDLE_BASE and must be unique.
     48  * A Handle identifies a given sensors. The handle is used to activate
     49  * and/or deactivate sensors.
     50  * In this version of the API there can only be 256 handles.
     51  */
     52 #define SENSORS_HANDLE_BASE             0
     53 #define SENSORS_HANDLE_BITS             8
     54 #define SENSORS_HANDLE_COUNT            (1<<SENSORS_HANDLE_BITS)
     55 
     56 
     57 /*
     58  * flags for (*batch)()
     59  * Availability: SENSORS_DEVICE_API_VERSION_1_0
     60  * see (*batch)() documentation for details
     61  */
     62 enum {
     63     SENSORS_BATCH_DRY_RUN               = 0x00000001,
     64     SENSORS_BATCH_WAKE_UPON_FIFO_FULL   = 0x00000002
     65 };
     66 
     67 /**
     68  * Definition of the axis used by the sensor HAL API
     69  *
     70  * This API is relative to the screen of the device in its default orientation,
     71  * that is, if the device can be used in portrait or landscape, this API
     72  * is only relative to the NATURAL orientation of the screen. In other words,
     73  * the axis are not swapped when the device's screen orientation changes.
     74  * Higher level services /may/ perform this transformation.
     75  *
     76  *   x<0         x>0
     77  *                ^
     78  *                |
     79  *    +-----------+-->  y>0
     80  *    |           |
     81  *    |           |
     82  *    |           |
     83  *    |           |   / z<0
     84  *    |           |  /
     85  *    |           | /
     86  *    O-----------+/
     87  *    |[]  [ ]  []/
     88  *    +----------/+     y<0
     89  *              /
     90  *             /
     91  *           |/ z>0 (toward the sky)
     92  *
     93  *    O: Origin (x=0,y=0,z=0)
     94  *
     95  */
     96 
     97 /*
     98  * Interaction with suspend mode
     99  *
    100  * Unless otherwise noted, an enabled sensor shall not prevent the
    101  * SoC to go into suspend mode. It is the responsibility of applications
    102  * to keep a partial wake-lock should they wish to receive sensor
    103  * events while the screen is off. While in suspend mode, and unless
    104  * otherwise noted (batch mode, sensor particularities, ...), enabled sensors'
    105  * events are lost.
    106  *
    107  * Note that conceptually, the sensor itself is not de-activated while in
    108  * suspend mode -- it's just that the data it returns are lost. As soon as
    109  * the SoC gets out of suspend mode, operations resume as usual. Of course,
    110  * in practice sensors shall be disabled while in suspend mode to
    111  * save power, unless batch mode is active, in which case they must
    112  * continue fill their internal FIFO (see the documentation of batch() to
    113  * learn how suspend interacts with batch mode).
    114  *
    115  * In batch mode, and only when the flag SENSORS_BATCH_WAKE_UPON_FIFO_FULL is
    116  * set and supported, the specified sensor must be able to wake-up the SoC and
    117  * be able to buffer at least 10 seconds worth of the requested sensor events.
    118  *
    119  * There are notable exceptions to this behavior, which are sensor-dependent
    120  * (see sensor types definitions below)
    121  *
    122  *
    123  * The sensor type documentation below specifies the wake-up behavior of
    124  * each sensor:
    125  *   wake-up: yes     this sensor must wake-up the SoC to deliver events
    126  *   wake-up: no      this sensor shall not wake-up the SoC, events are dropped
    127  *
    128  */
    129 
    130 /*
    131  * Sensor type
    132  *
    133  * Each sensor has a type which defines what this sensor measures and how
    134  * measures are reported. All types are defined below.
    135  */
    136 
    137 /*
    138  * Sensor fusion and virtual sensors
    139  *
    140  * Many sensor types are or can be implemented as virtual sensors from
    141  * physical sensors on the device. For instance the rotation vector sensor,
    142  * orientation sensor, step-detector, step-counter, etc...
    143  *
    144  * From the point of view of this API these virtual sensors MUST appear as
    145  * real, individual sensors. It is the responsibility of the driver and HAL
    146  * to make sure this is the case.
    147  *
    148  * In particular, all sensors must be able to function concurrently.
    149  * For example, if defining both an accelerometer and a step counter,
    150  * then both must be able to work concurrently.
    151  */
    152 
    153 /*
    154  * Trigger modes
    155  *
    156  * Sensors can report events in different ways called trigger modes,
    157  * each sensor type has one and only one trigger mode associated to it.
    158  * Currently there are four trigger modes defined:
    159  *
    160  * continuous: events are reported at a constant rate defined by setDelay().
    161  *             eg: accelerometers, gyroscopes.
    162  * on-change:  events are reported only if the sensor's value has changed.
    163  *             setDelay() is used to set a lower limit to the reporting
    164  *             period (minimum time between two events).
    165  *             The HAL must return an event immediately when an on-change
    166  *             sensor is activated.
    167  *             eg: proximity, light sensors
    168  * one-shot:   upon detection of an event, the sensor deactivates itself and
    169  *             then sends a single event. Order matters to avoid race
    170  *             conditions. No other event is sent until the sensor get
    171  *             reactivated. setDelay() is ignored.
    172  *             eg: significant motion sensor
    173  * special:    see details in the sensor type specification below
    174  *
    175  */
    176 
    177 /*
    178  * SENSOR_TYPE_ACCELEROMETER
    179  * trigger-mode: continuous
    180  * wake-up sensor: no
    181  *
    182  *  All values are in SI units (m/s^2) and measure the acceleration of the
    183  *  device minus the force of gravity.
    184  *
    185  *  Acceleration sensors return sensor events for all 3 axes at a constant
    186  *  rate defined by setDelay().
    187  *
    188  *  x: Acceleration on the x-axis
    189  *  y: Acceleration on the y-axis
    190  *  z: Acceleration on the z-axis
    191  *
    192  * Note that the readings from the accelerometer include the acceleration
    193  * due to gravity (which is opposite to the direction of the gravity vector).
    194  *
    195  *  Examples:
    196  *    The norm of <x, y, z>  should be close to 0 when in free fall.
    197  *
    198  *    When the device lies flat on a table and is pushed on its left side
    199  *    toward the right, the x acceleration value is positive.
    200  *
    201  *    When the device lies flat on a table, the acceleration value is +9.81,
    202  *    which correspond to the acceleration of the device (0 m/s^2) minus the
    203  *    force of gravity (-9.81 m/s^2).
    204  *
    205  *    When the device lies flat on a table and is pushed toward the sky, the
    206  *    acceleration value is greater than +9.81, which correspond to the
    207  *    acceleration of the device (+A m/s^2) minus the force of
    208  *    gravity (-9.81 m/s^2).
    209  */
    210 #define SENSOR_TYPE_ACCELEROMETER                    (1)
    211 
    212 /*
    213  * SENSOR_TYPE_GEOMAGNETIC_FIELD
    214  * trigger-mode: continuous
    215  * wake-up sensor: no
    216  *
    217  *  All values are in micro-Tesla (uT) and measure the geomagnetic
    218  *  field in the X, Y and Z axis.
    219  *
    220  *  Returned values include calibration mechanisms such that the vector is
    221  *  aligned with the magnetic declination and heading of the earth's
    222  *  geomagnetic field.
    223  *
    224  *  Magnetic Field sensors return sensor events for all 3 axes at a constant
    225  *  rate defined by setDelay().
    226  */
    227 #define SENSOR_TYPE_GEOMAGNETIC_FIELD                (2)
    228 #define SENSOR_TYPE_MAGNETIC_FIELD  SENSOR_TYPE_GEOMAGNETIC_FIELD
    229 
    230 /*
    231  * SENSOR_TYPE_ORIENTATION
    232  * trigger-mode: continuous
    233  * wake-up sensor: no
    234  *
    235  * All values are angles in degrees.
    236  *
    237  * Orientation sensors return sensor events for all 3 axes at a constant
    238  * rate defined by setDelay().
    239  *
    240  * azimuth: angle between the magnetic north direction and the Y axis, around
    241  *  the Z axis (0<=azimuth<360).
    242  *      0=North, 90=East, 180=South, 270=West
    243  *
    244  * pitch: Rotation around X axis (-180<=pitch<=180), with positive values when
    245  *  the z-axis moves toward the y-axis.
    246  *
    247  * roll: Rotation around Y axis (-90<=roll<=90), with positive values when
    248  *  the x-axis moves towards the z-axis.
    249  *
    250  * Note: For historical reasons the roll angle is positive in the clockwise
    251  *  direction (mathematically speaking, it should be positive in the
    252  *  counter-clockwise direction):
    253  *
    254  *                Z
    255  *                ^
    256  *  (+roll)  .--> |
    257  *          /     |
    258  *         |      |  roll: rotation around Y axis
    259  *     X <-------(.)
    260  *                 Y
    261  *       note that +Y == -roll
    262  *
    263  *
    264  *
    265  * Note: This definition is different from yaw, pitch and roll used in aviation
    266  *  where the X axis is along the long side of the plane (tail to nose).
    267  */
    268 #define SENSOR_TYPE_ORIENTATION                      (3)
    269 
    270 /*
    271  * SENSOR_TYPE_GYROSCOPE
    272  * trigger-mode: continuous
    273  * wake-up sensor: no
    274  *
    275  *  All values are in radians/second and measure the rate of rotation
    276  *  around the X, Y and Z axis.  The coordinate system is the same as is
    277  *  used for the acceleration sensor. Rotation is positive in the
    278  *  counter-clockwise direction (right-hand rule). That is, an observer
    279  *  looking from some positive location on the x, y or z axis at a device
    280  *  positioned on the origin would report positive rotation if the device
    281  *  appeared to be rotating counter clockwise. Note that this is the
    282  *  standard mathematical definition of positive rotation and does not agree
    283  *  with the definition of roll given earlier.
    284  *  The range should at least be 17.45 rad/s (ie: ~1000 deg/s).
    285  *
    286  *  automatic gyro-drift compensation is allowed but not required.
    287  */
    288 #define SENSOR_TYPE_GYROSCOPE                        (4)
    289 
    290 /*
    291  * SENSOR_TYPE_LIGHT
    292  * trigger-mode: on-change
    293  * wake-up sensor: no
    294  *
    295  * The light sensor value is returned in SI lux units.
    296  */
    297 #define SENSOR_TYPE_LIGHT                            (5)
    298 
    299 /*
    300  * SENSOR_TYPE_PRESSURE
    301  * trigger-mode: continuous
    302  * wake-up sensor: no
    303  *
    304  * The pressure sensor return the athmospheric pressure in hectopascal (hPa)
    305  */
    306 #define SENSOR_TYPE_PRESSURE                         (6)
    307 
    308 /* SENSOR_TYPE_TEMPERATURE is deprecated in the HAL */
    309 #define SENSOR_TYPE_TEMPERATURE                      (7)
    310 
    311 /*
    312  * SENSOR_TYPE_PROXIMITY
    313  * trigger-mode: on-change
    314  * wake-up sensor: yes
    315  *
    316  * The distance value is measured in centimeters.  Note that some proximity
    317  * sensors only support a binary "close" or "far" measurement.  In this case,
    318  * the sensor should report its maxRange value in the "far" state and a value
    319  * less than maxRange in the "near" state.
    320  */
    321 #define SENSOR_TYPE_PROXIMITY                        (8)
    322 
    323 /*
    324  * SENSOR_TYPE_GRAVITY
    325  * trigger-mode: continuous
    326  * wake-up sensor: no
    327  *
    328  * A gravity output indicates the direction of and magnitude of gravity in
    329  * the devices's coordinates.  On Earth, the magnitude is 9.8 m/s^2.
    330  * Units are m/s^2.  The coordinate system is the same as is used for the
    331  * acceleration sensor. When the device is at rest, the output of the
    332  * gravity sensor should be identical to that of the accelerometer.
    333  */
    334 #define SENSOR_TYPE_GRAVITY                          (9)
    335 
    336 /*
    337  * SENSOR_TYPE_LINEAR_ACCELERATION
    338  * trigger-mode: continuous
    339  * wake-up sensor: no
    340  *
    341  * Indicates the linear acceleration of the device in device coordinates,
    342  * not including gravity.
    343  *
    344  * The output is conceptually:
    345  *    output of TYPE_ACCELERATION - output of TYPE_GRAVITY
    346  *
    347  * Readings on all axes should be close to 0 when device lies on a table.
    348  * Units are m/s^2.
    349  * The coordinate system is the same as is used for the acceleration sensor.
    350  */
    351 #define SENSOR_TYPE_LINEAR_ACCELERATION             (10)
    352 
    353 
    354 /*
    355  * SENSOR_TYPE_ROTATION_VECTOR
    356  * trigger-mode: continuous
    357  * wake-up sensor: no
    358  *
    359  * The rotation vector symbolizes the orientation of the device relative to the
    360  * East-North-Up coordinates frame. It is usually obtained by integration of
    361  * accelerometer, gyroscope and magnetometer readings.
    362  *
    363  * The East-North-Up coordinate system is defined as a direct orthonormal basis
    364  * where:
    365  * - X points east and is tangential to the ground.
    366  * - Y points north and is tangential to the ground.
    367  * - Z points towards the sky and is perpendicular to the ground.
    368  *
    369  * The orientation of the phone is represented by the rotation necessary to
    370  * align the East-North-Up coordinates with the phone's coordinates. That is,
    371  * applying the rotation to the world frame (X,Y,Z) would align them with the
    372  * phone coordinates (x,y,z).
    373  *
    374  * The rotation can be seen as rotating the phone by an angle theta around
    375  * an axis rot_axis to go from the reference (East-North-Up aligned) device
    376  * orientation to the current device orientation.
    377  *
    378  * The rotation is encoded as the 4 (reordered) components of a unit quaternion:
    379  *   sensors_event_t.data[0] = rot_axis.x*sin(theta/2)
    380  *   sensors_event_t.data[1] = rot_axis.y*sin(theta/2)
    381  *   sensors_event_t.data[2] = rot_axis.z*sin(theta/2)
    382  *   sensors_event_t.data[3] = cos(theta/2)
    383  * where
    384  *   - rot_axis.x,y,z are the North-East-Up coordinates of a unit length vector
    385  *     representing the rotation axis
    386  *   - theta is the rotation angle
    387  *
    388  * The quaternion must be of norm 1 (it is a unit quaternion). Failure to ensure
    389  * this will cause erratic client behaviour.
    390  *
    391  * In addition, this sensor reports an estimated heading accuracy.
    392  *   sensors_event_t.data[4] = estimated_accuracy (in radians)
    393  * The heading error must be less than estimated_accuracy 95% of the time
    394  *
    395  * This sensor must use a gyroscope and an accelerometer as main orientation
    396  * change input.
    397  *
    398  * This sensor can also include magnetometer input to make up for gyro drift,
    399  * but it cannot be implemented using only a magnetometer.
    400  */
    401 #define SENSOR_TYPE_ROTATION_VECTOR                 (11)
    402 
    403 /*
    404  * SENSOR_TYPE_RELATIVE_HUMIDITY
    405  * trigger-mode: on-change
    406  * wake-up sensor: no
    407  *
    408  * A relative humidity sensor measures relative ambient air humidity and
    409  * returns a value in percent.
    410  */
    411 #define SENSOR_TYPE_RELATIVE_HUMIDITY               (12)
    412 
    413 /*
    414  * SENSOR_TYPE_AMBIENT_TEMPERATURE
    415  * trigger-mode: on-change
    416  * wake-up sensor: no
    417  *
    418  * The ambient (room) temperature in degree Celsius.
    419  */
    420 #define SENSOR_TYPE_AMBIENT_TEMPERATURE             (13)
    421 
    422 /*
    423  * SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED
    424  * trigger-mode: continuous
    425  * wake-up sensor: no
    426  *
    427  *  Similar to SENSOR_TYPE_MAGNETIC_FIELD, but the hard iron calibration is
    428  *  reported separately instead of being included in the measurement.
    429  *  Factory calibration and temperature compensation should still be applied to
    430  *  the "uncalibrated" measurement.
    431  *  Separating away the hard iron calibration estimation allows the system to
    432  *  better recover from bad hard iron estimation.
    433  *
    434  *  All values are in micro-Tesla (uT) and measure the ambient magnetic
    435  *  field in the X, Y and Z axis. Assumptions that the the magnetic field
    436  *  is due to the Earth's poles should be avoided.
    437  *
    438  *  The uncalibrated_magnetic event contains
    439  *  - 3 fields for uncalibrated measurement: x_uncalib, y_uncalib, z_uncalib.
    440  *    Each is a component of the measured magnetic field, with soft iron
    441  *    and temperature compensation applied, but not hard iron calibration.
    442  *    These values should be continuous (no re-calibration should cause a jump).
    443  *  - 3 fields for hard iron bias estimates: x_bias, y_bias, z_bias.
    444  *    Each field is a component of the estimated hard iron calibration.
    445  *    They represent the offsets to apply to the calibrated readings to obtain
    446  *    uncalibrated readings (x_uncalib ~= x_calibrated + x_bias)
    447  *    These values are expected to jump as soon as the estimate of the hard iron
    448  *    changes, and they should be stable the rest of the time.
    449  *
    450  *  If this sensor is present, then the corresponding
    451  *  SENSOR_TYPE_MAGNETIC_FIELD must be present and both must return the
    452  *  same sensor_t::name and sensor_t::vendor.
    453  *
    454  * See SENSOR_TYPE_MAGNETIC_FIELD for more information
    455  */
    456 #define SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED     (14)
    457 
    458 /*
    459  * SENSOR_TYPE_GAME_ROTATION_VECTOR
    460  * trigger-mode: continuous
    461  * wake-up sensor: no
    462  *
    463  *  Similar to SENSOR_TYPE_ROTATION_VECTOR, but not using the geomagnetic
    464  *  field. Therefore the Y axis doesn't point north, but instead to some other
    465  *  reference. That reference is allowed to drift by the same order of
    466  *  magnitude than the gyroscope drift around the Z axis.
    467  *
    468  *  This sensor does not report an estimated heading accuracy:
    469  *    sensors_event_t.data[4] is reserved and should be set to 0
    470  *
    471  *  In the ideal case, a phone rotated and returning to the same real-world
    472  *  orientation should report the same game rotation vector
    473  *  (without using the earth's geomagnetic field).
    474  *
    475  *  This sensor must be based on a gyroscope. It cannot be implemented using
    476  *  a magnetometer.
    477  *
    478  * see SENSOR_TYPE_ROTATION_VECTOR for more details
    479  */
    480 #define SENSOR_TYPE_GAME_ROTATION_VECTOR            (15)
    481 
    482 /*
    483  * SENSOR_TYPE_GYROSCOPE_UNCALIBRATED
    484  * trigger-mode: continuous
    485  * wake-up sensor: no
    486  *
    487  *  All values are in radians/second and measure the rate of rotation
    488  *  around the X, Y and Z axis. An estimation of the drift on each axis is
    489  *  reported as well.
    490  *
    491  *  No gyro-drift compensation shall be performed.
    492  *  Factory calibration and temperature compensation should still be applied
    493  *  to the rate of rotation (angular speeds).
    494  *
    495  *  The coordinate system is the same as is
    496  *  used for the acceleration sensor. Rotation is positive in the
    497  *  counter-clockwise direction (right-hand rule). That is, an observer
    498  *  looking from some positive location on the x, y or z axis at a device
    499  *  positioned on the origin would report positive rotation if the device
    500  *  appeared to be rotating counter clockwise. Note that this is the
    501  *  standard mathematical definition of positive rotation and does not agree
    502  *  with the definition of roll given earlier.
    503  *  The range should at least be 17.45 rad/s (ie: ~1000 deg/s).
    504  *
    505  *  Content of an uncalibrated_gyro event: (units are rad/sec)
    506  *   x_uncalib : angular speed (w/o drift compensation) around the X axis
    507  *   y_uncalib : angular speed (w/o drift compensation) around the Y axis
    508  *   z_uncalib : angular speed (w/o drift compensation) around the Z axis
    509  *   x_bias : estimated drift around X axis in rad/s
    510  *   y_bias : estimated drift around Y axis in rad/s
    511  *   z_bias : estimated drift around Z axis in rad/s
    512  *
    513  *  IMPLEMENTATION NOTES:
    514  *
    515  *  If the implementation is not able to estimate the drift, then this
    516  *  sensor MUST NOT be reported by this HAL. Instead, the regular
    517  *  SENSOR_TYPE_GYROSCOPE is used without drift compensation.
    518  *
    519  *  If this sensor is present, then the corresponding
    520  *  SENSOR_TYPE_GYROSCOPE must be present and both must return the
    521  *  same sensor_t::name and sensor_t::vendor.
    522  */
    523 #define SENSOR_TYPE_GYROSCOPE_UNCALIBRATED          (16)
    524 
    525 
    526 /*
    527  * SENSOR_TYPE_SIGNIFICANT_MOTION
    528  * trigger-mode: one-shot
    529  * wake-up sensor: yes
    530  *
    531  * A sensor of this type triggers an event each time significant motion
    532  * is detected and automatically disables itself.
    533  * The only allowed value to return is 1.0.
    534  *
    535  * A significant motion is a motion that might lead to a change in the user
    536  * location.
    537  * Examples of such motions are:
    538  *   walking, biking, sitting in a moving car, coach or train.
    539  * Examples of situations that should not trigger significant motion:
    540  * - phone in pocket and person is not moving
    541  * - phone is on a table, even if the table shakes a bit due to nearby traffic
    542  *   or washing machine
    543  *
    544  * A note on false positive / false negative / power consumption tradeoff
    545  *  - The goal of this sensor is to save power.
    546  *  - Triggering an event when the user is not moving (false positive) is costly
    547  *    in terms of power, so it should be avoided.
    548  *  - Not triggering an event when the user is moving (false negative) is
    549  *    acceptable as long as it is not done repeatedly. If the user has been
    550  *    walking for 10 seconds, not triggering an event within those 10 seconds
    551  *    is not acceptable.
    552  *
    553  *  IMPORTANT NOTE: this sensor type is very different from other types
    554  *  in that it must work when the screen is off without the need of
    555  *  holding a partial wake-lock and MUST allow the SoC to go into suspend.
    556  *  When significant motion is detected, the sensor must awaken the SoC and
    557  *  the event be reported.
    558  *
    559  *  If a particular hardware cannot support this mode of operation then this
    560  *  sensor type MUST NOT be reported by the HAL. ie: it is not acceptable
    561  *  to "emulate" this sensor in the HAL.
    562  *
    563  *  The whole point of this sensor type is to save power by keeping the
    564  *  SoC in suspend mode when the device is at rest.
    565  *
    566  *  When the sensor is not activated, it must also be deactivated in the
    567  *  hardware: it must not wake up the SoC anymore, even in case of
    568  *  significant motion.
    569  *
    570  *  setDelay() has no effect and is ignored.
    571  *  Once a "significant motion" event is returned, a sensor of this type
    572  *  must disables itself automatically, as if activate(..., 0) had been called.
    573  */
    574 
    575 #define SENSOR_TYPE_SIGNIFICANT_MOTION              (17)
    576 
    577 
    578 /*
    579  * SENSOR_TYPE_STEP_DETECTOR
    580  * trigger-mode: special
    581  * wake-up sensor: no
    582  *
    583  * A sensor of this type triggers an event each time a step is taken
    584  * by the user. The only allowed value to return is 1.0 and an event is
    585  * generated for each step. Like with any other event, the timestamp
    586  * indicates when the event (here the step) occurred, this corresponds to when
    587  * the foot hit the ground, generating a high variation in acceleration.
    588  *
    589  * While this sensor operates, it shall not disrupt any other sensors, in
    590  * particular, but not limited to, the accelerometer; which might very well
    591  * be in use as well.
    592  *
    593  * This sensor must be low power. That is, if the step detection cannot be
    594  * done in hardware, this sensor should not be defined. Also, when the
    595  * step detector is activated and the accelerometer is not, only steps should
    596  * trigger interrupts (not accelerometer data).
    597  *
    598  * setDelay() has no impact on this sensor type
    599  */
    600 
    601 #define SENSOR_TYPE_STEP_DETECTOR                   (18)
    602 
    603 
    604 /*
    605  * SENSOR_TYPE_STEP_COUNTER
    606  * trigger-mode: on-change
    607  * wake-up sensor: no
    608  *
    609  * A sensor of this type returns the number of steps taken by the user since
    610  * the last reboot while activated. The value is returned as a uint64_t and is
    611  * reset to zero only on a system reboot.
    612  *
    613  * The timestamp of the event is set to the time when the first step
    614  * for that event was taken.
    615  * See SENSOR_TYPE_STEP_DETECTOR for the signification of the time of a step.
    616  *
    617  *  The minimum size of the hardware's internal counter shall be 16 bits
    618  *  (this restriction is here to avoid too frequent wake-ups when the
    619  *  delay is very large).
    620  *
    621  *  IMPORTANT NOTE: this sensor type is different from other types
    622  *  in that it must work when the screen is off without the need of
    623  *  holding a partial wake-lock and MUST allow the SoC to go into suspend.
    624  *  Unlike other sensors, while in suspend mode this sensor must stay active,
    625  *  no events are reported during that time but, steps continue to be
    626  *  accounted for; an event will be reported as soon as the SoC resumes if
    627  *  the timeout has expired.
    628  *
    629  *    In other words, when the screen is off and the device allowed to
    630  *    go into suspend mode, we don't want to be woken up, regardless of the
    631  *    setDelay() value, but the steps shall continue to be counted.
    632  *
    633  *    The driver must however ensure that the internal step count never
    634  *    overflows. It is allowed in this situation to wake the SoC up so the
    635  *    driver can do the counter maintenance.
    636  *
    637  *  While this sensor operates, it shall not disrupt any other sensors, in
    638  *  particular, but not limited to, the accelerometer; which might very well
    639  *  be in use as well.
    640  *
    641  *  If a particular hardware cannot support these modes of operation then this
    642  *  sensor type MUST NOT be reported by the HAL. ie: it is not acceptable
    643  *  to "emulate" this sensor in the HAL.
    644  *
    645  * This sensor must be low power. That is, if the step detection cannot be
    646  * done in hardware, this sensor should not be defined. Also, when the
    647  * step counter is activated and the accelerometer is not, only steps should
    648  * trigger interrupts (not accelerometer data).
    649  *
    650  *  The whole point of this sensor type is to save power by keeping the
    651  *  SoC in suspend mode when the device is at rest.
    652  */
    653 
    654 #define SENSOR_TYPE_STEP_COUNTER                    (19)
    655 
    656 /*
    657  * SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR
    658  * trigger-mode: continuous
    659  * wake-up sensor: no
    660  *
    661  *  Similar to SENSOR_TYPE_ROTATION_VECTOR, but using a magnetometer instead
    662  *  of using a gyroscope.
    663  *
    664  *  This sensor must be based on a magnetometer. It cannot be implemented using
    665  *  a gyroscope, and gyroscope input cannot be used by this sensor.
    666  *
    667  *  Just like SENSOR_TYPE_ROTATION_VECTOR, this sensor reports an estimated
    668  *  heading accuracy:
    669  *    sensors_event_t.data[4] = estimated_accuracy (in radians)
    670  *  The heading error must be less than estimated_accuracy 95% of the time
    671  *
    672  * see SENSOR_TYPE_ROTATION_VECTOR for more details
    673  */
    674 #define SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR            (20)
    675 
    676 /**
    677  * Values returned by the accelerometer in various locations in the universe.
    678  * all values are in SI units (m/s^2)
    679  */
    680 #define GRAVITY_SUN             (275.0f)
    681 #define GRAVITY_EARTH           (9.80665f)
    682 
    683 /** Maximum magnetic field on Earth's surface */
    684 #define MAGNETIC_FIELD_EARTH_MAX    (60.0f)
    685 
    686 /** Minimum magnetic field on Earth's surface */
    687 #define MAGNETIC_FIELD_EARTH_MIN    (30.0f)
    688 
    689 
    690 /**
    691  * status of orientation sensor
    692  */
    693 
    694 #define SENSOR_STATUS_UNRELIABLE        0
    695 #define SENSOR_STATUS_ACCURACY_LOW      1
    696 #define SENSOR_STATUS_ACCURACY_MEDIUM   2
    697 #define SENSOR_STATUS_ACCURACY_HIGH     3
    698 
    699 
    700 /**
    701  * sensor event data
    702  */
    703 typedef struct {
    704     union {
    705         float v[3];
    706         struct {
    707             float x;
    708             float y;
    709             float z;
    710         };
    711         struct {
    712             float azimuth;
    713             float pitch;
    714             float roll;
    715         };
    716     };
    717     int8_t status;
    718     uint8_t reserved[3];
    719 } sensors_vec_t;
    720 
    721 /**
    722  * uncalibrated gyroscope and magnetometer event data
    723  */
    724 typedef struct {
    725   union {
    726     float uncalib[3];
    727     struct {
    728       float x_uncalib;
    729       float y_uncalib;
    730       float z_uncalib;
    731     };
    732   };
    733   union {
    734     float bias[3];
    735     struct {
    736       float x_bias;
    737       float y_bias;
    738       float z_bias;
    739     };
    740   };
    741 } uncalibrated_event_t;
    742 
    743 /**
    744  * Union of the various types of sensor data
    745  * that can be returned.
    746  */
    747 typedef struct sensors_event_t {
    748     /* must be sizeof(struct sensors_event_t) */
    749     int32_t version;
    750 
    751     /* sensor identifier */
    752     int32_t sensor;
    753 
    754     /* sensor type */
    755     int32_t type;
    756 
    757     /* reserved */
    758     int32_t reserved0;
    759 
    760     /* time is in nanosecond */
    761     int64_t timestamp;
    762 
    763     union {
    764         float           data[16];
    765 
    766         /* acceleration values are in meter per second per second (m/s^2) */
    767         sensors_vec_t   acceleration;
    768 
    769         /* magnetic vector values are in micro-Tesla (uT) */
    770         sensors_vec_t   magnetic;
    771 
    772         /* orientation values are in degrees */
    773         sensors_vec_t   orientation;
    774 
    775         /* gyroscope values are in rad/s */
    776         sensors_vec_t   gyro;
    777 
    778         /* temperature is in degrees centigrade (Celsius) */
    779         float           temperature;
    780 
    781         /* distance in centimeters */
    782         float           distance;
    783 
    784         /* light in SI lux units */
    785         float           light;
    786 
    787         /* pressure in hectopascal (hPa) */
    788         float           pressure;
    789 
    790         /* relative humidity in percent */
    791         float           relative_humidity;
    792 
    793         /* step-counter */
    794         uint64_t        step_counter;
    795 
    796         /* uncalibrated gyroscope values are in rad/s */
    797         uncalibrated_event_t uncalibrated_gyro;
    798 
    799         /* uncalibrated magnetometer values are in micro-Teslas */
    800         uncalibrated_event_t uncalibrated_magnetic;
    801     };
    802     uint32_t        reserved1[4];
    803 } sensors_event_t;
    804 
    805 
    806 
    807 struct sensor_t;
    808 
    809 /**
    810  * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
    811  * and the fields of this data structure must begin with hw_module_t
    812  * followed by module specific information.
    813  */
    814 struct sensors_module_t {
    815     struct hw_module_t common;
    816 
    817     /**
    818      * Enumerate all available sensors. The list is returned in "list".
    819      * @return number of sensors in the list
    820      */
    821     int (*get_sensors_list)(struct sensors_module_t* module,
    822             struct sensor_t const** list);
    823 };
    824 
    825 struct sensor_t {
    826 
    827     /* Name of this sensor.
    828      * All sensors of the same "type" must have a different "name".
    829      */
    830     const char*     name;
    831 
    832     /* vendor of the hardware part */
    833     const char*     vendor;
    834 
    835     /* version of the hardware part + driver. The value of this field
    836      * must increase when the driver is updated in a way that changes the
    837      * output of this sensor. This is important for fused sensors when the
    838      * fusion algorithm is updated.
    839      */
    840     int             version;
    841 
    842     /* handle that identifies this sensors. This handle is used to reference
    843      * this sensor throughout the HAL API.
    844      */
    845     int             handle;
    846 
    847     /* this sensor's type. */
    848     int             type;
    849 
    850     /* maximum range of this sensor's value in SI units */
    851     float           maxRange;
    852 
    853     /* smallest difference between two values reported by this sensor */
    854     float           resolution;
    855 
    856     /* rough estimate of this sensor's power consumption in mA */
    857     float           power;
    858 
    859     /* this value depends on the trigger mode:
    860      *
    861      *   continuous: minimum sample period allowed in microseconds
    862      *   on-change : 0
    863      *   one-shot  :-1
    864      *   special   : 0, unless otherwise noted
    865      */
    866     int32_t         minDelay;
    867 
    868     /* reserved fields, must be zero */
    869     void*           reserved[8];
    870 };
    871 
    872 
    873 /*
    874  * sensors_poll_device_t is used with SENSORS_DEVICE_API_VERSION_0_1
    875  * and is present for backward binary and source compatibility.
    876  * (see documentation of the hooks in struct sensors_poll_device_1 below)
    877  */
    878 struct sensors_poll_device_t {
    879     struct hw_device_t common;
    880     int (*activate)(struct sensors_poll_device_t *dev,
    881             int handle, int enabled);
    882     int (*setDelay)(struct sensors_poll_device_t *dev,
    883             int handle, int64_t ns);
    884     int (*poll)(struct sensors_poll_device_t *dev,
    885             sensors_event_t* data, int count);
    886 };
    887 
    888 /*
    889  * struct sensors_poll_device_1 is used with SENSORS_DEVICE_API_VERSION_1_0
    890  */
    891 typedef struct sensors_poll_device_1 {
    892     union {
    893         /* sensors_poll_device_1 is compatible with sensors_poll_device_t,
    894          * and can be down-cast to it
    895          */
    896         struct sensors_poll_device_t v0;
    897 
    898         struct {
    899             struct hw_device_t common;
    900 
    901             /* Activate/de-activate one sensor.
    902              *
    903              * handle is the handle of the sensor to change.
    904              * enabled set to 1 to enable, or 0 to disable the sensor.
    905              *
    906              * unless otherwise noted in the sensor types definitions, an
    907              * activated sensor never prevents the SoC to go into suspend
    908              * mode; that is, the HAL shall not hold a partial wake-lock on
    909              * behalf of applications.
    910              *
    911              * one-shot sensors de-activate themselves automatically upon
    912              * receiving an event and they must still accept to be deactivated
    913              * through a call to activate(..., ..., 0).
    914              *
    915              * if "enabled" is true and the sensor is already activated, this
    916              * function is a no-op and succeeds.
    917              *
    918              * if "enabled" is false and the sensor is already de-activated,
    919              * this function is a no-op and succeeds.
    920              *
    921              * return 0 on success, negative errno code otherwise
    922              */
    923             int (*activate)(struct sensors_poll_device_t *dev,
    924                     int handle, int enabled);
    925 
    926             /**
    927              * Set the events's period in nanoseconds for a given sensor.
    928              *
    929              * What the period_ns parameter means depends on the specified
    930              * sensor's trigger mode:
    931              *
    932              * continuous: setDelay() sets the sampling rate.
    933              * on-change: setDelay() limits the delivery rate of events
    934              * one-shot: setDelay() is ignored. it has no effect.
    935              * special: see specific sensor type definitions
    936              *
    937              * For continuous and on-change sensors, if the requested value is
    938              * less than sensor_t::minDelay, then it's silently clamped to
    939              * sensor_t::minDelay unless sensor_t::minDelay is 0, in which
    940              * case it is clamped to >= 1ms.
    941              *
    942              * @return 0 if successful, < 0 on error
    943              */
    944             int (*setDelay)(struct sensors_poll_device_t *dev,
    945                     int handle, int64_t period_ns);
    946 
    947             /**
    948              * Returns an array of sensor data.
    949              * This function must block until events are available.
    950              *
    951              * return the number of events read on success, or -errno in case
    952              * of an error.
    953              *
    954              * The number of events returned in data must be less or equal
    955              * to the "count" argument.
    956              *
    957              * This function shall never return 0 (no event).
    958              */
    959             int (*poll)(struct sensors_poll_device_t *dev,
    960                     sensors_event_t* data, int count);
    961         };
    962     };
    963 
    964 
    965     /*
    966      * Enables batch mode for the given sensor and sets the delay between events
    967      *
    968      * A timeout value of zero disables batch mode for the given sensor.
    969      *
    970      * The period_ns parameter is equivalent to calling setDelay() -- this
    971      * function both enables or disables the batch mode AND sets the events's
    972      * period in nanosecond. See setDelay() above for a detailed explanation of
    973      * the period_ns parameter.
    974      *
    975      * BATCH MODE:
    976      * -----------
    977      * In non-batch mode, all sensor events must be reported as soon as they
    978      * are detected. For example, an accelerometer activated at 50Hz will
    979      * trigger interrupts 50 times per second.
    980      * While in batch mode, sensor events do not need to be reported as soon
    981      * as they are detected. They can be temporarily stored in batches and
    982      * reported in batches, as long as no event is delayed by more than
    983      * "timeout" nanoseconds. That is, all events since the previous batch
    984      * are recorded and returned all at once. This allows to reduce the amount
    985      * of interrupts sent to the SoC, and allow the SoC to switch to a lower
    986      * power state (Idle) while the sensor is capturing and batching data.
    987      *
    988      * setDelay() is not affected and it behaves as usual.
    989      *
    990      * Each event has a timestamp associated with it, the timestamp
    991      * must be accurate and correspond to the time at which the event
    992      * physically happened.
    993      *
    994      * Batching does not modify the behavior of poll(): batches from different
    995      * sensors can be interleaved and split. As usual, all events from the same
    996      * sensor are time-ordered.
    997      *
    998      * BEHAVIOUR OUTSIDE OF SUSPEND MODE:
    999      * ----------------------------------
   1000      *
   1001      * When the SoC is awake (not in suspend mode), events must be reported in
   1002      * batches at least every "timeout". No event shall be dropped or lost.
   1003      * If internal h/w FIFOs fill-up before the timeout, then events are
   1004      * reported at that point to ensure no event is lost.
   1005      *
   1006      *
   1007      * NORMAL BEHAVIOR IN SUSPEND MODE:
   1008      * ---------------------------------
   1009      *
   1010      * By default, batch mode doesn't significantly change the interaction with
   1011      * suspend mode. That is, sensors must continue to allow the SoC to
   1012      * go into suspend mode and sensors must stay active to fill their
   1013      * internal FIFO. In this mode, when the FIFO fills up, it shall wrap
   1014      * around (basically behave like a circular buffer, overwriting events).
   1015      * As soon as the SoC comes out of suspend mode, a batch is produced with
   1016      * as much as the recent history as possible, and batch operation
   1017      * resumes as usual.
   1018      *
   1019      * The behavior described above allows applications to record the recent
   1020      * history of a set of sensor while keeping the SoC into suspend. It
   1021      * also allows the hardware to not have to rely on a wake-up interrupt line.
   1022      *
   1023      * WAKE_UPON_FIFO_FULL BEHAVIOR IN SUSPEND MODE:
   1024      * ----------------------------------------------
   1025      *
   1026      * There are cases, however, where an application cannot afford to lose
   1027      * any events, even when the device goes into suspend mode.
   1028      * For a given rate, if a sensor has the capability to store at least 10
   1029      * seconds worth of events in its FIFO and is able to wake up the Soc, it
   1030      * can implement an optional secondary mode: the WAKE_UPON_FIFO_FULL mode.
   1031      *
   1032      * The caller will set the SENSORS_BATCH_WAKE_UPON_FIFO_FULL flag to
   1033      * activate this mode. If the sensor does not support this mode, batch()
   1034      * will fail when the flag is set.
   1035      *
   1036      * When running with the WAKE_UPON_FIFO_FULL flag set, no events can be
   1037      * lost. When the FIFO is getting full, the sensor must wake up the SoC from
   1038      * suspend and return a batch before the FIFO fills-up.
   1039      * Depending on the device, it might take a few miliseconds for the SoC to
   1040      * entirely come out of suspend and start flushing the FIFO. Enough head
   1041      * room must be allocated in the FIFO to allow the device to entirely come
   1042      * out of suspend without the FIFO overflowing (no events shall be lost).
   1043      *
   1044      *   Implementing the WAKE_UPON_FIFO_FULL mode is optional.
   1045      *   If the hardware cannot support this mode, or if the physical
   1046      *   FIFO is so small that the device would never be allowed to go into
   1047      *   suspend for at least 10 seconds, then this function MUST fail when
   1048      *   the flag SENSORS_BATCH_WAKE_UPON_FIFO_FULL is set, regardless of
   1049      *   the value of the timeout parameter.
   1050      *
   1051      *
   1052      * DRY RUN:
   1053      * --------
   1054      *
   1055      * If the flag SENSORS_BATCH_DRY_RUN is set, this function returns
   1056      * without modifying the batch mode or the event period and has no side
   1057      * effects, but returns errors as usual (as it would if this flag was
   1058      * not set). This flag is used to check if batch mode is available for a
   1059      * given configuration -- in particular for a given sensor at a given rate.
   1060      *
   1061      *
   1062      * Return values:
   1063      * --------------
   1064      *
   1065      * Because sensors must be independent, the return value must not depend
   1066      * on the state of the system (whether another sensor is on or not),
   1067      * nor on whether the flag SENSORS_BATCH_DRY_RUN is set (in other words,
   1068      * if a batch call with SENSORS_BATCH_DRY_RUN is successful,
   1069      * the same call without SENSORS_BATCH_DRY_RUN must succeed as well).
   1070      *
   1071      * If successful, 0 is returned.
   1072      * If the specified sensor doesn't support batch mode, -EINVAL is returned.
   1073      * If the specified sensor's trigger-mode is one-shot, -EINVAL is returned.
   1074      * If WAKE_UPON_FIFO_FULL is specified and the specified sensor's internal
   1075      * FIFO is too small to store at least 10 seconds worth of data at the
   1076      * given rate, -EINVAL is returned. Note that as stated above, this has to
   1077      * be determined at compile time, and not based on the state of the system.
   1078      * If some other constraints above cannot be satisfied, -EINVAL is returned.
   1079      *
   1080      * Note: the timeout parameter, when > 0, has no impact on whether this
   1081      *       function succeeds or fails.
   1082      *
   1083      * If timeout is set to 0, this function must succeed.
   1084      *
   1085      *
   1086      * IMPLEMENTATION NOTES:
   1087      * ---------------------
   1088      *
   1089      * Batch mode, if supported, should happen at the hardware level,
   1090      * typically using hardware FIFOs. In particular, it SHALL NOT be
   1091      * implemented in the HAL, as this would be counter productive.
   1092      * The goal here is to save significant amounts of power.
   1093      *
   1094      * In some implementations, events from several sensors can share the
   1095      * same physical FIFO. In that case, all events in the FIFO can be sent and
   1096      * processed by the HAL as soon as one batch must be reported.
   1097      * For example, if the following sensors are activated:
   1098      *  - accelerometer batched with timeout = 20s
   1099      *  - gyroscope batched with timeout = 5s
   1100      * then the accelerometer batches can be reported at the same time the
   1101      * gyroscope batches are reported (every 5 seconds)
   1102      *
   1103      * Batch mode can be enabled or disabled at any time, in particular
   1104      * while the specified sensor is already enabled, and this shall not
   1105      * result in the loss of events.
   1106      *
   1107      * COMPARATIVE IMPORTANCE OF BATCHING FOR DIFFERENT SENSORS:
   1108      * ---------------------------------------------------------
   1109      *
   1110      * On platforms on which hardware fifo size is limited, the system designers
   1111      * might have to choose how much fifo to reserve for each sensor. To help
   1112      * with this choice, here is a list of applications made possible when
   1113      * batching is implemented on the different sensors.
   1114      *
   1115      * High value: Low power pedestrian dead reckoning
   1116      *   Target batching time: 20 seconds to 1 minute
   1117      *   Sensors to batch:
   1118      *    - Step detector
   1119      *    - Rotation vector or game rotation vector at 5Hz
   1120      *   Gives us step and heading while letting the SoC go to Suspend.
   1121      *
   1122      * High value: Medium power activity/gesture recognition
   1123      *   Target batching time: 3 seconds
   1124      *   Sensors to batch: accelerometer between 20Hz and 50Hz
   1125      *   Allows recognizing arbitrary activities and gestures without having
   1126      *   to keep the SoC fully awake while the data is collected.
   1127      *
   1128      * Medium-high value: Interrupt load reduction
   1129      *   Target batching time: < 1 second
   1130      *   Sensors to batch: any high frequency sensor.
   1131      *   If the gyroscope is set at 800Hz, even batching just 10 gyro events can
   1132      *   reduce the number of interrupts from 800/second to 80/second.
   1133      *
   1134      * Medium value: Continuous low frequency data collection
   1135      *   Target batching time: > 1 minute
   1136      *   Sensors to batch: barometer, humidity sensor, other low frequency
   1137      *     sensors.
   1138      *   Allows creating monitoring applications at low power.
   1139      *
   1140      * Medium value: Continuous full-sensors collection
   1141      *   Target batching time: > 1 minute
   1142      *   Sensors to batch: all, at high frequencies
   1143      *   Allows full collection of sensor data while leaving the SoC in
   1144      *   suspend mode. Only to consider if fifo space is not an issue.
   1145      *
   1146      * In each of the cases above, if WAKE_UPON_FIFO_FULL is implemented, the
   1147      * applications might decide to let the SoC go to suspend, allowing for even
   1148      * more power savings.
   1149      */
   1150     int (*batch)(struct sensors_poll_device_1* dev,
   1151             int handle, int flags, int64_t period_ns, int64_t timeout);
   1152 
   1153     void (*reserved_procs[8])(void);
   1154 
   1155 } sensors_poll_device_1_t;
   1156 
   1157 
   1158 
   1159 /** convenience API for opening and closing a device */
   1160 
   1161 static inline int sensors_open(const struct hw_module_t* module,
   1162         struct sensors_poll_device_t** device) {
   1163     return module->methods->open(module,
   1164             SENSORS_HARDWARE_POLL, (struct hw_device_t**)device);
   1165 }
   1166 
   1167 static inline int sensors_close(struct sensors_poll_device_t* device) {
   1168     return device->common.close(&device->common);
   1169 }
   1170 
   1171 static inline int sensors_open_1(const struct hw_module_t* module,
   1172         sensors_poll_device_1_t** device) {
   1173     return module->methods->open(module,
   1174             SENSORS_HARDWARE_POLL, (struct hw_device_t**)device);
   1175 }
   1176 
   1177 static inline int sensors_close_1(sensors_poll_device_1_t* device) {
   1178     return device->common.close(&device->common);
   1179 }
   1180 
   1181 __END_DECLS
   1182 
   1183 #endif  // ANDROID_SENSORS_INTERFACE_H
   1184