Sensor 代码流程分析

android sensor 是怎样获得sensorlist的 从java层到SEE层看怎样得到sesorlist的 frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java SensorManager sensorManager = new SystemSensorManager(mContext, mHandler.getLooper()... 阅读详情

本文针对android 2.3 版本的sensor从应用到hal层接口进行逐层分析。4.0的代码也拿到了,不过还没有来得及进行分析。

一、应用程序,一般的应用程序写法:

package com.sensors.testSensor; 

import android.app.Activity;

import android.os.Bundle;

 

import android.util.Log;

import android.widget.TextView;

import android.hardware.SensorManager;

import android.hardware.Sensor;

import android.hardware.SensorEvent;

import android.hardware.SensorEventListener;

 

public class testSensor extends Activity {

    SensorManager sensormanager = null;

    Sensor lightSensor = null;

    TextView accTextView = null;

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

    sensormanager = (SensorManager)getSystemService(SENSOR_SERVICE);   // 获取SensorManager 客户端对象

    lightSensor = sensormanager.getDefaultSensor(Sensor.TYPE_LIGHT);   // 获取LIGTH传感器,或者直接传入Sensor.TYPE_ALL 获取所有的sensorList

    accTextView = (TextView)findViewById(R.id.textview_name);

    }

   

    SensorEventListener lsn = new SensorEventListener() {  

        public void onSensorChanged(SensorEvent e) {

       if (e.sensor == lightSensor) {

             Log.d("sensor", "found light sensor");

                accTextView.setText("data is " + e.values[0]);

        }

        }  

 

        public void onAccuracyChanged(Sensor s, int accuracy) {  

//TODO

        }  

    };    

    @Override   

    protected void onResume() {       //注册传感器

     super.onResume();      // register this class as a listener for the orientation and accelerometer sensors       

     sensormanager.registerListener(lsn, lightSensor, SensorManager.SENSOR_DELAY_NORMAL);

    }       

    @Override   

    protected void onStop() {        // unregister listener        

     sensormanager.unregisterListener(lsn, lightSensor);

     super.onStop();   

    }  

}


总之,应用中实现如下两个重要回调函数即可捕获sensor data数据:

public void onSensorChanged(SensorEvent e)
public void onAccuracyChanged(Sensor s, int accuracy)


首先来张整体模块图,让大家有个总体认识 :



二、分析客户端的实现

首先获取到所有sensor列表
public List<Sensor> getSensorList(int type)


加入到ListenerDelegate监控列表中
public boolean registerListener(SensorListener listener, int sensors)


l = new ListenerDelegate(listener, sensor, handler);
sListeners.add(l);


使能或禁能调用(启动哪些sensor采集数据):
private boolean enableSensorLocked(Sensor sensor, int delay)


sensors_enable_sensor --> jni (sensors_enable_sensor) -->  
利用binder调用sensorservice 的 enableDisable函数


获取数据:
final int sensor = sensors_data_poll(sQueue, values, status, timestamp);
--> jni (sensors_data_poll) --> 调用sensordevice中的ssize_t poll(sensors_event_t* buffer, size_t count)函数


不过这个中间有个sensorchannel的机制,这里充分利用了pipe机制
SensorChannel::SensorChannel()
    : mSendFd(-1), mReceiveFd(-1)
{
    int fds[2];
    if (pipe(fds) == 0) {
        mReceiveFd = fds[0];
        mSendFd = fds[1];
        fcntl(mReceiveFd, F_SETFL, O_NONBLOCK);
        fcntl(mSendFd, F_SETFL, O_NONBLOCK);
    }
}

/* sensorservice 往管道中写入数据 */
ssize_t SensorChannel::write(void const* vaddr, size_t size)
{
    ssize_t len = ::write(mSendFd, vaddr, size);
    if (len < 0)
        return -errno;
    return len;
}


/* 从管道中读取数据 */
ssize_t SensorChannel::read(void* vaddr, size_t size)
{
    ssize_t len = ::read(mReceiveFd, vaddr, size);
    if (len < 0)
        return -errno;
    return len;
}


对于SensorManager.cpp 说明一下:

首先获取sensorService的服务:

    const String16 name("sensorservice");
    while (getService(name, &mSensorServer) != NO_ERROR) {
        usleep(250000);
    }


三、分析服务端的实现

sensorService的注册:

system_init.cpp 

extern "C" status_t system_init()
{  

   // Start the sensor service
     SensorService::instantiate();

}

-->

static void instantiate() { publish(); }

    static status_t publish() {
        sp<IServiceManager> sm(defaultServiceManager());
        return sm->addService(String16(SERVICE::getServiceName()), new SERVICE());
    }


利用BinderService的publish方法进行注册,所以可以在这里看到:

class SensorService :
        public BinderService<SensorService>,
        public BnSensorServer,
        protected Thread

重要的一些函数说明:

加入监控的sensor设备
virtual status_t enableDisable(int handle, bool enabled);
--->
sensor->activate(connection.get(), true)
-->
SensorRecord * rec = new SensorRecord(connection);;
rec->addConnection(connection) --> connection->sendEvents(&event, 1);


获取sensordevice的数据并写入sensorchannel:
bool SensorService::threadLoop()
{
while(1){
/* poll sensor device data */
count = device.poll(buffer, numEventMax);

recordLastValue(buffer, count);

// send our events to clients...
connection->sendEvents(buffer, count, scratch);
...
}
}


四、客户端与服务端通讯过程

利用binder机制即可,列出重要的代码:

class ISensorEventConnection : public IInterface  // 用于客户端
{
public:
    DECLARE_META_INTERFACE(SensorEventConnection);     // 声明一个SensorEventConnection模板

...

}


class BnSensorEventConnection : public BnInterface<ISensorEventConnection> // 服务端代码

{
public:
    virtual status_t    onTransact( uint32_t code,
                                    const Parcel& data,
                                    Parcel* reply,
                                    uint32_t flags = 0);
};

实现中重要的实现:

IMPLEMENT_META_INTERFACE(SensorEventConnection, "android.gui.SensorEventConnection");


status_t BnSensorEventConnection::onTransact(
    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
    switch(code) {

case XXX:

break;

    }

return BBinder::onTransact(code, data, reply, flags);

}


ok, 对于binder机制的问题可以参考, 在此就不详细介绍了:

http://blog.youkuaiyun.com/andyhuabing/article/details/7004593


五、 HAL层接口

上层调用类 SensorDevice:

主要调用逻辑:

   // 加载动态库 

    status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID,
            (hw_module_t const**)&mSensorModule);

  // 打开sensor 设备

  sensors_open(&mSensorModule->common, &mSensorDevice);


 最重要的四个hal接口函数:

    int (*get_sensors_list)(struct sensors_module_t* module,
            struct sensor_t const** list);  // sensorList列表信息

    int (*activate)(struct sensors_poll_device_t *dev,
            int handle, int enabled);    int (*setDelay)(struct sensors_poll_device_t *dev,
            int handle, int64_t ns);   // 使用及禁止

    int (*setDelay)(struct sensors_poll_device_t *dev,
            int handle, int64_t ns);  // 延时或采样频率

    int (*poll)(struct sensors_poll_device_t *dev,
            sensors_event_t* data, int count);  // poll数据


这块代码实现可以参考:

device\htc\passion-common\libsensors


Sensor系列之Sensor HAL层数据获取,基于Qualcomm平台 前面我们分析了Android Sensor HAL层源码分析(基于Qualcomm平台),该篇博文主要讲解了Sensor HAL的初始化,以及hal层是怎样获取所有sensor列表的。今天我们来进一步了解下sensor hal层的数据获取流程。我们知道Native层SensorService启动后,会进入我们的treadLoop方法:bool SensorService::threadLoop()... 阅读详情

相关推荐

Andriod Sensor HAL实现

Andriod Sensor HAL实现 1 Android sensor构建 Android4.1 系统内置对传感器的支持达13种,他们分别是:加速度传感器(accelerometer)、磁力传感器(magnetic field)、方向传感器(orientation)、陀螺仪(gyroscope)、环境光照传感器(light)、压力传感器(pressure)、温度传感器(temper

fe学习之旅 2781

P-Sensor注册和取消流程,从java到驱动

这两天调查一个和P-Sensor有关的问题,梳理了下P-Sensor从注册到驱动使能的整个流程,现在分享出来,此流程适用于所有通过sensormanager调用管理的器件。 首先,上层调用和使用sensor时, 通过如下函数调用 registerListener 实际调用的函数接口为: 1.SensorManager.java 737    public boolean registe

774

SensorList传感器数据测试

传感器列表Sensor List是一款列出设备上所有传感器数据变化值的应用。测试数据包括加速度,磁场,方向,温度,光等

Android Sensor模块解析(Sensor Hidl服务)

Sensor Hidl服务在眼镜中是一个android.hardware.sensors@2.1-service.multihal进程它其实是sensor hal的hidl实现,sensor hal也是在这个进程中的。Sensor hidl的代码位置主要在。

TangYuanTuoHai的博客 2219

使用Kettle进行数据同步(增量)

文章目录kettle介绍kettle安装kettle使用使用kettle同步关系型数据库数据(MySQL示例)1. 创建一个转换2. 选择表输入3. 格式转换4. 执行脚本5. 创建job使用kettle同步NoSql数据(MongoDB示例)创建转换时的注意事项MongoDBInput怎么创建job的创建如何在Linux上面运行已经创建好的job?1、把创建好的job传输到Linux机器上面2、编辑kjb文件3、执行任务 kettle介绍 Kettle 是一款国外开源的 ETL 工具,纯 Java 编写

JenKin的博客 7349

别再手动算重量了!用C++给UG/NX写个自动计算零件质量与质心的插件(附完整源码)

本文详细介绍了如何使用C++为UG/NX开发智能质量分析插件,实现零件质量与质心的自动计算。通过结合NXOpen和UF_MODL API,设计高效的数据结构和批量处理机制,大幅提升机械设计效率。文章包含完整源码和实用技巧,帮助工程师告别手动计算,适用于复杂装配体的自动化工程计算。

weixin_30247307的博客 130

Sensor框架理解

在这个系列的文章我们只是为了讲清楚Sensor框架的设计和工作原理基于4.0,4.0以下的代码有所区别,尤其是2.2以下根本就没有Binder架构,不讲驱动,也不讲具体的某一个应用该怎么处理Sensor的数据。 一、整体的架构: 从这个图来看Sensor的架构还是非常的清淅, 黄色部分表示硬件,它要挂在I2C总线上 红色部分表示驱动,把驱动注册到Kernel的Input Subsyst

cs_lht的专栏 3万+

2.4G/4G天线共存方案:Air8101多频段隔离设计实战(附波长计算表)

本文深入探讨了物联网设备中Wi-Fi 2.4GHz与4G LTE天线共存设计的实战方案。针对B40与2.4G频段紧邻带来的干扰挑战,文章系统性地提出了空间隔离、PCB布局优化、结构设计三重防线,并提供了关键的波长计算工具与系统级验证Checklist,旨在帮助工程师将多频段隔离设计从“玄学”变为可执行的工程规范。

weixin_29197051的博客 388

Sensor系列之aDSP端Sensor Driver流程

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.youkuaiyun.com/huilin9960/article/details/80929499 –所有的存在都是为了走向毁灭而设计的。–我们被囚禁在这…–生与死的无尽螺旋里。–这是诅咒?–还是惩罚?–面对着将无解谜题交予我们的神明,我们会有反抗的一...

zhuyong006的博客 1813

Centos7.6操作系统安装+Bond配置(600GB磁盘版本)

1.安装前准备工作 准备centos7.6操作系统镜像 CentOS-7-x86_64-DVD-1810.iso 服务器安装一般都是在BMC界面操作,所以安装前需要在BMC界面挂载好操作系统镜像 重启服务器后自动进入安装界面。 华为大数据集群安装操作系统配置

小时光 6005

项目计划书、规划文档模板

项目计划书、规划文档模板 最近通过项目实践经历,整理出的一套项目计划书(仅供自己参考梳理思路使用) 有喜欢的文末加VX 辛苦码字如有转载请标明出处谢谢!——木研 更新的简版项目规划文档! 原版文件请+vx :baierfa ...

weixin_43194923的博客 986

Sensor HAL框架分析之一

1.      Sensor的概念 Sensor即传感器,在当前智能手机上大量存在:G-Sensor、LightsSensor、ProximitySensor、TemperatureSensor等,其作为Android系统的一个输入设备,对于重视用户体验的移动设备来说是必不可少的。Sensor虽然是一个输入设备,但是它又不同于触摸屏,键盘,按键等这些常规的输入设备,因为Sensor的数据输入从传

manshq163com的专栏 788

蓝牙协议栈详解(3)——BTstack

BTstack是一个轻量级蓝牙协议栈,支持经典蓝牙(BR/EDR)和低功耗蓝牙(BLE)。它采用事件驱动模型,可运行在MCU/CPU上,通过HCI接口与蓝牙控制器通信。协议栈包含完整的蓝牙协议层支持,如L2CAP、RFCOMM、ATT/GATT等,并提供丰富的示例代码。 主要特点包括模块化设计、开源授权、支持多种HCI传输方式(UART/USB)和操作系统适配。开发时需要关注事件驱动编程模型、内存配置优化、HCI传输稳定性等问题。典型应用场景包括SPP串口通信、BLE外设开发等。 使用建议从最小示例开始,逐

嵌入式软硬件叶玄 291

linux驱动由浅入深系列:高通sensor架构实例分析之二(驱动代码结构)

上一篇文章中我们了解了高通sensor的整体架构及对AP侧的代码进行了分析,这篇文章我们详细分析一下aDSP侧的代码结构。   sensor数据流关键代码概览 下图是sensor数据流程中的关键代码部分:   实现sensor驱动最重要的一个结构体 结合上一篇的测试代码,可以清楚的看到高通sensor的数据处理流程。图中7位置指示了每个基于ADSP架构的传感器需要实现的接口如下: ...

sam0535的专栏 1137

Cartographer实现双雷达建图

TRAJECTORY_BUILDER_2D.num_accumulated_range_data = 2 --执行一次前端匹配需要的激光扫描分段数量。关于num_subdivisions_per_laser_scan。num_laser_scans =2,--订阅激光扫描话题数量。Frame改为 前雷达laser_1 后雷达laser_2。雷达的话题由scan改为,前scan_1 后scan_2。有些人说需要改成2,但我这里改成2反而不行,1才可以。

Studying…… 1261

从数字后端角度谈谈occ电路(一)

摘要:本文介绍了芯片测试中OCC(On-Chip Clock Control)电路的设计与应用。随着工艺进步,芯片制造面临Stuck-at、Bridging和Delay等故障类型,需要不同时钟频率进行测试。OCC电路通过Clock Selection、Clock Chopping Control和Clock Gating三个模块,实现ATE时钟与PLL时钟的切换控制,支持慢速时钟检测Stuck-at故障和快速时钟检测Delay故障。文章详细解析了OCC电路结构及各模块功能,包括同步单元、移位寄存器等关键组件

芯冰乐 585

linux驱动由浅入深系列:高通sensor架构实例分析之二(驱动代码结构)【转】

本文转载自:https://blog.youkuaiyun.com/radianceblau/article/details/73498303 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分析之一(整体概览+AP侧代码分析) linux驱动由浅入深系列:高通sensor架构实例分析之二(adsp驱动代码结构)Linux驱动由浅入深系列:高通sensor架构实例分析之三(...

595

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android Sensor 架构深入剖析【转】

本文转载自: 1、Android sensor架构 Android4.0系统内置对传感器的支持达13种,它们分别是:加速度传感器 (accelerometer)、磁力传感器(magnetic field)、方向传感器(orientation)、陀螺仪(gyroscope)、环境光照传感器(light)、压力传感器(pressure)、 温度传感器(temperature)和距离传感器(proxi...

zzb2760715357的博客 442

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

高通SEE架构sensor 数据上报和处理上层命令流程

根据代码分析:adsp instance上报数据的流程第一步: Turn COM port ON 理解是把i2c 总线拉高true);第二步:ak0991x_instance_state 获取当前stream type,然后创建一个stream,然后通过pb解析出timer 事件第三步:获取当前时间now 和 req_timeout 时间比较,超时上报数据//上层apk 设置if (!;

aiaida的博客 1185

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【高通SDM660平台 Android 10.0】(10) --- Camera Sensor lib 与 Kernel Camera Probe 代码分析

【高通SDM660平台 Android 10.0】Camera Sensor lib 与 Kernel Camera Probe 代码分析一、libmmcamera_imx258.so 代码分析1.1 struct sensor_lib_t 结构体1.2 imx258_lib.h 头文件分析 《【高通SDM660平台】Camera 驱动 Bringup Guide》 《【高通SDM660平台】Camera Kernel 驱动层代码逻辑分析》 《【高通SDM660平台】Camera V4L2 驱动层分析 》

|~~~热爱生活、努力学习的小伙汁~~~| 4696

深入浅出 - Android系统移植与平台开发(十二) - Sensor HAL框架分析之二

作者:唐老师,华清远见嵌入式学院讲师。 1.1 Sensor应用程序框架 这部分对于上层写应用的朋友来比较熟悉,我们通过一个简单的应用来分析框架层和底层的实现。 通常编写一个传感器的应用程序有以下步骤: l 通过调用 Context.getSystemService(SENSOR_SERVICE)获得传感器服务,实现返回的是封装了SensorService的SensorManager对象

farsightliuht的专栏 1449
上一篇: Android 2.3 input输入事件处理
下一篇: 写binder客户端与服务端碰到的编译错误
andyhuabing
博客等级 码龄19年 704粉丝 165原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值