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