Files
STM32F4-Base/Drivers/BSP/UI/ui_page_runlog.c
T

100 lines
3.3 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 Page RunLog (运行记录内容页)
* 模块功能:运行记录叶子节点(node 40)的内容页数据——动态列表,每条记录 2 行
* (偶数行 = 时间戳、奇数行 = 描述),可移选分页;数据源 = sys_log API
* (/log/run.log,上电/重启事件);空日志显示单条伪行"无记录";
* 向框架 ui_content_page 提供页面描述符(零 LVGL 对象)
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
* 作者:王建锋
* 创建日期:2026-09-14
* 修改记录:
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/运行与自检记录设计说明.md §5.3)
*/
/* 头文件包含区 */
#include <string.h>
#include "ui_page_runlog.h"
#include "sys_log.h"
/* 静态变量定义区 */
/* 最近读取的记录缓存(偶数行读盘后,奇数行复用;避免同记录重复 I/O) */
static uint8_t s_cache_valid; /* 缓存有效标志(0 = 无缓存) */
static uint32_t s_last_rec; /* 已缓存的记录序号 */
static char s_ts[SYSLOG_TS_LEN + 1u];
static char s_desc[SYSLOG_DESC_MAX + 1u];
/* 函数定义区 */
/*
* 函数功能:总行数(动态;每条记录 2 行,空日志 = 单条伪行"无记录")
* 入口参数:无
* 返回值:总行数 uint16_t
*/
static uint16_t rl_count_cb(void) {
uint32_t n = syslog_count(SYSLOG_RUN);
if (n == 0u) {
return 1u; /* 空态伪行(页脚"共 1 页",避免"共 0 页") */
}
return (uint16_t)(n * 2u);
}
/*
* 函数功能:逐行取数(偶数行 = 时间戳、奇数行 = 描述;值列恒空)
* 入口参数:row - 全局行下标 uint16_t
* name - 名输出缓冲(框架栈缓冲 CP_ROW_BUF_LEN=32,含 NUL) char *
* value - 值输出缓冲(同上;本页恒写空串) char *
* 限定条件:页面打开中(框架绘制/按键上下文,uiTask)
*/
static void rl_refresh(uint16_t row, char *name, char *value) {
uint32_t n = syslog_count(SYSLOG_RUN);
value[0] = '\0';
if (n == 0u) {
(void)memcpy(name, "无记录", sizeof("无记录"));
return;
}
{
uint32_t rec = row / 2u;
if (!s_cache_valid || rec != s_last_rec) {
if (syslog_get_record(SYSLOG_RUN, rec, s_ts, sizeof(s_ts), s_desc, sizeof(s_desc)) != 0) {
name[0] = '\0'; /* 读失败(越界/存储异常):空行防御 */
return;
}
s_last_rec = rec;
s_cache_valid = 1u;
}
if ((row % 2u) == 0u) {
(void)memcpy(name, s_ts, sizeof(s_ts));
}
else {
(void)memcpy(name, s_desc, sizeof(s_desc));
}
}
}
/*
* 页面描述符(外部链接:框架描述符表 s_defs[] 直接引用):
* 动态列表页——每记录 2 行、8 行/页 = 4 条/页;band_h=13(同 AC/DC 约定:
* selectable 页选中行黑字必须配白带,band_h=0 会致选中行不可见);
* 时间戳 19 ASCII ≈114px < 屏宽可容
*/
const content_page_def_t ui_page_runlog_desc = {
.title = "运行记录",
.selectable = 1u,
.top_y = 24,
.pitch = 14,
.band_h = 13,
.text_dy = 0,
.left_x = 7,
.right_x = 101,
.rows_per_page = 8u,
.count_cb = rl_count_cb,
.refresh = rl_refresh,
};