SensorEventQueue.cpp revision 59abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8a
154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/*
254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project
354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *
454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
53ca47d101db63b619f15723d5131ff7bc8f3a5beJianhong Jiang * you may not use this file except in compliance with the License.
63ca47d101db63b619f15723d5131ff7bc8f3a5beJianhong Jiang * You may obtain a copy of the License at
73ca47d101db63b619f15723d5131ff7bc8f3a5beJianhong Jiang *
83ca47d101db63b619f15723d5131ff7bc8f3a5beJianhong Jiang *      http://www.apache.org/licenses/LICENSE-2.0
93ca47d101db63b619f15723d5131ff7bc8f3a5beJianhong Jiang *
1054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
123ca47d101db63b619f15723d5131ff7bc8f3a5beJianhong Jiang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133ca47d101db63b619f15723d5131ff7bc8f3a5beJianhong Jiang * See the License for the specific language governing permissions and
143ca47d101db63b619f15723d5131ff7bc8f3a5beJianhong Jiang * limitations under the License.
1525ba5b6564224dceefa086b5c439ef28dad530caMathias Agopian */
163ca47d101db63b619f15723d5131ff7bc8f3a5beJianhong Jiang
17b5af325fb1d21a9295bf3009cc95e5ead4999247Mike Reed#define LOG_TAG "Sensors"
18e4a838051de5e56f44c71117073a035b804b5d04Andreas Huber
19e4a838051de5e56f44c71117073a035b804b5d04Andreas Huber#include <stdint.h>
2054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <sys/types.h>
21bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber
22bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber#include <utils/Errors.h>
23bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber#include <utils/RefBase.h>
24bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber#include <utils/Looper.h>
25bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber
26bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber#include <gui/Sensor.h>
27bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber#include <gui/SensorChannel.h>
28bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber#include <gui/SensorEventQueue.h>
29bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber#include <gui/ISensorEventConnection.h>
30bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber
31bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber#include <android/sensor.h>
32e4a838051de5e56f44c71117073a035b804b5d04Andreas Huber
33e4a838051de5e56f44c71117073a035b804b5d04Andreas Huber// ----------------------------------------------------------------------------
34e4a838051de5e56f44c71117073a035b804b5d04Andreas Hubernamespace android {
35e4a838051de5e56f44c71117073a035b804b5d04Andreas Huber// ----------------------------------------------------------------------------
36e4a838051de5e56f44c71117073a035b804b5d04Andreas Huber
37e4a838051de5e56f44c71117073a035b804b5d04Andreas HuberSensorEventQueue::SensorEventQueue(const sp<ISensorEventConnection>& connection)
38e4a838051de5e56f44c71117073a035b804b5d04Andreas Huber    : mSensorEventConnection(connection)
39e4a838051de5e56f44c71117073a035b804b5d04Andreas Huber{
40e4a838051de5e56f44c71117073a035b804b5d04Andreas Huber}
4154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
4254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectSensorEventQueue::~SensorEventQueue()
4354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
443ca47d101db63b619f15723d5131ff7bc8f3a5beJianhong Jiang}
4520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania
46bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Hubervoid SensorEventQueue::onFirstRef()
473ca47d101db63b619f15723d5131ff7bc8f3a5beJianhong Jiang{
483ca47d101db63b619f15723d5131ff7bc8f3a5beJianhong Jiang    mSensorChannel = mSensorEventConnection->getSensorChannel();
493ca47d101db63b619f15723d5131ff7bc8f3a5beJianhong Jiang}
5054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
5154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint SensorEventQueue::getFd() const
5254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
5354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return mSensorChannel->getFd();
5454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
5554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
5654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectssize_t SensorEventQueue::write(ASensorEvent const* events, size_t numEvents)
5754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
58f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    ssize_t size = mSensorChannel->write(events, numEvents * sizeof(events[0]));
59f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    if (size >= 0) {
60f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project        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<Looper> SensorEventQueue::getLooper() const
85{
86    Mutex::Autolock _l(mLock);
87    if (mLooper == 0) {
88        mLooper = new Looper(true);
89        mLooper->addFd(getFd(), getFd(), ALOOPER_EVENT_INPUT, NULL, NULL);
90    }
91    return mLooper;
92}
93
94status_t SensorEventQueue::waitForEvent() const
95{
96    const int fd = getFd();
97    sp<Looper> looper(getLooper());
98    int32_t result = looper->pollOnce(-1);
99    return (result == fd) ? status_t(NO_ERROR) : status_t(-1);
100}
101
102status_t SensorEventQueue::wake() const
103{
104    sp<Looper> looper(getLooper());
105    looper->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, int32_t us) const {
118    status_t err = mSensorEventConnection->enableDisable(handle, true);
119    if (err == NO_ERROR) {
120        mSensorEventConnection->setEventRate(handle, us2ns(us));
121    }
122    return err;
123}
124
125status_t SensorEventQueue::disableSensor(int32_t handle) const {
126    return mSensorEventConnection->enableDisable(handle, false);
127}
128
129status_t SensorEventQueue::setEventRate(Sensor const* sensor, nsecs_t ns) const {
130    return mSensorEventConnection->setEventRate(sensor->getHandle(), ns);
131}
132
133// ----------------------------------------------------------------------------
134}; // namespace android
135
136