| /* | |
| * Copyright (C) 2010 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #ifndef ANDROID_SENSOR_H | |
| #define ANDROID_SENSOR_H | |
| /****************************************************************** | |
| * | |
| * IMPORTANT NOTICE: | |
| * | |
| * This file is part of Android's set of stable system headers | |
| * exposed by the Android NDK (Native Development Kit). | |
| * | |
| * Third-party source AND binary code relies on the definitions | |
| * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES. | |
| * | |
| * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES) | |
| * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS | |
| * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY | |
| * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES | |
| */ | |
| /* | |
| * Structures and functions to receive and process sensor events in | |
| * native code. | |
| * | |
| */ | |
| #include <sys/types.h> | |
| #include <android/looper.h> | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif | |
| /* | |
| * Sensor types | |
| * (keep in sync with hardware/sensor.h) | |
| */ | |
| enum { | |
| ASENSOR_TYPE_ACCELEROMETER = 1, | |
| ASENSOR_TYPE_MAGNETIC_FIELD = 2, | |
| ASENSOR_TYPE_GYROSCOPE = 4, | |
| ASENSOR_TYPE_LIGHT = 5, | |
| ASENSOR_TYPE_PROXIMITY = 8 | |
| }; | |
| /* | |
| * Sensor accuracy measure | |
| */ | |
| enum { | |
| ASENSOR_STATUS_UNRELIABLE = 0, | |
| ASENSOR_STATUS_ACCURACY_LOW = 1, | |
| ASENSOR_STATUS_ACCURACY_MEDIUM = 2, | |
| ASENSOR_STATUS_ACCURACY_HIGH = 3 | |
| }; | |
| /* | |
| * A few useful constants | |
| */ | |
| /* Earth's gravity in m/s^2 */ | |
| #define ASENSOR_STANDARD_GRAVITY (9.80665f) | |
| /* Maximum magnetic field on Earth's surface in uT */ | |
| #define ASENSOR_MAGNETIC_FIELD_EARTH_MAX (60.0f) | |
| /* Minimum magnetic field on Earth's surface in uT*/ | |
| #define ASENSOR_MAGNETIC_FIELD_EARTH_MIN (30.0f) | |
| /* | |
| * A sensor event. | |
| */ | |
| /* NOTE: Must match hardware/sensors.h */ | |
| typedef struct ASensorVector { | |
| union { | |
| float v[3]; | |
| struct { | |
| float x; | |
| float y; | |
| float z; | |
| }; | |
| struct { | |
| float azimuth; | |
| float pitch; | |
| float roll; | |
| }; | |
| }; | |
| int8_t status; | |
| uint8_t reserved[3]; | |
| } ASensorVector; | |
| /* NOTE: Must match hardware/sensors.h */ | |
| typedef struct ASensorEvent { | |
| int32_t version; /* sizeof(struct ASensorEvent) */ | |
| int32_t sensor; | |
| int32_t type; | |
| int32_t reserved0; | |
| int64_t timestamp; | |
| union { | |
| float data[16]; | |
| ASensorVector vector; | |
| ASensorVector acceleration; | |
| ASensorVector magnetic; | |
| float temperature; | |
| float distance; | |
| float light; | |
| float pressure; | |
| }; | |
| int32_t reserved1[4]; | |
| } ASensorEvent; | |
| struct ASensorManager; | |
| typedef struct ASensorManager ASensorManager; | |
| struct ASensorEventQueue; | |
| typedef struct ASensorEventQueue ASensorEventQueue; | |
| struct ASensor; | |
| typedef struct ASensor ASensor; | |
| typedef ASensor const* ASensorRef; | |
| typedef ASensorRef const* ASensorList; | |
| /*****************************************************************************/ | |
| /* | |
| * Get a reference to the sensor manager. ASensorManager is a singleton. | |
| * | |
| * Example: | |
| * | |
| * ASensorManager* sensorManager = ASensorManager_getInstance(); | |
| * | |
| */ | |
| ASensorManager* ASensorManager_getInstance(); | |
| /* | |
| * Returns the list of available sensors. | |
| */ | |
| int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list); | |
| /* | |
| * Returns the default sensor for the given type, or NULL if no sensor | |
| * of that type exist. | |
| */ | |
| ASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type); | |
| /* | |
| * Creates a new sensor event queue and associate it with a looper. | |
| */ | |
| ASensorEventQueue* ASensorManager_createEventQueue(ASensorManager* manager, | |
| ALooper* looper, int ident, ALooper_callbackFunc callback, void* data); | |
| /* | |
| * Destroys the event queue and free all resources associated to it. | |
| */ | |
| int ASensorManager_destroyEventQueue(ASensorManager* manager, ASensorEventQueue* queue); | |
| /*****************************************************************************/ | |
| /* | |
| * Enable the selected sensor. Returns a negative error code on failure. | |
| */ | |
| int ASensorEventQueue_enableSensor(ASensorEventQueue* queue, ASensor const* sensor); | |
| /* | |
| * Disable the selected sensor. Returns a negative error code on failure. | |
| */ | |
| int ASensorEventQueue_disableSensor(ASensorEventQueue* queue, ASensor const* sensor); | |
| /* | |
| * Sets the delivery rate of events in microseconds for the given sensor. | |
| * Note that this is a hint only, generally event will arrive at a higher | |
| * rate. It is an error to set a rate inferior to the value returned by | |
| * ASensor_getMinDelay(). | |
| * Returns a negative error code on failure. | |
| */ | |
| int ASensorEventQueue_setEventRate(ASensorEventQueue* queue, ASensor const* sensor, int32_t usec); | |
| /* | |
| * Returns true if there are one or more events available in the | |
| * sensor queue. Returns 1 if the queue has events; 0 if | |
| * it does not have events; and a negative value if there is an error. | |
| */ | |
| int ASensorEventQueue_hasEvents(ASensorEventQueue* queue); | |
| /* | |
| * Returns the next available events from the queue. Returns a negative | |
| * value if no events are available or an error has occurred, otherwise | |
| * the number of events returned. | |
| * | |
| * Examples: | |
| * ASensorEvent event; | |
| * ssize_t numEvent = ASensorEventQueue_getEvents(queue, &event, 1); | |
| * | |
| * ASensorEvent eventBuffer[8]; | |
| * ssize_t numEvent = ASensorEventQueue_getEvents(queue, eventBuffer, 8); | |
| * | |
| */ | |
| ssize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue, | |
| ASensorEvent* events, size_t count); | |
| /*****************************************************************************/ | |
| /* | |
| * Returns this sensor's name (non localized) | |
| */ | |
| const char* ASensor_getName(ASensor const* sensor); | |
| /* | |
| * Returns this sensor's vendor's name (non localized) | |
| */ | |
| const char* ASensor_getVendor(ASensor const* sensor); | |
| /* | |
| * Return this sensor's type | |
| */ | |
| int ASensor_getType(ASensor const* sensor); | |
| /* | |
| * Returns this sensors's resolution | |
| */ | |
| float ASensor_getResolution(ASensor const* sensor); | |
| /* | |
| * Returns the minimum delay allowed between events in microseconds. | |
| * A value of zero means that this sensor doesn't report events at a | |
| * constant rate, but rather only when a new data is available. | |
| */ | |
| int ASensor_getMinDelay(ASensor const* sensor); | |
| #ifdef __cplusplus | |
| }; | |
| #endif | |
| #endif // ANDROID_SENSOR_H |