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> 18f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian#include <math.h> 19fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <sys/types.h> 20fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 213301542828febc768e1df42892cfac4992c35474Mathias Agopian#include <cutils/properties.h> 223301542828febc768e1df42892cfac4992c35474Mathias Agopian 23fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/SortedVector.h> 24fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/KeyedVector.h> 25fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/threads.h> 26fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/Atomic.h> 27fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/Errors.h> 28fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <utils/RefBase.h> 29451beee076cac09f817abae78a990dea108a9482Mathias Agopian#include <utils/Singleton.h> 30c4a930d1d5a432a1f302763ac55460d6e83fe7e0Mathias Agopian#include <utils/String16.h> 31fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 32fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <binder/BinderService.h> 33451beee076cac09f817abae78a990dea108a9482Mathias Agopian#include <binder/IServiceManager.h> 341cb13461a8cf62e3ba634e5965332f2d284f6d42Mathias Agopian#include <binder/PermissionCache.h> 35fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 36fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <gui/ISensorServer.h> 37fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <gui/ISensorEventConnection.h> 38907103bf186cfdd2ed9eb3b6c36de53ade7b16f6Mathias Agopian#include <gui/SensorEventQueue.h> 39fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 40fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <hardware/sensors.h> 41fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 42787ac1b388f144f5e6dd38f8b807866a5256dafcMathias Agopian#include "BatteryService.h" 43984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#include "CorrectedGyroSensor.h" 44f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian#include "GravitySensor.h" 45f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian#include "LinearAccelerationSensor.h" 46984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#include "OrientationSensor.h" 47f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian#include "RotationVectorSensor.h" 48984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#include "SensorFusion.h" 49984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#include "SensorService.h" 50fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 51fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiannamespace android { 52fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 53fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 543301542828febc768e1df42892cfac4992c35474Mathias Agopian/* 553301542828febc768e1df42892cfac4992c35474Mathias Agopian * Notes: 563301542828febc768e1df42892cfac4992c35474Mathias Agopian * 573301542828febc768e1df42892cfac4992c35474Mathias Agopian * - what about a gyro-corrected magnetic-field sensor? 583301542828febc768e1df42892cfac4992c35474Mathias Agopian * - run mag sensor from time to time to force calibration 593301542828febc768e1df42892cfac4992c35474Mathias Agopian * - gravity sensor length is wrong (=> drift in linear-acc sensor) 603301542828febc768e1df42892cfac4992c35474Mathias Agopian * 613301542828febc768e1df42892cfac4992c35474Mathias Agopian */ 623301542828febc768e1df42892cfac4992c35474Mathias Agopian 63fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorService() 641cb13461a8cf62e3ba634e5965332f2d284f6d42Mathias Agopian : mInitCheck(NO_INIT) 65fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 66fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 67fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 68fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::onFirstRef() 69fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 70a551237de142549fb8a6608ee9d2fbf4b7ca2ebfSteve Block ALOGD("nuSensorService starting..."); 7150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 72f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian SensorDevice& dev(SensorDevice::getInstance()); 73fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 74f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (dev.initCheck() == NO_ERROR) { 75f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian sensor_t const* list; 767b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian ssize_t count = dev.getSensorList(&list); 777b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian if (count > 0) { 787b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian ssize_t orientationIndex = -1; 797b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian bool hasGyro = false; 807b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian uint32_t virtualSensorsNeeds = 817b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian (1<<SENSOR_TYPE_GRAVITY) | 827b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian (1<<SENSOR_TYPE_LINEAR_ACCELERATION) | 837b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian (1<<SENSOR_TYPE_ROTATION_VECTOR); 847b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian 857b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian mLastEventSeen.setCapacity(count); 867b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian for (ssize_t i=0 ; i<count ; i++) { 877b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian registerSensor( new HardwareSensor(list[i]) ); 887b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian switch (list[i].type) { 897b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian case SENSOR_TYPE_ORIENTATION: 907b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian orientationIndex = i; 917b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian break; 927b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian case SENSOR_TYPE_GYROSCOPE: 937b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian hasGyro = true; 947b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian break; 957b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian case SENSOR_TYPE_GRAVITY: 967b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian case SENSOR_TYPE_LINEAR_ACCELERATION: 977b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian case SENSOR_TYPE_ROTATION_VECTOR: 987b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian virtualSensorsNeeds &= ~(1<<list[i].type); 997b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian break; 1007b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian } 10150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian } 102fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 1037b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // it's safe to instantiate the SensorFusion object here 1047b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // (it wants to be instantiated after h/w sensors have been 1057b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // registered) 1067b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian const SensorFusion& fusion(SensorFusion::getInstance()); 1077b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian 1087b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian if (hasGyro) { 1097b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // Always instantiate Android's virtual sensors. Since they are 1107b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // instantiated behind sensors from the HAL, they won't 1117b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // interfere with applications, unless they looks specifically 1127b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // for them (by name). 1137b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian 1147b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian registerVirtualSensor( new RotationVectorSensor() ); 1157b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian registerVirtualSensor( new GravitySensor(list, count) ); 1167b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian registerVirtualSensor( new LinearAccelerationSensor(list, count) ); 1177b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian 1187b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // these are optional 1197b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian registerVirtualSensor( new OrientationSensor() ); 1207b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian registerVirtualSensor( new CorrectedGyroSensor(list, count) ); 1213301542828febc768e1df42892cfac4992c35474Mathias Agopian } 122f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian 1237b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // build the sensor list returned to users 1247b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian mUserSensorList = mSensorList; 12533264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian 12633264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian if (hasGyro) { 12733264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian // virtual debugging sensors are not added to mUserSensorList 12833264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian registerVirtualSensor( new GyroDriftSensor() ); 12933264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian } 13033264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian 1317b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian if (hasGyro && 1327b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian (virtualSensorsNeeds & (1<<SENSOR_TYPE_ROTATION_VECTOR))) { 1337b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // if we have the fancy sensor fusion, and it's not provided by the 1347b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // HAL, use our own (fused) orientation sensor by removing the 1357b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // HAL supplied one form the user list. 1367b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian if (orientationIndex >= 0) { 1377b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian mUserSensorList.removeItemsAt(orientationIndex); 1387b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian } 139010e42230135815907e76e5d7e5f30edf9e1799dMathias Agopian } 140010e42230135815907e76e5d7e5f30edf9e1799dMathias Agopian 14133264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian // debugging sensor list 14233264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian for (size_t i=0 ; i<mSensorList.size() ; i++) { 14333264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian switch (mSensorList[i].getType()) { 14433264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian case SENSOR_TYPE_GRAVITY: 14533264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian case SENSOR_TYPE_LINEAR_ACCELERATION: 14633264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian case SENSOR_TYPE_ROTATION_VECTOR: 14733264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian if (strstr(mSensorList[i].getVendor().string(), "Google")) { 14833264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian mUserSensorListDebug.add(mSensorList[i]); 14933264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian } 15033264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian break; 15133264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian default: 15233264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian mUserSensorListDebug.add(mSensorList[i]); 15333264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian break; 15433264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian } 15533264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian } 15633264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian 1577b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian run("SensorService", PRIORITY_URGENT_DISPLAY); 1587b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian mInitCheck = NO_ERROR; 1597b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian } 160fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 161fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 162fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 163f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopianvoid SensorService::registerSensor(SensorInterface* s) 164f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian{ 165f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian sensors_event_t event; 166f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian memset(&event, 0, sizeof(event)); 167f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian 168f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian const Sensor sensor(s->getSensor()); 169f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // add to the sensor list (returned to clients) 170f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian mSensorList.add(sensor); 171f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // add to our handle->SensorInterface mapping 172f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian mSensorMap.add(sensor.getHandle(), s); 173f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // create an entry in the mLastEventSeen array 174f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian mLastEventSeen.add(sensor.getHandle(), event); 175f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian} 176f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian 177f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopianvoid SensorService::registerVirtualSensor(SensorInterface* s) 178f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian{ 179f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian registerSensor(s); 180f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian mVirtualSensorList.add( s ); 181f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian} 182f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian 183fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::~SensorService() 184fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 185f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian for (size_t i=0 ; i<mSensorMap.size() ; i++) 186f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian delete mSensorMap.valueAt(i); 187fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 188fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 1891cb13461a8cf62e3ba634e5965332f2d284f6d42Mathias Agopianstatic const String16 sDump("android.permission.DUMP"); 1901cb13461a8cf62e3ba634e5965332f2d284f6d42Mathias Agopian 191fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::dump(int fd, const Vector<String16>& args) 192fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 193fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const size_t SIZE = 1024; 194fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian char buffer[SIZE]; 195fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian String8 result; 1961cb13461a8cf62e3ba634e5965332f2d284f6d42Mathias Agopian if (!PermissionCache::checkCallingPermission(sDump)) { 197fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian snprintf(buffer, SIZE, "Permission Denial: " 198fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian "can't dump SurfaceFlinger from pid=%d, uid=%d\n", 199fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian IPCThreadState::self()->getCallingPid(), 200fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian IPCThreadState::self()->getCallingUid()); 201fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian result.append(buffer); 202fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } else { 203fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 2043560fb24b668675627934356f210d84d19bf4e56Mathias Agopian snprintf(buffer, SIZE, "Sensor List:\n"); 2053560fb24b668675627934356f210d84d19bf4e56Mathias Agopian result.append(buffer); 2063560fb24b668675627934356f210d84d19bf4e56Mathias Agopian for (size_t i=0 ; i<mSensorList.size() ; i++) { 2073560fb24b668675627934356f210d84d19bf4e56Mathias Agopian const Sensor& s(mSensorList[i]); 2083560fb24b668675627934356f210d84d19bf4e56Mathias Agopian const sensors_event_t& e(mLastEventSeen.valueFor(s.getHandle())); 209984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian snprintf(buffer, SIZE, 210984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian "%-48s| %-32s | 0x%08x | maxRate=%7.2fHz | " 211984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian "last=<%5.1f,%5.1f,%5.1f>\n", 2123560fb24b668675627934356f210d84d19bf4e56Mathias Agopian s.getName().string(), 2133560fb24b668675627934356f210d84d19bf4e56Mathias Agopian s.getVendor().string(), 2143560fb24b668675627934356f210d84d19bf4e56Mathias Agopian s.getHandle(), 21524d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian s.getMinDelay() ? (1000000.0f / s.getMinDelay()) : 0.0f, 2163560fb24b668675627934356f210d84d19bf4e56Mathias Agopian e.data[0], e.data[1], e.data[2]); 2173560fb24b668675627934356f210d84d19bf4e56Mathias Agopian result.append(buffer); 2183560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } 219984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian SensorFusion::getInstance().dump(result, buffer, SIZE); 220f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian SensorDevice::getInstance().dump(result, buffer, SIZE); 2213560fb24b668675627934356f210d84d19bf4e56Mathias Agopian 2227c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian snprintf(buffer, SIZE, "%d active connections\n", 2237c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian mActiveConnections.size()); 224fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian result.append(buffer); 225fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian snprintf(buffer, SIZE, "Active sensors:\n"); 226fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian result.append(buffer); 227fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian for (size_t i=0 ; i<mActiveSensors.size() ; i++) { 2285d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian int handle = mActiveSensors.keyAt(i); 229f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian snprintf(buffer, SIZE, "%s (handle=0x%08x, connections=%d)\n", 2305d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian getSensorName(handle).string(), 2315d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian handle, 232fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveSensors.valueAt(i)->getNumConnections()); 233fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian result.append(buffer); 234fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 235fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 236fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian write(fd, result.string(), result.size()); 237fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return NO_ERROR; 238fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 239fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 240fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::threadLoop() 241fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 242a551237de142549fb8a6608ee9d2fbf4b7ca2ebfSteve Block ALOGD("nuSensorService thread starting..."); 243fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 244d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian const size_t numEventMax = 16; 2458dd4fe8dd37b740282b48b7867eec26fcf95e027Mathias Agopian const size_t minBufferSize = numEventMax + numEventMax * mVirtualSensorList.size(); 246d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian sensors_event_t buffer[minBufferSize]; 247d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian sensors_event_t scratch[minBufferSize]; 248f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian SensorDevice& device(SensorDevice::getInstance()); 249f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian const size_t vcount = mVirtualSensorList.size(); 250fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 251f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian ssize_t count; 252fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian do { 253f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian count = device.poll(buffer, numEventMax); 254fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (count<0) { 255f5a1230d322c14c42331d0a1536b50c87742973bSteve Block ALOGE("sensor poll failed (%s)", strerror(-count)); 256fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian break; 257fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 258fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 25994e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian recordLastValue(buffer, count); 26094e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian 261f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // handle virtual sensors 262f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (count && vcount) { 263984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian sensors_event_t const * const event = buffer; 264f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian const DefaultKeyedVector<int, SensorInterface*> virtualSensors( 265f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian getActiveVirtualSensors()); 266f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian const size_t activeVirtualSensorCount = virtualSensors.size(); 267f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (activeVirtualSensorCount) { 268f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian size_t k = 0; 269984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian SensorFusion& fusion(SensorFusion::getInstance()); 270984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian if (fusion.isEnabled()) { 271984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian for (size_t i=0 ; i<size_t(count) ; i++) { 272984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian fusion.process(event[i]); 273984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian } 274984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian } 275d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian for (size_t i=0 ; i<size_t(count) && k<minBufferSize ; i++) { 276f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian for (size_t j=0 ; j<activeVirtualSensorCount ; j++) { 277d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian if (count + k >= minBufferSize) { 278d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian ALOGE("buffer too small to hold all events: " 279d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian "count=%u, k=%u, size=%u", 280d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian count, k, minBufferSize); 281d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian break; 282d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian } 283f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian sensors_event_t out; 284d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian SensorInterface* si = virtualSensors.valueAt(j); 285d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian if (si->process(&out, event[i])) { 286f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian buffer[count + k] = out; 287f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian k++; 288f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 289f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 290f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 291f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (k) { 292f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // record the last synthesized values 293f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian recordLastValue(&buffer[count], k); 294f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian count += k; 295f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // sort the buffer by time-stamps 296f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian sortEventBuffer(buffer, count); 297f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 298f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 299f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 300f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian 301f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // send our events to clients... 302fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const SortedVector< wp<SensorEventConnection> > activeConnections( 303fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian getActiveConnections()); 304fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian size_t numConnections = activeConnections.size(); 305f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian for (size_t i=0 ; i<numConnections ; i++) { 306f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian sp<SensorEventConnection> connection( 307f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian activeConnections[i].promote()); 308f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (connection != 0) { 309f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian connection->sendEvents(buffer, count, scratch); 310fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 311fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 312fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } while (count >= 0 || Thread::exitPending()); 313fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 3143c20fbed7f3a916ced10f2ed5a272271b7d81edeSteve Block ALOGW("Exiting SensorService::threadLoop => aborting..."); 3151a62301fc58cd2af18239b0415813461bf5fc41bMathias Agopian abort(); 316fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return false; 317fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 318fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 31994e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopianvoid SensorService::recordLastValue( 32094e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian sensors_event_t const * buffer, size_t count) 32194e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian{ 32294e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian Mutex::Autolock _l(mLock); 32394e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian 32494e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian // record the last event for each sensor 32594e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian int32_t prev = buffer[0].sensor; 32694e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian for (size_t i=1 ; i<count ; i++) { 32794e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian // record the last event of each sensor type in this buffer 32894e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian int32_t curr = buffer[i].sensor; 32994e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian if (curr != prev) { 33094e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian mLastEventSeen.editValueFor(prev) = buffer[i-1]; 33194e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian prev = curr; 33294e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian } 33394e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian } 33494e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian mLastEventSeen.editValueFor(prev) = buffer[count-1]; 33594e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian} 33694e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian 337f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopianvoid SensorService::sortEventBuffer(sensors_event_t* buffer, size_t count) 338f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian{ 339f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian struct compar { 340f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian static int cmp(void const* lhs, void const* rhs) { 341f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian sensors_event_t const* l = static_cast<sensors_event_t const*>(lhs); 342f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian sensors_event_t const* r = static_cast<sensors_event_t const*>(rhs); 343a5c106a4f0afcf061728a1cb7c8c3b908728575dMathias Agopian return l->timestamp - r->timestamp; 344f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 345f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian }; 346f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian qsort(buffer, count, sizeof(sensors_event_t), compar::cmp); 347f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian} 348f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian 349fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSortedVector< wp<SensorService::SensorEventConnection> > 350fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::getActiveConnections() const 351fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 352fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 353fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mActiveConnections; 354fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 355fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 356f001c92436b4a66eb7687286325ced7f10c9f917Mathias AgopianDefaultKeyedVector<int, SensorInterface*> 357f001c92436b4a66eb7687286325ced7f10c9f917Mathias AgopianSensorService::getActiveVirtualSensors() const 358f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian{ 359f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian Mutex::Autolock _l(mLock); 360f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian return mActiveVirtualSensors; 361f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian} 362f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian 3635d2707214dfb97bd8dfcc6620be36841d3c82420Mathias AgopianString8 SensorService::getSensorName(int handle) const { 364010e42230135815907e76e5d7e5f30edf9e1799dMathias Agopian size_t count = mUserSensorList.size(); 3655d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian for (size_t i=0 ; i<count ; i++) { 366010e42230135815907e76e5d7e5f30edf9e1799dMathias Agopian const Sensor& sensor(mUserSensorList[i]); 3675d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian if (sensor.getHandle() == handle) { 3685d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian return sensor.getName(); 3695d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian } 3705d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian } 3715d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian String8 result("unknown"); 3725d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian return result; 3735d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian} 3745d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian 375fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianVector<Sensor> SensorService::getSensorList() 376fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 37733264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian char value[PROPERTY_VALUE_MAX]; 37833264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian property_get("debug.sensors", value, "0"); 37933264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian if (atoi(value)) { 38033264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian return mUserSensorListDebug; 38133264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian } 382010e42230135815907e76e5d7e5f30edf9e1799dMathias Agopian return mUserSensorList; 383fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 384fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 385fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiansp<ISensorEventConnection> SensorService::createSensorEventConnection() 386fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 3875307d17fe33fc26eeeacd6339a9fbfe96cf56873Mathias Agopian uid_t uid = IPCThreadState::self()->getCallingUid(); 3885307d17fe33fc26eeeacd6339a9fbfe96cf56873Mathias Agopian sp<SensorEventConnection> result(new SensorEventConnection(this, uid)); 389fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return result; 390fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 391fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 392db5b4bce9e65ec9c2c7762b601297e4abadbc22aMathias Agopianvoid SensorService::cleanupConnection(SensorEventConnection* c) 393fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 394fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 395db5b4bce9e65ec9c2c7762b601297e4abadbc22aMathias Agopian const wp<SensorEventConnection> connection(c); 3967c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian size_t size = mActiveSensors.size(); 397a551237de142549fb8a6608ee9d2fbf4b7ca2ebfSteve Block ALOGD_IF(DEBUG_CONNECTIONS, "%d active sensors", size); 3987c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian for (size_t i=0 ; i<size ; ) { 399db5b4bce9e65ec9c2c7762b601297e4abadbc22aMathias Agopian int handle = mActiveSensors.keyAt(i); 400db5b4bce9e65ec9c2c7762b601297e4abadbc22aMathias Agopian if (c->hasSensor(handle)) { 401a551237de142549fb8a6608ee9d2fbf4b7ca2ebfSteve Block ALOGD_IF(DEBUG_CONNECTIONS, "%i: disabling handle=0x%08x", i, handle); 402f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian SensorInterface* sensor = mSensorMap.valueFor( handle ); 403f5a1230d322c14c42331d0a1536b50c87742973bSteve Block ALOGE_IF(!sensor, "mSensorMap[handle=0x%08x] is null!", handle); 404f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (sensor) { 405db5b4bce9e65ec9c2c7762b601297e4abadbc22aMathias Agopian sensor->activate(c, false); 406f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 407db5b4bce9e65ec9c2c7762b601297e4abadbc22aMathias Agopian } 408db5b4bce9e65ec9c2c7762b601297e4abadbc22aMathias Agopian SensorRecord* rec = mActiveSensors.valueAt(i); 409f5a1230d322c14c42331d0a1536b50c87742973bSteve Block ALOGE_IF(!rec, "mActiveSensors[%d] is null (handle=0x%08x)!", i, handle); 410a551237de142549fb8a6608ee9d2fbf4b7ca2ebfSteve Block ALOGD_IF(DEBUG_CONNECTIONS, 411a1b7db95b6ccf5be9d8dfaac1b8f45494813edc0Mathias Agopian "removing connection %p for sensor[%d].handle=0x%08x", 412a1b7db95b6ccf5be9d8dfaac1b8f45494813edc0Mathias Agopian c, i, handle); 413a1b7db95b6ccf5be9d8dfaac1b8f45494813edc0Mathias Agopian 414db5b4bce9e65ec9c2c7762b601297e4abadbc22aMathias Agopian if (rec && rec->removeConnection(connection)) { 415a551237de142549fb8a6608ee9d2fbf4b7ca2ebfSteve Block ALOGD_IF(DEBUG_CONNECTIONS, "... and it was the last connection"); 4167c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian mActiveSensors.removeItemsAt(i, 1); 417f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian mActiveVirtualSensors.removeItem(handle); 4187c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian delete rec; 4197c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian size--; 4207c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } else { 4217c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian i++; 422fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 423fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 4247c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian mActiveConnections.remove(connection); 425787ac1b388f144f5e6dd38f8b807866a5256dafcMathias Agopian BatteryService::cleanup(c->getUid()); 426fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 427fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 428fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::enable(const sp<SensorEventConnection>& connection, 429fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle) 430fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 43150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mInitCheck != NO_ERROR) 43250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian return mInitCheck; 43350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 434fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 435f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian SensorInterface* sensor = mSensorMap.valueFor(handle); 436f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian status_t err = sensor ? sensor->activate(connection.get(), true) : status_t(BAD_VALUE); 437f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (err == NO_ERROR) { 438f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian SensorRecord* rec = mActiveSensors.valueFor(handle); 439f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (rec == 0) { 440f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian rec = new SensorRecord(connection); 441f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian mActiveSensors.add(handle, rec); 442f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (sensor->isVirtual()) { 443f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian mActiveVirtualSensors.add(handle, sensor); 444f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 445f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } else { 446f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (rec->addConnection(connection)) { 447f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // this sensor is already activated, but we are adding a 448f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // connection that uses it. Immediately send down the last 4493f2f8916112126fb1a93e4a4b4e2d4e01570aeeeMathias Agopian // known value of the requested sensor if it's not a 4503f2f8916112126fb1a93e4a4b4e2d4e01570aeeeMathias Agopian // "continuous" sensor. 4513f2f8916112126fb1a93e4a4b4e2d4e01570aeeeMathias Agopian if (sensor->getSensor().getMinDelay() == 0) { 4523f2f8916112126fb1a93e4a4b4e2d4e01570aeeeMathias Agopian sensors_event_t scratch; 4533f2f8916112126fb1a93e4a4b4e2d4e01570aeeeMathias Agopian sensors_event_t& event(mLastEventSeen.editValueFor(handle)); 4543f2f8916112126fb1a93e4a4b4e2d4e01570aeeeMathias Agopian if (event.version == sizeof(sensors_event_t)) { 4553f2f8916112126fb1a93e4a4b4e2d4e01570aeeeMathias Agopian connection->sendEvents(&event, 1); 4563f2f8916112126fb1a93e4a4b4e2d4e01570aeeeMathias Agopian } 457f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 4583560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } 4593560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } 460f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (err == NO_ERROR) { 461f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // connection now active 462f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (connection->addSensor(handle)) { 463787ac1b388f144f5e6dd38f8b807866a5256dafcMathias Agopian BatteryService::enableSensor(connection->getUid(), handle); 464f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // the sensor was added (which means it wasn't already there) 465f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // so, see if this connection becomes active 466f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (mActiveConnections.indexOf(connection) < 0) { 467f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian mActiveConnections.add(connection); 468f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 469a5b8e8bfa9f3416ce61ee08162fb139afde60488Mathias Agopian } else { 470a5b8e8bfa9f3416ce61ee08162fb139afde60488Mathias Agopian ALOGW("sensor %08x already enabled in connection %p (ignoring)", 471a5b8e8bfa9f3416ce61ee08162fb139afde60488Mathias Agopian handle, connection.get()); 4727c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 473fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 474fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 475fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return err; 476fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 477fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 478fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::disable(const sp<SensorEventConnection>& connection, 479fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle) 480fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 48150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mInitCheck != NO_ERROR) 48250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian return mInitCheck; 48350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 484fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian status_t err = NO_ERROR; 485fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 486fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian SensorRecord* rec = mActiveSensors.valueFor(handle); 487fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (rec) { 488fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // see if this connection becomes inactive 489787ac1b388f144f5e6dd38f8b807866a5256dafcMathias Agopian if (connection->removeSensor(handle)) { 490787ac1b388f144f5e6dd38f8b807866a5256dafcMathias Agopian BatteryService::disableSensor(connection->getUid(), handle); 491787ac1b388f144f5e6dd38f8b807866a5256dafcMathias Agopian } 492fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (connection->hasAnySensor() == false) { 493fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveConnections.remove(connection); 494fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 495fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // see if this sensor becomes inactive 496fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (rec->removeConnection(connection)) { 497fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveSensors.removeItem(handle); 498f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian mActiveVirtualSensors.removeItem(handle); 499fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian delete rec; 500fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 501f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian SensorInterface* sensor = mSensorMap.valueFor(handle); 502f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian err = sensor ? sensor->activate(connection.get(), false) : status_t(BAD_VALUE); 5037c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 504fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return err; 505fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 506fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 5077c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianstatus_t SensorService::setEventRate(const sp<SensorEventConnection>& connection, 508fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle, nsecs_t ns) 509fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 51050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mInitCheck != NO_ERROR) 51150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian return mInitCheck; 51250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 513ae09d65f5b35cb51da2e1386a6dd7a52085f1325Mathias Agopian SensorInterface* sensor = mSensorMap.valueFor(handle); 514ae09d65f5b35cb51da2e1386a6dd7a52085f1325Mathias Agopian if (!sensor) 515ae09d65f5b35cb51da2e1386a6dd7a52085f1325Mathias Agopian return BAD_VALUE; 516ae09d65f5b35cb51da2e1386a6dd7a52085f1325Mathias Agopian 5171cd700015318727d6d42236ab6274f1949fb08baMathias Agopian if (ns < 0) 5181cd700015318727d6d42236ab6274f1949fb08baMathias Agopian return BAD_VALUE; 5191cd700015318727d6d42236ab6274f1949fb08baMathias Agopian 52062569ecf526c7c01cb68ea461c6bbd3cb26057d2Mathias Agopian nsecs_t minDelayNs = sensor->getSensor().getMinDelayNs(); 52162569ecf526c7c01cb68ea461c6bbd3cb26057d2Mathias Agopian if (ns < minDelayNs) { 52262569ecf526c7c01cb68ea461c6bbd3cb26057d2Mathias Agopian ns = minDelayNs; 523ae09d65f5b35cb51da2e1386a6dd7a52085f1325Mathias Agopian } 524ae09d65f5b35cb51da2e1386a6dd7a52085f1325Mathias Agopian 5257c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (ns < MINIMUM_EVENTS_PERIOD) 5267c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian ns = MINIMUM_EVENTS_PERIOD; 5271cd700015318727d6d42236ab6274f1949fb08baMathias Agopian 528f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian return sensor->setDelay(connection.get(), handle, ns); 529fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 530fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 531fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 532fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 533fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorRecord::SensorRecord( 534fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const sp<SensorEventConnection>& connection) 535fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 536fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.add(connection); 537fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 538fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 5397c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorRecord::addConnection( 540fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const sp<SensorEventConnection>& connection) 541fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 542fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (mConnections.indexOf(connection) < 0) { 543fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.add(connection); 5447c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return true; 545fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 5467c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return false; 547fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 548fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 549fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorRecord::removeConnection( 550fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const wp<SensorEventConnection>& connection) 551fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 552fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian ssize_t index = mConnections.indexOf(connection); 553fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (index >= 0) { 554fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.removeItemsAt(index, 1); 555fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 556fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mConnections.size() ? false : true; 557fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 558fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 559fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 560fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 561fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorEventConnection::SensorEventConnection( 5625307d17fe33fc26eeeacd6339a9fbfe96cf56873Mathias Agopian const sp<SensorService>& service, uid_t uid) 5635307d17fe33fc26eeeacd6339a9fbfe96cf56873Mathias Agopian : mService(service), mChannel(new BitTube()), mUid(uid) 564fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 565fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 566fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 567fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorEventConnection::~SensorEventConnection() 568fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 569a551237de142549fb8a6608ee9d2fbf4b7ca2ebfSteve Block ALOGD_IF(DEBUG_CONNECTIONS, "~SensorEventConnection(%p)", this); 570fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mService->cleanupConnection(this); 571fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 572fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 573fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::SensorEventConnection::onFirstRef() 574fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 575fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 576fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 5777c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorEventConnection::addSensor(int32_t handle) { 57871d7a5c289c6ef6b5fc86dd4784a075ca6470e38Mathias Agopian Mutex::Autolock _l(mConnectionLock); 579a5b8e8bfa9f3416ce61ee08162fb139afde60488Mathias Agopian if (mSensorInfo.indexOf(handle) < 0) { 580f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian mSensorInfo.add(handle); 5817c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return true; 582fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 5837c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return false; 584fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 585fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 5867c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorEventConnection::removeSensor(int32_t handle) { 58771d7a5c289c6ef6b5fc86dd4784a075ca6470e38Mathias Agopian Mutex::Autolock _l(mConnectionLock); 588f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (mSensorInfo.remove(handle) >= 0) { 5897c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return true; 5907c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 5917c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return false; 592fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 593fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 594fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorEventConnection::hasSensor(int32_t handle) const { 59571d7a5c289c6ef6b5fc86dd4784a075ca6470e38Mathias Agopian Mutex::Autolock _l(mConnectionLock); 596f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian return mSensorInfo.indexOf(handle) >= 0; 597fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 598fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 599fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorEventConnection::hasAnySensor() const { 60071d7a5c289c6ef6b5fc86dd4784a075ca6470e38Mathias Agopian Mutex::Autolock _l(mConnectionLock); 6017c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return mSensorInfo.size() ? true : false; 6027c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian} 6037c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian 604fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::sendEvents( 605cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian sensors_event_t const* buffer, size_t numEvents, 606cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian sensors_event_t* scratch) 607fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 608cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian // filter out events not for this connection 6093560fb24b668675627934356f210d84d19bf4e56Mathias Agopian size_t count = 0; 6103560fb24b668675627934356f210d84d19bf4e56Mathias Agopian if (scratch) { 61171d7a5c289c6ef6b5fc86dd4784a075ca6470e38Mathias Agopian Mutex::Autolock _l(mConnectionLock); 6123560fb24b668675627934356f210d84d19bf4e56Mathias Agopian size_t i=0; 6133560fb24b668675627934356f210d84d19bf4e56Mathias Agopian while (i<numEvents) { 6143560fb24b668675627934356f210d84d19bf4e56Mathias Agopian const int32_t curr = buffer[i].sensor; 615f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (mSensorInfo.indexOf(curr) >= 0) { 6163560fb24b668675627934356f210d84d19bf4e56Mathias Agopian do { 6173560fb24b668675627934356f210d84d19bf4e56Mathias Agopian scratch[count++] = buffer[i++]; 6183560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } while ((i<numEvents) && (buffer[i].sensor == curr)); 6193560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } else { 6203560fb24b668675627934356f210d84d19bf4e56Mathias Agopian i++; 6213560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } 622cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian } 6233560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } else { 6243560fb24b668675627934356f210d84d19bf4e56Mathias Agopian scratch = const_cast<sensors_event_t *>(buffer); 6253560fb24b668675627934356f210d84d19bf4e56Mathias Agopian count = numEvents; 626cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian } 627fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 628907103bf186cfdd2ed9eb3b6c36de53ade7b16f6Mathias Agopian // NOTE: ASensorEvent and sensors_event_t are the same type 629907103bf186cfdd2ed9eb3b6c36de53ade7b16f6Mathias Agopian ssize_t size = SensorEventQueue::write(mChannel, 630907103bf186cfdd2ed9eb3b6c36de53ade7b16f6Mathias Agopian reinterpret_cast<ASensorEvent const*>(scratch), count); 631fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (size == -EAGAIN) { 632fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // the destination doesn't accept events anymore, it's probably 633fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // full. For now, we just drop the events on the floor. 6343c20fbed7f3a916ced10f2ed5a272271b7d81edeSteve Block //ALOGW("dropping %d events on the floor", count); 635fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return size; 636fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 637fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 6381e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown return size < 0 ? status_t(size) : status_t(NO_ERROR); 639fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 640fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 641b3989276d17f2b083bec67b695d1078fb86c6c53Mathias Agopiansp<BitTube> SensorService::SensorEventConnection::getSensorChannel() const 642fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 643fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mChannel; 644fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 645fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 646fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::enableDisable( 647fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle, bool enabled) 648fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 649fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian status_t err; 650fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (enabled) { 651fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = mService->enable(this, handle); 652fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } else { 653fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = mService->disable(this, handle); 654fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 655fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return err; 656fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 657fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 658fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::setEventRate( 659fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle, nsecs_t ns) 660fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 6617c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return mService->setEventRate(this, handle, ns); 662fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 663fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 664fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 665fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}; // namespace android 666fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 667