195c7a0636763c0861d46425709befe90a3919c04Yifan Hong/*
295c7a0636763c0861d46425709befe90a3919c04Yifan Hong * Copyright (C) 2017 The Android Open Source Project
395c7a0636763c0861d46425709befe90a3919c04Yifan Hong *
495c7a0636763c0861d46425709befe90a3919c04Yifan Hong * Licensed under the Apache License, Version 2.0 (the "License");
595c7a0636763c0861d46425709befe90a3919c04Yifan Hong * you may not use this file except in compliance with the License.
695c7a0636763c0861d46425709befe90a3919c04Yifan Hong * You may obtain a copy of the License at
795c7a0636763c0861d46425709befe90a3919c04Yifan Hong *
895c7a0636763c0861d46425709befe90a3919c04Yifan Hong *      http://www.apache.org/licenses/LICENSE-2.0
995c7a0636763c0861d46425709befe90a3919c04Yifan Hong *
1095c7a0636763c0861d46425709befe90a3919c04Yifan Hong * Unless required by applicable law or agreed to in writing, software
1195c7a0636763c0861d46425709befe90a3919c04Yifan Hong * distributed under the License is distributed on an "AS IS" BASIS,
1295c7a0636763c0861d46425709befe90a3919c04Yifan Hong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1395c7a0636763c0861d46425709befe90a3919c04Yifan Hong * See the License for the specific language governing permissions and
1495c7a0636763c0861d46425709befe90a3919c04Yifan Hong * limitations under the License.
1595c7a0636763c0861d46425709befe90a3919c04Yifan Hong */
1695c7a0636763c0861d46425709befe90a3919c04Yifan Hong
1795c7a0636763c0861d46425709befe90a3919c04Yifan Hong#include "EventQueue.h"
1895c7a0636763c0861d46425709befe90a3919c04Yifan Hong#include "utils.h"
1995c7a0636763c0861d46425709befe90a3919c04Yifan Hong
2095c7a0636763c0861d46425709befe90a3919c04Yifan Hong#include <utils/Looper.h>
2195c7a0636763c0861d46425709befe90a3919c04Yifan Hong
2295c7a0636763c0861d46425709befe90a3919c04Yifan Hongnamespace android {
2395c7a0636763c0861d46425709befe90a3919c04Yifan Hongnamespace frameworks {
2495c7a0636763c0861d46425709befe90a3919c04Yifan Hongnamespace sensorservice {
2595c7a0636763c0861d46425709befe90a3919c04Yifan Hongnamespace V1_0 {
2695c7a0636763c0861d46425709befe90a3919c04Yifan Hongnamespace implementation {
2795c7a0636763c0861d46425709befe90a3919c04Yifan Hong
2895c7a0636763c0861d46425709befe90a3919c04Yifan Hongclass EventQueueLooperCallback : public ::android::LooperCallback {
2995c7a0636763c0861d46425709befe90a3919c04Yifan Hongpublic:
3006d46fda66f7e6cc144a195ac6dc065bca2e3616Yifan Hong    EventQueueLooperCallback(sp<::android::SensorEventQueue> queue,
3106d46fda66f7e6cc144a195ac6dc065bca2e3616Yifan Hong                             sp<IEventQueueCallback> callback)
3295c7a0636763c0861d46425709befe90a3919c04Yifan Hong            : mQueue(queue), mCallback(callback) {
3395c7a0636763c0861d46425709befe90a3919c04Yifan Hong    }
3495c7a0636763c0861d46425709befe90a3919c04Yifan Hong
3595c7a0636763c0861d46425709befe90a3919c04Yifan Hong    int handleEvent(__unused int fd, __unused int events, __unused void* data) {
3695c7a0636763c0861d46425709befe90a3919c04Yifan Hong
3795c7a0636763c0861d46425709befe90a3919c04Yifan Hong        ASensorEvent event;
3895c7a0636763c0861d46425709befe90a3919c04Yifan Hong        ssize_t actual;
3906d46fda66f7e6cc144a195ac6dc065bca2e3616Yifan Hong
4006d46fda66f7e6cc144a195ac6dc065bca2e3616Yifan Hong        auto internalQueue = mQueue.promote();
4106d46fda66f7e6cc144a195ac6dc065bca2e3616Yifan Hong        if (internalQueue == nullptr) {
4206d46fda66f7e6cc144a195ac6dc065bca2e3616Yifan Hong            return 1;
4306d46fda66f7e6cc144a195ac6dc065bca2e3616Yifan Hong        }
4495c7a0636763c0861d46425709befe90a3919c04Yifan Hong
4595c7a0636763c0861d46425709befe90a3919c04Yifan Hong        while ((actual = internalQueue->read(&event, 1 /* count */)) > 0) {
4695c7a0636763c0861d46425709befe90a3919c04Yifan Hong            internalQueue->sendAck(&event, actual);
47957aa852bb9bd7a70cc4f7f553d4945f3f8da23cAndreas Huber            Return<void> ret = mCallback->onEvent(convertEvent(event));
48957aa852bb9bd7a70cc4f7f553d4945f3f8da23cAndreas Huber            (void)ret.isOk(); // ignored
4995c7a0636763c0861d46425709befe90a3919c04Yifan Hong        }
5095c7a0636763c0861d46425709befe90a3919c04Yifan Hong
5195c7a0636763c0861d46425709befe90a3919c04Yifan Hong        return 1; // continue to receive callbacks
5295c7a0636763c0861d46425709befe90a3919c04Yifan Hong    }
5395c7a0636763c0861d46425709befe90a3919c04Yifan Hong
5495c7a0636763c0861d46425709befe90a3919c04Yifan Hongprivate:
5506d46fda66f7e6cc144a195ac6dc065bca2e3616Yifan Hong    wp<::android::SensorEventQueue> mQueue;
5695c7a0636763c0861d46425709befe90a3919c04Yifan Hong    sp<IEventQueueCallback> mCallback;
5795c7a0636763c0861d46425709befe90a3919c04Yifan Hong};
5895c7a0636763c0861d46425709befe90a3919c04Yifan Hong
5995c7a0636763c0861d46425709befe90a3919c04Yifan HongEventQueue::EventQueue(
6095c7a0636763c0861d46425709befe90a3919c04Yifan Hong        sp<IEventQueueCallback> callback,
6195c7a0636763c0861d46425709befe90a3919c04Yifan Hong        sp<::android::Looper> looper,
6295c7a0636763c0861d46425709befe90a3919c04Yifan Hong        sp<::android::SensorEventQueue> internalQueue)
6395c7a0636763c0861d46425709befe90a3919c04Yifan Hong            : mLooper(looper),
6495c7a0636763c0861d46425709befe90a3919c04Yifan Hong              mInternalQueue(internalQueue) {
6595c7a0636763c0861d46425709befe90a3919c04Yifan Hong
6606d46fda66f7e6cc144a195ac6dc065bca2e3616Yifan Hong    mLooper->addFd(internalQueue->getFd(), ALOOPER_POLL_CALLBACK, ALOOPER_EVENT_INPUT,
6706d46fda66f7e6cc144a195ac6dc065bca2e3616Yifan Hong            new EventQueueLooperCallback(internalQueue, callback), NULL /* data */);
6895c7a0636763c0861d46425709befe90a3919c04Yifan Hong}
6995c7a0636763c0861d46425709befe90a3919c04Yifan Hong
7006d46fda66f7e6cc144a195ac6dc065bca2e3616Yifan Hongvoid EventQueue::onLastStrongRef(const void *id) {
7106d46fda66f7e6cc144a195ac6dc065bca2e3616Yifan Hong    IEventQueue::onLastStrongRef(id);
7295c7a0636763c0861d46425709befe90a3919c04Yifan Hong    mLooper->removeFd(mInternalQueue->getFd());
7395c7a0636763c0861d46425709befe90a3919c04Yifan Hong}
7495c7a0636763c0861d46425709befe90a3919c04Yifan Hong
7595c7a0636763c0861d46425709befe90a3919c04Yifan Hong// Methods from ::android::frameworks::sensorservice::V1_0::IEventQueue follow.
7695c7a0636763c0861d46425709befe90a3919c04Yifan HongReturn<Result> EventQueue::enableSensor(int32_t sensorHandle, int32_t samplingPeriodUs,
7795c7a0636763c0861d46425709befe90a3919c04Yifan Hong        int64_t maxBatchReportLatencyUs) {
7895c7a0636763c0861d46425709befe90a3919c04Yifan Hong    return convertResult(mInternalQueue->enableSensor(sensorHandle, samplingPeriodUs,
7995c7a0636763c0861d46425709befe90a3919c04Yifan Hong            maxBatchReportLatencyUs, 0 /* reserved flags */));
8095c7a0636763c0861d46425709befe90a3919c04Yifan Hong}
8195c7a0636763c0861d46425709befe90a3919c04Yifan Hong
8295c7a0636763c0861d46425709befe90a3919c04Yifan HongReturn<Result> EventQueue::disableSensor(int32_t sensorHandle) {
8395c7a0636763c0861d46425709befe90a3919c04Yifan Hong    return convertResult(mInternalQueue->disableSensor(sensorHandle));
8495c7a0636763c0861d46425709befe90a3919c04Yifan Hong}
8595c7a0636763c0861d46425709befe90a3919c04Yifan Hong
8695c7a0636763c0861d46425709befe90a3919c04Yifan Hong}  // namespace implementation
8795c7a0636763c0861d46425709befe90a3919c04Yifan Hong}  // namespace V1_0
8895c7a0636763c0861d46425709befe90a3919c04Yifan Hong}  // namespace sensorservice
8995c7a0636763c0861d46425709befe90a3919c04Yifan Hong}  // namespace frameworks
9095c7a0636763c0861d46425709befe90a3919c04Yifan Hong}  // namespace android
91