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