Android sensor构建

  Android4.1 系统内置对传感器的支持达13种,他们分别是:加速度传感器(accelerometer)、磁力传感器(magnetic field)、方向传感器(orientation)、陀螺仪(gyroscope)、环境光照传感器(light)、压力传感器(pressure)、温度传感器(temperature)和距离传感器(proximity)等。

  Android实现传感器系统包括以下几个部分:

  1. java层
  2. JNI层
  3. HAL层
  4. 驱动层

  各部分之间架构图如下:

  


Sensor HAL层接口

  Google为Sensor提供了统一的HAL接口,不同的硬件厂商需要根据该接口来实现并完成具体的硬件抽象层。

  Android中Sensor的HAL接口定义在:hardware/libhardware/include/hardware/sensors.h

  对传感器类型的定义:

#define SENSOR_TYPE_ACCELEROMETER       1  //加速度传感器
#define SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力传感器
#define SENSOR_TYPE_ORIENTATION 3 //方向
#define SENSOR_TYPE_GYROSCOPE 4 //陀螺仪
#define SENSOR_TYPE_LIGHT 5 //环境光照传感器
#define SENSOR_TYPE_PRESSURE 6 //压力传感器
#define SENSOR_TYPE_TEMPERATURE 7 //温度传感器
#define SENSOR_TYPE_PROXIMITY 8 //距离传感器
#define SENSOR_TYPE_GRAVITY 9
#define SENSOR_TYPE_LINEAR_ACCELERATION 10 //线性加速度
#define SENSOR_TYPE_ROTATION_VECTOR 11
#define SENSOR_TYPE_RELATIVE_HUMIDITY 12 //湿度传感器
#define SENSOR_TYPE_AMBIENT_TEMPERATURE 13

  传感器模块的定义结构体如下:

struct sensors_module_t {
struct hw_module_t common;
int (*get_sensors_list)(struct sensors_module_t* module,
struct sensor_t const** list);
};

  该接口的定义实际上是对标准的硬件模块hw_module_t的一个扩展,增加了一个get_sensors_list函数,用于获取传感器的列表。

  对任意一个sensor设备都会有一个sensor_t结构体,其定义如下:

struct sensor_t {
const char* name; //传感器名字
const char* vendor;
int version; //版本
int handle; //传感器的handle句柄
int type; //传感器类型
float maxRange; //最大范围
float resolution; //解析度
float power; //消耗能源
int32_t minDelay; //事件间隔最小时间
void* reserved[8]; //保留字段,必须为0
};

  每个传感器的数据由sensors_event_t结构体表示,定义如下:

typedef struct sensors_event_t {
int32_t version;
int32_t sensor; //标识符
int32_t type; //传感器类型
int32_t reserved0;
int64_t timestamp; //时间戳
union {
float data[16];
sensors_vec_t acceleration; //加速度
sensors_vec_t magnetic; //磁矢量
sensors_vec_t orientation; //方向
sensors_vec_t gyro; //陀螺仪
float temperature; //温度
float distance; //距离
float light; //光照
float pressure; //压力
float relative_humidity; //相对湿度
};
uint32_t reserved1[4];
} sensors_event_t;

  其中,sensor为传感器的标志符,而不同的传感器则采用union方式来表示。

  sensors_vec_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;

  Sensor设备结构体sensors_poll_device_t,对标准硬件设备hw_device_t结构体的扩展,主要完成读取底层数据,并将数据存储在struct sensors_poll_device_t结构体中;

  poll函数用来获取底层数据,调用时将被阻塞定义如下:

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);
//获取数据
int (*poll)(struct sensors_poll_device_t *dev,
sensors_event_t* data, int count);
};

  控制设备打开/关闭结构体定义如下:

static inline int sensors_open(const struct hw_module_t* module,
struct sensors_poll_device_t** device) {
return module->methods->open(module,
SENSORS_HARDWARE_POLL, (struct hw_device_t**)device);
} static inline int sensors_close(struct sensors_poll_device_t* device) {
return device->common.close(&device->common);
}

Sensor HAL实现

打开设备时序图

  

  SensorDevice属于JNI层,与HAL进行通信的接口;

  JNI层调用了HAL层的open_sensors()方法打开设备模块,再调用poll__activate()对设备使能,然后调用poll__poll读取数据。

最新文章

  1. javascript中怎样区分元素和节点?
  2. web开发者谷歌浏览器常用插件
  3. layoutSubviews #pragma mark -
  4. Ajax异步刷新分页功能-MySQL
  5. 水题 ZOJ 3880 Demacia of the Ancients
  6. IE浏览器的兼容模式代码细节解读
  7. 新浪系统工程师笔试--shell
  8. [勘探开发]成绩,全栈开发,健全&借贷
  9. ETL作业调度工具TASKCTL软件安装乱码问题解决
  10. Hexo + GitHub Pages搭建博客
  11. Codeforces 830C On the Bench
  12. HDU [P3605] Escape
  13. HTML5 input 类型: email及url
  14. 【docker 入门 - 01】- Docker 在 Centos7 上安装与测试
  15. [Postman]响应(7)
  16. 51Nod1038 X^A Mod P 数论 原根 BSGS
  17. Docker系列之Docker容器(读书笔记)
  18. lua --- __newindex 的使用规则
  19. opencv掩模操作
  20. KMPlayer速度步进设置及快捷键设置和同级视频自动加入播放列表

热门文章

  1. linux下的文本编辑器VI的使用命令
  2. Java Exceptions
  3. Java多线程编程:Callable、Future和FutureTask浅析
  4. kickstart命令选项
  5. POJ 2676 Sudoku (DFS)
  6. Linux命令-进程后台执行:nohup(就是不挂起的意思)
  7. python selenium 常见问题列表
  8. 类名.class和getClass()区别
  9. H5 设备方向及运动API
  10. U811.1接口EAI系列之一--通用把XML传送给EAI处理方法--PowerBuilder语言