android sensor framework

2024-04-16 07:38
文章标签 android sensor framework

本文主要是介绍android sensor framework,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 简介

    在了解Sensor工作流程以前,一直以为其事件是通过Event Hub来进行输送的,可是研究完Android4.0代码之后,才发现自己错了。

    其主要框架如下图所示:

 

2.功能模块

2.1 SensorManager.java

与下层接口功能:
1) 在SensorManager函数中
   (1) 调用native sensors_module_init初始化sensor list,即实例化native中的SensorManager

   (2) 创建SensorThread线程

2) 在类SensorThread中
   (1) 调用native sensors_create_queue创建队列
   (2) 在线程中dead loop地调用native sensors_data_poll以从队列sQueue中获取事件(float[] values = new float[3];)
   (3) 收到事件之后,报告sensor event给所有注册且关心此事件的listener

 

与上层的接口功能:

1) 在onPause时取消listener注册

2) 在onResume时注册listener

3) 把收到的事件报告给注册的listener

2.2 android_hardware_SensorManager.cpp

      实现SensorManager.java中的native函数,它主要调用SenrsorManager.cpp和SensorEventQueue.cpp中的类来完成相关的工作。

2.3 SensorManager.cpp

[cpp] view plain copy print ?
  1. class SensorManager :  
  2.     public ASensorManager,  
  3.     public Singleton<SensorManager>  
  4. {  
  5. public:  
  6.     SensorManager(); //调用assertStateLocked   
  7.     ~SensorManager();  
  8.     //调用assertStateLocked,并返回mSensorList   
  9.     ssize_t getSensorList(Sensor constconst** list) const;  
  10.   
  11.     // 返回mSensorList中第一个类型与type一致的sensor       
  12.     Sensor const* getDefaultSensor(int type);  
  13.   
  14.     // 调用mSensorServer->createSensorEventConnection创建一个连接(ISensorEventConnection)   
  15.     // 并用此连接做为参数创建一个SensorEventQueue对象并返回   
  16.     sp<SensorEventQueue> createEventQueue();  
  17.   
  18. private:  
  19.     // DeathRecipient interface   
  20.     void sensorManagerDied();  
  21.     // 调用getService获取SensorService客户端并保存在mSensorServer中   
  22.     // 调用mSensorServer->getSensorList获取sensor列表,并保存在mSensors和mSensorList中   
  23.     status_t assertStateLocked() const;  
  24.   
  25. private:  
  26.     mutable Mutex mLock;  
  27.     mutable sp<ISensorServer> mSensorServer; // SensorService客户端   
  28.     mutable Sensor const** mSensorList; // sensor列表   
  29.     mutable Vector<Sensor> mSensors;    // sensor列表   
  30.     mutable sp<IBinder::DeathRecipient> mDeathObserver;  
  31. }  
class SensorManager :
public ASensorManager,
public Singleton<SensorManager>
{
public:
SensorManager(); //调用assertStateLocked
~SensorManager();
//调用assertStateLocked,并返回mSensorList
ssize_t getSensorList(Sensor const* const** list) const;
// 返回mSensorList中第一个类型与type一致的sensor	
Sensor const* getDefaultSensor(int type);
// 调用mSensorServer->createSensorEventConnection创建一个连接(ISensorEventConnection)
// 并用此连接做为参数创建一个SensorEventQueue对象并返回
sp<SensorEventQueue> createEventQueue();
private:
// DeathRecipient interface
void sensorManagerDied();
// 调用getService获取SensorService客户端并保存在mSensorServer中
// 调用mSensorServer->getSensorList获取sensor列表,并保存在mSensors和mSensorList中
status_t assertStateLocked() const;
private:
mutable Mutex mLock;
mutable sp<ISensorServer> mSensorServer; // SensorService客户端
mutable Sensor const** mSensorList; // sensor列表
mutable Vector<Sensor> mSensors;    // sensor列表
mutable sp<IBinder::DeathRecipient> mDeathObserver;
}

 

[cpp] view plain copy print ?
  1. class ISensorEventConnection : public IInterface  
  2. {  
  3. public:  
  4.     DECLARE_META_INTERFACE(SensorEventConnection);  
  5.   
  6.     virtual sp<SensorChannel> getSensorChannel() const = 0;  
  7.     virtual status_t enableDisable(int handle, bool enabled) = 0;  
  8.     virtual status_t setEventRate(int handle, nsecs_t ns) = 0;  
  9. };  
class ISensorEventConnection : public IInterface
{
public:
DECLARE_META_INTERFACE(SensorEventConnection);
virtual sp<SensorChannel> 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<system_init.cpp>调用SensorService::instantiate();

      SensorService主要功能如下:
          1) SensorService::instantiate创建实例对象,并增加到ServiceManager中,且创建并启动线程,并执行threadLoop
          2) threadLoop从sensor驱动获取原始数据,然后通过SensorEventConnection把事件发送给客户端
          3) BnSensorServer的成员函数负责让客户端获取sensor列表和创建SensorEventConnection

      SensorService与客户端的接口定义如下:

[cpp] view plain copy print ?
  1. class ISensorServer : public IInterface  
  2. {  
  3. public:  
  4.     DECLARE_META_INTERFACE(SensorServer);  
  5.   
  6.     virtual Vector<Sensor> getSensorList() = 0;  
  7.     virtual sp<ISensorEventConnection> createSensorEventConnection() = 0;  
  8. };  
class ISensorServer : public IInterface
{
public:
DECLARE_META_INTERFACE(SensorServer);
virtual Vector<Sensor> getSensorList() = 0;
virtual sp<ISensorEventConnection> createSensorEventConnection() = 0;
};

    SensorService定义如下:

[cpp] view plain copy print ?
  1. class SensorService :  
  2.         public BinderService<SensorService>, //创建SensorService对象,并增加到ServiceManager中   
  3.         public BnSensorServer, // 申明了SensorService与客户端(SensorManager)间的binder接口   
  4.         protected Thread // 线程辅助类,调用run创建并启动线程,然后在线程主函数内回调threadLoop函数,   
  5.                          // 所以在使用它时,做一个派生,并根据需要重写threadLoop即可   
  6.                       
  7. {  
  8.    friend class BinderService<SensorService>;  
  9.   
  10.    static const nsecs_t MINIMUM_EVENTS_PERIOD =   1000000; // 1000 Hz   
  11.   
  12.             SensorService();  
  13.     virtual ~SensorService();  
  14.      
  15.     /* 
  16.     在addService时,第一次构建sp强引用对象时,会调用onFirstRef函数 
  17.      实现功能如下: 
  18.      1) 获取SensorDevice实例 
  19.      2) 调用SensorDevice.getSensorList获取sensor_t列表 
  20.      3) 根据硬件sensor_t创建HardwareSensor,然后加入mSensorList(Sensor) 
  21.             和mSensorMap(HardwareSensor)中 
  22.      4) 根据硬件sensor_t创建对应的senosr(如GravitySensor), 
  23.             然后加入mVirtualSensorList和mSensorList中 
  24.      5) mUserSensorList = mSensorList; 
  25.      6) run("SensorService", PRIORITY_URGENT_DISPLAY);运行线程,并执行threadLoop 
  26.     */  
  27.     virtual void onFirstRef();   
  28.   
  29.     // Thread interface   
  30.     /* 
  31.       1) 调用SensorDevice.poll获取sensors_event_t事件 
  32.       2) 获取已经激活的sensor列表mActiveVirtualSensors 
  33.       3) 对每一个事件,执行SensorFusion.process 
  34.       4) 对每一个事件,执行HardwareSensor.process(事件无变化,直接copy) 
  35.       5) 调用SensorService::SensorEventConnection::sendEvents,把事件发 
  36.              送给所有的listener 
  37.     */  
  38.     virtual bool threadLoop();  
  39.   
  40.     // ISensorServer interface   
  41.     // 返回mUserSensorList   
  42.     virtual Vector<Sensor> getSensorList();  
  43.       
  44.     // 实例化SensorEventConnection并返回   
  45.     virtual sp<ISensorEventConnection> createSensorEventConnection();  
  46.   
  47.     virtual status_t dump(int fd, const Vector<String16>& args);  
  48.   
  49.     //====================================================================   
  50.     //============== SensorEventConnection  start ========================   
  51.     class SensorEventConnection : public BnSensorEventConnection {  
  52.   
  53.         virtual ~SensorEventConnection();  
  54.         virtual void onFirstRef();  
  55.   
  56.     // 返回mChannel   
  57.         virtual sp<SensorChannel> getSensorChannel() const;  
  58.   
  59.     // 调用SensorService::enable或SensorService::disable   
  60.         virtual status_t enableDisable(int handle, bool enabled);  
  61.   
  62.         // 调用SensorService::setEventRate   
  63.         virtual status_t setEventRate(int handle, nsecs_t ns);  
  64.   
  65.         sp<SensorService> const mService; // 保存当前SensorService实例   
  66.         sp<SensorChannel> const mChannel; // SensorChannel实例   
  67.         mutable Mutex mConnectionLock;  
  68.   
  69.         // protected by SensorService::mLock   
  70.         SortedVector<int> mSensorInfo;  
  71.   
  72.     public:  
  73.         /* 
  74.           1) 把当前service保存在mService中 
  75.           2) 创建SensorChannel实例,并保存在mChannel中 
  76.              (在SensorChannel::SensorChannel中创建pipe,并把收和发都设置非阻塞) 
  77.         */  
  78.         SensorEventConnection(const sp<SensorService>& service);  
  79.   
  80.         // 调用连接中的mChannel->write (SensorChannel::write),把符合条件的事件写入pipe   
  81.         status_t sendEvents(sensors_event_t const* buffer, size_t count,  
  82.                 sensors_event_t* scratch = NULL);  
  83.   
  84.         bool hasSensor(int32_t handle) const//检查handle是否在mSensorInfo中   
  85.         bool hasAnySensor() const;   //检查mSensorInfo中是否有sensor   
  86.         bool addSensor(int32_t handle); //把handle增加到mSensorInfo列表中   
  87.         bool removeSensor(int32_t handle); //把handle从mSensorInfo中删除   
  88.     };  
  89.     //============== SensorEventConnection  end ========================   
  90.     //====================================================================   
  91.   
  92.     class SensorRecord {  
  93.         SortedVector< wp<SensorEventConnection> > mConnections;  
  94.     public:  
  95.         SensorRecord(const sp<SensorEventConnection>& connection);  
  96.         bool addConnection(const sp<SensorEventConnection>& connection);  
  97.         bool removeConnection(const wp<SensorEventConnection>& connection);  
  98.         size_t getNumConnections() const { return mConnections.size(); }  
  99.     };  
  100.   
  101.     SortedVector< wp<SensorEventConnection> > getActiveConnections() const;  
  102.     DefaultKeyedVector<int, SensorInterface*> getActiveVirtualSensors() const;  
  103.   
  104.     String8 getSensorName(int handle) const;  
  105.     void recordLastValue(sensors_event_t const * buffer, size_t count);  
  106.     static void sortEventBuffer(sensors_event_t* buffer, size_t count);  
  107.     void registerSensor(SensorInterface* sensor);  
  108.     void registerVirtualSensor(SensorInterface* sensor);  
  109.   
  110.     // constants   
  111.     Vector<Sensor> mSensorList;  // Sensor列表   
  112.     Vector<Sensor> mUserSensorList; //与mSensorList一样   
  113.     DefaultKeyedVector<int, SensorInterface*> mSensorMap; //其成员为HardwareSensor   
  114.     Vector<SensorInterface *> mVirtualSensorList; //其成员为HardwareSensor   
  115.     status_t mInitCheck;  
  116.   
  117.     // protected by mLock   
  118.     mutable Mutex mLock;  
  119.     DefaultKeyedVector<int, SensorRecord*> mActiveSensors; //成员为SensorRecord   
  120.     DefaultKeyedVector<int, SensorInterface*> mActiveVirtualSensors; //成员为HardwareSensor   
  121.     SortedVector< wp<SensorEventConnection> > mActiveConnections;  
  122.   
  123.     // The size of this vector is constant, only the items are mutable   
  124.     KeyedVector<int32_t, sensors_event_t> mLastEventSeen;  
  125.   
  126. public:  
  127.     static char const* getServiceName() { return "sensorservice"; }  
  128.   
  129.     void cleanupConnection(SensorEventConnection* connection);  
  130.   
  131.     /* 
  132.       1) 调用HardwareSensor::activate,即SensorDevice::activate 
  133.       2) 然后创建SensorRecord并增加到列表mActiveSensors 
  134.       3) 把此HardwareSensor增加到连接的mSensorInfo 
  135.       4) 把此连接增加到mActiveConnections中 
  136.     */  
  137.     status_t enable(const sp<SensorEventConnection>& connection, int handle);  
  138.   
  139.     /* 
  140.        1) 把此sensor从连接的mSensorInfo中删除 
  141.        2) 把此连接从mActiveConnections中删除 
  142.        3) 调用HardwareSensor::activate,即SensorDevice::activate 
  143.     */  
  144.     status_t disable(const sp<SensorEventConnection>& connection, int handle);  
  145.     /* 
  146.        1)调用HardwareSensor::setDelay,即SensorDevice::setDelay 
  147.      */  
  148.     status_t setEventRate(const sp<SensorEventConnection>& connection, int handle, nsecs_t ns);  
  149. }  
class SensorService :
public BinderService<SensorService>, //创建SensorService对象,并增加到ServiceManager中
public BnSensorServer, // 申明了SensorService与客户端(SensorManager)间的binder接口
protected Thread // 线程辅助类,调用run创建并启动线程,然后在线程主函数内回调threadLoop函数,
// 所以在使用它时,做一个派生,并根据需要重写threadLoop即可
{
friend class BinderService<SensorService>;
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("SensorService", PRIORITY_URGENT_DISPLAY);运行线程,并执行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<Sensor> getSensorList();
// 实例化SensorEventConnection并返回
virtual sp<ISensorEventConnection> createSensorEventConnection();
virtual status_t dump(int fd, const Vector<String16>& args);
//====================================================================
//============== SensorEventConnection  start ========================
class SensorEventConnection : public BnSensorEventConnection {
virtual ~SensorEventConnection();
virtual void onFirstRef();
// 返回mChannel
virtual sp<SensorChannel> 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<SensorService> const mService; // 保存当前SensorService实例
sp<SensorChannel> const mChannel; // SensorChannel实例
mutable Mutex mConnectionLock;
// protected by SensorService::mLock
SortedVector<int> mSensorInfo;
public:
/*
1) 把当前service保存在mService中
2) 创建SensorChannel实例,并保存在mChannel中
(在SensorChannel::SensorChannel中创建pipe,并把收和发都设置非阻塞)
*/
SensorEventConnection(const sp<SensorService>& 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<SensorEventConnection> > mConnections;
public:
SensorRecord(const sp<SensorEventConnection>& connection);
bool addConnection(const sp<SensorEventConnection>& connection);
bool removeConnection(const wp<SensorEventConnection>& connection);
size_t getNumConnections() const { return mConnections.size(); }
};
SortedVector< wp<SensorEventConnection> > getActiveConnections() const;
DefaultKeyedVector<int, SensorInterface*> getActiveVirtualSensors() const;
String8 getSensorName(int handle) const;
void recordLastValue(sensors_event_t const * buffer, size_t count);
static void sortEventBuffer(sensors_event_t* buffer, size_t count);
void registerSensor(SensorInterface* sensor);
void registerVirtualSensor(SensorInterface* sensor);
// constants
Vector<Sensor> mSensorList;  // Sensor列表
Vector<Sensor> mUserSensorList; //与mSensorList一样
DefaultKeyedVector<int, SensorInterface*> mSensorMap; //其成员为HardwareSensor
Vector<SensorInterface *> mVirtualSensorList; //其成员为HardwareSensor
status_t mInitCheck;
// protected by mLock
mutable Mutex mLock;
DefaultKeyedVector<int, SensorRecord*> mActiveSensors; //成员为SensorRecord
DefaultKeyedVector<int, SensorInterface*> mActiveVirtualSensors; //成员为HardwareSensor
SortedVector< wp<SensorEventConnection> > mActiveConnections;
// The size of this vector is constant, only the items are mutable
KeyedVector<int32_t, sensors_event_t> mLastEventSeen;
public:
static char const* getServiceName() { return "sensorservice"; }
void cleanupConnection(SensorEventConnection* connection);
/*
1) 调用HardwareSensor::activate,即SensorDevice::activate
2) 然后创建SensorRecord并增加到列表mActiveSensors
3) 把此HardwareSensor增加到连接的mSensorInfo
4) 把此连接增加到mActiveConnections中
*/
status_t enable(const sp<SensorEventConnection>& connection, int handle);
/*
1) 把此sensor从连接的mSensorInfo中删除
2) 把此连接从mActiveConnections中删除
3) 调用HardwareSensor::activate,即SensorDevice::activate
*/
status_t disable(const sp<SensorEventConnection>& connection, int handle);
/*
1)调用HardwareSensor::setDelay,即SensorDevice::setDelay
*/
status_t setEventRate(const sp<SensorEventConnection>& connection, int handle, nsecs_t ns);
}


2.5 SensorDevice.cpp

      SensorDevice封装了对SensorHAL层代码的调用,主要包含以下功能:
         1) 获取sensor列表(getSensorList)
         2) 获取sensor事件(poll)
         3) Enable或Disable sensor (activate)
         4) 设置delay时间

 

[cpp] view plain copy print ?
  1. class SensorDevice : public Singleton<SensorDevice> {  
  2.   
  3.     friend class Singleton<SensorDevice>;  
  4.   
  5.     struct sensors_poll_device_t* mSensorDevice; // sensor设备   
  6.   
  7.     struct sensors_module_t* mSensorModule;  
  8.   
  9.     mutable Mutex mLock; // protect mActivationCount[].rates   
  10.     // fixed-size array after construction   
  11.     struct Info {  
  12.         Info() : delay(0) { }  
  13.         KeyedVector<void*, nsecs_t> rates;  
  14.         nsecs_t delay;  
  15.         status_t setDelayForIdent(void* ident, int64_t ns);  
  16.         nsecs_t selectDelay();  
  17.     };  
  18.     DefaultKeyedVector<int, Info> mActivationCount;  
  19.   
  20.     /* 
  21.       1) 调用hw_get_module(SENSORS_HARDWARE_MODULE_ID,..)获取sensors_module_t, 
  22.              并保存在mSensorModule中 
  23.       2) 调用mSensorModule->common->methods->open,以返回sensors_poll_device_t, 
  24.              并保存在mSensorDevice中 
  25.       3) 调用mSensorModule->get_sensors_list所有可访问的sensor_t 
  26.       4) 调用mSensorDevice->activate激活所有的sensor 
  27.     */  
  28.     SensorDevice();  
  29. public:  
  30.     // 调用mSensorModule->get_sensors_list实现   
  31.     ssize_t getSensorList(sensor_t const** list);  
  32.   
  33.     status_t initCheck() const;  
  34.   
  35.     // 调用mSensorDevice->poll实现   
  36.     ssize_t poll(sensors_event_t* buffer, size_t count);  
  37.   
  38.     // 调用mSensorDevice->activate实现   
  39.     status_t activate(void* ident, int handle, int enabled);  
  40.       
  41.     // 调用mSensorDevice->setDelay实现   
  42.     status_t setDelay(void* ident, int handle, int64_t ns);  
  43.     void dump(String8& result, char* buffer, size_t SIZE);  
  44. };  
class SensorDevice : public Singleton<SensorDevice> {
friend class Singleton<SensorDevice>;
struct sensors_poll_device_t* mSensorDevice; // sensor设备
struct sensors_module_t* mSensorModule;
mutable Mutex mLock; // protect mActivationCount[].rates
// fixed-size array after construction
struct Info {
Info() : delay(0) { }
KeyedVector<void*, nsecs_t> rates;
nsecs_t delay;
status_t setDelayForIdent(void* ident, int64_t ns);
nsecs_t selectDelay();
};
DefaultKeyedVector<int, Info> mActivationCount;
/*
1) 调用hw_get_module(SENSORS_HARDWARE_MODULE_ID,..)获取sensors_module_t,
并保存在mSensorModule中
2) 调用mSensorModule->common->methods->open,以返回sensors_poll_device_t,
并保存在mSensorDevice中
3) 调用mSensorModule->get_sensors_list所有可访问的sensor_t
4) 调用mSensorDevice->activate激活所有的sensor
*/
SensorDevice();
public:
// 调用mSensorModule->get_sensors_list实现
ssize_t getSensorList(sensor_t const** list);
status_t initCheck() const;
// 调用mSensorDevice->poll实现
ssize_t poll(sensors_event_t* buffer, size_t count);
// 调用mSensorDevice->activate实现
status_t activate(void* ident, int handle, int enabled);
// 调用mSensorDevice->setDelay实现
status_t setDelay(void* ident, int handle, int64_t ns);
void dump(String8& result, char* buffer, size_t SIZE);
};


2.6 Sensor HAL

定义:/hardware/libhardware/include/hardware/sensors.h

实现:/hardware/mychip/sensor/st/sensors.c

2.6.1 struct sensors_poll_device_t 定义     
[cpp] view plain copy print ?
  1. struct sensors_poll_device_t {  
  2.     struct hw_device_t common;  
  3.   
  4.     // Activate/deactivate one sensor.   
  5.     int (*activate)(struct sensors_poll_device_t *dev,  
  6.             int handle, int enabled);  
  7.   
  8.     // Set the delay between sensor events in nanoseconds for a given sensor.   
  9.     int (*setDelay)(struct sensors_poll_device_t *dev,  
  10.             int handle, int64_t ns);  
  11.   
  12.     // Returns an array of sensor data.   
  13.     int (*poll)(struct sensors_poll_device_t *dev,  
  14.             sensors_event_t* data, int count);  
  15. };  
struct sensors_poll_device_t {
struct hw_device_t common;
// Activate/deactivate one sensor.
int (*activate)(struct sensors_poll_device_t *dev,
int handle, int enabled);
// Set the delay between sensor events in nanoseconds for a given sensor.
int (*setDelay)(struct sensors_poll_device_t *dev,
int handle, int64_t ns);
// Returns an array of sensor data.
int (*poll)(struct sensors_poll_device_t *dev,
sensors_event_t* data, int count);
};
2.6.2 struct sensors_module_t  定义
[cpp] view plain copy print ?
  1. struct sensors_module_t {  
  2.     struct hw_module_t common;  
  3.   
  4.     /** 
  5.      * Enumerate all available sensors. The list is returned in "list". 
  6.      * @return number of sensors in the list 
  7.      */  
  8.     int (*get_sensors_list)(struct sensors_module_t* module,  
  9.             struct sensor_t const** list);  
  10. };  
struct sensors_module_t {
struct hw_module_t common;
/**
* Enumerate all available sensors. The list is returned in "list".
* @return number of sensors in the list
*/
int (*get_sensors_list)(struct sensors_module_t* module,
struct sensor_t const** list);
};
2.6.3  struct sensor_t 定义
[cpp] view plain copy print ?
  1. struct sensor_t {  
  2.     /* name of this sensors */  
  3.     const char*     name;  
  4.     /* vendor of the hardware part */  
  5.     const char*     vendor;  
  6.     /* version of the hardware part + driver. The value of this field 
  7.      * must increase when the driver is updated in a way that changes the 
  8.      * output of this sensor. This is important for fused sensors when the 
  9.      * fusion algorithm is updated. 
  10.      */      
  11.     int             version;  
  12.     /* handle that identifies this sensors. This handle is used to activate 
  13.      * and deactivate this sensor. The value of the handle must be 8 bits 
  14.      * in this version of the API.  
  15.      */  
  16.     int             handle;  
  17.     /* this sensor's type. */  
  18.     int             type;  
  19.     /* maximaum range of this sensor's value in SI units */  
  20.     float           maxRange;  
  21.     /* smallest difference between two values reported by this sensor */  
  22.     float           resolution;  
  23.     /* rough estimate of this sensor's power consumption in mA */  
  24.     float           power;  
  25.     /* minimum delay allowed between events in microseconds. A value of zero 
  26.      * means that this sensor doesn't report events at a constant rate, but 
  27.      * rather only when a new data is available */  
  28.     int32_t         minDelay;  
  29.     /* reserved fields, must be zero */  
  30.     void*           reserved[8];  
  31. };  
struct sensor_t {
/* name of this sensors */
const char*     name;
/* vendor of the hardware part */
const char*     vendor;
/* version of the hardware part + driver. The value of this field
* must increase when the driver is updated in a way that changes the
* output of this sensor. This is important for fused sensors when the
* fusion algorithm is updated.
*/    
int             version;
/* handle that identifies this sensors. This handle is used to activate
* and deactivate this sensor. The value of the handle must be 8 bits
* in this version of the API. 
*/
int             handle;
/* this sensor's type. */
int             type;
/* maximaum range of this sensor's value in SI units */
float           maxRange;
/* smallest difference between two values reported by this sensor */
float           resolution;
/* rough estimate of this sensor's power consumption in mA */
float           power;
/* minimum delay allowed between events in microseconds. A value of zero
* means that this sensor doesn't report events at a constant rate, but
* rather only when a new data is available */
int32_t         minDelay;
/* reserved fields, must be zero */
void*           reserved[8];
};
2.6.4 struct sensors_event_t 定义
[cpp] view plain copy print ?
  1. typedef struct {  
  2.     union {  
  3.         float v[3];  
  4.         struct {  
  5.             float x;  
  6.             float y;  
  7.             float z;  
  8.         };  
  9.         struct {  
  10.             float azimuth;  
  11.             float pitch;  
  12.             float roll;  
  13.         };  
  14.     };  
  15.     int8_t status;  
  16.     uint8_t reserved[3];  
  17. } sensors_vec_t;  
  18.   
  19. /** 
  20.  * Union of the various types of sensor data 
  21.  * that can be returned. 
  22.  */  
  23. typedef struct sensors_event_t {  
  24.     /* must be sizeof(struct sensors_event_t) */  
  25.     int32_t version;  
  26.   
  27.     /* sensor identifier */  
  28.     int32_t sensor;  
  29.   
  30.     /* sensor type */  
  31.     int32_t type;  
  32.   
  33.     /* reserved */  
  34.     int32_t reserved0;  
  35.   
  36.     /* time is in nanosecond */  
  37.     int64_t timestamp;  
  38.   
  39.     union {  
  40.         float           data[16];  
  41.   
  42.         /* acceleration values are in meter per second per second (m/s^2) */  
  43.         sensors_vec_t   acceleration;  
  44.   
  45.         /* magnetic vector values are in micro-Tesla (uT) */  
  46.         sensors_vec_t   magnetic;  
  47.   
  48.         /* orientation values are in degrees */  
  49.         sensors_vec_t   orientation;  
  50.   
  51.         /* gyroscope values are in rad/s */  
  52.         sensors_vec_t   gyro;  
  53.   
  54.         /* temperature is in degrees centigrade (Celsius) */  
  55.         float           temperature;  
  56.   
  57.         /* distance in centimeters */  
  58.         float           distance;  
  59.   
  60.         /* light in SI lux units */  
  61.         float           light;  
  62.   
  63.         /* pressure in hectopascal (hPa) */  
  64.         float           pressure;  
  65.   
  66.         /* relative humidity in percent */  
  67.         float           relative_humidity;  
  68.     };  
  69.     uint32_t        reserved1[4];  
  70. } sensors_event_t;  
typedef struct {
union {
float v[3];
struct {
float x;
float y;
float z;
};
struct {
float azimuth;
float pitch;
float roll;
};
};
int8_t status;
uint8_t reserved[3];
} sensors_vec_t;
/**
* Union of the various types of sensor data
* that can be returned.
*/
typedef struct sensors_event_t {
/* must be sizeof(struct sensors_event_t) */
int32_t version;
/* sensor identifier */
int32_t sensor;
/* sensor type */
int32_t type;
/* reserved */
int32_t reserved0;
/* time is in nanosecond */
int64_t timestamp;
union {
float           data[16];
/* acceleration values are in meter per second per second (m/s^2) */
sensors_vec_t   acceleration;
/* magnetic vector values are in micro-Tesla (uT) */
sensors_vec_t   magnetic;
/* orientation values are in degrees */
sensors_vec_t   orientation;
/* gyroscope values are in rad/s */
sensors_vec_t   gyro;
/* temperature is in degrees centigrade (Celsius) */
float           temperature;
/* distance in centimeters */
float           distance;
/* light in SI lux units */
float           light;
/* pressure in hectopascal (hPa) */
float           pressure;
/* relative humidity in percent */
float           relative_humidity;
};
uint32_t        reserved1[4];
} sensors_event_t;


2.6.5 struct sensors_module_t 实现
[cpp] view plain copy print ?
  1. #include <hardware/sensors.h>   
  2. #include "nusensors.h"   
  3.   
  4. /* 
  5.  * the AK8973 has a 8-bit ADC but the firmware seems to average 16 samples, 
  6.  * or at least makes its calibration on 12-bits values. This increases the 
  7.  * resolution by 4 bits. 
  8.  */  
  9. static const struct sensor_t sSensorList[] = {  
  10.         { "MMA8452Q 3-axis Accelerometer",      
  11.                 "Freescale Semiconductor",  
  12.                 1, SENSORS_HANDLE_BASE+ID_A,  
  13.                 SENSOR_TYPE_ACCELEROMETER, 4.0f*9.81f, (4.0f*9.81f)/256.0f, 0.2f, 0, { } },  
  14.         { "AK8975 3-axis Magnetic field sensor",  
  15.                 "Asahi Kasei",  
  16.                 1, SENSORS_HANDLE_BASE+ID_M,  
  17.                 SENSOR_TYPE_MAGNETIC_FIELD, 2000.0f, 1.0f/16.0f, 6.8f, 0, { } },  
  18.         { "AK8975 Orientation sensor",  
  19.                 "Asahi Kasei",  
  20.                 1, SENSORS_HANDLE_BASE+ID_O,  
  21.                 SENSOR_TYPE_ORIENTATION, 360.0f, 1.0f, 7.0f, 0, { } },   
  22.   
  23.     { "ST 3-axis Gyroscope sensor",  
  24.           "STMicroelectronics",  
  25.           1, SENSORS_HANDLE_BASE+ID_GY,  
  26.           SENSOR_TYPE_GYROSCOPE, RANGE_GYRO, CONVERT_GYRO, 6.1f, 1190, { } },  
  27.               
  28.     { "AL3006Proximity sensor",  
  29.         "Dyna Image Corporation",  
  30.         1, SENSORS_HANDLE_BASE+ID_P,  
  31.         SENSOR_TYPE_PROXIMITY,  
  32.         PROXIMITY_THRESHOLD_CM, PROXIMITY_THRESHOLD_CM,  
  33.         0.5f, 0, { } },  
  34.           
  35.         { "AL3006 light sensor",  
  36.                 "Dyna Image Corporation",  
  37.                 1, SENSORS_HANDLE_BASE+ID_L,  
  38.                 SENSOR_TYPE_LIGHT, 10240.0f, 1.0f, 0.5f, 0, { } },  
  39.   
  40. };  
  41.   
  42. static int open_sensors(const struct hw_module_t* module, const char* name,  
  43.         struct hw_device_t** device);  
  44.   
  45. static int sensors__get_sensors_list(struct sensors_module_t* module,  
  46.         struct sensor_t const** list)  
  47. {  
  48.     *list = sSensorList;  
  49.     return ARRAY_SIZE(sSensorList);  
  50. }  
  51.   
  52. static struct hw_module_methods_t sensors_module_methods = {  
  53.     .open = open_sensors  
  54. };  
  55.   
  56. const struct sensors_module_t HAL_MODULE_INFO_SYM = {  
  57.     .common = {  
  58.         .tag = HARDWARE_MODULE_TAG,  
  59.         .version_major = 1,  
  60.         .version_minor = 0,  
  61.         .id = SENSORS_HARDWARE_MODULE_ID,  
  62.         .name = "MMA8451Q & AK8973A & gyro Sensors Module",  
  63.         .author = "The Android Project",  
  64.         .methods = &sensors_module_methods,  
  65.     },  
  66.     .get_sensors_list = sensors__get_sensors_list  
  67. };  
  68.   
  69. static int open_sensors(const struct hw_module_t* module, const char* name,  
  70.         struct hw_device_t** device)  
  71. {  
  72.     return init_nusensors(module, device); //待后面讲解   
  73. }  
#include <hardware/sensors.h>
#include "nusensors.h"
/*
* the AK8973 has a 8-bit ADC but the firmware seems to average 16 samples,
* or at least makes its calibration on 12-bits values. This increases the
* resolution by 4 bits.
*/
static const struct sensor_t sSensorList[] = {
{ "MMA8452Q 3-axis Accelerometer",    
"Freescale Semiconductor",
1, SENSORS_HANDLE_BASE+ID_A,
SENSOR_TYPE_ACCELEROMETER, 4.0f*9.81f, (4.0f*9.81f)/256.0f, 0.2f, 0, { } },
{ "AK8975 3-axis Magnetic field sensor",
"Asahi Kasei",
1, SENSORS_HANDLE_BASE+ID_M,
SENSOR_TYPE_MAGNETIC_FIELD, 2000.0f, 1.0f/16.0f, 6.8f, 0, { } },
{ "AK8975 Orientation sensor",
"Asahi Kasei",
1, SENSORS_HANDLE_BASE+ID_O,
SENSOR_TYPE_ORIENTATION, 360.0f, 1.0f, 7.0f, 0, { } }, 
{ "ST 3-axis Gyroscope sensor",
"STMicroelectronics",
1, SENSORS_HANDLE_BASE+ID_GY,
SENSOR_TYPE_GYROSCOPE, RANGE_GYRO, CONVERT_GYRO, 6.1f, 1190, { } },
{ "AL3006Proximity sensor",
"Dyna Image Corporation",
1, SENSORS_HANDLE_BASE+ID_P,
SENSOR_TYPE_PROXIMITY,
PROXIMITY_THRESHOLD_CM, PROXIMITY_THRESHOLD_CM,
0.5f, 0, { } },
{ "AL3006 light sensor",
"Dyna Image Corporation",
1, SENSORS_HANDLE_BASE+ID_L,
SENSOR_TYPE_LIGHT, 10240.0f, 1.0f, 0.5f, 0, { } },
};
static int open_sensors(const struct hw_module_t* module, const char* name,
struct hw_device_t** device);
static int sensors__get_sensors_list(struct sensors_module_t* module,
struct sensor_t const** list)
{
*list = sSensorList;
return ARRAY_SIZE(sSensorList);
}
static struct hw_module_methods_t sensors_module_methods = {
.open = open_sensors
};
const struct sensors_module_t HAL_MODULE_INFO_SYM = {
.common = {
.tag = HARDWARE_MODULE_TAG,
.version_major = 1,
.version_minor = 0,
.id = SENSORS_HARDWARE_MODULE_ID,
.name = "MMA8451Q & AK8973A & gyro Sensors Module",
.author = "The Android Project",
.methods = &sensors_module_methods,
},
.get_sensors_list = sensors__get_sensors_list
};
static int open_sensors(const struct hw_module_t* module, const char* name,
struct hw_device_t** device)
{
return init_nusensors(module, device); //待后面讲解
}
2.6.6 struct sensors_poll_device_t 实现

    实现代码位于:/hardware/mychip/sensor/st/nusensors.cpp

    从上面的代码中可以看出,当调用init_nusensors时,它将返回sensors_poll_device_t,然后就可以调用sensors_poll_device_t 的以下方法进行相关操作:

      1) activate 
      2) setDelay
      3) poll

6.1) struct sensors_poll_context_t 定义 

[cpp] view plain copy print ?
  1. struct sensors_poll_context_t {  
  2.     struct sensors_poll_device_t device; // must be first   
  3.   
  4.         sensors_poll_context_t();  
  5.         ~sensors_poll_context_t();  
  6.     int activate(int handle, int enabled);  
  7.     int setDelay(int handle, int64_t ns);  
  8.     int pollEvents(sensors_event_t* data, int count);  
  9.   
  10. private:  
  11.     enum {        
  12.         light           = 0,  
  13.         proximity       = 1,  
  14.         mma             = 2,  
  15.         akm             = 3,  
  16.         gyro            = 4,  
  17.         numSensorDrivers,  
  18.         numFds,  
  19.     };  
  20.   
  21.     static const size_t wake = numFds - 1;  
  22.     static const char WAKE_MESSAGE = 'W';  
  23.     struct pollfd mPollFds[numFds];  
  24.     int mWritePipeFd;  
  25.     SensorBase* mSensors[numSensorDrivers];  
  26.   
  27.     int handleToDriver(int handle) const {  
  28.         switch (handle) {  
  29.             case ID_A:  
  30.                 return mma;  
  31.             case ID_M:  
  32.             case ID_O:  
  33.                 return akm;   
  34.             case ID_P:  
  35.                 return proximity;  
  36.             case ID_L:  
  37.                 return light;     
  38.             case ID_GY:  
  39.                 return gyro;  
  40.         }  
  41.         return -EINVAL;  
  42.     }  
  43. }  
struct sensors_poll_context_t {
struct sensors_poll_device_t device; // must be first
sensors_poll_context_t();
~sensors_poll_context_t();
int activate(int handle, int enabled);
int setDelay(int handle, int64_t ns);
int pollEvents(sensors_event_t* data, int count);
private:
enum {		
light           = 0,
proximity       = 1,
mma             = 2,
akm             = 3,
gyro            = 4,
numSensorDrivers,
numFds,
};
static const size_t wake = numFds - 1;
static const char WAKE_MESSAGE = 'W';
struct pollfd mPollFds[numFds];
int mWritePipeFd;
SensorBase* mSensors[numSensorDrivers];
int handleToDriver(int handle) const {
switch (handle) {
case ID_A:
return mma;
case ID_M:
case ID_O:
return akm;	
case ID_P:
return proximity;
case ID_L:
return light;	
case ID_GY:
return gyro;
}
return -EINVAL;
}
}

6.2) init_nusensors 实现

[cpp] view plain copy print ?
  1. int init_nusensors(hw_module_t const* module, hw_device_t** device)  
  2. {  
  3.     int status = -EINVAL;  
  4.   
  5.     sensors_poll_context_t *dev = new sensors_poll_context_t();  
  6.     memset(&dev->device, 0, sizeof(sensors_poll_device_t));  
  7.   
  8.     dev->device.common.tag = HARDWARE_DEVICE_TAG;  
  9.     dev->device.common.version  = 0;  
  10.     dev->device.common.module   = const_cast<hw_module_t*>(module);  
  11.     dev->device.common.close    = poll__close;  
  12.     dev->device.activate        = poll__activate;  
  13.     dev->device.setDelay        = poll__setDelay;  
  14.     dev->device.poll            = poll__poll;  
  15.   
  16.     *device = &dev->device.common;  
  17.     status = 0;  
  18.     return status;  
  19. }  
int init_nusensors(hw_module_t const* module, hw_device_t** device)
{
int status = -EINVAL;
sensors_poll_context_t *dev = new sensors_poll_context_t();
memset(&dev->device, 0, sizeof(sensors_poll_device_t));
dev->device.common.tag = HARDWARE_DEVICE_TAG;
dev->device.common.version  = 0;
dev->device.common.module   = const_cast<hw_module_t*>(module);
dev->device.common.close    = poll__close;
dev->device.activate        = poll__activate;
dev->device.setDelay        = poll__setDelay;
dev->device.poll            = poll__poll;
*device = &dev->device.common;
status = 0;
return status;
}

     由以上代码可见,sensors_poll_device_t的activate、setDelay和poll的实现函数分别为:

        (1)  poll__activate

        (2)   poll__setDelay

        (3)   poll__poll

     下面讲解以上三个关键函数的实现

6.3) struct sensors_poll_context_t 的实现

[cpp] view plain copy print ?
  1. sensors_poll_context_t::sensors_poll_context_t()  
  2. {     
  3.     mSensors[light] = new LightSensor();  
  4.     mPollFds[light].fd = mSensors[light]->getFd();  
  5.     mPollFds[light].events = POLLIN;  
  6.     mPollFds[light].revents = 0;  
  7.   
  8.     mSensors[proximity] = new ProximitySensor();  
  9.     mPollFds[proximity].fd = mSensors[proximity]->getFd();  
  10.     mPollFds[proximity].events = POLLIN;  
  11.     mPollFds[proximity].revents = 0;  
  12.       
  13.   
  14.     mSensors[mma] = new MmaSensor();  //下面MmmaSensor为例进行分析   
  15.     mPollFds[mma].fd = mSensors[mma]->getFd();  
  16.     mPollFds[mma].events = POLLIN;  
  17.     mPollFds[mma].revents = 0;  
  18.   
  19.     mSensors[akm] = new AkmSensor();  
  20.     mPollFds[akm].fd = mSensors[akm]->getFd();  
  21.     mPollFds[akm].events = POLLIN;  
  22.     mPollFds[akm].revents = 0;  
  23.   
  24.     mSensors[gyro] = new GyroSensor();  
  25.     mPollFds[gyro].fd = mSensors[gyro]->getFd();  
  26.     mPollFds[gyro].events = POLLIN;  
  27.     mPollFds[gyro].revents = 0;  
  28.   
  29.     int wakeFds[2];  
  30.     int result = pipe(wakeFds);  
  31.     LOGE_IF(result<0, "error creating wake pipe (%s)", strerror(errno));  
  32.     fcntl(wakeFds[0], F_SETFL, O_NONBLOCK);  
  33.     fcntl(wakeFds[1], F_SETFL, O_NONBLOCK);  
  34.     mWritePipeFd = wakeFds[1];  
  35.   
  36.     mPollFds[wake].fd = wakeFds[0];  
  37.     mPollFds[wake].events = POLLIN;  
  38.     mPollFds[wake].revents = 0;  
  39. }  
  40.   
  41. sensors_poll_context_t::~sensors_poll_context_t() {  
  42.     for (int i=0 ; i<numSensorDrivers ; i++) {  
  43.         delete mSensors[i];  
  44.     }  
  45.     close(mPollFds[wake].fd);  
  46.     close(mWritePipeFd);  
  47. }  
  48.   
  49. int sensors_poll_context_t::activate(int handle, int enabled) {  
  50.     int index = handleToDriver(handle);  
  51.     if (index < 0) return index;  
  52.     int err =  mSensors[index]->enable(handle, enabled);  
  53.     if (enabled && !err) {  
  54.         const char wakeMessage(WAKE_MESSAGE);  
  55.         int result = write(mWritePipeFd, &wakeMessage, 1);  
  56.         LOGE_IF(result<0, "error sending wake message (%s)", strerror(errno));  
  57.     }  
  58.     return err;  
  59. }  
  60.   
  61. int sensors_poll_context_t::setDelay(int handle, int64_t ns) {  
  62.   
  63.     int index = handleToDriver(handle);  
  64.     if (index < 0) return index;  
  65.     return mSensors[index]->setDelay(handle, ns);  
  66. }  
  67.   
  68. int sensors_poll_context_t::pollEvents(sensors_event_t* data, int count)  
  69. {  
  70.     int nbEvents = 0;  
  71.     int n = 0;  
  72.   
  73.     do {  
  74.         // see if we have some leftover from the last poll()   
  75.         for (int i=0 ; count && i<numSensorDrivers ; i++) {  
  76.             SensorBase* const sensor(mSensors[i]);  
  77.             if ((mPollFds[i].revents & POLLIN) || (sensor->hasPendingEvents())) {  
  78.                 int nb = sensor->readEvents(data, count);    // num of evens received.   
  79.                 D("nb = %d.", nb);  
  80.                 if (nb < count) {  
  81.                     // no more data for this sensor   
  82.                     mPollFds[i].revents = 0;  
  83.                 }  
  84.                 count -= nb;  
  85.                 nbEvents += nb;  
  86.                 data += nb;  
  87.             }  
  88.         }  
  89.   
  90.         if (count) {  
  91.             // we still have some room, so try to see if we can get   
  92.             // some events immediately or just wait if we don't have   
  93.             // anything to return   
  94.             n = poll(mPollFds, numFds, nbEvents ? 0 : -1);  
  95.             if (n<0) {  
  96.                 LOGE("poll() failed (%s)", strerror(errno));  
  97.                 return -errno;  
  98.             }  
  99.             if (mPollFds[wake].revents & POLLIN) {  
  100.                 char msg;  
  101.                 int result = read(mPollFds[wake].fd, &msg, 1);  
  102.                 LOGE_IF(result<0, "error reading from wake pipe (%s)", strerror(errno));  
  103.                 LOGE_IF(msg != WAKE_MESSAGE, "unknown message on wake queue (0x%02x)"int(msg));  
  104.                 mPollFds[wake].revents = 0;  
  105.             }  
  106.         }  
  107.         // if we have events and space, go read them   
  108.     } while (n && count);  
  109.   
  110.     return nbEvents;  
  111. }  
  112.   
  113. /*****************************************************************************/  
  114.   
  115. static int poll__close(struct hw_device_t *dev)  
  116. {  
  117.     sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;  
  118.     if (ctx) {  
  119.         delete ctx;  
  120.     }  
  121.     return 0;  
  122. }  
  123.   
  124. static int poll__activate(struct sensors_poll_device_t *dev,  
  125.         int handle, int enabled) {  
  126.     sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;  
  127.     return ctx->activate(handle, enabled);  
  128. }  
  129.   
  130. static int poll__setDelay(struct sensors_poll_device_t *dev,  
  131.         int handle, int64_t ns) {  
  132.     sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;  
  133.     return ctx->setDelay(handle, ns);  
  134. }  
  135.   
  136. static int poll__poll(struct sensors_poll_device_t *dev,  
  137.         sensors_event_t* data, int count) {  
  138.     sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;  
  139.     return ctx->pollEvents(data, count);  
  140. }  
sensors_poll_context_t::sensors_poll_context_t()
{	
mSensors[light] = new LightSensor();
mPollFds[light].fd = mSensors[light]->getFd();
mPollFds[light].events = POLLIN;
mPollFds[light].revents = 0;
mSensors[proximity] = new ProximitySensor();
mPollFds[proximity].fd = mSensors[proximity]->getFd();
mPollFds[proximity].events = POLLIN;
mPollFds[proximity].revents = 0;
mSensors[mma] = new MmaSensor();  //下面MmmaSensor为例进行分析
mPollFds[mma].fd = mSensors[mma]->getFd();
mPollFds[mma].events = POLLIN;
mPollFds[mma].revents = 0;
mSensors[akm] = new AkmSensor();
mPollFds[akm].fd = mSensors[akm]->getFd();
mPollFds[akm].events = POLLIN;
mPollFds[akm].revents = 0;
mSensors[gyro] = new GyroSensor();
mPollFds[gyro].fd = mSensors[gyro]->getFd();
mPollFds[gyro].events = POLLIN;
mPollFds[gyro].revents = 0;
int wakeFds[2];
int result = pipe(wakeFds);
LOGE_IF(result<0, "error creating wake pipe (%s)", strerror(errno));
fcntl(wakeFds[0], F_SETFL, O_NONBLOCK);
fcntl(wakeFds[1], F_SETFL, O_NONBLOCK);
mWritePipeFd = wakeFds[1];
mPollFds[wake].fd = wakeFds[0];
mPollFds[wake].events = POLLIN;
mPollFds[wake].revents = 0;
}
sensors_poll_context_t::~sensors_poll_context_t() {
for (int i=0 ; i<numSensorDrivers ; i++) {
delete mSensors[i];
}
close(mPollFds[wake].fd);
close(mWritePipeFd);
}
int sensors_poll_context_t::activate(int handle, int enabled) {
int index = handleToDriver(handle);
if (index < 0) return index;
int err =  mSensors[index]->enable(handle, enabled);
if (enabled && !err) {
const char wakeMessage(WAKE_MESSAGE);
int result = write(mWritePipeFd, &wakeMessage, 1);
LOGE_IF(result<0, "error sending wake message (%s)", strerror(errno));
}
return err;
}
int sensors_poll_context_t::setDelay(int handle, int64_t ns) {
int index = handleToDriver(handle);
if (index < 0) return index;
return mSensors[index]->setDelay(handle, ns);
}
int sensors_poll_context_t::pollEvents(sensors_event_t* data, int count)
{
int nbEvents = 0;
int n = 0;
do {
// see if we have some leftover from the last poll()
for (int i=0 ; count && i<numSensorDrivers ; i++) {
SensorBase* const sensor(mSensors[i]);
if ((mPollFds[i].revents & POLLIN) || (sensor->hasPendingEvents())) {
int nb = sensor->readEvents(data, count);	// num of evens received.
D("nb = %d.", nb);
if (nb < count) {
// no more data for this sensor
mPollFds[i].revents = 0;
}
count -= nb;
nbEvents += nb;
data += nb;
}
}
if (count) {
// we still have some room, so try to see if we can get
// some events immediately or just wait if we don't have
// anything to return
n = poll(mPollFds, numFds, nbEvents ? 0 : -1);
if (n<0) {
LOGE("poll() failed (%s)", strerror(errno));
return -errno;
}
if (mPollFds[wake].revents & POLLIN) {
char msg;
int result = read(mPollFds[wake].fd, &msg, 1);
LOGE_IF(result<0, "error reading from wake pipe (%s)", strerror(errno));
LOGE_IF(msg != WAKE_MESSAGE, "unknown message on wake queue (0x%02x)", int(msg));
mPollFds[wake].revents = 0;
}
}
// if we have events and space, go read them
} while (n && count);
return nbEvents;
}
/*****************************************************************************/
static int poll__close(struct hw_device_t *dev)
{
sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
if (ctx) {
delete ctx;
}
return 0;
}
static int poll__activate(struct sensors_poll_device_t *dev,
int handle, int enabled) {
sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
return ctx->activate(handle, enabled);
}
static int poll__setDelay(struct sensors_poll_device_t *dev,
int handle, int64_t ns) {
sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
return ctx->setDelay(handle, ns);
}
static int poll__poll(struct sensors_poll_device_t *dev,
sensors_event_t* data, int count) {
sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
return ctx->pollEvents(data, count);
}

下面MmaSensor为例进行分析。

2.7 MmaSensor.cpp

1)  SensorBase的实现(SensorBase.cpp)

[cpp] view plain copy print ?
  1. class SensorBase {  
  2. protected:  
  3.     const char* dev_name; // "/dev/mma8452_daemon"   
  4.     const char* data_name; // "gsensor"   
  5.     int         dev_fd; // 打开设备"/dev/mma8452_daemon"的fd   
  6.       
  7.     // 打开事件"/dev/input/eventx"的fd,其驱动的名字为"gsensor"   
  8.     int         data_fd;   
  9.       
  10.     // 打开与"gsensor"对应的事件"/dev/input/eventx"   
  11.     static int openInput(const char* inputName);   
  12.   
  13.     //通过clock_gettime获取当前时间   
  14.     static int64_t getTimestamp();   
  15.   
  16.   
  17.     static int64_t timevalToNano(timeval const& t) {  
  18.         return t.tv_sec*1000000000LL + t.tv_usec*1000;  
  19.     }  
  20.   
  21.     int open_device(); //打开设备"dev/mma8452_daemon"   
  22.     int close_device(); //关闭设备"dev/mma8452_daemon"   
  23.   
  24. public:  
  25.     // 调用openInput   
  26.             SensorBase(  
  27.                     const char* dev_name,  
  28.                     const char* data_name);  
  29.   
  30.     virtual ~SensorBase();  
  31.   
  32.     virtual int readEvents(sensors_event_t* data, int count) = 0;  
  33.     virtual bool hasPendingEvents() const;  
  34.     virtual int getFd() const;  //返回data_fd   
  35.     virtual int setDelay(int32_t handle, int64_t ns);  
  36.     virtual int enable(int32_t handle, int enabled) = 0;  
  37. };  
class SensorBase {
protected:
const char* dev_name; // "/dev/mma8452_daemon"
const char* data_name; // "gsensor"
int         dev_fd; // 打开设备"/dev/mma8452_daemon"的fd
// 打开事件"/dev/input/eventx"的fd,其驱动的名字为"gsensor"
int         data_fd; 
// 打开与"gsensor"对应的事件"/dev/input/eventx"
static int openInput(const char* inputName); 
//通过clock_gettime获取当前时间
static int64_t getTimestamp(); 
static int64_t timevalToNano(timeval const& t) {
return t.tv_sec*1000000000LL + t.tv_usec*1000;
}
int open_device(); //打开设备"dev/mma8452_daemon"
int close_device(); //关闭设备"dev/mma8452_daemon"
public:
// 调用openInput
SensorBase(
const char* dev_name,
const char* data_name);
virtual ~SensorBase();
virtual int readEvents(sensors_event_t* data, int count) = 0;
virtual bool hasPendingEvents() const;
virtual int getFd() const;  //返回data_fd
virtual int setDelay(int32_t handle, int64_t ns);
virtual int enable(int32_t handle, int enabled) = 0;
};

2) MmaSensor的实现

[cpp] view plain copy print ?
  1. class MmaSensor : public SensorBase {  
  2. public:  
  3.     /* 
  4.       1) 设置dev_name为 "/dev/mma8452_daemon" 
  5.       2) 设置data_name为 "gsensor" 
  6.       3) open设备 "/dev/mma8452_daemon" 
  7.     */  
  8.             MmaSensor();  
  9.     virtual ~MmaSensor();  
  10.   
  11.     enum {  
  12.         Accelerometer   = 0,  
  13.         numSensors  
  14.     };  
  15.   
  16.     // 调用ioctl(MMA_IOCTL_APP_SET_RATE)   
  17.     virtual int setDelay(int32_t handle, int64_t ns);  
  18.   
  19.     /* 
  20.       1) Activate: ioctl(MMA_IOCTL_START) 
  21.       2) Deactivate: ioctl(MMA_IOCTL_CLOSE) 
  22.     */  
  23.     virtual int enable(int32_t handle, int enabled);  
  24.       
  25.     /* 
  26.       1) 从data_fd read input_event 
  27.       2) 调用processEvent对事件进行处理 
  28.       3) 把事件通过data返回 
  29.     */  
  30.     virtual int readEvents(sensors_event_t* data, int count);  
  31.   
  32.     void processEvent(int code, int value);  
  33.   
  34. private:  
  35.     int update_delay();  
  36.     uint32_t mEnabled;  
  37.     uint32_t mPendingMask;  
  38.     InputEventCircularReader mInputReader;  
  39.     sensors_event_t mPendingEvents[numSensors];  
  40.     uint64_t mDelays[numSensors];  
  41. };  
class MmaSensor : public SensorBase {
public:
/*
1) 设置dev_name为 "/dev/mma8452_daemon"
2) 设置data_name为 "gsensor"
3) open设备 "/dev/mma8452_daemon"
*/
MmaSensor();
virtual ~MmaSensor();
enum {
Accelerometer   = 0,
numSensors
};
// 调用ioctl(MMA_IOCTL_APP_SET_RATE)
virtual int setDelay(int32_t handle, int64_t ns);
/*
1) Activate: ioctl(MMA_IOCTL_START)
2) Deactivate: ioctl(MMA_IOCTL_CLOSE)
*/
virtual int enable(int32_t handle, int enabled);
/*
1) 从data_fd read input_event
2) 调用processEvent对事件进行处理
3) 把事件通过data返回
*/
virtual int readEvents(sensors_event_t* data, int count);
void processEvent(int code, int value);
private:
int update_delay();
uint32_t mEnabled;
uint32_t mPendingMask;
InputEventCircularReader mInputReader;
sensors_event_t mPendingEvents[numSensors];
uint64_t mDelays[numSensors];
};


3. 加载HAL

HAL 为一个.so库,其加载过程相关代码如下:

[cpp] view plain copy print ?
  1. #define HAL_LIBRARY_PATH1 "/system/lib/hw"   
  2. #define HAL_LIBRARY_PATH2 "/vendor/lib/hw"   
  3. #define SENSORS_HARDWARE_MODULE_ID "sensors"   
  4.   
  5. SensorDevice::SensorDevice()  
  6.     :  mSensorDevice(0),  
  7.        mSensorModule(0)  
  8. {  
  9.     status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID,  
  10.             (hw_module_t const**)&mSensorModule);  
  11.   
  12.     ALOGE_IF(err, "couldn't load %s module (%s)",  
  13.             SENSORS_HARDWARE_MODULE_ID, strerror(-err));  
  14.   
  15.     if (mSensorModule) {  
  16.         err = sensors_open(&mSensorModule->common, &mSensorDevice);  
  17.   
  18.         ALOGE_IF(err, "couldn't open device for module %s (%s)",  
  19.                 SENSORS_HARDWARE_MODULE_ID, strerror(-err));  
  20.   
  21.         if (mSensorDevice) {  
  22.             sensor_t const* list;  
  23.             ssize_t count = mSensorModule->get_sensors_list(mSensorModule, &list);  
  24.             mActivationCount.setCapacity(count);  
  25.             Info model;  
  26.             for (size_t i=0 ; i<size_t(count) ; i++) {  
  27.                 mActivationCount.add(list[i].handle, model);  
  28.                 mSensorDevice->activate(mSensorDevice, list[i].handle, 0);  
  29.             }  
  30.         }  
  31.     }  
  32. }  
  33.   
  34. int hw_get_module(const char *id, const struct hw_module_t **module)  
  35. {  
  36.     return hw_get_module_by_class(id, NULL, module);  
  37. }  
  38.   
  39.   
  40. int hw_get_module_by_class(const char *class_id, const char *inst,  
  41.                            const struct hw_module_t **module)  
  42. {  
  43.     int status;  
  44.     int i;  
  45.     const struct hw_module_t *hmi = NULL;  
  46.     char prop[PATH_MAX];  
  47.     char path[PATH_MAX];  
  48.     char name[PATH_MAX];  
  49.   
  50.     if (inst)  
  51.         snprintf(name, PATH_MAX, "%s.%s", class_id, inst);  
  52.     else  
  53.         strlcpy(name, class_id, PATH_MAX);  
  54.   
  55.     /* 
  56.      * Here we rely on the fact that calling dlopen multiple times on 
  57.      * the same .so will simply increment a refcount (and not load 
  58.      * a new copy of the library). 
  59.      * We also assume that dlopen() is thread-safe. 
  60.      */  
  61.   
  62.     /* Loop through the configuration variants looking for a module */  
  63.     for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {  
  64.         if (i < HAL_VARIANT_KEYS_COUNT) {  
  65.             if (property_get(variant_keys[i], prop, NULL) == 0) {  
  66.                 continue;  
  67.             }  
  68.             snprintf(path, sizeof(path), "%s/%s.%s.so",  
  69.                      HAL_LIBRARY_PATH2, name, prop);  
  70.             if (access(path, R_OK) == 0) break;  
  71.   
  72.             snprintf(path, sizeof(path), "%s/%s.%s.so",  
  73.                      HAL_LIBRARY_PATH1, name, prop);  
  74.             if (access(path, R_OK) == 0) break;  
  75.         } else {  
  76.             snprintf(path, sizeof(path), "%s/%s.default.so",  
  77.                      HAL_LIBRARY_PATH1, name);  
  78.             if (access(path, R_OK) == 0) break;  
  79.         }  
  80.     }  
  81.   
  82.     status = -ENOENT;  
  83.     if (i < HAL_VARIANT_KEYS_COUNT+1) {  
  84.         /* load the module, if this fails, we're doomed, and we should not try 
  85.          * to load a different variant. */  
  86.         status = load(class_id, path, module);  
  87.     }  
  88.   
  89.     return status;  
  90. }  
#define HAL_LIBRARY_PATH1 "/system/lib/hw"
#define HAL_LIBRARY_PATH2 "/vendor/lib/hw"
#define SENSORS_HARDWARE_MODULE_ID "sensors"
SensorDevice::SensorDevice()
:  mSensorDevice(0),
mSensorModule(0)
{
status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID,
(hw_module_t const**)&mSensorModule);
ALOGE_IF(err, "couldn't load %s module (%s)",
SENSORS_HARDWARE_MODULE_ID, strerror(-err));
if (mSensorModule) {
err = sensors_open(&mSensorModule->common, &mSensorDevice);
ALOGE_IF(err, "couldn't open device for module %s (%s)",
SENSORS_HARDWARE_MODULE_ID, strerror(-err));
if (mSensorDevice) {
sensor_t const* list;
ssize_t count = mSensorModule->get_sensors_list(mSensorModule, &list);
mActivationCount.setCapacity(count);
Info model;
for (size_t i=0 ; i<size_t(count) ; i++) {
mActivationCount.add(list[i].handle, model);
mSensorDevice->activate(mSensorDevice, list[i].handle, 0);
}
}
}
}
int hw_get_module(const char *id, const struct hw_module_t **module)
{
return hw_get_module_by_class(id, NULL, module);
}
int hw_get_module_by_class(const char *class_id, const char *inst,
const struct hw_module_t **module)
{
int status;
int i;
const struct hw_module_t *hmi = NULL;
char prop[PATH_MAX];
char path[PATH_MAX];
char name[PATH_MAX];
if (inst)
snprintf(name, PATH_MAX, "%s.%s", class_id, inst);
else
strlcpy(name, class_id, PATH_MAX);
/*
* Here we rely on the fact that calling dlopen multiple times on
* the same .so will simply increment a refcount (and not load
* a new copy of the library).
* We also assume that dlopen() is thread-safe.
*/
/* Loop through the configuration variants looking for a module */
for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {
if (i < HAL_VARIANT_KEYS_COUNT) {
if (property_get(variant_keys[i], prop, NULL) == 0) {
continue;
}
snprintf(path, sizeof(path), "%s/%s.%s.so",
HAL_LIBRARY_PATH2, name, prop);
if (access(path, R_OK) == 0) break;
snprintf(path, sizeof(path), "%s/%s.%s.so",
HAL_LIBRARY_PATH1, name, prop);
if (access(path, R_OK) == 0) break;
} else {
snprintf(path, sizeof(path), "%s/%s.default.so",
HAL_LIBRARY_PATH1, name);
if (access(path, R_OK) == 0) break;
}
}
status = -ENOENT;
if (i < HAL_VARIANT_KEYS_COUNT+1) {
/* load the module, if this fails, we're doomed, and we should not try
* to load a different variant. */
status = load(class_id, path, module);
}
return status;
}

4. 启动SensorService

    SensorService在SystemServer中启动(system_init.cpp),其相关代码如下:

[cpp] view plain copy print ?
  1. extern "C" status_t system_init()  
  2. {  
  3.     ....  
  4.     property_get("system_init.startsensorservice", propBuf, "1");  
  5.     if (strcmp(propBuf, "1") == 0) {  
  6.         // Start the sensor service   
  7.         SensorService::instantiate();  
  8.     }  
  9.     ...  
  10.     return NO_ERROR;  
  11. }  
extern "C" status_t system_init()
{
....
property_get("system_init.startsensorservice", propBuf, "1");
if (strcmp(propBuf, "1") == 0) {
// Start the sensor service
SensorService::instantiate();
}
...
return NO_ERROR;
}

5. SensorManager注册Listener过程

[cpp] view plain copy print ?
  1. private SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);  
  2. registerListener(SensorManager.java)->  
  3.  registerListenerImpl (SystemSensorManager.java)->  
  4.   enableSensorLocked(SystemSensorManager.java)->  
  5.    sensors_enable_sensor(android_hardware_SensorManager.cpp)->  
  6.     SensorEventQueue::enableSensor(SensorEventQueue.cpp)->  
  7.      1>SensorService::SensorEventConnection::enableDisable(handle, true) (SensorService.cpp)->  
  8.          SensorService::enable(SensorService.cpp)->  
  9.            HardwareSensor::activate(SensorInterface.cpp)->  
  10.              SensorDevice::activate(SensorDevice.cpp)->  
  11.                sensors_poll_device_t::activate(HAL)  
  12.            
  13.      2>SensorService::SensorEventConnection::setEventRate(SensorService.cpp)->  
  14.        
private SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
registerListener(SensorManager.java)->
registerListenerImpl (SystemSensorManager.java)->
enableSensorLocked(SystemSensorManager.java)->
sensors_enable_sensor(android_hardware_SensorManager.cpp)->
SensorEventQueue::enableSensor(SensorEventQueue.cpp)->
1>SensorService::SensorEventConnection::enableDisable(handle, true) (SensorService.cpp)->
SensorService::enable(SensorService.cpp)->
HardwareSensor::activate(SensorInterface.cpp)->
SensorDevice::activate(SensorDevice.cpp)->
sensors_poll_device_t::activate(HAL)
2>SensorService::SensorEventConnection::setEventRate(SensorService.cpp)->


这篇关于android sensor framework的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/908179

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

Android逆向(反调,脱壳,过ssl证书脚本)

文章目录 总结 基础Android基础工具 定位关键代码页面activity定位数据包参数定位堆栈追踪 编写反调脱壳好用的脚本过ssl证书校验抓包反调的脚本打印堆栈bilibili反调的脚本 总结 暑假做了两个月的Android逆向,记录一下自己学到的东西。对于app渗透有了一些思路。 这两个月主要做的是代码分析,对于分析完后的持久化等没有学习。主要是如何反编译源码,如何找到