杰理701N可视化SDK之组合键代码设计

本文介绍了如何在杰理701N可视化SDK中添加和处理组合键功能,包括代码修改、自定义组合键映射表以及解决长按组合键时的问题。作者详细描述了按键驱动、消息处理流程和解决策略。
摘要由CSDN通过智能技术生成

杰理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的时候在键值的最高位置位
组合按键重映射按键值2
当有组合键按下的时候, 与单按键的流程一样, 会先发送key_event给到key_event_handler()
抛出key_event_handler
key_event_handler()只会拿到基础的按键动作, 需要在这里使用multi_clicks_translate()转成多击或hold事件, 并将转换后的事件发送给TWS处理
key_event_handler函数
之后按键事件经过TWS同步, 发送了个APP消息
TWS按键处理
这条APP消息发往”app_core”任务
APP消息发送
所以这条带了组合键重映射之后的按键消息最终发送到了”app_core”任务, 接下来就需要自己编写组合键按键消息的处理函数了

组合键消息处理代码

因为按键消息是在app_task_loop()中处理的, 而可视化工具暂时没有事件处理组合键消息的配置, 所以还需要自己编写一段组合键按键消息处理的代码.
SDK消息处理流程
上图为SDK自带的消息处理流程, 这里自行增加代码注册了一个APP_MSG_HANDLER, 专门用来处理组合键消息
组合键消息处理
当有REMAP的组合键消息的时候, 会进入到我们自定义的按键消息处理函数
从按键消息提取出键值KEY_VALUE和按键KEY_ACTION, 判断对应的KEY_VALUE和ACTION, 做对应想要的处理, 比如这里判断音量+和音量-按键组合键hold3s进入蓝牙dut模式
组合键消息处理2

SDK加入组合键代码引出的问题

1.长按hold组合键的时候, 先释放其中一个按键之后, 再释放另一个按键(组合键中的多个按键不同时释放). 之后会检测不到其他按键hold动作
原因分析:
比如当音量+和音量-两个按键同时长按, 先松手释放音量+, 再松手释放音量-按键. 在驱动层key_driver抛出的事件是后松手按键(音量-按键)的up事件, 而不会抛出组合键释放的up事件, 在key.c中的转hold事件处理multi_clicks_translate()的时候还会认为组合键还在hold没有松手(因为此时还没有上报组合键的up事件). 导致后面所有的按键消息进来的时候还认为有按键在hold
hold判读
解决方法:
在所有按键up时候或驱动层抛出NO_KEY的事件的时候, 清除掉所有按键的hold状态, 如下图解决方案
解决方案

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小的代码里面挖呀挖呀挖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值