SensorService.cpp revision 7c1c531872a95051cb11ec829e3daf890d9bb58a
1fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian/*
2fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * Copyright (C) 2010 The Android Open Source Project
3fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian *
4fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
5fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * you may not use this file except in compliance with the License.
6fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * You may obtain a copy of the License at
7fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian *
8fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
9fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian *
10fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * Unless required by applicable law or agreed to in writing, software
11fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
12fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * See the License for the specific language governing permissions and
14fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * limitations under the License.
15fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian */
16fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
17fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <stdint.h>
18fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <sys/types.h>
19fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
20fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/SortedVector.h>
21fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/KeyedVector.h>
22fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/threads.h>
23fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/Atomic.h>
24fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/Errors.h>
25fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/RefBase.h>
26451beee076cac09f817abae78a990dea108a9482Mathias Agopian#include <utils/Singleton.h>
27fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
28fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <binder/BinderService.h>
29451beee076cac09f817abae78a990dea108a9482Mathias Agopian#include <binder/IServiceManager.h>
30fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
31fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <gui/ISensorServer.h>
32fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <gui/ISensorEventConnection.h>
33fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
34fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <hardware/sensors.h>
35fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
36fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include "SensorService.h"
37fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
38fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiannamespace android {
39fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// ---------------------------------------------------------------------------
40fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
41fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian/*
42fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * TODO:
43fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * - filter events per connection
44fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * - make sure to keep the last value of each event type so we can quickly
45fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian *   send something to application when they enable a sensor that is already
46fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian *   active (the issue here is that it can take time before a value is
47fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian *   produced by the h/w if the rate is low or if it's a one-shot sensor).
48451beee076cac09f817abae78a990dea108a9482Mathias Agopian * - send sensor info to battery service
49fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian */
50fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
51451beee076cac09f817abae78a990dea108a9482Mathias Agopian// ---------------------------------------------------------------------------
52451beee076cac09f817abae78a990dea108a9482Mathias Agopian
53451beee076cac09f817abae78a990dea108a9482Mathias Agopianclass BatteryService : public Singleton<BatteryService> {
54451beee076cac09f817abae78a990dea108a9482Mathias Agopian    friend class Singleton<BatteryService>;
55451beee076cac09f817abae78a990dea108a9482Mathias Agopian    sp<IBinder> mBatteryStatService;
56451beee076cac09f817abae78a990dea108a9482Mathias Agopian    BatteryService() {
57451beee076cac09f817abae78a990dea108a9482Mathias Agopian        const String16 name("batteryinfo");
58451beee076cac09f817abae78a990dea108a9482Mathias Agopian        //getService(name, &mBatteryStatService);
59451beee076cac09f817abae78a990dea108a9482Mathias Agopian    }
60451beee076cac09f817abae78a990dea108a9482Mathias Agopianpublic:
61451beee076cac09f817abae78a990dea108a9482Mathias Agopian    void enableSensor(int handle) {
62451beee076cac09f817abae78a990dea108a9482Mathias Agopian        if (mBatteryStatService != 0) {
63451beee076cac09f817abae78a990dea108a9482Mathias Agopian            int uid = IPCThreadState::self()->getCallingUid();
64451beee076cac09f817abae78a990dea108a9482Mathias Agopian            //mBatteryStatService->noteStartSensor(uid, handle);
65451beee076cac09f817abae78a990dea108a9482Mathias Agopian        }
66451beee076cac09f817abae78a990dea108a9482Mathias Agopian    }
67451beee076cac09f817abae78a990dea108a9482Mathias Agopian    void disableSensor(int handle) {
68451beee076cac09f817abae78a990dea108a9482Mathias Agopian        if (mBatteryStatService != 0) {
69451beee076cac09f817abae78a990dea108a9482Mathias Agopian            int uid = IPCThreadState::self()->getCallingUid();
70451beee076cac09f817abae78a990dea108a9482Mathias Agopian            //mBatteryStatService->noteStopSensor(uid, handle);
71451beee076cac09f817abae78a990dea108a9482Mathias Agopian        }
72451beee076cac09f817abae78a990dea108a9482Mathias Agopian    }
73451beee076cac09f817abae78a990dea108a9482Mathias Agopian};
74451beee076cac09f817abae78a990dea108a9482Mathias Agopian
75451beee076cac09f817abae78a990dea108a9482Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(BatteryService)
76451beee076cac09f817abae78a990dea108a9482Mathias Agopian
77451beee076cac09f817abae78a990dea108a9482Mathias Agopian// ---------------------------------------------------------------------------
78451beee076cac09f817abae78a990dea108a9482Mathias Agopian
791cd700015318727d6d42236ab6274f1949fb08baMathias Agopian// 100 events/s max
801cd700015318727d6d42236ab6274f1949fb08baMathias Agopianstatic const nsecs_t MINIMUM_EVENT_PERIOD = ms2ns(10);
811cd700015318727d6d42236ab6274f1949fb08baMathias Agopian
82fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorService()
83fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    : Thread(false),
8450df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian      mSensorDevice(0),
8550df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian      mSensorModule(0),
8650df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian      mDump("android.permission.DUMP"),
8750df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian      mInitCheck(NO_INIT)
88fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
89fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
90fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
91fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::onFirstRef()
92fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
9350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian    LOGD("nuSensorService starting...");
9450df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian
95fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID,
96fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            (hw_module_t const**)&mSensorModule);
97fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
98fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    LOGE_IF(err, "couldn't load %s module (%s)",
99fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            SENSORS_HARDWARE_MODULE_ID, strerror(-err));
100fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
10150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian    if (mSensorModule) {
10250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        err = sensors_open(&mSensorModule->common, &mSensorDevice);
103fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
10450df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        LOGE_IF(err, "couldn't open device for module %s (%s)",
10550df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian                SENSORS_HARDWARE_MODULE_ID, strerror(-err));
106fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
10750df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        struct sensor_t const* list;
10850df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        int count = mSensorModule->get_sensors_list(mSensorModule, &list);
10950df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        for (int i=0 ; i<count ; i++) {
11050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            Sensor sensor(list + i);
11150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            LOGI("%s", sensor.getName().string());
11250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            mSensorList.add(sensor);
11350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            if (mSensorDevice) {
11450df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian                mSensorDevice->activate(mSensorDevice, sensor.getHandle(), 0);
11550df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            }
11650df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        }
117fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
11850df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        if (mSensorDevice) {
11950df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            run("SensorService", PRIORITY_URGENT_DISPLAY);
12050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            mInitCheck = NO_ERROR;
12150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        }
122fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
123fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
124fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
125fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::~SensorService()
126fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
127fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
128fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
129fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::dump(int fd, const Vector<String16>& args)
130fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
131fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    const size_t SIZE = 1024;
132fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    char buffer[SIZE];
133fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    String8 result;
134fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (!mDump.checkCalling()) {
135fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        snprintf(buffer, SIZE, "Permission Denial: "
136fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                "can't dump SurfaceFlinger from pid=%d, uid=%d\n",
137fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                IPCThreadState::self()->getCallingPid(),
138fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                IPCThreadState::self()->getCallingUid());
139fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        result.append(buffer);
140fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    } else {
141fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        Mutex::Autolock _l(mLock);
1427c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        snprintf(buffer, SIZE, "%d active connections\n",
1437c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian                mActiveConnections.size());
144fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        result.append(buffer);
145fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        snprintf(buffer, SIZE, "Active sensors:\n");
146fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        result.append(buffer);
147fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        for (size_t i=0 ; i<mActiveSensors.size() ; i++) {
1485d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian            int handle = mActiveSensors.keyAt(i);
1495d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian            snprintf(buffer, SIZE, "%s (handle=%d, connections=%d)\n",
1505d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian                    getSensorName(handle).string(),
1515d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian                    handle,
152fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                    mActiveSensors.valueAt(i)->getNumConnections());
153fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            result.append(buffer);
154fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
155fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
156fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    write(fd, result.string(), result.size());
157fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return NO_ERROR;
158fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
159fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
160fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::threadLoop()
161fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
162fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    LOGD("nuSensorService thread starting...");
163fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
164fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    sensors_event_t buffer[16];
165fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    struct sensors_poll_device_t* device = mSensorDevice;
166fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    ssize_t count;
167fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
168fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    do {
169fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        count = device->poll(device, buffer, sizeof(buffer)/sizeof(*buffer));
170fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        if (count<0) {
171fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            LOGE("sensor poll failed (%s)", strerror(-count));
172fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            break;
173fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
174fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
175fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        const SortedVector< wp<SensorEventConnection> > activeConnections(
176fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                getActiveConnections());
177fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
178fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        size_t numConnections = activeConnections.size();
179fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        if (numConnections) {
180fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            for (size_t i=0 ; i<numConnections ; i++) {
181fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                sp<SensorEventConnection> connection(activeConnections[i].promote());
182fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                if (connection != 0) {
183fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                    connection->sendEvents(buffer, count);
184fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                }
185fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            }
186fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
187fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
188fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    } while (count >= 0 || Thread::exitPending());
189fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
190fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    LOGW("Exiting SensorService::threadLoop!");
191fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return false;
192fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
193fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
194fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSortedVector< wp<SensorService::SensorEventConnection> >
195fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::getActiveConnections() const
196fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
197fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    Mutex::Autolock _l(mLock);
198fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return mActiveConnections;
199fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
200fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
2015d2707214dfb97bd8dfcc6620be36841d3c82420Mathias AgopianString8 SensorService::getSensorName(int handle) const {
2025d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian    size_t count = mSensorList.size();
2035d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian    for (size_t i=0 ; i<count ; i++) {
2045d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian        const Sensor& sensor(mSensorList[i]);
2055d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian        if (sensor.getHandle() == handle) {
2065d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian            return sensor.getName();
2075d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian        }
2085d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian    }
2095d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian    String8 result("unknown");
2105d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian    return result;
2115d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian}
2125d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian
213fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianVector<Sensor> SensorService::getSensorList()
214fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
215fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return mSensorList;
216fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
217fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
218fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiansp<ISensorEventConnection> SensorService::createSensorEventConnection()
219fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
220fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    sp<SensorEventConnection> result(new SensorEventConnection(this));
221fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return result;
222fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
223fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
224fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::cleanupConnection(const wp<SensorEventConnection>& connection)
225fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
226fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    Mutex::Autolock _l(mLock);
2277c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    size_t size = mActiveSensors.size();
2287c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    for (size_t i=0 ; i<size ; ) {
2297c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        SensorRecord* rec = mActiveSensors.valueAt(i);
2307c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        if (rec && rec->removeConnection(connection)) {
2317c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            mSensorDevice->activate(mSensorDevice, mActiveSensors.keyAt(i), 0);
2327c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            mActiveSensors.removeItemsAt(i, 1);
2337c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            delete rec;
2347c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            size--;
2357c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        } else {
2367c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            i++;
237fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
238fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
2397c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    mActiveConnections.remove(connection);
240fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
241fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
242fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::enable(const sp<SensorEventConnection>& connection,
243fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        int handle)
244fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
24550df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian    if (mInitCheck != NO_ERROR)
24650df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        return mInitCheck;
24750df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian
248fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    status_t err = NO_ERROR;
249fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    Mutex::Autolock _l(mLock);
250fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    SensorRecord* rec = mActiveSensors.valueFor(handle);
251fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (rec == 0) {
252fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        rec = new SensorRecord(connection);
253fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        mActiveSensors.add(handle, rec);
254fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        err = mSensorDevice->activate(mSensorDevice, handle, 1);
255fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        LOGE_IF(err, "Error activating sensor %d (%s)", handle, strerror(-err));
256451beee076cac09f817abae78a990dea108a9482Mathias Agopian        if (err == 0) {
257451beee076cac09f817abae78a990dea108a9482Mathias Agopian            BatteryService::getInstance().enableSensor(handle);
258451beee076cac09f817abae78a990dea108a9482Mathias Agopian        }
259fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    } else {
2607c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        rec->addConnection(connection);
261fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
262fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (err == NO_ERROR) {
263fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        // connection now active
2647c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        if (connection->addSensor(handle)) {
2657c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            // the sensor was added (which means it wasn't already there)
2667c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            // so, see if this connection becomes active
2677c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            if (mActiveConnections.indexOf(connection) < 0) {
2687c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian                mActiveConnections.add(connection);
2697c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            }
2707c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            // this could change the sensor event delivery speed
2717c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            recomputeEventsPeriodLocked(handle);
272fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
273fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
274fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return err;
275fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
276fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
277fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::disable(const sp<SensorEventConnection>& connection,
278fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        int handle)
279fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
28050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian    if (mInitCheck != NO_ERROR)
28150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        return mInitCheck;
28250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian
283fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    status_t err = NO_ERROR;
284fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    Mutex::Autolock _l(mLock);
285fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    SensorRecord* rec = mActiveSensors.valueFor(handle);
286fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (rec) {
287fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        // see if this connection becomes inactive
288fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        connection->removeSensor(handle);
289fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        if (connection->hasAnySensor() == false) {
290fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            mActiveConnections.remove(connection);
291fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
292fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        // see if this sensor becomes inactive
293fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        if (rec->removeConnection(connection)) {
294fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            mActiveSensors.removeItem(handle);
295fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            delete rec;
296fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            err = mSensorDevice->activate(mSensorDevice, handle, 0);
297451beee076cac09f817abae78a990dea108a9482Mathias Agopian            if (err == 0) {
298451beee076cac09f817abae78a990dea108a9482Mathias Agopian                BatteryService::getInstance().disableSensor(handle);
299451beee076cac09f817abae78a990dea108a9482Mathias Agopian            }
300fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
301fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
3027c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (err == NO_ERROR) {
3037c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        recomputeEventsPeriodLocked(handle);
3047c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    }
305fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return err;
306fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
307fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
3087c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianstatus_t SensorService::setEventRate(const sp<SensorEventConnection>& connection,
309fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        int handle, nsecs_t ns)
310fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
31150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian    if (mInitCheck != NO_ERROR)
31250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        return mInitCheck;
31350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian
3141cd700015318727d6d42236ab6274f1949fb08baMathias Agopian    if (ns < 0)
3151cd700015318727d6d42236ab6274f1949fb08baMathias Agopian        return BAD_VALUE;
3161cd700015318727d6d42236ab6274f1949fb08baMathias Agopian
3177c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (ns < MINIMUM_EVENTS_PERIOD)
3187c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        ns = MINIMUM_EVENTS_PERIOD;
3191cd700015318727d6d42236ab6274f1949fb08baMathias Agopian
320fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    Mutex::Autolock _l(mLock);
3217c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    status_t err = connection->setEventRateLocked(handle, ns);
3227c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (err == NO_ERROR) {
3237c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        recomputeEventsPeriodLocked(handle);
3247c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    }
3257c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return err;
3267c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian}
327fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
3287c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianstatus_t SensorService::recomputeEventsPeriodLocked(int32_t handle)
3297c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian{
3307c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    status_t err = NO_ERROR;
3317c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    nsecs_t wanted = ms2ns(1000);
3327c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    size_t count = mActiveConnections.size();
3337c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    for (size_t i=0 ; i<count ; i++) {
3347c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        sp<SensorEventConnection> connection(mActiveConnections[i].promote());
3357c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        if (connection != NULL) {
3367c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            nsecs_t ns = connection->getEventRateForSensor(handle);
3377c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            if (ns) {
3387c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian                wanted = wanted < ns ? wanted : ns;
3397c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            }
3407c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        }
3417c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    }
3427c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    err = mSensorDevice->setDelay(mSensorDevice, handle, wanted);
343fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return err;
344fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
345fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
346fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// ---------------------------------------------------------------------------
347fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
348fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorRecord::SensorRecord(
349fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        const sp<SensorEventConnection>& connection)
350fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
351fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    mConnections.add(connection);
352fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
353fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
3547c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorRecord::addConnection(
355fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        const sp<SensorEventConnection>& connection)
356fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
357fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (mConnections.indexOf(connection) < 0) {
358fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        mConnections.add(connection);
3597c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        return true;
360fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
3617c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return false;
362fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
363fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
364fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorRecord::removeConnection(
365fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        const wp<SensorEventConnection>& connection)
366fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
367fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    ssize_t index = mConnections.indexOf(connection);
368fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (index >= 0) {
369fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        mConnections.removeItemsAt(index, 1);
370fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
371fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return mConnections.size() ? false : true;
372fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
373fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
374fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// ---------------------------------------------------------------------------
375fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
376fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorEventConnection::SensorEventConnection(
377fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        const sp<SensorService>& service)
378fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    : mService(service), mChannel(new SensorChannel())
379fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
380fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
381fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
382fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorEventConnection::~SensorEventConnection()
383fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
384fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    mService->cleanupConnection(this);
385fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
386fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
387fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::SensorEventConnection::onFirstRef()
388fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
389fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
390fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
3917c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorEventConnection::addSensor(int32_t handle) {
3927c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (mSensorInfo.indexOfKey(handle) <= 0) {
3937c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        SensorInfo info;
3947c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        mSensorInfo.add(handle, info);
3957c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        return true;
396fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
3977c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return false;
398fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
399fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
4007c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorEventConnection::removeSensor(int32_t handle) {
4017c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (mSensorInfo.removeItem(handle) >= 0) {
4027c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        return true;
4037c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    }
4047c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return false;
405fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
406fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
407fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorEventConnection::hasSensor(int32_t handle) const {
4087c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return mSensorInfo.indexOfKey(handle) >= 0;
409fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
410fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
411fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorEventConnection::hasAnySensor() const {
4127c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return mSensorInfo.size() ? true : false;
4137c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian}
4147c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian
4157c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianstatus_t SensorService::SensorEventConnection::setEventRateLocked(
4167c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        int handle, nsecs_t ns)
4177c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian{
4187c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    ssize_t index = mSensorInfo.indexOfKey(handle);
4197c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (index >= 0) {
4207c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        SensorInfo& info = mSensorInfo.editValueFor(handle);
4217c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        info.ns = ns;
4227c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        return NO_ERROR;
4237c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    }
4247c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return status_t(index);
425fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
426fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
427fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::sendEvents(
428fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        sensors_event_t const* buffer, size_t count)
429fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
430fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    // TODO: we should only send the events for the sensors this connection
431fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    // is registered for.
432fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
433fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    ssize_t size = mChannel->write(buffer, count*sizeof(sensors_event_t));
434fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (size == -EAGAIN) {
435fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        // the destination doesn't accept events anymore, it's probably
436fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        // full. For now, we just drop the events on the floor.
437fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        LOGW("dropping %d events on the floor", count);
438fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        return size;
439fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
440fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
441fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    LOGE_IF(size<0, "dropping %d events on the floor (%s)",
442fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            count, strerror(-size));
443fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
444fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return size < 0 ? size : NO_ERROR;
445fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
446fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
447fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiansp<SensorChannel> SensorService::SensorEventConnection::getSensorChannel() const
448fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
449fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return mChannel;
450fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
451fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
452fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::enableDisable(
453fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        int handle, bool enabled)
454fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
455fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    status_t err;
456fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (enabled) {
457fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        err = mService->enable(this, handle);
458fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    } else {
459fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        err = mService->disable(this, handle);
460fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
461fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return err;
462fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
463fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
464fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::setEventRate(
465fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        int handle, nsecs_t ns)
466fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
4677c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return mService->setEventRate(this, handle, ns);
468fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
469fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
470fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// ---------------------------------------------------------------------------
471fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}; // namespace android
472fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
473