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