WQ7033 按键设置
WQ7033 SDK中的按键集成了多种按键来源, 多种按键来源都集成在SDK中, 如SIMPLE_IO, DEBOUNCE_IO, WQ_TOUCH和各种外部按键芯片来源等, 在SDK中的实现比较复杂, 官方推荐比较常用的是使用DEBOUNCE_IO. 本篇文章跟随WQ7033 SDK看如何使用DEBOUNCE_IO来实现按键功能
WQ7033的按键在软件上分有上中下3层的软件分层结构. 负责上层的主要是APP_BTN模块, 主要负责上层按键事件的处理; 中间层有KEY_SENSOR, KEY_BASE, 负责区分和管理底层按键驱动模块, 下层底层也就是各个按键来源的驱动
按键事件的来源
在SDK中定义了多种不同的按键来源, 在中间层中有定义
这里默认选用的是DEBOUNCE_IO来作为按键事件的来源, 也可以在customer/xxx/cfg中的build.ini中增加defines定义
按键IO和按键事件的配置
在UI工具中选择IOMap选项进入界面, 设置按键的IO选择和上下拉的选择
在UserKey界面设置按键产生对应的事件, 支持长按产生的时间, 多击有效时间间隔, 按键防抖时间等设置, 还支持将对应事件设置成组合键的设置
以上这些配置只会在导出的时候生效, 建议是将json文件导出, 直接放在customer/xxx/prebuild路径下, 这样修改代码都能带上配置, 就不需要生成wpk后再重新设置了
按键处理流程分析
- 初始化
key_sensor_init()初始化的时候注册发送按键类型的callback, 当底层有单击, 双击, 长按等按键动作产生的时候会进入btn_callback, 在btn_callback中发送了个消息ID为APP_BTN_MSG_ID_KEY_CALLBACK的事件给到上层APP_BTN按键模块处理, 即进入到app_btn_handle_msg()
所以当有按键事件来的时候会进入到keypress_parse()中处理按键事件, 并解析按键事件的内容
- 按键事件的解析
按键事件的解析是再keypress_parse()中处理, 按键事件的解析在SDK中有以下3个步骤:
首先判断此按键事件是否在econn模块中有处理, econn模块中返回true的情况就不往下做SDK的处理逻辑. 默认SDK中econn模块是没有做处理的
接下来判断有没有customized user event, 这里的user event指的是在代码运行中动态配置写入flash中存储的按键事件, 一般配合econn代码做按键动态flash存储使用, 这里判断当前来的按键事件在cuskey中是否在flash中有存储, 如果flash有这个设置的话则用app_evt_send()将用户事件发出给上层处理, 默认的SDK也不进入此步骤
最后的处理方式, 也是SDK默认的处理方式, 这里判断当前按键事件, 是否是UI工具中配置的事件, 如果是UI工具中配置的事件并且系统状态一致的情况, 则使用app_evt_send发送对应的用户事件, 比如工具中配置的是单击执行音乐播放或暂停, 则这里会发送EVTUSR_MUSIC_PLAY_PAUSE事件, APP_EVT模块收到对应的用户事件后, 进入handle_usr_evt()调用相应的API做播放暂停处理
按键相关问题
最近有小伙伴在后台私信提出了个问题: 如果UI设计上需要区分单耳模式和双耳模式应该如何实现. 这里举个例子, TWS连接的时候, 双击的UI配置成左边上一曲, 右边下一曲; TWS没有连接单耳使用的时候, 左边右边双击UI都进行下一曲操作
如下为左右的UserKey配置
以上配置在双击的时候, 进入keypress_parse()按键事件解析, 不论单边使用或TWS使用都会解析成左边双击上一曲, 右边双击下一曲. 那要区分单耳情况和双耳使用做不同的UI操作, UI工具beetle tool上没有可以进行这个UI的设置. 当UI工具的配置不能满足我们的UI需求的时候, 官方推荐使用自定义的ECONN模块增加相应的逻辑, 自定义ECONN模块的添加可以参考这篇文章: WQ7033自定义交互模块.
可以在自定义的econn模块中的app_econn_handle_key_pressed()函数中增加自定义的功能逻辑, 比如这里拦截了按键双击事件 并添加判断, 在单耳模式下给app_evt模块发送下一曲的消息事件EVTUSR_MUSIC_FORWARD, 返回值设置ret = true表示econn拦截并处理了按键消息之后不再做SDK后续的按键处理, 如下代码仅供参考