SensorService.cpp revision 3560fb24b668675627934356f210d84d19bf4e56
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:
43451beee076cac09f817abae78a990dea108a9482Mathias Agopian * - send sensor info to battery service
443560fb24b668675627934356f210d84d19bf4e56Mathias Agopian *
453560fb24b668675627934356f210d84d19bf4e56Mathias Agopian
463560fb24b668675627934356f210d84d19bf4e56Mathias Agopianstatic final int TRANSACTION_noteStartSensor = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3);
473560fb24b668675627934356f210d84d19bf4e56Mathias Agopianstatic final int TRANSACTION_noteStopSensor = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4);
483560fb24b668675627934356f210d84d19bf4e56Mathias Agopian
493560fb24b668675627934356f210d84d19bf4e56Mathias Agopian    _data.writeInterfaceToken(DESCRIPTOR);
503560fb24b668675627934356f210d84d19bf4e56Mathias Agopian    _data.writeInt(uid);
513560fb24b668675627934356f210d84d19bf4e56Mathias Agopian    _data.writeInt(sensor);
523560fb24b668675627934356f210d84d19bf4e56Mathias Agopian    mRemote.transact(Stub.TRANSACTION_noteStartSensor, _data, _reply, 0);
533560fb24b668675627934356f210d84d19bf4e56Mathias Agopian    _reply.readException();
543560fb24b668675627934356f210d84d19bf4e56Mathias Agopian *
55fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian */
56fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
57451beee076cac09f817abae78a990dea108a9482Mathias Agopian// ---------------------------------------------------------------------------
58451beee076cac09f817abae78a990dea108a9482Mathias Agopian
59451beee076cac09f817abae78a990dea108a9482Mathias Agopianclass BatteryService : public Singleton<BatteryService> {
60451beee076cac09f817abae78a990dea108a9482Mathias Agopian    friend class Singleton<BatteryService>;
61451beee076cac09f817abae78a990dea108a9482Mathias Agopian    sp<IBinder> mBatteryStatService;
62451beee076cac09f817abae78a990dea108a9482Mathias Agopian    BatteryService() {
63451beee076cac09f817abae78a990dea108a9482Mathias Agopian        const String16 name("batteryinfo");
64451beee076cac09f817abae78a990dea108a9482Mathias Agopian        //getService(name, &mBatteryStatService);
65451beee076cac09f817abae78a990dea108a9482Mathias Agopian    }
66451beee076cac09f817abae78a990dea108a9482Mathias Agopianpublic:
67451beee076cac09f817abae78a990dea108a9482Mathias Agopian    void enableSensor(int handle) {
68451beee076cac09f817abae78a990dea108a9482Mathias Agopian        if (mBatteryStatService != 0) {
69451beee076cac09f817abae78a990dea108a9482Mathias Agopian            int uid = IPCThreadState::self()->getCallingUid();
70451beee076cac09f817abae78a990dea108a9482Mathias Agopian            //mBatteryStatService->noteStartSensor(uid, handle);
71451beee076cac09f817abae78a990dea108a9482Mathias Agopian        }
72451beee076cac09f817abae78a990dea108a9482Mathias Agopian    }
73451beee076cac09f817abae78a990dea108a9482Mathias Agopian    void disableSensor(int handle) {
74451beee076cac09f817abae78a990dea108a9482Mathias Agopian        if (mBatteryStatService != 0) {
75451beee076cac09f817abae78a990dea108a9482Mathias Agopian            int uid = IPCThreadState::self()->getCallingUid();
76451beee076cac09f817abae78a990dea108a9482Mathias Agopian            //mBatteryStatService->noteStopSensor(uid, handle);
77451beee076cac09f817abae78a990dea108a9482Mathias Agopian        }
78451beee076cac09f817abae78a990dea108a9482Mathias Agopian    }
79451beee076cac09f817abae78a990dea108a9482Mathias Agopian};
80451beee076cac09f817abae78a990dea108a9482Mathias Agopian
81451beee076cac09f817abae78a990dea108a9482Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(BatteryService)
82451beee076cac09f817abae78a990dea108a9482Mathias Agopian
83451beee076cac09f817abae78a990dea108a9482Mathias Agopian// ---------------------------------------------------------------------------
84451beee076cac09f817abae78a990dea108a9482Mathias Agopian
851cd700015318727d6d42236ab6274f1949fb08baMathias Agopian// 100 events/s max
861cd700015318727d6d42236ab6274f1949fb08baMathias Agopianstatic const nsecs_t MINIMUM_EVENT_PERIOD = ms2ns(10);
871cd700015318727d6d42236ab6274f1949fb08baMathias Agopian
88fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorService()
89fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    : Thread(false),
9050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian      mSensorDevice(0),
9150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian      mSensorModule(0),
9250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian      mDump("android.permission.DUMP"),
9350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian      mInitCheck(NO_INIT)
94fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
95fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
96fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
97fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::onFirstRef()
98fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
9950df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian    LOGD("nuSensorService starting...");
10050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian
101fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID,
102fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            (hw_module_t const**)&mSensorModule);
103fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
104fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    LOGE_IF(err, "couldn't load %s module (%s)",
105fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            SENSORS_HARDWARE_MODULE_ID, strerror(-err));
106fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
10750df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian    if (mSensorModule) {
10850df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        err = sensors_open(&mSensorModule->common, &mSensorDevice);
109fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
11050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        LOGE_IF(err, "couldn't open device for module %s (%s)",
11150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian                SENSORS_HARDWARE_MODULE_ID, strerror(-err));
112fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
1133560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        sensors_event_t event;
1143560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        memset(&event, 0, sizeof(event));
1153560fb24b668675627934356f210d84d19bf4e56Mathias Agopian
11650df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        struct sensor_t const* list;
11750df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        int count = mSensorModule->get_sensors_list(mSensorModule, &list);
1183560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        mLastEventSeen.setCapacity(count);
11950df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        for (int i=0 ; i<count ; i++) {
12050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            Sensor sensor(list + i);
12150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            LOGI("%s", sensor.getName().string());
12250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            mSensorList.add(sensor);
12350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            if (mSensorDevice) {
12450df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian                mSensorDevice->activate(mSensorDevice, sensor.getHandle(), 0);
12550df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            }
1263560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            mLastEventSeen.add(sensor.getHandle(), event);
12750df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        }
128fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
12950df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        if (mSensorDevice) {
13050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            run("SensorService", PRIORITY_URGENT_DISPLAY);
13150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian            mInitCheck = NO_ERROR;
13250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        }
133fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
134fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
135fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
136fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::~SensorService()
137fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
138fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
139fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
140fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::dump(int fd, const Vector<String16>& args)
141fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
142fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    const size_t SIZE = 1024;
143fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    char buffer[SIZE];
144fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    String8 result;
145fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (!mDump.checkCalling()) {
146fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        snprintf(buffer, SIZE, "Permission Denial: "
147fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                "can't dump SurfaceFlinger from pid=%d, uid=%d\n",
148fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                IPCThreadState::self()->getCallingPid(),
149fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                IPCThreadState::self()->getCallingUid());
150fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        result.append(buffer);
151fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    } else {
152fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        Mutex::Autolock _l(mLock);
1533560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        snprintf(buffer, SIZE, "Sensor List:\n");
1543560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        result.append(buffer);
1553560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        for (size_t i=0 ; i<mSensorList.size() ; i++) {
1563560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            const Sensor& s(mSensorList[i]);
1573560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            const sensors_event_t& e(mLastEventSeen.valueFor(s.getHandle()));
1583560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            snprintf(buffer, SIZE, "%s (vendor=%s, handle=%d, last=<%5.1f,%5.1f,%5.1f>)\n",
1593560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                    s.getName().string(),
1603560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                    s.getVendor().string(),
1613560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                    s.getHandle(),
1623560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                    e.data[0], e.data[1], e.data[2]);
1633560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            result.append(buffer);
1643560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        }
1653560fb24b668675627934356f210d84d19bf4e56Mathias Agopian
1667c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        snprintf(buffer, SIZE, "%d active connections\n",
1677c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian                mActiveConnections.size());
168fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        result.append(buffer);
169fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        snprintf(buffer, SIZE, "Active sensors:\n");
170fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        result.append(buffer);
171fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        for (size_t i=0 ; i<mActiveSensors.size() ; i++) {
1725d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian            int handle = mActiveSensors.keyAt(i);
1735d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian            snprintf(buffer, SIZE, "%s (handle=%d, connections=%d)\n",
1745d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian                    getSensorName(handle).string(),
1755d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian                    handle,
176fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                    mActiveSensors.valueAt(i)->getNumConnections());
177fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            result.append(buffer);
178fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
179fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
180fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    write(fd, result.string(), result.size());
181fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return NO_ERROR;
182fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
183fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
184fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::threadLoop()
185fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
186fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    LOGD("nuSensorService thread starting...");
187fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
188fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    sensors_event_t buffer[16];
189cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian    sensors_event_t scratch[16];
190fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    struct sensors_poll_device_t* device = mSensorDevice;
191fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    ssize_t count;
192fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
193fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    do {
194fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        count = device->poll(device, buffer, sizeof(buffer)/sizeof(*buffer));
195fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        if (count<0) {
196fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            LOGE("sensor poll failed (%s)", strerror(-count));
197fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            break;
198fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
199fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
200fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        const SortedVector< wp<SensorEventConnection> > activeConnections(
201fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                getActiveConnections());
202fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
203fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        size_t numConnections = activeConnections.size();
204fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        if (numConnections) {
205cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian            Mutex::Autolock _l(mLock);
2063560fb24b668675627934356f210d84d19bf4e56Mathias Agopian
2073560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            // record the last event for each sensor
2083560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            int32_t prev = buffer[0].sensor;
2093560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            for (ssize_t i=1 ; i<count ; i++) {
2103560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                // record the last event of each sensor type in this buffer
2113560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                int32_t curr = buffer[i].sensor;
2123560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                if (curr != prev) {
2133560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                    mLastEventSeen.editValueFor(prev) = buffer[i-1];
2143560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                    prev = curr;
2153560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                }
2163560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            }
2173560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            mLastEventSeen.editValueFor(prev) = buffer[count-1];
2183560fb24b668675627934356f210d84d19bf4e56Mathias Agopian
219fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            for (size_t i=0 ; i<numConnections ; i++) {
220fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                sp<SensorEventConnection> connection(activeConnections[i].promote());
221fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                if (connection != 0) {
222cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian                    connection->sendEvents(buffer, count, scratch);
223fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian                }
224fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            }
225fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
226fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
227fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    } while (count >= 0 || Thread::exitPending());
228fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
229fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    LOGW("Exiting SensorService::threadLoop!");
230fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return false;
231fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
232fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
233fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSortedVector< wp<SensorService::SensorEventConnection> >
234fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::getActiveConnections() const
235fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
236fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    Mutex::Autolock _l(mLock);
237fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return mActiveConnections;
238fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
239fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
2405d2707214dfb97bd8dfcc6620be36841d3c82420Mathias AgopianString8 SensorService::getSensorName(int handle) const {
2415d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian    size_t count = mSensorList.size();
2425d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian    for (size_t i=0 ; i<count ; i++) {
2435d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian        const Sensor& sensor(mSensorList[i]);
2445d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian        if (sensor.getHandle() == handle) {
2455d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian            return sensor.getName();
2465d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian        }
2475d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian    }
2485d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian    String8 result("unknown");
2495d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian    return result;
2505d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian}
2515d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian
252fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianVector<Sensor> SensorService::getSensorList()
253fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
254fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return mSensorList;
255fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
256fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
257fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiansp<ISensorEventConnection> SensorService::createSensorEventConnection()
258fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
259fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    sp<SensorEventConnection> result(new SensorEventConnection(this));
260fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return result;
261fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
262fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
263fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::cleanupConnection(const wp<SensorEventConnection>& connection)
264fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
265fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    Mutex::Autolock _l(mLock);
2667c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    size_t size = mActiveSensors.size();
2677c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    for (size_t i=0 ; i<size ; ) {
2687c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        SensorRecord* rec = mActiveSensors.valueAt(i);
2697c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        if (rec && rec->removeConnection(connection)) {
2707c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            mSensorDevice->activate(mSensorDevice, mActiveSensors.keyAt(i), 0);
2717c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            mActiveSensors.removeItemsAt(i, 1);
2727c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            delete rec;
2737c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            size--;
2747c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        } else {
2757c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            i++;
276fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
277fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
2787c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    mActiveConnections.remove(connection);
279fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
280fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
281fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::enable(const sp<SensorEventConnection>& connection,
282fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        int handle)
283fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
28450df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian    if (mInitCheck != NO_ERROR)
28550df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        return mInitCheck;
28650df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian
287fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    status_t err = NO_ERROR;
288fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    Mutex::Autolock _l(mLock);
289fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    SensorRecord* rec = mActiveSensors.valueFor(handle);
290fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (rec == 0) {
291fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        rec = new SensorRecord(connection);
292fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        mActiveSensors.add(handle, rec);
293fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        err = mSensorDevice->activate(mSensorDevice, handle, 1);
294fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        LOGE_IF(err, "Error activating sensor %d (%s)", handle, strerror(-err));
295451beee076cac09f817abae78a990dea108a9482Mathias Agopian        if (err == 0) {
296451beee076cac09f817abae78a990dea108a9482Mathias Agopian            BatteryService::getInstance().enableSensor(handle);
297451beee076cac09f817abae78a990dea108a9482Mathias Agopian        }
298fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    } else {
2993560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        if (rec->addConnection(connection)) {
3003560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            // this sensor is already activated, but we are adding a
3013560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            // connection that uses it. Immediately send down the last
3023560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            // known value of the requested sensor.
3033560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            sensors_event_t scratch;
3043560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            sensors_event_t& event(mLastEventSeen.editValueFor(handle));
3053560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            if (event.version == sizeof(sensors_event_t)) {
3063560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                connection->sendEvents(&event, 1);
3073560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            }
3083560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        }
309fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
310fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (err == NO_ERROR) {
311fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        // connection now active
3127c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        if (connection->addSensor(handle)) {
3137c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            // the sensor was added (which means it wasn't already there)
3147c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            // so, see if this connection becomes active
3157c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            if (mActiveConnections.indexOf(connection) < 0) {
3167c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian                mActiveConnections.add(connection);
3177c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            }
3187c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            // this could change the sensor event delivery speed
3197c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            recomputeEventsPeriodLocked(handle);
320fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
321fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
322fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return err;
323fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
324fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
325fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::disable(const sp<SensorEventConnection>& connection,
326fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        int handle)
327fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
32850df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian    if (mInitCheck != NO_ERROR)
32950df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        return mInitCheck;
33050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian
331fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    status_t err = NO_ERROR;
332fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    Mutex::Autolock _l(mLock);
333fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    SensorRecord* rec = mActiveSensors.valueFor(handle);
334fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (rec) {
335fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        // see if this connection becomes inactive
336fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        connection->removeSensor(handle);
337fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        if (connection->hasAnySensor() == false) {
338fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            mActiveConnections.remove(connection);
339fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
340fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        // see if this sensor becomes inactive
341fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        if (rec->removeConnection(connection)) {
342fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            mActiveSensors.removeItem(handle);
343fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            delete rec;
344fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            err = mSensorDevice->activate(mSensorDevice, handle, 0);
345451beee076cac09f817abae78a990dea108a9482Mathias Agopian            if (err == 0) {
346451beee076cac09f817abae78a990dea108a9482Mathias Agopian                BatteryService::getInstance().disableSensor(handle);
347451beee076cac09f817abae78a990dea108a9482Mathias Agopian            }
348fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        }
349fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
3507c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (err == NO_ERROR) {
3517c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        recomputeEventsPeriodLocked(handle);
3527c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    }
353fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return err;
354fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
355fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
3567c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianstatus_t SensorService::setEventRate(const sp<SensorEventConnection>& connection,
357fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        int handle, nsecs_t ns)
358fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
35950df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian    if (mInitCheck != NO_ERROR)
36050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian        return mInitCheck;
36150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian
3621cd700015318727d6d42236ab6274f1949fb08baMathias Agopian    if (ns < 0)
3631cd700015318727d6d42236ab6274f1949fb08baMathias Agopian        return BAD_VALUE;
3641cd700015318727d6d42236ab6274f1949fb08baMathias Agopian
3657c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (ns < MINIMUM_EVENTS_PERIOD)
3667c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        ns = MINIMUM_EVENTS_PERIOD;
3671cd700015318727d6d42236ab6274f1949fb08baMathias Agopian
368fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    Mutex::Autolock _l(mLock);
3697c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    status_t err = connection->setEventRateLocked(handle, ns);
3707c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (err == NO_ERROR) {
3717c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        recomputeEventsPeriodLocked(handle);
3727c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    }
3737c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return err;
3747c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian}
375fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
3767c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianstatus_t SensorService::recomputeEventsPeriodLocked(int32_t handle)
3777c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian{
3787c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    status_t err = NO_ERROR;
3797c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    nsecs_t wanted = ms2ns(1000);
3807c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    size_t count = mActiveConnections.size();
3817c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    for (size_t i=0 ; i<count ; i++) {
3827c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        sp<SensorEventConnection> connection(mActiveConnections[i].promote());
3837c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        if (connection != NULL) {
3847c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            nsecs_t ns = connection->getEventRateForSensor(handle);
3857c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            if (ns) {
3867c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian                wanted = wanted < ns ? wanted : ns;
3877c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian            }
3887c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        }
3897c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    }
3907c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    err = mSensorDevice->setDelay(mSensorDevice, handle, wanted);
391fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return err;
392fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
393fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
394fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// ---------------------------------------------------------------------------
395fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
396fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorRecord::SensorRecord(
397fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        const sp<SensorEventConnection>& connection)
398fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
399fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    mConnections.add(connection);
400fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
401fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
4027c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorRecord::addConnection(
403fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        const sp<SensorEventConnection>& connection)
404fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
405fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (mConnections.indexOf(connection) < 0) {
406fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        mConnections.add(connection);
4077c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        return true;
408fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
4097c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return false;
410fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
411fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
412fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorRecord::removeConnection(
413fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        const wp<SensorEventConnection>& connection)
414fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
415fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    ssize_t index = mConnections.indexOf(connection);
416fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (index >= 0) {
417fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        mConnections.removeItemsAt(index, 1);
418fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
419fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return mConnections.size() ? false : true;
420fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
421fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
422fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// ---------------------------------------------------------------------------
423fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
424fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorEventConnection::SensorEventConnection(
425fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        const sp<SensorService>& service)
426fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    : mService(service), mChannel(new SensorChannel())
427fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
428fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
429fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
430fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorEventConnection::~SensorEventConnection()
431fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
432fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    mService->cleanupConnection(this);
433fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
434fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
435fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::SensorEventConnection::onFirstRef()
436fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
437fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
438fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
4397c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorEventConnection::addSensor(int32_t handle) {
4407c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (mSensorInfo.indexOfKey(handle) <= 0) {
4417c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        SensorInfo info;
4427c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        mSensorInfo.add(handle, info);
4437c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        return true;
444fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
4457c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return false;
446fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
447fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
4487c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorEventConnection::removeSensor(int32_t handle) {
4497c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (mSensorInfo.removeItem(handle) >= 0) {
4507c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        return true;
4517c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    }
4527c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return false;
453fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
454fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
455fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorEventConnection::hasSensor(int32_t handle) const {
4567c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return mSensorInfo.indexOfKey(handle) >= 0;
457fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
458fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
459fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorEventConnection::hasAnySensor() const {
4607c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return mSensorInfo.size() ? true : false;
4617c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian}
4627c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian
4637c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianstatus_t SensorService::SensorEventConnection::setEventRateLocked(
4647c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        int handle, nsecs_t ns)
4657c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian{
4667c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    ssize_t index = mSensorInfo.indexOfKey(handle);
4677c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    if (index >= 0) {
4687c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        SensorInfo& info = mSensorInfo.editValueFor(handle);
4697c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        info.ns = ns;
4707c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian        return NO_ERROR;
4717c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    }
4727c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return status_t(index);
473fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
474fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
475fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::sendEvents(
476cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian        sensors_event_t const* buffer, size_t numEvents,
477cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian        sensors_event_t* scratch)
478fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
479cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian    // filter out events not for this connection
4803560fb24b668675627934356f210d84d19bf4e56Mathias Agopian    size_t count = 0;
4813560fb24b668675627934356f210d84d19bf4e56Mathias Agopian    if (scratch) {
4823560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        size_t i=0;
4833560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        while (i<numEvents) {
4843560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            const int32_t curr = buffer[i].sensor;
4853560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            if (mSensorInfo.indexOfKey(curr) >= 0) {
4863560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                do {
4873560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                    scratch[count++] = buffer[i++];
4883560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                } while ((i<numEvents) && (buffer[i].sensor == curr));
4893560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            } else {
4903560fb24b668675627934356f210d84d19bf4e56Mathias Agopian                i++;
4913560fb24b668675627934356f210d84d19bf4e56Mathias Agopian            }
492cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian        }
4933560fb24b668675627934356f210d84d19bf4e56Mathias Agopian    } else {
4943560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        scratch = const_cast<sensors_event_t *>(buffer);
4953560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        count = numEvents;
496cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian    }
497fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
4983560fb24b668675627934356f210d84d19bf4e56Mathias Agopian    if (count == 0)
4993560fb24b668675627934356f210d84d19bf4e56Mathias Agopian        return 0;
5003560fb24b668675627934356f210d84d19bf4e56Mathias Agopian
501cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian    ssize_t size = mChannel->write(scratch, count*sizeof(sensors_event_t));
502fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (size == -EAGAIN) {
503fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        // the destination doesn't accept events anymore, it's probably
504fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        // full. For now, we just drop the events on the floor.
505fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        LOGW("dropping %d events on the floor", count);
506fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        return size;
507fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
508fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
509fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    LOGE_IF(size<0, "dropping %d events on the floor (%s)",
510fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian            count, strerror(-size));
511fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
512fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return size < 0 ? size : NO_ERROR;
513fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
514fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
515fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiansp<SensorChannel> SensorService::SensorEventConnection::getSensorChannel() const
516fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
517fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return mChannel;
518fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
519fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
520fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::enableDisable(
521fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        int handle, bool enabled)
522fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
523fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    status_t err;
524fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    if (enabled) {
525fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        err = mService->enable(this, handle);
526fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    } else {
527fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        err = mService->disable(this, handle);
528fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    }
529fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian    return err;
530fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
531fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
532fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::setEventRate(
533fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian        int handle, nsecs_t ns)
534fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{
5357c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian    return mService->setEventRate(this, handle, ns);
536fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}
537fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
538fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// ---------------------------------------------------------------------------
539fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}; // namespace android
540fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian
541