2025-04-10 17:31:33 +08:00
..
2025-04-10 17:31:33 +08:00
2025-04-10 17:31:33 +08:00
2025-04-10 17:31:33 +08:00
2025-04-10 17:31:33 +08:00
2025-04-10 17:31:33 +08:00
2025-04-10 17:31:33 +08:00
2025-04-10 17:31:33 +08:00

FPUI 使用说明

Page cost Size average weight memory
Menu 10ms 240x320 24fps 46fps pSRAM

图片转换使用在线网页工具,字体转换使用桌面工具或lv_font_conv

资源占用

当前LVGL分配的MEM空间使用PSRAM,包括系统字库缓存,对应修改lv_conf.h

#define LV_MEM_SIZE (300U * 1024U)          /*[bytes]*/

显示相关初始化void lv_port_disp_init(void) 中定义帧数据

    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_resdisp_drv.ver_res分别定义LVGL的画布屏幕尺寸可以小于实际LCD尺寸
  • s_disp_bufp_disp_buf 是显示双buffer的指针全屏刷新指向的空间大小为320x240x2Bytes
  • MY_DISP_HOR_RES*MY_DISP_VER_RES是每次更新的显示上限值例如可以是局部刷新320x24像素非bytes

Font使用

目前系统使用了三个字库大小分别是36,66,16其中36包括系统所使用的中文字体66和16主要是数字和符号

相关字库通过lv_font_conv工具生成命令如下

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高度

"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 #*?!@#$%^&*()_+-=\|[]{};:,.<>?/"

生成的指令:

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 字库

作为最小系统字库,只包含系统常用字符,统计如下:

"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890确认短信收菜单录音机手机时间设置存储位置联系人导入导出移动增加簿主页呼叫接听免提删除保存测试返回选项挂断捷径退出通话功能开发中来电紧急通话记录结束等待本定下工具箱件年月日历期上午电子书铃声调节闹钟音量警告震动高低开关计算器格式更新管理写垃圾已常用息恢复语音王恢复出厂安全设置许可标志求助连接管理秒表文情景模式认证亲情号码语言草稿黑白显示多媒体播放相册音乐视频播放器请插入无卡列表中 #*?!@#$%^&*()_+-=\|[]{};:,.<>?/"

生成内部字库文件的方式:

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字库文件的方式

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

    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 页面

相关数据结构定义如下:

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的目的是将内存完全回收不然在重复调用的压力测试中会有内存泄漏

    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接口设置底部的按键名称,如果底部按键名称为空,则不显示底部按键

    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显示长度和比例

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图案

if((data->index+data->select) >= data->total){
    SYSLOG_ERR("(%d+%d)/%d",data->index,data->select,data->total);
    return ui_List;
}

bar使用说明

bar修改为横向和纵向两种修改自定义配置包括坐标/长宽/颜色,配置数据结构体:

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

消息弹窗数据结构如下:

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
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
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;