Home | History | Annotate | Download | only in android
      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 #ifndef ANDROID_SENSOR_H
     19 #define ANDROID_SENSOR_H
     20 
     21 /******************************************************************
     22  *
     23  * IMPORTANT NOTICE:
     24  *
     25  *   This file is part of Android's set of stable system headers
     26  *   exposed by the Android NDK (Native Development Kit).
     27  *
     28  *   Third-party source AND binary code relies on the definitions
     29  *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
     30  *
     31  *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
     32  *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
     33  *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
     34  *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
     35  */
     36 
     37 /*
     38  * Structures and functions to receive and process sensor events in
     39  * native code.
     40  *
     41  */
     42 
     43 #include <sys/types.h>
     44 
     45 #include <android/looper.h>
     46 
     47 #ifdef __cplusplus
     48 extern "C" {
     49 #endif
     50 
     51 
     52 /*
     53  * Sensor types
     54  * (keep in sync with hardware/sensor.h)
     55  */
     56 
     57 enum {
     58     ASENSOR_TYPE_ACCELEROMETER      = 1,
     59     ASENSOR_TYPE_MAGNETIC_FIELD     = 2,
     60     ASENSOR_TYPE_GYROSCOPE          = 4,
     61     ASENSOR_TYPE_LIGHT              = 5,
     62     ASENSOR_TYPE_PROXIMITY          = 8
     63 };
     64 
     65 /*
     66  * Sensor accuracy measure
     67  */
     68 enum {
     69     ASENSOR_STATUS_UNRELIABLE       = 0,
     70     ASENSOR_STATUS_ACCURACY_LOW     = 1,
     71     ASENSOR_STATUS_ACCURACY_MEDIUM  = 2,
     72     ASENSOR_STATUS_ACCURACY_HIGH    = 3
     73 };
     74 
     75 /*
     76  * A few useful constants
     77  */
     78 
     79 /* Earth's gravity in m/s^2 */
     80 #define ASENSOR_STANDARD_GRAVITY            (9.80665f)
     81 /* Maximum magnetic field on Earth's surface in uT */
     82 #define ASENSOR_MAGNETIC_FIELD_EARTH_MAX    (60.0f)
     83 /* Minimum magnetic field on Earth's surface in uT*/
     84 #define ASENSOR_MAGNETIC_FIELD_EARTH_MIN    (30.0f)
     85 
     86 /*
     87  * A sensor event.
     88  */
     89 
     90 /* NOTE: Must match hardware/sensors.h */
     91 typedef struct ASensorVector {
     92     union {
     93         float v[3];
     94         struct {
     95             float x;
     96             float y;
     97             float z;
     98         };
     99         struct {
    100             float azimuth;
    101             float pitch;
    102             float roll;
    103         };
    104     };
    105     int8_t status;
    106     uint8_t reserved[3];
    107 } ASensorVector;
    108 
    109 /* NOTE: Must match hardware/sensors.h */
    110 typedef struct ASensorEvent {
    111     int32_t version; /* sizeof(struct ASensorEvent) */
    112     int32_t sensor;
    113     int32_t type;
    114     int32_t reserved0;
    115     int64_t timestamp;
    116     union {
    117         float           data[16];
    118         ASensorVector   vector;
    119         ASensorVector   acceleration;
    120         ASensorVector   magnetic;
    121         float           temperature;
    122         float           distance;
    123         float           light;
    124         float           pressure;
    125     };
    126     int32_t reserved1[4];
    127 } ASensorEvent;
    128 
    129 
    130 struct ASensorManager;
    131 typedef struct ASensorManager ASensorManager;
    132 
    133 struct ASensorEventQueue;
    134 typedef struct ASensorEventQueue ASensorEventQueue;
    135 
    136 struct ASensor;
    137 typedef struct ASensor ASensor;
    138 typedef ASensor const* ASensorRef;
    139 typedef ASensorRef const* ASensorList;
    140 
    141 /*****************************************************************************/
    142 
    143 /*
    144  * Get a reference to the sensor manager. ASensorManager is a singleton.
    145  *
    146  * Example:
    147  *
    148  *     ASensorManager* sensorManager = ASensorManager_getInstance();
    149  *
    150  */
    151 ASensorManager* ASensorManager_getInstance();
    152 
    153 
    154 /*
    155  * Returns the list of available sensors.
    156  */
    157 int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list);
    158 
    159 /*
    160  * Returns the default sensor for the given type, or NULL if no sensor
    161  * of that type exist.
    162  */
    163 ASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type);
    164 
    165 /*
    166  * Creates a new sensor event queue and associate it with a looper.
    167  */
    168 ASensorEventQueue* ASensorManager_createEventQueue(ASensorManager* manager,
    169         ALooper* looper, int ident, ALooper_callbackFunc callback, void* data);
    170 
    171 /*
    172  * Destroys the event queue and free all resources associated to it.
    173  */
    174 int ASensorManager_destroyEventQueue(ASensorManager* manager, ASensorEventQueue* queue);
    175 
    176 
    177 /*****************************************************************************/
    178 
    179 /*
    180  * Enable the selected sensor. Returns a negative error code on failure.
    181  */
    182 int ASensorEventQueue_enableSensor(ASensorEventQueue* queue, ASensor const* sensor);
    183 
    184 /*
    185  * Disable the selected sensor. Returns a negative error code on failure.
    186  */
    187 int ASensorEventQueue_disableSensor(ASensorEventQueue* queue, ASensor const* sensor);
    188 
    189 /*
    190  * Sets the delivery rate of events in microseconds for the given sensor.
    191  * Note that this is a hint only, generally event will arrive at a higher
    192  * rate. It is an error to set a rate inferior to the value returned by
    193  * ASensor_getMinDelay().
    194  * Returns a negative error code on failure.
    195  */
    196 int ASensorEventQueue_setEventRate(ASensorEventQueue* queue, ASensor const* sensor, int32_t usec);
    197 
    198 /*
    199  * Returns true if there are one or more events available in the
    200  * sensor queue.  Returns 1 if the queue has events; 0 if
    201  * it does not have events; and a negative value if there is an error.
    202  */
    203 int ASensorEventQueue_hasEvents(ASensorEventQueue* queue);
    204 
    205 /*
    206  * Returns the next available events from the queue.  Returns a negative
    207  * value if no events are available or an error has occurred, otherwise
    208  * the number of events returned.
    209  *
    210  * Examples:
    211  *   ASensorEvent event;
    212  *   ssize_t numEvent = ASensorEventQueue_getEvents(queue, &event, 1);
    213  *
    214  *   ASensorEvent eventBuffer[8];
    215  *   ssize_t numEvent = ASensorEventQueue_getEvents(queue, eventBuffer, 8);
    216  *
    217  */
    218 ssize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue,
    219                 ASensorEvent* events, size_t count);
    220 
    221 
    222 /*****************************************************************************/
    223 
    224 /*
    225  * Returns this sensor's name (non localized)
    226  */
    227 const char* ASensor_getName(ASensor const* sensor);
    228 
    229 /*
    230  * Returns this sensor's vendor's name (non localized)
    231  */
    232 const char* ASensor_getVendor(ASensor const* sensor);
    233 
    234 /*
    235  * Return this sensor's type
    236  */
    237 int ASensor_getType(ASensor const* sensor);
    238 
    239 /*
    240  * Returns this sensors's resolution
    241  */
    242 float ASensor_getResolution(ASensor const* sensor) __NDK_FPABI__;
    243 
    244 /*
    245  * Returns the minimum delay allowed between events in microseconds.
    246  * A value of zero means that this sensor doesn't report events at a
    247  * constant rate, but rather only when a new data is available.
    248  */
    249 int ASensor_getMinDelay(ASensor const* sensor);
    250 
    251 
    252 #ifdef __cplusplus
    253 };
    254 #endif
    255 
    256 #endif // ANDROID_SENSOR_H
    257