AWTK是基于C語言開發的跨平臺GUI框架。《AWTK使用經驗》系列文章將介紹開發AWTK過程中一些常見問題與解決方案,例如:如何加載外部資源?如何設計自定義進度條?這些都會在系列文章進行解答。
在 ZTP800示教器 設備上有許多按鍵,假設想在自己的AWTK程序中檢測并使用這些按鍵響應事件,則需要使用AWTK綁定物理按鍵的功能。
本篇文章將借助一個檢測按鍵的demo程序來介紹如何綁定物理按鍵并響應,該demo最終效果是按下任意物理按鍵時會顯示該按鍵key down,松開按鍵時會顯示該按鍵key up。
?
圖1按鍵檢測程序效果圖
設計界面與綁定按鍵事件
用AWTK Designer打開一個新建工程,并且放置一個靜態文本控件用作顯示按下或彈起的按鍵值。
圖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宏的方法,其它平臺可根據實際步驟開啟該宏。
圖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文章
4436瀏覽量
91369 -
C語言
+關注
關注
180文章
7598瀏覽量
136182 -
awtk
+關注
關注
0文章
42瀏覽量
216
發布評論請先 登錄
相關推薦
評論