ASensorManager.cpp revision 41625a254b3824ec0ea776695b3cd1fbb17faa30
16f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber/*
26f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * Copyright (C) 2017 The Android Open Source Project
36f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber *
46f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
56f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * you may not use this file except in compliance with the License.
66f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * You may obtain a copy of the License at
76f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber *
86f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
96f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber *
106f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * Unless required by applicable law or agreed to in writing, software
116f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
126f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * See the License for the specific language governing permissions and
146f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * limitations under the License.
156f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber */
166f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
176f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#include "ALooper.h"
186f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#include "ASensorEventQueue.h"
196f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#include "ASensorManager.h"
206f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
216f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#define LOG_TAG "libsensorndkbridge"
226f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#include <android-base/logging.h>
236f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#include <android/looper.h>
246f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#include <sensors/convert.h>
256f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
266f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::hardware::sensors::V1_0::SensorInfo;
276f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::frameworks::sensorservice::V1_0::IEventQueue;
286f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::frameworks::sensorservice::V1_0::ISensorManager;
296f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::frameworks::sensorservice::V1_0::Result;
306f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::hardware::sensors::V1_0::SensorType;
316f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::sp;
326f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::Mutex;
336f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::status_t;
346f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::OK;
356f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::NO_INIT;
366f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::BAD_VALUE;
376f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::hardware::hidl_vec;
386f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::hardware::Return;
396f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
406f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberstatic Mutex gLock;
416f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
426f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber// static
436f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorManager *ASensorManager::sInstance = NULL;
446f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
456f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber// static
466f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorManager *ASensorManager::getInstance() {
476f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    Mutex::Autolock autoLock(gLock);
486f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (sInstance == NULL) {
496f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        sInstance = new ASensorManager;
506f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        if (sInstance->initCheck() != OK) {
516f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            delete sInstance;
526f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            sInstance = NULL;
536f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        }
546f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    }
556f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return sInstance;
566f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
576f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
586f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorManager::ASensorManager()
596f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    : mInitCheck(NO_INIT) {
606f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    mManager = ISensorManager::getService();
616f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (mManager != NULL) {
626f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        mInitCheck = OK;
636f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    }
646f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
656f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
666f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberstatus_t ASensorManager::initCheck() const {
676f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return mInitCheck;
686f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
696f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
706f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorManager::getSensorList(ASensorList *out) {
716f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ASensorManager::getSensorList";
726f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
736f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    Mutex::Autolock autoLock(mLock);
746f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
756f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (mSensorList == NULL) {
766f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        Return<void> ret =
776f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            mManager->getSensorList([&](const auto &list, auto result) {
786f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                if (result != Result::OK) {
796f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                    return;
806f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                }
816f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
826f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                mSensors = list;
836f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        });
846f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
856f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        (void)ret.isOk();
866f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
876f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        mSensorList.reset(new ASensorRef[mSensors.size()]);
886f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        for (size_t i = 0; i < mSensors.size(); ++i) {
896f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            mSensorList.get()[i] =
906f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                reinterpret_cast<ASensorRef>(&mSensors[i]);
916f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        }
926f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    }
936f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
946f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (out) {
956f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        *out = reinterpret_cast<ASensorList>(mSensorList.get());
966f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    }
976f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
986f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return mSensors.size();
996f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
1006f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1016f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorRef ASensorManager::getDefaultSensor(int type) {
1026f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    (void)getSensorList(NULL /* list */);
1036f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1046f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    ASensorRef defaultSensor = NULL;
1056f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1066f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    Return<void> ret = mManager->getDefaultSensor(
1076f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            static_cast<SensorType>(type),
1086f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            [&](const auto &sensor, auto result) {
1096f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                if (result != Result::OK) {
1106f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                    return;
1116f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                }
1126f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1136f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                for (size_t i = 0; i < mSensors.size(); ++i) {
1146f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                    if (sensor == mSensors[i]) {
1156f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                        defaultSensor =
1166f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                             reinterpret_cast<ASensorRef>(&mSensors[i]);
1176f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1186f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                        break;
1196f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                    }
1206f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                }
1216f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            });
1226f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1236f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    (void)ret.isOk();
1246f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1256f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return defaultSensor;
1266f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
1276f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1286f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorRef ASensorManager::getDefaultSensorEx(
1296f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        int /* type */, bool /* wakeup */) {
1306f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    // XXX ISensorManager's getDefaultSensorEx() lacks a "wakeup" parameter.
1316f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return NULL;
1326f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
1336f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1346f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorEventQueue *ASensorManager::createEventQueue(
1356f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ALooper *looper, int ident, ALooper_callbackFunc callback, void *data) {
1366f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ASensorManager::createEventQueue";
1376f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1386f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    sp<ASensorEventQueue> queue =
1396f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        new ASensorEventQueue(looper, ident, callback, data);
1406f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1416f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    Result result;
1426f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    Return<void> ret =
1436f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        mManager->createEventQueue(
1446f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                queue, [&](const sp<IEventQueue> &queueImpl, auto tmpResult) {
1456f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                    result = tmpResult;
1466f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                    if (result != Result::OK) {
1476f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                        return;
1486f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                    }
1496f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1506f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                    queue->setImpl(queueImpl);
1516f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                });
1526f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1536f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (!ret.isOk() || result != Result::OK) {
1546f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        LOG(ERROR) << "FAILED to create event queue";
1556f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        return NULL;
1566f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    }
1576f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1586f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    queue->incStrong(NULL);
1596f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1606f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "Returning event queue " << queue.get();
1616f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return queue.get();
1626f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
1636f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1646f96cb345a8ebfd9fef5f32931373776a798a193Andreas Hubervoid ASensorManager::destroyEventQueue(ASensorEventQueue *queue) {
1656f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ASensorManager::destroyEventQueue(" << queue << ")";
1666f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1676f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    queue->invalidate();
1686f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1696f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    delete queue;
1706f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    queue = NULL;
1716f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
1726f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1736f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber////////////////////////////////////////////////////////////////////////////////
1746f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1756f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorManager *ASensorManager_getInstance() {
1766f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return ASensorManager::getInstance();
1776f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
1786f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1796f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorManager *ASensorManager_getInstanceForPackage(
1806f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        const char* /* packageName */) {
1816f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return ASensorManager::getInstance();
1826f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
1836f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1846f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#define RETURN_IF_MANAGER_IS_NULL(x)    \
1856f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    do {                                \
1866f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        if (manager == NULL) {          \
1876f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            return x;                   \
1886f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        }                               \
1896f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    } while (0)
1906f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1916f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#define RETURN_IF_QUEUE_IS_NULL(x)      \
1926f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    do {                                \
1936f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        if (queue == NULL) {            \
1946f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            return x;                   \
1956f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        }                               \
1966f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    } while (0)
1976f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1986f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#define RETURN_IF_SENSOR_IS_NULL(x)     \
1996f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    do {                                \
2006f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        if (sensor == NULL) {           \
2016f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            return x;                   \
2026f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        }                               \
2036f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    } while (0)
2046f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2056f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list) {
2066f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_MANAGER_IS_NULL(BAD_VALUE);
2076f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return manager->getSensorList(list);
2086f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2096f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2106f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensor const* ASensorManager_getDefaultSensor(
2116f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorManager* manager, int type) {
2126f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_MANAGER_IS_NULL(NULL);
2136f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2146f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return manager->getDefaultSensor(type);
2156f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2166f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2176f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#if 0
2186f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensor const* ASensorManager_getDefaultSensorEx(
2196f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorManager* manager, int type, bool wakeUp) {
2206f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_MANAGER_IS_NULL(NULL);
2216f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2226f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return manager->getDefaultSensorEx(type, wakeUp);
2236f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2246f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#endif
2256f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2266f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorEventQueue* ASensorManager_createEventQueue(
2276f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorManager* manager,
2286f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ALooper* looper,
2296f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        int ident,
2306f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ALooper_callbackFunc callback,
2316f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        void* data) {
2326f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_MANAGER_IS_NULL(NULL);
2336f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2346f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (looper == NULL) {
2356f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        return NULL;
2366f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    }
2376f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2386f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return manager->createEventQueue(looper, ident, callback, data);
2396f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2406f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2416f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorManager_destroyEventQueue(
2426f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorManager* manager, ASensorEventQueue* queue) {
2436f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_MANAGER_IS_NULL(BAD_VALUE);
2446f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_QUEUE_IS_NULL(BAD_VALUE);
2456f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2466f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    manager->destroyEventQueue(queue);
2476f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    queue = NULL;
2486f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2496f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return OK;
2506f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2516f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2526f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#if 0
2536f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorManager_createSharedMemoryDirectChannel(
2546f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorManager* manager, int fd, size_t size) {
2556f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_MANAGER_IS_NULL(BAD_VALUE);
2566f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2576f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return OK;
2586f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2596f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2606f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorManager_createHardwareBufferDirectChannel(
2616f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorManager* manager, AHardwareBuffer const * buffer, size_t size) {
2626f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_MANAGER_IS_NULL(BAD_VALUE);
2636f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2646f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return OK;
2656f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2666f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2676f96cb345a8ebfd9fef5f32931373776a798a193Andreas Hubervoid ASensorManager_destroyDirectChannel(
2686f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorManager* manager, int channelId) {
2696f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2706f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2716f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorManager_configureDirectReport(
2726f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorManager* manager,
2736f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensor const* sensor,
2746f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        int channelId,int rate) {
2756f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_MANAGER_IS_NULL(BAD_VALUE);
2766f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return OK;
2776f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2786f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#endif
2796f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2806f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorEventQueue_registerSensor(
2816f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorEventQueue* queue,
2826f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensor const* sensor,
2836f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        int32_t samplingPeriodUs,
2846f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        int64_t maxBatchReportLatencyUs) {
2856f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ASensorEventQueue_registerSensor";
2866f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_QUEUE_IS_NULL(BAD_VALUE);
2876f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return queue->registerSensor(
2886f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            sensor, samplingPeriodUs, maxBatchReportLatencyUs);
2896f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2906f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2916f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorEventQueue_enableSensor(
2926f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorEventQueue* queue, ASensor const* sensor) {
2936f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ASensorEventQueue_enableSensor(queue " << queue << ")";
2946f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_QUEUE_IS_NULL(BAD_VALUE);
2956f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return queue->enableSensor(sensor);
2966f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2976f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2986f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorEventQueue_disableSensor(
2996f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorEventQueue* queue, ASensor const* sensor) {
3006f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ASensorEventQueue_disableSensor";
3016f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_QUEUE_IS_NULL(BAD_VALUE);
3026f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return queue->disableSensor(sensor);
3036f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3046f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3056f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorEventQueue_setEventRate(
3066f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorEventQueue* queue,
3076f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensor const* sensor,
3086f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        int32_t usec) {
3096f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_QUEUE_IS_NULL(BAD_VALUE);
3106f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return queue->setEventRate(sensor, usec);
3116f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3126f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3136f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorEventQueue_hasEvents(ASensorEventQueue* queue) {
3146f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_QUEUE_IS_NULL(BAD_VALUE);
3156f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return queue->hasEvents();
3166f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3176f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3186f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberssize_t ASensorEventQueue_getEvents(
3196f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorEventQueue* queue, ASensorEvent* events, size_t count) {
3206f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ASensorEventQueue_getEvents";
3216f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_QUEUE_IS_NULL(BAD_VALUE);
3226f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return queue->getEvents(events, count);
3236f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3246f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3256f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberconst char *ASensor_getName(ASensor const* sensor) {
3266f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(NULL);
3276f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return reinterpret_cast<const SensorInfo *>(sensor)->name.c_str();
3286f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3296f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3306f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberconst char *ASensor_getVendor(ASensor const* sensor) {
3316f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(NULL);
3326f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return reinterpret_cast<const SensorInfo *>(sensor)->vendor.c_str();
3336f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3346f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3356f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensor_getType(ASensor const* sensor) {
3366f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(ASENSOR_TYPE_INVALID);
3376f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return static_cast<int>(
3386f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            reinterpret_cast<const SensorInfo *>(sensor)->type);
3396f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3406f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3416f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberfloat ASensor_getResolution(ASensor const* sensor) {
3426f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(ASENSOR_RESOLUTION_INVALID);
3436f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return reinterpret_cast<const SensorInfo *>(sensor)->resolution;
3446f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3456f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3466f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensor_getMinDelay(ASensor const* sensor) {
3476f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(ASENSOR_DELAY_INVALID);
3486f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return reinterpret_cast<const SensorInfo *>(sensor)->minDelay;
3496f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3506f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3516f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensor_getFifoMaxEventCount(ASensor const* sensor) {
3526f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(ASENSOR_FIFO_COUNT_INVALID);
3536f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return reinterpret_cast<const SensorInfo *>(sensor)->fifoMaxEventCount;
3546f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3556f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3566f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensor_getFifoReservedEventCount(ASensor const* sensor) {
3576f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(ASENSOR_FIFO_COUNT_INVALID);
3586f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return reinterpret_cast<const SensorInfo *>(sensor)->fifoReservedEventCount;
3596f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3606f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3616f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberconst char* ASensor_getStringType(ASensor const* sensor) {
3626f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(NULL);
3636f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return reinterpret_cast<const SensorInfo *>(sensor)->typeAsString.c_str();
3646f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3656f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
36641625a254b3824ec0ea776695b3cd1fbb17faa30Andreas Huberextern "C" float ASensor_getMaxRange(ASensor const* sensor) {
36741625a254b3824ec0ea776695b3cd1fbb17faa30Andreas Huber    RETURN_IF_SENSOR_IS_NULL(nanf(""));
36841625a254b3824ec0ea776695b3cd1fbb17faa30Andreas Huber    return reinterpret_cast<const SensorInfo *>(sensor)->maxRange;
36941625a254b3824ec0ea776695b3cd1fbb17faa30Andreas Huber}
37041625a254b3824ec0ea776695b3cd1fbb17faa30Andreas Huber
3716f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#if 0
3726f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensor_getReportingMode(ASensor const* sensor) {
3736f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(AREPORTING_MODE_INVALID);
3746f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return 0;
3756f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3766f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3776f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberbool ASensor_isWakeUpSensor(ASensor const* sensor) {
3786f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(false);
3796f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return false;
3806f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3816f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3826f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberbool ASensor_isDirectChannelTypeSupported(
3836f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensor const* sensor, int channelType) {
3846f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(false);
3856f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return false;
3866f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3876f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3886f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensor_getHighestDirectReportRateLevel(ASensor const* sensor) {
3896f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(ASENSOR_DIRECT_RATE_STOP);
3906f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return 0;
3916f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3926f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#endif
3936f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3946f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberstatic ALooper *getTheLooper() {
3956f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    static ALooper *sLooper = NULL;
3966f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3976f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    Mutex::Autolock autoLock(gLock);
3986f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (sLooper == NULL) {
3996f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        sLooper = new ALooper;
4006f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    }
4016f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
4026f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return sLooper;
4036f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
4046f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
4056f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
4066f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberALooper *ALooper_forThread() {
4076f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ALooper_forThread";
4086f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return getTheLooper();
4096f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
4106f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
4116f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberALooper *ALooper_prepare(int /* opts */) {
4126f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ALooper_prepare";
4136f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return getTheLooper();
4146f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
4156f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
4166f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ALooper_pollOnce(
4176f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        int timeoutMillis, int* outFd, int* outEvents, void** outData) {
4186f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    int res = getTheLooper()->pollOnce(timeoutMillis, outFd, outEvents, outData);
4196f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ALooper_pollOnce => " << res;
4206f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return res;
4216f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
4226f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
4236f96cb345a8ebfd9fef5f32931373776a798a193Andreas Hubervoid ALooper_wake(ALooper* looper) {
4246f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ALooper_wake";
4256f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    looper->wake();
4266f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
427