第一范文网 - 专业文章范例文档资料分享平台

传感器SensorService详细分析

来源:用户分享 时间:2025/7/15 4:31:33 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

mSensorServer是对ISensorServer对象的强引用,在SensorManager初始化时通过getService()方法在ServiceManager中查找“sensorservice”对应的服务,并赋值给mSensorServer。由第4小节可知,ServiceManager中返回的就是SensorService实例。从SensorService的类图也能看出,SensorService是ISensorServer的子类。

CreateSensorEventConnection()方法创建了一个SensorEventConnection对象,并将该对象的强引用返回给SensorManager。

SensorEventConnection是SensorService的内部类,该类在构造时主要进行了一些初始化参数列表工作,其中最主要的操作是new BitTube(),创建完成后,SensorEventConnection中会保存一个对BitTube对象的强引用。

BitTube是一个字节管道,可以在进程间进行数据传递。在构造BiTube对象时,首先创建一对匿名的、互相连接的Unix域套接字,然后将用于数据接收的Socket赋给mReciveFd,将用于数据发送的Socket赋给mSensorFd。

现在SensorService中的这部分工作已经完成,mSensorEventConnection中保存了对BitTube对象的强引用,SensorManager保存了对mSensorEventConnection的强引用。接着SensorManager将mSensorEventConnection作为参数构造SensorEventQueue对象。

SensorEventQueue的构造函数中主要工作是初始化mRecBuffer数组,其中ASensorEvent结构体定义与hardware/sensors.h中sensors_event_t结构体完全一致。

由于SensorManager中生成的是SensorEventQueue的强引用,onFirstRef()函数会被调用。该函数的执行结果就是得到了mSensorEventConnection中保存的mBitTube对象引用。

由此,createSensorEventQueue()函数执行完成后,mSensorEventConnection中保存了mBitTube的引用,mSensorEventQueue中保存了mSensorEventConnection和mBitTube的引用。

再返回到JNI部分,现在nativeInitSensorEventQueue中获得了mSensorEventQueue

android_os_MessageQueue_getMessageQueue()得到一个MessageQueue对象的引用,利用mSensorEventQueue和mMessageQueue,以及Java层SensorEventQueue对象来构造Receiver类实例。

Receiver负责监听服务端事件,并将事件回调给Java层SensorEventQueue进行分发。事件监听的文件描述符及回调接口在onFirstRef函数中指定。mSensorQueue->getFd()中返回的是mBitTube中的mReceiveFd,this指定了监听到事件时的回调对象,当消息队列监听到mReceiveFd中有事件产生时,就会回调this->handleEvent()方法对事件进行处理。

handleEvent函数会对数据进行分类,最后回调Java层SensorEventQueue中的dispatchSensorEvent方法把数据分发到对应的SensorEventListener对象进行处理。至此,第一步new SensorEventQueue()完成。

第二步调用addSensor()方法启用传感器。首先从mActiveSensors中检查该传感器是否已激活,如果已激活则返回false。但是,mActiveSensors是BaseEventQueue的成员变量,不是SystemSensorManager的全局变量,每一个BaseEventQueue对象都对应一个mActiveSensors。考虑到一个BaseEventQueue

只能对应一个SensorEventListener,所以除非是mListener和Sensor对象都相同才会返回false,否则不管是同一种传感器注册了另一个Listener对象,还是同一个Listener注册到另一种传感器上,都会继续执行enableSensor。

enableSensor()会调用JNI层的nativeEnableSensor()函数,然后依次调用SensorEventQueue—> SensorEventConnection中的enableDisable()函数,由于注册Listener时是启用传感器,所以会执行SensorService的enable()函数,同时SensorEventConnection会将自身作为参数传递给enable()函数。

enable()函数会首先检查要启用的传感器是否已处于激活状态,如果未激活,则创建SensorRecord对象,用于管理连接到该类型传感器的SensorEventConnection对象。创建完成后将SensorEventConnection对象保存到其中,同时将该传感器handle和SensorRecord对象添加到mActiveSensors中。如果已激活,则只将mConnection添加到SensorRecord中,如果该传感器数据上报类型为ON_CHANGE,则立即将上一次得到的数据通过新mConnection上报。Sensor激活状态检查完成后,将要启用的Sensor Handle保存到mConnection中,用于标识该通道可以传递哪些类型传感器的数据,然后将该mConnection添加到mActivieConnection中。最后调用activate方法激活该传感器。

sensor是指向SensorInterface类实例的指针,不管是HardwareSensor,还是GravitySensor、OrientationSensor等Virtual Sensor都是其子类,这些子类的activate()方法最终都通过SensorDevice::activate()方法与HAL层Sensors.cpp中的sensors_poll_context_t::activate()进行关联。不同之处在于HardwareSensor中直接调用SensorDevice::activate()激活对应类型传感器,而Virtual Sensor是通过SensorFusion::activate()间接调用,并且会同时激活Acc、Mag、Gyro三种传感器。

7. onSensorChange

SensorService的主线程开始运行后,会通过poll()方法不断从HAL层获取数据,当获取到数据后,通过相应的SensorEventConnection对象写入到共享内存区域BitTube中,MessageQueue中会监听接收端mReceiverFd的事件,当有事件写入时,会将事件取出并回调Receiver::handleEvent()方法,接着通过JNI机制回调Java层SystemSensorManager进行处理。

的内部类SensorEventQueue

中的

dispatchSensorEvent()方法,该方法最终将数据分发给对应的SensorEventListener

7.1 SensorService::threadLoop()

SensorService启动后,threadLoop()函数不断循环等待HAL层上报的数据。

mSensorDevice在SensoerDevice类对象构造时通过open_sensor_1()函数进行初始化,Qcom Sensor HAL中该方法的最终实现是在sensors.cpp的open_sensors()函数。在open_sensors()中,函数指针poll被赋值为poll__poll()函数的地址。

DataTransfer.jpg

poll__poll()函数体内就是调用sensor_poll_context_t::pollEvents()函数,pollEvents()会依次查看每个传感器是否有事件产生,若有则通过NativeSensorManager::readEvents()方法读取事件。遍历完全部传感器并读取到了事件,或者未遍历完全部传感器但已读取到指定数量的事件,都会将事件返回给

搜索更多关于: 传感器SensorService详细分析 的文档
传感器SensorService详细分析.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c0y5n47mjjp6ehs74cpcj_4.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top