如何理解Sensor架构 - 华清远见 - 图文 下载本文

(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(\}else{

dev->sensors[ID_MAGNETIC_FIELD].magnetic.v[0] =(float)mag;

LOGE(\

*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(\}else{

buf[n - 1] = '\\0';

temp =(float) (atoi(buf) / 1000);

dev->sensors[ID_TEMPERATURE].temperature = temp; LOGE(\

*values = dev->sensors[ID_TEMPERATURE]; values->sensor = ID_TEMPERATURE; count++; }

close(dev->event_fd[1]);

dev->event_fd[1]= open(%usleep(500000); return ID_TEMPERATURE; }

else if(count%3 == 0) //读取方向传感器模拟值 {

LOGI(\/* 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; } } }

下面是另外的博主写的内容 1. 体系结构 2. 数据结构 3. 四大函数