sensor.cpp revision ee5c18f038d952ce9378493386310899e4d51c84
16346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim/* 26346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * Copyright (C) 2009 The Android Open Source Project 36346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * 46346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * Licensed under the Apache License, Version 2.0 (the "License"); 56346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * you may not use this file except in compliance with the License. 66346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * You may obtain a copy of the License at 76346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * 86346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * http://www.apache.org/licenses/LICENSE-2.0 96346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * 106346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * Unless required by applicable law or agreed to in writing, software 116346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * distributed under the License is distributed on an "AS IS" BASIS, 126346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * See the License for the specific language governing permissions and 146346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * limitations under the License. 156346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim */ 166346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 176346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim#define LOG_TAG "sensor" 186346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim#include <utils/Log.h> 196346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 206346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim#include <android/looper.h> 216346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim#include <android/sensor.h> 226346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 236346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim#include <utils/RefBase.h> 246346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim#include <utils/Looper.h> 256346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim#include <utils/Timers.h> 266346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 276346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim#include <gui/Sensor.h> 286346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim#include <gui/SensorManager.h> 296346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim#include <gui/SensorEventQueue.h> 306346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 316346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim#include <poll.h> 326346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 336346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimusing android::sp; 346346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimusing android::Sensor; 356346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimusing android::SensorManager; 366346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimusing android::SensorEventQueue; 376346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimusing android::String8; 386346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimusing android::String16; 396346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 406346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim/*****************************************************************************/ 41e5779d79eb46a6bacd33c54dbb28d99b07c16186Jan NordqvistASensorManager* ASensorManager_getInstance() 42e5779d79eb46a6bacd33c54dbb28d99b07c16186Jan Nordqvist{ 43e5779d79eb46a6bacd33c54dbb28d99b07c16186Jan Nordqvist return ASensorManager_getInstanceForPackage(NULL); 44e5779d79eb46a6bacd33c54dbb28d99b07c16186Jan Nordqvist} 456346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 466346155c5a48495944041e65ec279c88b0fa1391Jaewan KimASensorManager* ASensorManager_getInstanceForPackage(const char* packageName) 476346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim{ 486346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim if (packageName) { 496346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim return &SensorManager::getInstanceForPackage(String16(packageName)); 506346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim } else { 516346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim return &SensorManager::getInstanceForPackage(String16()); 526346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim } 536346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim} 546346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 556346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimint ASensorManager_getSensorList(ASensorManager* manager, 566346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim ASensorList* list) 576346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim{ 586346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim Sensor const* const* l; 596346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim int c = static_cast<SensorManager*>(manager)->getSensorList(&l); 606346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim if (list) { 61e5779d79eb46a6bacd33c54dbb28d99b07c16186Jan Nordqvist *list = reinterpret_cast<ASensorList>(l); 626346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim } 636346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim return c; 646346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim} 656346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 66e5779d79eb46a6bacd33c54dbb28d99b07c16186Jan NordqvistASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type) 676346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim{ 686346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim return static_cast<SensorManager*>(manager)->getDefaultSensor(type); 69e5779d79eb46a6bacd33c54dbb28d99b07c16186Jan Nordqvist} 70e5779d79eb46a6bacd33c54dbb28d99b07c16186Jan Nordqvist 716346155c5a48495944041e65ec279c88b0fa1391Jaewan KimASensor const* ASensorManager_getDefaultSensorEx(ASensorManager* manager, 72e5779d79eb46a6bacd33c54dbb28d99b07c16186Jan Nordqvist int type, bool wakeUp) { 736346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim Sensor const* const* sensorList; 746346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim size_t size = static_cast<SensorManager*>(manager)->getSensorList(&sensorList); 756346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim for (size_t i = 0; i < size; ++i) { 766346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim if (ASensor_getType(sensorList[i]) == type && 776346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim ASensor_isWakeUpSensor(sensorList[i]) == wakeUp) { 786346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim return reinterpret_cast<ASensor const *>(sensorList[i]); 796346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim } 806346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim } 816346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim return NULL; 826346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim} 836346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 846346155c5a48495944041e65ec279c88b0fa1391Jaewan KimASensorEventQueue* ASensorManager_createEventQueue(ASensorManager* manager, 856346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim ALooper* looper, int ident, ALooper_callbackFunc callback, void* data) 866346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim{ 876346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim sp<SensorEventQueue> queue = 886346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim static_cast<SensorManager*>(manager)->createEventQueue(); 896346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim if (queue != 0) { 906346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim ALooper_addFd(looper, queue->getFd(), ident, ALOOPER_EVENT_INPUT, callback, data); 916346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim queue->looper = looper; 926346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim queue->incStrong(manager); 936346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim } 946346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim return static_cast<ASensorEventQueue*>(queue.get()); 956346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim} 966346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 976346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimint ASensorManager_destroyEventQueue(ASensorManager* manager, 986346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 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 108int 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 116int ASensorEventQueue_enableSensor(ASensorEventQueue* queue, ASensor const* sensor) 117{ 118 return static_cast<SensorEventQueue*>(queue)->enableSensor( 119 static_cast<Sensor const*>(sensor)); 120} 121 122int ASensorEventQueue_disableSensor(ASensorEventQueue* queue, ASensor const* sensor) 123{ 124 return static_cast<SensorEventQueue*>(queue)->disableSensor( 125 static_cast<Sensor const*>(sensor)); 126} 127 128int 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 135int 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 153ssize_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 165const char* ASensor_getName(ASensor const* sensor) 166{ 167 return static_cast<Sensor const*>(sensor)->getName().string(); 168} 169 170const char* ASensor_getVendor(ASensor const* sensor) 171{ 172 return static_cast<Sensor const*>(sensor)->getVendor().string(); 173} 174 175int ASensor_getType(ASensor const* sensor) 176{ 177 return static_cast<Sensor const*>(sensor)->getType(); 178} 179 180float ASensor_getResolution(ASensor const* sensor) 181{ 182 return static_cast<Sensor const*>(sensor)->getResolution(); 183} 184 185int ASensor_getMinDelay(ASensor const* sensor) 186{ 187 return static_cast<Sensor const*>(sensor)->getMinDelay(); 188} 189 190int ASensor_getFifoMaxEventCount(ASensor const* sensor) 191{ 192 return static_cast<Sensor const*>(sensor)->getFifoMaxEventCount(); 193} 194 195int ASensor_getFifoReservedEventCount(ASensor const* sensor) 196{ 197 return static_cast<Sensor const*>(sensor)->getFifoReservedEventCount(); 198} 199 200const char* ASensor_getStringType(ASensor const* sensor) 201{ 202 return static_cast<Sensor const*>(sensor)->getStringType().string(); 203} 204 205int ASensor_getReportingMode(ASensor const* sensor) 206{ 207 return static_cast<Sensor const*>(sensor)->getReportingMode(); 208} 209 210bool ASensor_isWakeUpSensor(ASensor const* sensor) 211{ 212 return static_cast<Sensor const*>(sensor)->isWakeUpSensor(); 213} 214