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