| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef ANDROID_BUBBLE_LEVEL_IMPL_ |
| #define ANDROID_BUBBLE_LEVEL_IMPL_ |
| |
| #include "BubbleLevel.h" |
| #include <utils/Looper.h> |
| #include <gui/Sensor.h> |
| #include <gui/SensorManager.h> |
| #include <gui/SensorEventQueue.h> |
| |
| |
| namespace android { |
| |
| class BubbleLevelImpl : public Thread |
| { |
| public: |
| |
| BubbleLevelImpl(); |
| virtual ~BubbleLevelImpl(); |
| |
| int initStatus() const { return mInitStatus; } |
| |
| // BubbleLevel interface |
| int setCallback(BubbleLevel_CallBack_t callback, void *userData); |
| int setPollInterval(unsigned int seconds); |
| int startPolling(); |
| int stopPolling(); |
| int pollOnce(); |
| |
| // RefBase |
| virtual void onFirstRef(); |
| // Thread virtuals |
| virtual bool threadLoop(); |
| |
| enum state { |
| BL_STATE_IDLE, |
| BL_STATE_POLLING, |
| BL_STATE_POLLING_ONCE, |
| BL_STATE_SLEEPING, |
| }; |
| |
| uint32_t state() const { return mState; } |
| void lockState() { mStateLock.lock(); } |
| void unlockState() { mStateLock.unlock(); } |
| uint32_t pollCount() { return mPollCount; } |
| void incPollCount() { mPollCount++; } |
| void incLevelCount() { mLevelCount++; } |
| sp<SensorEventQueue> sensorEventQueue() const { return mSensorEventQueue; } |
| size_t numSensors() const { return mNumSensors; } |
| |
| private: |
| enum command { |
| BL_CMD_NONE, |
| BL_CMD_START_POLL, |
| BL_CMD_STOP_POLL, |
| BL_CMD_POLL_ONCE, |
| BL_CMD_EXIT, |
| }; |
| |
| int init(); |
| |
| Mutex mStateLock; |
| Mutex mCallbackLock; |
| Condition mCond; |
| uint32_t mState; |
| uint32_t mCmd; |
| uint32_t mPollIntervalSec; |
| uint32_t mPollCount; |
| uint32_t mLevelCount; |
| |
| BubbleLevel_CallBack_t mCallBack; |
| void *mUserData; |
| |
| size_t mNumSensors; |
| Sensor const* mAccelerometer; |
| sp<SensorEventQueue> mSensorEventQueue; |
| sp<Looper> mLooper; |
| int mInitStatus; |
| }; |
| |
| }; |
| |
| class BubbleLevelBase: public BubbleLevel |
| { |
| public: |
| BubbleLevelBase() { mBubbleLevel = new android::BubbleLevelImpl(); } |
| virtual ~BubbleLevelBase() {} |
| |
| int initStatus() { |
| return mBubbleLevel->initStatus(); |
| } |
| |
| // BubbleLevel interface |
| virtual int setCallback(BubbleLevel_CallBack_t callback, void *userData) { |
| return mBubbleLevel->setCallback(callback, userData); |
| } |
| virtual int setPollInterval(unsigned int seconds) { |
| return mBubbleLevel->setPollInterval(seconds); |
| } |
| virtual int startPolling() { |
| return mBubbleLevel->startPolling(); |
| } |
| virtual int stopPolling() { |
| return mBubbleLevel->stopPolling(); |
| } |
| virtual int pollOnce() { |
| return mBubbleLevel->pollOnce(); |
| } |
| |
| private: |
| android::sp<android::BubbleLevelImpl> mBubbleLevel; |
| }; |
| |
| BubbleLevel *BubbleLevel::create() { |
| BubbleLevelBase *bl = new BubbleLevelBase(); |
| |
| if (bl->initStatus() != 0) { |
| delete bl; |
| bl = NULL; |
| } |
| return static_cast<BubbleLevel *>(bl); |
| } |
| |
| struct bubble_level_C_impl |
| { |
| struct bubble_level interface; |
| android::sp<android::BubbleLevelImpl> bubble_level; |
| }; |
| |
| #endif /*ANDROID_BUBBLE_LEVEL_IMPL_*/ |