AWTK是基于C語(yǔ)言開(kāi)發(fā)的跨平臺(tái)GUI框架。《AWTK使用經(jīng)驗(yàn)》系列文章將介紹開(kāi)發(fā)AWTK過(guò)程中一些常見(jiàn)問(wèn)題與解決方案,例如:如何加載外部資源?如何設(shè)計(jì)自定義進(jìn)度條?這些都會(huì)在系列文章進(jìn)行解答。
在 ZTP800示教器 設(shè)備上有許多按鍵,假設(shè)想在自己的AWTK程序中檢測(cè)并使用這些按鍵響應(yīng)事件,則需要使用AWTK綁定物理按鍵的功能。
本篇文章將借助一個(gè)檢測(cè)按鍵的demo程序來(lái)介紹如何綁定物理按鍵并響應(yīng),該demo最終效果是按下任意物理按鍵時(shí)會(huì)顯示該按鍵key down,松開(kāi)按鍵時(shí)會(huì)顯示該按鍵key up。
?
圖1按鍵檢測(cè)程序效果圖
設(shè)計(jì)界面與綁定按鍵事件
用AWTK Designer打開(kāi)一個(gè)新建工程,并且放置一個(gè)靜態(tài)文本控件用作顯示按下或彈起的按鍵值。
圖2使用AWTK Designer設(shè)計(jì)界面
1. 綁定按鍵按下與彈起事件
接下來(lái)修改項(xiàng)目的src/pages/home_page.c代碼文件,在初始化窗體時(shí)注冊(cè)監(jiān)聽(tīng)全局按鍵按下與彈起事件:
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實(shí)現(xiàn)按鍵按下和彈起的回調(diào)函數(shù),獲取按鍵值并輸出按鍵狀態(tài)為按下還是抬起:
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綁定鍵值對(duì)應(yīng)的名稱 */ 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綁定鍵值對(duì)應(yīng)的名稱 */ tk_snprintf(ch, sizeof(ch), "%s key up", ktv->name); widget_set_text_utf8(label, ch);
return RET_OK;}
2. 設(shè)定自定義按鍵值
在項(xiàng)目的資源目錄“assets/default/data/”(沒(méi)有data文件夾可自行創(chuàng)建)新建一個(gè)名為“custom_keys.json”的配置文件,該配置文件記錄按鍵名稱與按鍵值對(duì)應(yīng)關(guān)系。下面是記錄“啟動(dòng)”與“F1”兩個(gè)按鈕鍵值示例:
{ "START" : { "value" : 290 }, "F1" : { "value" : 279 }}
文件中“290”與“279”兩個(gè)值可以從ZTP800示教器的用戶手冊(cè)中獲取,之后在示教器上運(yùn)行程序,按下“啟動(dòng)”與“F1”兩個(gè)按鍵就能像文章開(kāi)頭效果圖一樣正確識(shí)別按鍵值并顯示在靜態(tài)文本控件中。
嵌入式Linux如何開(kāi)啟綁定物理按鍵功能
若經(jīng)過(guò)上面步驟操作之后還沒(méi)效果,可能是沒(méi)有開(kāi)啟ENABLE_CUSTOM_KEYS宏。此時(shí)可以在AWTK編譯選項(xiàng)中定義ENABLE_CUSTOM_KEYS=1,再進(jìn)行編譯AWTK與應(yīng)用即可開(kāi)啟自定義按鍵功能,下圖是在awtk-linux-fb移植層的awtk_config.py開(kāi)啟ENABLE_CUSTOM_KEYS宏的方法,其它平臺(tái)可根據(jù)實(shí)際步驟開(kāi)啟該宏。
圖3配置awtk_config.py開(kāi)啟宏
RTOS如何綁定物理按鍵
如果想在RTOS平臺(tái)綁定物理按鍵也是比較簡(jiǎn)單的,只需要在主循環(huán)通過(guò)按鍵掃描函數(shù)獲取物理按鍵并設(shè)置供AWTK識(shí)別的按鍵值,再調(diào)用AWTK函數(shù)main_loop_post_key_event將該按鍵值發(fā)送到GUI界面即可。
下面是一段STM32F103移植層對(duì)接物理按鍵的代碼示例,代碼先調(diào)用底層KEY_Scan按鍵掃描函數(shù)獲取實(shí)際物理按鍵,接著將按鍵值轉(zhuǎn)換成給AWTK識(shí)別的值(如:TK_KEY_UP),最后通過(guò)main_loop_post_key_event發(fā)送給上層GUI主循環(huán)事件隊(duì)列。
/* 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); }}
-
檢測(cè)
+關(guān)注
關(guān)注
5文章
4488瀏覽量
91472 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136827 -
awtk
+關(guān)注
關(guān)注
0文章
44瀏覽量
234
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論