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.h
19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* This defines API for camerahal to get sensor events
21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*/
23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifndef ANDROID_CAMERA_HARDWARE_SENSOR_LISTENER_H
25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define ANDROID_CAMERA_HARDWARE_SENSOR_LISTENER_H
26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <android/sensor.h>
28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <gui/Sensor.h>
29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <gui/SensorManager.h>
30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <gui/SensorEventQueue.h>
31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <utils/Looper.h>
32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
33f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include "Common.h"
34f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
35f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Ti {
36f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Camera {
37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * SensorListner class - Registers with sensor manager to get sensor events
40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevtypedef void (*orientation_callback_t) (uint32_t orientation, uint32_t tilt, void* cookie);
43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
44f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsclass SensorLooperThread : public android::Thread {
45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    public:
46f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        SensorLooperThread(android::Looper* looper)
47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            : Thread(false) {
48f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mLooper = android::sp<android::Looper>(looper);
49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ~SensorLooperThread() {
51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mLooper.clear();
52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        virtual bool threadLoop() {
55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            int32_t ret = mLooper->pollOnce(-1);
56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return true;
57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // force looper wake up
60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        void wake() {
61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mLooper->wake();
62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    private:
64f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::sp<android::Looper> mLooper;
65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
68f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsclass SensorListener : public android::RefBase
69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* public - types */
71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    typedef enum {
73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        SENSOR_ACCELEROMETER  = 1 << 0,
74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        SENSOR_MAGNETIC_FIELD = 1 << 1,
75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        SENSOR_GYROSCOPE      = 1 << 2,
76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        SENSOR_LIGHT          = 1 << 3,
77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        SENSOR_PROXIMITY      = 1 << 4,
78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        SENSOR_ORIENTATION    = 1 << 5,
79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    } sensor_type_t;
80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* public - functions */
81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    SensorListener();
83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ~SensorListener();
84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t initialize();
85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void setCallbacks(orientation_callback_t orientation_cb, void *cookie);
86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void enableSensor(sensor_type_t type);
87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void disableSensor(sensor_type_t type);
88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void handleOrientation(uint32_t orientation, uint32_t tilt);
89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* public - member variables */
90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
91f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::sp<android::SensorEventQueue> mSensorEventQueue;
92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* private - member variables */
93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprivate:
94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int sensorsEnabled;
95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    orientation_callback_t mOrientationCb;
96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void *mCbCookie;
97f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::sp<android::Looper> mLooper;
98f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::sp<SensorLooperThread> mSensorLooperThread;
99f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::Mutex mLock;
100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
102f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Camera
103f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Ti
104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
106