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