1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* 2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Copyright (C) Texas Instruments - http://www.ti.com/ 3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License"); 5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * you may not use this file except in compliance with the License. 6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * You may obtain a copy of the License at 7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * http://www.apache.org/licenses/LICENSE-2.0 9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Unless required by applicable law or agreed to in writing, software 11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS, 12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * See the License for the specific language governing permissions and 14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * limitations under the License. 15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @file SensorListener.cpp 19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* This file listens and propogates sensor events to CameraHal. 21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*/ 23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define LOG_TAG "CameraHAL" 25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "SensorListener.h" 27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraHal.h" 28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <stdint.h> 30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <math.h> 31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <sys/types.h> 32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace android { 34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*** static declarations ***/ 36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic const float RADIANS_2_DEG = (float) (180 / M_PI); 37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// measured values on device...might need tuning 38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic const int DEGREES_90_THRESH = 50; 39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic const int DEGREES_180_THRESH = 170; 40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic const int DEGREES_270_THRESH = 250; 41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic int sensor_events_listener(int fd, int events, void* data) 43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev SensorListener* listener = (SensorListener*) data; 45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ssize_t num_sensors; 46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ASensorEvent sen_events[8]; 47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev while ((num_sensors = listener->mSensorEventQueue->read(sen_events, 8)) > 0) { 48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (int i = 0; i < num_sensors; i++) { 49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (sen_events[i].type == Sensor::TYPE_ACCELEROMETER) { 50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev float x = sen_events[i].vector.azimuth; 51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev float y = sen_events[i].vector.pitch; 52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev float z = sen_events[i].vector.roll; 53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev float radius = 0; 54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int tilt = 0, orient = 0; 55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVA("ACCELEROMETER EVENT"); 57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVB(" azimuth = %f pitch = %f roll = %f", 58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sen_events[i].vector.azimuth, 59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sen_events[i].vector.pitch, 60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sen_events[i].vector.roll); 61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // see http://en.wikipedia.org/wiki/Spherical_coordinate_system#Cartesian_coordinates 62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // about conversion from cartesian to spherical for orientation calculations 63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev radius = (float) sqrt(x * x + y * y + z * z); 64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev tilt = (int) asinf(z / radius) * RADIANS_2_DEG; 65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev orient = (int) atan2f(-x, y) * RADIANS_2_DEG; 66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (orient < 0) { 68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev orient += 360; 69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (orient >= DEGREES_270_THRESH) { 72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev orient = 270; 73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else if (orient >= DEGREES_180_THRESH) { 74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev orient = 180; 75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else if (orient >= DEGREES_90_THRESH) { 76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev orient = 90; 77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else { 78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev orient = 0; 79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev listener->handleOrientation(orient, tilt); 81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVB(" tilt = %d orientation = %d", tilt, orient); 82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else if (sen_events[i].type == Sensor::TYPE_GYROSCOPE) { 83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVA("GYROSCOPE EVENT"); 84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (num_sensors < 0 && num_sensors != -EAGAIN) { 89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("reading events failed: %s", strerror(-num_sensors)); 90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return 1; 93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/****** public - member functions ******/ 96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevSensorListener::SensorListener() { 97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sensorsEnabled = 0; 100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mOrientationCb = NULL; 101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorEventQueue = NULL; 102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorLooperThread = NULL; 103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevSensorListener::~SensorListener() { 108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Kill looper thread"); 111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (mSensorLooperThread.get()) { 112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // 1. Request exit 113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // 2. Wake up looper which should be polling for an event 114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // 3. Wait for exit 115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorLooperThread->requestExit(); 116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorLooperThread->wake(); 117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorLooperThread->join(); 118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorLooperThread.clear(); 119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorLooperThread = NULL; 120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Kill looper"); 123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (mLooper.get()) { 124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mLooper->removeFd(mSensorEventQueue->getFd()); 125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mLooper.clear(); 126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mLooper = NULL; 127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("SensorListener destroyed"); 129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t SensorListener::initialize() { 134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev SensorManager& mgr(SensorManager::getInstance()); 136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 139b55b12becd2666289a43b4c4bd1cd43b9bf72797Mathias Agopian sp<Looper> mLooper; 140b55b12becd2666289a43b4c4bd1cd43b9bf72797Mathias Agopian 141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorEventQueue = mgr.createEventQueue(); 1429fc12c6efeca3d78acf387155079a99173c573cfMathias Agopian if (mSensorEventQueue == NULL) { 1439fc12c6efeca3d78acf387155079a99173c573cfMathias Agopian CAMHAL_LOGEA("createEventQueue returned NULL"); 1449fc12c6efeca3d78acf387155079a99173c573cfMathias Agopian ret = NO_INIT; 1459fc12c6efeca3d78acf387155079a99173c573cfMathias Agopian goto out; 1469fc12c6efeca3d78acf387155079a99173c573cfMathias Agopian } 147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 148b55b12becd2666289a43b4c4bd1cd43b9bf72797Mathias Agopian mLooper = new Looper(false); 149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mLooper->addFd(mSensorEventQueue->getFd(), 0, ALOOPER_EVENT_INPUT, sensor_events_listener, this); 150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (mSensorLooperThread.get() == NULL) 152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorLooperThread = new SensorLooperThread(mLooper.get()); 153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (mSensorLooperThread.get() == NULL) { 155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Couldn't create sensor looper thread"); 156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = NO_MEMORY; 157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto out; 158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mSensorLooperThread->run("sensor looper thread", PRIORITY_URGENT_DISPLAY); 161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (ret == INVALID_OPERATION){ 162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("thread already running ?!?"); 163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else if (ret != NO_ERROR) { 164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("couldn't run thread"); 165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto out; 166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev out: 169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid SensorListener::setCallbacks(orientation_callback_t orientation_cb, void *cookie) { 174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (orientation_cb) { 177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mOrientationCb = orientation_cb; 178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCbCookie = cookie; 180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid SensorListener::handleOrientation(uint32_t orientation, uint32_t tilt) { 185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(&mLock); 188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (mOrientationCb && (sensorsEnabled & SENSOR_ORIENTATION)) { 190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mOrientationCb(orientation, tilt, mCbCookie); 191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid SensorListener::enableSensor(sensor_type_t type) { 197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Sensor const* sensor; 198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev SensorManager& mgr(SensorManager::getInstance()); 199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(&mLock); 203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ((type & SENSOR_ORIENTATION) && !(sensorsEnabled & SENSOR_ORIENTATION)) { 205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sensor = mgr.getDefaultSensor(Sensor::TYPE_ACCELEROMETER); 206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("orientation = %p (%s)", sensor, sensor->getName().string()); 207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorEventQueue->enableSensor(sensor); 208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorEventQueue->setEventRate(sensor, ms2ns(100)); 209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sensorsEnabled |= SENSOR_ORIENTATION; 210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid SensorListener::disableSensor(sensor_type_t type) { 216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Sensor const* sensor; 217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev SensorManager& mgr(SensorManager::getInstance()); 218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(&mLock); 222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ((type & SENSOR_ORIENTATION) && (sensorsEnabled & SENSOR_ORIENTATION)) { 224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sensor = mgr.getDefaultSensor(Sensor::TYPE_ACCELEROMETER); 225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("orientation = %p (%s)", sensor, sensor->getName().string()); 226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorEventQueue->disableSensor(sensor); 227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sensorsEnabled &= ~SENSOR_ORIENTATION; 228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} // namespace android 234