SensorService.cpp revision ac9a96da65f6eae4513654adaad8a457d1c1575c
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> 414342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh#include <hardware_legacy/power.h> 42fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 43787ac1b388f144f5e6dd38f8b807866a5256dafcMathias Agopian#include "BatteryService.h" 44984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#include "CorrectedGyroSensor.h" 45f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian#include "GravitySensor.h" 46f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian#include "LinearAccelerationSensor.h" 47984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#include "OrientationSensor.h" 48f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian#include "RotationVectorSensor.h" 49984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#include "SensorFusion.h" 50984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#include "SensorService.h" 51fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 52fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiannamespace android { 53fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 54fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 553301542828febc768e1df42892cfac4992c35474Mathias Agopian/* 563301542828febc768e1df42892cfac4992c35474Mathias Agopian * Notes: 573301542828febc768e1df42892cfac4992c35474Mathias Agopian * 583301542828febc768e1df42892cfac4992c35474Mathias Agopian * - what about a gyro-corrected magnetic-field sensor? 593301542828febc768e1df42892cfac4992c35474Mathias Agopian * - run mag sensor from time to time to force calibration 603301542828febc768e1df42892cfac4992c35474Mathias Agopian * - gravity sensor length is wrong (=> drift in linear-acc sensor) 613301542828febc768e1df42892cfac4992c35474Mathias Agopian * 623301542828febc768e1df42892cfac4992c35474Mathias Agopian */ 633301542828febc768e1df42892cfac4992c35474Mathias Agopian 644342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganeshconst char* SensorService::WAKE_LOCK_NAME = "SensorService"; 654342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh 66fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorService() 671cb13461a8cf62e3ba634e5965332f2d284f6d42Mathias Agopian : mInitCheck(NO_INIT) 68fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 69fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 70fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 71fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::onFirstRef() 72fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 73a551237de142549fb8a6608ee9d2fbf4b7ca2ebfSteve Block ALOGD("nuSensorService starting..."); 7450df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 75f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian SensorDevice& dev(SensorDevice::getInstance()); 76fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 77f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (dev.initCheck() == NO_ERROR) { 78f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian sensor_t const* list; 797b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian ssize_t count = dev.getSensorList(&list); 807b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian if (count > 0) { 817b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian ssize_t orientationIndex = -1; 827b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian bool hasGyro = false; 837b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian uint32_t virtualSensorsNeeds = 847b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian (1<<SENSOR_TYPE_GRAVITY) | 857b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian (1<<SENSOR_TYPE_LINEAR_ACCELERATION) | 867b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian (1<<SENSOR_TYPE_ROTATION_VECTOR); 877b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian 887b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian mLastEventSeen.setCapacity(count); 897b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian for (ssize_t i=0 ; i<count ; i++) { 907b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian registerSensor( new HardwareSensor(list[i]) ); 917b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian switch (list[i].type) { 927b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian case SENSOR_TYPE_ORIENTATION: 937b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian orientationIndex = i; 947b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian break; 957b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian case SENSOR_TYPE_GYROSCOPE: 967b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian hasGyro = true; 977b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian break; 987b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian case SENSOR_TYPE_GRAVITY: 997b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian case SENSOR_TYPE_LINEAR_ACCELERATION: 1007b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian case SENSOR_TYPE_ROTATION_VECTOR: 1017b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian virtualSensorsNeeds &= ~(1<<list[i].type); 1027b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian break; 1037b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian } 10450df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian } 105fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 1067b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // it's safe to instantiate the SensorFusion object here 1077b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // (it wants to be instantiated after h/w sensors have been 1087b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // registered) 1097b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian const SensorFusion& fusion(SensorFusion::getInstance()); 1107b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian 1117b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian if (hasGyro) { 1127b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // Always instantiate Android's virtual sensors. Since they are 1137b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // instantiated behind sensors from the HAL, they won't 1147b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // interfere with applications, unless they looks specifically 1157b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // for them (by name). 1167b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian 1177b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian registerVirtualSensor( new RotationVectorSensor() ); 1187b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian registerVirtualSensor( new GravitySensor(list, count) ); 1197b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian registerVirtualSensor( new LinearAccelerationSensor(list, count) ); 1207b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian 1217b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // these are optional 1227b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian registerVirtualSensor( new OrientationSensor() ); 1237b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian registerVirtualSensor( new CorrectedGyroSensor(list, count) ); 1243301542828febc768e1df42892cfac4992c35474Mathias Agopian } 125f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian 1267b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // build the sensor list returned to users 1277b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian mUserSensorList = mSensorList; 12833264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian 12933264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian if (hasGyro) { 13033264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian // virtual debugging sensors are not added to mUserSensorList 13133264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian registerVirtualSensor( new GyroDriftSensor() ); 13233264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian } 13333264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian 1347b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian if (hasGyro && 1357b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian (virtualSensorsNeeds & (1<<SENSOR_TYPE_ROTATION_VECTOR))) { 1367b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // if we have the fancy sensor fusion, and it's not provided by the 1377b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // HAL, use our own (fused) orientation sensor by removing the 1387b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian // HAL supplied one form the user list. 1397b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian if (orientationIndex >= 0) { 1407b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian mUserSensorList.removeItemsAt(orientationIndex); 1417b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian } 142010e42230135815907e76e5d7e5f30edf9e1799dMathias Agopian } 143010e42230135815907e76e5d7e5f30edf9e1799dMathias Agopian 14433264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian // debugging sensor list 14533264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian for (size_t i=0 ; i<mSensorList.size() ; i++) { 14633264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian switch (mSensorList[i].getType()) { 14733264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian case SENSOR_TYPE_GRAVITY: 14833264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian case SENSOR_TYPE_LINEAR_ACCELERATION: 14933264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian case SENSOR_TYPE_ROTATION_VECTOR: 15033264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian if (strstr(mSensorList[i].getVendor().string(), "Google")) { 15133264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian mUserSensorListDebug.add(mSensorList[i]); 15233264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian } 15333264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian break; 15433264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian default: 15533264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian mUserSensorListDebug.add(mSensorList[i]); 15633264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian break; 15733264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian } 15833264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian } 15933264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian 1607b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian run("SensorService", PRIORITY_URGENT_DISPLAY); 1617b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian mInitCheck = NO_ERROR; 1627b2b32f2e761a919deb6f82d978b379429f77b05Mathias Agopian } 163fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 164fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 165fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 166f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopianvoid SensorService::registerSensor(SensorInterface* s) 167f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian{ 168f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian sensors_event_t event; 169f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian memset(&event, 0, sizeof(event)); 170f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian 171f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian const Sensor sensor(s->getSensor()); 172f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // add to the sensor list (returned to clients) 173f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian mSensorList.add(sensor); 174f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // add to our handle->SensorInterface mapping 175f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian mSensorMap.add(sensor.getHandle(), s); 176f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // create an entry in the mLastEventSeen array 177f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian mLastEventSeen.add(sensor.getHandle(), event); 178f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian} 179f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian 180f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopianvoid SensorService::registerVirtualSensor(SensorInterface* s) 181f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian{ 182f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian registerSensor(s); 183f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian mVirtualSensorList.add( s ); 184f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian} 185f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian 186fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::~SensorService() 187fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 188f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian for (size_t i=0 ; i<mSensorMap.size() ; i++) 189f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian delete mSensorMap.valueAt(i); 190fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 191fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 1921cb13461a8cf62e3ba634e5965332f2d284f6d42Mathias Agopianstatic const String16 sDump("android.permission.DUMP"); 1931cb13461a8cf62e3ba634e5965332f2d284f6d42Mathias Agopian 194fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::dump(int fd, const Vector<String16>& args) 195fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 196fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const size_t SIZE = 1024; 197fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian char buffer[SIZE]; 198fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian String8 result; 1991cb13461a8cf62e3ba634e5965332f2d284f6d42Mathias Agopian if (!PermissionCache::checkCallingPermission(sDump)) { 200fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian snprintf(buffer, SIZE, "Permission Denial: " 201fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian "can't dump SurfaceFlinger from pid=%d, uid=%d\n", 202fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian IPCThreadState::self()->getCallingPid(), 203fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian IPCThreadState::self()->getCallingUid()); 204fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian result.append(buffer); 205fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } else { 206fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 2073560fb24b668675627934356f210d84d19bf4e56Mathias Agopian snprintf(buffer, SIZE, "Sensor List:\n"); 2083560fb24b668675627934356f210d84d19bf4e56Mathias Agopian result.append(buffer); 2093560fb24b668675627934356f210d84d19bf4e56Mathias Agopian for (size_t i=0 ; i<mSensorList.size() ; i++) { 2103560fb24b668675627934356f210d84d19bf4e56Mathias Agopian const Sensor& s(mSensorList[i]); 2113560fb24b668675627934356f210d84d19bf4e56Mathias Agopian const sensors_event_t& e(mLastEventSeen.valueFor(s.getHandle())); 212984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian snprintf(buffer, SIZE, 213984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian "%-48s| %-32s | 0x%08x | maxRate=%7.2fHz | " 214984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian "last=<%5.1f,%5.1f,%5.1f>\n", 2153560fb24b668675627934356f210d84d19bf4e56Mathias Agopian s.getName().string(), 2163560fb24b668675627934356f210d84d19bf4e56Mathias Agopian s.getVendor().string(), 2173560fb24b668675627934356f210d84d19bf4e56Mathias Agopian s.getHandle(), 21824d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian s.getMinDelay() ? (1000000.0f / s.getMinDelay()) : 0.0f, 2193560fb24b668675627934356f210d84d19bf4e56Mathias Agopian e.data[0], e.data[1], e.data[2]); 2203560fb24b668675627934356f210d84d19bf4e56Mathias Agopian result.append(buffer); 2213560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } 222984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian SensorFusion::getInstance().dump(result, buffer, SIZE); 223f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian SensorDevice::getInstance().dump(result, buffer, SIZE); 2243560fb24b668675627934356f210d84d19bf4e56Mathias Agopian 2257c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian snprintf(buffer, SIZE, "%d active connections\n", 2267c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian mActiveConnections.size()); 227fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian result.append(buffer); 228fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian snprintf(buffer, SIZE, "Active sensors:\n"); 229fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian result.append(buffer); 230fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian for (size_t i=0 ; i<mActiveSensors.size() ; i++) { 2315d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian int handle = mActiveSensors.keyAt(i); 232f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian snprintf(buffer, SIZE, "%s (handle=0x%08x, connections=%d)\n", 2335d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian getSensorName(handle).string(), 2345d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian handle, 235fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveSensors.valueAt(i)->getNumConnections()); 236fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian result.append(buffer); 237fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 238fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 239fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian write(fd, result.string(), result.size()); 240fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return NO_ERROR; 241fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 242fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 2434342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganeshvoid SensorService::cleanupAutoDisabledSensor(const sp<SensorEventConnection>& connection, 2444342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh sensors_event_t const* buffer, const int count) { 2454c01b1ad80e084f0cd1057f89fdd1fcedf19dd96Jaikumar Ganesh SensorInterface* sensor; 2464c01b1ad80e084f0cd1057f89fdd1fcedf19dd96Jaikumar Ganesh status_t err = NO_ERROR; 2474342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh for (int i=0 ; i<count ; i++) { 2484342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh int handle = buffer[i].sensor; 2494342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh if (getSensorType(handle) == SENSOR_TYPE_SIGNIFICANT_MOTION) { 2504342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh if (connection->hasSensor(handle)) { 2514c01b1ad80e084f0cd1057f89fdd1fcedf19dd96Jaikumar Ganesh sensor = mSensorMap.valueFor(handle); 252ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopian if (sensor != NULL) { 253ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopian sensor->autoDisable(connection.get(), handle); 2544c01b1ad80e084f0cd1057f89fdd1fcedf19dd96Jaikumar Ganesh } 2554342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh cleanupWithoutDisable(connection, handle); 2564342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh } 2574342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh } 2584342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh } 2594342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh} 2604342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh 261fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::threadLoop() 262fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 263a551237de142549fb8a6608ee9d2fbf4b7ca2ebfSteve Block ALOGD("nuSensorService thread starting..."); 264fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 265d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian const size_t numEventMax = 16; 2668dd4fe8dd37b740282b48b7867eec26fcf95e027Mathias Agopian const size_t minBufferSize = numEventMax + numEventMax * mVirtualSensorList.size(); 267d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian sensors_event_t buffer[minBufferSize]; 268d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian sensors_event_t scratch[minBufferSize]; 269f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian SensorDevice& device(SensorDevice::getInstance()); 270f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian const size_t vcount = mVirtualSensorList.size(); 271fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 272f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian ssize_t count; 2734342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh bool wakeLockAcquired = false; 2744342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh const int halVersion = device.getHalDeviceVersion(); 275fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian do { 276f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian count = device.poll(buffer, numEventMax); 277fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (count<0) { 278f5a1230d322c14c42331d0a1536b50c87742973bSteve Block ALOGE("sensor poll failed (%s)", strerror(-count)); 279fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian break; 280fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 281fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 2824342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh // Poll has returned. Hold a wakelock. 2834342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh // Todo(): add a flag to the sensors definitions to indicate 2844342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh // the sensors which can wake up the AP 2854342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh for (int i = 0; i < count; i++) { 2864342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh if (getSensorType(buffer[i].sensor) == SENSOR_TYPE_SIGNIFICANT_MOTION) { 2874342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_NAME); 2884342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh wakeLockAcquired = true; 2894342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh break; 2904342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh } 2914342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh } 2924342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh 29394e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian recordLastValue(buffer, count); 29494e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian 295f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // handle virtual sensors 296f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (count && vcount) { 297984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian sensors_event_t const * const event = buffer; 298f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian const DefaultKeyedVector<int, SensorInterface*> virtualSensors( 299f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian getActiveVirtualSensors()); 300f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian const size_t activeVirtualSensorCount = virtualSensors.size(); 301f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (activeVirtualSensorCount) { 302f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian size_t k = 0; 303984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian SensorFusion& fusion(SensorFusion::getInstance()); 304984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian if (fusion.isEnabled()) { 305984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian for (size_t i=0 ; i<size_t(count) ; i++) { 306984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian fusion.process(event[i]); 307984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian } 308984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian } 309d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian for (size_t i=0 ; i<size_t(count) && k<minBufferSize ; i++) { 310f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian for (size_t j=0 ; j<activeVirtualSensorCount ; j++) { 311d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian if (count + k >= minBufferSize) { 312d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian ALOGE("buffer too small to hold all events: " 313d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian "count=%u, k=%u, size=%u", 314d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian count, k, minBufferSize); 315d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian break; 316d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian } 317f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian sensors_event_t out; 318d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian SensorInterface* si = virtualSensors.valueAt(j); 319d1920ffede9e9bc107104ad94c291ca0f0f18bc3Mathias Agopian if (si->process(&out, event[i])) { 320f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian buffer[count + k] = out; 321f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian k++; 322f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 323f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 324f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 325f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (k) { 326f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // record the last synthesized values 327f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian recordLastValue(&buffer[count], k); 328f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian count += k; 329f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // sort the buffer by time-stamps 330f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian sortEventBuffer(buffer, count); 331f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 332f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 333f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 334f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian 3354342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh // handle backward compatibility for RotationVector sensor 3364342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh if (halVersion < SENSORS_DEVICE_API_VERSION_1_0) { 3374342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh for (int i = 0; i < count; i++) { 3384342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh if (getSensorType(buffer[i].sensor) == SENSOR_TYPE_ROTATION_VECTOR) { 3394342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh // All the 4 components of the quaternion should be available 3404342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh // No heading accuracy. Set it to -1 3414342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh buffer[i].data[4] = -1; 3424342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh } 3434342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh } 3444342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh } 3454342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh 346f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian // send our events to clients... 347fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const SortedVector< wp<SensorEventConnection> > activeConnections( 348fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian getActiveConnections()); 349fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian size_t numConnections = activeConnections.size(); 350f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian for (size_t i=0 ; i<numConnections ; i++) { 351f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian sp<SensorEventConnection> connection( 352f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian activeConnections[i].promote()); 353f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (connection != 0) { 354f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian connection->sendEvents(buffer, count, scratch); 3554342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh // Some sensors need to be auto disabled after the trigger 3564342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh cleanupAutoDisabledSensor(connection, buffer, count); 357fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 358fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 3594342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh 3604342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh // We have read the data, upper layers should hold the wakelock. 3614342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh if (wakeLockAcquired) release_wake_lock(WAKE_LOCK_NAME); 3624342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh 363fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } while (count >= 0 || Thread::exitPending()); 364fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 3653c20fbed7f3a916ced10f2ed5a272271b7d81edeSteve Block ALOGW("Exiting SensorService::threadLoop => aborting..."); 3661a62301fc58cd2af18239b0415813461bf5fc41bMathias Agopian abort(); 367fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return false; 368fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 369fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 37094e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopianvoid SensorService::recordLastValue( 37194e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian sensors_event_t const * buffer, size_t count) 37294e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian{ 37394e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian Mutex::Autolock _l(mLock); 37494e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian 37594e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian // record the last event for each sensor 37694e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian int32_t prev = buffer[0].sensor; 37794e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian for (size_t i=1 ; i<count ; i++) { 37894e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian // record the last event of each sensor type in this buffer 37994e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian int32_t curr = buffer[i].sensor; 38094e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian if (curr != prev) { 38194e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian mLastEventSeen.editValueFor(prev) = buffer[i-1]; 38294e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian prev = curr; 38394e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian } 38494e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian } 38594e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian mLastEventSeen.editValueFor(prev) = buffer[count-1]; 38694e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian} 38794e8f6813f3fb2beaa9bcbfb1ad9b4ae2eb46949Mathias Agopian 388f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopianvoid SensorService::sortEventBuffer(sensors_event_t* buffer, size_t count) 389f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian{ 390f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian struct compar { 391f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian static int cmp(void const* lhs, void const* rhs) { 392f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian sensors_event_t const* l = static_cast<sensors_event_t const*>(lhs); 393f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian sensors_event_t const* r = static_cast<sensors_event_t const*>(rhs); 394a5c106a4f0afcf061728a1cb7c8c3b908728575dMathias Agopian return l->timestamp - r->timestamp; 395f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 396f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian }; 397f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian qsort(buffer, count, sizeof(sensors_event_t), compar::cmp); 398f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian} 399f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian 400fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSortedVector< wp<SensorService::SensorEventConnection> > 401fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::getActiveConnections() const 402fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 403fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 404fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mActiveConnections; 405fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 406fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 407f001c92436b4a66eb7687286325ced7f10c9f917Mathias AgopianDefaultKeyedVector<int, SensorInterface*> 408f001c92436b4a66eb7687286325ced7f10c9f917Mathias AgopianSensorService::getActiveVirtualSensors() const 409f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian{ 410f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian Mutex::Autolock _l(mLock); 411f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian return mActiveVirtualSensors; 412f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian} 413f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian 4145d2707214dfb97bd8dfcc6620be36841d3c82420Mathias AgopianString8 SensorService::getSensorName(int handle) const { 415010e42230135815907e76e5d7e5f30edf9e1799dMathias Agopian size_t count = mUserSensorList.size(); 4165d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian for (size_t i=0 ; i<count ; i++) { 417010e42230135815907e76e5d7e5f30edf9e1799dMathias Agopian const Sensor& sensor(mUserSensorList[i]); 4185d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian if (sensor.getHandle() == handle) { 4195d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian return sensor.getName(); 4205d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian } 4215d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian } 4225d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian String8 result("unknown"); 4235d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian return result; 4245d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian} 4255d2707214dfb97bd8dfcc6620be36841d3c82420Mathias Agopian 4264342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganeshint SensorService::getSensorType(int handle) const { 4274342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh size_t count = mUserSensorList.size(); 4284342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh for (size_t i=0 ; i<count ; i++) { 4294342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh const Sensor& sensor(mUserSensorList[i]); 4304342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh if (sensor.getHandle() == handle) { 4314342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh return sensor.getType(); 4324342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh } 4334342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh } 4344342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh return -1; 4354342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh} 4364342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh 4374342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh 438fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianVector<Sensor> SensorService::getSensorList() 439fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 44033264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian char value[PROPERTY_VALUE_MAX]; 44133264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian property_get("debug.sensors", value, "0"); 44233264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian if (atoi(value)) { 44333264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian return mUserSensorListDebug; 44433264868ba0aaccb9d4b5e5a067a79a43633f6ecMathias Agopian } 445010e42230135815907e76e5d7e5f30edf9e1799dMathias Agopian return mUserSensorList; 446fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 447fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 448fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiansp<ISensorEventConnection> SensorService::createSensorEventConnection() 449fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 4505307d17fe33fc26eeeacd6339a9fbfe96cf56873Mathias Agopian uid_t uid = IPCThreadState::self()->getCallingUid(); 4515307d17fe33fc26eeeacd6339a9fbfe96cf56873Mathias Agopian sp<SensorEventConnection> result(new SensorEventConnection(this, uid)); 452fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return result; 453fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 454fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 455db5b4bce9e65ec9c2c7762b601297e4abadbc22aMathias Agopianvoid SensorService::cleanupConnection(SensorEventConnection* c) 456fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 457fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 458db5b4bce9e65ec9c2c7762b601297e4abadbc22aMathias Agopian const wp<SensorEventConnection> connection(c); 4597c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian size_t size = mActiveSensors.size(); 460a551237de142549fb8a6608ee9d2fbf4b7ca2ebfSteve Block ALOGD_IF(DEBUG_CONNECTIONS, "%d active sensors", size); 4617c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian for (size_t i=0 ; i<size ; ) { 462db5b4bce9e65ec9c2c7762b601297e4abadbc22aMathias Agopian int handle = mActiveSensors.keyAt(i); 463db5b4bce9e65ec9c2c7762b601297e4abadbc22aMathias Agopian if (c->hasSensor(handle)) { 464a551237de142549fb8a6608ee9d2fbf4b7ca2ebfSteve Block ALOGD_IF(DEBUG_CONNECTIONS, "%i: disabling handle=0x%08x", i, handle); 465f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian SensorInterface* sensor = mSensorMap.valueFor( handle ); 466f5a1230d322c14c42331d0a1536b50c87742973bSteve Block ALOGE_IF(!sensor, "mSensorMap[handle=0x%08x] is null!", handle); 467f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (sensor) { 468db5b4bce9e65ec9c2c7762b601297e4abadbc22aMathias Agopian sensor->activate(c, false); 469f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 470db5b4bce9e65ec9c2c7762b601297e4abadbc22aMathias Agopian } 471db5b4bce9e65ec9c2c7762b601297e4abadbc22aMathias Agopian SensorRecord* rec = mActiveSensors.valueAt(i); 472f5a1230d322c14c42331d0a1536b50c87742973bSteve Block ALOGE_IF(!rec, "mActiveSensors[%d] is null (handle=0x%08x)!", i, handle); 473a551237de142549fb8a6608ee9d2fbf4b7ca2ebfSteve Block ALOGD_IF(DEBUG_CONNECTIONS, 474a1b7db95b6ccf5be9d8dfaac1b8f45494813edc0Mathias Agopian "removing connection %p for sensor[%d].handle=0x%08x", 475a1b7db95b6ccf5be9d8dfaac1b8f45494813edc0Mathias Agopian c, i, handle); 476a1b7db95b6ccf5be9d8dfaac1b8f45494813edc0Mathias Agopian 477db5b4bce9e65ec9c2c7762b601297e4abadbc22aMathias Agopian if (rec && rec->removeConnection(connection)) { 478a551237de142549fb8a6608ee9d2fbf4b7ca2ebfSteve Block ALOGD_IF(DEBUG_CONNECTIONS, "... and it was the last connection"); 4797c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian mActiveSensors.removeItemsAt(i, 1); 480f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian mActiveVirtualSensors.removeItem(handle); 4817c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian delete rec; 4827c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian size--; 4837c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } else { 4847c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian i++; 485fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 486fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 4877c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian mActiveConnections.remove(connection); 488787ac1b388f144f5e6dd38f8b807866a5256dafcMathias Agopian BatteryService::cleanup(c->getUid()); 489fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 490fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 491fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::enable(const sp<SensorEventConnection>& connection, 492fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle) 493fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 49450df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mInitCheck != NO_ERROR) 49550df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian return mInitCheck; 49650df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 497f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian SensorInterface* sensor = mSensorMap.valueFor(handle); 498ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopian if (sensor == NULL) { 499ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopian return BAD_VALUE; 500ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopian } 501ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopian 502ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopian Mutex::Autolock _l(mLock); 5034342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh SensorRecord* rec = mActiveSensors.valueFor(handle); 5044342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh if (rec == 0) { 5054342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh rec = new SensorRecord(connection); 5064342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh mActiveSensors.add(handle, rec); 5074342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh if (sensor->isVirtual()) { 5084342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh mActiveVirtualSensors.add(handle, sensor); 5093560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } 5104342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh } else { 5114342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh if (rec->addConnection(connection)) { 5124342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh // this sensor is already activated, but we are adding a 5134342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh // connection that uses it. Immediately send down the last 5144342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh // known value of the requested sensor if it's not a 5154342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh // "continuous" sensor. 5164342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh if (sensor->getSensor().getMinDelay() == 0) { 5174342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh sensors_event_t scratch; 5184342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh sensors_event_t& event(mLastEventSeen.editValueFor(handle)); 5194342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh if (event.version == sizeof(sensors_event_t)) { 5204342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh connection->sendEvents(&event, 1); 521f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian } 5227c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 523fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 524fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 5254342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh 5264342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh if (connection->addSensor(handle)) { 5274342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh BatteryService::enableSensor(connection->getUid(), handle); 5284342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh // the sensor was added (which means it wasn't already there) 5294342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh // so, see if this connection becomes active 5304342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh if (mActiveConnections.indexOf(connection) < 0) { 5314342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh mActiveConnections.add(connection); 5324342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh } 5334342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh } else { 5344342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh ALOGW("sensor %08x already enabled in connection %p (ignoring)", 5354342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh handle, connection.get()); 5364342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh } 5374342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh 5384342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh // we are setup, now enable the sensor. 539ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopian status_t err = sensor->activate(connection.get(), true); 5404342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh if (err != NO_ERROR) { 5414342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh // enable has failed, reset our state. 542ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopian cleanupWithoutDisableLocked(connection, handle); 5434342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh } 544fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return err; 545fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 546fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 547fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::disable(const sp<SensorEventConnection>& connection, 548fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle) 549fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 55050df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mInitCheck != NO_ERROR) 55150df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian return mInitCheck; 55250df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 553ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopian Mutex::Autolock _l(mLock); 554ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopian status_t err = cleanupWithoutDisableLocked(connection, handle); 5554342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh if (err == NO_ERROR) { 5564342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh SensorInterface* sensor = mSensorMap.valueFor(handle); 5574342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh err = sensor ? sensor->activate(connection.get(), false) : status_t(BAD_VALUE); 5584342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh } 5594342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh return err; 5604342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh} 5614342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh 562ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopianstatus_t SensorService::cleanupWithoutDisable( 563ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopian const sp<SensorEventConnection>& connection, int handle) { 564fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Mutex::Autolock _l(mLock); 565ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopian return cleanupWithoutDisableLocked(connection, handle); 566ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopian} 567ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopian 568ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopianstatus_t SensorService::cleanupWithoutDisableLocked( 569ac9a96da65f6eae4513654adaad8a457d1c1575cMathias Agopian const sp<SensorEventConnection>& connection, int handle) { 570fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian SensorRecord* rec = mActiveSensors.valueFor(handle); 571fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (rec) { 572fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // see if this connection becomes inactive 573787ac1b388f144f5e6dd38f8b807866a5256dafcMathias Agopian if (connection->removeSensor(handle)) { 574787ac1b388f144f5e6dd38f8b807866a5256dafcMathias Agopian BatteryService::disableSensor(connection->getUid(), handle); 575787ac1b388f144f5e6dd38f8b807866a5256dafcMathias Agopian } 576fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (connection->hasAnySensor() == false) { 577fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveConnections.remove(connection); 578fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 579fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // see if this sensor becomes inactive 580fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (rec->removeConnection(connection)) { 581fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mActiveSensors.removeItem(handle); 582f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian mActiveVirtualSensors.removeItem(handle); 583fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian delete rec; 584fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 5854342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh return NO_ERROR; 5867c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 5874342fdf14ffb792a36c1de25ad14b745df628da2Jaikumar Ganesh return BAD_VALUE; 588fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 589fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 5907c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianstatus_t SensorService::setEventRate(const sp<SensorEventConnection>& connection, 591fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle, nsecs_t ns) 592fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 59350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian if (mInitCheck != NO_ERROR) 59450df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian return mInitCheck; 59550df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian 596ae09d65f5b35cb51da2e1386a6dd7a52085f1325Mathias Agopian SensorInterface* sensor = mSensorMap.valueFor(handle); 597ae09d65f5b35cb51da2e1386a6dd7a52085f1325Mathias Agopian if (!sensor) 598ae09d65f5b35cb51da2e1386a6dd7a52085f1325Mathias Agopian return BAD_VALUE; 599ae09d65f5b35cb51da2e1386a6dd7a52085f1325Mathias Agopian 6001cd700015318727d6d42236ab6274f1949fb08baMathias Agopian if (ns < 0) 6011cd700015318727d6d42236ab6274f1949fb08baMathias Agopian return BAD_VALUE; 6021cd700015318727d6d42236ab6274f1949fb08baMathias Agopian 60362569ecf526c7c01cb68ea461c6bbd3cb26057d2Mathias Agopian nsecs_t minDelayNs = sensor->getSensor().getMinDelayNs(); 60462569ecf526c7c01cb68ea461c6bbd3cb26057d2Mathias Agopian if (ns < minDelayNs) { 60562569ecf526c7c01cb68ea461c6bbd3cb26057d2Mathias Agopian ns = minDelayNs; 606ae09d65f5b35cb51da2e1386a6dd7a52085f1325Mathias Agopian } 607ae09d65f5b35cb51da2e1386a6dd7a52085f1325Mathias Agopian 6087c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian if (ns < MINIMUM_EVENTS_PERIOD) 6097c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian ns = MINIMUM_EVENTS_PERIOD; 6101cd700015318727d6d42236ab6274f1949fb08baMathias Agopian 611f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian return sensor->setDelay(connection.get(), handle, ns); 612fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 613fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 614fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 615fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 616fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorRecord::SensorRecord( 617fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const sp<SensorEventConnection>& connection) 618fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 619fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.add(connection); 620fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 621fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 6227c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorRecord::addConnection( 623fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const sp<SensorEventConnection>& connection) 624fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 625fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (mConnections.indexOf(connection) < 0) { 626fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.add(connection); 6277c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return true; 628fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 6297c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return false; 630fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 631fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 632fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorRecord::removeConnection( 633fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian const wp<SensorEventConnection>& connection) 634fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 635fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian ssize_t index = mConnections.indexOf(connection); 636fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (index >= 0) { 637fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mConnections.removeItemsAt(index, 1); 638fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 639fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mConnections.size() ? false : true; 640fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 641fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 642fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 643fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 644fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorEventConnection::SensorEventConnection( 6455307d17fe33fc26eeeacd6339a9fbfe96cf56873Mathias Agopian const sp<SensorService>& service, uid_t uid) 6465307d17fe33fc26eeeacd6339a9fbfe96cf56873Mathias Agopian : mService(service), mChannel(new BitTube()), mUid(uid) 647fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 648fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 649fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 650fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias AgopianSensorService::SensorEventConnection::~SensorEventConnection() 651fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 652a551237de142549fb8a6608ee9d2fbf4b7ca2ebfSteve Block ALOGD_IF(DEBUG_CONNECTIONS, "~SensorEventConnection(%p)", this); 653fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mService->cleanupConnection(this); 654fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 655fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 656fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianvoid SensorService::SensorEventConnection::onFirstRef() 657fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 658fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 659fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 6607c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorEventConnection::addSensor(int32_t handle) { 66171d7a5c289c6ef6b5fc86dd4784a075ca6470e38Mathias Agopian Mutex::Autolock _l(mConnectionLock); 662a5b8e8bfa9f3416ce61ee08162fb139afde60488Mathias Agopian if (mSensorInfo.indexOf(handle) < 0) { 663f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian mSensorInfo.add(handle); 6647c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return true; 665fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 6667c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return false; 667fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 668fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 6697c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopianbool SensorService::SensorEventConnection::removeSensor(int32_t handle) { 67071d7a5c289c6ef6b5fc86dd4784a075ca6470e38Mathias Agopian Mutex::Autolock _l(mConnectionLock); 671f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (mSensorInfo.remove(handle) >= 0) { 6727c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return true; 6737c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian } 6747c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return false; 675fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 676fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 677fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorEventConnection::hasSensor(int32_t handle) const { 67871d7a5c289c6ef6b5fc86dd4784a075ca6470e38Mathias Agopian Mutex::Autolock _l(mConnectionLock); 679f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian return mSensorInfo.indexOf(handle) >= 0; 680fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 681fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 682fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianbool SensorService::SensorEventConnection::hasAnySensor() const { 68371d7a5c289c6ef6b5fc86dd4784a075ca6470e38Mathias Agopian Mutex::Autolock _l(mConnectionLock); 6847c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return mSensorInfo.size() ? true : false; 6857c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian} 6867c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian 687fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::sendEvents( 688cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian sensors_event_t const* buffer, size_t numEvents, 689cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian sensors_event_t* scratch) 690fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 691cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian // filter out events not for this connection 6923560fb24b668675627934356f210d84d19bf4e56Mathias Agopian size_t count = 0; 6933560fb24b668675627934356f210d84d19bf4e56Mathias Agopian if (scratch) { 69471d7a5c289c6ef6b5fc86dd4784a075ca6470e38Mathias Agopian Mutex::Autolock _l(mConnectionLock); 6953560fb24b668675627934356f210d84d19bf4e56Mathias Agopian size_t i=0; 6963560fb24b668675627934356f210d84d19bf4e56Mathias Agopian while (i<numEvents) { 6973560fb24b668675627934356f210d84d19bf4e56Mathias Agopian const int32_t curr = buffer[i].sensor; 698f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian if (mSensorInfo.indexOf(curr) >= 0) { 6993560fb24b668675627934356f210d84d19bf4e56Mathias Agopian do { 7003560fb24b668675627934356f210d84d19bf4e56Mathias Agopian scratch[count++] = buffer[i++]; 7013560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } while ((i<numEvents) && (buffer[i].sensor == curr)); 7023560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } else { 7033560fb24b668675627934356f210d84d19bf4e56Mathias Agopian i++; 7043560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } 705cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian } 7063560fb24b668675627934356f210d84d19bf4e56Mathias Agopian } else { 7073560fb24b668675627934356f210d84d19bf4e56Mathias Agopian scratch = const_cast<sensors_event_t *>(buffer); 7083560fb24b668675627934356f210d84d19bf4e56Mathias Agopian count = numEvents; 709cf51001dbf28e9885fcacd4048902f1c75768fe9Mathias Agopian } 710fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 711907103bf186cfdd2ed9eb3b6c36de53ade7b16f6Mathias Agopian // NOTE: ASensorEvent and sensors_event_t are the same type 712907103bf186cfdd2ed9eb3b6c36de53ade7b16f6Mathias Agopian ssize_t size = SensorEventQueue::write(mChannel, 713907103bf186cfdd2ed9eb3b6c36de53ade7b16f6Mathias Agopian reinterpret_cast<ASensorEvent const*>(scratch), count); 714fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (size == -EAGAIN) { 715fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // the destination doesn't accept events anymore, it's probably 716fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // full. For now, we just drop the events on the floor. 7173c20fbed7f3a916ced10f2ed5a272271b7d81edeSteve Block //ALOGW("dropping %d events on the floor", count); 718fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return size; 719fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 720fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 7211e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown return size < 0 ? status_t(size) : status_t(NO_ERROR); 722fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 723fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 724b3989276d17f2b083bec67b695d1078fb86c6c53Mathias Agopiansp<BitTube> SensorService::SensorEventConnection::getSensorChannel() const 725fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 726fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return mChannel; 727fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 728fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 729fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::enableDisable( 730fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle, bool enabled) 731fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 732fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian status_t err; 733fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (enabled) { 734fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = mService->enable(this, handle); 735fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } else { 736fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian err = mService->disable(this, handle); 737fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 738fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return err; 739fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 740fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 741fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianstatus_t SensorService::SensorEventConnection::setEventRate( 742fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian int handle, nsecs_t ns) 743fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 7447c1c531872a95051cb11ec829e3daf890d9bb58aMathias Agopian return mService->setEventRate(this, handle, ns); 745fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 746fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 747fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 748fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}; // namespace android 749fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 750