SensorService.cpp revision 24d72350f321c17b0bfe1ef3fd52d4070a1c02c3
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 221fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const SortedVector< wp<SensorEventConnection> > activeConnections( 222fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian getActiveConnections()); 223fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 224fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian size_t numConnections = activeConnections.size(); 225fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (numConnections) { 226cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian Mutex::Autolock _l(mLock); 2273560fb24b668675627934356f210d84d19bf4e56Mathias Agopian 2283560fb24b668675627934356f210d84d19bf4e56Mathias Agopian // record the last event for each sensor 2293560fb24b668675627934356f210d84d19bf4e56Mathias Agopian int32_t prev = buffer[0].sensor; 2303560fb24b668675627934356f210d84d19bf4e56Mathias Agopian for (ssize_t i=1 ; i<count ; i++) { 2313560fb24b668675627934356f210d84d19bf4e56Mathias Agopian // record the last event of each sensor type in this buffer 2323560fb24b668675627934356f210d84d19bf4e56Mathias Agopian int32_t curr = buffer[i].sensor; 2333560fb24b668675627934356f210d84d19bf4e56Mathias Agopian if (curr != prev) { 2343560fb24b668675627934356f210d84d19bf4e56Mathias Agopian mLastEventSeen.editValueFor(prev) = buffer[i-1]; 2353560fb24b668675627934356f210d84d19bf4e56Mathias Agopian prev = curr; 2363560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } 2373560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } 2383560fb24b668675627934356f210d84d19bf4e56Mathias Agopian mLastEventSeen.editValueFor(prev) = buffer[count-1]; 2393560fb24b668675627934356f210d84d19bf4e56Mathias Agopian 240fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian for (size_t i=0 ; i<numConnections ; i++) { 241fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian sp<SensorEventConnection> connection(activeConnections[i].promote()); 242fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (connection != 0) { 243cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian connection->sendEvents(buffer, count, scratch); 244fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 245fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 246fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 247fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 248fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } while (count >= 0 || Thread::exitPending()); 249fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 250fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGW("Exiting SensorService::threadLoop!"); 251fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return false; 252fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 253fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 254fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSortedVector< wp<SensorService::SensorEventConnection> > 255fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::getActiveConnections() const 256fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 257fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 258fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mActiveConnections; 259fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 260fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 2615d2707214dfb97bd8dfcc6620be36841d3c82420Mathias AgopianString8 SensorService::getSensorName(int handle) const { 2625d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian size_t count = mSensorList.size(); 2635d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian for (size_t i=0 ; i<count ; i++) { 2645d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian const Sensor& sensor(mSensorList[i]); 2655d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian if (sensor.getHandle() == handle) { 2665d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian return sensor.getName(); 2675d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian } 2685d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian } 2695d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian String8 result("unknown"); 2705d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian return result; 2715d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian} 2725d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian 273fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianVector<Sensor> SensorService::getSensorList() 274fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 275fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mSensorList; 276fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 277fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 278fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiansp<ISensorEventConnection> SensorService::createSensorEventConnection() 279fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 280fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian sp<SensorEventConnection> result(new SensorEventConnection(this)); 281fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return result; 282fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 283fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 284fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::cleanupConnection(const wp<SensorEventConnection>& connection) 285fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 286fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 2877c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian size_t size = mActiveSensors.size(); 2887c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian for (size_t i=0 ; i<size ; ) { 2897c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian SensorRecord* rec = mActiveSensors.valueAt(i); 2907c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (rec && rec->removeConnection(connection)) { 2917c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian mSensorDevice->activate(mSensorDevice, mActiveSensors.keyAt(i), 0); 2927c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian mActiveSensors.removeItemsAt(i, 1); 2937c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian delete rec; 2947c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian size--; 2957c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } else { 2967c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian i++; 297fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 298fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 2997c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian mActiveConnections.remove(connection); 300fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 301fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 302fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::enable(const sp<SensorEventConnection>& connection, 303fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle) 304fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 30550df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mInitCheck != NO_ERROR) 30650df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian return mInitCheck; 30750df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 308fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian status_t err = NO_ERROR; 309fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 310fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian SensorRecord* rec = mActiveSensors.valueFor(handle); 311fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (rec == 0) { 312fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian rec = new SensorRecord(connection); 313fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveSensors.add(handle, rec); 314fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = mSensorDevice->activate(mSensorDevice, handle, 1); 315fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGE_IF(err, "Error activating sensor %d (%s)", handle, strerror(-err)); 316451beee076cac09f817abae78a990dea108a9482Mathias Agopian if (err == 0) { 317451beee076cac09f817abae78a990dea108a9482Mathias Agopian BatteryService::getInstance().enableSensor(handle); 318451beee076cac09f817abae78a990dea108a9482Mathias Agopian } 319fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } else { 3203560fb24b668675627934356f210d84d19bf4e56Mathias Agopian if (rec->addConnection(connection)) { 3213560fb24b668675627934356f210d84d19bf4e56Mathias Agopian // this sensor is already activated, but we are adding a 3223560fb24b668675627934356f210d84d19bf4e56Mathias Agopian // connection that uses it. Immediately send down the last 3233560fb24b668675627934356f210d84d19bf4e56Mathias Agopian // known value of the requested sensor. 3243560fb24b668675627934356f210d84d19bf4e56Mathias Agopian sensors_event_t scratch; 3253560fb24b668675627934356f210d84d19bf4e56Mathias Agopian sensors_event_t& event(mLastEventSeen.editValueFor(handle)); 3263560fb24b668675627934356f210d84d19bf4e56Mathias Agopian if (event.version == sizeof(sensors_event_t)) { 3273560fb24b668675627934356f210d84d19bf4e56Mathias Agopian connection->sendEvents(&event, 1); 3283560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } 3293560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } 330fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 331fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (err == NO_ERROR) { 332fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // connection now active 3337c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (connection->addSensor(handle)) { 3347c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian // the sensor was added (which means it wasn't already there) 3357c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian // so, see if this connection becomes active 3367c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (mActiveConnections.indexOf(connection) < 0) { 3377c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian mActiveConnections.add(connection); 3387c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 3397c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian // this could change the sensor event delivery speed 3407c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian recomputeEventsPeriodLocked(handle); 341fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 342fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 343fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return err; 344fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 345fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 346fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::disable(const sp<SensorEventConnection>& connection, 347fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle) 348fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 34950df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mInitCheck != NO_ERROR) 35050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian return mInitCheck; 35150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 352fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian status_t err = NO_ERROR; 353fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 354fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian SensorRecord* rec = mActiveSensors.valueFor(handle); 355fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (rec) { 356fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // see if this connection becomes inactive 357fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian connection->removeSensor(handle); 358fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (connection->hasAnySensor() == false) { 359fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveConnections.remove(connection); 360fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 361fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // see if this sensor becomes inactive 362fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (rec->removeConnection(connection)) { 363fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveSensors.removeItem(handle); 364fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian delete rec; 365fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = mSensorDevice->activate(mSensorDevice, handle, 0); 366451beee076cac09f817abae78a990dea108a9482Mathias Agopian if (err == 0) { 367451beee076cac09f817abae78a990dea108a9482Mathias Agopian BatteryService::getInstance().disableSensor(handle); 368451beee076cac09f817abae78a990dea108a9482Mathias Agopian } 369fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 370fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 3717c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (err == NO_ERROR) { 3727c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian recomputeEventsPeriodLocked(handle); 3737c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 374fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return err; 375fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 376fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 3777c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianstatus_t SensorService::setEventRate(const sp<SensorEventConnection>& connection, 378fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle, nsecs_t ns) 379fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 38050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mInitCheck != NO_ERROR) 38150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian return mInitCheck; 38250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 3831cd700015318727d6d42236ab6274f1949fb08baMathias Agopian if (ns < 0) 3841cd700015318727d6d42236ab6274f1949fb08baMathias Agopian return BAD_VALUE; 3851cd700015318727d6d42236ab6274f1949fb08baMathias Agopian 3867c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (ns < MINIMUM_EVENTS_PERIOD) 3877c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian ns = MINIMUM_EVENTS_PERIOD; 3881cd700015318727d6d42236ab6274f1949fb08baMathias Agopian 389fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 3907c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian status_t err = connection->setEventRateLocked(handle, ns); 3917c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (err == NO_ERROR) { 3927c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian recomputeEventsPeriodLocked(handle); 3937c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 3947c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return err; 3957c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian} 396fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 3977c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianstatus_t SensorService::recomputeEventsPeriodLocked(int32_t handle) 3987c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian{ 3997c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian status_t err = NO_ERROR; 4007c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian nsecs_t wanted = ms2ns(1000); 4017c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian size_t count = mActiveConnections.size(); 4027c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian for (size_t i=0 ; i<count ; i++) { 4037c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian sp<SensorEventConnection> connection(mActiveConnections[i].promote()); 4047c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (connection != NULL) { 4057c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian nsecs_t ns = connection->getEventRateForSensor(handle); 4067c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (ns) { 4077c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian wanted = wanted < ns ? wanted : ns; 4087c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 4097c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 4107c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 4117c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian err = mSensorDevice->setDelay(mSensorDevice, handle, wanted); 412fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return err; 413fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 414fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 415fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 416fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 417fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorRecord::SensorRecord( 418fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const sp<SensorEventConnection>& connection) 419fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 420fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.add(connection); 421fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 422fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 4237c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorRecord::addConnection( 424fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const sp<SensorEventConnection>& connection) 425fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 426fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (mConnections.indexOf(connection) < 0) { 427fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.add(connection); 4287c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return true; 429fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 4307c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return false; 431fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 432fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 433fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorRecord::removeConnection( 434fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const wp<SensorEventConnection>& connection) 435fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 436fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian ssize_t index = mConnections.indexOf(connection); 437fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (index >= 0) { 438fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.removeItemsAt(index, 1); 439fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 440fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mConnections.size() ? false : true; 441fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 442fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 443fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 444fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 445fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorEventConnection::SensorEventConnection( 446fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const sp<SensorService>& service) 447fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian : mService(service), mChannel(new SensorChannel()) 448fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 449fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 450fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 451fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorEventConnection::~SensorEventConnection() 452fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 453fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mService->cleanupConnection(this); 454fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 455fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 456fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::SensorEventConnection::onFirstRef() 457fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 458fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 459fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 4607c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorEventConnection::addSensor(int32_t handle) { 4617c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (mSensorInfo.indexOfKey(handle) <= 0) { 4627c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian SensorInfo info; 4637c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian mSensorInfo.add(handle, info); 4647c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return true; 465fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 4667c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return false; 467fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 468fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 4697c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorEventConnection::removeSensor(int32_t handle) { 4707c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (mSensorInfo.removeItem(handle) >= 0) { 4717c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return true; 4727c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 4737c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return false; 474fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 475fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 476fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorEventConnection::hasSensor(int32_t handle) const { 4777c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return mSensorInfo.indexOfKey(handle) >= 0; 478fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 479fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 480fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorEventConnection::hasAnySensor() const { 4817c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return mSensorInfo.size() ? true : false; 4827c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian} 4837c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian 4847c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianstatus_t SensorService::SensorEventConnection::setEventRateLocked( 4857c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian int handle, nsecs_t ns) 4867c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian{ 4877c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian ssize_t index = mSensorInfo.indexOfKey(handle); 4887c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (index >= 0) { 4897c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian SensorInfo& info = mSensorInfo.editValueFor(handle); 4907c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian info.ns = ns; 4917c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return NO_ERROR; 4927c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 4937c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return status_t(index); 494fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 495fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 496fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::sendEvents( 497cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian sensors_event_t const* buffer, size_t numEvents, 498cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian sensors_event_t* scratch) 499fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 500cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian // filter out events not for this connection 5013560fb24b668675627934356f210d84d19bf4e56Mathias Agopian size_t count = 0; 5023560fb24b668675627934356f210d84d19bf4e56Mathias Agopian if (scratch) { 5033560fb24b668675627934356f210d84d19bf4e56Mathias Agopian size_t i=0; 5043560fb24b668675627934356f210d84d19bf4e56Mathias Agopian while (i<numEvents) { 5053560fb24b668675627934356f210d84d19bf4e56Mathias Agopian const int32_t curr = buffer[i].sensor; 5063560fb24b668675627934356f210d84d19bf4e56Mathias Agopian if (mSensorInfo.indexOfKey(curr) >= 0) { 5073560fb24b668675627934356f210d84d19bf4e56Mathias Agopian do { 5083560fb24b668675627934356f210d84d19bf4e56Mathias Agopian scratch[count++] = buffer[i++]; 5093560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } while ((i<numEvents) && (buffer[i].sensor == curr)); 5103560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } else { 5113560fb24b668675627934356f210d84d19bf4e56Mathias Agopian i++; 5123560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } 513cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian } 5143560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } else { 5153560fb24b668675627934356f210d84d19bf4e56Mathias Agopian scratch = const_cast<sensors_event_t *>(buffer); 5163560fb24b668675627934356f210d84d19bf4e56Mathias Agopian count = numEvents; 517cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian } 518fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 5193560fb24b668675627934356f210d84d19bf4e56Mathias Agopian if (count == 0) 5203560fb24b668675627934356f210d84d19bf4e56Mathias Agopian return 0; 5213560fb24b668675627934356f210d84d19bf4e56Mathias Agopian 522cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian ssize_t size = mChannel->write(scratch, count*sizeof(sensors_event_t)); 523fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (size == -EAGAIN) { 524fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // the destination doesn't accept events anymore, it's probably 525fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // full. For now, we just drop the events on the floor. 526fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGW("dropping %d events on the floor", count); 527fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return size; 528fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 529fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 530fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGE_IF(size<0, "dropping %d events on the floor (%s)", 531fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian count, strerror(-size)); 532fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 5331e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown return size < 0 ? status_t(size) : status_t(NO_ERROR); 534fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 535fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 536fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiansp<SensorChannel> SensorService::SensorEventConnection::getSensorChannel() const 537fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 538fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mChannel; 539fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 540fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 541fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::enableDisable( 542fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle, bool enabled) 543fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 544fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian status_t err; 545fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (enabled) { 546fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = mService->enable(this, handle); 547fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } else { 548fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = mService->disable(this, handle); 549fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 550fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return err; 551fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 552fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 553fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::setEventRate( 554fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle, nsecs_t ns) 555fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 5567c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return mService->setEventRate(this, handle, ns); 557fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 558fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 559fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 560fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}; // namespace android 561fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 562