SensorEventQueue.cpp revision 29267fe8495a74893dfce1bd9eceb6448df7abea
120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/* 220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2010 The Android Open Source Project 320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License. 620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at 720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License. 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */ 1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define LOG_TAG "Sensors" 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <stdint.h> 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <sys/types.h> 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Errors.h> 230c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber#include <utils/RefBase.h> 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Looper.h> 2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <gui/Sensor.h> 2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <gui/BitTube.h> 2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <gui/SensorEventQueue.h> 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <gui/ISensorEventConnection.h> 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <android/sensor.h> 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber// ---------------------------------------------------------------------------- 34693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubernamespace android { 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber// ---------------------------------------------------------------------------- 3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3720111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberSensorEventQueue::SensorEventQueue(const sp<ISensorEventConnection>& connection) 3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : mSensorEventConnection(connection) 3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber{ 4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4220111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberSensorEventQueue::~SensorEventQueue() 4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber{ 4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid SensorEventQueue::onFirstRef() 4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber{ 4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSensorChannel = mSensorEventConnection->getSensorChannel(); 4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberint SensorEventQueue::getFd() const 5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber{ 5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return mSensorChannel->getFd(); 5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberssize_t SensorEventQueue::write(const sp<BitTube>& tube, 5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ASensorEvent const* events, size_t numEvents) { 5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return BitTube::sendObjects(tube, events, numEvents); 6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 620c89199745bc1bf05b997fc7c342017807676b6fAndreas Huberssize_t SensorEventQueue::read(ASensorEvent* events, size_t numEvents) 6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber{ 6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return BitTube::recvObjects(mSensorChannel, events, numEvents); 6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubersp<Looper> SensorEventQueue::getLooper() const 6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber{ 6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Mutex::Autolock _l(mLock); 7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (mLooper == 0) { 7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mLooper = new Looper(true); 7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mLooper->addFd(getFd(), getFd(), ALOOPER_EVENT_INPUT, NULL, NULL); 7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return mLooper; 7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t SensorEventQueue::waitForEvent() const 7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber{ 7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const int fd = getFd(); 8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<Looper> looper(getLooper()); 8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int events; 8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int32_t result; 8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber do { 8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber result = looper->pollOnce(-1, NULL, &events, NULL); 8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (result == ALOOPER_POLL_ERROR) { 8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ALOGE("SensorEventQueue::waitForEvent error (errno=%d)", errno); 8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber result = -EPIPE; // unknown error, so we make up one 8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber break; 9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (events & ALOOPER_EVENT_HANGUP) { 9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // the other-side has died 9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ALOGE("SensorEventQueue::waitForEvent error HANGUP"); 9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber result = -EPIPE; // unknown error, so we make up one 9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber break; 9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } while (result != fd); 9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return (result == fd) ? status_t(NO_ERROR) : result; 10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t SensorEventQueue::wake() const 10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber{ 10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<Looper> looper(getLooper()); 10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber looper->wake(); 10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NO_ERROR; 10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t SensorEventQueue::enableSensor(Sensor const* sensor) const { 11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return mSensorEventConnection->enableDisable(sensor->getHandle(), true); 11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t SensorEventQueue::disableSensor(Sensor const* sensor) const { 11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return mSensorEventConnection->enableDisable(sensor->getHandle(), false); 11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t SensorEventQueue::enableSensor(int32_t handle, int32_t us) const { 11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = mSensorEventConnection->enableDisable(handle, true); 11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err == NO_ERROR) { 12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSensorEventConnection->setEventRate(handle, us2ns(us)); 12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t SensorEventQueue::disableSensor(int32_t handle) const { 12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return mSensorEventConnection->enableDisable(handle, false); 12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t SensorEventQueue::setEventRate(Sensor const* sensor, nsecs_t ns) const { 13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return mSensorEventConnection->setEventRate(sensor->getHandle(), ns); 13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber// ---------------------------------------------------------------------------- 13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; // namespace android 1350c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber 13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber