android_G_ALS_PS_sensor_上层到底层流程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Sensor包括G –sensor P-sensor AL-sensor等所有手机使用的传感器,都是由sensormanager 来管理,APP 通过registerlistener 与unregisterlistener 来注册监听与去监听来使用相应的sensor.通过sensor Event 来读取sensor 的数据。
从而控制所需要的功能。
代码位置在
/framework/base/core/java/android/hardware/SensorManager.java
unregisterListener(Object listener);
registerListener(SensorEventListener listener, Sensor sensor, int rate, Handler handler);
传递的SensorEventListener 来接收底层传来的数据变化。
在注册监听的函数里面会调用将sensor enable 函数,如下
private boolean enableSensorLocked(Sensor sensor, int delay) {
boolean result = false;
for (ListenerDelegate i : sListeners) {
if (i.hasSensor(sensor)) {
String name = sensor.getName();
int handle = sensor.getHandle();
result = sensors_enable_sensor(sQueue, name, handle, delay);//JNI 调用接口
break;
}
}
return result;
在JNI 层,代码位置为/framework /base/core/jni/ android_hardware_SensorManager.cpp 代码中。
APP 通过sensors_data_poll 函数来读取event中的数据,对数据进行处理,形成相应的功能。
在SensorManager中会打开一个线程一直在调用此函数,查询sensor数据或者状态是否有改变。
代码中调用的read waitForeEvent 方法都是在SensorEventQueue 中实现的。
从JNI调用的打开关闭函数,从代码中可以看到时SensorEventQueue 类中的enable Disable 方法。
再接着往下调用时ISensorEventConnection.cpp中的方法,代码位置在/framework/base/libs/gui/.
以上都是client端的层层调用。
在android中程序架构使用C-S 即客户端(client)—服务端(service)。
2者通过BINDER 相互连接。
在enableDisabLe函数中的remote()->transcact 函数就是通过binder 将数据传送到service端,这样做的好做,降低程序的低耦合性,使用上层界面更加流程,而不受调用底层功能相关接口的束缚。
SensorService.cpp
代码位置为:/framewore/base/services/sensorservice/
其中的sensor->activate(connection.get(), true)函数是调用流程通往底层的接口。
代码位置为/framework/base/services/sensorservices/SensorInterface.cpp
代码位置/framework/base/services/sensorservices/SensorDevice.cpp
在SensorDevice层,在activate函数中会调用到HAL层的sensor 的activate函数。
Info& info( mActivationCount.editValueFor(handle) );
int32_t& count(info.count);
上面的count是上层不同sensor对应的enable 的count,相当于做了保护的功能。
记录了上层sensor 的打开次数。
每个Sensor都有自己的COUNT值,彼此不冲突。
C=android_atomic_inc(&count)
C=android_atomic_dec (&count)
返回之前的后,再将count加1 或减1 操作。
以上2个函数是原子操作,对共享内存的操作加的同步措施。
代码位置为/mediate/source/hardware/sensor/hwmsen/
在HAL 首先会调用open-sensors函数在初始化的时候,填充sensors_data_context_t此结构体,这也是上面通过此结构来调用底层的相关接口的,
即hwm_activate 进行打开与关闭sensor 的。