• 正文
  • 推荐器件
  • 相关推荐
申请入驻 产业图谱

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

2024/06/06
1014
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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

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

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

设计界面与绑定按键事件

用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宏的方法,其它平台可根据实际步骤开启该宏。

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);  }}

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
AFBR-1624Z 1 Broadcom Limited Transmitter, 630nm Min, 685nm Max, Through Hole Mount, ROHS COMPLIANT, PLASTIC, PACKAGE-8

ECAD模型

下载ECAD模型
$22.59 查看
ADM3053BRWZ 1 Analog Devices Inc Signal and Power Isolated CAN Transceiver with Integrated Isolated DC-to-DC Converter

ECAD模型

下载ECAD模型
$9.17 查看
AT45DB321E-SHF-B 1 Adesto Technologies Corporation Flash, 32MX1, PDSO8, 0.208 INCH, GREEN, PLASTIC, SOIC-8

ECAD模型

下载ECAD模型
$4.2 查看
致远电子

致远电子

广州致远电子股份有限公司成立于2001年,注册资金5000万元,国家级高新技术认证企业,广州市高端工控测量仪器工程技术研究开发中心,Intel ECA全球合作伙伴和微软嵌入式系统金牌合作伙伴。

广州致远电子股份有限公司成立于2001年,注册资金5000万元,国家级高新技术认证企业,广州市高端工控测量仪器工程技术研究开发中心,Intel ECA全球合作伙伴和微软嵌入式系统金牌合作伙伴。收起

查看更多

相关推荐