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中加入想要的功能。
以上是本期博文的全部内容,如有疑问请在博文下方评论留言,或者有什么想了解的都可以留言,我会挑选一些做后面几期的博文,谢谢大家,我们下期再见。
如果你嫌命长又不怕啰嗦,可以点击下方视频观看不正经的讲解↓↓↓
如果有什么建议也可以评论留言,我斟酌过后会给你好看的。
你就等着瞧下一篇吧。
多看文档,多上官网
多看文档,多上官网
多看文档,多上官网
使用 Chrome最新版本觀看視頻可能發錯誤,請由此連結觀看
https://v.qq.com/x/page/d09425vpyja.html?pcsharecode=gR8RqfMJ&sf%EF%BC%89
评论
子非鱼
28 天前
星辰大海123
2022年7月6日
发芽韭菜
2021年3月9日
Biu~
2020年6月24日
chris
2020年6月22日
林工
2020年4月13日
Candy
2020年4月6日
Tom
2020年4月6日
许许许
2020年4月3日