找回密码
 立即注册

使用微信账号登录

只需一步,快速开始

ADK toolkit UI 按键代码解析

2020-5-15 23:53| 发布者: 大大通| 查看: 1623| 评论: 0|来自: 大大通

摘要: Biu~哈喽大家好,从这篇开始,Biu~笔记系列将带大家学习探讨新的ADK软件,版本是~我也不知道现在ADK怎么命名了,暂且叫ADK吧。同时大大通也新添了视频功能,小编也不定期的为大家带来视频讲解,在视频讲解中会讲的比 ...

       Biu~哈喽大家好,从这篇开始,Biu~笔记系列将带大家学习探讨新的ADK软件,版本是~我也不知道现在ADK怎么命名了,暂且叫ADK吧。同时大大通也新添了视频功能,小编也不定期的为大家带来视频讲解,在视频讲解中会讲的比较详细(忽略我蹩脚的说辞看字幕就好)

     下面我们圆规正转,看看我们今天要讲的内容-- --按键输入功能。在earbud_ui_config.c中可以看到earbud_ui_config_table数组,这个数组是配置按键事件的。

与以前的ADK的不同,这把按键事件(logical_input)、功能ID(ui_provider_id)、环境状态(ui_provider_context)和执行动作(ui_input)都放在一个表中(中文名是个人理解,不喜莫喷)。这个表会送到domains层注册,后面判断都是在domains层处理。这里想说说一个大致的处理过程,让大家有个初步认识,后面再深入探讨里面实现的原理。首先按键事件(logical_input)检测到一个按键已被触发识别,消息送到ui.c中处理,在这里他会遍历整个earbud_ui_config_table找到对应的按键事件(logical_input)。然后判断第二个条件——功能ID(ui_provider_id),这个相当于一个大类判断,如果机器在一开始没有注册就是直接放弃这类遍历。再到环境状态(ui_provider_context),这里相当于一个小类判断,判断当前是什么状态,最后把前面的判断都通过了之后,就把最后的参数按键事件(logical_input)给到执行机去执行对应的动作。

 

下面是分解动作:
1. 按键事件(logical_input):做过上一版的ADK(x)应该都了解这部分,这里的变量实际是在earbud层的1_button.buttonxml中定义的消息。类似还有多个按键的buttonxml文件,这里就不细说里面的差异了,大家一看就明白。

这个buttonxml文件主要理解他的构成,每个标签里的表示一个按键事件的识别单元,里面固定了该事件的触发条件,需要自定义的按键事件时也可以修改这些参数去满足需求

     ① 是被触发的消息,后续用到的消息
     ② 是被识别的按键,这个声明定义在pio.buttonxml里面。
      ③ 是按键识别类型,长按短按等,一共用6种类型
                   
      ④ 用于长按,当是HELD时,超过这个时间就发送;当是HELD_RELEASE时,超过这个时间就忽略这个消息。

 
2. 功能ID(ui_provider_id),这个参数是为了某个功能,通过这个ID在该功能里面(如A2dp,Hfp)获取状态机的状态,每个功能在初始化的时候都会用这个ID注册,并且会记录下回调函数,这个回调函数就是用来获取改功能状态机状态的。



3. 环境状态(ui_provider_context):在用功能ID(ui_provider_id)绑定的回调函数去获取到状态之后就和这个进行对比



4. 执行动作(ui_input):环境状态(ui_provider_context)满足条件后就会把这个执行动作放到处理机里做执行,这里面有个函数指针inject_ui_input_funcptr这个指针在初始化的时候先后被赋予了两个函数地址,一个是ui_SendUiInputToConsumerGroupTaskList,

但处理的不是在这个函数里面,这里只是把这个动作告诉已注册的handler,task list会去群发这个动作,但一般只有一个handler会做处理,简单的方法就是直接搜索这个动作(ui_input_t)在哪里处理就好了。还有另一个是在Ui_RegisterUiInputsInterceptor里注册的,

这里面做了替换,把之前的ui_SendUiInputToConsumerGroupTaskList换成peerUi_Interceptor_FuncPtr去处理,但里面把ui_SendUiInputToConsumerGroupTaskList保存了下来,在peerUi_Interceptor_FuncPtr函数中还可以看到,他最后还是调用了
ui_SendUiInputToConsumerGroupTaskList,

也就是说,在有动作(ui_input_t)要执行时,peerUi_Interceptor_FuncPtr会先去执行,再到ui_SendUiInputToConsumerGroupTaskList。这两个函数是不一样的,peerUi_Interceptor_FuncPtr这个函数是发到peer,让peer去执行,peer 收到后会用他的ui_SendUiInputToConsumerGroupTaskList去实现功能,ui_SendUiInputToConsumerGroupTaskList是本地执行。所以如果想一边操作两边同时响应可以在peerUi_Interceptor_FuncPtr中加入想要的功能。


来源:https://www.wpgdadatong.com/cn/blog/detail?BID=B1022
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
1

路过

雷人

握手

鲜花

鸡蛋

刚表态过的朋友 (1 人)

最新评论

小黑屋|手机版|我爱蓝牙网 - 52Bluetooth

GMT+8, 2024-4-30 00:04 , Processed in 0.246807 second(s), 33 queries , Gzip On, MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部