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