sensor hal(一)

通过谷歌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。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值