libgui
源代码位于:frameworks/native/libs/gui。
头文件位于:frameworks/native/include/gui。
在显示部分涉及到libgui,其中与传感器相关的功能之前没有提及,主要涉及以下几个类:
Sensor描述一个传感器设备。
ISensorServer定义传感器服务接口。
ISensorEventConnection定义与ISensorServer的连接,传感器事件通过BitTube传递。
SensorEventQueue封装ISensorEventConnection,从BitTube读取事件。
SensorManager封装ISensorServer,ISensorServer由Binder服务“sensorservice”实现。
libsensorservice
源代码位于:frameworks/native/services/sensorservice。
SensorDevice封装HAL传感器模块,其嵌套类Info保存了各个用户对一个传感器设备设置的batch参数(BatchParams),实际设置到HAL层的参数是其中的最小值。用户disable设备实际就是删除Info中batchParams的一项。
SensorInterface代表一个传感器,定义了对传感器设备的操作虚接口。HardwareSensor派生实现了SensorInterface接口,内部保存Sensor结构体(使用其句柄),通过SensorDevice的接口实现其功能。
SensorService实现ISensorServer接口,管理Sensor列表,用户连接SensorEventConnection。
成员 | 类型 | 说明 |
mSensorList | Vector<Sensor> | 所有传感器,包括虚拟传感器 |
mUserSensorList | Vector<Sensor> | 用户可见的传感器,包括部分虚拟传感器 |
mSensorMap | DefaultKeyedVector<int, SensorInterface*> | 所有传感器的实现对象 |
mVirtualSensorList | Vector<SensorInterface *> | 所有虚拟传感器 |
mActiveSensors | DefaultKeyedVector<int, SensorRecord*> | 活动的传感器,以传感器句柄为索引,与该传感器所有活动连接 |
mActiveVirtualSensors | DefaultKeyedVector<int, SensorInterface*> | 活动的虚拟传感器 |
mActiveConnections | SortedVector< wp<SensorEventConnection> > | 所有活动(至少active一个传感器)的连接 |
mLastEventSeen | KeyedVector<int32_t, sensors_event_t> | 以传感器句柄为索引,其最后一个事件 |
SensorService继承Thread,通过内部线程调用SensorDevice的poll方法。
SensorService保存每个传感器的最后一个事件,当有新的连接使用没有传感器,并且该传感器不属于连续事件类型时,将立即发送最后一个事件。
SensorService::SensorEventConnection实现ISensorEventConnection接口,保存用户UID,维护一个BitTube管道,用于发送传感器事件给用户。
Fusion使用角速度、加速度、磁场计算旋转矩阵。
SensorFusion使用Fusion计算旋转矩阵,需要角速度传感器(陀螺仪,GYROSCOPE)、加速度传感器(ACCELEROMETER)、磁场传感器(MAGNETIC_FIELD)。SensorFusion使用mClients保存用户列表,在需要时激活。
GravitySensor模拟重力加速度传感器。通过旋转矩阵的z列(第3列)乘以地球引力常量(GRAVITY_EARTH)计算。
LinearAccelerationSensor模拟线加速度传感器。线加速度等于加速度减去重力加速度。
RotationVectorSensor模拟旋转矢量传感器,旋转矢量即Fusion的Attribute。
OrientationSensor模拟姿态传感器,通过旋转矩阵计算。