Home | History | Annotate | Download | only in android
      1 /*
      2  * Copyright (C) 2009 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 #define LOG_TAG "sensor"
     18 #include <utils/Log.h>
     19 
     20 #include <android/looper.h>
     21 #include <android/sensor.h>
     22 
     23 #include <utils/RefBase.h>
     24 #include <utils/Looper.h>
     25 #include <utils/Timers.h>
     26 
     27 #include <gui/Sensor.h>
     28 #include <gui/SensorManager.h>
     29 #include <gui/SensorEventQueue.h>
     30 
     31 #include <poll.h>
     32 
     33 using android::sp;
     34 using android::Sensor;
     35 using android::SensorManager;
     36 using android::SensorEventQueue;
     37 using android::String8;
     38 using android::String16;
     39 
     40 /*****************************************************************************/
     41 ASensorManager* ASensorManager_getInstance()
     42 {
     43     return ASensorManager_getInstanceForPackage(NULL);
     44 }
     45 
     46 ASensorManager* ASensorManager_getInstanceForPackage(const char* packageName)
     47 {
     48     if (packageName) {
     49         return &SensorManager::getInstanceForPackage(String16(packageName));
     50     } else {
     51         return &SensorManager::getInstanceForPackage(String16());
     52     }
     53 }
     54 
     55 int ASensorManager_getSensorList(ASensorManager* manager,
     56         ASensorList* list)
     57 {
     58     Sensor const* const* l;
     59     int c = static_cast<SensorManager*>(manager)->getSensorList(&l);
     60     if (list) {
     61         *list = reinterpret_cast<ASensorList>(l);
     62     }
     63     return c;
     64 }
     65 
     66 ASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type)
     67 {
     68     return static_cast<SensorManager*>(manager)->getDefaultSensor(type);
     69 }
     70 
     71 ASensor const* ASensorManager_getDefaultSensorEx(ASensorManager* manager,
     72         int type, bool wakeUp) {
     73     Sensor const* const* sensorList;
     74     size_t size = static_cast<SensorManager*>(manager)->getSensorList(&sensorList);
     75     for (size_t i = 0; i < size; ++i) {
     76         if (ASensor_getType(sensorList[i]) == type &&
     77             ASensor_isWakeUpSensor(sensorList[i]) == wakeUp) {
     78             return reinterpret_cast<ASensor const *>(sensorList[i]);
     79        }
     80     }
     81     return NULL;
     82 }
     83 
     84 ASensorEventQueue* ASensorManager_createEventQueue(ASensorManager* manager,
     85         ALooper* looper, int ident, ALooper_callbackFunc callback, void* data)
     86 {
     87     sp<SensorEventQueue> queue =
     88             static_cast<SensorManager*>(manager)->createEventQueue();
     89     if (queue != 0) {
     90         ALooper_addFd(looper, queue->getFd(), ident, ALOOPER_EVENT_INPUT, callback, data);
     91         queue->looper = looper;
     92         queue->incStrong(manager);
     93     }
     94     return static_cast<ASensorEventQueue*>(queue.get());
     95 }
     96 
     97 int ASensorManager_destroyEventQueue(ASensorManager* manager,
     98         ASensorEventQueue* inQueue)
     99 {
    100     sp<SensorEventQueue> queue = static_cast<SensorEventQueue*>(inQueue);
    101     ALooper_removeFd(queue->looper, queue->getFd());
    102     queue->decStrong(manager);
    103     return 0;
    104 }
    105 
    106 /*****************************************************************************/
    107 
    108 int ASensorEventQueue_registerSensor(ASensorEventQueue* queue, ASensor const* sensor,
    109         int32_t samplingPeriodUs, int maxBatchReportLatencyUs)
    110 {
    111     return static_cast<SensorEventQueue*>(queue)->enableSensor(
    112             static_cast<Sensor const*>(sensor)->getHandle(), samplingPeriodUs,
    113                     maxBatchReportLatencyUs, 0);
    114 }
    115 
    116 int ASensorEventQueue_enableSensor(ASensorEventQueue* queue, ASensor const* sensor)
    117 {
    118     return static_cast<SensorEventQueue*>(queue)->enableSensor(
    119             static_cast<Sensor const*>(sensor));
    120 }
    121 
    122 int ASensorEventQueue_disableSensor(ASensorEventQueue* queue, ASensor const* sensor)
    123 {
    124     return static_cast<SensorEventQueue*>(queue)->disableSensor(
    125             static_cast<Sensor const*>(sensor));
    126 }
    127 
    128 int ASensorEventQueue_setEventRate(ASensorEventQueue* queue, ASensor const* sensor,
    129         int32_t usec)
    130 {
    131     return static_cast<SensorEventQueue*>(queue)->setEventRate(
    132             static_cast<Sensor const*>(sensor), us2ns(usec));
    133 }
    134 
    135 int ASensorEventQueue_hasEvents(ASensorEventQueue* queue)
    136 {
    137     struct pollfd pfd;
    138     pfd.fd = static_cast<SensorEventQueue*>(queue)->getFd();
    139     pfd.events = POLLIN;
    140     pfd.revents = 0;
    141 
    142     int nfd = poll(&pfd, 1, 0);
    143 
    144     if (nfd < 0)
    145         return -errno;
    146 
    147     if (pfd.revents != POLLIN)
    148         return -1;
    149 
    150     return (nfd == 0) ? 0 : 1;
    151 }
    152 
    153 ssize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue,
    154                 ASensorEvent* events, size_t count)
    155 {
    156     ssize_t actual = static_cast<SensorEventQueue*>(queue)->read(events, count);
    157     if (actual > 0) {
    158         static_cast<SensorEventQueue*>(queue)->sendAck(events, actual);
    159     }
    160     return actual;
    161 }
    162 
    163 /*****************************************************************************/
    164 
    165 const char* ASensor_getName(ASensor const* sensor)
    166 {
    167     return static_cast<Sensor const*>(sensor)->getName().string();
    168 }
    169 
    170 const char* ASensor_getVendor(ASensor const* sensor)
    171 {
    172     return static_cast<Sensor const*>(sensor)->getVendor().string();
    173 }
    174 
    175 int ASensor_getType(ASensor const* sensor)
    176 {
    177     return static_cast<Sensor const*>(sensor)->getType();
    178 }
    179 
    180 float ASensor_getResolution(ASensor const* sensor)
    181 {
    182     return static_cast<Sensor const*>(sensor)->getResolution();
    183 }
    184 
    185 int ASensor_getMinDelay(ASensor const* sensor)
    186 {
    187     return static_cast<Sensor const*>(sensor)->getMinDelay();
    188 }
    189 
    190 int ASensor_getFifoMaxEventCount(ASensor const* sensor)
    191 {
    192     return static_cast<Sensor const*>(sensor)->getFifoMaxEventCount();
    193 }
    194 
    195 int ASensor_getFifoReservedEventCount(ASensor const* sensor)
    196 {
    197     return static_cast<Sensor const*>(sensor)->getFifoReservedEventCount();
    198 }
    199 
    200 const char* ASensor_getStringType(ASensor const* sensor)
    201 {
    202     return static_cast<Sensor const*>(sensor)->getStringType().string();
    203 }
    204 
    205 int ASensor_getReportingMode(ASensor const* sensor)
    206 {
    207     return static_cast<Sensor const*>(sensor)->getReportingMode();
    208 }
    209 
    210 bool ASensor_isWakeUpSensor(ASensor const* sensor)
    211 {
    212     return static_cast<Sensor const*>(sensor)->isWakeUpSensor();
    213 }
    214