C++程序  |  146行  |  3.59 KB

/*
 * 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_*/