AWTK 开源串口屏开发(18) - 用 C 语言自定义命令

AWTK-HMI 内置了不少模型,利用这些模型开发应用程序,不需要编写代码即可实现常见的应用。但是,有时候我们需要自定义一些命令,以实现一些特殊的功能。

本文档介绍如何使用 C 语言自定义命令。

1. 实现 hmi_model_cmd_t 接口

1.1 exec 函数

本函数用于执行命令。函数原型如下:

c 复制代码
typedef ret_t (*hmi_model_cmd_exec_t)(hmi_model_cmd_t* cmd, tk_object_t* obj, const char* args);

参数:

  • cmd: 命令对象
  • obj: 默认模型对象
  • args: 参数

返回:

  • RET_OBJECT_CHANGED 表示模型对象发生了变化,界面自动更新。
  • RET_OK 表示命令执行成功,但模型对象没有发生变化。
  • 其他值表示命令执行失败。

1.2 can_exec 函数

本函数用于判断命令是否可以执行。函数原型如下:

c 复制代码
typedef bool_t (*hmi_model_cmd_can_exec_t)(hmi_model_cmd_t* cmd, tk_object_t* obj, const char* args);

参数:

  • cmd: 命令对象
  • obj: 默认模型对象
  • args: 参数

返回:

  • TRUE 表示命令可以执行。
  • FALSE 表示命令不能执行。

1.3 声明命令对象

命令对象一般定义为全局变量。

示例

c 复制代码
static const hmi_model_cmd_t s_inc_temp_cmd = { 
    .name = "inc_temp",
    .exec = inc_temp_exec,
    .can_exec = inc_temp_can_exec,
};

2.注册命令

调用函数 hmi_model_add_cmd 注册命令。

c 复制代码
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.完整示例

下面的代码实现了一个命令 inc_temp,用于增加温度属性的值。温度的值小于 100 时,命令可以执行。

c 复制代码
#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_cmd

相关推荐
时间的拾荒人8 小时前
C语言字符函数与字符串函数完全指南
c语言·开发语言
持力行8 小时前
C/C++ 中的 char*:它标识数组吗?为什么能用下标访问?
c语言·c++
小陈的代码之路11 小时前
回文链表(LeetCode 234)C语言最佳解题思路
c语言·leetcode·链表
aaaameliaaa12 小时前
计算斐波那契数(递归、迭代)(1,1,2,3,5.....)
c语言·开发语言·笔记·算法·排序算法
zhangfeng113315 小时前
算子开发 Overwrite 覆盖/替换模式 Accumulate 累加模式,性能对比 memset错误 bat_alloc 错误
c语言·人工智能·gnu·算子开发
SuperByteMaster15 小时前
JLinkDevices.xml FLM文件路径不对
c语言
LDR00615 小时前
LDR6500赋能POS机底座:单口Type-C供电、维护与产测一体化解决方案
大数据·c语言·人工智能
鱼很腾apoc16 小时前
【Linux】第7期 进程间通信 (IPC) 详解:管道 (匿名 / 命名) + System V
linux·服务器·c语言·学习·进程间通信·ipc
wuyk55517 小时前
21. 嵌入式面试避坑指南:sizeof 是关键字,不是函数!
c语言·开发语言·stm32·单片机·嵌入式硬件
fzm529820 小时前
车载ECU单元测试技术与应用研究
c语言·自动化测试·单元测试·嵌入式·白盒测试