1951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 2951a39d68df598db08dfced8b4707755864a0492Ying Wang * Copyright (C) 2010 The Android Open Source Project 3951a39d68df598db08dfced8b4707755864a0492Ying Wang * 4951a39d68df598db08dfced8b4707755864a0492Ying Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5951a39d68df598db08dfced8b4707755864a0492Ying Wang * you may not use this file except in compliance with the License. 6951a39d68df598db08dfced8b4707755864a0492Ying Wang * You may obtain a copy of the License at 7951a39d68df598db08dfced8b4707755864a0492Ying Wang * 8951a39d68df598db08dfced8b4707755864a0492Ying Wang * http://www.apache.org/licenses/LICENSE-2.0 9951a39d68df598db08dfced8b4707755864a0492Ying Wang * 10951a39d68df598db08dfced8b4707755864a0492Ying Wang * Unless required by applicable law or agreed to in writing, software 11951a39d68df598db08dfced8b4707755864a0492Ying Wang * distributed under the License is distributed on an "AS IS" BASIS, 12951a39d68df598db08dfced8b4707755864a0492Ying Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13951a39d68df598db08dfced8b4707755864a0492Ying Wang * See the License for the specific language governing permissions and 14951a39d68df598db08dfced8b4707755864a0492Ying Wang * limitations under the License. 15951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 16951a39d68df598db08dfced8b4707755864a0492Ying Wang 17951a39d68df598db08dfced8b4707755864a0492Ying Wang 18951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifndef ANDROID_SENSOR_H 19951a39d68df598db08dfced8b4707755864a0492Ying Wang#define ANDROID_SENSOR_H 20951a39d68df598db08dfced8b4707755864a0492Ying Wang 21951a39d68df598db08dfced8b4707755864a0492Ying Wang/****************************************************************** 22951a39d68df598db08dfced8b4707755864a0492Ying Wang * 23951a39d68df598db08dfced8b4707755864a0492Ying Wang * IMPORTANT NOTICE: 24951a39d68df598db08dfced8b4707755864a0492Ying Wang * 25951a39d68df598db08dfced8b4707755864a0492Ying Wang * This file is part of Android's set of stable system headers 26951a39d68df598db08dfced8b4707755864a0492Ying Wang * exposed by the Android NDK (Native Development Kit). 27951a39d68df598db08dfced8b4707755864a0492Ying Wang * 28951a39d68df598db08dfced8b4707755864a0492Ying Wang * Third-party source AND binary code relies on the definitions 29951a39d68df598db08dfced8b4707755864a0492Ying Wang * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES. 30951a39d68df598db08dfced8b4707755864a0492Ying Wang * 31951a39d68df598db08dfced8b4707755864a0492Ying Wang * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES) 32951a39d68df598db08dfced8b4707755864a0492Ying Wang * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS 33951a39d68df598db08dfced8b4707755864a0492Ying Wang * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY 34951a39d68df598db08dfced8b4707755864a0492Ying Wang * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES 35951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 36951a39d68df598db08dfced8b4707755864a0492Ying Wang 37951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 38951a39d68df598db08dfced8b4707755864a0492Ying Wang * Structures and functions to receive and process sensor events in 39951a39d68df598db08dfced8b4707755864a0492Ying Wang * native code. 40951a39d68df598db08dfced8b4707755864a0492Ying Wang * 41951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 42951a39d68df598db08dfced8b4707755864a0492Ying Wang 43951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <sys/types.h> 44951a39d68df598db08dfced8b4707755864a0492Ying Wang 45951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <android/looper.h> 46951a39d68df598db08dfced8b4707755864a0492Ying Wang 47951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifdef __cplusplus 48951a39d68df598db08dfced8b4707755864a0492Ying Wangextern "C" { 49951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif 50951a39d68df598db08dfced8b4707755864a0492Ying Wang 51951a39d68df598db08dfced8b4707755864a0492Ying Wang 52951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 53951a39d68df598db08dfced8b4707755864a0492Ying Wang * Sensor types 54951a39d68df598db08dfced8b4707755864a0492Ying Wang * (keep in sync with hardware/sensor.h) 55951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 56951a39d68df598db08dfced8b4707755864a0492Ying Wang 57951a39d68df598db08dfced8b4707755864a0492Ying Wangenum { 58951a39d68df598db08dfced8b4707755864a0492Ying Wang ASENSOR_TYPE_ACCELEROMETER = 1, 59951a39d68df598db08dfced8b4707755864a0492Ying Wang ASENSOR_TYPE_MAGNETIC_FIELD = 2, 60951a39d68df598db08dfced8b4707755864a0492Ying Wang ASENSOR_TYPE_GYROSCOPE = 4, 61951a39d68df598db08dfced8b4707755864a0492Ying Wang ASENSOR_TYPE_LIGHT = 5, 62951a39d68df598db08dfced8b4707755864a0492Ying Wang ASENSOR_TYPE_PROXIMITY = 8 63951a39d68df598db08dfced8b4707755864a0492Ying Wang}; 64951a39d68df598db08dfced8b4707755864a0492Ying Wang 65951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 66951a39d68df598db08dfced8b4707755864a0492Ying Wang * Sensor accuracy measure 67951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 68951a39d68df598db08dfced8b4707755864a0492Ying Wangenum { 69951a39d68df598db08dfced8b4707755864a0492Ying Wang ASENSOR_STATUS_UNRELIABLE = 0, 70951a39d68df598db08dfced8b4707755864a0492Ying Wang ASENSOR_STATUS_ACCURACY_LOW = 1, 71951a39d68df598db08dfced8b4707755864a0492Ying Wang ASENSOR_STATUS_ACCURACY_MEDIUM = 2, 72951a39d68df598db08dfced8b4707755864a0492Ying Wang ASENSOR_STATUS_ACCURACY_HIGH = 3 73951a39d68df598db08dfced8b4707755864a0492Ying Wang}; 74951a39d68df598db08dfced8b4707755864a0492Ying Wang 75951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 76951a39d68df598db08dfced8b4707755864a0492Ying Wang * A few useful constants 77951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 78951a39d68df598db08dfced8b4707755864a0492Ying Wang 79951a39d68df598db08dfced8b4707755864a0492Ying Wang/* Earth's gravity in m/s^2 */ 80951a39d68df598db08dfced8b4707755864a0492Ying Wang#define ASENSOR_STANDARD_GRAVITY (9.80665f) 81951a39d68df598db08dfced8b4707755864a0492Ying Wang/* Maximum magnetic field on Earth's surface in uT */ 82951a39d68df598db08dfced8b4707755864a0492Ying Wang#define ASENSOR_MAGNETIC_FIELD_EARTH_MAX (60.0f) 83951a39d68df598db08dfced8b4707755864a0492Ying Wang/* Minimum magnetic field on Earth's surface in uT*/ 84951a39d68df598db08dfced8b4707755864a0492Ying Wang#define ASENSOR_MAGNETIC_FIELD_EARTH_MIN (30.0f) 85951a39d68df598db08dfced8b4707755864a0492Ying Wang 86951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 87951a39d68df598db08dfced8b4707755864a0492Ying Wang * A sensor event. 88951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 89951a39d68df598db08dfced8b4707755864a0492Ying Wang 90951a39d68df598db08dfced8b4707755864a0492Ying Wang/* NOTE: Must match hardware/sensors.h */ 91951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct ASensorVector { 92951a39d68df598db08dfced8b4707755864a0492Ying Wang union { 93951a39d68df598db08dfced8b4707755864a0492Ying Wang float v[3]; 94951a39d68df598db08dfced8b4707755864a0492Ying Wang struct { 95951a39d68df598db08dfced8b4707755864a0492Ying Wang float x; 96951a39d68df598db08dfced8b4707755864a0492Ying Wang float y; 97951a39d68df598db08dfced8b4707755864a0492Ying Wang float z; 98951a39d68df598db08dfced8b4707755864a0492Ying Wang }; 99951a39d68df598db08dfced8b4707755864a0492Ying Wang struct { 100951a39d68df598db08dfced8b4707755864a0492Ying Wang float azimuth; 101951a39d68df598db08dfced8b4707755864a0492Ying Wang float pitch; 102951a39d68df598db08dfced8b4707755864a0492Ying Wang float roll; 103951a39d68df598db08dfced8b4707755864a0492Ying Wang }; 104951a39d68df598db08dfced8b4707755864a0492Ying Wang }; 105951a39d68df598db08dfced8b4707755864a0492Ying Wang int8_t status; 106951a39d68df598db08dfced8b4707755864a0492Ying Wang uint8_t reserved[3]; 107951a39d68df598db08dfced8b4707755864a0492Ying Wang} ASensorVector; 108951a39d68df598db08dfced8b4707755864a0492Ying Wang 109951a39d68df598db08dfced8b4707755864a0492Ying Wang/* NOTE: Must match hardware/sensors.h */ 110951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct ASensorEvent { 111951a39d68df598db08dfced8b4707755864a0492Ying Wang int32_t version; /* sizeof(struct ASensorEvent) */ 112951a39d68df598db08dfced8b4707755864a0492Ying Wang int32_t sensor; 113951a39d68df598db08dfced8b4707755864a0492Ying Wang int32_t type; 114951a39d68df598db08dfced8b4707755864a0492Ying Wang int32_t reserved0; 115951a39d68df598db08dfced8b4707755864a0492Ying Wang int64_t timestamp; 116951a39d68df598db08dfced8b4707755864a0492Ying Wang union { 117951a39d68df598db08dfced8b4707755864a0492Ying Wang float data[16]; 118951a39d68df598db08dfced8b4707755864a0492Ying Wang ASensorVector vector; 119951a39d68df598db08dfced8b4707755864a0492Ying Wang ASensorVector acceleration; 120951a39d68df598db08dfced8b4707755864a0492Ying Wang ASensorVector magnetic; 121951a39d68df598db08dfced8b4707755864a0492Ying Wang float temperature; 122951a39d68df598db08dfced8b4707755864a0492Ying Wang float distance; 123951a39d68df598db08dfced8b4707755864a0492Ying Wang float light; 124951a39d68df598db08dfced8b4707755864a0492Ying Wang float pressure; 125951a39d68df598db08dfced8b4707755864a0492Ying Wang }; 126951a39d68df598db08dfced8b4707755864a0492Ying Wang int32_t reserved1[4]; 127951a39d68df598db08dfced8b4707755864a0492Ying Wang} ASensorEvent; 128951a39d68df598db08dfced8b4707755864a0492Ying Wang 129951a39d68df598db08dfced8b4707755864a0492Ying Wang 130951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct ASensorManager; 131951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct ASensorManager ASensorManager; 132951a39d68df598db08dfced8b4707755864a0492Ying Wang 133951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct ASensorEventQueue; 134951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct ASensorEventQueue ASensorEventQueue; 135951a39d68df598db08dfced8b4707755864a0492Ying Wang 136951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct ASensor; 137951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct ASensor ASensor; 138951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef ASensor const* ASensorRef; 139951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef ASensorRef const* ASensorList; 140951a39d68df598db08dfced8b4707755864a0492Ying Wang 141951a39d68df598db08dfced8b4707755864a0492Ying Wang/*****************************************************************************/ 142951a39d68df598db08dfced8b4707755864a0492Ying Wang 143951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 144951a39d68df598db08dfced8b4707755864a0492Ying Wang * Get a reference to the sensor manager. ASensorManager is a singleton. 145951a39d68df598db08dfced8b4707755864a0492Ying Wang * 146951a39d68df598db08dfced8b4707755864a0492Ying Wang * Example: 147951a39d68df598db08dfced8b4707755864a0492Ying Wang * 148951a39d68df598db08dfced8b4707755864a0492Ying Wang * ASensorManager* sensorManager = ASensorManager_getInstance(); 149951a39d68df598db08dfced8b4707755864a0492Ying Wang * 150951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 151951a39d68df598db08dfced8b4707755864a0492Ying WangASensorManager* ASensorManager_getInstance(); 152951a39d68df598db08dfced8b4707755864a0492Ying Wang 153951a39d68df598db08dfced8b4707755864a0492Ying Wang 154951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 155951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns the list of available sensors. 156951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 157951a39d68df598db08dfced8b4707755864a0492Ying Wangint ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list); 158951a39d68df598db08dfced8b4707755864a0492Ying Wang 159951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 160951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns the default sensor for the given type, or NULL if no sensor 161951a39d68df598db08dfced8b4707755864a0492Ying Wang * of that type exist. 162951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 163951a39d68df598db08dfced8b4707755864a0492Ying WangASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type); 164951a39d68df598db08dfced8b4707755864a0492Ying Wang 165951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 166951a39d68df598db08dfced8b4707755864a0492Ying Wang * Creates a new sensor event queue and associate it with a looper. 167951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 168951a39d68df598db08dfced8b4707755864a0492Ying WangASensorEventQueue* ASensorManager_createEventQueue(ASensorManager* manager, 169951a39d68df598db08dfced8b4707755864a0492Ying Wang ALooper* looper, int ident, ALooper_callbackFunc callback, void* data); 170951a39d68df598db08dfced8b4707755864a0492Ying Wang 171951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 172951a39d68df598db08dfced8b4707755864a0492Ying Wang * Destroys the event queue and free all resources associated to it. 173951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 174951a39d68df598db08dfced8b4707755864a0492Ying Wangint ASensorManager_destroyEventQueue(ASensorManager* manager, ASensorEventQueue* queue); 175951a39d68df598db08dfced8b4707755864a0492Ying Wang 176951a39d68df598db08dfced8b4707755864a0492Ying Wang 177951a39d68df598db08dfced8b4707755864a0492Ying Wang/*****************************************************************************/ 178951a39d68df598db08dfced8b4707755864a0492Ying Wang 179951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 180951a39d68df598db08dfced8b4707755864a0492Ying Wang * Enable the selected sensor. Returns a negative error code on failure. 181951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 182951a39d68df598db08dfced8b4707755864a0492Ying Wangint ASensorEventQueue_enableSensor(ASensorEventQueue* queue, ASensor const* sensor); 183951a39d68df598db08dfced8b4707755864a0492Ying Wang 184951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 185951a39d68df598db08dfced8b4707755864a0492Ying Wang * Disable the selected sensor. Returns a negative error code on failure. 186951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 187951a39d68df598db08dfced8b4707755864a0492Ying Wangint ASensorEventQueue_disableSensor(ASensorEventQueue* queue, ASensor const* sensor); 188951a39d68df598db08dfced8b4707755864a0492Ying Wang 189951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 190951a39d68df598db08dfced8b4707755864a0492Ying Wang * Sets the delivery rate of events in microseconds for the given sensor. 191951a39d68df598db08dfced8b4707755864a0492Ying Wang * Note that this is a hint only, generally event will arrive at a higher 192951a39d68df598db08dfced8b4707755864a0492Ying Wang * rate. It is an error to set a rate inferior to the value returned by 193951a39d68df598db08dfced8b4707755864a0492Ying Wang * ASensor_getMinDelay(). 194951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns a negative error code on failure. 195951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 196951a39d68df598db08dfced8b4707755864a0492Ying Wangint ASensorEventQueue_setEventRate(ASensorEventQueue* queue, ASensor const* sensor, int32_t usec); 197951a39d68df598db08dfced8b4707755864a0492Ying Wang 198951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 199951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns true if there are one or more events available in the 200951a39d68df598db08dfced8b4707755864a0492Ying Wang * sensor queue. Returns 1 if the queue has events; 0 if 201951a39d68df598db08dfced8b4707755864a0492Ying Wang * it does not have events; and a negative value if there is an error. 202951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 203951a39d68df598db08dfced8b4707755864a0492Ying Wangint ASensorEventQueue_hasEvents(ASensorEventQueue* queue); 204951a39d68df598db08dfced8b4707755864a0492Ying Wang 205951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 206951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns the next available events from the queue. Returns a negative 207951a39d68df598db08dfced8b4707755864a0492Ying Wang * value if no events are available or an error has occurred, otherwise 208951a39d68df598db08dfced8b4707755864a0492Ying Wang * the number of events returned. 209951a39d68df598db08dfced8b4707755864a0492Ying Wang * 210951a39d68df598db08dfced8b4707755864a0492Ying Wang * Examples: 211951a39d68df598db08dfced8b4707755864a0492Ying Wang * ASensorEvent event; 212951a39d68df598db08dfced8b4707755864a0492Ying Wang * ssize_t numEvent = ASensorEventQueue_getEvents(queue, &event, 1); 213951a39d68df598db08dfced8b4707755864a0492Ying Wang * 214951a39d68df598db08dfced8b4707755864a0492Ying Wang * ASensorEvent eventBuffer[8]; 215951a39d68df598db08dfced8b4707755864a0492Ying Wang * ssize_t numEvent = ASensorEventQueue_getEvents(queue, eventBuffer, 8); 216951a39d68df598db08dfced8b4707755864a0492Ying Wang * 217951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 218951a39d68df598db08dfced8b4707755864a0492Ying Wangssize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue, 219951a39d68df598db08dfced8b4707755864a0492Ying Wang ASensorEvent* events, size_t count); 220951a39d68df598db08dfced8b4707755864a0492Ying Wang 221951a39d68df598db08dfced8b4707755864a0492Ying Wang 222951a39d68df598db08dfced8b4707755864a0492Ying Wang/*****************************************************************************/ 223951a39d68df598db08dfced8b4707755864a0492Ying Wang 224951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 225951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns this sensor's name (non localized) 226951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 227951a39d68df598db08dfced8b4707755864a0492Ying Wangconst char* ASensor_getName(ASensor const* sensor); 228951a39d68df598db08dfced8b4707755864a0492Ying Wang 229951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 230951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns this sensor's vendor's name (non localized) 231951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 232951a39d68df598db08dfced8b4707755864a0492Ying Wangconst char* ASensor_getVendor(ASensor const* sensor); 233951a39d68df598db08dfced8b4707755864a0492Ying Wang 234951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 235951a39d68df598db08dfced8b4707755864a0492Ying Wang * Return this sensor's type 236951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 237951a39d68df598db08dfced8b4707755864a0492Ying Wangint ASensor_getType(ASensor const* sensor); 238951a39d68df598db08dfced8b4707755864a0492Ying Wang 239951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 240951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns this sensors's resolution 241951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 242951a39d68df598db08dfced8b4707755864a0492Ying Wangfloat ASensor_getResolution(ASensor const* sensor); 243951a39d68df598db08dfced8b4707755864a0492Ying Wang 244951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 245951a39d68df598db08dfced8b4707755864a0492Ying Wang * Returns the minimum delay allowed between events in microseconds. 246951a39d68df598db08dfced8b4707755864a0492Ying Wang * A value of zero means that this sensor doesn't report events at a 247951a39d68df598db08dfced8b4707755864a0492Ying Wang * constant rate, but rather only when a new data is available. 248951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 249951a39d68df598db08dfced8b4707755864a0492Ying Wangint ASensor_getMinDelay(ASensor const* sensor); 250951a39d68df598db08dfced8b4707755864a0492Ying Wang 251951a39d68df598db08dfced8b4707755864a0492Ying Wang 252951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifdef __cplusplus 253951a39d68df598db08dfced8b4707755864a0492Ying Wang}; 254951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif 255951a39d68df598db08dfced8b4707755864a0492Ying Wang 256951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif // ANDROID_SENSOR_H 257