SensorService.cpp revision 7c1c531872a95051cb11ec829e3daf890d9bb58a
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 * - filter events per connection 44fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * - make sure to keep the last value of each event type so we can quickly 45fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * send something to application when they enable a sensor that is already 46fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * active (the issue here is that it can take time before a value is 47fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * produced by the h/w if the rate is low or if it's a one-shot sensor). 48451beee076cac09f817abae78a990dea108a9482Mathias Agopian * - send sensor info to battery service 49fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian */ 50fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 51451beee076cac09f817abae78a990dea108a9482Mathias Agopian// --------------------------------------------------------------------------- 52451beee076cac09f817abae78a990dea108a9482Mathias Agopian 53451beee076cac09f817abae78a990dea108a9482Mathias Agopianclass BatteryService : public Singleton<BatteryService> { 54451beee076cac09f817abae78a990dea108a9482Mathias Agopian friend class Singleton<BatteryService>; 55451beee076cac09f817abae78a990dea108a9482Mathias Agopian sp<IBinder> mBatteryStatService; 56451beee076cac09f817abae78a990dea108a9482Mathias Agopian BatteryService() { 57451beee076cac09f817abae78a990dea108a9482Mathias Agopian const String16 name("batteryinfo"); 58451beee076cac09f817abae78a990dea108a9482Mathias Agopian //getService(name, &mBatteryStatService); 59451beee076cac09f817abae78a990dea108a9482Mathias Agopian } 60451beee076cac09f817abae78a990dea108a9482Mathias Agopianpublic: 61451beee076cac09f817abae78a990dea108a9482Mathias Agopian void enableSensor(int handle) { 62451beee076cac09f817abae78a990dea108a9482Mathias Agopian if (mBatteryStatService != 0) { 63451beee076cac09f817abae78a990dea108a9482Mathias Agopian int uid = IPCThreadState::self()->getCallingUid(); 64451beee076cac09f817abae78a990dea108a9482Mathias Agopian //mBatteryStatService->noteStartSensor(uid, handle); 65451beee076cac09f817abae78a990dea108a9482Mathias Agopian } 66451beee076cac09f817abae78a990dea108a9482Mathias Agopian } 67451beee076cac09f817abae78a990dea108a9482Mathias Agopian void disableSensor(int handle) { 68451beee076cac09f817abae78a990dea108a9482Mathias Agopian if (mBatteryStatService != 0) { 69451beee076cac09f817abae78a990dea108a9482Mathias Agopian int uid = IPCThreadState::self()->getCallingUid(); 70451beee076cac09f817abae78a990dea108a9482Mathias Agopian //mBatteryStatService->noteStopSensor(uid, handle); 71451beee076cac09f817abae78a990dea108a9482Mathias Agopian } 72451beee076cac09f817abae78a990dea108a9482Mathias Agopian } 73451beee076cac09f817abae78a990dea108a9482Mathias Agopian}; 74451beee076cac09f817abae78a990dea108a9482Mathias Agopian 75451beee076cac09f817abae78a990dea108a9482Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(BatteryService) 76451beee076cac09f817abae78a990dea108a9482Mathias Agopian 77451beee076cac09f817abae78a990dea108a9482Mathias Agopian// --------------------------------------------------------------------------- 78451beee076cac09f817abae78a990dea108a9482Mathias Agopian 791cd700015318727d6d42236ab6274f1949fb08baMathias Agopian// 100 events/s max 801cd700015318727d6d42236ab6274f1949fb08baMathias Agopianstatic const nsecs_t MINIMUM_EVENT_PERIOD = ms2ns(10); 811cd700015318727d6d42236ab6274f1949fb08baMathias Agopian 82fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorService() 83fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian : Thread(false), 8450df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian mSensorDevice(0), 8550df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian mSensorModule(0), 8650df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian mDump("android.permission.DUMP"), 8750df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian mInitCheck(NO_INIT) 88fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 89fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 90fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 91fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::onFirstRef() 92fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 9350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian LOGD("nuSensorService starting..."); 9450df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 95fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID, 96fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian (hw_module_t const**)&mSensorModule); 97fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 98fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGE_IF(err, "couldn't load %s module (%s)", 99fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian SENSORS_HARDWARE_MODULE_ID, strerror(-err)); 100fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 10150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mSensorModule) { 10250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian err = sensors_open(&mSensorModule->common, &mSensorDevice); 103fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 10450df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian LOGE_IF(err, "couldn't open device for module %s (%s)", 10550df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian SENSORS_HARDWARE_MODULE_ID, strerror(-err)); 106fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 10750df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian struct sensor_t const* list; 10850df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian int count = mSensorModule->get_sensors_list(mSensorModule, &list); 10950df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian for (int i=0 ; i<count ; i++) { 11050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian Sensor sensor(list + i); 11150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian LOGI("%s", sensor.getName().string()); 11250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian mSensorList.add(sensor); 11350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mSensorDevice) { 11450df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian mSensorDevice->activate(mSensorDevice, sensor.getHandle(), 0); 11550df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian } 11650df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian } 117fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 11850df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mSensorDevice) { 11950df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian run("SensorService", PRIORITY_URGENT_DISPLAY); 12050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian mInitCheck = NO_ERROR; 12150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian } 122fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 123fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 124fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 125fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::~SensorService() 126fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 127fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 128fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 129fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::dump(int fd, const Vector<String16>& args) 130fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 131fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const size_t SIZE = 1024; 132fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian char buffer[SIZE]; 133fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian String8 result; 134fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (!mDump.checkCalling()) { 135fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian snprintf(buffer, SIZE, "Permission Denial: " 136fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian "can't dump SurfaceFlinger from pid=%d, uid=%d\n", 137fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian IPCThreadState::self()->getCallingPid(), 138fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian IPCThreadState::self()->getCallingUid()); 139fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian result.append(buffer); 140fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } else { 141fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 1427c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian snprintf(buffer, SIZE, "%d active connections\n", 1437c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian mActiveConnections.size()); 144fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian result.append(buffer); 145fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian snprintf(buffer, SIZE, "Active sensors:\n"); 146fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian result.append(buffer); 147fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian for (size_t i=0 ; i<mActiveSensors.size() ; i++) { 1485d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian int handle = mActiveSensors.keyAt(i); 1495d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian snprintf(buffer, SIZE, "%s (handle=%d, connections=%d)\n", 1505d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian getSensorName(handle).string(), 1515d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian handle, 152fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveSensors.valueAt(i)->getNumConnections()); 153fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian result.append(buffer); 154fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 155fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 156fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian write(fd, result.string(), result.size()); 157fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return NO_ERROR; 158fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 159fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 160fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::threadLoop() 161fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 162fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGD("nuSensorService thread starting..."); 163fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 164fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian sensors_event_t buffer[16]; 165fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian struct sensors_poll_device_t* device = mSensorDevice; 166fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian ssize_t count; 167fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 168fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian do { 169fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian count = device->poll(device, buffer, sizeof(buffer)/sizeof(*buffer)); 170fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (count<0) { 171fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGE("sensor poll failed (%s)", strerror(-count)); 172fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian break; 173fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 174fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 175fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const SortedVector< wp<SensorEventConnection> > activeConnections( 176fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian getActiveConnections()); 177fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 178fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian size_t numConnections = activeConnections.size(); 179fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (numConnections) { 180fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian for (size_t i=0 ; i<numConnections ; i++) { 181fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian sp<SensorEventConnection> connection(activeConnections[i].promote()); 182fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (connection != 0) { 183fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian connection->sendEvents(buffer, count); 184fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 185fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 186fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 187fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 188fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } while (count >= 0 || Thread::exitPending()); 189fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 190fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGW("Exiting SensorService::threadLoop!"); 191fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return false; 192fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 193fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 194fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSortedVector< wp<SensorService::SensorEventConnection> > 195fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::getActiveConnections() const 196fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 197fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 198fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mActiveConnections; 199fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 200fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 2015d2707214dfb97bd8dfcc6620be36841d3c82420Mathias AgopianString8 SensorService::getSensorName(int handle) const { 2025d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian size_t count = mSensorList.size(); 2035d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian for (size_t i=0 ; i<count ; i++) { 2045d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian const Sensor& sensor(mSensorList[i]); 2055d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian if (sensor.getHandle() == handle) { 2065d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian return sensor.getName(); 2075d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian } 2085d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian } 2095d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian String8 result("unknown"); 2105d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian return result; 2115d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian} 2125d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian 213fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianVector<Sensor> SensorService::getSensorList() 214fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 215fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mSensorList; 216fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 217fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 218fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiansp<ISensorEventConnection> SensorService::createSensorEventConnection() 219fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 220fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian sp<SensorEventConnection> result(new SensorEventConnection(this)); 221fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return result; 222fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 223fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 224fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::cleanupConnection(const wp<SensorEventConnection>& connection) 225fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 226fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 2277c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian size_t size = mActiveSensors.size(); 2287c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian for (size_t i=0 ; i<size ; ) { 2297c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian SensorRecord* rec = mActiveSensors.valueAt(i); 2307c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (rec && rec->removeConnection(connection)) { 2317c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian mSensorDevice->activate(mSensorDevice, mActiveSensors.keyAt(i), 0); 2327c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian mActiveSensors.removeItemsAt(i, 1); 2337c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian delete rec; 2347c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian size--; 2357c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } else { 2367c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian i++; 237fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 238fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 2397c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian mActiveConnections.remove(connection); 240fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 241fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 242fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::enable(const sp<SensorEventConnection>& connection, 243fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle) 244fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 24550df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mInitCheck != NO_ERROR) 24650df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian return mInitCheck; 24750df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 248fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian status_t err = NO_ERROR; 249fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 250fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian SensorRecord* rec = mActiveSensors.valueFor(handle); 251fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (rec == 0) { 252fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian rec = new SensorRecord(connection); 253fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveSensors.add(handle, rec); 254fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = mSensorDevice->activate(mSensorDevice, handle, 1); 255fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGE_IF(err, "Error activating sensor %d (%s)", handle, strerror(-err)); 256451beee076cac09f817abae78a990dea108a9482Mathias Agopian if (err == 0) { 257451beee076cac09f817abae78a990dea108a9482Mathias Agopian BatteryService::getInstance().enableSensor(handle); 258451beee076cac09f817abae78a990dea108a9482Mathias Agopian } 259fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } else { 2607c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian rec->addConnection(connection); 261fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 262fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (err == NO_ERROR) { 263fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // connection now active 2647c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (connection->addSensor(handle)) { 2657c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian // the sensor was added (which means it wasn't already there) 2667c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian // so, see if this connection becomes active 2677c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (mActiveConnections.indexOf(connection) < 0) { 2687c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian mActiveConnections.add(connection); 2697c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 2707c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian // this could change the sensor event delivery speed 2717c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian recomputeEventsPeriodLocked(handle); 272fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 273fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 274fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return err; 275fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 276fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 277fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::disable(const sp<SensorEventConnection>& connection, 278fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle) 279fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 28050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mInitCheck != NO_ERROR) 28150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian return mInitCheck; 28250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 283fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian status_t err = NO_ERROR; 284fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 285fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian SensorRecord* rec = mActiveSensors.valueFor(handle); 286fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (rec) { 287fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // see if this connection becomes inactive 288fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian connection->removeSensor(handle); 289fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (connection->hasAnySensor() == false) { 290fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveConnections.remove(connection); 291fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 292fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // see if this sensor becomes inactive 293fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (rec->removeConnection(connection)) { 294fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveSensors.removeItem(handle); 295fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian delete rec; 296fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = mSensorDevice->activate(mSensorDevice, handle, 0); 297451beee076cac09f817abae78a990dea108a9482Mathias Agopian if (err == 0) { 298451beee076cac09f817abae78a990dea108a9482Mathias Agopian BatteryService::getInstance().disableSensor(handle); 299451beee076cac09f817abae78a990dea108a9482Mathias Agopian } 300fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 301fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 3027c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (err == NO_ERROR) { 3037c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian recomputeEventsPeriodLocked(handle); 3047c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 305fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return err; 306fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 307fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 3087c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianstatus_t SensorService::setEventRate(const sp<SensorEventConnection>& connection, 309fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle, nsecs_t ns) 310fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 31150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mInitCheck != NO_ERROR) 31250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian return mInitCheck; 31350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 3141cd700015318727d6d42236ab6274f1949fb08baMathias Agopian if (ns < 0) 3151cd700015318727d6d42236ab6274f1949fb08baMathias Agopian return BAD_VALUE; 3161cd700015318727d6d42236ab6274f1949fb08baMathias Agopian 3177c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (ns < MINIMUM_EVENTS_PERIOD) 3187c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian ns = MINIMUM_EVENTS_PERIOD; 3191cd700015318727d6d42236ab6274f1949fb08baMathias Agopian 320fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 3217c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian status_t err = connection->setEventRateLocked(handle, ns); 3227c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (err == NO_ERROR) { 3237c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian recomputeEventsPeriodLocked(handle); 3247c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 3257c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return err; 3267c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian} 327fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 3287c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianstatus_t SensorService::recomputeEventsPeriodLocked(int32_t handle) 3297c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian{ 3307c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian status_t err = NO_ERROR; 3317c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian nsecs_t wanted = ms2ns(1000); 3327c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian size_t count = mActiveConnections.size(); 3337c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian for (size_t i=0 ; i<count ; i++) { 3347c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian sp<SensorEventConnection> connection(mActiveConnections[i].promote()); 3357c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (connection != NULL) { 3367c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian nsecs_t ns = connection->getEventRateForSensor(handle); 3377c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (ns) { 3387c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian wanted = wanted < ns ? wanted : ns; 3397c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 3407c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 3417c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 3427c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian err = mSensorDevice->setDelay(mSensorDevice, handle, wanted); 343fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return err; 344fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 345fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 346fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 347fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 348fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorRecord::SensorRecord( 349fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const sp<SensorEventConnection>& connection) 350fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 351fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.add(connection); 352fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 353fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 3547c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorRecord::addConnection( 355fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const sp<SensorEventConnection>& connection) 356fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 357fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (mConnections.indexOf(connection) < 0) { 358fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.add(connection); 3597c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return true; 360fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 3617c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return false; 362fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 363fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 364fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorRecord::removeConnection( 365fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const wp<SensorEventConnection>& connection) 366fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 367fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian ssize_t index = mConnections.indexOf(connection); 368fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (index >= 0) { 369fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.removeItemsAt(index, 1); 370fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 371fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mConnections.size() ? false : true; 372fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 373fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 374fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 375fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 376fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorEventConnection::SensorEventConnection( 377fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const sp<SensorService>& service) 378fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian : mService(service), mChannel(new SensorChannel()) 379fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 380fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 381fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 382fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorEventConnection::~SensorEventConnection() 383fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 384fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mService->cleanupConnection(this); 385fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 386fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 387fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::SensorEventConnection::onFirstRef() 388fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 389fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 390fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 3917c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorEventConnection::addSensor(int32_t handle) { 3927c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (mSensorInfo.indexOfKey(handle) <= 0) { 3937c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian SensorInfo info; 3947c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian mSensorInfo.add(handle, info); 3957c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return true; 396fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 3977c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return false; 398fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 399fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 4007c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorEventConnection::removeSensor(int32_t handle) { 4017c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (mSensorInfo.removeItem(handle) >= 0) { 4027c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return true; 4037c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 4047c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return false; 405fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 406fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 407fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorEventConnection::hasSensor(int32_t handle) const { 4087c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return mSensorInfo.indexOfKey(handle) >= 0; 409fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 410fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 411fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorEventConnection::hasAnySensor() const { 4127c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return mSensorInfo.size() ? true : false; 4137c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian} 4147c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian 4157c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianstatus_t SensorService::SensorEventConnection::setEventRateLocked( 4167c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian int handle, nsecs_t ns) 4177c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian{ 4187c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian ssize_t index = mSensorInfo.indexOfKey(handle); 4197c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (index >= 0) { 4207c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian SensorInfo& info = mSensorInfo.editValueFor(handle); 4217c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian info.ns = ns; 4227c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return NO_ERROR; 4237c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 4247c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return status_t(index); 425fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 426fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 427fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::sendEvents( 428fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian sensors_event_t const* buffer, size_t count) 429fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 430fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // TODO: we should only send the events for the sensors this connection 431fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // is registered for. 432fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 433fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian ssize_t size = mChannel->write(buffer, count*sizeof(sensors_event_t)); 434fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (size == -EAGAIN) { 435fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // the destination doesn't accept events anymore, it's probably 436fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // full. For now, we just drop the events on the floor. 437fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGW("dropping %d events on the floor", count); 438fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return size; 439fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 440fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 441fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian LOGE_IF(size<0, "dropping %d events on the floor (%s)", 442fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian count, strerror(-size)); 443fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 444fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return size < 0 ? size : NO_ERROR; 445fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 446fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 447fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiansp<SensorChannel> SensorService::SensorEventConnection::getSensorChannel() const 448fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 449fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mChannel; 450fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 451fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 452fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::enableDisable( 453fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle, bool enabled) 454fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 455fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian status_t err; 456fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (enabled) { 457fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = mService->enable(this, handle); 458fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } else { 459fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = mService->disable(this, handle); 460fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 461fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return err; 462fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 463fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 464fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::setEventRate( 465fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle, nsecs_t ns) 466fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 4677c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return mService->setEventRate(this, handle, ns); 468fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 469fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 470fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 471fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}; // namespace android 472fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 473