v2-on-ui #4

Merged
wandering1 merged 497 commits from v2-on-ui into master 2026-11-02 04:07:13 +08:00
9 changed files with 172 additions and 99 deletions
Showing only changes of commit 64abefaa00 - Show all commits
+15 -46
View File
@@ -9,12 +9,14 @@
* 创建日期:2026-09-14
* 修改记录:
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.3)
* v1.1 2026-10-20 王建锋 改用 ui_w_records 共享组件(W6 U2:合并两页重复实现)
*/
/* 头文件包含区 */
#include <string.h>
#include "ui_page_runlog.h"
#include "ui_w_records.h"
#include "ui_tokens.h"
@@ -23,10 +25,7 @@
/* 静态变量定义区 */
/* 最近读取的记录缓存(偶数行读盘后,奇数行复用;避免同记录重复 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];
/* 静态变量定义区:见下方 s_rec */
/* 函数定义区 */
@@ -35,49 +34,19 @@ static char s_desc[SYSLOG_DESC_MAX + 1u];
* 入口参数:无
* 返回值:总行数 uint16_t
*/
static uint16_t rl_count_cb(void) {
uint32_t n = syslog_count(SYSLOG_RUN);
/*
* 记录页薄跳板:内容全部走 ui_w_records 共享组件(W6 U2)。
* 实例 s_rec 携带日志 ID 与**本实例自己的**读盘缓存——两页共用组件代码,
* 但缓存不得共享,否则切页会命中上一记录号而显示另一页的陈旧行。
*/
static ui_w_records_t s_rec = { SYSLOG_RUN };
if (n == 0u) {
return 1u; /* 空态伪行(页脚"共 1 页",避免"共 0 页") */
}
return (uint16_t)(n * 2u);
static uint16_t pg_count(void) {
return ui_w_records_count(&s_rec);
}
/*
* 函数功能:逐行取数(偶数行 = 时间戳、奇数行 = 描述;值列恒空)
* 入口参数:row - 全局行下标 uint16_t
* name - 名输出缓冲(框架栈缓冲 UI_BUF_STRLEN=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));
}
}
static void pg_refresh(uint16_t row, char *name, char *value) {
ui_w_records_refresh(&s_rec, row, name, value);
}
/*
@@ -97,6 +66,6 @@ const content_page_def_t ui_page_runlog_desc = {
.left_x = UI_LIST_LEFT_X,
.right_x = UI_LIST_RIGHT_X,
.rows_per_page = UI_LIST_ROWS,
.count_cb = rl_count_cb,
.refresh = rl_refresh,
.count_cb = pg_count,
.refresh = pg_refresh,
};
+15 -46
View File
@@ -9,12 +9,14 @@
* 创建日期:2026-09-14
* 修改记录:
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.4)
* v1.1 2026-10-20 王建锋 改用 ui_w_records 共享组件(W6 U2:合并两页重复实现)
*/
/* 头文件包含区 */
#include <string.h>
#include "ui_page_selftest.h"
#include "ui_w_records.h"
#include "ui_tokens.h"
@@ -23,10 +25,7 @@
/* 静态变量定义区 */
/* 最近读取的记录缓存(偶数行读盘后,奇数行复用;避免同记录重复 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];
/* 静态变量定义区:见下方 s_rec */
/* 函数定义区 */
@@ -35,49 +34,19 @@ static char s_desc[SYSLOG_DESC_MAX + 1u];
* 入口参数:无
* 返回值:总行数 uint16_t
*/
static uint16_t st_count_cb(void) {
uint32_t n = syslog_count(SYSLOG_SELFTEST);
/*
* 记录页薄跳板:内容全部走 ui_w_records 共享组件(W6 U2)。
* 实例 s_rec 携带日志 ID 与**本实例自己的**读盘缓存——两页共用组件代码,
* 但缓存不得共享,否则切页会命中上一记录号而显示另一页的陈旧行。
*/
static ui_w_records_t s_rec = { SYSLOG_SELFTEST };
if (n == 0u) {
return 1u; /* 空态伪行(页脚"共 1 页",避免"共 0 页") */
}
return (uint16_t)(n * 2u);
static uint16_t pg_count(void) {
return ui_w_records_count(&s_rec);
}
/*
* 函数功能:逐行取数(偶数行 = 时间戳、奇数行 = 故障描述;值列恒空)
* 入口参数:row - 全局行下标 uint16_t
* name - 名输出缓冲(框架栈缓冲 UI_BUF_STRLEN=32,含 NUL) char *
* value - 值输出缓冲(同上;本页恒写空串) char *
* 限定条件:页面打开中(框架绘制/按键上下文,uiTask)
*/
static void st_refresh(uint16_t row, char *name, char *value) {
uint32_t n = syslog_count(SYSLOG_SELFTEST);
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_SELFTEST, 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));
}
}
static void pg_refresh(uint16_t row, char *name, char *value) {
ui_w_records_refresh(&s_rec, row, name, value);
}
/*
@@ -97,6 +66,6 @@ const content_page_def_t ui_page_selftest_desc = {
.left_x = UI_LIST_LEFT_X,
.right_x = UI_LIST_RIGHT_X,
.rows_per_page = UI_LIST_ROWS,
.count_cb = st_count_cb,
.refresh = st_refresh,
.count_cb = pg_count,
.refresh = pg_refresh,
};
+70
View File
@@ -0,0 +1,70 @@
/*
* 模块名称:UI 记录页共享组件实现
* 模块功能:见 ui_w_records.h(逻辑照搬合并前的 ui_page_runlog.c / ui_page_selftest.c,
* 两文件差异仅为日志 ID 与符号名,其余逐字相同)
* 适用范围:Drivers/BSP/UI
* 作者:王建锋
* 创建日期:2026-10-20
* 修改记录:
* v1.0 2026-10-20 王建锋 创建(W6 U2)
*/
#include <string.h>
#include "ui_w_records.h"
#include "ui_tokens.h"
/* 函数定义区 */
/*
* 函数功能:总行数(动态;每条记录 2 行,空日志 = 单条伪行"无记录")
* 入口参数:a_inst - 记录页实例 ui_w_records_t *
* 返回值:总行数 uint16_t
*/
uint16_t ui_w_records_count(ui_w_records_t *a_inst) {
uint32_t n = syslog_count(a_inst->id);
if (n == 0u) {
return 1u; /* 空态伪行(页脚"共 1 页",避免"共 0 页") */
}
return (uint16_t)(n * 2u);
}
/*
* 函数功能:逐行取数(偶数行 = 时间戳、奇数行 = 描述;值列恒空)
* 入口参数:a_inst - 记录页实例 ui_w_records_t *
* a_row - 全局行下标 uint16_t
* a_name - 名输出缓冲 char *
* a_value- 值输出缓冲(恒写空串) char *
* 限定条件:页面打开中(框架绘制/按键上下文,uiTask)
*/
void ui_w_records_refresh(ui_w_records_t *a_inst, uint16_t a_row, char *a_name, char *a_value) {
uint32_t n = syslog_count(a_inst->id);
a_value[0] = '\0';
if (n == 0u) {
(void)memcpy(a_name, "无记录", sizeof("无记录"));
return;
}
{
uint32_t rec = a_row / 2u;
if (!a_inst->cache_valid || rec != a_inst->last_rec) {
if (syslog_get_record(a_inst->id, rec, a_inst->ts, sizeof(a_inst->ts),
a_inst->desc, sizeof(a_inst->desc)) != 0) {
a_name[0] = '\0'; /* 读失败(越界/存储异常):空行防御 */
return;
}
a_inst->last_rec = rec;
a_inst->cache_valid = 1u;
}
if ((a_row % 2u) == 0u) {
(void)memcpy(a_name, a_inst->ts, sizeof(a_inst->ts));
}
else {
(void)memcpy(a_name, a_inst->desc, sizeof(a_inst->desc));
}
}
}
+59
View File
@@ -0,0 +1,59 @@
/*
* 模块名称:UI 记录页共享组件(运行记录 / 自检记录两页的公共实现)
* 模块功能:把"定长记录 -> 每记录 2 行(偶数行时间戳、奇数行描述)+ 同记录读盘缓存
* + 空态单条伪行"这套逻辑收成一份,供多个日志页按实例复用
* 适用范围:Drivers/BSP/UI(仅 UI 层,数据源固定为 sys_log API)
* 说明:缓存必须按实例存放而非文件级静态——两页共用代码但各有独立实例,
* 若共享缓存,从 A 页切到 B 页会命中上一记录号而显示另一页的陈旧行(静默错数据)。
* 作者:王建锋
* 创建日期:2026-10-20
* 修改记录:
* v1.0 2026-10-20 王建锋 创建(W6 U2:合并 ui_page_runlog / ui_page_selftest 的重复实现)
*/
#ifndef UI_W_RECORDS_H
#define UI_W_RECORDS_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include "sys_log.h"
/*
* 记录页实例:日志源 + 该实例自己的读盘缓存
* 用法:页面文件里 static ui_w_records_t s_rec = { SYSLOG_XXX };
* 其余字段自动清零,即"缓存初始无效",与合并前两页的行为一致。
*/
typedef struct {
syslog_id_t id; /* 日志源 ID(决定读哪个记录文件) */
uint8_t cache_valid; /* 缓存有效标志(0 = 无缓存) */
uint32_t last_rec; /* 已缓存的记录序号 */
char ts[SYSLOG_TS_LEN + 1u]; /* 时间戳缓存(含 NUL) */
char desc[SYSLOG_DESC_MAX + 1u];/* 描述缓存(含 NUL) */
} ui_w_records_t;
/*
* 函数功能:总行数(动态;每条记录 2 行,空日志 = 单条伪行"无记录")
* 入口参数:inst - 记录页实例 ui_w_records_t *
* 返回值:总行数 uint16_t
*/
uint16_t ui_w_records_count(ui_w_records_t *a_inst);
/*
* 函数功能:逐行取数(偶数行 = 时间戳、奇数行 = 描述;值列恒空)
* 入口参数:inst - 记录页实例 ui_w_records_t *
* row - 全局行下标 uint16_t
* name - 名输出缓冲(框架栈缓冲 UI_BUF_STRLEN=32,含 NUL) char *
* value - 值输出缓冲(同上;本组件恒写空串) char *
* 限定条件:页面打开中(框架绘制/按键上下文,uiTask)
*/
void ui_w_records_refresh(ui_w_records_t *a_inst, uint16_t a_row, char *a_name, char *a_value);
#ifdef __cplusplus
}
#endif
#endif /* UI_W_RECORDS_H */
+5
View File
@@ -3506,6 +3506,11 @@
<FileType>1</FileType>
<FilePath>..\Drivers\BSP\UI\ui_page_registry.c</FilePath>
</File>
<File>
<FileName>ui_w_records.c</FileName>
<FileType>1</FileType>
<FilePath>..\Drivers\BSP\UI\ui_w_records.c</FilePath>
</File>
<File>
<FileName>ui_style.c</FileName>
<FileType>1</FileType>
@@ -36,10 +36,10 @@
<!-- MEM_SNAPSHOT:BEGIN generated by scripts/check_mem_numbers.py -->
| 区域 | 用量 | 容量 | 占比 |
|---|---|---|---|
| ER_IROM1 | 232,052 B (226.61 KB) | 1,048,576 B (1024 KB) | 22.1% |
| RW_IRAM1 | 75,232 B (73.47 KB) | 131,072 B (128 KB) | 57.4% |
| ER_IROM1 | 231,936 B (226.50 KB) | 1,048,576 B (1024 KB) | 22.1% |
| RW_IRAM1 | 75,240 B (73.48 KB) | 131,072 B (128 KB) | 57.4% |
| RW_CCM | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% |
| **Flash (ROM 合计)** | **233,192 B (227.7 KB)** | 1,048,576 B (1024 KB) | **22.2%** |
| **Flash (ROM 合计)** | **233,120 B (227.7 KB)** | 1,048,576 B (1024 KB) | **22.2%** |
<!-- MEM_SNAPSHOT:END -->
各区的容量与常量来源:
+3 -3
View File
@@ -15,16 +15,16 @@
<!-- MEM_BUDGET:BEGIN generated by scripts/ram_baseline.py -->
| 区域 | 用量 | 容量 | 占比 | 门禁(≤92%) |
|---|---|---|---|---|
| ER_IROM1 (Flash) | 232,052 B | 1,048,576 B | 22.1% | 参考 |
| ER_IROM1 (Flash) | 231,936 B | 1,048,576 B | 22.1% | 参考 |
| RW_CCM | 57,376 B | 65,280 B | 87.9% | PASS |
| UNINIT_CCM | 48 B | 256 B | 18.8% | 参考 |
| RW_IRAM1 | 75,232 B | 131,072 B | 57.4% | PASS |
| RW_IRAM1 | 75,240 B | 131,072 B | 57.4% | PASS |
| 子系统(静态 RW+ZI;除 RTOS 堆在 CCM 外均在 SRAM1) | 现值 | 配额 | 状态 |
|---|---|---|---|
| 网络 | 13,690 B | 12 KB | ⚠ 超 1.4 KB |
| 存储 | 7,056 B | 12 KB | OK |
| UI | 30,416 B | 16 KB | ⚠ 超 13.7 KB |
| UI | 30,422 B | 16 KB | ⚠ 超 13.7 KB |
| RTOS 堆 | 57,376 B | 56 KB | 堆=配额 |
| 应用 | 14,911 B | 8 KB | ⚠ 超 6.6 KB |
| 其它 | 9,184 B | — | 参考 |
+1 -1
View File
@@ -3,4 +3,4 @@ date code ro rw zi er_irom1 er_pct iram1 iram1_pct ccm ccm_pct top_rwzi
2026-10-13 211456 18760 1104 154232 230216 22.0 97912 74.7 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=40960;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;default_task.o=2736;sys_log_mcu.o=1924
2026-10-14 212296 18740 1112 154456 231036 22.0 98144 74.9 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=40960;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;default_task.o=2736;sys_log_mcu.o=1924
2026-10-15 213540 18740 1136 131520 232280 22.2 75232 57.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;sys_log_mcu.o=3588;default_task.o=2736
2026-10-20 213472 18580 1140 131516 232052 22.1 75232 57.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;sys_log_mcu.o=3588;default_task.o=2736
2026-10-20 213356 18580 1184 131480 231936 22.1 75240 57.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;sys_log_mcu.o=3588;default_task.o=2736
1 date code ro rw zi er_irom1 er_pct iram1 iram1_pct ccm ccm_pct top_rwzi
3 2026-10-13 211456 18760 1104 154232 230216 22.0 97912 74.7 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=40960;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;default_task.o=2736;sys_log_mcu.o=1924
4 2026-10-14 212296 18740 1112 154456 231036 22.0 98144 74.9 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=40960;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;default_task.o=2736;sys_log_mcu.o=1924
5 2026-10-15 213540 18740 1136 131520 232280 22.2 75232 57.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;sys_log_mcu.o=3588;default_task.o=2736
6 2026-10-20 213472 213356 18580 1140 1184 131516 131480 232052 231936 22.1 75232 75240 57.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;sys_log_mcu.o=3588;default_task.o=2736
+1
View File
@@ -96,6 +96,7 @@ set(UI_SOURCES
${UI_DIR}/ui_net_sink.c
${UI_DIR}/ui_page_registry.c
${UI_DIR}/ui_style.c
${UI_DIR}/ui_w_records.c
)
# 运行/自检记录引擎(双端共享核心 + 平台存储后端;MCU 端编 sys_log_mcu.c,见 Keil 工程)