0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【AWTK使用经验】如何响应物理按键

ZLG致远电子 2024-06-06 08:25 次阅读

AWTK是基于C语言开发的跨平台GUI框架。《AWTK使用经验》系列文章将介绍开发AWTK过程中一些常见问题与解决方案,例如:如何加载外部资源?如何设计自定义进度条?这些都会在系列文章进行解答。

ZTP800示教器 设备上有许多按键,假设想在自己的AWTK程序中检测并使用这些按键响应事件,则需要使用AWTK绑定物理按键的功能。

本篇文章将借助一个检测按键的demo程序来介绍如何绑定物理按键并响应,该demo最终效果是按下任意物理按键时会显示该按键key down,松开按键时会显示该按键key up。

358f0e00-239b-11ef-bd4a-92fbcf53809c.png 

图1按键检测程序效果图

设计界面与绑定按键事件

用AWTK Designer打开一个新建工程,并且放置一个静态文本控件用作显示按下或弹起的按键值。

35a18d64-239b-11ef-bd4a-92fbcf53809c.png

图2使用AWTK Designer设计界面

1. 绑定按键按下与弹起事件

接下来修改项目的src/pages/home_page.c代码文件,在初始化窗体时注册监听全局按键按下与弹起事件:

navigator_global_widget_on(EVT_KEY_DOWN, on_global_key_down, win);navigator_global_widget_on(EVT_KEY_UP, on_global_key_up, win);

接着同样在home_page.c实现按键按下和弹起的回调函数,获取按键值并输出按键状态为按下还是抬起:

static ret_t on_global_key_down(void* ctx, event_t* e) { // 按键按下 char ch[50] = {0}; widget_t* win = WIDGET(ctx); key_event_t* evt = key_event_cast(e); widget_t* label = widget_lookup(win, "label", TRUE); const key_type_value_t* ktv = keys_type_find_by_value(evt->key);
if (ktv == NULL || label == NULL || ktv->name == NULL) { return RET_BAD_PARAMS; }
/* ktv->name为custom_keys.json绑定键值对应的名称 */ tk_snprintf(ch, sizeof(ch), "%s key down", ktv->name); widget_set_text_utf8(label, ch);
return RET_OK;}
static ret_t on_global_key_up(void* ctx, event_t* e) { // 按键抬起 char ch[50] = {0}; widget_t* win = WIDGET(ctx); key_event_t* evt = key_event_cast(e); widget_t* label = widget_lookup(win, "label", TRUE); const key_type_value_t* ktv = keys_type_find_by_value(evt->key);
if (ktv == NULL || label == NULL || ktv->name == NULL) { return RET_BAD_PARAMS; }
/* ktv->name为custom_keys.json绑定键值对应的名称 */ tk_snprintf(ch, sizeof(ch), "%s key up", ktv->name); widget_set_text_utf8(label, ch);
return RET_OK;}

2. 设定自定义按键值

在项目的资源目录“assets/default/data/”(没有data文件夹可自行创建)新建一个名为“custom_keys.json”的配置文件,该配置文件记录按键名称与按键值对应关系。下面是记录“启动”与“F1”两个按钮键值示例:

{ "START" : { "value" : 290 }, "F1" : { "value" : 279 }}

文件中“290”与“279”两个值可以从ZTP800示教器的用户手册中获取,之后在示教器上运行程序,按下“启动”与“F1”两个按键就能像文章开头效果图一样正确识别按键值并显示在静态文本控件中。

嵌入式Linux如何开启绑定物理按键功能

若经过上面步骤操作之后还没效果,可能是没有开启ENABLE_CUSTOM_KEYS宏。此时可以在AWTK编译选项中定义ENABLE_CUSTOM_KEYS=1,再进行编译AWTK与应用即可开启自定义按键功能,下图是在awtk-linux-fb移植层的awtk_config.py开启ENABLE_CUSTOM_KEYS宏的方法,其它平台可根据实际步骤开启该宏。

35bb7440-239b-11ef-bd4a-92fbcf53809c.png

图3配置awtk_config.py开启宏

RTOS如何绑定物理按键

如果想在RTOS平台绑定物理按键也是比较简单的,只需要在主循环通过按键扫描函数获取物理按键并设置供AWTK识别的按键值,再调用AWTK函数main_loop_post_key_event将该按键值发送到GUI界面即可。
下面是一段STM32F103移植层对接物理按键的代码示例,代码先调用底层KEY_Scan按键扫描函数获取实际物理按键,接着将按键值转换成给AWTK识别的值(如:TK_KEY_UP),最后通过main_loop_post_key_event发送给上层GUI主循环事件队列。

/* awtk-stm32f103ze-raw/awtk-port/main_loop_stm32_raw.c */void dispatch_input_events(void) { int key = KEY_Scan(0);
switch (key) { case KEY_UP: { key = TK_KEY_UP; break; } case KEY_DOWN: { key = TK_KEY_DOWN; break; } default: { key = 0; } }
if (key) { main_loop_post_key_event(main_loop(), TRUE, key); } else { main_loop_post_key_event(main_loop(), FALSE, key); }}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 检测
    +关注

    关注

    5

    文章

    4433

    浏览量

    91352
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136116
  • awtk
    +关注

    关注

    0

    文章

    42

    浏览量

    216
收藏 人收藏

    评论

    相关推荐

    AWTK使用经验】如何添加中文输入法

    AWTK是基于C语言开发的跨平台GUI框架。《AWTK使用经验》系列文章将介绍开发AWTK过程中一些常见问题与解决方案,例如:如何加载外部资源?如何设计自定义进度条?这些都会在系列文章
    的头像 发表于 06-20 08:25 981次阅读
    【<b class='flag-5'>AWTK</b>使用<b class='flag-5'>经验</b>】如何添加中文输入法

    AWTK使用经验】如何更换AWTK SDK与渲染模式

    AWTK是基于C语言开发的跨平台GUI框架。《AWTK使用经验》系列文章将介绍开发AWTK过程中一些常见问题与解决方案,例如:如何播放摄像头画面?如何更换
    的头像 发表于 08-01 08:25 1009次阅读
    【<b class='flag-5'>AWTK</b>使用<b class='flag-5'>经验</b>】如何更换<b class='flag-5'>AWTK</b> SDK与渲染模式

    什么是AWTKAWTK有哪些主要特色?

    什么是AWTKAWTK有哪些主要特色?
    发表于 06-16 06:43

    AWTK主要特色

    一、前言刚拿到字节offer,经历了5次面试,其中4轮技术面,1轮HR面试。在这里分享一下自己的面试经验和学习心得。希望能够帮助更多的小伙伴。我本科毕业于四川师范学院计算机系,刚毕业时也是小白,也是
    发表于 08-20 07:28

    介绍AWTK

    ZLG 开源 GUI 引擎 AWTK 1.6 发布一、介绍AWTK全称 Toolkit AnyWhere,是ZLG开发的开源 GUI 引擎,旨在为嵌入式系统、WEB、各种小程序、手机和 PC 打造
    发表于 08-20 08:09

    AWTK的寓意

    一、介绍AWTK全称Toolkit AnyWhere,是ZLG开发的开源GUI引擎,旨在为嵌入式系统、WEB、各种小程序、手机和PC打造的通用GUI引擎,为用户提供一个功能强大、高效可靠、简单易用
    发表于 08-20 08:12

    介绍AWTK

    ZLG开源GUI引擎AWTK发布1.1版本一、介绍AWTK全称Toolkit AnyWhere,是ZLG开发的开源GUI引擎,旨在为嵌入式系统、WEB、各种小程序、手机和PC打造的通用GUI引擎,为
    发表于 08-20 08:18

    Android 代码模拟物理按键

    开发中有遇到这样的情况,物理按键个数有限, 想用代码模拟其他物理按键输入,这里用了shell 命令在程序运行时环境里模拟按键事件。因命令执行
    发表于 10-22 15:21 43次下载
    Android  代码模拟<b class='flag-5'>物理</b><b class='flag-5'>按键</b>

    AWTK使用经验】如何设计立体电池进度条?

    AWTK是基于C语言开发的跨平台GUI框架。《AWTK使用经验》系列文章将介绍开发AWTK过程中一些常见问题与解决方案,例如:如何加载外部资源?如何设计自定义进度条?这些都会在系列文章
    的头像 发表于 04-18 08:25 413次阅读
    【<b class='flag-5'>AWTK</b>使用<b class='flag-5'>经验</b>】如何设计立体电池进度条?

    AWTK使用经验】加载和释放外部图片

    AWTK是基于C语言开发的跨平台GUI框架。《AWTK使用经验》系列文章将介绍开发AWTK过程中一些常见问题与解决方案,例如:如何加载外部资源?如何设计自定义进度条?这些都会在系列文章
    的头像 发表于 04-26 08:25 431次阅读
    【<b class='flag-5'>AWTK</b>使用<b class='flag-5'>经验</b>】加载和释放外部图片

    AWTK使用经验】如何播放视频或摄像头画面

    AWTK是基于C语言开发的跨平台GUI框架。《AWTK使用经验》系列文章将介绍开发AWTK过程中一些常见问题与解决方案,例如:如何加载外部资源?如何设计自定义进度条?这些都会在系列文章
    的头像 发表于 07-04 08:25 567次阅读
    【<b class='flag-5'>AWTK</b>使用<b class='flag-5'>经验</b>】如何播放视频或摄像头画面

    AWTK使用经验】如何实现序列帧动画

    AWTK是基于C语言开发的跨平台GUI框架。《AWTK使用经验》系列文章将介绍开发AWTK过程中一些常见问题与解决方案,例如:如何加载外部资源?如何设计自定义进度条?这些都会在系列文章
    的头像 发表于 07-18 08:25 361次阅读
    【<b class='flag-5'>AWTK</b>使用<b class='flag-5'>经验</b>】如何实现序列帧动画

    AWTK使用经验】如何在AWTK显示阿拉伯文本

    AWTK是基于C语言开发的跨平台GUI框架。AWTK使用经验系列文章将介绍开发AWTK过程中一些常见问题与解决方案,例如:如何播放视频或摄像头画面?如何播放序列帧动画?这些都会在系列文
    的头像 发表于 09-12 08:07 294次阅读
    【<b class='flag-5'>AWTK</b>使用<b class='flag-5'>经验</b>】如何在<b class='flag-5'>AWTK</b>显示阿拉伯文本

    AWTK使用经验】如何裁剪字库以及如何使用点阵字

    AWTK是基于C语言开发的跨平台GUI框架。AWTK使用经验系列文章将介绍开发AWTK过程中一些常见问题与解决方案。AWTK如何裁剪字库在
    的头像 发表于 10-10 08:05 227次阅读
    【<b class='flag-5'>AWTK</b>使用<b class='flag-5'>经验</b>】如何裁剪字库以及如何使用点阵字

    AWTK使用经验】如何使用系统输入法与开启最大化窗口功能

    导读AWTK是基于C语言开发的跨平台GUI框架。AWTK使用经验系列文章将介绍开发AWTK过程中一些常见问题与解决方案。AWTK具有跨平台的
    的头像 发表于 11-14 01:05 114次阅读
    【<b class='flag-5'>AWTK</b>使用<b class='flag-5'>经验</b>】如何使用系统输入法与开启最大化窗口功能