SensorService.cpp revision 71d7a5c289c6ef6b5fc86dd4784a075ca6470e38
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>
27c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian#include <utils/String16.h>
28fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
29fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <binder/BinderService.h>
30451beee076cac09f817abae78a990dea108a9482Mathias Agopian#include <binder/IServiceManager.h>
31fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
32fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <gui/ISensorServer.h>
33fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <gui/ISensorEventConnection.h>
34fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
35fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <hardware/sensors.h>
36fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
37fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include "SensorService.h"
38fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
39fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiannamespace android {
40fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// ---------------------------------------------------------------------------
41fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
42451beee076cac09f817abae78a990dea108a9482Mathias Agopianclass BatteryService : public Singleton<BatteryService> {
43c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian    static const int TRANSACTION_noteStartSensor = IBinder::FIRST_CALL_TRANSACTION + 3;
44c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian    static const int TRANSACTION_noteStopSensor = IBinder::FIRST_CALL_TRANSACTION + 4;
45c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian    static const String16 DESCRIPTOR;
46c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian
47451beee076cac09f817abae78a990dea108a9482Mathias Agopian    friend class Singleton<BatteryService>;
48451beee076cac09f817abae78a990dea108a9482Mathias Agopian    sp<IBinder> mBatteryStatService;
49c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian
50451beee076cac09f817abae78a990dea108a9482Mathias Agopian    BatteryService() {
51c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian        const sp<IServiceManager> sm(defaultServiceManager());
52c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian        if (sm != NULL) {
53c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian            const String16 name("batteryinfo");
54c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian            mBatteryStatService = sm->getService(name);
55c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian        }
56c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian    }
57c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian
58c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian    status_t noteStartSensor(int uid, int handle) {
59c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian        Parcel data, reply;
60c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian        data.writeInterfaceToken(DESCRIPTOR);
61c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian        data.writeInt32(uid);
62c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian        data.writeInt32(handle);
63c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian        status_t err = mBatteryStatService->transact(
64c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian                TRANSACTION_noteStartSensor, data, &reply, 0);
65c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian        err = reply.readExceptionCode();
66c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian        return err;
67451beee076cac09f817abae78a990dea108a9482Mathias Agopian    }
68c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian
69c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian    status_t noteStopSensor(int uid, int handle) {
70c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian        Parcel data, reply;
71c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian        data.writeInterfaceToken(DESCRIPTOR);
72c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian        data.writeInt32(uid);
73c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian        data.writeInt32(handle);
74c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian        status_t err = mBatteryStatService->transact(
75c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian                TRANSACTION_noteStopSensor, data, &reply, 0);
76c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian        err = reply.readExceptionCode();
77c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian        return err;
78c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian    }
79c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian
80451beee076cac09f817abae78a990dea108a9482Mathias Agopianpublic:
81451beee076cac09f817abae78a990dea108a9482Mathias Agopian    void enableSensor(int handle) {
82451beee076cac09f817abae78a990dea108a9482Mathias Agopian        if (mBatteryStatService != 0) {
83451beee076cac09f817abae78a990dea108a9482Mathias Agopian            int uid = IPCThreadState::self()->getCallingUid();
84c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian            int64_t identity = IPCThreadState::self()->clearCallingIdentity();
85c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian            noteStartSensor(uid, handle);
86c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian            IPCThreadState::self()->restoreCallingIdentity(identity);
87451beee076cac09f817abae78a990dea108a9482Mathias Agopian        }
88451beee076cac09f817abae78a990dea108a9482Mathias Agopian    }
89451beee076cac09f817abae78a990dea108a9482Mathias Agopian    void disableSensor(int handle) {
90451beee076cac09f817abae78a990dea108a9482Mathias Agopian        if (mBatteryStatService != 0) {
91451beee076cac09f817abae78a990dea108a9482Mathias Agopian            int uid = IPCThreadState::self()->getCallingUid();
92c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian            int64_t identity = IPCThreadState::self()->clearCallingIdentity();
93c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian            noteStopSensor(uid, handle);
94c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian            IPCThreadState::self()->restoreCallingIdentity(identity);
95451beee076cac09f817abae78a990dea108a9482Mathias Agopian        }
96451beee076cac09f817abae78a990dea108a9482Mathias Agopian    }
97451beee076cac09f817abae78a990dea108a9482Mathias Agopian};
98451beee076cac09f817abae78a990dea108a9482Mathias Agopian
99c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopianconst String16 BatteryService::DESCRIPTOR("com.android.internal.app.IBatteryStats");
100c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian
101451beee076cac09f817abae78a990dea108a9482Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(BatteryService)
102451beee076cac09f817abae78a990dea108a9482Mathias Agopian
103451beee076cac09f817abae78a990dea108a9482Mathias Agopian// ---------------------------------------------------------------------------
104451beee076cac09f817abae78a990dea108a9482Mathias Agopian
1051cd700015318727d6d42236ab6274f1949fb08baMathias Agopian// 100 events/s max
1061cd700015318727d6d42236ab6274f1949fb08baMathias Agopianstatic const nsecs_t MINIMUM_EVENT_PERIOD = ms2ns(10);
1071cd700015318727d6d42236ab6274f1949fb08baMathias Agopian
108fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorService()
109fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    : Thread(false),
11050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian      mSensorDevice(0),
11150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian      mSensorModule(0),
11250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian      mDump("android.permission.DUMP"),
11350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian      mInitCheck(NO_INIT)
114fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
115fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
116fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
117fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::onFirstRef()
118fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
11950df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian    LOGD("nuSensorService starting...");
12050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian
121fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID,
122fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            (hw_module_t const**)&mSensorModule);
123fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
124fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    LOGE_IF(err, "couldn't load %s module (%s)",
125fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            SENSORS_HARDWARE_MODULE_ID, strerror(-err));
126fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
12750df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian    if (mSensorModule) {
12850df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        err = sensors_open(&mSensorModule->common, &mSensorDevice);
129fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
13050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        LOGE_IF(err, "couldn't open device for module %s (%s)",
13150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian                SENSORS_HARDWARE_MODULE_ID, strerror(-err));
132fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
1333560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        sensors_event_t event;
1343560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        memset(&event, 0, sizeof(event));
1353560fb24b668675627934356f210d84d19bf4e56Mathias Agopian
13650df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        struct sensor_t const* list;
13750df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        int count = mSensorModule->get_sensors_list(mSensorModule, &list);
1383560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        mLastEventSeen.setCapacity(count);
13950df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        for (int i=0 ; i<count ; i++) {
14050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            Sensor sensor(list + i);
14150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            LOGI("%s", sensor.getName().string());
14250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            mSensorList.add(sensor);
14350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            if (mSensorDevice) {
14450df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian                mSensorDevice->activate(mSensorDevice, sensor.getHandle(), 0);
14550df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            }
1463560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            mLastEventSeen.add(sensor.getHandle(), event);
14750df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        }
148fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
14950df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        if (mSensorDevice) {
15050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            run("SensorService", PRIORITY_URGENT_DISPLAY);
15150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            mInitCheck = NO_ERROR;
15250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        }
153fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
154fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
155fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
156fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::~SensorService()
157fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
158fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
159fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
160fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::dump(int fd, const Vector<String16>& args)
161fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
162fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    const size_t SIZE = 1024;
163fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    char buffer[SIZE];
164fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    String8 result;
165fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (!mDump.checkCalling()) {
166fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        snprintf(buffer, SIZE, "Permission Denial: "
167fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                "can't dump SurfaceFlinger from pid=%d, uid=%d\n",
168fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                IPCThreadState::self()->getCallingPid(),
169fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                IPCThreadState::self()->getCallingUid());
170fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        result.append(buffer);
171fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    } else {
172fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        Mutex::Autolock _l(mLock);
1733560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        snprintf(buffer, SIZE, "Sensor List:\n");
1743560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        result.append(buffer);
1753560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        for (size_t i=0 ; i<mSensorList.size() ; i++) {
1763560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            const Sensor& s(mSensorList[i]);
1773560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            const sensors_event_t& e(mLastEventSeen.valueFor(s.getHandle()));
17824d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian            snprintf(buffer, SIZE, "%s (vendor=%s, handle=%d, maxRate=%.2fHz, last=<%5.1f,%5.1f,%5.1f>)\n",
1793560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                    s.getName().string(),
1803560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                    s.getVendor().string(),
1813560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                    s.getHandle(),
18224d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian                    s.getMinDelay() ? (1000000.0f / s.getMinDelay()) : 0.0f,
1833560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                    e.data[0], e.data[1], e.data[2]);
1843560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            result.append(buffer);
1853560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        }
1863560fb24b668675627934356f210d84d19bf4e56Mathias Agopian
1877c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        snprintf(buffer, SIZE, "%d active connections\n",
1887c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian                mActiveConnections.size());
189fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        result.append(buffer);
190fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        snprintf(buffer, SIZE, "Active sensors:\n");
191fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        result.append(buffer);
192fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        for (size_t i=0 ; i<mActiveSensors.size() ; i++) {
1935d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian            int handle = mActiveSensors.keyAt(i);
1945d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian            snprintf(buffer, SIZE, "%s (handle=%d, connections=%d)\n",
1955d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian                    getSensorName(handle).string(),
1965d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian                    handle,
197fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                    mActiveSensors.valueAt(i)->getNumConnections());
198fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            result.append(buffer);
199fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
200fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
201fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    write(fd, result.string(), result.size());
202fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return NO_ERROR;
203fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
204fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
205fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::threadLoop()
206fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
207fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    LOGD("nuSensorService thread starting...");
208fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
209fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    sensors_event_t buffer[16];
210cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian    sensors_event_t scratch[16];
211fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    struct sensors_poll_device_t* device = mSensorDevice;
212fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    ssize_t count;
213fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
214fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    do {
215fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        count = device->poll(device, buffer, sizeof(buffer)/sizeof(*buffer));
216fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        if (count<0) {
217fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            LOGE("sensor poll failed (%s)", strerror(-count));
218fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            break;
219fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
220fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
22194e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian        recordLastValue(buffer, count);
22294e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian
223fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        const SortedVector< wp<SensorEventConnection> > activeConnections(
224fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                getActiveConnections());
225fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
226fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        size_t numConnections = activeConnections.size();
227fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        if (numConnections) {
228fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            for (size_t i=0 ; i<numConnections ; i++) {
229fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                sp<SensorEventConnection> connection(activeConnections[i].promote());
230fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                if (connection != 0) {
231cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian                    connection->sendEvents(buffer, count, scratch);
232fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                }
233fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            }
234fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
235fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
236fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    } while (count >= 0 || Thread::exitPending());
237fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
238fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    LOGW("Exiting SensorService::threadLoop!");
239fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return false;
240fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
241fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
24294e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopianvoid SensorService::recordLastValue(
24394e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian        sensors_event_t const * buffer, size_t count)
24494e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian{
24594e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian    Mutex::Autolock _l(mLock);
24694e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian
24794e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian    // record the last event for each sensor
24894e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian    int32_t prev = buffer[0].sensor;
24994e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian    for (size_t i=1 ; i<count ; i++) {
25094e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian        // record the last event of each sensor type in this buffer
25194e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian        int32_t curr = buffer[i].sensor;
25294e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian        if (curr != prev) {
25394e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian            mLastEventSeen.editValueFor(prev) = buffer[i-1];
25494e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian            prev = curr;
25594e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian        }
25694e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian    }
25794e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian    mLastEventSeen.editValueFor(prev) = buffer[count-1];
25894e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian}
25994e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian
260fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSortedVector< wp<SensorService::SensorEventConnection> >
261fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::getActiveConnections() const
262fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
263fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    Mutex::Autolock _l(mLock);
264fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return mActiveConnections;
265fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
266fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
2675d2707214dfb97bd8dfcc6620be36841d3c82420Mathias AgopianString8 SensorService::getSensorName(int handle) const {
2685d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian    size_t count = mSensorList.size();
2695d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian    for (size_t i=0 ; i<count ; i++) {
2705d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian        const Sensor& sensor(mSensorList[i]);
2715d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian        if (sensor.getHandle() == handle) {
2725d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian            return sensor.getName();
2735d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian        }
2745d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian    }
2755d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian    String8 result("unknown");
2765d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian    return result;
2775d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian}
2785d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian
279fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianVector<Sensor> SensorService::getSensorList()
280fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
281fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return mSensorList;
282fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
283fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
284fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiansp<ISensorEventConnection> SensorService::createSensorEventConnection()
285fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
286fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    sp<SensorEventConnection> result(new SensorEventConnection(this));
287fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return result;
288fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
289fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
290fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::cleanupConnection(const wp<SensorEventConnection>& connection)
291fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
292fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    Mutex::Autolock _l(mLock);
2937c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    size_t size = mActiveSensors.size();
2947c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    for (size_t i=0 ; i<size ; ) {
2957c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        SensorRecord* rec = mActiveSensors.valueAt(i);
2967c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        if (rec && rec->removeConnection(connection)) {
2977c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            mSensorDevice->activate(mSensorDevice, mActiveSensors.keyAt(i), 0);
2987c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            mActiveSensors.removeItemsAt(i, 1);
2997c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            delete rec;
3007c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            size--;
3017c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        } else {
3027c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            i++;
303fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
304fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
3057c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    mActiveConnections.remove(connection);
306fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
307fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
308fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::enable(const sp<SensorEventConnection>& connection,
309fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        int handle)
310fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
31150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian    if (mInitCheck != NO_ERROR)
31250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        return mInitCheck;
31350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian
314fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    status_t err = NO_ERROR;
315fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    Mutex::Autolock _l(mLock);
316fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    SensorRecord* rec = mActiveSensors.valueFor(handle);
317fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (rec == 0) {
318fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        rec = new SensorRecord(connection);
319fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        mActiveSensors.add(handle, rec);
320fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        err = mSensorDevice->activate(mSensorDevice, handle, 1);
321fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        LOGE_IF(err, "Error activating sensor %d (%s)", handle, strerror(-err));
322451beee076cac09f817abae78a990dea108a9482Mathias Agopian        if (err == 0) {
323451beee076cac09f817abae78a990dea108a9482Mathias Agopian            BatteryService::getInstance().enableSensor(handle);
324451beee076cac09f817abae78a990dea108a9482Mathias Agopian        }
325fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    } else {
3263560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        if (rec->addConnection(connection)) {
3273560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            // this sensor is already activated, but we are adding a
3283560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            // connection that uses it. Immediately send down the last
3293560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            // known value of the requested sensor.
3303560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            sensors_event_t scratch;
3313560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            sensors_event_t& event(mLastEventSeen.editValueFor(handle));
3323560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            if (event.version == sizeof(sensors_event_t)) {
3333560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                connection->sendEvents(&event, 1);
3343560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            }
3353560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        }
336fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
337fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (err == NO_ERROR) {
338fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        // connection now active
3397c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        if (connection->addSensor(handle)) {
3407c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            // the sensor was added (which means it wasn't already there)
3417c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            // so, see if this connection becomes active
3427c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            if (mActiveConnections.indexOf(connection) < 0) {
3437c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian                mActiveConnections.add(connection);
3447c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            }
3457c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            // this could change the sensor event delivery speed
3467c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            recomputeEventsPeriodLocked(handle);
347fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
348fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
349fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return err;
350fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
351fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
352fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::disable(const sp<SensorEventConnection>& connection,
353fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        int handle)
354fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
35550df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian    if (mInitCheck != NO_ERROR)
35650df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        return mInitCheck;
35750df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian
358fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    status_t err = NO_ERROR;
359fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    Mutex::Autolock _l(mLock);
360fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    SensorRecord* rec = mActiveSensors.valueFor(handle);
361fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (rec) {
362fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        // see if this connection becomes inactive
363fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        connection->removeSensor(handle);
364fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        if (connection->hasAnySensor() == false) {
365fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            mActiveConnections.remove(connection);
366fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
367fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        // see if this sensor becomes inactive
368fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        if (rec->removeConnection(connection)) {
369fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            mActiveSensors.removeItem(handle);
370fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            delete rec;
371fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            err = mSensorDevice->activate(mSensorDevice, handle, 0);
372451beee076cac09f817abae78a990dea108a9482Mathias Agopian            if (err == 0) {
373451beee076cac09f817abae78a990dea108a9482Mathias Agopian                BatteryService::getInstance().disableSensor(handle);
374451beee076cac09f817abae78a990dea108a9482Mathias Agopian            }
375fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
376fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
3777c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (err == NO_ERROR) {
3787c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        recomputeEventsPeriodLocked(handle);
3797c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    }
380fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return err;
381fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
382fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
3837c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianstatus_t SensorService::setEventRate(const sp<SensorEventConnection>& connection,
384fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        int handle, nsecs_t ns)
385fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
38650df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian    if (mInitCheck != NO_ERROR)
38750df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        return mInitCheck;
38850df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian
3891cd700015318727d6d42236ab6274f1949fb08baMathias Agopian    if (ns < 0)
3901cd700015318727d6d42236ab6274f1949fb08baMathias Agopian        return BAD_VALUE;
3911cd700015318727d6d42236ab6274f1949fb08baMathias Agopian
3927c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (ns < MINIMUM_EVENTS_PERIOD)
3937c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        ns = MINIMUM_EVENTS_PERIOD;
3941cd700015318727d6d42236ab6274f1949fb08baMathias Agopian
395fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    Mutex::Autolock _l(mLock);
3967c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    status_t err = connection->setEventRateLocked(handle, ns);
3977c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (err == NO_ERROR) {
3987c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        recomputeEventsPeriodLocked(handle);
3997c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    }
4007c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return err;
4017c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian}
402fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
4037c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianstatus_t SensorService::recomputeEventsPeriodLocked(int32_t handle)
4047c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian{
4057c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    status_t err = NO_ERROR;
4067c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    nsecs_t wanted = ms2ns(1000);
4077c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    size_t count = mActiveConnections.size();
4087c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    for (size_t i=0 ; i<count ; i++) {
4097c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        sp<SensorEventConnection> connection(mActiveConnections[i].promote());
4107c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        if (connection != NULL) {
4117c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            nsecs_t ns = connection->getEventRateForSensor(handle);
4127c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            if (ns) {
4137c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian                wanted = wanted < ns ? wanted : ns;
4147c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            }
4157c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        }
4167c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    }
4177c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    err = mSensorDevice->setDelay(mSensorDevice, handle, wanted);
418fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return err;
419fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
420fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
421fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// ---------------------------------------------------------------------------
422fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
423fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorRecord::SensorRecord(
424fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        const sp<SensorEventConnection>& connection)
425fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
426fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    mConnections.add(connection);
427fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
428fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
4297c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorRecord::addConnection(
430fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        const sp<SensorEventConnection>& connection)
431fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
432fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (mConnections.indexOf(connection) < 0) {
433fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        mConnections.add(connection);
4347c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        return true;
435fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
4367c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return false;
437fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
438fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
439fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorRecord::removeConnection(
440fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        const wp<SensorEventConnection>& connection)
441fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
442fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    ssize_t index = mConnections.indexOf(connection);
443fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (index >= 0) {
444fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        mConnections.removeItemsAt(index, 1);
445fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
446fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return mConnections.size() ? false : true;
447fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
448fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
449fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// ---------------------------------------------------------------------------
450fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
451fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorEventConnection::SensorEventConnection(
452fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        const sp<SensorService>& service)
453fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    : mService(service), mChannel(new SensorChannel())
454fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
455fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
456fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
457fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorEventConnection::~SensorEventConnection()
458fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
459fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    mService->cleanupConnection(this);
460fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
461fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
462fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::SensorEventConnection::onFirstRef()
463fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
464fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
465fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
4667c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorEventConnection::addSensor(int32_t handle) {
46771d7a5c289c6ef6b5fc86dd4784a075ca6470e38Mathias Agopian    Mutex::Autolock _l(mConnectionLock);
4687c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (mSensorInfo.indexOfKey(handle) <= 0) {
4697c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        SensorInfo info;
4707c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        mSensorInfo.add(handle, info);
4717c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        return true;
472fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
4737c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return false;
474fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
475fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
4767c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorEventConnection::removeSensor(int32_t handle) {
47771d7a5c289c6ef6b5fc86dd4784a075ca6470e38Mathias Agopian    Mutex::Autolock _l(mConnectionLock);
4787c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (mSensorInfo.removeItem(handle) >= 0) {
4797c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        return true;
4807c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    }
4817c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return false;
482fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
483fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
484fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorEventConnection::hasSensor(int32_t handle) const {
48571d7a5c289c6ef6b5fc86dd4784a075ca6470e38Mathias Agopian    Mutex::Autolock _l(mConnectionLock);
4867c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return mSensorInfo.indexOfKey(handle) >= 0;
487fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
488fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
489fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorEventConnection::hasAnySensor() const {
49071d7a5c289c6ef6b5fc86dd4784a075ca6470e38Mathias Agopian    Mutex::Autolock _l(mConnectionLock);
4917c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return mSensorInfo.size() ? true : false;
4927c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian}
4937c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian
4947c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianstatus_t SensorService::SensorEventConnection::setEventRateLocked(
4957c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        int handle, nsecs_t ns)
4967c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian{
49771d7a5c289c6ef6b5fc86dd4784a075ca6470e38Mathias Agopian    Mutex::Autolock _l(mConnectionLock);
4987c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    ssize_t index = mSensorInfo.indexOfKey(handle);
4997c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (index >= 0) {
5007c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        SensorInfo& info = mSensorInfo.editValueFor(handle);
5017c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        info.ns = ns;
5027c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        return NO_ERROR;
5037c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    }
5047c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return status_t(index);
505fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
506fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
507fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::sendEvents(
508cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian        sensors_event_t const* buffer, size_t numEvents,
509cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian        sensors_event_t* scratch)
510fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
511cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian    // filter out events not for this connection
5123560fb24b668675627934356f210d84d19bf4e56Mathias Agopian    size_t count = 0;
5133560fb24b668675627934356f210d84d19bf4e56Mathias Agopian    if (scratch) {
51471d7a5c289c6ef6b5fc86dd4784a075ca6470e38Mathias Agopian        Mutex::Autolock _l(mConnectionLock);
5153560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        size_t i=0;
5163560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        while (i<numEvents) {
5173560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            const int32_t curr = buffer[i].sensor;
5183560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            if (mSensorInfo.indexOfKey(curr) >= 0) {
5193560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                do {
5203560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                    scratch[count++] = buffer[i++];
5213560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                } while ((i<numEvents) && (buffer[i].sensor == curr));
5223560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            } else {
5233560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                i++;
5243560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            }
525cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian        }
5263560fb24b668675627934356f210d84d19bf4e56Mathias Agopian    } else {
5273560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        scratch = const_cast<sensors_event_t *>(buffer);
5283560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        count = numEvents;
529cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian    }
530fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
5313560fb24b668675627934356f210d84d19bf4e56Mathias Agopian    if (count == 0)
5323560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        return 0;
5333560fb24b668675627934356f210d84d19bf4e56Mathias Agopian
534cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian    ssize_t size = mChannel->write(scratch, count*sizeof(sensors_event_t));
535fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (size == -EAGAIN) {
536fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        // the destination doesn't accept events anymore, it's probably
537fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        // full. For now, we just drop the events on the floor.
538fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        LOGW("dropping %d events on the floor", count);
539fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        return size;
540fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
541fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
542fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    LOGE_IF(size<0, "dropping %d events on the floor (%s)",
543fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            count, strerror(-size));
544fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
5451e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown    return size < 0 ? status_t(size) : status_t(NO_ERROR);
546fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
547fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
548fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiansp<SensorChannel> SensorService::SensorEventConnection::getSensorChannel() const
549fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
550fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return mChannel;
551fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
552fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
553fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::enableDisable(
554fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        int handle, bool enabled)
555fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
556fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    status_t err;
557fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (enabled) {
558fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        err = mService->enable(this, handle);
559fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    } else {
560fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        err = mService->disable(this, handle);
561fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
562fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return err;
563fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
564fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
565fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::setEventRate(
566fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        int handle, nsecs_t ns)
567fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
5687c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return mService->setEventRate(this, handle, ns);
569fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
570fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
571fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// ---------------------------------------------------------------------------
572fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}; // namespace android
573fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
574