杰理701N可视化SDK组合键代码设计
杰理701N可视化SDK目前只支持在可视化工具中配置按键和按键功能, 还不支持在可视化工具中直接加入组合键的功能. 需要在SDK中做些修改才可以实现组合键的功能. 本篇文章演示使用SDK修改并实现组合键按键功能
组合键相关代码修改
key_driver.c: 按键驱动抽象层, 提供按键扫描程序, 在key_driver.c调用注册的key_handler的get_value()接口来获取当前按键按下的键值
打开宏 MULT_KEY_ENABLE
打开后iokey.c获取键值的时候就会使用bitmark的方式记录被按下的键值
记录下被按下的按键之后, 代码中需要实现组合键的重新映射
SDK是调用了一个外部的组合键按键映射表 iokey_remap_data 就是需要自己外部实现组的合键映射表
如下为自定义的组合键映射表, 这里新增代码自定义的重映射键值, 为了方便后续事件判断的时候区分组合键和单按键, 因此这里remap_value的时候在键值的最高位置位
当有组合键按下的时候, 与单按键的流程一样, 会先发送key_event给到key_event_handler()
key_event_handler()只会拿到基础的按键动作, 需要在这里使用multi_clicks_translate()转成多击或hold事件, 并将转换后的事件发送给TWS处理
之后按键事件经过TWS同步, 发送了个APP消息
这条APP消息发往”app_core”任务
所以这条带了组合键重映射之后的按键消息最终发送到了”app_core”任务, 接下来就需要自己编写组合键按键消息的处理函数了
组合键消息处理代码
因为按键消息是在app_task_loop()中处理的, 而可视化工具暂时没有事件处理组合键消息的配置, 所以还需要自己编写一段组合键按键消息处理的代码.
上图为SDK自带的消息处理流程, 这里自行增加代码注册了一个APP_MSG_HANDLER, 专门用来处理组合键消息
当有REMAP的组合键消息的时候, 会进入到我们自定义的按键消息处理函数
从按键消息提取出键值KEY_VALUE和按键KEY_ACTION, 判断对应的KEY_VALUE和ACTION, 做对应想要的处理, 比如这里判断音量+和音量-按键组合键hold3s进入蓝牙dut模式
SDK加入组合键代码引出的问题
1.长按hold组合键的时候, 先释放其中一个按键之后, 再释放另一个按键(组合键中的多个按键不同时释放). 之后会检测不到其他按键hold动作
原因分析:
比如当音量+和音量-两个按键同时长按, 先松手释放音量+, 再松手释放音量-按键. 在驱动层key_driver抛出的事件是后松手按键(音量-按键)的up事件, 而不会抛出组合键释放的up事件, 在key.c中的转hold事件处理multi_clicks_translate()的时候还会认为组合键还在hold没有松手(因为此时还没有上报组合键的up事件). 导致后面所有的按键消息进来的时候还认为有按键在hold
解决方法:
在所有按键up时候或驱动层抛出NO_KEY的事件的时候, 清除掉所有按键的hold状态, 如下图解决方案