1 /* 2 * Copyright (C) 2010 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 /** 18 * Structures and functions to receive and process sensor events in 19 * native code. 20 * 21 * @addtogroup Sensor 22 * @{ 23 */ 24 25 /** 26 * @file sensor.h 27 */ 28 29 #ifndef ANDROID_SENSOR_H 30 #define ANDROID_SENSOR_H 31 32 /****************************************************************** 33 * 34 * IMPORTANT NOTICE: 35 * 36 * This file is part of Android's set of stable system headers 37 * exposed by the Android NDK (Native Development Kit). 38 * 39 * Third-party source AND binary code relies on the definitions 40 * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES. 41 * 42 * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES) 43 * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS 44 * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY 45 * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES 46 */ 47 48 #include <android/looper.h> 49 50 #include <stdbool.h> 51 #include <sys/types.h> 52 #include <math.h> 53 #include <stdint.h> 54 55 #if !defined(__INTRODUCED_IN) 56 #define __INTRODUCED_IN(__api_level) /* nothing */ 57 #endif 58 #if !defined(__DEPRECATED_IN) 59 #define __DEPRECATED_IN(__api_level) __attribute__((__deprecated__)) 60 #endif 61 62 #ifdef __cplusplus 63 extern "C" { 64 #endif 65 66 typedef struct AHardwareBuffer AHardwareBuffer; 67 68 #define ASENSOR_RESOLUTION_INVALID (nanf("")) 69 #define ASENSOR_FIFO_COUNT_INVALID (-1) 70 #define ASENSOR_DELAY_INVALID INT32_MIN 71 #define ASENSOR_INVALID (-1) 72 73 /* (Keep in sync with hardware/sensors-base.h and Sensor.java.) */ 74 75 /** 76 * Sensor types. 77 * 78 * See 79 * [android.hardware.SensorEvent#values](https://developer.android.com/reference/android/hardware/SensorEvent.html#values) 80 * for detailed explanations of the data returned for each of these types. 81 */ 82 enum { 83 /** 84 * Invalid sensor type. Returned by {@link ASensor_getType} as error value. 85 */ 86 ASENSOR_TYPE_INVALID = -1, 87 /** 88 * {@link ASENSOR_TYPE_ACCELEROMETER} 89 * reporting-mode: continuous 90 * 91 * All values are in SI units (m/s^2) and measure the acceleration of the 92 * device minus the force of gravity. 93 */ 94 ASENSOR_TYPE_ACCELEROMETER = 1, 95 /** 96 * {@link ASENSOR_TYPE_MAGNETIC_FIELD} 97 * reporting-mode: continuous 98 * 99 * All values are in micro-Tesla (uT) and measure the geomagnetic 100 * field in the X, Y and Z axis. 101 */ 102 ASENSOR_TYPE_MAGNETIC_FIELD = 2, 103 /** 104 * {@link ASENSOR_TYPE_GYROSCOPE} 105 * reporting-mode: continuous 106 * 107 * All values are in radians/second and measure the rate of rotation 108 * around the X, Y and Z axis. 109 */ 110 ASENSOR_TYPE_GYROSCOPE = 4, 111 /** 112 * {@link ASENSOR_TYPE_LIGHT} 113 * reporting-mode: on-change 114 * 115 * The light sensor value is returned in SI lux units. 116 */ 117 ASENSOR_TYPE_LIGHT = 5, 118 /** 119 * {@link ASENSOR_TYPE_PRESSURE} 120 * 121 * The pressure sensor value is returned in hPa (millibar). 122 */ 123 ASENSOR_TYPE_PRESSURE = 6, 124 /** 125 * {@link ASENSOR_TYPE_PROXIMITY} 126 * reporting-mode: on-change 127 * 128 * The proximity sensor which turns the screen off and back on during calls is the 129 * wake-up proximity sensor. Implement wake-up proximity sensor before implementing 130 * a non wake-up proximity sensor. For the wake-up proximity sensor set the flag 131 * SENSOR_FLAG_WAKE_UP. 132 * The value corresponds to the distance to the nearest object in centimeters. 133 */ 134 ASENSOR_TYPE_PROXIMITY = 8, 135 /** 136 * {@link ASENSOR_TYPE_GRAVITY} 137 * 138 * All values are in SI units (m/s^2) and measure the direction and 139 * magnitude of gravity. When the device is at rest, the output of 140 * the gravity sensor should be identical to that of the accelerometer. 141 */ 142 ASENSOR_TYPE_GRAVITY = 9, 143 /** 144 * {@link ASENSOR_TYPE_LINEAR_ACCELERATION} 145 * reporting-mode: continuous 146 * 147 * All values are in SI units (m/s^2) and measure the acceleration of the 148 * device not including the force of gravity. 149 */ 150 ASENSOR_TYPE_LINEAR_ACCELERATION = 10, 151 /** 152 * {@link ASENSOR_TYPE_ROTATION_VECTOR} 153 */ 154 ASENSOR_TYPE_ROTATION_VECTOR = 11, 155 /** 156 * {@link ASENSOR_TYPE_RELATIVE_HUMIDITY} 157 * 158 * The relative humidity sensor value is returned in percent. 159 */ 160 ASENSOR_TYPE_RELATIVE_HUMIDITY = 12, 161 /** 162 * {@link ASENSOR_TYPE_AMBIENT_TEMPERATURE} 163 * 164 * The ambient temperature sensor value is returned in Celcius. 165 */ 166 ASENSOR_TYPE_AMBIENT_TEMPERATURE = 13, 167 /** 168 * {@link ASENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED} 169 */ 170 ASENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED = 14, 171 /** 172 * {@link ASENSOR_TYPE_GAME_ROTATION_VECTOR} 173 */ 174 ASENSOR_TYPE_GAME_ROTATION_VECTOR = 15, 175 /** 176 * {@link ASENSOR_TYPE_GYROSCOPE_UNCALIBRATED} 177 */ 178 ASENSOR_TYPE_GYROSCOPE_UNCALIBRATED = 16, 179 /** 180 * {@link ASENSOR_TYPE_SIGNIFICANT_MOTION} 181 */ 182 ASENSOR_TYPE_SIGNIFICANT_MOTION = 17, 183 /** 184 * {@link ASENSOR_TYPE_STEP_DETECTOR} 185 */ 186 ASENSOR_TYPE_STEP_DETECTOR = 18, 187 /** 188 * {@link ASENSOR_TYPE_STEP_COUNTER} 189 */ 190 ASENSOR_TYPE_STEP_COUNTER = 19, 191 /** 192 * {@link ASENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR} 193 */ 194 ASENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR = 20, 195 /** 196 * {@link ASENSOR_TYPE_HEART_RATE} 197 */ 198 ASENSOR_TYPE_HEART_RATE = 21, 199 /** 200 * {@link ASENSOR_TYPE_POSE_6DOF} 201 */ 202 ASENSOR_TYPE_POSE_6DOF = 28, 203 /** 204 * {@link ASENSOR_TYPE_STATIONARY_DETECT} 205 */ 206 ASENSOR_TYPE_STATIONARY_DETECT = 29, 207 /** 208 * {@link ASENSOR_TYPE_MOTION_DETECT} 209 */ 210 ASENSOR_TYPE_MOTION_DETECT = 30, 211 /** 212 * {@link ASENSOR_TYPE_HEART_BEAT} 213 */ 214 ASENSOR_TYPE_HEART_BEAT = 31, 215 /** 216 * A constant describing a dynamic sensor meta event sensor. 217 * 218 * A sensor event of this type is received when a dynamic sensor is added to or removed from 219 * the system. This sensor type should always use special trigger report mode. 220 */ 221 ASENSOR_TYPE_DYNAMIC_SENSOR_META = 32, 222 /** 223 * This sensor type is for delivering additional sensor information aside 224 * from sensor event data. 225 * 226 * Additional information may include: 227 * - {@link ASENSOR_ADDITIONAL_INFO_INTERNAL_TEMPERATURE} 228 * - {@link ASENSOR_ADDITIONAL_INFO_SAMPLING} 229 * - {@link ASENSOR_ADDITIONAL_INFO_SENSOR_PLACEMENT} 230 * - {@link ASENSOR_ADDITIONAL_INFO_UNTRACKED_DELAY} 231 * - {@link ASENSOR_ADDITIONAL_INFO_VEC3_CALIBRATION} 232 * 233 * This type will never bind to a sensor. In other words, no sensor in the 234 * sensor list can have the type {@link ASENSOR_TYPE_ADDITIONAL_INFO}. 235 * 236 * If a device supports the sensor additional information feature, it will 237 * report additional information events via {@link ASensorEvent} and will 238 * have the type of {@link ASensorEvent} set to 239 * {@link ASENSOR_TYPE_ADDITIONAL_INFO} and the sensor of {@link ASensorEvent} set 240 * to the handle of the reporting sensor. 241 * 242 * Additional information reports consist of multiple frames ordered by 243 * {@link ASensorEvent#timestamp}. The first frame in the report will have 244 * a {@link AAdditionalInfoEvent#type} of 245 * {@link ASENSOR_ADDITIONAL_INFO_BEGIN}, and the last frame in the report 246 * will have a {@link AAdditionalInfoEvent#type} of 247 * {@link ASENSOR_ADDITIONAL_INFO_END}. 248 * 249 */ 250 ASENSOR_TYPE_ADDITIONAL_INFO = 33, 251 /** 252 * {@link ASENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT} 253 */ 254 ASENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT = 34, 255 /** 256 * {@link ASENSOR_TYPE_ACCELEROMETER_UNCALIBRATED} 257 */ 258 ASENSOR_TYPE_ACCELEROMETER_UNCALIBRATED = 35, 259 /** 260 * {@link ASENSOR_TYPE_HINGE_ANGLE} 261 * reporting-mode: on-change 262 * 263 * The hinge angle sensor value is returned in degrees. 264 */ 265 ASENSOR_TYPE_HINGE_ANGLE = 36, 266 /** 267 * {@link ASENSOR_TYPE_HEAD_TRACKER} 268 * reporting-mode: continuous 269 * 270 * Measures the orientation and rotational velocity of a user's head. Only for internal use 271 * within the Android system. 272 */ 273 ASENSOR_TYPE_HEAD_TRACKER = 37, 274 /** 275 * {@link ASENSOR_TYPE_ACCELEROMETER_LIMITED_AXES} 276 * reporting-mode: continuous 277 * 278 * The first three values are in SI units (m/s^2) and measure the acceleration of the device 279 * minus the force of gravity. The last three values indicate which acceleration axes are 280 * supported. A value of 1.0 means supported and a value of 0 means not supported. 281 */ 282 ASENSOR_TYPE_ACCELEROMETER_LIMITED_AXES = 38, 283 /** 284 * {@link ASENSOR_TYPE_GYROSCOPE_LIMITED_AXES} 285 * reporting-mode: continuous 286 * 287 * The first three values are in radians/second and measure the rate of rotation around the X, 288 * Y and Z axis. The last three values indicate which rotation axes are supported. A value of 289 * 1.0 means supported and a value of 0 means not supported. 290 */ 291 ASENSOR_TYPE_GYROSCOPE_LIMITED_AXES = 39, 292 /** 293 * {@link ASENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED} 294 * reporting-mode: continuous 295 * 296 * The first three values are in SI units (m/s^2) and measure the acceleration of the device 297 * minus the force of gravity. The middle three values represent the estimated bias for each 298 * axis. The last three values indicate which acceleration axes are supported. A value of 1.0 299 * means supported and a value of 0 means not supported. 300 */ 301 ASENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED = 40, 302 /** 303 * {@link ASENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED} 304 * reporting-mode: continuous 305 * 306 * The first three values are in radians/second and measure the rate of rotation around the X, 307 * Y and Z axis. The middle three values represent the estimated drift around each axis in 308 * rad/s. The last three values indicate which rotation axes are supported. A value of 1.0 means 309 * supported and a value of 0 means not supported. 310 */ 311 ASENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED = 41, 312 /** 313 * {@link ASENSOR_TYPE_HEADING} 314 * reporting-mode: continuous 315 * 316 * A heading sensor measures the direction in which the device is pointing 317 * relative to true north in degrees. 318 */ 319 ASENSOR_TYPE_HEADING = 42, 320 }; 321 322 /** 323 * Sensor accuracy measure. 324 */ 325 enum { 326 /** no contact */ 327 ASENSOR_STATUS_NO_CONTACT = -1, 328 /** unreliable */ 329 ASENSOR_STATUS_UNRELIABLE = 0, 330 /** low accuracy */ 331 ASENSOR_STATUS_ACCURACY_LOW = 1, 332 /** medium accuracy */ 333 ASENSOR_STATUS_ACCURACY_MEDIUM = 2, 334 /** high accuracy */ 335 ASENSOR_STATUS_ACCURACY_HIGH = 3 336 }; 337 338 /** 339 * Sensor Reporting Modes. 340 */ 341 enum { 342 /** invalid reporting mode */ 343 AREPORTING_MODE_INVALID = -1, 344 /** continuous reporting */ 345 AREPORTING_MODE_CONTINUOUS = 0, 346 /** reporting on change */ 347 AREPORTING_MODE_ON_CHANGE = 1, 348 /** on shot reporting */ 349 AREPORTING_MODE_ONE_SHOT = 2, 350 /** special trigger reporting */ 351 AREPORTING_MODE_SPECIAL_TRIGGER = 3 352 }; 353 354 /** 355 * Sensor Direct Report Rates. 356 */ 357 enum { 358 /** stopped */ 359 ASENSOR_DIRECT_RATE_STOP = 0, 360 /** nominal 50Hz */ 361 ASENSOR_DIRECT_RATE_NORMAL = 1, 362 /** nominal 200Hz */ 363 ASENSOR_DIRECT_RATE_FAST = 2, 364 /** nominal 800Hz */ 365 ASENSOR_DIRECT_RATE_VERY_FAST = 3 366 }; 367 368 /** 369 * Sensor Direct Channel Type. 370 */ 371 enum { 372 /** shared memory created by ASharedMemory_create */ 373 ASENSOR_DIRECT_CHANNEL_TYPE_SHARED_MEMORY = 1, 374 /** AHardwareBuffer */ 375 ASENSOR_DIRECT_CHANNEL_TYPE_HARDWARE_BUFFER = 2 376 }; 377 378 /** 379 * Sensor Additional Info Types. 380 * 381 * Used to populate {@link AAdditionalInfoEvent#type}. 382 */ 383 enum { 384 /** Marks the beginning of additional information frames */ 385 ASENSOR_ADDITIONAL_INFO_BEGIN = 0, 386 387 /** Marks the end of additional information frames */ 388 ASENSOR_ADDITIONAL_INFO_END = 1, 389 390 /** 391 * Estimation of the delay that is not tracked by sensor timestamps. This 392 * includes delay introduced by sensor front-end filtering, data transport, 393 * etc. 394 * float[2]: delay in seconds, standard deviation of estimated value 395 */ 396 ASENSOR_ADDITIONAL_INFO_UNTRACKED_DELAY = 0x10000, 397 398 /** float: Celsius temperature */ 399 ASENSOR_ADDITIONAL_INFO_INTERNAL_TEMPERATURE, 400 401 /** 402 * First three rows of a homogeneous matrix, which represents calibration to 403 * a three-element vector raw sensor reading. 404 * float[12]: 3x4 matrix in row major order 405 */ 406 ASENSOR_ADDITIONAL_INFO_VEC3_CALIBRATION, 407 408 /** 409 * Location and orientation of sensor element in the device frame: origin is 410 * the geometric center of the mobile device screen surface; the axis 411 * definition corresponds to Android sensor definitions. 412 * float[12]: 3x4 matrix in row major order 413 */ 414 ASENSOR_ADDITIONAL_INFO_SENSOR_PLACEMENT, 415 416 /** 417 * float[2]: raw sample period in seconds, 418 * standard deviation of sampling period 419 */ 420 ASENSOR_ADDITIONAL_INFO_SAMPLING, 421 }; 422 423 /* 424 * A few useful constants 425 */ 426 427 /** Earth's gravity in m/s^2 */ 428 #define ASENSOR_STANDARD_GRAVITY (9.80665f) 429 /** Maximum magnetic field on Earth's surface in uT */ 430 #define ASENSOR_MAGNETIC_FIELD_EARTH_MAX (60.0f) 431 /** Minimum magnetic field on Earth's surface in uT*/ 432 #define ASENSOR_MAGNETIC_FIELD_EARTH_MIN (30.0f) 433 434 /** 435 * A sensor event. 436 */ 437 438 /* NOTE: changes to these structs have to be backward compatible */ 439 typedef struct ASensorVector { 440 union { 441 float v[3]; 442 struct { 443 float x; 444 float y; 445 float z; 446 }; 447 struct { 448 float azimuth; 449 float pitch; 450 float roll; 451 }; 452 }; 453 int8_t status; 454 uint8_t reserved[3]; 455 } ASensorVector; 456 457 typedef struct AMetaDataEvent { 458 int32_t what; 459 int32_t sensor; 460 } AMetaDataEvent; 461 462 typedef struct AUncalibratedEvent { 463 union { 464 float uncalib[3]; 465 struct { 466 float x_uncalib; 467 float y_uncalib; 468 float z_uncalib; 469 }; 470 }; 471 union { 472 float bias[3]; 473 struct { 474 float x_bias; 475 float y_bias; 476 float z_bias; 477 }; 478 }; 479 } AUncalibratedEvent; 480 481 typedef struct AHeartRateEvent { 482 float bpm; 483 int8_t status; 484 } AHeartRateEvent; 485 486 typedef struct ADynamicSensorEvent { 487 int32_t connected; 488 int32_t handle; 489 } ADynamicSensorEvent; 490 491 typedef struct AAdditionalInfoEvent { 492 /** 493 * Event type, such as ASENSOR_ADDITIONAL_INFO_BEGIN, ASENSOR_ADDITIONAL_INFO_END and others. 494 * Refer to {@link ASENSOR_TYPE_ADDITIONAL_INFO} for the expected reporting behavior. 495 */ 496 int32_t type; 497 int32_t serial; 498 union { 499 int32_t data_int32[14]; 500 float data_float[14]; 501 }; 502 } AAdditionalInfoEvent; 503 504 typedef struct AHeadTrackerEvent { 505 /** 506 * The fields rx, ry, rz are an Euler vector (rotation vector, i.e. a vector 507 * whose direction indicates the axis of rotation and magnitude indicates 508 * the angle to rotate around that axis) representing the transform from 509 * the (arbitrary, possibly slowly drifting) reference frame to the 510 * head frame. Expressed in radians. Magnitude of the vector must be 511 * in the range [0, pi], while the value of individual axes are 512 * in the range [-pi, pi]. 513 */ 514 float rx; 515 float ry; 516 float rz; 517 518 /** 519 * The fields vx, vy, vz are an Euler vector (rotation vector) representing 520 * the angular velocity of the head (relative to itself), in radians per 521 * second. The direction of this vector indicates the axis of rotation, and 522 * the magnitude indicates the rate of rotation. 523 */ 524 float vx; 525 float vy; 526 float vz; 527 528 /** 529 * This value changes each time the reference frame is suddenly and 530 * significantly changed, for example if an orientation filter algorithm 531 * used for determining the orientation has had its state reset. 532 */ 533 int32_t discontinuity_count; 534 } AHeadTrackerEvent; 535 536 typedef struct ALimitedAxesImuEvent { 537 union { 538 float calib[3]; 539 struct { 540 float x; 541 float y; 542 float z; 543 }; 544 }; 545 union { 546 float supported[3]; 547 struct { 548 float x_supported; 549 float y_supported; 550 float z_supported; 551 }; 552 }; 553 } ALimitedAxesImuEvent; 554 555 typedef struct ALimitedAxesImuUncalibratedEvent { 556 union { 557 float uncalib[3]; 558 struct { 559 float x_uncalib; 560 float y_uncalib; 561 float z_uncalib; 562 }; 563 }; 564 union { 565 float bias[3]; 566 struct { 567 float x_bias; 568 float y_bias; 569 float z_bias; 570 }; 571 }; 572 union { 573 float supported[3]; 574 struct { 575 float x_supported; 576 float y_supported; 577 float z_supported; 578 }; 579 }; 580 } ALimitedAxesImuUncalibratedEvent; 581 582 typedef struct AHeadingEvent { 583 /** 584 * The direction in which the device is pointing relative to true north in 585 * degrees. The value must be between 0.0 (inclusive) and 360.0 (exclusive), 586 * with 0 indicating north, 90 east, 180 south, and 270 west. 587 */ 588 float heading; 589 /** 590 * Accuracy is defined at 68% confidence. In the case where the underlying 591 * distribution is assumed Gaussian normal, this would be considered one 592 * standard deviation. For example, if the heading returns 60 degrees, and 593 * accuracy returns 10 degrees, then there is a 68 percent probability of 594 * the true heading being between 50 degrees and 70 degrees. 595 */ 596 float accuracy; 597 } AHeadingEvent; 598 599 /** 600 * Information that describes a sensor event, refer to 601 * <a href="/reference/android/hardware/SensorEvent">SensorEvent</a> for additional 602 * documentation. 603 */ 604 /* NOTE: changes to this struct has to be backward compatible */ 605 typedef struct ASensorEvent { 606 int32_t version; /* sizeof(struct ASensorEvent) */ 607 int32_t sensor; /** The sensor that generates this event */ 608 int32_t type; /** Sensor type for the event, such as {@link ASENSOR_TYPE_ACCELEROMETER} */ 609 int32_t reserved0; /** do not use */ 610 /** 611 * The time in nanoseconds at which the event happened, and its behavior 612 * is identical to <a href="/reference/android/hardware/SensorEvent#timestamp"> 613 * SensorEvent::timestamp</a> in Java API. 614 */ 615 int64_t timestamp; 616 union { 617 union { 618 float data[16]; 619 ASensorVector vector; 620 ASensorVector acceleration; 621 ASensorVector gyro; 622 ASensorVector magnetic; 623 float temperature; 624 float distance; 625 float light; 626 float pressure; 627 float relative_humidity; 628 AUncalibratedEvent uncalibrated_acceleration; 629 AUncalibratedEvent uncalibrated_gyro; 630 AUncalibratedEvent uncalibrated_magnetic; 631 AMetaDataEvent meta_data; 632 AHeartRateEvent heart_rate; 633 ADynamicSensorEvent dynamic_sensor_meta; 634 AAdditionalInfoEvent additional_info; 635 AHeadTrackerEvent head_tracker; 636 ALimitedAxesImuEvent limited_axes_imu; 637 ALimitedAxesImuUncalibratedEvent limited_axes_imu_uncalibrated; 638 AHeadingEvent heading; 639 }; 640 union { 641 uint64_t data[8]; 642 uint64_t step_counter; 643 } u64; 644 }; 645 646 uint32_t flags; 647 int32_t reserved1[3]; 648 } ASensorEvent; 649 650 struct ASensorManager; 651 /** 652 * {@link ASensorManager} is an opaque type to manage sensors and 653 * events queues. 654 * 655 * {@link ASensorManager} is a singleton that can be obtained using 656 * ASensorManager_getInstance(). 657 * 658 * This file provides a set of functions that uses {@link 659 * ASensorManager} to access and list hardware sensors, and 660 * create and destroy event queues: 661 * - ASensorManager_getSensorList() 662 * - ASensorManager_getDefaultSensor() 663 * - ASensorManager_getDefaultSensorEx() 664 * - ASensorManager_createEventQueue() 665 * - ASensorManager_destroyEventQueue() 666 */ 667 typedef struct ASensorManager ASensorManager; 668 669 670 struct ASensorEventQueue; 671 /** 672 * {@link ASensorEventQueue} is an opaque type that provides access to 673 * {@link ASensorEvent} from hardware sensors. 674 * 675 * A new {@link ASensorEventQueue} can be obtained using ASensorManager_createEventQueue(). 676 * 677 * This file provides a set of functions to enable and disable 678 * sensors, check and get events, and set event rates on a {@link 679 * ASensorEventQueue}. 680 * - ASensorEventQueue_enableSensor() 681 * - ASensorEventQueue_disableSensor() 682 * - ASensorEventQueue_hasEvents() 683 * - ASensorEventQueue_getEvents() 684 * - ASensorEventQueue_setEventRate() 685 * - ASensorEventQueue_requestAdditionalInfoEvents() 686 */ 687 typedef struct ASensorEventQueue ASensorEventQueue; 688 689 struct ASensor; 690 /** 691 * {@link ASensor} is an opaque type that provides information about 692 * an hardware sensors. 693 * 694 * A {@link ASensor} pointer can be obtained using 695 * ASensorManager_getDefaultSensor(), 696 * ASensorManager_getDefaultSensorEx() or from a {@link ASensorList}. 697 * 698 * This file provides a set of functions to access properties of a 699 * {@link ASensor}: 700 * - ASensor_getName() 701 * - ASensor_getVendor() 702 * - ASensor_getType() 703 * - ASensor_getResolution() 704 * - ASensor_getMinDelay() 705 * - ASensor_getFifoMaxEventCount() 706 * - ASensor_getFifoReservedEventCount() 707 * - ASensor_getStringType() 708 * - ASensor_getReportingMode() 709 * - ASensor_isWakeUpSensor() 710 * - ASensor_getHandle() 711 */ 712 typedef struct ASensor ASensor; 713 /** 714 * {@link ASensorRef} is a type for constant pointers to {@link ASensor}. 715 * 716 * This is used to define entry in {@link ASensorList} arrays. 717 */ 718 typedef ASensor const* ASensorRef; 719 /** 720 * {@link ASensorList} is an array of reference to {@link ASensor}. 721 * 722 * A {@link ASensorList} can be initialized using ASensorManager_getSensorList(). 723 */ 724 typedef ASensorRef const* ASensorList; 725 726 /*****************************************************************************/ 727 728 /** 729 * Get a reference to the sensor manager. ASensorManager is a singleton 730 * per package as different packages may have access to different sensors. 731 * 732 * Deprecated: Use ASensorManager_getInstanceForPackage(const char*) instead. 733 * 734 * Example: 735 * 736 * ASensorManager* sensorManager = ASensorManager_getInstance(); 737 * 738 */ 739 ASensorManager* ASensorManager_getInstance() __DEPRECATED_IN(26); 740 741 /** 742 * Get a reference to the sensor manager. ASensorManager is a singleton 743 * per package as different packages may have access to different sensors. 744 * 745 * Example: 746 * 747 * ASensorManager* sensorManager = ASensorManager_getInstanceForPackage("foo.bar.baz"); 748 * 749 * Available since API level 26. 750 */ 751 ASensorManager* ASensorManager_getInstanceForPackage(const char* packageName) __INTRODUCED_IN(26); 752 753 /** 754 * Returns the list of available sensors. The returned list is owned by the 755 * sensor manager and will not change between calls to this function. 756 * 757 * \param manager the {@link ASensorManager} instance obtained from 758 * {@link ASensorManager_getInstanceForPackage}. 759 * \param list the returned list of sensors. 760 * \return positive number of returned sensors or negative error code. 761 * BAD_VALUE: manager is NULL. 762 */ 763 int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list); 764 765 /** 766 * Returns the list of available dynamic sensors. If there are no dynamic 767 * sensors available, returns nullptr in list. 768 * 769 * Each time this is called, the previously returned list is deallocated and 770 * must no longer be used. 771 * 772 * Clients should call this if they receive a sensor update from 773 * {@link ASENSOR_TYPE_DYNAMIC_SENSOR_META} indicating the sensors have changed. 774 * If this happens, previously received lists from this method will be stale. 775 * 776 * Available since API level 33. 777 * 778 * \param manager the {@link ASensorManager} instance obtained from 779 * {@link ASensorManager_getInstanceForPackage}. 780 * \param list the returned list of dynamic sensors. 781 * \return positive number of returned sensors or negative error code. 782 * BAD_VALUE: manager is NULL. 783 */ 784 ssize_t ASensorManager_getDynamicSensorList( 785 ASensorManager* manager, ASensorList* list) __INTRODUCED_IN(33); 786 787 /** 788 * Returns the default sensor for the given type, or NULL if no sensor 789 * of that type exists. 790 */ 791 ASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type); 792 793 /** 794 * Returns the default sensor with the given type and wakeUp properties or NULL if no sensor 795 * of this type and wakeUp properties exists. 796 * 797 * Available since API level 21. 798 */ 799 ASensor const* ASensorManager_getDefaultSensorEx(ASensorManager* manager, int type, bool wakeUp) __INTRODUCED_IN(21); 800 801 /** 802 * Creates a new sensor event queue and associate it with a looper. 803 * 804 * "ident" is a identifier for the events that will be returned when 805 * calling ALooper_pollOnce(). The identifier must be >= 0, or 806 * ALOOPER_POLL_CALLBACK if providing a non-NULL callback. 807 */ 808 ASensorEventQueue* ASensorManager_createEventQueue(ASensorManager* manager, 809 ALooper* looper, int ident, ALooper_callbackFunc callback, void* data); 810 811 /** 812 * Destroys the event queue and free all resources associated to it. 813 */ 814 int ASensorManager_destroyEventQueue(ASensorManager* manager, ASensorEventQueue* queue); 815 816 /** 817 * Create direct channel based on shared memory 818 * 819 * Create a direct channel of {@link ASENSOR_DIRECT_CHANNEL_TYPE_SHARED_MEMORY} to be used 820 * for configuring sensor direct report. 821 * 822 * Available since API level 26. 823 * 824 * \param manager the {@link ASensorManager} instance obtained from 825 * {@link ASensorManager_getInstanceForPackage}. 826 * \param fd file descriptor representing a shared memory created by 827 * {@link ASharedMemory_create} 828 * \param size size to be used, must be less or equal to size of shared memory. 829 * 830 * \return a positive integer as a channel id to be used in 831 * {@link ASensorManager_destroyDirectChannel} and 832 * {@link ASensorManager_configureDirectReport}, or value less or equal to 0 for failures. 833 */ 834 int ASensorManager_createSharedMemoryDirectChannel(ASensorManager* manager, int fd, size_t size) __INTRODUCED_IN(26); 835 836 /** 837 * Create direct channel based on AHardwareBuffer 838 * 839 * Create a direct channel of {@link ASENSOR_DIRECT_CHANNEL_TYPE_HARDWARE_BUFFER} type to be used 840 * for configuring sensor direct report. 841 * 842 * Available since API level 26. 843 * 844 * \param manager the {@link ASensorManager} instance obtained from 845 * {@link ASensorManager_getInstanceForPackage}. 846 * \param buffer {@link AHardwareBuffer} instance created by {@link AHardwareBuffer_allocate}. 847 * \param size the intended size to be used, must be less or equal to size of buffer. 848 * 849 * \return a positive integer as a channel id to be used in 850 * {@link ASensorManager_destroyDirectChannel} and 851 * {@link ASensorManager_configureDirectReport}, or value less or equal to 0 for failures. 852 */ 853 int ASensorManager_createHardwareBufferDirectChannel( 854 ASensorManager* manager, AHardwareBuffer const * buffer, size_t size) __INTRODUCED_IN(26); 855 856 /** 857 * Destroy a direct channel 858 * 859 * Destroy a direct channel previously created by using one of 860 * ASensorManager_create*DirectChannel() derivative functions. 861 * Note that the buffer used for creating the direct channel does not get destroyed with 862 * ASensorManager_destroyDirectChannel and has to be closed or released separately. 863 * 864 * Available since API level 26. 865 * 866 * \param manager the {@link ASensorManager} instance obtained from 867 * {@link ASensorManager_getInstanceForPackage}. 868 * \param channelId channel id (a positive integer) returned from 869 * {@link ASensorManager_createSharedMemoryDirectChannel} or 870 * {@link ASensorManager_createHardwareBufferDirectChannel}. 871 */ 872 void ASensorManager_destroyDirectChannel(ASensorManager* manager, int channelId) __INTRODUCED_IN(26); 873 874 /** 875 * Configure direct report on channel 876 * 877 * Configure sensor direct report on a direct channel: set rate to value other than 878 * {@link ASENSOR_DIRECT_RATE_STOP} so that sensor event can be directly 879 * written into the shared memory region used for creating the buffer. It returns a positive token 880 * which can be used for identify sensor events from different sensors on success. Calling with rate 881 * {@link ASENSOR_DIRECT_RATE_STOP} will stop direct report of the sensor specified in the channel. 882 * 883 * To stop all active sensor direct report configured to a channel, set sensor to NULL and rate to 884 * {@link ASENSOR_DIRECT_RATE_STOP}. 885 * 886 * In order to successfully configure a direct report, the sensor has to support the specified rate 887 * and the channel type, which can be checked by {@link ASensor_getHighestDirectReportRateLevel} and 888 * {@link ASensor_isDirectChannelTypeSupported}, respectively. 889 * 890 * Example: 891 * 892 * ASensorManager *manager = ...; 893 * ASensor *sensor = ...; 894 * int channelId = ...; 895 * 896 * ASensorManager_configureDirectReport(manager, sensor, channel_id, ASENSOR_DIRECT_RATE_FAST); 897 * 898 * Available since API level 26. 899 * 900 * \param manager the {@link ASensorManager} instance obtained from 901 * {@link ASensorManager_getInstanceForPackage}. 902 * \param sensor a {@link ASensor} to denote which sensor to be operate. It can be NULL if rate 903 * is {@link ASENSOR_DIRECT_RATE_STOP}, denoting stopping of all active sensor 904 * direct report. 905 * \param channelId channel id (a positive integer) returned from 906 * {@link ASensorManager_createSharedMemoryDirectChannel} or 907 * {@link ASensorManager_createHardwareBufferDirectChannel}. 908 * \param rate one of predefined ASENSOR_DIRECT_RATE_... that is supported by the sensor. 909 * \return positive token for success or negative error code. 910 */ 911 int ASensorManager_configureDirectReport(ASensorManager* manager, 912 ASensor const* sensor, int channelId, int rate) __INTRODUCED_IN(26); 913 914 /*****************************************************************************/ 915 916 /** 917 * Enable the selected sensor with sampling and report parameters 918 * 919 * Enable the selected sensor at a specified sampling period and max batch report latency. 920 * To disable sensor, use {@link ASensorEventQueue_disableSensor}. 921 * 922 * \param queue {@link ASensorEventQueue} for sensor event to be report to. 923 * \param sensor {@link ASensor} to be enabled. 924 * \param samplingPeriodUs sampling period of sensor in microseconds. 925 * \param maxBatchReportLatencyUs maximum time interval between two batches of sensor events are 926 * delievered in microseconds. For sensor streaming, set to 0. 927 * \return 0 on success or a negative error code on failure. 928 */ 929 int ASensorEventQueue_registerSensor(ASensorEventQueue* queue, ASensor const* sensor, 930 int32_t samplingPeriodUs, int64_t maxBatchReportLatencyUs); 931 932 /** 933 * Enable the selected sensor at default sampling rate. 934 * 935 * Start event reports of a sensor to specified sensor event queue at a default rate. 936 * 937 * \param queue {@link ASensorEventQueue} for sensor event to be report to. 938 * \param sensor {@link ASensor} to be enabled. 939 * 940 * \return 0 on success or a negative error code on failure. 941 */ 942 int ASensorEventQueue_enableSensor(ASensorEventQueue* queue, ASensor const* sensor); 943 944 /** 945 * Disable the selected sensor. 946 * 947 * Stop event reports from the sensor to specified sensor event queue. 948 * 949 * \param queue {@link ASensorEventQueue} to be changed 950 * \param sensor {@link ASensor} to be disabled 951 * \return 0 on success or a negative error code on failure. 952 */ 953 int ASensorEventQueue_disableSensor(ASensorEventQueue* queue, ASensor const* sensor); 954 955 /** 956 * Sets the delivery rate of events in microseconds for the given sensor. 957 * 958 * This function has to be called after {@link ASensorEventQueue_enableSensor}. 959 * Note that this is a hint only, generally event will arrive at a higher 960 * rate. It is an error to set a rate inferior to the value returned by 961 * ASensor_getMinDelay(). 962 * 963 * \param queue {@link ASensorEventQueue} to which sensor event is delivered. 964 * \param sensor {@link ASensor} of which sampling rate to be updated. 965 * \param usec sensor sampling period (1/sampling rate) in microseconds 966 * \return 0 on sucess or a negative error code on failure. 967 */ 968 int ASensorEventQueue_setEventRate(ASensorEventQueue* queue, ASensor const* sensor, int32_t usec); 969 970 /** 971 * Determine if a sensor event queue has pending event to be processed. 972 * 973 * \param queue {@link ASensorEventQueue} to be queried 974 * \return 1 if the queue has events; 0 if it does not have events; 975 * or a negative value if there is an error. 976 */ 977 int ASensorEventQueue_hasEvents(ASensorEventQueue* queue); 978 979 /** 980 * Retrieve pending events in sensor event queue 981 * 982 * Retrieve next available events from the queue to a specified event array. 983 * 984 * \param queue {@link ASensorEventQueue} to get events from 985 * \param events pointer to an array of {@link ASensorEvent}. 986 * \param count max number of event that can be filled into array event. 987 * \return number of events returned on success; negative error code when 988 * no events are pending or an error has occurred. 989 * 990 * Examples: 991 * 992 * ASensorEvent event; 993 * ssize_t numEvent = ASensorEventQueue_getEvents(queue, &event, 1); 994 * 995 * ASensorEvent eventBuffer[8]; 996 * ssize_t numEvent = ASensorEventQueue_getEvents(queue, eventBuffer, 8); 997 * 998 */ 999 ssize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue, ASensorEvent* events, size_t count); 1000 1001 /** 1002 * Request that {@link ASENSOR_TYPE_ADDITIONAL_INFO} events to be delivered on 1003 * the given {@link ASensorEventQueue}. 1004 * 1005 * Sensor data events are always delivered to the {@link ASensorEventQueue}. 1006 * 1007 * The {@link ASENSOR_TYPE_ADDITIONAL_INFO} events will be returned through 1008 * {@link ASensorEventQueue_getEvents}. The client is responsible for checking 1009 * {@link ASensorEvent#type} to determine the event type prior to handling of 1010 * the event. 1011 * 1012 * The client must be tolerant of any value for 1013 * {@link AAdditionalInfoEvent#type}, as new values may be defined in the future 1014 * and may delivered to the client. 1015 * 1016 * Available since API level 29. 1017 * 1018 * \param queue {@link ASensorEventQueue} to configure 1019 * \param enable true to request {@link ASENSOR_TYPE_ADDITIONAL_INFO} events, 1020 * false to stop receiving events 1021 * \return 0 on success or a negative error code on failure 1022 */ 1023 int ASensorEventQueue_requestAdditionalInfoEvents(ASensorEventQueue* queue, bool enable) __INTRODUCED_IN(29); 1024 1025 /*****************************************************************************/ 1026 1027 /** 1028 * Returns this sensor's name (non localized) 1029 */ 1030 const char* ASensor_getName(ASensor const* sensor); 1031 1032 /** 1033 * Returns this sensor's vendor's name (non localized) 1034 */ 1035 const char* ASensor_getVendor(ASensor const* sensor); 1036 1037 /** 1038 * Return this sensor's type 1039 */ 1040 int ASensor_getType(ASensor const* sensor); 1041 1042 /** 1043 * Returns this sensors's resolution 1044 */ 1045 float ASensor_getResolution(ASensor const* sensor); 1046 1047 /** 1048 * Returns the minimum delay allowed between events in microseconds. 1049 * A value of zero means that this sensor doesn't report events at a 1050 * constant rate, but rather only when a new data is available. 1051 */ 1052 int ASensor_getMinDelay(ASensor const* sensor); 1053 1054 /** 1055 * Returns the maximum size of batches for this sensor. Batches will often be 1056 * smaller, as the hardware fifo might be used for other sensors. 1057 * 1058 * Available since API level 21. 1059 */ 1060 int ASensor_getFifoMaxEventCount(ASensor const* sensor) __INTRODUCED_IN(21); 1061 1062 /** 1063 * Returns the hardware batch fifo size reserved to this sensor. 1064 * 1065 * Available since API level 21. 1066 */ 1067 int ASensor_getFifoReservedEventCount(ASensor const* sensor) __INTRODUCED_IN(21); 1068 1069 /** 1070 * Returns this sensor's string type. 1071 * 1072 * Available since API level 21. 1073 */ 1074 const char* ASensor_getStringType(ASensor const* sensor) __INTRODUCED_IN(21); 1075 1076 /** 1077 * Returns the reporting mode for this sensor. One of AREPORTING_MODE_* constants. 1078 * 1079 * Available since API level 21. 1080 */ 1081 int ASensor_getReportingMode(ASensor const* sensor) __INTRODUCED_IN(21); 1082 1083 /** 1084 * Returns true if this is a wake up sensor, false otherwise. 1085 * 1086 * Available since API level 21. 1087 */ 1088 bool ASensor_isWakeUpSensor(ASensor const* sensor) __INTRODUCED_IN(21); 1089 1090 /** 1091 * Test if sensor supports a certain type of direct channel. 1092 * 1093 * Available since API level 26. 1094 * 1095 * \param sensor a {@link ASensor} to denote the sensor to be checked. 1096 * \param channelType Channel type constant, either 1097 * {@link ASENSOR_DIRECT_CHANNEL_TYPE_SHARED_MEMORY} 1098 * or {@link ASENSOR_DIRECT_CHANNEL_TYPE_HARDWARE_BUFFER}. 1099 * \returns true if sensor supports the specified direct channel type. 1100 */ 1101 bool ASensor_isDirectChannelTypeSupported(ASensor const* sensor, int channelType) __INTRODUCED_IN(26); 1102 1103 /** 1104 * Get the highest direct rate level that a sensor supports. 1105 * 1106 * Available since API level 26. 1107 * 1108 * \param sensor a {@link ASensor} to denote the sensor to be checked. 1109 * 1110 * \return a ASENSOR_DIRECT_RATE_... enum denoting the highest rate level supported by the sensor. 1111 * If return value is {@link ASENSOR_DIRECT_RATE_STOP}, it means the sensor 1112 * does not support direct report. 1113 */ 1114 int ASensor_getHighestDirectReportRateLevel(ASensor const* sensor) __INTRODUCED_IN(26); 1115 1116 /** 1117 * Returns the sensor's handle. 1118 * 1119 * The handle identifies the sensor within the system and is included in the 1120 * sensor field of {@link ASensorEvent}, including those sent with type 1121 * {@link ASENSOR_TYPE_ADDITIONAL_INFO}. 1122 * 1123 * A sensor's handle is able to be used to map {@link ASENSOR_TYPE_ADDITIONAL_INFO} events to the 1124 * sensor that generated the event. 1125 * 1126 * It is important to note that the value returned by {@link ASensor_getHandle} is not the same as 1127 * the value returned by the Java API <a href="/reference/android/hardware/Sensor#getId()"> 1128 * android.hardware.Sensor's getId()</a> and no mapping exists between the values. 1129 * 1130 * Available since API level 29. 1131 */ 1132 int ASensor_getHandle(ASensor const* sensor) __INTRODUCED_IN(29); 1133 1134 #ifdef __cplusplus 1135 }; 1136 #endif 1137 1138 #endif // ANDROID_SENSOR_H 1139 1140 /** @} */ 1141