自定义控件
概述
“自定义控件”是一个将“负载设备的功能”封装为按钮、开关以及范围条等控件的功能。使用 Autel Robotics 或基于 MSDK 开发的移动端 App 能够识别负载设备中控件的配置信息并生成 UI 控件,方便用户快速设置负载设备的参数并控制负载设备执行指定的动作。同时, Autel Robotics 或基于 MSDK 开发的移动端 App 还能以浮窗的形式显示负载设备的状态信息。此外,用户还能根据使用需求,将负载设备的功能映射到遥控器上的预留按键上,通过使用遥控器上的预留按键,以更便捷的方式控制负载设备。
基础概念
主界面的控件
- 动作栏控件:动作栏支持按钮、开关、范围条和选择列表四个控件类型,最多支持设置9个自定义控件。
- 浮窗:实时显示负载设备的状态信息。

配置界面的控件
用户在配置界面能够操作配置界面中的控件,如按钮、开关、范围条、选择列表、整型值输入框
控件配置文件
说明:
- 控件配置文件的路径:example/widget_file
- Autel Robotics 系统语言为中文时,控件配置文件为 cn_big_screen
- Autel Robotics 系统语言为英文时,控件配置文件为 en_big_screen
- 不同语言下的配置信息如控件编号、数量与类型等需要保持一致。
注意: 控件配置文件包含静态配置文件和控件 UI 图标,建议先在静态配置文件中配置控件属性,再设计控件图标。
配置控件属性
widget_config.json 是一个用于配置控件静态属性的文件,修改 widget_config.json 文件时,请务必严格遵守 JSON 的语法规则,否则配置文件将无法使用。
提示:
- JSON 文件中的配置项被包裹在一个{}中,通过 key-value 的方式表达数据;
- JSON 的 Key 必须包裹在一个双引号中,请勿丢失 Key 值的双引号;
- JSON 的值只支持数字(含浮点数和整数)、字符串、Bool 值(如 true 和 false)、数组(需要包裹在[]中)和对象(需要包裹在{}中 )
注意: 下述代码中 “//” 后的内容为代码注释,在实际的 JSON 配置文件请勿添加该内容。
{
"version": { // 自定义控件配置文件版本,用户不可更改此版本号
"major" : 1,
"minor" : 0
},
"main_interface": { // 主界面控件设置
"floating_window": {// 浮窗配置
"is_enable": true // 浮窗是否显示,true :显示,false :隐藏
},
"widget_list": [ // 主界面动作栏控件列表
{
"widget_index": 0, // 控件编号
"widget_type": "button", // 控件类型,主界面Action控件支持 "button" : 按钮,"switch" : 开关,"range" : 范围条,"list" : 选择列表
"widget_name": "button1", // 控件名称
"icon_file_set": { // 控件图标文件集
"icon_file_name_selected" : "button.png", // 选中状态下控件图标文件名称
"icon_file_name_unselected" : "button.png" // 未选中状态下控件图标文件名称
}
},
{
"widget_index": 1,
"widget_type": "button",
"widget_name": "button2",
"icon_file_set": {
"icon_file_name_selected" : "button2.png",
"icon_file_name_unselected" : "button2.png"
}
},
{
"widget_index": 2,
"widget_type": "list",
"widget_name": "List",
"list_item": [
{
"item_name": "item1",
"icon_file_set": {
"icon_file_name_selected" : "item1.png",
"icon_file_name_unselected" : "item1.png"
}
},
{
"item_name": "item2",
"icon_file_set": {
"icon_file_name_selected" : "item2.png",
"icon_file_name_unselected" : "item2.png"
}
}
]
},
{
"widget_index": 3,
"widget_type": "switch",
"widget_name": "switch1",
"icon_file_set": {
"icon_file_name_selected" : "select.png",
"icon_file_name_unselected" : "unselect.png"
}
},
{
"widget_index": 4,
"widget_type": "scale",
"widget_name": "scale1",
"icon_file_set": {
"icon_file_name_selected" : "scale.png",
"icon_file_name_unselected" : "scale.png"
}
}
]
},
"config_interface": {
"text_input_box": { // 文本输入框
"widget_name":"TextInputBox1", //文本输入框名称
"placeholder_text":"Input message: ", //文本输入框占位符文本
"is_enable":false // 文本输入框是否显示,false : 不显示,true : 显示
},
"widget_list": [
{
"widget_index": 5,
"widget_type": "button",
"widget_name": "Button_5"
},
{
"widget_index": 6,
"widget_type": "scale",
"widget_name": "Scale_6"
},
{
"widget_index": 7,
"widget_type": "input_box",
"widget_name": "Input_Box_7",
"int_input_box_hint": "unit:s"
},
{
"widget_index": 8,
"widget_type": "switch",
"widget_name": "Switch_8"
},
{
"widget_index": 9,
"widget_type": "list",
"widget_name": "List_9",
"list_item": [
{
"item_name": "Item1"
},
{
"item_name": "Item2"
},
{
"item_name": "Item3"
},
{
"item_name": "Item4"
}
]
}
]
}
使用自定义控件功能
开发负载设备的自定义控件功能,需要先完成自定义控件的初始化,获取控件配置文件所在的目录,配置控件在不同系统语言下显示的配置文件,通过设置控件处理函数列表,应用自定义控件功能,最终实现自定义控件功能。
1. 控件初始化
使用“自定义控件”功能前,需要使用如下代码初始化负载设备的控件。
uavStat = UavWidget_Init();
if (uavStat != UAV_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("UAV test widget init error, stat = {}", uavStat);
return uavStat;
}
2. 设置控件配置信息
在开发负载设备时,需要设置控件的配置信息,如控件默认的配置文件和不同系统语言对应的控件配置文件。确保 Autel Robotics 能够获取控件的配置信息并正确地显示在 Autel Robotics 上。
设置负载设备的控件参数
uavStat = UavWidget_RegDefaultUiConfigByDirPath(defaultWidgetPath.c_str());
if (uavStat != UAV_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("UavWidget_RegDefaultUiConfigByDirPath failed, stat = {}", uavStat);
} else {
USER_LOG_INFO("UavWidget_RegDefaultUiConfigByDirPath succeeded, path = {}", defaultWidgetPath);
}
uavStat = UavWidget_RegUiConfigByDirPath(UAV_MOBILE_APP_LANGUAGE_ENGLISH,
UAV_MOBILE_APP_SCREEN_TYPE_BIG_SCREEN,
englishBigScreenPath.c_str());
if (uavStat != UAV_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("UavWidget_RegUiConfigByDirPath failed, stat = {}", uavStat);
} else {
USER_LOG_INFO("UavWidget_RegUiConfigByDirPath succeeded, language = ENGLISH, screen = BIG_SCREEN, path = {}",
englishBigScreenPath);
}
uavStat = UavWidget_RegUiConfigByDirPath(UAV_MOBILE_APP_LANGUAGE_CHINESE,
UAV_MOBILE_APP_SCREEN_TYPE_BIG_SCREEN,
chineseBigScreenPath.c_str());
if (uavStat != UAV_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("UavWidget_RegUiConfigByDirPath failed, stat = {}", uavStat);
} else {
USER_LOG_INFO("UavWidget_RegUiConfigByDirPath succeeded, language = CHINESE, screen = BIG_SCREEN, path = {}",
chineseBigScreenPath);
}
3. 注册控件处理函数列表
通过 UavWidget_RegHandlerList
接口注册负载设备的某项功能和对应的控件参数,将负载设备的功能绑定到指定的控件上。
uavStat = UavWidget_RegHandlerList(s_widgetHandlerList, s_widgetHandlerListCount);
if (uavStat != UAV_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("UAV test widget register handler list error, stat = {}", uavStat);
}