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