通过谷歌android的架构,在开机时启动android.hardware.sensors@1.0-servicezheg 服务,可以通过命令pe -ef |grep sensor 看到;然后就会加载sensor hal的库!
Hal的代码位置:vendor/qcom/proprietary/sensors-see
目前主要采用的是2.0的架构,这边包含了framworks(hal)和sensors(ssc-hal)文件夹;也就是通常说的hal和ssc-hal
在这个sensors文件夹里面包含了很多sensor的hal层文件,也就是.cpp文件。底层和这边是相互对应的
a+g的.cpp文件会调用senosr_moudle_init 这个就是每个.cpp的入口了
第一个factory就是为了注册sensor,相应的操作函数,第二个factory时为了注册未校准的函数,第三个应该时为了注册数据类型然后,还有个len=property_get()这个应该是为了跟校准相关的。
上面的这些函数的具体实现都是在sensor-see/sensors-hal-2.0/framwork/sensor_factory.h文件中
首先来看上面第一个factory中的 get_available_accel_calibrated函数
//accelerometer.cpp
static vector<unique_ptr<sensor>> get_available_accel_calibrated()
{
const vector<sensor_uid>& accel_suids =
sensor_factory::instance().get_suids(SSC_DATATYPE_ACCEL);
// No.1 得到sensor的suid!得到sensortype的suids,通过datatype来找对应的suid
vector<unique_ptr<sensor>> sensors;
for (const auto& suid : accel_suids) {
if (!(sensor_factory::instance().get_settings() // No.2 看看是不是wakeup类型的sensor
& DISABLE_WAKEUP_SENSORS_FLAG)) {
try {
sensors.push_back(make_unique<accelerometer>(suid, SENSOR_WAKEUP, //No.3开始创建sensor,创建acceleromter
SENSOR_CALIBRATED));
} catch (const exception& e) {
sns_loge("failed for wakeup, %s", e.what());
}
}
try {
sensors.push_back(make_unique<accelerometer>(suid, SENSOR_NO_WAKEUP,
SENSOR_CALIBRATED));//同时创建了nowakeup的
} catch (const exception& e) {
sns_loge("failed for nowakeup, %s", e.what());
}
}
return sensors;
}
No.2中:通过getsetting来查看是否有DISABLE_WAKEUP_SENSORS_FLAG flag,若有则为no wakeup,若无则为wake up sensor。
No.3中:为调用accelerometer的构造函数。
再来看看怎么得到这个suid的,也还是在sensor-see/sensors-hal-2.0/framwork/sensor_factory.h文件中实现,
const std::vector<sensor_uid>& sensor_factory::get_suids(const std::string& datatype) const
{
auto it = _suid_map.find(datatype);
if (it != _suid_map.end()) {
return it->second;
} else {
static vector<sensor_uid> empty;
return empty;
}
从_suids_map中查找datatype来获取accel的suid。那什么时候将accel的suid插入到_suids_map中内,不知道
然后再来看看得到了suid后是怎么创建这个acceleromter这个sensor的,也是是上面的NO.3
accelerometer::accelerometer(sensor_uid suid,
sensor_wakeup_type wakeup,
sensor_cal_type cal_type):
ssc_sensor(suid, wakeup) // 设置常用参数
{
if (cal_type == SENSOR_UNCALIBRATED) {
//设置accel中不common的参数。比如string_type、sensor_typename、是否使用resampling、最大range、分辨率等等,也就是不常用参数
set_type(SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED);
set_string_type(SENSOR_STRING_TYPE_ACCELEROMETER_UNCALIBRATED);
set_sensor_typename("Accelerometer-Uncalibrated");
} else {
set_type(SENSOR_TYPE_ACCELEROMETER);
set_string_type(SENSOR_STRING_TYPE_ACCELEROMETER);
set_sensor_typename("Accelerometer");
}
...
_cal_type = cal_type;
set_fifo_reserved_count(ACCEL_RESERVED_FIFO_COUNT);
set_resampling(true);
/* convert range from Gs to m/s^2 */
set_max_range(get_sensor_info().maxRange * ONE_G);
/* convert resolution from mG to m/s^2 */
set_resolution(get_sensor_info().resolution * ONE_G / 1000.0);
}
到目前为止,accem.cpp这个文件基本介绍完成。除此之外还有个很重要的函数,这个函数用于传递数据的handle_sns_std_sensor_event。
//accelerometer.cpp
virtual void handle_sns_std_sensor_event(
const sns_client_event_msg_sns_client_event& pb_event) override;
void accelerometer::handle_sns_std_sensor_event(
const sns_client_event_msg_sns_client_event& pb_event)
{
sns_std_sensor_event pb_sensor_event;
pb_sensor_event.ParseFromString(pb_event.payload());
sensors_event_t hal_event = create_sensor_hal_event(pb_event.timestamp());
if (_cal_type == SENSOR_CALIBRATED) {
hal_event.acceleration.x = pb_sensor_event.data(0);
hal_event.acceleration.y = pb_sensor_event.data(1);
hal_event.acceleration.z = pb_sensor_event.data(2);
hal_event.acceleration.status =
sensors_hal_sample_status(pb_sensor_event.status());
...
}
if (_cal_type == SENSOR_UNCALIBRATED) {
hal_event.uncalibrated_accelerometer.x_uncalib = pb_sensor_event.data(0);
hal_event.uncalibrated_accelerometer.y_uncalib = pb_sensor_event.data(1);
hal_event.uncalibrated_accelerometer.z_uncalib = pb_sensor_event.data(2);
hal_event.uncalibrated_accelerometer.x_bias = 0;
hal_event.uncalibrated_accelerometer.y_bias = 0;
hal_event.uncalibrated_accelerometer.z_bias = 0;
....
}
submit_sensors_hal_event(hal_event);
}
//framework/ssc_sensor.cpp
void ssc_sensor::handle_sns_std_sensor_event(
const sns_client_event_msg_sns_client_event& pb_event)
{
sns_std_sensor_event pb_stream_event;
pb_stream_event.ParseFromString(pb_event.payload());
sensors_event_t hal_event = create_sensor_hal_event(pb_event.timestamp());
int num_items = pb_stream_event.data_size();
...
for (int i = 0; i < num_items; i++) {
hal_event.data[i] = pb_stream_event.data(i);
}
...
submit_sensors_hal_event(hal_event);
}
这个函数在framework/ssc_sensor.cpp中也有实现,在这里是虚函数,在accelerometer.cpp对其进行了重写,当有加速度上报数据的时候,就会调用到这里!!!
若sensors文件中xxxx.cpp中没有重写handle_sns_std_sensor_event则可以使用framework common的进行实现,若有的话,则使用xxxx.cpp中的handle_sns_std_sensor_event。