国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩

當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 >
Andriod Sensor 架構(gòu)深入剖析
時(shí)間:2018-08-16作者:華清遠(yuǎn)見

1、Android sensor架構(gòu)

Android4.0系統(tǒng)內(nèi)置對(duì)傳感器的支持達(dá)13種,它們分別是:加速度傳感器(accelerometer)、磁力傳感器(magnetic field)、方向傳感器(orientation)、陀螺儀(gyroscope)、環(huán)境光照傳感器(light)、壓力傳感器(pressure)、溫度傳感器(temperature)和距離傳感器(proximity)等。

Android實(shí)現(xiàn)傳感器系統(tǒng)包括以下幾個(gè)部分:

各部分之間架構(gòu)圖如下:

2、Sensor HAL層接口

Google為Sensor提供了統(tǒng)一的HAL接口,不同的硬件廠商需要根據(jù)該接口來實(shí)現(xiàn)并完成具體的硬件抽象層,Android中Sensor的HAL接口定義在:hardware/libhardware/include/hardware/sensors.h

對(duì)傳感器類型的定義:

傳感器模塊的定義結(jié)構(gòu)體如下:

該接口的定義實(shí)際上是對(duì)標(biāo)準(zhǔn)的硬件模塊hw_module_t的一個(gè)擴(kuò)展,增加了一個(gè)get_sensors_list函數(shù),用于獲取傳感器的列表。

對(duì)任意一個(gè)sensor設(shè)備都會(huì)有一個(gè)sensor_t結(jié)構(gòu)體,其定義如下:

每個(gè)傳感器的數(shù)據(jù)由sensors_event_t結(jié)構(gòu)體表示,定義如下:

其中,sensor為傳感器的標(biāo)志符,而不同的傳感器則采用union方式來表示,sensors_vec_t結(jié)構(gòu)體用來表示不同傳感器的數(shù)據(jù),sensors_vec_t定義如下:

Sensor設(shè)備結(jié)構(gòu)體sensors_poll_device_t,對(duì)標(biāo)準(zhǔn)硬件設(shè)備hw_device_t結(jié)構(gòu)體的擴(kuò)展,主要完成讀取底層數(shù)據(jù),并將數(shù)據(jù)存儲(chǔ)在struct sensors_poll_device_t結(jié)構(gòu)體中,poll函數(shù)用來獲取底層數(shù)據(jù),調(diào)用時(shí)將被阻塞定義如下:

控制設(shè)備打開/關(guān)閉結(jié)構(gòu)體定義如下:

3、Sensor HAL實(shí)現(xiàn)(以LM75溫度傳感器為例子)

(1)打開設(shè)備流程圖

(2)實(shí)現(xiàn)代碼分析

在代碼中含有兩個(gè)傳感器ADC電位器和LM75溫度傳感器,所以在sensor.c中,首先需要定義傳感器數(shù)組device_sensor_list[],其實(shí)就是初始化struct sensor_t結(jié)構(gòu)體,初始化如下:

定義open_sensors函數(shù),來打開Sensor模塊,代碼如下:

在這個(gè)方法中,首先需要為hw_device_t分配內(nèi)存空間,并對(duì)其初始化,設(shè)置重要方法的實(shí)現(xiàn)。

control_open_data_source()打開傳感器并使能設(shè)備:

調(diào)用sensor__data_poll方法讀取數(shù)據(jù):

/*輪詢讀取數(shù)據(jù)*/
        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) // 讀。粒模弥
            {
                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;
                 &nbnbsp;  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;
              }
            }
        }

Sensor相關(guān)技術(shù):

Sensor框架結(jié)構(gòu)分析

Sensor HAL框架分析


發(fā)表評(píng)論

全國(guó)咨詢電話:400-611-6270,雙休日及節(jié)假日請(qǐng)致電值班手機(jī):15010390966

在線咨詢: 曹老師QQ(3337544669), 徐老師QQ(1462495461), 劉老師 QQ(3108687497)

企業(yè)培訓(xùn)洽談專線:010-82600901,院校合作洽談專線:010-82600350,在線咨詢:QQ(248856300)

Copyright 2004-2018 華清遠(yuǎn)見教育科技集團(tuán) 版權(quán)所有 ,京ICP備16055225號(hào),京公海網(wǎng)安備11010802025203號(hào)