• 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 
68 /* (Keep in sync with hardware/sensors-base.h and Sensor.java.) */
69 
70 /**
71  * Sensor types.
72  *
73  * See
74  * [android.hardware.SensorEvent#values](https://developer.android.com/reference/android/hardware/SensorEvent.html#values)
75  * for detailed explanations of the data returned for each of these types.
76  */
77 enum {
78     /**
79      * Invalid sensor type. Returned by {@link ASensor_getType} as error value.
80      */
81     ASENSOR_TYPE_INVALID = -1,
82     /**
83      * {@link ASENSOR_TYPE_ACCELEROMETER}
84      * reporting-mode: continuous
85      *
86      *  All values are in SI units (m/s^2) and measure the acceleration of the
87      *  device minus the force of gravity.
88      */
89     ASENSOR_TYPE_ACCELEROMETER       = 1,
90     /**
91      * {@link ASENSOR_TYPE_MAGNETIC_FIELD}
92      * reporting-mode: continuous
93      *
94      *  All values are in micro-Tesla (uT) and measure the geomagnetic
95      *  field in the X, Y and Z axis.
96      */
97     ASENSOR_TYPE_MAGNETIC_FIELD      = 2,
98     /**
99      * {@link ASENSOR_TYPE_GYROSCOPE}
100      * reporting-mode: continuous
101      *
102      *  All values are in radians/second and measure the rate of rotation
103      *  around the X, Y and Z axis.
104      */
105     ASENSOR_TYPE_GYROSCOPE           = 4,
106     /**
107      * {@link ASENSOR_TYPE_LIGHT}
108      * reporting-mode: on-change
109      *
110      * The light sensor value is returned in SI lux units.
111      */
112     ASENSOR_TYPE_LIGHT               = 5,
113     /**
114      * {@link ASENSOR_TYPE_PRESSURE}
115      *
116      * The pressure sensor value is returned in hPa (millibar).
117      */
118     ASENSOR_TYPE_PRESSURE            = 6,
119     /**
120      * {@link ASENSOR_TYPE_PROXIMITY}
121      * reporting-mode: on-change
122      *
123      * The proximity sensor which turns the screen off and back on during calls is the
124      * wake-up proximity sensor. Implement wake-up proximity sensor before implementing
125      * a non wake-up proximity sensor. For the wake-up proximity sensor set the flag
126      * SENSOR_FLAG_WAKE_UP.
127      * The value corresponds to the distance to the nearest object in centimeters.
128      */
129     ASENSOR_TYPE_PROXIMITY           = 8,
130     /**
131      * {@link ASENSOR_TYPE_GRAVITY}
132      *
133      * All values are in SI units (m/s^2) and measure the direction and
134      * magnitude of gravity. When the device is at rest, the output of
135      * the gravity sensor should be identical to that of the accelerometer.
136      */
137     ASENSOR_TYPE_GRAVITY             = 9,
138     /**
139      * {@link ASENSOR_TYPE_LINEAR_ACCELERATION}
140      * reporting-mode: continuous
141      *
142      *  All values are in SI units (m/s^2) and measure the acceleration of the
143      *  device not including the force of gravity.
144      */
145     ASENSOR_TYPE_LINEAR_ACCELERATION = 10,
146     /**
147      * {@link ASENSOR_TYPE_ROTATION_VECTOR}
148      */
149     ASENSOR_TYPE_ROTATION_VECTOR     = 11,
150     /**
151      * {@link ASENSOR_TYPE_RELATIVE_HUMIDITY}
152      *
153      * The relative humidity sensor value is returned in percent.
154      */
155     ASENSOR_TYPE_RELATIVE_HUMIDITY   = 12,
156     /**
157      * {@link ASENSOR_TYPE_AMBIENT_TEMPERATURE}
158      *
159      * The ambient temperature sensor value is returned in Celcius.
160      */
161     ASENSOR_TYPE_AMBIENT_TEMPERATURE = 13,
162     /**
163      * {@link ASENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED}
164      */
165     ASENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED = 14,
166     /**
167      * {@link ASENSOR_TYPE_GAME_ROTATION_VECTOR}
168      */
169     ASENSOR_TYPE_GAME_ROTATION_VECTOR = 15,
170     /**
171      * {@link ASENSOR_TYPE_GYROSCOPE_UNCALIBRATED}
172      */
173     ASENSOR_TYPE_GYROSCOPE_UNCALIBRATED = 16,
174     /**
175      * {@link ASENSOR_TYPE_SIGNIFICANT_MOTION}
176      */
177     ASENSOR_TYPE_SIGNIFICANT_MOTION = 17,
178     /**
179      * {@link ASENSOR_TYPE_STEP_DETECTOR}
180      */
181     ASENSOR_TYPE_STEP_DETECTOR = 18,
182     /**
183      * {@link ASENSOR_TYPE_STEP_COUNTER}
184      */
185     ASENSOR_TYPE_STEP_COUNTER = 19,
186     /**
187      * {@link ASENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR}
188      */
189     ASENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR = 20,
190     /**
191      * {@link ASENSOR_TYPE_HEART_RATE}
192      */
193     ASENSOR_TYPE_HEART_RATE = 21,
194     /**
195      * {@link ASENSOR_TYPE_POSE_6DOF}
196      */
197     ASENSOR_TYPE_POSE_6DOF = 28,
198     /**
199      * {@link ASENSOR_TYPE_STATIONARY_DETECT}
200      */
201     ASENSOR_TYPE_STATIONARY_DETECT = 29,
202     /**
203      * {@link ASENSOR_TYPE_MOTION_DETECT}
204      */
205     ASENSOR_TYPE_MOTION_DETECT = 30,
206     /**
207      * {@link ASENSOR_TYPE_HEART_BEAT}
208      */
209     ASENSOR_TYPE_HEART_BEAT = 31,
210     /**
211      * {@link ASENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT}
212      */
213     ASENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT = 34,
214     /**
215      * {@link ASENSOR_TYPE_ACCELEROMETER_UNCALIBRATED}
216      */
217     ASENSOR_TYPE_ACCELEROMETER_UNCALIBRATED = 35,
218 };
219 
220 /**
221  * Sensor accuracy measure.
222  */
223 enum {
224     /** no contact */
225     ASENSOR_STATUS_NO_CONTACT       = -1,
226     /** unreliable */
227     ASENSOR_STATUS_UNRELIABLE       = 0,
228     /** low accuracy */
229     ASENSOR_STATUS_ACCURACY_LOW     = 1,
230     /** medium accuracy */
231     ASENSOR_STATUS_ACCURACY_MEDIUM  = 2,
232     /** high accuracy */
233     ASENSOR_STATUS_ACCURACY_HIGH    = 3
234 };
235 
236 /**
237  * Sensor Reporting Modes.
238  */
239 enum {
240     /** invalid reporting mode */
241     AREPORTING_MODE_INVALID = -1,
242     /** continuous reporting */
243     AREPORTING_MODE_CONTINUOUS = 0,
244     /** reporting on change */
245     AREPORTING_MODE_ON_CHANGE = 1,
246     /** on shot reporting */
247     AREPORTING_MODE_ONE_SHOT = 2,
248     /** special trigger reporting */
249     AREPORTING_MODE_SPECIAL_TRIGGER = 3
250 };
251 
252 /**
253  * Sensor Direct Report Rates.
254  */
255 enum {
256     /** stopped */
257     ASENSOR_DIRECT_RATE_STOP = 0,
258     /** nominal 50Hz */
259     ASENSOR_DIRECT_RATE_NORMAL = 1,
260     /** nominal 200Hz */
261     ASENSOR_DIRECT_RATE_FAST = 2,
262     /** nominal 800Hz */
263     ASENSOR_DIRECT_RATE_VERY_FAST = 3
264 };
265 
266 /**
267  * Sensor Direct Channel Type.
268  */
269 enum {
270     /** shared memory created by ASharedMemory_create */
271     ASENSOR_DIRECT_CHANNEL_TYPE_SHARED_MEMORY = 1,
272     /** AHardwareBuffer */
273     ASENSOR_DIRECT_CHANNEL_TYPE_HARDWARE_BUFFER = 2
274 };
275 
276 /*
277  * A few useful constants
278  */
279 
280 /** Earth's gravity in m/s^2 */
281 #define ASENSOR_STANDARD_GRAVITY            (9.80665f)
282 /** Maximum magnetic field on Earth's surface in uT */
283 #define ASENSOR_MAGNETIC_FIELD_EARTH_MAX    (60.0f)
284 /** Minimum magnetic field on Earth's surface in uT*/
285 #define ASENSOR_MAGNETIC_FIELD_EARTH_MIN    (30.0f)
286 
287 /**
288  * A sensor event.
289  */
290 
291 /* NOTE: changes to these structs have to be backward compatible */
292 typedef struct ASensorVector {
293     union {
294         float v[3];
295         struct {
296             float x;
297             float y;
298             float z;
299         };
300         struct {
301             float azimuth;
302             float pitch;
303             float roll;
304         };
305     };
306     int8_t status;
307     uint8_t reserved[3];
308 } ASensorVector;
309 
310 typedef struct AMetaDataEvent {
311     int32_t what;
312     int32_t sensor;
313 } AMetaDataEvent;
314 
315 typedef struct AUncalibratedEvent {
316     union {
317         float uncalib[3];
318         struct {
319             float x_uncalib;
320             float y_uncalib;
321             float z_uncalib;
322         };
323     };
324     union {
325         float bias[3];
326         struct {
327             float x_bias;
328             float y_bias;
329             float z_bias;
330         };
331     };
332 } AUncalibratedEvent;
333 
334 typedef struct AHeartRateEvent {
335     float bpm;
336     int8_t status;
337 } AHeartRateEvent;
338 
339 typedef struct ADynamicSensorEvent {
340     int32_t  connected;
341     int32_t  handle;
342 } ADynamicSensorEvent;
343 
344 typedef struct {
345     int32_t type;
346     int32_t serial;
347     union {
348         int32_t data_int32[14];
349         float   data_float[14];
350     };
351 } AAdditionalInfoEvent;
352 
353 /* NOTE: changes to this struct has to be backward compatible */
354 typedef struct ASensorEvent {
355     int32_t version; /* sizeof(struct ASensorEvent) */
356     int32_t sensor;
357     int32_t type;
358     int32_t reserved0;
359     int64_t timestamp;
360     union {
361         union {
362             float           data[16];
363             ASensorVector   vector;
364             ASensorVector   acceleration;
365             ASensorVector   magnetic;
366             float           temperature;
367             float           distance;
368             float           light;
369             float           pressure;
370             float           relative_humidity;
371             AUncalibratedEvent uncalibrated_gyro;
372             AUncalibratedEvent uncalibrated_magnetic;
373             AMetaDataEvent meta_data;
374             AHeartRateEvent heart_rate;
375             ADynamicSensorEvent dynamic_sensor_meta;
376             AAdditionalInfoEvent additional_info;
377         };
378         union {
379             uint64_t        data[8];
380             uint64_t        step_counter;
381         } u64;
382     };
383 
384     uint32_t flags;
385     int32_t reserved1[3];
386 } ASensorEvent;
387 
388 struct ASensorManager;
389 /**
390  * {@link ASensorManager} is an opaque type to manage sensors and
391  * events queues.
392  *
393  * {@link ASensorManager} is a singleton that can be obtained using
394  * ASensorManager_getInstance().
395  *
396  * This file provides a set of functions that uses {@link
397  * ASensorManager} to access and list hardware sensors, and
398  * create and destroy event queues:
399  * - ASensorManager_getSensorList()
400  * - ASensorManager_getDefaultSensor()
401  * - ASensorManager_getDefaultSensorEx()
402  * - ASensorManager_createEventQueue()
403  * - ASensorManager_destroyEventQueue()
404  */
405 typedef struct ASensorManager ASensorManager;
406 
407 
408 struct ASensorEventQueue;
409 /**
410  * {@link ASensorEventQueue} is an opaque type that provides access to
411  * {@link ASensorEvent} from hardware sensors.
412  *
413  * A new {@link ASensorEventQueue} can be obtained using ASensorManager_createEventQueue().
414  *
415  * This file provides a set of functions to enable and disable
416  * sensors, check and get events, and set event rates on a {@link
417  * ASensorEventQueue}.
418  * - ASensorEventQueue_enableSensor()
419  * - ASensorEventQueue_disableSensor()
420  * - ASensorEventQueue_hasEvents()
421  * - ASensorEventQueue_getEvents()
422  * - ASensorEventQueue_setEventRate()
423  */
424 typedef struct ASensorEventQueue ASensorEventQueue;
425 
426 struct ASensor;
427 /**
428  * {@link ASensor} is an opaque type that provides information about
429  * an hardware sensors.
430  *
431  * A {@link ASensor} pointer can be obtained using
432  * ASensorManager_getDefaultSensor(),
433  * ASensorManager_getDefaultSensorEx() or from a {@link ASensorList}.
434  *
435  * This file provides a set of functions to access properties of a
436  * {@link ASensor}:
437  * - ASensor_getName()
438  * - ASensor_getVendor()
439  * - ASensor_getType()
440  * - ASensor_getResolution()
441  * - ASensor_getMinDelay()
442  * - ASensor_getFifoMaxEventCount()
443  * - ASensor_getFifoReservedEventCount()
444  * - ASensor_getStringType()
445  * - ASensor_getReportingMode()
446  * - ASensor_isWakeUpSensor()
447  */
448 typedef struct ASensor ASensor;
449 /**
450  * {@link ASensorRef} is a type for constant pointers to {@link ASensor}.
451  *
452  * This is used to define entry in {@link ASensorList} arrays.
453  */
454 typedef ASensor const* ASensorRef;
455 /**
456  * {@link ASensorList} is an array of reference to {@link ASensor}.
457  *
458  * A {@link ASensorList} can be initialized using ASensorManager_getSensorList().
459  */
460 typedef ASensorRef const* ASensorList;
461 
462 /*****************************************************************************/
463 
464 /**
465  * Get a reference to the sensor manager. ASensorManager is a singleton
466  * per package as different packages may have access to different sensors.
467  *
468  * Deprecated: Use ASensorManager_getInstanceForPackage(const char*) instead.
469  *
470  * Example:
471  *
472  *     ASensorManager* sensorManager = ASensorManager_getInstance();
473  *
474  */
475 #if __ANDROID_API__ >= __ANDROID_API_O__
476 __attribute__ ((deprecated)) ASensorManager* ASensorManager_getInstance();
477 #else
478 ASensorManager* ASensorManager_getInstance();
479 #endif
480 
481 #if __ANDROID_API__ >= __ANDROID_API_O__
482 /**
483  * Get a reference to the sensor manager. ASensorManager is a singleton
484  * per package as different packages may have access to different sensors.
485  *
486  * Example:
487  *
488  *     ASensorManager* sensorManager = ASensorManager_getInstanceForPackage("foo.bar.baz");
489  *
490  */
491 ASensorManager* ASensorManager_getInstanceForPackage(const char* packageName);
492 #endif
493 
494 /**
495  * Returns the list of available sensors.
496  */
497 int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list);
498 
499 /**
500  * Returns the default sensor for the given type, or NULL if no sensor
501  * of that type exists.
502  */
503 ASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type);
504 
505 #if __ANDROID_API__ >= 21
506 /**
507  * Returns the default sensor with the given type and wakeUp properties or NULL if no sensor
508  * of this type and wakeUp properties exists.
509  */
510 ASensor const* ASensorManager_getDefaultSensorEx(ASensorManager* manager, int type, bool wakeUp);
511 #endif
512 
513 /**
514  * Creates a new sensor event queue and associate it with a looper.
515  *
516  * "ident" is a identifier for the events that will be returned when
517  * calling ALooper_pollOnce(). The identifier must be >= 0, or
518  * ALOOPER_POLL_CALLBACK if providing a non-NULL callback.
519  */
520 ASensorEventQueue* ASensorManager_createEventQueue(ASensorManager* manager,
521         ALooper* looper, int ident, ALooper_callbackFunc callback, void* data);
522 
523 /**
524  * Destroys the event queue and free all resources associated to it.
525  */
526 int ASensorManager_destroyEventQueue(ASensorManager* manager, ASensorEventQueue* queue);
527 
528 #if __ANDROID_API__ >= __ANDROID_API_O__
529 /**
530  * Create direct channel based on shared memory
531  *
532  * Create a direct channel of {@link ASENSOR_DIRECT_CHANNEL_TYPE_SHARED_MEMORY} to be used
533  * for configuring sensor direct report.
534  *
535  * \param manager the {@link ASensorManager} instance obtained from
536  *                {@link ASensorManager_getInstanceForPackage}.
537  * \param fd      file descriptor representing a shared memory created by
538  *                {@link ASharedMemory_create}
539  * \param size    size to be used, must be less or equal to size of shared memory.
540  *
541  * \return a positive integer as a channel id to be used in
542  *         {@link ASensorManager_destroyDirectChannel} and
543  *         {@link ASensorManager_configureDirectReport}, or value less or equal to 0 for failures.
544  */
545 int ASensorManager_createSharedMemoryDirectChannel(ASensorManager* manager, int fd, size_t size);
546 
547 /**
548  * Create direct channel based on AHardwareBuffer
549  *
550  * Create a direct channel of {@link ASENSOR_DIRECT_CHANNEL_TYPE_HARDWARE_BUFFER} type to be used
551  * for configuring sensor direct report.
552  *
553  * \param manager the {@link ASensorManager} instance obtained from
554  *                {@link ASensorManager_getInstanceForPackage}.
555  * \param buffer  {@link AHardwareBuffer} instance created by {@link AHardwareBuffer_allocate}.
556  * \param size    the intended size to be used, must be less or equal to size of buffer.
557  *
558  * \return a positive integer as a channel id to be used in
559  *         {@link ASensorManager_destroyDirectChannel} and
560  *         {@link ASensorManager_configureDirectReport}, or value less or equal to 0 for failures.
561  */
562 int ASensorManager_createHardwareBufferDirectChannel(
563         ASensorManager* manager, AHardwareBuffer const * buffer, size_t size);
564 
565 /**
566  * Destroy a direct channel
567  *
568  * Destroy a direct channel previously created using {@link ASensorManager_createDirectChannel}.
569  * The buffer used for creating direct channel does not get destroyed with
570  * {@link ASensorManager_destroy} and has to be close or released separately.
571  *
572  * \param manager the {@link ASensorManager} instance obtained from
573  *                {@link ASensorManager_getInstanceForPackage}.
574  * \param channelId channel id (a positive integer) returned from
575  *                  {@link ASensorManager_createSharedMemoryDirectChannel} or
576  *                  {@link ASensorManager_createHardwareBufferDirectChannel}.
577  */
578 void ASensorManager_destroyDirectChannel(ASensorManager* manager, int channelId);
579 
580 /**
581  * Configure direct report on channel
582  *
583  * Configure sensor direct report on a direct channel: set rate to value other than
584  * {@link ASENSOR_DIRECT_RATE_STOP} so that sensor event can be directly
585  * written into the shared memory region used for creating the buffer. It returns a positive token
586  * which can be used for identify sensor events from different sensors on success. Calling with rate
587  * {@link ASENSOR_DIRECT_RATE_STOP} will stop direct report of the sensor specified in the channel.
588  *
589  * To stop all active sensor direct report configured to a channel, set sensor to NULL and rate to
590  * {@link ASENSOR_DIRECT_RATE_STOP}.
591  *
592  * In order to successfully configure a direct report, the sensor has to support the specified rate
593  * and the channel type, which can be checked by {@link ASensor_getHighestDirectReportRateLevel} and
594  * {@link ASensor_isDirectChannelTypeSupported}, respectively.
595  *
596  * Example:
597  *
598  *     ASensorManager *manager = ...;
599  *     ASensor *sensor = ...;
600  *     int channelId = ...;
601  *
602  *     ASensorManager_configureDirectReport(manager, sensor, channel_id, ASENSOR_DIRECT_RATE_FAST);
603  *
604  * \param manager   the {@link ASensorManager} instance obtained from
605  *                  {@link ASensorManager_getInstanceForPackage}.
606  * \param sensor    a {@link ASensor} to denote which sensor to be operate. It can be NULL if rate
607  *                  is {@link ASENSOR_DIRECT_RATE_STOP}, denoting stopping of all active sensor
608  *                  direct report.
609  * \param channelId channel id (a positive integer) returned from
610  *                  {@link ASensorManager_createSharedMemoryDirectChannel} or
611  *                  {@link ASensorManager_createHardwareBufferDirectChannel}.
612  *
613  * \return positive token for success or negative error code.
614  */
615 int ASensorManager_configureDirectReport(
616         ASensorManager* manager, ASensor const* sensor, int channelId, int rate);
617 #endif
618 
619 /*****************************************************************************/
620 
621 /**
622  * Enable the selected sensor with sampling and report parameters
623  *
624  * Enable the selected sensor at a specified sampling period and max batch report latency.
625  * To disable  sensor, use {@link ASensorEventQueue_disableSensor}.
626  *
627  * \param queue {@link ASensorEventQueue} for sensor event to be report to.
628  * \param sensor {@link ASensor} to be enabled.
629  * \param samplingPeriodUs sampling period of sensor in microseconds.
630  * \param maxBatchReportLatencyus maximum time interval between two batch of sensor events are
631  *                                delievered in microseconds. For sensor streaming, set to 0.
632  * \return 0 on success or a negative error code on failure.
633  */
634 int ASensorEventQueue_registerSensor(ASensorEventQueue* queue, ASensor const* sensor,
635         int32_t samplingPeriodUs, int64_t maxBatchReportLatencyUs);
636 
637 /**
638  * Enable the selected sensor at default sampling rate.
639  *
640  * Start event reports of a sensor to specified sensor event queue at a default rate.
641  *
642  * \param queue {@link ASensorEventQueue} for sensor event to be report to.
643  * \param sensor {@link ASensor} to be enabled.
644  *
645  * \return 0 on success or a negative error code on failure.
646  */
647 int ASensorEventQueue_enableSensor(ASensorEventQueue* queue, ASensor const* sensor);
648 
649 /**
650  * Disable the selected sensor.
651  *
652  * Stop event reports from the sensor to specified sensor event queue.
653  *
654  * \param queue {@link ASensorEventQueue} to be changed
655  * \param sensor {@link ASensor} to be disabled
656  * \return 0 on success or a negative error code on failure.
657  */
658 int ASensorEventQueue_disableSensor(ASensorEventQueue* queue, ASensor const* sensor);
659 
660 /**
661  * Sets the delivery rate of events in microseconds for the given sensor.
662  *
663  * This function has to be called after {@link ASensorEventQueue_enableSensor}.
664  * Note that this is a hint only, generally event will arrive at a higher
665  * rate. It is an error to set a rate inferior to the value returned by
666  * ASensor_getMinDelay().
667  *
668  * \param queue {@link ASensorEventQueue} to which sensor event is delivered.
669  * \param sensor {@link ASensor} of which sampling rate to be updated.
670  * \param usec sensor sampling period (1/sampling rate) in microseconds
671  * \return 0 on sucess or a negative error code on failure.
672  */
673 int ASensorEventQueue_setEventRate(ASensorEventQueue* queue, ASensor const* sensor, int32_t usec);
674 
675 /**
676  * Determine if a sensor event queue has pending event to be processed.
677  *
678  * \param queue {@link ASensorEventQueue} to be queried
679  * \return 1 if the queue has events; 0 if it does not have events;
680  *         or a negative value if there is an error.
681  */
682 int ASensorEventQueue_hasEvents(ASensorEventQueue* queue);
683 
684 /**
685  * Retrieve pending events in sensor event queue
686  *
687  * Retrieve next available events from the queue to a specified event array.
688  *
689  * \param queue {@link ASensorEventQueue} to get events from
690  * \param events pointer to an array of {@link ASensorEvents}.
691  * \param count max number of event that can be filled into array event.
692  * \return number of events returned on success; negative error code when
693  *         no events are pending or an error has occurred.
694  *
695  * Examples:
696  *
697  *     ASensorEvent event;
698  *     ssize_t numEvent = ASensorEventQueue_getEvents(queue, &event, 1);
699  *
700  *     ASensorEvent eventBuffer[8];
701  *     ssize_t numEvent = ASensorEventQueue_getEvents(queue, eventBuffer, 8);
702  *
703  */
704 ssize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue, ASensorEvent* events, size_t count);
705 
706 
707 /*****************************************************************************/
708 
709 /**
710  * Returns this sensor's name (non localized)
711  */
712 const char* ASensor_getName(ASensor const* sensor);
713 
714 /**
715  * Returns this sensor's vendor's name (non localized)
716  */
717 const char* ASensor_getVendor(ASensor const* sensor);
718 
719 /**
720  * Return this sensor's type
721  */
722 int ASensor_getType(ASensor const* sensor);
723 
724 /**
725  * Returns this sensors's resolution
726  */
727 float ASensor_getResolution(ASensor const* sensor);
728 
729 /**
730  * Returns the minimum delay allowed between events in microseconds.
731  * A value of zero means that this sensor doesn't report events at a
732  * constant rate, but rather only when a new data is available.
733  */
734 int ASensor_getMinDelay(ASensor const* sensor);
735 
736 #if __ANDROID_API__ >= 21
737 /**
738  * Returns the maximum size of batches for this sensor. Batches will often be
739  * smaller, as the hardware fifo might be used for other sensors.
740  */
741 int ASensor_getFifoMaxEventCount(ASensor const* sensor);
742 
743 /**
744  * Returns the hardware batch fifo size reserved to this sensor.
745  */
746 int ASensor_getFifoReservedEventCount(ASensor const* sensor);
747 
748 /**
749  * Returns this sensor's string type.
750  */
751 const char* ASensor_getStringType(ASensor const* sensor);
752 
753 /**
754  * Returns the reporting mode for this sensor. One of AREPORTING_MODE_* constants.
755  */
756 int ASensor_getReportingMode(ASensor const* sensor);
757 
758 /**
759  * Returns true if this is a wake up sensor, false otherwise.
760  */
761 bool ASensor_isWakeUpSensor(ASensor const* sensor);
762 #endif /* __ANDROID_API__ >= 21 */
763 
764 #if __ANDROID_API__ >= __ANDROID_API_O__
765 /**
766  * Test if sensor supports a certain type of direct channel.
767  *
768  * \param sensor  a {@link ASensor} to denote the sensor to be checked.
769  * \param channelType  Channel type constant, either
770  *                     {@ASENSOR_DIRECT_CHANNEL_TYPE_SHARED_MEMORY}
771  *                     or {@link ASENSOR_DIRECT_CHANNEL_TYPE_HARDWARE_BUFFER}.
772  * \returns true if sensor supports the specified direct channel type.
773  */
774 bool ASensor_isDirectChannelTypeSupported(ASensor const* sensor, int channelType);
775 /**
776  * Get the highest direct rate level that a sensor support.
777  *
778  * \param sensor  a {@link ASensor} to denote the sensor to be checked.
779  *
780  * \return a ASENSOR_DIRECT_RATE_... enum denoting the highest rate level supported by the sensor.
781  *         If return value is {@link ASENSOR_DIRECT_RATE_STOP}, it means the sensor
782  *         does not support direct report.
783  */
784 int ASensor_getHighestDirectReportRateLevel(ASensor const* sensor);
785 #endif
786 
787 #ifdef __cplusplus
788 };
789 #endif
790 
791 #endif // ANDROID_SENSOR_H
792 
793 /** @} */
794