内容发布更新时间 : 2024/11/2 14:32:00星期一 下面是文章的全部内容请认真阅读。
sp createEventQueue(); private:
// DeathRecipient interface void sensorManagerDied();
// 调用getService获取SensorService客户端并保存在mSensorServer中
// 调用mSensorServer->getSensorList获取sensor列表,并保存在mSensors和mSensorList中 status_t assertStateLocked() const; private:
mutable Mutex mLock;
mutable sp mSensorServer; // SensorService客户端 mutable Sensor const** mSensorList; // sensor列表 mutable Vector mSensors; // sensor列表 mutable sp mDeathObserver; } [cpp]
view plaincopyclass ISensorEventConnection : public IInterface { public:
DECLARE_META_INTERFACE(SensorEventConnection); virtual sp getSensorChannel() const = 0;
virtual status_t enableDisable(int handle, bool enabled) = 0; virtual status_t setEventRate(int handle, nsecs_t ns) = 0; };
2.4 SensorService.cpp
SensorService作为一个轻量级的system service,它运行于SystemServer内,即在system_init调用SensorService::instantiate(); SensorService主要功能如下:
1) SensorService::instantiate创建实例对象,并增加到ServiceManager中,且创建并启动线程,并执行threadLoop
2) threadLoop从sensor驱动获取原始数据,然后通过SensorEventConnection把事件发送给客户端 3) BnSensorServer的成员函数负责让客户端获取sensor列表和创建SensorEventConnection SensorService与客户端的接口定义如下: [cpp]
view plaincopyclass ISensorServer : public IInterface { public:
DECLARE_META_INTERFACE(SensorServer); virtual Vector getSensorList() = 0;
virtual sp createSensorEventConnection() = 0; };
SensorService定义如下: [cpp]
view plaincopyclass SensorService :
public BinderService, //创建SensorService对象,并增加到ServiceManager中
public BnSensorServer, // 申明了SensorService与客户端(SensorManager)间的binder接口
protected Thread // 线程辅助类,调用run创建并启动线程,然后在线程主函数内回调threadLoop函数, // 所以在使用它时,做一个派生,并根据需要重写threadLoop即可 {
friend class BinderService;
static const nsecs_t MINIMUM_EVENTS_PERIOD = 1000000; // 1000 Hz SensorService();
virtual ~SensorService(); /*
在addService时,第一次构建sp强引用对象时,会调用onFirstRef函数 实现功能如下:
1) 获取SensorDevice实例
2) 调用SensorDevice.getSensorList获取sensor_t列表
3) 根据硬件sensor_t创建HardwareSensor,然后加入mSensorList(Sensor) 和mSensorMap(HardwareSensor)中
4) 根据硬件sensor_t创建对应的senosr(如GravitySensor), 然后加入mVirtualSensorList和mSensorList中 5) mUserSensorList = mSensorList;
6) run(\运行线程,并执行threadLoop */
virtual void onFirstRef(); // Thread interface /*
1) 调用SensorDevice.poll获取sensors_event_t事件 2) 获取已经激活的sensor列表mActiveVirtualSensors 3) 对每一个事件,执行SensorFusion.process
4) 对每一个事件,执行HardwareSensor.process(事件无变化,直接copy) 5) 调用SensorService::SensorEventConnection::sendEvents,把事件发 送给所有的listener
*/
virtual bool threadLoop(); // ISensorServer interface // 返回mUserSensorList
virtual Vector getSensorList(); // 实例化SensorEventConnection并返回 virtual sp createSensorEventConnection();
virtual status_t dump(int fd, const Vector& args);
//==================================================================== //============== SensorEventConnection start ======================== class SensorEventConnection : public BnSensorEventConnection { virtual ~SensorEventConnection(); virtual void onFirstRef(); // 返回mChannel
virtual sp getSensorChannel() const;
// 调用SensorService::enable或SensorService::disable virtual status_t enableDisable(int handle, bool enabled); // 调用SensorService::setEventRate
virtual status_t setEventRate(int handle, nsecs_t ns); sp const mService; // 保存当前SensorService实例 sp const mChannel; // SensorChannel实例 mutable Mutex mConnectionLock; // protected by SensorService::mLock SortedVector mSensorInfo;
public: /*
1) 把当前service保存在mService中
2) 创建SensorChannel实例,并保存在mChannel中
(在SensorChannel::SensorChannel中创建pipe,并把收和发都设置非阻塞) */
SensorEventConnection(const sp& service);
// 调用连接中的mChannel->write (SensorChannel::write),把符合条件的事件写入pipe status_t sendEvents(sensors_event_t const* buffer, size_t count, sensors_event_t* scratch = NULL);
bool hasSensor(int32_t handle) const; //检查handle是否在mSensorInfo中 bool hasAnySensor() const; //检查mSensorInfo中是否有sensor bool addSensor(int32_t handle); //把handle增加到mSensorInfo列表中 bool removeSensor(int32_t handle); //把handle从mSensorInfo中删除 };
//============== SensorEventConnection end ======================== //==================================================================== class SensorRecord {
SortedVector< wp > mConnections; public:
SensorRecord(const sp& connection); bool addConnection(const sp& connection); bool removeConnection(const wp& connection);
size_t getNumConnections() const { return mConnections.size(); }