267 lines
11 KiB
Markdown
Raw Normal View History

2025-04-10 17:31:33 +08:00
# FPUI 使用说明
| Page | cost | Size | average | weight | memory |
| ---- | ----- | ------- | ----- | ----- | ------ |
| Menu | 10ms | 240x320 | 24fps | 46fps | pSRAM |
图片转换使用在线网页工具,字体转换使用桌面工具或**lv_font_conv**
* 图片转换https://lvgl.io/tools/imageconverter
* 字体转换https://lvgl.io/tools/fontconverter
## 资源占用
当前LVGL分配的MEM空间使用PSRAM,包括系统字库缓存,对应修改**lv_conf.h**
``` bash
#define LV_MEM_SIZE (300U * 1024U) /*[bytes]*/
```
显示相关初始化**void lv_port_disp_init(void)** 中定义帧数据
``` bash
lv_disp_draw_buf_init(&draw_buf_dma, s_disp_buf, p_disp_buf,MY_DISP_HOR_RES*MY_DISP_VER_RES);
lv_disp_drv_init(&disp_drv); /*Basic initialization*/
disp_drv.hor_res = MY_DISP_HOR_RES;
disp_drv.ver_res = MY_DISP_VER_RES;
disp_drv.flush_cb = disp_flush;
disp_drv.rounder_cb = lcd_rounder_cb;
/*Set a display buffer*/
disp_drv.draw_buf = &draw_buf_dma;
// disp_drv.full_refresh = 1;
lv_disp_drv_register(&disp_drv);
```
* 其中 **disp_drv.hor_res**和**disp_drv.ver_res**分别定义LVGL的画布屏幕尺寸可以小于实际LCD尺寸
* **s_disp_buf** 和 **p_disp_buf** 是显示双buffer的指针全屏刷新指向的空间大小为320x240x2Bytes
* MY_DISP_HOR_RES*MY_DISP_VER_RES是每次更新的显示上限值例如可以是局部刷新320x24像素非bytes
## Font使用
目前系统使用了三个字库大小分别是36,66,16其中36包括系统所使用的中文字体66和16主要是数字和符号
相关字库通过lv_font_conv工具生成命令如下
```bash
winget install Schniz.fnm
fnm install --lts
fnm ls
npm install -g lv_font_conv
fnm env --use-on-cd | Out-String | Invoke-Expression
```
系统符号字库66和16高度
```bash
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 #*?!@#$%^&*()_+-=\|[]{};:,.<>?/"
```
生成的指令:
```bash
lv_font_conv --size 66 --bpp 2 --format bin --no-compress --no-prefilter --font E:\eigencomm\V017\PLAT\package\fonts\SourceHanSansCN-Light-2.otf --symbols "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 #*?!@#$%^&*()_+-=\|[]{};:,.<>?/" -o E:\eigencomm\V017\PLAT\package\merge\lv_font_system_66.bin
lv_font_conv --size 16 --bpp 1 --format bin --no-compress --no-prefilter --font E:\eigencomm\V017\PLAT\package\fonts\SourceHanSansCN-Light-2.otf --symbols "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 #*?!@#$%^&*()_+-=\|[]{};:,.<>?/" -o E:\eigencomm\V017\PLAT\package\merge\lv_font_system_16.bin
lv_font_conv --size 16 --bpp 1 --format lvgl --no-compress --no-prefilter --font E:\eigencomm\V017\PLAT\package\fonts\SourceHanSansCN-Light-2.otf --symbols "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 #*?!@#$%^&*()_+-=\|[]{};:,.<>?/" -o E:\eigencomm\V017\PLAT\package\merge\lv_font_system_16.c
```
### lv_font_system_36 字库
作为最小系统字库,只包含系统常用字符,统计如下:
```bash
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890确认短信收菜单录音机手机时间设置存储位置联系人导入导出移动增加簿主页呼叫接听免提删除保存测试返回选项挂断捷径退出通话功能开发中来电紧急通话记录结束等待本定下工具箱件年月日历期上午电子书铃声调节闹钟音量警告震动高低开关计算器格式更新管理写垃圾已常用息恢复语音王恢复出厂安全设置许可标志求助连接管理秒表文情景模式认证亲情号码语言草稿黑白显示多媒体播放相册音乐视频播放器请插入无卡列表中 #*?!@#$%^&*()_+-=\|[]{};:,.<>?/"
```
生成内部字库文件的方式:
```bash
lv_font_conv --size 32 --bpp 2 --format lvgl --no-compress --no-prefilter --font D:\eigencomm\gitea\ec718_716_sdk_main\PLAT\testscript\package\fonts\SourceHanSansCN-Light-2.otf --symbols "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890确认短信收菜单录音机手机时间设置存储位置联系人导入导出移动增加簿主页呼叫接听免提删除保存测试返回选项挂断捷径退出通话功能开发中来电紧急通话记录结束等待本定下工具箱件年月日历期上午电子书铃声调节闹钟音量警告震动高低开关计算器格式更新管理写垃圾已常用息恢复语音王恢复出厂安全设置许可标志求助连接管理秒表文情景模式认证亲情号码语言草稿黑白显示多媒体播放相册音乐视频播放器请插入无卡列表中 #*?!@#$%^&*()_+-=\|[]{};:,.<>?/" -o D:\eigencomm\gitea\ec718_716_sdk_main\PLAT\subsys\apphub\fpui\gui\fonts\lv_font_system_36.c
```
生成外部lv_font_light_36.bin字库文件的方式
```bash
lv_font_conv --size 32 --bpp 2 --format bin --no-compress --no-prefilter --font E:\eigencomm\gitea\ec718_716_sdk_main\PLAT\testscript\package\fonts\SourceHanSansCN-Light-2.otf --symbols "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890确认短信收菜单录音机手机时间设置存储位置联系人导入导出移动增加簿主页呼叫接听免提删除保存测试返回选项挂断捷径退出通话功能开发中来电紧急通话记录结束等待本定下工具箱件年月日历期上午电子书铃声调节闹钟音量警告震动高低开关计算器格式更新管理写垃圾已常用息恢复语音王恢复出厂安全设置许可标志求助连接管理秒表文情景模式认证亲情号码语言草稿黑白显示多媒体播放相册音乐视频播放器请插入无卡列表中 #*?!@#$%^&*()_+-=\|[]{};:,.<>?/" -o E:\eigencomm\gitea\ec718_716_sdk_main\PLAT\testscript\package\merge\lv_font_system_36.bin
```
代码中调用 **ui.c**
```bash
uint32_t ret = lv_font_extern_init();
if(ret == 0) {
UI_ERR("Failed load Font free36\r\n");
}
```
* 全功能字库**lv_font_extern_36.bin**大小750KB包含常用汉字主要用于短信等功能
* 使用外部字库 **lv_font_extern_init()** 加载外部flash数据
* 如果外置字库不使用PSRAM缓存通过SPI裸地址读取速度相对较慢
## 页面
### List 页面
相关数据结构定义如下:
```bash
typedef struct
{
char *title; //标题字符
uint8_t select; //选中行数 0-5
char *context[6]; //每行内容
uint8_t index; //起始行索引 < 总行数
uint8_t total; //总行数
void * image; //icon图片地址
char (*bottomBtn)[8];
} PhoneUI_list_t;
```
* 目前icon图片未实现bottomBtn是通用组件用于显示底部的按键名称提示作用
* context用于显示每行内容现有屏幕的尺寸只实现了6行36字体每次调用传递6行数据的指针
* title是标题index是起始行的索引total是整个表的总行数index和total主要用于指示作用
* select是选中行数主要是0-5选中行高亮
### Player 页面
在使用lv_obj_clean后增加lv_obj_del_async的目的是将内存完全回收不然在重复调用的压力测试中会有内存泄漏
```bash
if(lv_obj_is_valid(_ui_Player) && _ui_Player != NULL){
lv_obj_clean(_ui_Player);
lv_obj_del_async(_ui_Player);
_ui_Player = NULL;
}
if(data == NULL) {
osEventFlagsSet(uiEvtHandle, (1U << PAGE_APP));
return NULL;
}
```
在每个主页中都会调用**ui_btn_set**接口设置底部的按键名称,如果底部按键名称为空,则不显示底部按键
```bash
ui_btn_set(app_btn,lv_color_black(),lv_color_white());
lv_disp_load_scr(_ui_Player);
osEventFlagsSet(uiEvtHandle, (1U << PAGE_APP));
```
使用**lv_disp_load_scr**接口加载页面,同时通过**osEventFlagsSet**传递事件给UI线程UI线程通过**osEventFlagsWait**等待事件会返回
## 组件
### slider使用说明
目前作为list的组成部分在原有list参数基础上增加index参数作为显示页的实际起始索引当前列表的偏移量select显示高亮行实际行数为index+select总行数total影响slider显示长度和比例
```bash
typedef struct
{
char *title; //标题字符
uint8_t select; //选中行数 0-5
char *context[6]; //每行内容
uint8_t index; //起始行索引 (限制 (index+select) < total)
uint8_t total; //总行数
void * image; //icon图片地址
char (*bottomBtn)[8];
} PhoneUI_list_t;
```
目前针对参数加入了防呆机制如果输入index+select 超出total则不会添加slider图案
```bash
if((data->index+data->select) >= data->total){
SYSLOG_ERR("(%d+%d)/%d",data->index,data->select,data->total);
return ui_List;
}
```
### bar使用说明
bar修改为横向和纵向两种修改自定义配置包括坐标/长宽/颜色,配置数据结构体:
```bash
typedef struct
{
uint8_t value; //标识值,同时数字标号
uint8_t range; //最大值
int16_t offsetX; //x偏移量 如果为0则居中
int16_t offsetY; //y偏移量 如果为0则居中
int16_t width; //bar宽度
int16_t height; //bar高度
uint16_t color; //bar颜色
} fpui_bar_t;
```
其中width和height为bar的宽高设定不同的宽高可以实现横向和纵向baroffsetX和offsetY为bar的偏移量如果为0则居中如果为正数则向右或向下偏移如果为负数则向左或向上偏移。
* 可以将bar视作一个矩形通过width和height实现形状定义通过offsetX和offsetY实现位置定义
### message使用说明
* 绘制时间 5.1(≤23)ms
消息弹窗数据结构如下:
```bash
typedef struct
{
void *object;
void *screen;
char *title; //暂未使用
char *context;
bool overlay; //是否叠加显示,true=不删除原弹窗
int16_t offsetX; //x偏移量 如果为0则居中 -100 ~ 100
int16_t offsetY; //y偏移量 如果为0则居中 -100 ~ 100
uint16_t width; //宽度 40 ~ 240
uint16_t height; //高度 40 ~ 320
uint16_t color;
} fpui_message_t;
```
1. **title**: 弹窗标题,暂时未使用
2. **context**: 弹窗显示的消息内容
3. **offsetX**: 弹窗x偏移量如果为0则居中 -100 ~ 100
4. **offsetY**: 弹窗y偏移量如果为0则居中 -100 ~ 100
5. **width**: 弹窗宽度 40 ~ 240
6. **height**: 弹窗高度 40 ~ 320
7. **color**: 弹窗背景色,默认为白色
8. **overlay**: 是否可重叠如果为true则不删除原弹窗
### listpop使用说明
弹窗列表功能,支持定义长宽和位置,支持颜色调整
* 绘制时间 14.2(≤23)ms
```bash
typedef struct
{
void *object;
void *screen;
uint8_t index; //起始行索引 < 总行数
uint8_t total; //总行数
char *context[MAX_LISTPOP_ITEMS]; //每行内容
uint8_t select; //选中行数 0-5
bool overlay; //是否叠加显示,true=不删除原弹窗
int16_t offsetX; //x偏移量 如果为0则居中 -100 ~ 100
int16_t offsetY; //y偏移量 如果为0则居中 -100 ~ 100
uint16_t width; //宽度,建议220和内容相关
uint16_t height; //高度,支持自适应
uint16_t color;
} fpui_listpop_t;
```
### ui_file 使用说明
用于显示文件夹的内容
* 绘制时间 44(≤46)ms
```bash
typedef struct
{
void *object;
char *folder;
char *title;
uint16_t color;
uint8_t select;
uint8_t index;
uint8_t total;
char *context[6];
char (*bottomBtn)[8];
} fpui_file_t;
```