SensorEventQueue.cpp revision a7352c9f4a6e642c29782b19db5bc0bd98feddc8
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#define LOG_TAG "Sensors" 18 19#include <stdint.h> 20#include <sys/types.h> 21 22#include <utils/Errors.h> 23#include <utils/RefBase.h> 24#include <utils/PollLoop.h> 25 26#include <gui/Sensor.h> 27#include <gui/SensorChannel.h> 28#include <gui/SensorEventQueue.h> 29#include <gui/ISensorEventConnection.h> 30 31#include <android/sensor.h> 32 33// ---------------------------------------------------------------------------- 34namespace android { 35// ---------------------------------------------------------------------------- 36 37SensorEventQueue::SensorEventQueue(const sp<ISensorEventConnection>& connection) 38 : mSensorEventConnection(connection) 39{ 40} 41 42SensorEventQueue::~SensorEventQueue() 43{ 44} 45 46void SensorEventQueue::onFirstRef() 47{ 48 mSensorChannel = mSensorEventConnection->getSensorChannel(); 49} 50 51int SensorEventQueue::getFd() const 52{ 53 return mSensorChannel->getFd(); 54} 55 56ssize_t SensorEventQueue::write(ASensorEvent const* events, size_t numEvents) 57{ 58 ssize_t size = mSensorChannel->write(events, numEvents * sizeof(events[0])); 59 if (size >= 0) { 60 if (size % sizeof(events[0])) { 61 // partial write!!! should never happen. 62 return -EINVAL; 63 } 64 // returns number of events written 65 size /= sizeof(events[0]); 66 } 67 return size; 68} 69 70ssize_t SensorEventQueue::read(ASensorEvent* events, size_t numEvents) 71{ 72 ssize_t size = mSensorChannel->read(events, numEvents*sizeof(events[0])); 73 if (size >= 0) { 74 if (size % sizeof(events[0])) { 75 // partial read!!! should never happen. 76 return -EINVAL; 77 } 78 // returns number of events read 79 size /= sizeof(events[0]); 80 } 81 return size; 82} 83 84sp<PollLoop> SensorEventQueue::getPollLoop() const 85{ 86 Mutex::Autolock _l(mLock); 87 if (mPollLoop == 0) { 88 mPollLoop = new PollLoop(true); 89 mPollLoop->setCallback(getFd(), POLLIN, NULL, NULL); 90 } 91 return mPollLoop; 92} 93 94status_t SensorEventQueue::waitForEvent() const 95{ 96 const int fd = getFd(); 97 sp<PollLoop> pollLoop(getPollLoop()); 98 int32_t result = pollLoop->pollOnce(-1, NULL, NULL); 99 return (result == fd) ? NO_ERROR : -1; 100} 101 102status_t SensorEventQueue::wake() const 103{ 104 sp<PollLoop> pollLoop(getPollLoop()); 105 pollLoop->wake(); 106 return NO_ERROR; 107} 108 109status_t SensorEventQueue::enableSensor(Sensor const* sensor) const { 110 return mSensorEventConnection->enableDisable(sensor->getHandle(), true); 111} 112 113status_t SensorEventQueue::disableSensor(Sensor const* sensor) const { 114 return mSensorEventConnection->enableDisable(sensor->getHandle(), false); 115} 116 117status_t SensorEventQueue::enableSensor(int32_t handle) const { 118 return mSensorEventConnection->enableDisable(handle, true); 119} 120 121status_t SensorEventQueue::disableSensor(int32_t handle) const { 122 return mSensorEventConnection->enableDisable(handle, false); 123} 124 125status_t SensorEventQueue::setEventRate(Sensor const* sensor, nsecs_t ns) const { 126 return mSensorEventConnection->setEventRate(sensor->getHandle(), ns); 127} 128 129// ---------------------------------------------------------------------------- 130}; // namespace android 131 132