SensorService.cpp revision 30d6fd6b28aeacfe06ddc7adaac34e8a0032df40
166516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey/*
266516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey * Copyright (C) 2010 The Android Open Source Project
366516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey *
466516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
566516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey * you may not use this file except in compliance with the License.
666516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey * You may obtain a copy of the License at
766516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey *
866516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
966516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey *
1066516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey * Unless required by applicable law or agreed to in writing, software
1166516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
1266516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1366516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey * See the License for the specific language governing permissions and
1466516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey * limitations under the License.
1566516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey */
1666516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey
1766516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey#include <inttypes.h>
1866516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey#include <math.h>
19c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey#include <stdint.h>
20c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey#include <sys/types.h>
2166516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey
2266516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey#include <cutils/properties.h>
2366516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey
24a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey#include <utils/SortedVector.h>
2566516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey#include <utils/KeyedVector.h>
2654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey#include <utils/threads.h>
27a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey#include <utils/Atomic.h>
2854ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey#include <utils/Errors.h>
2954ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey#include <utils/RefBase.h>
30c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey#include <utils/Singleton.h>
3166516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey#include <utils/String16.h>
32c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey
334ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey#include <binder/BinderService.h>
349fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey#include <binder/IServiceManager.h>
3566516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey#include <binder/PermissionCache.h>
3666516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey
3766516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey#include <gui/ISensorServer.h>
3866516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey#include <gui/ISensorEventConnection.h>
3966516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey#include <gui/SensorEventQueue.h>
40c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey
4166516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey#include <hardware/sensors.h>
4266516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey#include <hardware_legacy/power.h>
4366516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey
4466516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey#include "BatteryService.h"
4566516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey#include "CorrectedGyroSensor.h"
46348ad6866b91afa4d59d45df533ef88094c74d13Jeff Sharkey#include "GravitySensor.h"
47ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey#include "LinearAccelerationSensor.h"
48ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey#include "OrientationSensor.h"
496efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey#include "RotationVectorSensor.h"
5066516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey#include "SensorFusion.h"
51a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey#include "SensorService.h"
526efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
53aeb16e2435f9975b9fa1fc4b747796647a21292eJeff Sharkeynamespace android {
5454ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey// ---------------------------------------------------------------------------
55e6585b32ea586743258a5457e2184ffc087f2d2fKenny Root
5666516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey/*
5766516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey * Notes:
5866516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey *
5966516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey * - what about a gyro-corrected magnetic-field sensor?
6066516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey * - run mag sensor from time to time to force calibration
6166516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey * - gravity sensor length is wrong (=> drift in linear-acc sensor)
6266516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey *
636efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey */
6466516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey
65a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkeyconst char* SensorService::WAKE_LOCK_NAME = "SensorService";
66a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
6754ca29a5b94c2edf461c5433825d4ae17469fd7cJeff SharkeySensorService::SensorService()
6854ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey    : mInitCheck(NO_INIT)
6954ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey{
7054ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey}
7154ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey
7254ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkeyvoid SensorService::onFirstRef()
7366516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey{
7454ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey    ALOGD("nuSensorService starting...");
7566516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey
7666516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey    SensorDevice& dev(SensorDevice::getInstance());
7766516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey
7866516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey    if (dev.initCheck() == NO_ERROR) {
7966516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey        sensor_t const* list;
8066516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey        ssize_t count = dev.getSensorList(&list);
8166516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey        if (count > 0) {
8266516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey            ssize_t orientationIndex = -1;
8366516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey            bool hasGyro = false;
8466516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey            uint32_t virtualSensorsNeeds =
8566516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                    (1<<SENSOR_TYPE_GRAVITY) |
8666516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                    (1<<SENSOR_TYPE_LINEAR_ACCELERATION) |
8766516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                    (1<<SENSOR_TYPE_ROTATION_VECTOR);
8866516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey
8966516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey            mLastEventSeen.setCapacity(count);
9066516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey            for (ssize_t i=0 ; i<count ; i++) {
9166516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                registerSensor( new HardwareSensor(list[i]) );
9266516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                switch (list[i].type) {
9328c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey                    case SENSOR_TYPE_ORIENTATION:
9466516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                        orientationIndex = i;
9566516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                        break;
9666516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                    case SENSOR_TYPE_GYROSCOPE:
9766516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                    case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED:
989fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                        hasGyro = true;
99a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                        break;
100a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                    case SENSOR_TYPE_GRAVITY:
101a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                    case SENSOR_TYPE_LINEAR_ACCELERATION:
102a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                    case SENSOR_TYPE_ROTATION_VECTOR:
103a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                        virtualSensorsNeeds &= ~(1<<list[i].type);
104a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                        break;
105a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                }
106a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            }
107a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
108a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            // it's safe to instantiate the SensorFusion object here
109a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            // (it wants to be instantiated after h/w sensors have been
110a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            // registered)
111a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            const SensorFusion& fusion(SensorFusion::getInstance());
112a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
113a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            // build the sensor list returned to users
114a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            mUserSensorList = mSensorList;
115a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
116a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            if (hasGyro) {
117a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                Sensor aSensor;
118a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
1196efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                // Add Android virtual sensors if they're not already
120a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                // available in the HAL
121a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
122a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                aSensor = registerVirtualSensor( new RotationVectorSensor() );
123a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                if (virtualSensorsNeeds & (1<<SENSOR_TYPE_ROTATION_VECTOR)) {
124a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                    mUserSensorList.add(aSensor);
125a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                }
126a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
127a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                aSensor = registerVirtualSensor( new GravitySensor(list, count) );
128a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                if (virtualSensorsNeeds & (1<<SENSOR_TYPE_GRAVITY)) {
129a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                    mUserSensorList.add(aSensor);
130a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                }
131a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
132a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                aSensor = registerVirtualSensor( new LinearAccelerationSensor(list, count) );
133a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey                if (virtualSensorsNeeds & (1<<SENSOR_TYPE_LINEAR_ACCELERATION)) {
13488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey                    mUserSensorList.add(aSensor);
13588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey                }
136669f8e7c70c595964a1c9ca154ac123da84d99a1Jeff Sharkey
137669f8e7c70c595964a1c9ca154ac123da84d99a1Jeff Sharkey                aSensor = registerVirtualSensor( new OrientationSensor() );
1389fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                if (virtualSensorsNeeds & (1<<SENSOR_TYPE_ROTATION_VECTOR)) {
139669f8e7c70c595964a1c9ca154ac123da84d99a1Jeff Sharkey                    // if we are doing our own rotation-vector, also add
1409fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                    // the orientation sensor and remove the HAL provided one.
141348ad6866b91afa4d59d45df533ef88094c74d13Jeff Sharkey                    mUserSensorList.replaceAt(aSensor, orientationIndex);
142348ad6866b91afa4d59d45df533ef88094c74d13Jeff Sharkey                }
143c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey
144c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey                // virtual debugging sensors are not added to mUserSensorList
145c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey                registerVirtualSensor( new CorrectedGyroSensor(list, count) );
146c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey                registerVirtualSensor( new GyroDriftSensor() );
147c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey            }
148c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey
149c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey            // debugging sensor list
150a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            mUserSensorListDebug = mSensorList;
15128c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey
15228c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey            mSocketBufferSize = SOCKET_BUFFER_SIZE_NON_BATCHED;
15328c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey            FILE *fp = fopen("/proc/sys/net/core/wmem_max", "r");
15428c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey            char line[128];
15528c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey            if (fp != NULL && fgets(line, sizeof(line), fp) != NULL) {
15628c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey                line[sizeof(line) - 1] = '\0';
15728c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey                sscanf(line, "%zu", &mSocketBufferSize);
15828c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey                if (mSocketBufferSize > MAX_SOCKET_BUFFER_SIZE_BATCHED) {
159a82c2e24bc226c123075331cdaafb171b3b07b85Jeff Sharkey                    mSocketBufferSize = MAX_SOCKET_BUFFER_SIZE_BATCHED;
160a82c2e24bc226c123075331cdaafb171b3b07b85Jeff Sharkey                }
161e6585b32ea586743258a5457e2184ffc087f2d2fKenny Root            }
162a82c2e24bc226c123075331cdaafb171b3b07b85Jeff Sharkey            ALOGD("Max socket buffer size %u", mSocketBufferSize);
163a82c2e24bc226c123075331cdaafb171b3b07b85Jeff Sharkey            if (fp) {
164a82c2e24bc226c123075331cdaafb171b3b07b85Jeff Sharkey                fclose(fp);
16528c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey            }
16628c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey
1679fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            run("SensorService", PRIORITY_URGENT_DISPLAY);
1689fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            mInitCheck = NO_ERROR;
169c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey        }
170c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey    }
171c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey}
172c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey
173c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff SharkeySensor SensorService::registerSensor(SensorInterface* s)
174c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey{
175c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey    sensors_event_t event;
17666516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey    memset(&event, 0, sizeof(event));
17766516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey
17866516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey    const Sensor sensor(s->getSensor());
17954ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey    // add to the sensor list (returned to clients)
1806efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    mSensorList.add(sensor);
1816efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    // add to our handle->SensorInterface mapping
1826efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    mSensorMap.add(sensor.getHandle(), s);
1836efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    // create an entry in the mLastEventSeen array
1846efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    mLastEventSeen.add(sensor.getHandle(), event);
18554ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey
18654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey    return sensor;
18754ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey}
18866516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey
18966516697a29cf00d93893a1011d3befc7c1ee37fJeff SharkeySensor SensorService::registerVirtualSensor(SensorInterface* s)
19066516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey{
191c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey    Sensor sensor = registerSensor(s);
192c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey    mVirtualSensorList.add( s );
193c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey    return sensor;
194c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey}
195c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey
196c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff SharkeySensorService::~SensorService()
197c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey{
198c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey    for (size_t i=0 ; i<mSensorMap.size() ; i++)
199c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey        delete mSensorMap.valueAt(i);
200c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey}
201c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey
202c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkeystatic const String16 sDump("android.permission.DUMP");
203c24bbd4ce525d80e385de6e27b19dac239db1dfdJeff Sharkey
2046efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkeystatus_t SensorService::dump(int fd, const Vector<String16>& /*args*/)
2056efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey{
2066efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    String8 result;
2076efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    if (!PermissionCache::checkCallingPermission(sDump)) {
2086efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        result.appendFormat("Permission Denial: "
20966516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                "can't dump SurfaceFlinger from pid=%d, uid=%d\n",
21066516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                IPCThreadState::self()->getCallingPid(),
2116efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                IPCThreadState::self()->getCallingUid());
21266516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey    } else {
2136efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        Mutex::Autolock _l(mLock);
2146efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        result.append("Sensor List:\n");
21566516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey        for (size_t i=0 ; i<mSensorList.size() ; i++) {
2166efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            const Sensor& s(mSensorList[i]);
2176efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            const sensors_event_t& e(mLastEventSeen.valueFor(s.getHandle()));
2186efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            result.appendFormat(
2196efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    "%-48s| %-32s | 0x%08x | ",
2206efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    s.getName().string(),
2216efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    s.getVendor().string(),
22266516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                    s.getHandle());
2236efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
2246efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            if (s.getMinDelay() > 0) {
2256efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                result.appendFormat(
2266efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    "maxRate=%7.2fHz | ", 1e6f / s.getMinDelay());
2276efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            } else {
2286efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                result.append(s.getMinDelay() == 0
2296efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                        ? "on-demand         | "
2306efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                        : "one-shot          | ");
2316efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            }
2326efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            if (s.getFifoMaxEventCount() > 0) {
23366516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                result.appendFormat("getFifoMaxEventCount=%d events | ", s.getFifoMaxEventCount());
23466516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey            } else {
23566516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                result.append("no batching support | ");
23666516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey            }
2376efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
238aeb16e2435f9975b9fa1fc4b747796647a21292eJeff Sharkey            switch (s.getType()) {
23966516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                case SENSOR_TYPE_ROTATION_VECTOR:
24066516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                case SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR:
2416efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    result.appendFormat(
2426efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                            "last=<%5.1f,%5.1f,%5.1f,%5.1f,%5.1f>\n",
2436efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                            e.data[0], e.data[1], e.data[2], e.data[3], e.data[4]);
2449fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                    break;
2459fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED:
2469fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED:
2479fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                    result.appendFormat(
2489fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                            "last=<%5.1f,%5.1f,%5.1f,%5.1f,%5.1f,%5.1f>\n",
2494ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey                            e.data[0], e.data[1], e.data[2], e.data[3], e.data[4], e.data[5]);
2506efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    break;
2516efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                case SENSOR_TYPE_GAME_ROTATION_VECTOR:
25266516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                    result.appendFormat(
2536efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                            "last=<%5.1f,%5.1f,%5.1f,%5.1f>\n",
2546efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                            e.data[0], e.data[1], e.data[2], e.data[3]);
2556efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    break;
25666516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                case SENSOR_TYPE_SIGNIFICANT_MOTION:
25766516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                case SENSOR_TYPE_STEP_DETECTOR:
25866516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                    result.appendFormat( "last=<%f>\n", e.data[0]);
2596efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    break;
2606efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                case SENSOR_TYPE_STEP_COUNTER:
26166516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                    result.appendFormat( "last=<%" PRIu64 ">\n", e.u64.step_counter);
26266516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                    break;
26366516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                default:
2646efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    // default to 3 values
2656efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    result.appendFormat(
2666efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                            "last=<%5.1f,%5.1f,%5.1f>\n",
2676efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                            e.data[0], e.data[1], e.data[2]);
2686efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    break;
2696efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            }
27054ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        }
27154ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        SensorFusion::getInstance().dump(result);
27254ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        SensorDevice::getInstance().dump(result);
2736efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
27454ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        result.append("Active sensors:\n");
27554ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        for (size_t i=0 ; i<mActiveSensors.size() ; i++) {
27654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            int handle = mActiveSensors.keyAt(i);
27754ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            result.appendFormat("%s (handle=0x%08x, connections=%zu)\n",
2786efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    getSensorName(handle).string(),
27954ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey                    handle,
28054ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey                    mActiveSensors.valueAt(i)->getNumConnections());
28154ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        }
28254ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey
28354ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        result.appendFormat("%zu Max Socket Buffer size\n", mSocketBufferSize);
28454ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        result.appendFormat("%zd active connections\n", mActiveConnections.size());
2856efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
28654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        for (size_t i=0 ; i < mActiveConnections.size() ; i++) {
2876efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            sp<SensorEventConnection> connection(mActiveConnections[i].promote());
2886efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            if (connection != 0) {
2896efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                result.appendFormat("Connection Number: %zu \n", i);
29054ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey                connection->dump(result);
2916efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            }
2926efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        }
2936efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    }
2946efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    write(fd, result.string(), result.size());
2956efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    return NO_ERROR;
29654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey}
2976efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
2986efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkeyvoid SensorService::cleanupAutoDisabledSensor(const sp<SensorEventConnection>& connection,
29966516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey        sensors_event_t const* buffer, const int count) {
300ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    SensorInterface* sensor;
3016efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    status_t err = NO_ERROR;
3026efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    for (int i=0 ; i<count ; i++) {
3036efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        int handle = buffer[i].sensor;
3046efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        int type = buffer[i].type;
3056efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        if (type == SENSOR_TYPE_SIGNIFICANT_MOTION) {
3066efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            if (connection->hasSensor(handle)) {
3076efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                sensor = mSensorMap.valueFor(handle);
3086efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                if (sensor != NULL) {
3096efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    sensor->autoDisable(connection.get(), handle);
3106efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                }
3116efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                cleanupWithoutDisable(connection, handle);
3126efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            }
3136efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        }
3146efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    }
3155545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey}
3166efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
3175545f56f7561810187545a1817b6001dd1f9931bJeff Sharkeybool SensorService::threadLoop()
3186efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey{
3196efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    ALOGD("nuSensorService thread starting...");
3206efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
3216efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    // each virtual sensor could generate an event per "real" event, that's why we need
3226efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    // to size numEventMax much smaller than MAX_RECEIVE_BUFFER_EVENT_COUNT.
3236efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    // in practice, this is too aggressive, but guaranteed to be enough.
3246efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    const size_t minBufferSize = SensorEventQueue::MAX_RECEIVE_BUFFER_EVENT_COUNT;
3256efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    const size_t numEventMax = minBufferSize / (1 + mVirtualSensorList.size());
3266efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
3276efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    sensors_event_t buffer[minBufferSize];
3286efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    sensors_event_t scratch[minBufferSize];
3296efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    SensorDevice& device(SensorDevice::getInstance());
3306efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    const size_t vcount = mVirtualSensorList.size();
3316efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
3326efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    ssize_t count;
3336efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    bool wakeLockAcquired = false;
3346efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    const int halVersion = device.getHalDeviceVersion();
33566516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey    do {
33666516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey        count = device.poll(buffer, numEventMax);
33754ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        if (count<0) {
33854ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            ALOGE("sensor poll failed (%s)", strerror(-count));
33954ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            break;
34054ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        }
34154ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey
3426efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        // Poll has returned. Hold a wakelock.
3436efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        // Todo(): add a flag to the sensors definitions to indicate
34454ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        // the sensors which can wake up the AP
34554ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        for (int i = 0; i < count; i++) {
34654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            if (buffer[i].type == SENSOR_TYPE_SIGNIFICANT_MOTION) {
3476efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                 acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_NAME);
3486efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                 wakeLockAcquired = true;
3496efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                 break;
3506efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            }
3516efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        }
3526efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
3536efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey        recordLastValue(buffer, count);
3546efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
35554ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        // handle virtual sensors
35654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        if (count && vcount) {
35754ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey            sensors_event_t const * const event = buffer;
3586efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            const DefaultKeyedVector<int, SensorInterface*> virtualSensors(
35954ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey                    getActiveVirtualSensors());
3606efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            const size_t activeVirtualSensorCount = virtualSensors.size();
3616efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey            if (activeVirtualSensorCount) {
3626efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                size_t k = 0;
3636efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                SensorFusion& fusion(SensorFusion::getInstance());
3646efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                if (fusion.isEnabled()) {
36566516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                    for (size_t i=0 ; i<size_t(count) ; i++) {
3666efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                        fusion.process(event[i]);
3676efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    }
3686efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                }
3696efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                for (size_t i=0 ; i<size_t(count) && k<minBufferSize ; i++) {
3706efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    for (size_t j=0 ; j<activeVirtualSensorCount ; j++) {
3716efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                        if (count + k >= minBufferSize) {
3726efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                            ALOGE("buffer too small to hold all events: "
3736efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                                    "count=%u, k=%u, size=%u",
3746efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                                    count, k, minBufferSize);
3756efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                            break;
3766efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                        }
3776efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                        sensors_event_t out;
3786efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                        SensorInterface* si = virtualSensors.valueAt(j);
3796efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                        if (si->process(&out, event[i])) {
3806efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                            buffer[count + k] = out;
3816efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                            k++;
3826efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                        }
38354ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey                    }
38466516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                }
3856efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                if (k) {
3866efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    // record the last synthesized values
3876efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    recordLastValue(&buffer[count], k);
3886efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    count += k;
3896efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                    // sort the buffer by time-stamps
39066516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey                    sortEventBuffer(buffer, count);
391aeb16e2435f9975b9fa1fc4b747796647a21292eJeff Sharkey                }
392ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey            }
393aeb16e2435f9975b9fa1fc4b747796647a21292eJeff Sharkey        }
394ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey
395ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey        // handle backward compatibility for RotationVector sensor
396aeb16e2435f9975b9fa1fc4b747796647a21292eJeff Sharkey        if (halVersion < SENSORS_DEVICE_API_VERSION_1_0) {
397aeb16e2435f9975b9fa1fc4b747796647a21292eJeff Sharkey            for (int i = 0; i < count; i++) {
398aeb16e2435f9975b9fa1fc4b747796647a21292eJeff Sharkey                if (buffer[i].type == SENSOR_TYPE_ROTATION_VECTOR) {
399ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey                    // All the 4 components of the quaternion should be available
400aeb16e2435f9975b9fa1fc4b747796647a21292eJeff Sharkey                    // No heading accuracy. Set it to -1
401aeb16e2435f9975b9fa1fc4b747796647a21292eJeff Sharkey                    buffer[i].data[4] = -1;
402aeb16e2435f9975b9fa1fc4b747796647a21292eJeff Sharkey                }
40366516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey            }
404        }
405
406        // send our events to clients...
407        const SortedVector< wp<SensorEventConnection> > activeConnections(
408                getActiveConnections());
409        size_t numConnections = activeConnections.size();
410        for (size_t i=0 ; i<numConnections ; i++) {
411            sp<SensorEventConnection> connection(
412                    activeConnections[i].promote());
413            if (connection != 0) {
414                connection->sendEvents(buffer, count, scratch);
415                // Some sensors need to be auto disabled after the trigger
416                cleanupAutoDisabledSensor(connection, buffer, count);
417            }
418        }
419
420        // We have read the data, upper layers should hold the wakelock.
421        if (wakeLockAcquired) release_wake_lock(WAKE_LOCK_NAME);
422    } while (count >= 0 || Thread::exitPending());
423
424    ALOGW("Exiting SensorService::threadLoop => aborting...");
425    abort();
426    return false;
427}
428
429void SensorService::recordLastValue(
430        const sensors_event_t* buffer, size_t count) {
431    Mutex::Autolock _l(mLock);
432    const sensors_event_t* last = NULL;
433    for (size_t i = 0; i < count; i++) {
434        const sensors_event_t* event = &buffer[i];
435        if (event->type != SENSOR_TYPE_META_DATA) {
436            if (last && event->sensor != last->sensor) {
437                mLastEventSeen.editValueFor(last->sensor) = *last;
438            }
439            last = event;
440        }
441    }
442    if (last) {
443        mLastEventSeen.editValueFor(last->sensor) = *last;
444    }
445}
446
447void SensorService::sortEventBuffer(sensors_event_t* buffer, size_t count)
448{
449    struct compar {
450        static int cmp(void const* lhs, void const* rhs) {
451            sensors_event_t const* l = static_cast<sensors_event_t const*>(lhs);
452            sensors_event_t const* r = static_cast<sensors_event_t const*>(rhs);
453            return l->timestamp - r->timestamp;
454        }
455    };
456    qsort(buffer, count, sizeof(sensors_event_t), compar::cmp);
457}
458
459SortedVector< wp<SensorService::SensorEventConnection> >
460SensorService::getActiveConnections() const
461{
462    Mutex::Autolock _l(mLock);
463    return mActiveConnections;
464}
465
466DefaultKeyedVector<int, SensorInterface*>
467SensorService::getActiveVirtualSensors() const
468{
469    Mutex::Autolock _l(mLock);
470    return mActiveVirtualSensors;
471}
472
473String8 SensorService::getSensorName(int handle) const {
474    size_t count = mUserSensorList.size();
475    for (size_t i=0 ; i<count ; i++) {
476        const Sensor& sensor(mUserSensorList[i]);
477        if (sensor.getHandle() == handle) {
478            return sensor.getName();
479        }
480    }
481    String8 result("unknown");
482    return result;
483}
484
485bool SensorService::isVirtualSensor(int handle) const {
486    SensorInterface* sensor = mSensorMap.valueFor(handle);
487    return sensor->isVirtual();
488}
489
490Vector<Sensor> SensorService::getSensorList()
491{
492    char value[PROPERTY_VALUE_MAX];
493    property_get("debug.sensors", value, "0");
494    if (atoi(value)) {
495        return mUserSensorListDebug;
496    }
497    return mUserSensorList;
498}
499
500sp<ISensorEventConnection> SensorService::createSensorEventConnection()
501{
502    uid_t uid = IPCThreadState::self()->getCallingUid();
503    sp<SensorEventConnection> result(new SensorEventConnection(this, uid));
504    return result;
505}
506
507void SensorService::cleanupConnection(SensorEventConnection* c)
508{
509    Mutex::Autolock _l(mLock);
510    const wp<SensorEventConnection> connection(c);
511    size_t size = mActiveSensors.size();
512    ALOGD_IF(DEBUG_CONNECTIONS, "%d active sensors", size);
513    for (size_t i=0 ; i<size ; ) {
514        int handle = mActiveSensors.keyAt(i);
515        if (c->hasSensor(handle)) {
516            ALOGD_IF(DEBUG_CONNECTIONS, "%i: disabling handle=0x%08x", i, handle);
517            SensorInterface* sensor = mSensorMap.valueFor( handle );
518            ALOGE_IF(!sensor, "mSensorMap[handle=0x%08x] is null!", handle);
519            if (sensor) {
520                sensor->activate(c, false);
521            }
522        }
523        SensorRecord* rec = mActiveSensors.valueAt(i);
524        ALOGE_IF(!rec, "mActiveSensors[%d] is null (handle=0x%08x)!", i, handle);
525        ALOGD_IF(DEBUG_CONNECTIONS,
526                "removing connection %p for sensor[%d].handle=0x%08x",
527                c, i, handle);
528
529        if (rec && rec->removeConnection(connection)) {
530            ALOGD_IF(DEBUG_CONNECTIONS, "... and it was the last connection");
531            mActiveSensors.removeItemsAt(i, 1);
532            mActiveVirtualSensors.removeItem(handle);
533            delete rec;
534            size--;
535        } else {
536            i++;
537        }
538    }
539    mActiveConnections.remove(connection);
540    BatteryService::cleanup(c->getUid());
541}
542
543status_t SensorService::enable(const sp<SensorEventConnection>& connection,
544        int handle, nsecs_t samplingPeriodNs,  nsecs_t maxBatchReportLatencyNs, int reservedFlags)
545{
546    if (mInitCheck != NO_ERROR)
547        return mInitCheck;
548
549    SensorInterface* sensor = mSensorMap.valueFor(handle);
550    if (sensor == NULL) {
551        return BAD_VALUE;
552    }
553    Mutex::Autolock _l(mLock);
554    SensorRecord* rec = mActiveSensors.valueFor(handle);
555    if (rec == 0) {
556        rec = new SensorRecord(connection);
557        mActiveSensors.add(handle, rec);
558        if (sensor->isVirtual()) {
559            mActiveVirtualSensors.add(handle, sensor);
560        }
561    } else {
562        if (rec->addConnection(connection)) {
563            // this sensor is already activated, but we are adding a
564            // connection that uses it. Immediately send down the last
565            // known value of the requested sensor if it's not a
566            // "continuous" sensor.
567            if (sensor->getSensor().getMinDelay() == 0) {
568                sensors_event_t scratch;
569                sensors_event_t& event(mLastEventSeen.editValueFor(handle));
570                if (event.version == sizeof(sensors_event_t)) {
571                    connection->sendEvents(&event, 1);
572                }
573            }
574        }
575    }
576
577    if (connection->addSensor(handle)) {
578        BatteryService::enableSensor(connection->getUid(), handle);
579        // the sensor was added (which means it wasn't already there)
580        // so, see if this connection becomes active
581        if (mActiveConnections.indexOf(connection) < 0) {
582            mActiveConnections.add(connection);
583        }
584    } else {
585        ALOGW("sensor %08x already enabled in connection %p (ignoring)",
586            handle, connection.get());
587    }
588
589    nsecs_t minDelayNs = sensor->getSensor().getMinDelayNs();
590    if (samplingPeriodNs < minDelayNs) {
591        samplingPeriodNs = minDelayNs;
592    }
593
594    ALOGD_IF(DEBUG_CONNECTIONS, "Calling batch handle==%d flags=%d rate=%lld timeout== %lld",
595             handle, reservedFlags, samplingPeriodNs, maxBatchReportLatencyNs);
596
597    status_t err = sensor->batch(connection.get(), handle, reservedFlags, samplingPeriodNs,
598                                 maxBatchReportLatencyNs);
599    if (err == NO_ERROR) {
600        connection->setFirstFlushPending(handle, true);
601        status_t err_flush = sensor->flush(connection.get(), handle);
602        // Flush may return error if the sensor is not activated or the underlying h/w sensor does
603        // not support flush.
604        if (err_flush != NO_ERROR) {
605            connection->setFirstFlushPending(handle, false);
606        }
607    }
608
609    if (err == NO_ERROR) {
610        ALOGD_IF(DEBUG_CONNECTIONS, "Calling activate on %d", handle);
611        err = sensor->activate(connection.get(), true);
612    }
613
614    if (err != NO_ERROR) {
615        // batch/activate has failed, reset our state.
616        cleanupWithoutDisableLocked(connection, handle);
617    }
618    return err;
619}
620
621status_t SensorService::disable(const sp<SensorEventConnection>& connection,
622        int handle)
623{
624    if (mInitCheck != NO_ERROR)
625        return mInitCheck;
626
627    Mutex::Autolock _l(mLock);
628    status_t err = cleanupWithoutDisableLocked(connection, handle);
629    if (err == NO_ERROR) {
630        SensorInterface* sensor = mSensorMap.valueFor(handle);
631        err = sensor ? sensor->activate(connection.get(), false) : status_t(BAD_VALUE);
632    }
633    return err;
634}
635
636status_t SensorService::cleanupWithoutDisable(
637        const sp<SensorEventConnection>& connection, int handle) {
638    Mutex::Autolock _l(mLock);
639    return cleanupWithoutDisableLocked(connection, handle);
640}
641
642status_t SensorService::cleanupWithoutDisableLocked(
643        const sp<SensorEventConnection>& connection, int handle) {
644    SensorRecord* rec = mActiveSensors.valueFor(handle);
645    if (rec) {
646        // see if this connection becomes inactive
647        if (connection->removeSensor(handle)) {
648            BatteryService::disableSensor(connection->getUid(), handle);
649        }
650        if (connection->hasAnySensor() == false) {
651            mActiveConnections.remove(connection);
652        }
653        // see if this sensor becomes inactive
654        if (rec->removeConnection(connection)) {
655            mActiveSensors.removeItem(handle);
656            mActiveVirtualSensors.removeItem(handle);
657            delete rec;
658        }
659        return NO_ERROR;
660    }
661    return BAD_VALUE;
662}
663
664status_t SensorService::setEventRate(const sp<SensorEventConnection>& connection,
665        int handle, nsecs_t ns)
666{
667    if (mInitCheck != NO_ERROR)
668        return mInitCheck;
669
670    SensorInterface* sensor = mSensorMap.valueFor(handle);
671    if (!sensor)
672        return BAD_VALUE;
673
674    if (ns < 0)
675        return BAD_VALUE;
676
677    nsecs_t minDelayNs = sensor->getSensor().getMinDelayNs();
678    if (ns < minDelayNs) {
679        ns = minDelayNs;
680    }
681
682    return sensor->setDelay(connection.get(), handle, ns);
683}
684
685status_t SensorService::flushSensor(const sp<SensorEventConnection>& connection,
686                                    int handle) {
687  if (mInitCheck != NO_ERROR) return mInitCheck;
688  SensorInterface* sensor = mSensorMap.valueFor(handle);
689  if (sensor == NULL) {
690      return BAD_VALUE;
691  }
692  if (sensor->getSensor().getType() == SENSOR_TYPE_SIGNIFICANT_MOTION) {
693      ALOGE("flush called on Significant Motion sensor");
694      return INVALID_OPERATION;
695  }
696  return sensor->flush(connection.get(), handle);
697}
698// ---------------------------------------------------------------------------
699
700SensorService::SensorRecord::SensorRecord(
701        const sp<SensorEventConnection>& connection)
702{
703    mConnections.add(connection);
704}
705
706bool SensorService::SensorRecord::addConnection(
707        const sp<SensorEventConnection>& connection)
708{
709    if (mConnections.indexOf(connection) < 0) {
710        mConnections.add(connection);
711        return true;
712    }
713    return false;
714}
715
716bool SensorService::SensorRecord::removeConnection(
717        const wp<SensorEventConnection>& connection)
718{
719    ssize_t index = mConnections.indexOf(connection);
720    if (index >= 0) {
721        mConnections.removeItemsAt(index, 1);
722    }
723    return mConnections.size() ? false : true;
724}
725
726// ---------------------------------------------------------------------------
727
728SensorService::SensorEventConnection::SensorEventConnection(
729        const sp<SensorService>& service, uid_t uid)
730    : mService(service), mUid(uid)
731{
732    const SensorDevice& device(SensorDevice::getInstance());
733    if (device.getHalDeviceVersion() >= SENSORS_DEVICE_API_VERSION_1_1) {
734        // Increase socket buffer size to 1MB for batching capabilities.
735        mChannel = new BitTube(service->mSocketBufferSize);
736    } else {
737        mChannel = new BitTube(SOCKET_BUFFER_SIZE_NON_BATCHED);
738    }
739}
740
741SensorService::SensorEventConnection::~SensorEventConnection()
742{
743    ALOGD_IF(DEBUG_CONNECTIONS, "~SensorEventConnection(%p)", this);
744    mService->cleanupConnection(this);
745}
746
747void SensorService::SensorEventConnection::onFirstRef()
748{
749}
750
751void SensorService::SensorEventConnection::dump(String8& result) {
752    Mutex::Autolock _l(mConnectionLock);
753    for (size_t i = 0; i < mSensorInfo.size(); ++i) {
754        const FlushInfo& flushInfo = mSensorInfo.valueAt(i);
755        result.appendFormat("\t %s | status: %s | pending flush events %d | uid %d\n",
756                            mService->getSensorName(mSensorInfo.keyAt(i)).string(),
757                            flushInfo.mFirstFlushPending ? "First flush pending" :
758                                                           "active",
759                            flushInfo.mPendingFlushEventsToSend,
760                            mUid);
761    }
762}
763
764bool SensorService::SensorEventConnection::addSensor(int32_t handle) {
765    Mutex::Autolock _l(mConnectionLock);
766    if (mSensorInfo.indexOfKey(handle) < 0) {
767        mSensorInfo.add(handle, FlushInfo());
768        return true;
769    }
770    return false;
771}
772
773bool SensorService::SensorEventConnection::removeSensor(int32_t handle) {
774    Mutex::Autolock _l(mConnectionLock);
775    if (mSensorInfo.removeItem(handle) >= 0) {
776        return true;
777    }
778    return false;
779}
780
781bool SensorService::SensorEventConnection::hasSensor(int32_t handle) const {
782    Mutex::Autolock _l(mConnectionLock);
783    return mSensorInfo.indexOfKey(handle) >= 0;
784}
785
786bool SensorService::SensorEventConnection::hasAnySensor() const {
787    Mutex::Autolock _l(mConnectionLock);
788    return mSensorInfo.size() ? true : false;
789}
790
791void SensorService::SensorEventConnection::setFirstFlushPending(int32_t handle,
792                                bool value) {
793    Mutex::Autolock _l(mConnectionLock);
794    ssize_t index = mSensorInfo.indexOfKey(handle);
795    if (index >= 0) {
796        FlushInfo& flushInfo = mSensorInfo.editValueAt(index);
797        flushInfo.mFirstFlushPending = value;
798    }
799}
800
801status_t SensorService::SensorEventConnection::sendEvents(
802        sensors_event_t const* buffer, size_t numEvents,
803        sensors_event_t* scratch)
804{
805    // filter out events not for this connection
806    size_t count = 0;
807
808    if (scratch) {
809        Mutex::Autolock _l(mConnectionLock);
810        size_t i=0;
811        while (i<numEvents) {
812            int32_t curr = buffer[i].sensor;
813            if (buffer[i].type == SENSOR_TYPE_META_DATA) {
814                ALOGD_IF(DEBUG_CONNECTIONS, "flush complete event sensor==%d ",
815                         buffer[i].meta_data.sensor);
816                // Setting curr to the correct sensor to ensure the sensor events per connection are
817                // filtered correctly. buffer[i].sensor is zero for meta_data events.
818                curr = buffer[i].meta_data.sensor;
819            }
820            ssize_t index = mSensorInfo.indexOfKey(curr);
821            if (index >= 0 && mSensorInfo[index].mFirstFlushPending == true &&
822                buffer[i].type == SENSOR_TYPE_META_DATA) {
823                // This is the first flush before activate is called. Events can now be sent for
824                // this sensor on this connection.
825                ALOGD_IF(DEBUG_CONNECTIONS, "First flush event for sensor==%d ",
826                         buffer[i].meta_data.sensor);
827                mSensorInfo.editValueAt(index).mFirstFlushPending = false;
828            }
829            if (index >= 0 && mSensorInfo[index].mFirstFlushPending == false)  {
830                do {
831                    scratch[count++] = buffer[i++];
832                } while ((i<numEvents) && ((buffer[i].sensor == curr) ||
833                         (buffer[i].type == SENSOR_TYPE_META_DATA  &&
834                          buffer[i].meta_data.sensor == curr)));
835            } else {
836                i++;
837            }
838        }
839    } else {
840        scratch = const_cast<sensors_event_t *>(buffer);
841        count = numEvents;
842    }
843
844    // Send pending flush events (if any) before sending events from the cache.
845    {
846        ASensorEvent flushCompleteEvent;
847        flushCompleteEvent.type = SENSOR_TYPE_META_DATA;
848        flushCompleteEvent.sensor = 0;
849        Mutex::Autolock _l(mConnectionLock);
850        // Loop through all the sensors for this connection and check if there are any pending
851        // flush complete events to be sent.
852        for (size_t i = 0; i < mSensorInfo.size(); ++i) {
853            FlushInfo& flushInfo = mSensorInfo.editValueAt(i);
854            while (flushInfo.mPendingFlushEventsToSend > 0) {
855                flushCompleteEvent.meta_data.sensor = mSensorInfo.keyAt(i);
856                ssize_t size = SensorEventQueue::write(mChannel, &flushCompleteEvent, 1);
857                if (size < 0) {
858                    // ALOGW("dropping %d events on the floor", count);
859                    countFlushCompleteEventsLocked(scratch, count);
860                    return size;
861                }
862                ALOGD_IF(DEBUG_CONNECTIONS, "sent dropped flush complete event==%d ",
863                         flushCompleteEvent.meta_data.sensor);
864                flushInfo.mPendingFlushEventsToSend--;
865            }
866        }
867    }
868
869    // Early return if there are no events for this connection.
870    if (count == 0) {
871        return status_t(NO_ERROR);
872    }
873
874    // NOTE: ASensorEvent and sensors_event_t are the same type
875    ssize_t size = SensorEventQueue::write(mChannel,
876            reinterpret_cast<ASensorEvent const*>(scratch), count);
877    if (size == -EAGAIN) {
878        // the destination doesn't accept events anymore, it's probably
879        // full. For now, we just drop the events on the floor.
880        // ALOGW("dropping %d events on the floor", count);
881        Mutex::Autolock _l(mConnectionLock);
882        countFlushCompleteEventsLocked(scratch, count);
883        return size;
884    }
885
886    return size < 0 ? status_t(size) : status_t(NO_ERROR);
887}
888
889void SensorService::SensorEventConnection::countFlushCompleteEventsLocked(
890                sensors_event_t* scratch, const int numEventsDropped) {
891    ALOGD_IF(DEBUG_CONNECTIONS, "dropping %d events ", numEventsDropped);
892    // Count flushComplete events in the events that are about to the dropped. These will be sent
893    // separately before the next batch of events.
894    for (int j = 0; j < numEventsDropped; ++j) {
895        if (scratch[j].type == SENSOR_TYPE_META_DATA) {
896            FlushInfo& flushInfo = mSensorInfo.editValueFor(scratch[j].meta_data.sensor);
897            flushInfo.mPendingFlushEventsToSend++;
898            ALOGD_IF(DEBUG_CONNECTIONS, "increment pendingFlushCount %d",
899                     flushInfo.mPendingFlushEventsToSend);
900        }
901    }
902    return;
903}
904
905sp<BitTube> SensorService::SensorEventConnection::getSensorChannel() const
906{
907    return mChannel;
908}
909
910status_t SensorService::SensorEventConnection::enableDisable(
911        int handle, bool enabled, nsecs_t samplingPeriodNs, nsecs_t maxBatchReportLatencyNs,
912        int reservedFlags)
913{
914    status_t err;
915    if (enabled) {
916        err = mService->enable(this, handle, samplingPeriodNs, maxBatchReportLatencyNs,
917                               reservedFlags);
918    } else {
919        err = mService->disable(this, handle);
920    }
921    return err;
922}
923
924status_t SensorService::SensorEventConnection::setEventRate(
925        int handle, nsecs_t samplingPeriodNs)
926{
927    return mService->setEventRate(this, handle, samplingPeriodNs);
928}
929
930status_t  SensorService::SensorEventConnection::flush() {
931    SensorDevice& dev(SensorDevice::getInstance());
932    const int halVersion = dev.getHalDeviceVersion();
933    Mutex::Autolock _l(mConnectionLock);
934    status_t err(NO_ERROR);
935    // Loop through all sensors for this connection and call flush on each of them.
936    for (size_t i = 0; i < mSensorInfo.size(); ++i) {
937        const int handle = mSensorInfo.keyAt(i);
938        if (halVersion < SENSORS_DEVICE_API_VERSION_1_1 || mService->isVirtualSensor(handle)) {
939            // For older devices just increment pending flush count which will send a trivial
940            // flush complete event.
941            FlushInfo& flushInfo = mSensorInfo.editValueFor(handle);
942            flushInfo.mPendingFlushEventsToSend++;
943        } else {
944            status_t err_flush = mService->flushSensor(this, handle);
945            if (err_flush != NO_ERROR) {
946                ALOGE("Flush error handle=%d %s", handle, strerror(-err_flush));
947            }
948            err = (err_flush != NO_ERROR) ? err_flush : err;
949        }
950    }
951    return err;
952}
953
954// ---------------------------------------------------------------------------
955}; // namespace android
956
957