Android Sensor底层框架
来源:互联网 发布:excel如何填充数据 编辑:程序博客网 时间:2024/05/01 12:16
1、Android sensor架构
Android4.0系统内置对传感器的支持达13种,它们分别是:加速度传感器 (accelerometer)、磁力传感器(magnetic field)、方向传感器(orientation)、陀螺仪(gyroscope)、环境光照传感器(light)、压力传感器(pressure)、 温度传感器(temperature)和距离传感器(proximity)等。
Android实现传感器系统包括以下几个部分:
各部分之间架构图如下:
2、Sensor HAL层接口
Google为Sensor提供了统一的HAL接口,不同的硬件厂商需要根据该接口来实现并完成具体的硬件抽象层,Android中Sensor的HAL接口定义在:hardware/libhardware/include/hardware/sensors.h
对传感器类型的定义:
传感器模块的定义结构体如下:
该接口的定义实际上是对标准的硬件模块hw_module_t的一个扩展,增加了一个get_sensors_list函数,用于获取传感器的列表。
对任意一个sensor设备都会有一个sensor_t结构体,其定义如下:
每个传感器的数据由sensors_event_t结构体表示,定义如下:
其中,sensor为传感器的标志符,而不同的传感器则采用union方式来表示,sensors_vec_t结构体用来表示不同传感器的数据,sensors_vec_t定义如下:
Sensor设备结构体sensors_poll_device_t,对标准硬件设备 hw_device_t结构体的扩展,主要完成读取底层数据,并将数据存储在struct sensors_poll_device_t结构体中,poll函数用来获取底层数据,调用时将被阻塞定义如下:
控制设备打开/关闭结构体定义如下:
3、Sensor HAL实现(以LM75温度传感器为例子)
(1)打开设备流程图
(2)实现代码分析
在代码中含有两个传感器ADC电位器和LM75温度传感器,所以在sensor.c中,首先需要定义传感器数组device_sensor_list[],其实就是初始化struct sensor_t结构体,初始化如下:
定义open_sensors函数,来打开Sensor模块,代码如下:
在这个方法中,首先需要为hw_device_t分配内存空间,并对其初始化,设置重要方法的实现。
control_open_data_source()打开传感器并使能设备:
调用sensor__data_poll方法读取数据:
/*轮询读取数据*/ static int sensors__data_poll(struct sensors_data_context_t *dev, sensors_data_t * values) { int n; int mag; float temp; char buf[10]; while (1) { if(count % 3 == 2) // 读取ADC值 { if( read(dev->event_fd[0], &mag, sizeof(mag)) < 0) { LOGE("read adc error"); }else{ dev->sensors[ID_MAGNETIC_FIELD].magnetic.v[0] =(float)mag; LOGE("read adc %f\n",(float)mag); *values = dev->sensors[ID_MAGNETIC_FIELD]; values->sensor = ID_MAGNETIC_FIELD; count++; } usleep(500000); return ID_MAGNETIC_FIELD; } else if(count%3 == 1) //读取温度传感器值 { memset(buf, 0 ,sizeof(buf)); if((n = read(dev->event_fd[1], buf, 10)) < 0) { LOGE("read temp error"); }else{ buf[n - 1] = '\0'; temp =(float) (atoi(buf) / 1000); dev->sensors[ID_TEMPERATURE].temperature = temp; LOGE("read temp %f\n",temp); *values = dev->sensors[ID_TEMPERATURE]; values->sensor = ID_TEMPERATURE; count++; } close(dev->event_fd[1]); dev->event_fd[1]= open("/sys/bus/i2c/devices/0-0048/temp1_input", O_RDONLY); usleep(500000); return ID_TEMPERATURE; } else if(count%3 == 0) //读取方向传感器模拟值 { LOGI("read orientation\n"); /* fill up data of orientation */ dev->sensors[ID_ORIENTATION].orientation.azimuth = x + 5; dev->sensors[ID_ORIENTATION].orientation.pitch = y + 5; dev->sensors[ID_ORIENTATION].orientation.roll = z + 5; *values = dev->sensors[ID_ORIENTATION]; values->sensor = ID_ORIENTATION; count++; x += 0.0001; y += 0.0001; z += 0.0001; usleep (500000); return ID_ORIENTATION; } } }
- Android Sensor底层框架
- Android Sensor 框架
- android sensor 框架分析---sensor数据流分析
- android sensor 框架分析---sensor native分析
- android sensor 框架分析---sensor 总结
- android-5.0 sensor框架简介
- android sensor 框架分析---服务端
- android sensor 框架分析---客户端
- Android 底层框架笔记
- android sensor 框架--Java层
- 【Android】Sensor框架Framework层解读
- Android Sensor框架简述(一)
- Android Sensor框架简述(二)
- 【Android】Sensor框架Framework层解读
- Android Sensor框架简述(三)
- Android 6.0 sensor 框架详解 (application层)
- Android 6.0 sensor 框架详解(前言)
- Android-Framework:Sensor框架Framework层解读
- CodeForces Gym 100646H You’ll be Working on the Railroad
- Codeforces 597B: Restaurant(贪心+结构体排序)
- 蓝桥杯ADV-172 算法提高 身份证排序
- PAT甲级.1046. Shortest Distance (20)
- 蓝桥杯 ADV-170算法提高 数字黑洞
- Android Sensor底层框架
- 第十五章 Models
- Genymotion 虚拟机下载、安装、测试
- 对于使用qq邮箱收不到邮箱验证码和流量日报的童鞋,QQ邮箱域名白名单的设置
- 蓝桥杯 ADV-120算法提高 6-17复数四则运算
- Spark读取Hbase中的数据
- 玩转github
- Hibernate的悲观锁并发控制机制及LockMode
- 使用setprecision控制输出流显示浮点数的有效数字个数(C++)