Files
STM32F4-Base/Drivers/BSP/UI/ui_port.h
T

99 lines
3.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 模块名称:UI Display Port (LVGL 离屏显示端口)
* 模块功能:提供 LVGL 1bpp 离屏渲染端口与远程 keypad 输入设备
* 适用平台:STM32F407ZGTx
* 作者:王建锋
* 创建日期:2026-08-29
* 修改记录:
* 2026-08-29 王建锋 创建初始版本
*/
#ifndef UI_PORT_H
#define UI_PORT_H
#include <stdint.h>
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
/* 屏幕尺寸与帧缓冲(160x160 1bpp = 3200 字节) */
#define UI_SCREEN_W 160
#define UI_SCREEN_H 160
#define UI_FB_SIZE ((UI_SCREEN_W * UI_SCREEN_H) / 8)
/*
* LVGL 索引色(I1)绘制缓冲布局 = [palette][pixel data](2026-09-21 台架实证;
* 改本端口或升级 LVGL 版本前必读):
* - lv_draw_buf_create() : 尺寸 = stride*h + LV_COLOR_INDEXED_PALETTE_SIZE(cf)*4
* - lv_draw_buf_goto_xy()/lv_draw.c : 取绘制指针时 data += palette(像素不从缓冲首址开始)
* - lv_refr get_max_row() : 从 data_size 里扣掉 palette 才当可用像素
* 但 lv_display_set_buffers()/lv_draw_buf_init() 的容量校验**只看 stride*h(不含 palette)**,
* 故"只给 stride*h"会被静默接受;实测两种后果:
* 1) 末 palette 个像素字节写到缓冲之外(金丝雀实测越界 8B,曾打脏紧邻 .bss 的
* s_frame_box[0] 指针 → 野指针 HardFault);
* 2) flush 回调收到的首地址含 palette,照原样整帧拷贝会让推流画面整体错位 8B。
* 规则:绘制缓冲按 UI_DRAW_BUF_SIZE 提供、上报 LVGL 的尺寸也用 UI_DRAW_BUF_SIZE;
* flush 取像素必须 color_p + UI_DRAW_BUF_PALETTE。
* 注:此处用字面量 8(I1 = 2 色 x 4 字节)以免头文件依赖 lvgl.h;ui_port.c 已按
* LV_COLOR_INDEXED_PALETTE_SIZE(LV_COLOR_FORMAT_I1)*4 核对一致。
*/
#define UI_DRAW_BUF_PALETTE 8u
#define UI_DRAW_BUF_SIZE (UI_FB_SIZE + UI_DRAW_BUF_PALETTE)
/* 远端按键码(与 DTU-HMI key.h 保持一致) */
#define UI_KEY_UP 0x02
#define UI_KEY_DOWN 0x40
#define UI_KEY_LEFT 0x10
#define UI_KEY_RIGHT 0x08
#define UI_KEY_ENTER 0x20
#define UI_KEY_ESC 0x01
/*
* 函数功能:初始化 LVGL 显示端口与按键输入设备
* 入口参数:无
* 返回值:0 - 成功,其他 - 失败(显示或输入设备创建失败)
* 限定条件:无
* 函数说明:1. 初始化 LVGL 内核并创建 1bpp 离屏显示设备
* 2. 创建 keypad 输入设备及默认输入组,用于菜单导航
* 3. 需在 lv_tick_inc/lv_timer_handler 被周期调用后方可刷新
*/
int ui_port_init(void);
/*
* 函数功能:获取内存帧缓冲首地址
* 入口参数:无
* 返回值:帧缓冲首地址 uint8_t * 固定长度 UI_FB_SIZE 字节
* 限定条件:ui_port_init() 已成功调用
* 函数说明:1. 帧缓冲由 flush 回调写入最新渲染结果
* 2. 供 RemoDispBus 服务端读取并推送至远端
*/
uint8_t *ui_port_get_framebuffer(void);
/*
* 函数功能:向输入队列喂入一个远端按键值
* 入口参数:key_val - 远端键码 uint8_t UI_KEY_* 取值之一
* 返回值:无
* 限定条件:无
* 函数说明:1. 将远端键码映射为 LVGL 按键后缓存
* 2. 由 keypad 读取回调在下次轮询时上报,驱动菜单导航
*/
void ui_port_queue_key(uint8_t key_val);
/*
* 函数功能:UI 周期步进(更新系统节拍并刷新 LVGL)
* 入口参数:tick_ms - 距上次调用的毫秒数 uint32_t 建议 10
* 返回值:无
* 限定条件:ui_port_init() 已成功调用
* 函数说明:1. 调用 lv_tick_inc 推进 LVGL 内部时钟
* 2. 调用 lv_timer_handler 处理重绘,结果经 flush 写入帧缓冲
* 3. 须由任务以固定周期调用,否则界面停止刷新
*/
void ui_port_step(uint32_t tick_ms);
#ifdef __cplusplus
}
#endif
#endif /* UI_PORT_H */