如果 AWTK-HMI 內(nèi)置模型無法滿足需求,可以使用 C 語言來擴(kuò)展默認(rèn)模型。本文通過一個簡單的例子,介紹一下用 C 語言擴(kuò)展默認(rèn)模型的方法。
AWTK-HMI 內(nèi)置了不少模型,利用這些模型開發(fā)應(yīng)用程序,不需要編寫代碼即可實現(xiàn)常見的應(yīng)用。但是,有時候我們需要自定義一些命令,以實現(xiàn)一些特殊的功能。本文檔介紹如何使用 C 語言自定義命令。
1. 實現(xiàn) hmi_model_cmd_t 接口
1.1 exec 函數(shù)
本函數(shù)用于執(zhí)行命令。函數(shù)原型如下:
typedef ret_t (*hmi_model_cmd_exec_t)(hmi_model_cmd_t* cmd, tk_object_t* obj, const char* args);
參數(shù):
- cmd:?命令對象;obj:?默認(rèn)模型對象;args:?參數(shù)。
返回:
- RET_OBJECT_CHANGED 表示模型對象發(fā)生了變化,界面自動更新。RET_OK 表示命令執(zhí)行成功,但模型對象沒有發(fā)生變化。其他值表示命令執(zhí)行失敗。
1.2 can_exec 函數(shù)
本函數(shù)用于判斷命令是否可以執(zhí)行。函數(shù)原型如下:
typedef bool_t (*hmi_model_cmd_can_exec_t)(hmi_model_cmd_t* cmd, tk_object_t* obj, const char* args);
參數(shù):cmd: 命令對象;obj: 默認(rèn)模型對象;args: 參數(shù)。
返回:TRUE 表示命令可以執(zhí)行;FALSE 表示命令不能執(zhí)行。
1.3 聲明命令對象
命令對象一般定義為全局變量。
示例
static const hmi_model_cmd_t s_inc_temp_cmd = {
? ?.name = "inc_temp",
? ?.exec = inc_temp_exec,
? ?.can_exec = inc_temp_can_exec,
};
2.注冊命令
調(diào)用函數(shù) hmi_model_add_cmd 注冊命令。
ret_t custom_cmds_init(void) {
?tk_object_t* model = hmi_service_get_default_model();
?hmi_model_add_cmd(model, &s_inc_temp_cmd);
?return RET_OK;
}
3.完整示例
下面的代碼實現(xiàn)了一個命令 inc_temp,用于增加溫度屬性的值。溫度的值小于 100 時,命令可以執(zhí)行。
#define PROP_TEMP "溫度"
static ret_t inc_temp_exec(hmi_model_cmd_t* cmd, tk_object_t* obj, const char* args) {
?int temp = tk_object_get_prop_int(obj, PROP_TEMP, 0);
?tk_object_set_prop_int(obj, PROP_TEMP, temp + 1);
?return RET_OBJECT_CHANGED;
}
static bool_t inc_temp_can_exec(hmi_model_cmd_t* cmd, tk_object_t* obj, const char* args) {
?int temp = tk_object_get_prop_int(obj, PROP_TEMP, 0);
?return temp < 100;
}
static const hmi_model_cmd_t s_inc_temp_cmd = {
? ?.name = "inc_temp",
? ?.exec = inc_temp_exec,
? ?.can_exec = inc_temp_can_exec,
};
ret_t custom_cmds_init(void) {
?tk_object_t* model = hmi_service_get_default_model();
?hmi_model_add_cmd(model, &s_inc_temp_cmd);
?return RET_OK;
}
完整示例請參考:demo_custom_cmdhttps://gitee.com/zlgopen/awtk-hmi/tree/master/hmi/demo_custom_cmd