AWTK是基于C语言开发的跨平台GUI框架。《AWTK使用经验》系列文章将介绍开发AWTK过程中一些常见问题与解决方案,例如:如何加载外部资源?如何设计自定义进度条?这些都会在系列文章进行解答。
在 ZTP800示教器 设备上有许多按键,假设想在自己的AWTK程序中检测并使用这些按键响应事件,则需要使用AWTK绑定物理按键的功能。
本篇文章将借助一个检测按键的demo程序来介绍如何绑定物理按键并响应,该demo最终效果是按下任意物理按键时会显示该按键key down,松开按键时会显示该按键key up。
图 1 按键检测程序效果图
用AWTK Designer打开一个新建工程,并且放置一个静态文本控件用作显示按下或弹起的按键值。
图 2 使用AWTK Designer设计界面
接下来修改项目的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;}
在项目的资源目录“assets/default/data/”(没有data文件夹可自行创建)新建一个名为“custom_keys.json”的配置文件,该配置文件记录按键名称与按键值对应关系。下面是记录“启动”与“F1”两个按钮键值示例:
{ "START" : { "value" : 290 }, "F1" : { "value" : 279 }}
文件中“290”与“279”两个值可以从ZTP800示教器的用户手册中获取,之后在示教器上运行程序,按下“启动”与“F1”两个按键就能像文章开头效果图一样正确识别按键值并显示在静态文本控件中。
若经过上面步骤操作之后还没效果,可能是没有开启ENABLE_CUSTOM_KEYS宏。此时可以在AWTK编译选项中定义ENABLE_CUSTOM_KEYS=1,再进行编译AWTK与应用即可开启自定义按键功能,下图是在awtk-linux-fb移植层的awtk_config.py开启ENABLE_CUSTOM_KEYS宏的方法,其它平台可根据实际步骤开启该宏。
图 3 配置awtk_config.py开启宏
如果想在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); }}
全部0条评论
快来发表一下你的评论吧 !