1b957b9d63c88efd3a961759424987b99219adeedMathias Agopian/* 2b957b9d63c88efd3a961759424987b99219adeedMathias Agopian * Copyright (C) 2009 The Android Open Source Project 3b957b9d63c88efd3a961759424987b99219adeedMathias Agopian * 4b957b9d63c88efd3a961759424987b99219adeedMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 5b957b9d63c88efd3a961759424987b99219adeedMathias Agopian * you may not use this file except in compliance with the License. 6b957b9d63c88efd3a961759424987b99219adeedMathias Agopian * You may obtain a copy of the License at 7b957b9d63c88efd3a961759424987b99219adeedMathias Agopian * 8b957b9d63c88efd3a961759424987b99219adeedMathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 9b957b9d63c88efd3a961759424987b99219adeedMathias Agopian * 10b957b9d63c88efd3a961759424987b99219adeedMathias Agopian * Unless required by applicable law or agreed to in writing, software 11b957b9d63c88efd3a961759424987b99219adeedMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 12b957b9d63c88efd3a961759424987b99219adeedMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b957b9d63c88efd3a961759424987b99219adeedMathias Agopian * See the License for the specific language governing permissions and 14b957b9d63c88efd3a961759424987b99219adeedMathias Agopian * limitations under the License. 15b957b9d63c88efd3a961759424987b99219adeedMathias Agopian */ 16b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 17b957b9d63c88efd3a961759424987b99219adeedMathias Agopian#define LOG_TAG "sensor" 18b957b9d63c88efd3a961759424987b99219adeedMathias Agopian#include <utils/Log.h> 19b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 20b957b9d63c88efd3a961759424987b99219adeedMathias Agopian#include <android/looper.h> 21b957b9d63c88efd3a961759424987b99219adeedMathias Agopian#include <android/sensor.h> 223b170173460def252c834fa46706775ed4e1d9a7Peng Xu#include <android/sharedmem.h> 233b170173460def252c834fa46706775ed4e1d9a7Peng Xu#include <cutils/native_handle.h> 24caf8930960ae68d5be2a8952cc127bf3f154f433Mathias Agopian#include <sensor/Sensor.h> 25caf8930960ae68d5be2a8952cc127bf3f154f433Mathias Agopian#include <sensor/SensorManager.h> 26caf8930960ae68d5be2a8952cc127bf3f154f433Mathias Agopian#include <sensor/SensorEventQueue.h> 273b170173460def252c834fa46706775ed4e1d9a7Peng Xu#include <utils/Looper.h> 283b170173460def252c834fa46706775ed4e1d9a7Peng Xu#include <utils/RefBase.h> 293b170173460def252c834fa46706775ed4e1d9a7Peng Xu#include <utils/Timers.h> 305f73ab7e2a591d45b67a7aaf1b26cc9dcfe58502Jesse Hall#include <vndk/hardware_buffer.h> 31b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 32b957b9d63c88efd3a961759424987b99219adeedMathias Agopian#include <poll.h> 33b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 34b957b9d63c88efd3a961759424987b99219adeedMathias Agopianusing android::sp; 35b957b9d63c88efd3a961759424987b99219adeedMathias Agopianusing android::Sensor; 36b957b9d63c88efd3a961759424987b99219adeedMathias Agopianusing android::SensorManager; 37b957b9d63c88efd3a961759424987b99219adeedMathias Agopianusing android::SensorEventQueue; 38b957b9d63c88efd3a961759424987b99219adeedMathias Agopianusing android::String8; 39cbb56a8f4e8a47fad95db9b1ae6c343055b07acdSvet Ganovusing android::String16; 40b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 41b957b9d63c88efd3a961759424987b99219adeedMathias Agopian/*****************************************************************************/ 423b170173460def252c834fa46706775ed4e1d9a7Peng Xu#define ERROR_INVALID_PARAMETER(message) ALOGE("%s: " message, __func__) 433b170173460def252c834fa46706775ed4e1d9a7Peng Xu 4463483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu// frequently used checks 453b170173460def252c834fa46706775ed4e1d9a7Peng Xu#define RETURN_IF_MANAGER_IS_NULL(retval) do {\ 463b170173460def252c834fa46706775ed4e1d9a7Peng Xu if (manager == nullptr) { \ 473b170173460def252c834fa46706775ed4e1d9a7Peng Xu ERROR_INVALID_PARAMETER("manager cannot be NULL"); \ 483b170173460def252c834fa46706775ed4e1d9a7Peng Xu return retval; \ 493b170173460def252c834fa46706775ed4e1d9a7Peng Xu } \ 503b170173460def252c834fa46706775ed4e1d9a7Peng Xu } while (false) 513b170173460def252c834fa46706775ed4e1d9a7Peng Xu#define RETURN_IF_SENSOR_IS_NULL(retval) do {\ 523b170173460def252c834fa46706775ed4e1d9a7Peng Xu if (sensor == nullptr) { \ 533b170173460def252c834fa46706775ed4e1d9a7Peng Xu ERROR_INVALID_PARAMETER("sensor cannot be NULL"); \ 543b170173460def252c834fa46706775ed4e1d9a7Peng Xu return retval; \ 553b170173460def252c834fa46706775ed4e1d9a7Peng Xu } \ 563b170173460def252c834fa46706775ed4e1d9a7Peng Xu } while (false) 5763483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu#define RETURN_IF_QUEUE_IS_NULL(retval) do {\ 5863483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu if (queue == nullptr) { \ 5963483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu ERROR_INVALID_PARAMETER("queue cannot be NULL"); \ 6063483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu return retval; \ 6163483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu } \ 6263483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu } while (false) 633b170173460def252c834fa46706775ed4e1d9a7Peng Xu 6463483ad25280b66bd077b3b5e6864ff22a129e9dPeng XuASensorManager* ASensorManager_getInstance() { 6563483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu return ASensorManager_getInstanceForPackage(nullptr); 66cbb56a8f4e8a47fad95db9b1ae6c343055b07acdSvet Ganov} 67cbb56a8f4e8a47fad95db9b1ae6c343055b07acdSvet Ganov 6863483ad25280b66bd077b3b5e6864ff22a129e9dPeng XuASensorManager* ASensorManager_getInstanceForPackage(const char* packageName) { 69cbb56a8f4e8a47fad95db9b1ae6c343055b07acdSvet Ganov if (packageName) { 70cbb56a8f4e8a47fad95db9b1ae6c343055b07acdSvet Ganov return &SensorManager::getInstanceForPackage(String16(packageName)); 71cbb56a8f4e8a47fad95db9b1ae6c343055b07acdSvet Ganov } else { 72cbb56a8f4e8a47fad95db9b1ae6c343055b07acdSvet Ganov return &SensorManager::getInstanceForPackage(String16()); 73cbb56a8f4e8a47fad95db9b1ae6c343055b07acdSvet Ganov } 74cbb56a8f4e8a47fad95db9b1ae6c343055b07acdSvet Ganov} 75cbb56a8f4e8a47fad95db9b1ae6c343055b07acdSvet Ganov 7663483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xuint ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list) { 7763483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_MANAGER_IS_NULL(android::BAD_VALUE); 781bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian Sensor const* const* l; 79b957b9d63c88efd3a961759424987b99219adeedMathias Agopian int c = static_cast<SensorManager*>(manager)->getSensorList(&l); 80b957b9d63c88efd3a961759424987b99219adeedMathias Agopian if (list) { 811bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian *list = reinterpret_cast<ASensorList>(l); 82b957b9d63c88efd3a961759424987b99219adeedMathias Agopian } 83b957b9d63c88efd3a961759424987b99219adeedMathias Agopian return c; 84b957b9d63c88efd3a961759424987b99219adeedMathias Agopian} 85b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 8663483ad25280b66bd077b3b5e6864ff22a129e9dPeng XuASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type) { 8763483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_MANAGER_IS_NULL(nullptr); 88b957b9d63c88efd3a961759424987b99219adeedMathias Agopian return static_cast<SensorManager*>(manager)->getDefaultSensor(type); 89b957b9d63c88efd3a961759424987b99219adeedMathias Agopian} 90b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 9163483ad25280b66bd077b3b5e6864ff22a129e9dPeng XuASensor const* ASensorManager_getDefaultSensorEx(ASensorManager* manager, int type, bool wakeUp) { 9263483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_MANAGER_IS_NULL(nullptr); 9399fe16508200510e3d8ea2e3c34872be8cce826dAravind Akella Sensor const* const* sensorList; 9499fe16508200510e3d8ea2e3c34872be8cce826dAravind Akella size_t size = static_cast<SensorManager*>(manager)->getSensorList(&sensorList); 9599fe16508200510e3d8ea2e3c34872be8cce826dAravind Akella for (size_t i = 0; i < size; ++i) { 9699fe16508200510e3d8ea2e3c34872be8cce826dAravind Akella if (ASensor_getType(sensorList[i]) == type && 9799fe16508200510e3d8ea2e3c34872be8cce826dAravind Akella ASensor_isWakeUpSensor(sensorList[i]) == wakeUp) { 9899fe16508200510e3d8ea2e3c34872be8cce826dAravind Akella return reinterpret_cast<ASensor const *>(sensorList[i]); 9999fe16508200510e3d8ea2e3c34872be8cce826dAravind Akella } 10099fe16508200510e3d8ea2e3c34872be8cce826dAravind Akella } 10163483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu return nullptr; 10299fe16508200510e3d8ea2e3c34872be8cce826dAravind Akella} 10399fe16508200510e3d8ea2e3c34872be8cce826dAravind Akella 104b957b9d63c88efd3a961759424987b99219adeedMathias AgopianASensorEventQueue* ASensorManager_createEventQueue(ASensorManager* manager, 10563483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu ALooper* looper, int ident, ALooper_callbackFunc callback, void* data) { 10663483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_MANAGER_IS_NULL(nullptr); 10763483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu 10863483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu if (looper == nullptr) { 10963483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu ERROR_INVALID_PARAMETER("looper cannot be NULL"); 11063483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu return nullptr; 11163483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu } 11263483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu 113b957b9d63c88efd3a961759424987b99219adeedMathias Agopian sp<SensorEventQueue> queue = 114b957b9d63c88efd3a961759424987b99219adeedMathias Agopian static_cast<SensorManager*>(manager)->createEventQueue(); 115b957b9d63c88efd3a961759424987b99219adeedMathias Agopian if (queue != 0) { 1164fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown ALooper_addFd(looper, queue->getFd(), ident, ALOOPER_EVENT_INPUT, callback, data); 117b957b9d63c88efd3a961759424987b99219adeedMathias Agopian queue->looper = looper; 118b957b9d63c88efd3a961759424987b99219adeedMathias Agopian queue->incStrong(manager); 119b957b9d63c88efd3a961759424987b99219adeedMathias Agopian } 120b957b9d63c88efd3a961759424987b99219adeedMathias Agopian return static_cast<ASensorEventQueue*>(queue.get()); 121b957b9d63c88efd3a961759424987b99219adeedMathias Agopian} 122b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 12363483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xuint ASensorManager_destroyEventQueue(ASensorManager* manager, ASensorEventQueue* queue) { 12463483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_MANAGER_IS_NULL(android::BAD_VALUE); 12563483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); 12663483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu 12763483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu sp<SensorEventQueue> q = static_cast<SensorEventQueue*>(queue); 12863483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu ALooper_removeFd(q->looper, q->getFd()); 12963483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu q->decStrong(manager); 130b957b9d63c88efd3a961759424987b99219adeedMathias Agopian return 0; 131b957b9d63c88efd3a961759424987b99219adeedMathias Agopian} 132b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 13363483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xuint ASensorManager_createSharedMemoryDirectChannel(ASensorManager *manager, int fd, size_t size) { 1343b170173460def252c834fa46706775ed4e1d9a7Peng Xu RETURN_IF_MANAGER_IS_NULL(android::BAD_VALUE); 1353b170173460def252c834fa46706775ed4e1d9a7Peng Xu 1363b170173460def252c834fa46706775ed4e1d9a7Peng Xu if (fd < 0) { 1373b170173460def252c834fa46706775ed4e1d9a7Peng Xu ERROR_INVALID_PARAMETER("fd is invalid."); 1383b170173460def252c834fa46706775ed4e1d9a7Peng Xu return android::BAD_VALUE; 1393b170173460def252c834fa46706775ed4e1d9a7Peng Xu } 1403b170173460def252c834fa46706775ed4e1d9a7Peng Xu 1413b170173460def252c834fa46706775ed4e1d9a7Peng Xu if (size < sizeof(ASensorEvent)) { 1423b170173460def252c834fa46706775ed4e1d9a7Peng Xu ERROR_INVALID_PARAMETER("size has to be greater or equal to sizeof(ASensorEvent)."); 14363483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu return android::BAD_VALUE; 1443b170173460def252c834fa46706775ed4e1d9a7Peng Xu } 1453b170173460def252c834fa46706775ed4e1d9a7Peng Xu 1463b170173460def252c834fa46706775ed4e1d9a7Peng Xu native_handle_t *resourceHandle = native_handle_create(1 /* nFd */, 0 /* nInt */); 1473b170173460def252c834fa46706775ed4e1d9a7Peng Xu if (!resourceHandle) { 1483b170173460def252c834fa46706775ed4e1d9a7Peng Xu return android::NO_MEMORY; 1493b170173460def252c834fa46706775ed4e1d9a7Peng Xu } 1503b170173460def252c834fa46706775ed4e1d9a7Peng Xu 1513b170173460def252c834fa46706775ed4e1d9a7Peng Xu resourceHandle->data[0] = fd; 1523b170173460def252c834fa46706775ed4e1d9a7Peng Xu int ret = static_cast<SensorManager *>(manager)->createDirectChannel( 1533b170173460def252c834fa46706775ed4e1d9a7Peng Xu size, ASENSOR_DIRECT_CHANNEL_TYPE_SHARED_MEMORY, resourceHandle); 1543b170173460def252c834fa46706775ed4e1d9a7Peng Xu native_handle_delete(resourceHandle); 1553b170173460def252c834fa46706775ed4e1d9a7Peng Xu return ret; 1563b170173460def252c834fa46706775ed4e1d9a7Peng Xu} 1573b170173460def252c834fa46706775ed4e1d9a7Peng Xu 1583b170173460def252c834fa46706775ed4e1d9a7Peng Xuint ASensorManager_createHardwareBufferDirectChannel( 1593b170173460def252c834fa46706775ed4e1d9a7Peng Xu ASensorManager *manager, AHardwareBuffer const *buffer, size_t size) { 1603b170173460def252c834fa46706775ed4e1d9a7Peng Xu RETURN_IF_MANAGER_IS_NULL(android::BAD_VALUE); 1613b170173460def252c834fa46706775ed4e1d9a7Peng Xu 1623b170173460def252c834fa46706775ed4e1d9a7Peng Xu if (buffer == nullptr) { 1633b170173460def252c834fa46706775ed4e1d9a7Peng Xu ERROR_INVALID_PARAMETER("buffer cannot be NULL"); 1643b170173460def252c834fa46706775ed4e1d9a7Peng Xu return android::BAD_VALUE; 1653b170173460def252c834fa46706775ed4e1d9a7Peng Xu } 1663b170173460def252c834fa46706775ed4e1d9a7Peng Xu 1673b170173460def252c834fa46706775ed4e1d9a7Peng Xu if (size < sizeof(ASensorEvent)) { 1683b170173460def252c834fa46706775ed4e1d9a7Peng Xu ERROR_INVALID_PARAMETER("size has to be greater or equal to sizeof(ASensorEvent)."); 16963483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu return android::BAD_VALUE; 1703b170173460def252c834fa46706775ed4e1d9a7Peng Xu } 1713b170173460def252c834fa46706775ed4e1d9a7Peng Xu 1723b170173460def252c834fa46706775ed4e1d9a7Peng Xu const native_handle_t *resourceHandle = AHardwareBuffer_getNativeHandle(buffer); 1733b170173460def252c834fa46706775ed4e1d9a7Peng Xu if (!resourceHandle) { 1743b170173460def252c834fa46706775ed4e1d9a7Peng Xu return android::NO_MEMORY; 1753b170173460def252c834fa46706775ed4e1d9a7Peng Xu } 1763b170173460def252c834fa46706775ed4e1d9a7Peng Xu 1773b170173460def252c834fa46706775ed4e1d9a7Peng Xu return static_cast<SensorManager *>(manager)->createDirectChannel( 1783b170173460def252c834fa46706775ed4e1d9a7Peng Xu size, ASENSOR_DIRECT_CHANNEL_TYPE_HARDWARE_BUFFER, resourceHandle); 1793b170173460def252c834fa46706775ed4e1d9a7Peng Xu} 1803b170173460def252c834fa46706775ed4e1d9a7Peng Xu 1813b170173460def252c834fa46706775ed4e1d9a7Peng Xuvoid ASensorManager_destroyDirectChannel(ASensorManager *manager, int channelId) { 1823b170173460def252c834fa46706775ed4e1d9a7Peng Xu RETURN_IF_MANAGER_IS_NULL(void()); 1833b170173460def252c834fa46706775ed4e1d9a7Peng Xu 1843b170173460def252c834fa46706775ed4e1d9a7Peng Xu static_cast<SensorManager *>(manager)->destroyDirectChannel(channelId); 1853b170173460def252c834fa46706775ed4e1d9a7Peng Xu} 1863b170173460def252c834fa46706775ed4e1d9a7Peng Xu 1873b170173460def252c834fa46706775ed4e1d9a7Peng Xuint ASensorManager_configureDirectReport( 1883b170173460def252c834fa46706775ed4e1d9a7Peng Xu ASensorManager *manager, ASensor const *sensor, int channelId, int rate) { 1893b170173460def252c834fa46706775ed4e1d9a7Peng Xu RETURN_IF_MANAGER_IS_NULL(android::BAD_VALUE); 1903b170173460def252c834fa46706775ed4e1d9a7Peng Xu 1913b170173460def252c834fa46706775ed4e1d9a7Peng Xu int sensorHandle; 1923b170173460def252c834fa46706775ed4e1d9a7Peng Xu if (sensor == nullptr) { 1933b170173460def252c834fa46706775ed4e1d9a7Peng Xu if (rate != ASENSOR_DIRECT_RATE_STOP) { 1943b170173460def252c834fa46706775ed4e1d9a7Peng Xu ERROR_INVALID_PARAMETER( 1953b170173460def252c834fa46706775ed4e1d9a7Peng Xu "sensor cannot be null when rate is not ASENSOR_DIRECT_RATE_STOP"); 1963b170173460def252c834fa46706775ed4e1d9a7Peng Xu return android::BAD_VALUE; 1973b170173460def252c834fa46706775ed4e1d9a7Peng Xu } 1983b170173460def252c834fa46706775ed4e1d9a7Peng Xu sensorHandle = -1; 1993b170173460def252c834fa46706775ed4e1d9a7Peng Xu } else { 2003b170173460def252c834fa46706775ed4e1d9a7Peng Xu sensorHandle = static_cast<Sensor const *>(sensor)->getHandle(); 2013b170173460def252c834fa46706775ed4e1d9a7Peng Xu } 2023b170173460def252c834fa46706775ed4e1d9a7Peng Xu return static_cast<SensorManager *>(manager)->configureDirectChannel( 2033b170173460def252c834fa46706775ed4e1d9a7Peng Xu channelId, sensorHandle, rate); 2043b170173460def252c834fa46706775ed4e1d9a7Peng Xu} 2053b170173460def252c834fa46706775ed4e1d9a7Peng Xu 206b957b9d63c88efd3a961759424987b99219adeedMathias Agopian/*****************************************************************************/ 207b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 208ee5c18f038d952ce9378493386310899e4d51c84Aniroop Mathurint ASensorEventQueue_registerSensor(ASensorEventQueue* queue, ASensor const* sensor, 20963483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu int32_t samplingPeriodUs, int64_t maxBatchReportLatencyUs) { 21063483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); 21163483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_SENSOR_IS_NULL(android::BAD_VALUE); 21263483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu if (samplingPeriodUs < 0 || maxBatchReportLatencyUs < 0) { 21363483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu ERROR_INVALID_PARAMETER("samplingPeriodUs and maxBatchReportLatencyUs cannot be negative"); 21463483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu return android::BAD_VALUE; 21563483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu } 21663483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu 217ee5c18f038d952ce9378493386310899e4d51c84Aniroop Mathur return static_cast<SensorEventQueue*>(queue)->enableSensor( 218ee5c18f038d952ce9378493386310899e4d51c84Aniroop Mathur static_cast<Sensor const*>(sensor)->getHandle(), samplingPeriodUs, 219ee5c18f038d952ce9378493386310899e4d51c84Aniroop Mathur maxBatchReportLatencyUs, 0); 220ee5c18f038d952ce9378493386310899e4d51c84Aniroop Mathur} 221ee5c18f038d952ce9378493386310899e4d51c84Aniroop Mathur 22263483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xuint ASensorEventQueue_enableSensor(ASensorEventQueue* queue, ASensor const* sensor) { 22363483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); 22463483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_SENSOR_IS_NULL(android::BAD_VALUE); 22563483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu 226b957b9d63c88efd3a961759424987b99219adeedMathias Agopian return static_cast<SensorEventQueue*>(queue)->enableSensor( 2271bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian static_cast<Sensor const*>(sensor)); 228b957b9d63c88efd3a961759424987b99219adeedMathias Agopian} 229b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 23063483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xuint ASensorEventQueue_disableSensor(ASensorEventQueue* queue, ASensor const* sensor) { 23163483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); 23263483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_SENSOR_IS_NULL(android::BAD_VALUE); 23363483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu 234b957b9d63c88efd3a961759424987b99219adeedMathias Agopian return static_cast<SensorEventQueue*>(queue)->disableSensor( 2351bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian static_cast<Sensor const*>(sensor)); 236b957b9d63c88efd3a961759424987b99219adeedMathias Agopian} 237b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 23863483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xuint ASensorEventQueue_setEventRate(ASensorEventQueue* queue, ASensor const* sensor, int32_t usec) { 23963483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); 24063483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_SENSOR_IS_NULL(android::BAD_VALUE); 24163483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu 24263483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu if (usec < 0) { 24363483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu ERROR_INVALID_PARAMETER("usec cannot be negative"); 24463483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu return android::BAD_VALUE; 24563483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu } 24663483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu 247b957b9d63c88efd3a961759424987b99219adeedMathias Agopian return static_cast<SensorEventQueue*>(queue)->setEventRate( 2481bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian static_cast<Sensor const*>(sensor), us2ns(usec)); 249b957b9d63c88efd3a961759424987b99219adeedMathias Agopian} 250b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 25163483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xuint ASensorEventQueue_hasEvents(ASensorEventQueue* queue) { 25263483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); 25363483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu 254b957b9d63c88efd3a961759424987b99219adeedMathias Agopian struct pollfd pfd; 255b957b9d63c88efd3a961759424987b99219adeedMathias Agopian pfd.fd = static_cast<SensorEventQueue*>(queue)->getFd(); 256b957b9d63c88efd3a961759424987b99219adeedMathias Agopian pfd.events = POLLIN; 257b957b9d63c88efd3a961759424987b99219adeedMathias Agopian pfd.revents = 0; 258b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 259b957b9d63c88efd3a961759424987b99219adeedMathias Agopian int nfd = poll(&pfd, 1, 0); 260b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 261b957b9d63c88efd3a961759424987b99219adeedMathias Agopian if (nfd < 0) 262b957b9d63c88efd3a961759424987b99219adeedMathias Agopian return -errno; 263b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 264b957b9d63c88efd3a961759424987b99219adeedMathias Agopian if (pfd.revents != POLLIN) 265b957b9d63c88efd3a961759424987b99219adeedMathias Agopian return -1; 266b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 267b957b9d63c88efd3a961759424987b99219adeedMathias Agopian return (nfd == 0) ? 0 : 1; 268b957b9d63c88efd3a961759424987b99219adeedMathias Agopian} 269b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 27063483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xussize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue, ASensorEvent* events, size_t count) { 27163483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); 27263483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu if (events == nullptr) { 27363483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu ERROR_INVALID_PARAMETER("events cannot be NULL"); 27463483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu return android::BAD_VALUE; 27563483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu } 27663483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu 27735187bd5c1e40ea52a672c525411d05cbcdd6482Aravind Akella ssize_t actual = static_cast<SensorEventQueue*>(queue)->read(events, count); 27835187bd5c1e40ea52a672c525411d05cbcdd6482Aravind Akella if (actual > 0) { 27935187bd5c1e40ea52a672c525411d05cbcdd6482Aravind Akella static_cast<SensorEventQueue*>(queue)->sendAck(events, actual); 28035187bd5c1e40ea52a672c525411d05cbcdd6482Aravind Akella } 28135187bd5c1e40ea52a672c525411d05cbcdd6482Aravind Akella return actual; 282b957b9d63c88efd3a961759424987b99219adeedMathias Agopian} 283b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 284b957b9d63c88efd3a961759424987b99219adeedMathias Agopian/*****************************************************************************/ 285b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 28663483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xuconst char* ASensor_getName(ASensor const* sensor) { 28763483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_SENSOR_IS_NULL(nullptr); 2881bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian return static_cast<Sensor const*>(sensor)->getName().string(); 289b957b9d63c88efd3a961759424987b99219adeedMathias Agopian} 290b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 29163483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xuconst char* ASensor_getVendor(ASensor const* sensor) { 29263483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_SENSOR_IS_NULL(nullptr); 2931bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian return static_cast<Sensor const*>(sensor)->getVendor().string(); 294b957b9d63c88efd3a961759424987b99219adeedMathias Agopian} 295b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 29663483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xuint ASensor_getType(ASensor const* sensor) { 29763483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_SENSOR_IS_NULL(ASENSOR_TYPE_INVALID); 2981bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian return static_cast<Sensor const*>(sensor)->getType(); 299b957b9d63c88efd3a961759424987b99219adeedMathias Agopian} 300b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 30163483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xufloat ASensor_getResolution(ASensor const* sensor) { 30263483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_SENSOR_IS_NULL(ASENSOR_RESOLUTION_INVALID); 3031bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian return static_cast<Sensor const*>(sensor)->getResolution(); 304b957b9d63c88efd3a961759424987b99219adeedMathias Agopian} 305b957b9d63c88efd3a961759424987b99219adeedMathias Agopian 30663483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xuint ASensor_getMinDelay(ASensor const* sensor) { 30763483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_SENSOR_IS_NULL(ASENSOR_DELAY_INVALID); 308050b56244ff46d43e4886018d7cd20f0b1dc02b9Mathias Agopian return static_cast<Sensor const*>(sensor)->getMinDelay(); 309050b56244ff46d43e4886018d7cd20f0b1dc02b9Mathias Agopian} 310cd9a7bb3ba742606f93dcbd549d6d6eeb1cb5247Aravind Akella 31163483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xuint ASensor_getFifoMaxEventCount(ASensor const* sensor) { 31263483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_SENSOR_IS_NULL(ASENSOR_FIFO_COUNT_INVALID); 313cd9a7bb3ba742606f93dcbd549d6d6eeb1cb5247Aravind Akella return static_cast<Sensor const*>(sensor)->getFifoMaxEventCount(); 314cd9a7bb3ba742606f93dcbd549d6d6eeb1cb5247Aravind Akella} 315cd9a7bb3ba742606f93dcbd549d6d6eeb1cb5247Aravind Akella 31663483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xuint ASensor_getFifoReservedEventCount(ASensor const* sensor) { 31763483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_SENSOR_IS_NULL(ASENSOR_FIFO_COUNT_INVALID); 318cd9a7bb3ba742606f93dcbd549d6d6eeb1cb5247Aravind Akella return static_cast<Sensor const*>(sensor)->getFifoReservedEventCount(); 319cd9a7bb3ba742606f93dcbd549d6d6eeb1cb5247Aravind Akella} 320cd9a7bb3ba742606f93dcbd549d6d6eeb1cb5247Aravind Akella 32163483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xuconst char* ASensor_getStringType(ASensor const* sensor) { 32263483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_SENSOR_IS_NULL(nullptr); 323cd9a7bb3ba742606f93dcbd549d6d6eeb1cb5247Aravind Akella return static_cast<Sensor const*>(sensor)->getStringType().string(); 324cd9a7bb3ba742606f93dcbd549d6d6eeb1cb5247Aravind Akella} 32527900358f2f5b89e8b01516b28a916d16c99ba9bAravind Akella 32663483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xuint ASensor_getReportingMode(ASensor const* sensor) { 32763483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_SENSOR_IS_NULL(AREPORTING_MODE_INVALID); 32827900358f2f5b89e8b01516b28a916d16c99ba9bAravind Akella return static_cast<Sensor const*>(sensor)->getReportingMode(); 32927900358f2f5b89e8b01516b28a916d16c99ba9bAravind Akella} 33099fe16508200510e3d8ea2e3c34872be8cce826dAravind Akella 33163483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xubool ASensor_isWakeUpSensor(ASensor const* sensor) { 33263483ad25280b66bd077b3b5e6864ff22a129e9dPeng Xu RETURN_IF_SENSOR_IS_NULL(false); 33399fe16508200510e3d8ea2e3c34872be8cce826dAravind Akella return static_cast<Sensor const*>(sensor)->isWakeUpSensor(); 3342af91d0e104b3a80f3e832e464e52893a55a715fAravind Akella} 3353b170173460def252c834fa46706775ed4e1d9a7Peng Xu 3363b170173460def252c834fa46706775ed4e1d9a7Peng Xubool ASensor_isDirectChannelTypeSupported(ASensor const *sensor, int channelType) { 3373b170173460def252c834fa46706775ed4e1d9a7Peng Xu RETURN_IF_SENSOR_IS_NULL(false); 3383b170173460def252c834fa46706775ed4e1d9a7Peng Xu return static_cast<Sensor const *>(sensor)->isDirectChannelTypeSupported(channelType); 3393b170173460def252c834fa46706775ed4e1d9a7Peng Xu} 3403b170173460def252c834fa46706775ed4e1d9a7Peng Xu 3413b170173460def252c834fa46706775ed4e1d9a7Peng Xuint ASensor_getHighestDirectReportRateLevel(ASensor const *sensor) { 3423b170173460def252c834fa46706775ed4e1d9a7Peng Xu RETURN_IF_SENSOR_IS_NULL(ASENSOR_DIRECT_RATE_STOP); 3433b170173460def252c834fa46706775ed4e1d9a7Peng Xu return static_cast<Sensor const *>(sensor)->getHighestDirectReportRateLevel(); 3443b170173460def252c834fa46706775ed4e1d9a7Peng Xu} 345