SensorService.cpp revision 50df2959e58fc7408f98d11d77c8428397dca445
1fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian/* 2fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * Copyright (C) 2010 The Android Open Source Project 3fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * 4fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 5fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * you may not use this file except in compliance with the License. 6fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * You may obtain a copy of the License at 7fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * 8fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 9fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * 10fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * Unless required by applicable law or agreed to in writing, software 11fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 12fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * See the License for the specific language governing permissions and 14fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * limitations under the License. 15fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian */ 16fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 17fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <stdint.h> 18fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <sys/types.h> 19fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 20fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/SortedVector.h> 21fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/KeyedVector.h> 22fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/threads.h> 23fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/Atomic.h> 24fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/Errors.h> 25fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/RefBase.h> 26451beee076cac09f817abae78a990dea108a9482Mathias Agopian#include <utils/Singleton.h> 27fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 28fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <binder/BinderService.h> 29451beee076cac09f817abae78a990dea108a9482Mathias Agopian#include <binder/IServiceManager.h> 30fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 31fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <gui/ISensorServer.h> 32fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <gui/ISensorEventConnection.h> 33fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 34fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <hardware/sensors.h> 35fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 36fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include "SensorService.h" 37fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 38fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiannamespace android { 39fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 40fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 41fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian/* 42fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * TODO: 43fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * - handle per-connection event rate 44fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * - filter events per connection 45fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * - make sure to keep the last value of each event type so we can quickly 46fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * send something to application when they enable a sensor that is already 47fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * active (the issue here is that it can take time before a value is 48fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * produced by the h/w if the rate is low or if it's a one-shot sensor). 49451beee076cac09f817abae78a990dea108a9482Mathias Agopian * - send sensor info to battery service 50fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian */ 51fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 52451beee076cac09f817abae78a990dea108a9482Mathias Agopian// --------------------------------------------------------------------------- 53451beee076cac09f817abae78a990dea108a9482Mathias Agopian 54451beee076cac09f817abae78a990dea108a9482Mathias Agopianclass BatteryService : public Singleton<BatteryService> { 55451beee076cac09f817abae78a990dea108a9482Mathias Agopian friend class Singleton<BatteryService>; 56451beee076cac09f817abae78a990dea108a9482Mathias Agopian sp<IBinder> mBatteryStatService; 57451beee076cac09f817abae78a990dea108a9482Mathias Agopian BatteryService() { 58451beee076cac09f817abae78a990dea108a9482Mathias Agopian const String16 name("batteryinfo"); 59451beee076cac09f817abae78a990dea108a9482Mathias Agopian //getService(name, &mBatteryStatService); 60451beee076cac09f817abae78a990dea108a9482Mathias Agopian } 61451beee076cac09f817abae78a990dea108a9482Mathias Agopianpublic: 62451beee076cac09f817abae78a990dea108a9482Mathias Agopian void enableSensor(int handle) { 63451beee076cac09f817abae78a990dea108a9482Mathias Agopian if (mBatteryStatService != 0) { 64451beee076cac09f817abae78a990dea108a9482Mathias Agopian int uid = IPCThreadState::self()->getCallingUid(); 65451beee076cac09f817abae78a990dea108a9482Mathias Agopian //mBatteryStatService->noteStartSensor(uid, handle); 66451beee076cac09f817abae78a990dea108a9482Mathias Agopian } 67451beee076cac09f817abae78a990dea108a9482Mathias Agopian } 68451beee076cac09f817abae78a990dea108a9482Mathias Agopian void disableSensor(int handle) { 69451beee076cac09f817abae78a990dea108a9482Mathias Agopian if (mBatteryStatService != 0) { 70451beee076cac09f817abae78a990dea108a9482Mathias Agopian int uid = IPCThreadState::self()->getCallingUid(); 71451beee076cac09f817abae78a990dea108a9482Mathias Agopian //mBatteryStatService->noteStopSensor(uid, handle); 72451beee076cac09f817abae78a990dea108a9482Mathias Agopian } 73451beee076cac09f817abae78a990dea108a9482Mathias Agopian } 74451beee076cac09f817abae78a990dea108a9482Mathias Agopian}; 75451beee076cac09f817abae78a990dea108a9482Mathias Agopian 76451beee076cac09f817abae78a990dea108a9482Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(BatteryService) 77451beee076cac09f817abae78a990dea108a9482Mathias Agopian 78451beee076cac09f817abae78a990dea108a9482Mathias Agopian// --------------------------------------------------------------------------- 79451beee076cac09f817abae78a990dea108a9482Mathias Agopian 80fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorService() 81fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian : Thread(false), 8250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian mSensorDevice(0), 8350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian mSensorModule(0), 8450df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian mDump("android.permission.DUMP"), 8550df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian mInitCheck(NO_INIT) 86fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 87fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 88fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 89fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::onFirstRef() 90fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 9150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian LOGD("nuSensorService starting..."); 9250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 93fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID, 94fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian (hw_module_t const**)&mSensorModule); 95fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 96fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGE_IF(err, "couldn't load %s module (%s)", 97fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian SENSORS_HARDWARE_MODULE_ID, strerror(-err)); 98fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 9950df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mSensorModule) { 10050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian err = sensors_open(&mSensorModule->common, &mSensorDevice); 101fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 10250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian LOGE_IF(err, "couldn't open device for module %s (%s)", 10350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian SENSORS_HARDWARE_MODULE_ID, strerror(-err)); 104fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 10550df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian struct sensor_t const* list; 10650df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian int count = mSensorModule->get_sensors_list(mSensorModule, &list); 10750df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian for (int i=0 ; i<count ; i++) { 10850df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian Sensor sensor(list + i); 10950df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian LOGI("%s", sensor.getName().string()); 11050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian mSensorList.add(sensor); 11150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mSensorDevice) { 11250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian mSensorDevice->activate(mSensorDevice, sensor.getHandle(), 0); 11350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian } 11450df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian } 115fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 11650df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mSensorDevice) { 11750df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian run("SensorService", PRIORITY_URGENT_DISPLAY); 11850df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian mInitCheck = NO_ERROR; 11950df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian } 120fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 121fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 122fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 123fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::~SensorService() 124fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 125fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 126fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 127fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::dump(int fd, const Vector<String16>& args) 128fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 129fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const size_t SIZE = 1024; 130fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian char buffer[SIZE]; 131fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian String8 result; 132fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (!mDump.checkCalling()) { 133fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian snprintf(buffer, SIZE, "Permission Denial: " 134fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian "can't dump SurfaceFlinger from pid=%d, uid=%d\n", 135fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian IPCThreadState::self()->getCallingPid(), 136fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian IPCThreadState::self()->getCallingUid()); 137fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian result.append(buffer); 138fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } else { 139fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 140fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian snprintf(buffer, SIZE, "%d connections / %d active\n", 141fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.size(), mActiveConnections.size()); 142fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian result.append(buffer); 143fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian snprintf(buffer, SIZE, "Active sensors:\n"); 144fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian result.append(buffer); 145fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian for (size_t i=0 ; i<mActiveSensors.size() ; i++) { 1465d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian int handle = mActiveSensors.keyAt(i); 1475d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian snprintf(buffer, SIZE, "%s (handle=%d, connections=%d)\n", 1485d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian getSensorName(handle).string(), 1495d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian handle, 150fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveSensors.valueAt(i)->getNumConnections()); 151fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian result.append(buffer); 152fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 153fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 154fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian write(fd, result.string(), result.size()); 155fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return NO_ERROR; 156fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 157fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 158fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::threadLoop() 159fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 160fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGD("nuSensorService thread starting..."); 161fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 162fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian sensors_event_t buffer[16]; 163fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian struct sensors_poll_device_t* device = mSensorDevice; 164fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian ssize_t count; 165fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 166fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian do { 167fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian count = device->poll(device, buffer, sizeof(buffer)/sizeof(*buffer)); 168fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (count<0) { 169fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGE("sensor poll failed (%s)", strerror(-count)); 170fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian break; 171fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 172fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 173fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const SortedVector< wp<SensorEventConnection> > activeConnections( 174fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian getActiveConnections()); 175fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 176fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian size_t numConnections = activeConnections.size(); 177fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (numConnections) { 178fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian for (size_t i=0 ; i<numConnections ; i++) { 179fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian sp<SensorEventConnection> connection(activeConnections[i].promote()); 180fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (connection != 0) { 181fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian connection->sendEvents(buffer, count); 182fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 183fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 184fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 185fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 186fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } while (count >= 0 || Thread::exitPending()); 187fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 188fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGW("Exiting SensorService::threadLoop!"); 189fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return false; 190fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 191fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 192fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSortedVector< wp<SensorService::SensorEventConnection> > 193fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::getActiveConnections() const 194fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 195fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 196fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mActiveConnections; 197fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 198fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 1995d2707214dfb97bd8dfcc6620be36841d3c82420Mathias AgopianString8 SensorService::getSensorName(int handle) const { 2005d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian size_t count = mSensorList.size(); 2015d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian for (size_t i=0 ; i<count ; i++) { 2025d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian const Sensor& sensor(mSensorList[i]); 2035d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian if (sensor.getHandle() == handle) { 2045d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian return sensor.getName(); 2055d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian } 2065d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian } 2075d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian String8 result("unknown"); 2085d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian return result; 2095d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian} 2105d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian 211fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianVector<Sensor> SensorService::getSensorList() 212fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 213fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mSensorList; 214fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 215fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 216fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiansp<ISensorEventConnection> SensorService::createSensorEventConnection() 217fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 218fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian sp<SensorEventConnection> result(new SensorEventConnection(this)); 219fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 220fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.add(result); 221fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return result; 222fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 223fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 224fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::cleanupConnection(const wp<SensorEventConnection>& connection) 225fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 226fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 227fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian ssize_t index = mConnections.indexOf(connection); 228fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (index >= 0) { 229fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 230fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian size_t size = mActiveSensors.size(); 231fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian for (size_t i=0 ; i<size ; ) { 232fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian SensorRecord* rec = mActiveSensors.valueAt(i); 233fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (rec && rec->removeConnection(connection)) { 234fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mSensorDevice->activate(mSensorDevice, mActiveSensors.keyAt(i), 0); 235fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveSensors.removeItemsAt(i, 1); 236fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian delete rec; 237fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian size--; 238fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } else { 239fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian i++; 240fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 241fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 242fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 243fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveConnections.remove(connection); 244fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.removeItemsAt(index, 1); 245fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 246fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 247fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 248fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::enable(const sp<SensorEventConnection>& connection, 249fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle) 250fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 25150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mInitCheck != NO_ERROR) 25250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian return mInitCheck; 25350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 254fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian status_t err = NO_ERROR; 255fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 256fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian SensorRecord* rec = mActiveSensors.valueFor(handle); 257fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (rec == 0) { 258fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian rec = new SensorRecord(connection); 259fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveSensors.add(handle, rec); 260fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = mSensorDevice->activate(mSensorDevice, handle, 1); 261fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGE_IF(err, "Error activating sensor %d (%s)", handle, strerror(-err)); 262451beee076cac09f817abae78a990dea108a9482Mathias Agopian if (err == 0) { 263451beee076cac09f817abae78a990dea108a9482Mathias Agopian BatteryService::getInstance().enableSensor(handle); 264451beee076cac09f817abae78a990dea108a9482Mathias Agopian } 265fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } else { 266fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = rec->addConnection(connection); 267fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 268fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (err == NO_ERROR) { 269fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // connection now active 270fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian connection->addSensor(handle); 271fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (mActiveConnections.indexOf(connection) < 0) { 272fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveConnections.add(connection); 273fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 274fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 275fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return err; 276fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 277fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 278fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::disable(const sp<SensorEventConnection>& connection, 279fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle) 280fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 28150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mInitCheck != NO_ERROR) 28250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian return mInitCheck; 28350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 284fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian status_t err = NO_ERROR; 285fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 286fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian SensorRecord* rec = mActiveSensors.valueFor(handle); 287fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGW("sensor (handle=%d) is not enabled", handle); 288fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (rec) { 289fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // see if this connection becomes inactive 290fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian connection->removeSensor(handle); 291fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (connection->hasAnySensor() == false) { 292fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveConnections.remove(connection); 293fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 294fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // see if this sensor becomes inactive 295fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (rec->removeConnection(connection)) { 296fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveSensors.removeItem(handle); 297fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian delete rec; 298fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = mSensorDevice->activate(mSensorDevice, handle, 0); 299451beee076cac09f817abae78a990dea108a9482Mathias Agopian if (err == 0) { 300451beee076cac09f817abae78a990dea108a9482Mathias Agopian BatteryService::getInstance().disableSensor(handle); 301451beee076cac09f817abae78a990dea108a9482Mathias Agopian } 302fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 303fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 304fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return err; 305fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 306fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 307fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::setRate(const sp<SensorEventConnection>& connection, 308fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle, nsecs_t ns) 309fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 31050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mInitCheck != NO_ERROR) 31150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian return mInitCheck; 31250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 313fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian status_t err = NO_ERROR; 314fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 315fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 316fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = mSensorDevice->setDelay(mSensorDevice, handle, ns); 317fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 318fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // TODO: handle rate per connection 319fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return err; 320fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 321fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 322fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 323fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 324fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorRecord::SensorRecord( 325fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const sp<SensorEventConnection>& connection) 326fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 327fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.add(connection); 328fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 329fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 330fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorRecord::addConnection( 331fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const sp<SensorEventConnection>& connection) 332fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 333fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (mConnections.indexOf(connection) < 0) { 334fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.add(connection); 335fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 336fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return NO_ERROR; 337fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 338fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 339fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorRecord::removeConnection( 340fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const wp<SensorEventConnection>& connection) 341fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 342fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian ssize_t index = mConnections.indexOf(connection); 343fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (index >= 0) { 344fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.removeItemsAt(index, 1); 345fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 346fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mConnections.size() ? false : true; 347fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 348fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 349fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 350fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 351fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorEventConnection::SensorEventConnection( 352fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const sp<SensorService>& service) 353fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian : mService(service), mChannel(new SensorChannel()) 354fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 355fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 356fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 357fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorEventConnection::~SensorEventConnection() 358fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 359fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mService->cleanupConnection(this); 360fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 361fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 362fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::SensorEventConnection::onFirstRef() 363fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 364fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 365fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 366fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::SensorEventConnection::addSensor(int32_t handle) { 367fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (mSensorList.indexOf(handle) <= 0) { 368fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mSensorList.add(handle); 369fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 370fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 371fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 372fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::SensorEventConnection::removeSensor(int32_t handle) { 373fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mSensorList.remove(handle); 374fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 375fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 376fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorEventConnection::hasSensor(int32_t handle) const { 377fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mSensorList.indexOf(handle) >= 0; 378fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 379fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 380fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorEventConnection::hasAnySensor() const { 381fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mSensorList.size() ? true : false; 382fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 383fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 384fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::sendEvents( 385fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian sensors_event_t const* buffer, size_t count) 386fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 387fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // TODO: we should only send the events for the sensors this connection 388fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // is registered for. 389fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 390fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian ssize_t size = mChannel->write(buffer, count*sizeof(sensors_event_t)); 391fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (size == -EAGAIN) { 392fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // the destination doesn't accept events anymore, it's probably 393fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // full. For now, we just drop the events on the floor. 394fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGW("dropping %d events on the floor", count); 395fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return size; 396fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 397fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 398fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGE_IF(size<0, "dropping %d events on the floor (%s)", 399fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian count, strerror(-size)); 400fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 401fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return size < 0 ? size : NO_ERROR; 402fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 403fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 404fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiansp<SensorChannel> SensorService::SensorEventConnection::getSensorChannel() const 405fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 406fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mChannel; 407fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 408fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 409fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::enableDisable( 410fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle, bool enabled) 411fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 412fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian status_t err; 413fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (enabled) { 414fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = mService->enable(this, handle); 415fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } else { 416fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = mService->disable(this, handle); 417fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 418fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return err; 419fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 420fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 421fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::setEventRate( 422fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle, nsecs_t ns) 423fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 424fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mService->setRate(this, handle, ns); 425fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 426fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 427fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 428fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}; // namespace android 429fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 430