UI 待机显示页接入 UA/UB/UC/IA/IB/IC 六路实时值(v1.1)
- ui_standby.c:v1 占位(6 行恒 0.00A)→ ui_data 通道一按 seq 门控取帧,
yc 语义下标 {0,1,2,4,5,6}(跳 UN/IN);无首帧/坏质显 --;定点格式化复用
ui_w_editor_fmt_scaled;单位随 eng(引脚档不挂),口径逐字对齐 ui_page_ac.c
- ui_standby.h:头注与修改记录同步
- 文档 §5.2 按新口径改写;§1 R2 改为新需求口径(不再引 mockup);§9 对应
开放问题销项删行;版本 v1.4
验证:模拟器 0 错 0 警 + 菜单行/内容页/编码规范门禁 PASS + Keil 0 错 0 警;
--standby 截图双分支实证(UA/IA 显值、UB/UC/IB/IC 显 --)。
This commit is contained in:
+119
-12
@@ -1,6 +1,7 @@
|
||||
/*
|
||||
* 模块名称:UI Standby (待机显示页)
|
||||
* 模块功能:长时间无按键操作时自动切入的默认界面(6 路电流值 + 分隔线 + 底部时钟);
|
||||
* 模块功能:长时间无按键操作时自动切入的默认界面(UA/UB/UC/IA/IB/IC 六路实时值 + 分隔线 + 底部时钟);
|
||||
* 数值经 ui_data 通道一实时帧 yc[](App 层装配,本文件零 App include),口径同 ui_page_ac.c;
|
||||
* 屏幕覆盖层模式——进入保存前屏与焦点、ENTER(确认键)还原,其余键忽略;
|
||||
* 空闲检测 = lv_timer(1s 周期),活动通知由菜单/内容页键事件挂钩
|
||||
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
|
||||
@@ -8,6 +9,9 @@
|
||||
* 创建日期:2026-09-14
|
||||
* 修改记录:
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.2)
|
||||
* v1.1 2026-11-13 DTU 项目组 v1 占位(6 行电流恒 0.00A)→ UA/UB/UC/IA/IB/IC 实时值:
|
||||
* ui_data 通道一按 seq 门控取帧;无首帧/坏质显 "--";定点
|
||||
* 格式化复用 ui_w_editor_fmt_scaled;单位随 eng(引脚档不挂)
|
||||
*/
|
||||
|
||||
/* 头文件包含区 */
|
||||
@@ -16,9 +20,11 @@
|
||||
#include "ui_standby.h"
|
||||
|
||||
#include "lvgl.h"
|
||||
#include "ui_data.h"
|
||||
#include "ui_menu_view.h"
|
||||
#include "ui_style.h"
|
||||
#include "ui_tokens.h"
|
||||
#include "ui_w_editor.h"
|
||||
|
||||
#define DBG_TAG "[UI_STANDBY]"
|
||||
#include "dbg_log.h"
|
||||
@@ -27,24 +33,40 @@
|
||||
|
||||
/*
|
||||
* 布局常量(设备像素;参考 mockups/待机显示页面.jpg):
|
||||
* 屏幕宽高取令牌 UI_SCREEN_W/H;6 路电流值行自 y=28 起、行距 18
|
||||
* 屏幕宽高取令牌 UI_SCREEN_W/H;六路实时值行自 y=28 起、行距 18
|
||||
* (末行 y=118..130);分隔线 y=132;底部时钟 y=140 居中
|
||||
*/
|
||||
#define SB_CH_COUNT 6u /* 电流通道数 */
|
||||
#define SB_CH_COUNT 6u /* 显示通道数(六路主要电力量;yc 下标见 s_ch_yc) */
|
||||
#define SB_ROW_Y0 28 /* 首数据行顶 y */
|
||||
#define SB_PITCH 18 /* 行距(相邻行槽顶间距) */
|
||||
#define SB_LABEL_X 24 /* 通道名 x(Ib/Ic/...) */
|
||||
#define SB_LABEL_X 24 /* 通道名 x(UA/UB/UC/IA/IB/IC) */
|
||||
#define SB_EQ_X 72 /* "=" 号 x */
|
||||
#define SB_VALUE_X 96 /* 数值 x(0.00A;v1 占位,待交流量标定管线接入实时值) */
|
||||
#define SB_VALUE_X 96 /* 数值 x(数字+单位 或 "--") */
|
||||
|
||||
/* 值串缓冲长度:最坏 "2147483.647V" = 12 + NUL,取 16 留余量 */
|
||||
#define SB_VAL_BUF_LEN 16u
|
||||
#define SB_INVALID "--" /* 空值串(同交流量页 AC_INVALID) */
|
||||
#define SB_DECIMALS 3u /* 电压/电流小数位(同交流量页 AC_IA_DECIMALS) */
|
||||
/* 不可信品质合集:无效 / 未攒满一周波 / 透传码值 / 自检异常 / 闭锁 / 越程
|
||||
* (逐字同 ui_page_ac.c 的 AC_Q_BAD——两处判据不可能漂移) */
|
||||
#define SB_Q_BAD (UI_DATA_Q_IV | UI_DATA_Q_NT | UI_DATA_Q_RAW | UI_DATA_Q_SB | \
|
||||
UI_DATA_Q_BL | UI_DATA_Q_OV)
|
||||
|
||||
#define SB_LINE_Y 132 /* 分隔线 y(高 1px) */
|
||||
#define SB_TIME_Y 140 /* 底部时钟放置 y(居中) */
|
||||
|
||||
/* 静态变量定义区 */
|
||||
|
||||
/* 通道名与占位数值(Flash;全 ASCII,无需中文字形) */
|
||||
static const char *const s_ch_name[SB_CH_COUNT] = { "Ib", "Ic", "Io", "Ia2", "Ib2", "Ic2" };
|
||||
static const char *const s_ch_value[SB_CH_COUNT] = { "0.00A", "0.00A", "0.00A", "0.00A", "0.00A", "0.00A" };
|
||||
/* 通道名表 + yc[] 语义下标映射(Flash;全 ASCII,无需中文字形)。
|
||||
* 下标 = adc_semantic_t 序(UA/UB/UC/UN/IA/IB/IC/IN/TEMP):跳过 UN(3)/IN(7)——
|
||||
* 用户点名显示六路(2026-11-13),且 UN 本台架永久无数据,摆一排恒 "--" 的假通道
|
||||
* 不如不摆(取舍逻辑同交流量页只显 Ua/U0/Ia,docs/UI设计/页面扩充详细方案.md §3.1.1) */
|
||||
static const char *const s_ch_name[SB_CH_COUNT] = { "UA", "UB", "UC", "IA", "IB", "IC" };
|
||||
static const uint8_t s_ch_yc[SB_CH_COUNT] = { 0u, 1u, 2u, 4u, 5u, 6u };
|
||||
|
||||
/* 帧缓存:发布序号变化才整帧拷一次(页面侧约定 = ui_data.h 头注 / UI_数据供给设计说明.md §5.4) */
|
||||
static ui_data_rt_t s_rt;
|
||||
static uint32_t s_seq;
|
||||
|
||||
static lv_obj_t *s_scr; /* 待机屏(init 时建、常驻不销毁) */
|
||||
static lv_obj_t *s_cont; /* 全屏容器(焦点/键入口 + 自绘载体,无子对象) */
|
||||
@@ -75,6 +97,85 @@ static bool sb_areas_intersect(const lv_area_t *a, const lv_area_t *b) {
|
||||
return (x1 <= x2 && y1 <= y2);
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:把常量值串安全搬进显示缓冲(替代 strcpy,规范 7.5;同 ui_page_ac.c 的 ac_put)
|
||||
* 入口参数:a_dst - 目标缓冲(SB_VAL_BUF_LEN) char *
|
||||
* a_lit - 源字面量(编译期串,长度由宏用 sizeof 算好) const char *
|
||||
* a_len - 需拷贝字节数(不含 NUL) uint32_t
|
||||
* 返回值:无
|
||||
* 限定条件:a_dst/a_lit 非 NULL;a_len 超缓冲时截断而不是越界
|
||||
*/
|
||||
static void sb_put(char *a_dst, const char *a_lit, uint32_t a_len) {
|
||||
if (a_len > (SB_VAL_BUF_LEN - 1u)) {
|
||||
a_len = SB_VAL_BUF_LEN - 1u;
|
||||
}
|
||||
(void)memcpy(a_dst, a_lit, a_len);
|
||||
a_dst[a_len] = (char)0;
|
||||
}
|
||||
|
||||
/* 值串落屏统一走这里:长度由 sizeof 在调用点算,改串不会漏改长度 */
|
||||
#define SB_PUT(a_dst, a_lit) sb_put((a_dst), (a_lit), (uint32_t)(sizeof(a_lit) - 1u))
|
||||
|
||||
/*
|
||||
* 函数功能:取用最新实时帧(只在发布序号变化时整帧拷)——读法同 ui_page_ac.c 的 ac_frame_ready
|
||||
* 入口参数:无
|
||||
* 返回值:1 - 有可用帧;0 - 首帧未到或本帧无效 uint8_t
|
||||
* 限定条件:UI 任务绘制上下文
|
||||
* 函数说明:读失败(首帧未到)时清缓存并记住本次序号,避免每次重绘重复尝试;下一帧序号
|
||||
* 必然变化 → 自动恢复。待机 1s 定时器整屏 invalidate 就是数值刷新节拍,不新增定时器
|
||||
*/
|
||||
static uint8_t sb_frame_ready(void) {
|
||||
uint32_t now = ui_data_rt_seq();
|
||||
|
||||
if (now != s_seq) {
|
||||
s_seq = now;
|
||||
if (ui_data_rt(&s_rt) != 0) {
|
||||
(void)memset(&s_rt, 0, sizeof(s_rt));
|
||||
return 0u;
|
||||
}
|
||||
}
|
||||
return (s_rt.valid != 0u) ? 1u : 0u;
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:拼一行值串(数字 + 单位,或 "--")
|
||||
* 入口参数:a_idx - 显示行下标 0..5 uint32_t
|
||||
* a_buf - 输出缓冲 char *
|
||||
* a_len - 缓冲容量(含 NUL) uint32_t
|
||||
* 返回值:无
|
||||
* 限定条件:UI 任务绘制上下文
|
||||
* 函数说明:口径同 ui_page_ac.c——无首帧或品质带 SB_Q_BAD 一律 "--"("有数但不可信"与
|
||||
* "没有数"同形);数字走共享定点格式化 ui_w_editor_fmt_scaled(3 位小数 =
|
||||
* 10^3 定点,负值钳 0 交给品质位解释),页面侧不引 %f 软浮点打印。单位随 eng:
|
||||
* 二次/一次值档 UA/UB/UC 挂 "V"、IA/IB/IC 挂 "A";ENG_PIN 档不挂单位——引脚档
|
||||
* 数字是 ADC 引脚电压而非端子电流量,挂单位就是替用户完成没做的换算(交流量页
|
||||
* 同档另设量纲口径行标注,待机屏无第 7 行可标,故数字照显、单位缺席)
|
||||
*/
|
||||
static void sb_value_str(uint32_t a_idx, char *a_buf, uint32_t a_len) {
|
||||
const ui_data_yc_t *p;
|
||||
uint32_t n;
|
||||
|
||||
if ((a_idx >= SB_CH_COUNT) || (sb_frame_ready() == 0u) ||
|
||||
(s_ch_yc[a_idx] >= (uint8_t)UI_DATA_YC_N)) {
|
||||
SB_PUT(a_buf, SB_INVALID);
|
||||
return;
|
||||
}
|
||||
p = &s_rt.yc[s_ch_yc[a_idx]];
|
||||
if ((p->qds & (uint8_t)SB_Q_BAD) != 0u) {
|
||||
SB_PUT(a_buf, SB_INVALID);
|
||||
return;
|
||||
}
|
||||
ui_w_editor_fmt_scaled((p->val > 0.0f) ? (int32_t)((p->val * 1000.0f) + 0.5f) : 0,
|
||||
SB_DECIMALS, a_buf, a_len);
|
||||
if (s_rt.eng != (uint8_t)UI_DATA_ENG_PIN) {
|
||||
n = (uint32_t)strlen(a_buf);
|
||||
if ((n + 1u) < a_len) {
|
||||
a_buf[n] = (a_idx < 3u) ? 'V' : 'A';
|
||||
a_buf[n + 1u] = (char)0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:绘制居中单行文本(底部时钟)
|
||||
* 入口参数:layer - 绘制层 lv_layer_t *
|
||||
@@ -100,11 +201,12 @@ static void sb_draw_centered_text(lv_layer_t *layer, const char *text, int32_t y
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:待机屏自绘(6 路电流值 + 分隔线 + 底部时钟;逐行 culling)
|
||||
* 函数功能:待机屏自绘(六路实时值 + 分隔线 + 底部时钟;逐行 culling)
|
||||
* 入口参数:e - 事件指针 lv_event_t *
|
||||
* 返回值:无
|
||||
* 限定条件:事件为 LV_EVENT_DRAW_MAIN,待机模块已初始化
|
||||
* 函数说明:1bpp 极性 white=暗墨——文本/分隔线均白色;数值 v1 占位 0.00A
|
||||
* 函数说明:1bpp 极性 white=暗墨——文本/分隔线均白色;数值逐行现拼(sb_value_str),
|
||||
* 待机 1s invalidate 即数值刷新节拍
|
||||
*/
|
||||
static void sb_draw_cb(lv_event_t *e) {
|
||||
lv_layer_t *layer = lv_event_get_layer(e);
|
||||
@@ -113,6 +215,7 @@ static void sb_draw_cb(lv_event_t *e) {
|
||||
int32_t row_y = SB_ROW_Y0 + (int32_t)i * SB_PITCH;
|
||||
lv_area_t strip;
|
||||
lv_draw_label_dsc_t ld;
|
||||
char vb[SB_VAL_BUF_LEN];
|
||||
|
||||
strip.x1 = 0;
|
||||
strip.x2 = UI_SCREEN_W - 1;
|
||||
@@ -142,8 +245,8 @@ static void sb_draw_cb(lv_event_t *e) {
|
||||
|
||||
lv_draw_label_dsc_init(&ld);
|
||||
ld.base.layer = layer;
|
||||
ld.text = s_ch_value[i];
|
||||
ld.text_static = 1;
|
||||
sb_value_str(i, vb, (uint32_t)sizeof(vb)); /* 栈缓冲同帧有效(同底部时钟 ts 模式) */
|
||||
ld.text = vb;
|
||||
ld.color = UI_COL_FG;
|
||||
ld.ofs_x = SB_VALUE_X;
|
||||
ld.ofs_y = 0;
|
||||
@@ -197,6 +300,10 @@ static void sb_enter(void) {
|
||||
if (s_active || s_scr == NULL) {
|
||||
return;
|
||||
}
|
||||
/* 进入即复位帧缓存(同交流量页 ac_init 开页复位理由:不沿用上次的陈旧帧号,
|
||||
* 强制下一次绘制重取最新帧) */
|
||||
s_seq = 0u;
|
||||
(void)memset(&s_rt, 0, sizeof(s_rt));
|
||||
s_prev_scr = lv_screen_active();
|
||||
g = lv_group_get_default();
|
||||
s_prev_focus = (g != NULL) ? lv_group_get_focused(g) : NULL;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/*
|
||||
* 模块名称:UI Standby (待机显示页)
|
||||
* 模块功能:长时间无按键操作时自动切入的默认界面(6 路电流值 + 分隔线 + 底部时钟);
|
||||
* 模块功能:长时间无按键操作时自动切入的默认界面(UA/UB/UC/IA/IB/IC 六路实时值 + 分隔线 + 底部时钟);
|
||||
* 数值经 ui_data 通道一实时帧 yc[](口径同 ui_page_ac.c);
|
||||
* 屏幕覆盖层模式——进入保存前屏与焦点、ENTER(确认键)还原,其余键忽略;
|
||||
* 空闲检测 = lv_timer(1s 周期),活动通知由菜单/内容页键事件挂钩
|
||||
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
|
||||
@@ -8,6 +9,7 @@
|
||||
* 创建日期:2026-09-14
|
||||
* 修改记录:
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.2)
|
||||
* v1.1 2026-11-13 DTU 项目组 6 路电流占位 → UA/UB/UC/IA/IB/IC 实时值(口径同 ui_page_ac.c)
|
||||
*/
|
||||
|
||||
#ifndef UI_STANDBY_H
|
||||
|
||||
@@ -47,10 +47,10 @@ dhara 失败类 +84;RO 另 +208,全是该失败类名表)→ `ER_IROM1`
|
||||
<!-- MEM_SNAPSHOT:BEGIN generated by scripts/check_mem_numbers.py -->
|
||||
| 区域 | 用量 | 容量 | 占比 |
|
||||
|---|---|---|---|
|
||||
| ER_IROM1 | 287,964 B (281.21 KB) | 1,048,576 B (1024 KB) | 27.5% |
|
||||
| RW_IRAM1 | 97,024 B (94.75 KB) | 131,072 B (128 KB) | 74.0% |
|
||||
| ER_IROM1 | 288,148 B (281.39 KB) | 1,048,576 B (1024 KB) | 27.5% |
|
||||
| RW_IRAM1 | 97,240 B (94.96 KB) | 131,072 B (128 KB) | 74.2% |
|
||||
| RW_CCM | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% |
|
||||
| **Flash (ROM 合计)** | **290,044 B (283.2 KB)** | 1,048,576 B (1024 KB) | **27.7%** |
|
||||
| **Flash (ROM 合计)** | **290,228 B (283.4 KB)** | 1,048,576 B (1024 KB) | **27.7%** |
|
||||
<!-- MEM_SNAPSHOT:END -->
|
||||
|
||||
各区的容量与常量来源:
|
||||
|
||||
@@ -15,16 +15,16 @@
|
||||
<!-- MEM_BUDGET:BEGIN generated by scripts/ram_baseline.py -->
|
||||
| 区域 | 用量 | 容量 | 占比 | 门禁(≤92%) |
|
||||
|---|---|---|---|---|
|
||||
| ER_IROM1 (Flash) | 287,964 B | 1,048,576 B | 27.5% | 参考 |
|
||||
| ER_IROM1 (Flash) | 288,148 B | 1,048,576 B | 27.5% | 参考 |
|
||||
| RW_CCM | 57,376 B | 65,280 B | 87.9% | PASS |
|
||||
| UNINIT_CCM | 48 B | 256 B | 18.8% | 参考 |
|
||||
| RW_IRAM1 | 97,024 B | 131,072 B | 74.0% | PASS |
|
||||
| RW_IRAM1 | 97,240 B | 131,072 B | 74.2% | PASS |
|
||||
|
||||
| 子系统(静态 RW+ZI;除 RTOS 堆在 CCM 外均在 SRAM1) | 现值 | 配额 | 状态 |
|
||||
|---|---|---|---|
|
||||
| 网络 | 13,958 B | 12 KB | ⚠ 超 1.6 KB |
|
||||
| 存储 | 9,144 B | 12 KB | OK |
|
||||
| UI | 36,511 B | 16 KB | ⚠ 超 19.7 KB |
|
||||
| UI | 36,723 B | 16 KB | ⚠ 超 19.9 KB |
|
||||
| RTOS 堆 | 57,376 B | 56 KB | 堆=配额 |
|
||||
| 应用 | 26,609 B | 8 KB | ⚠ 超 18.0 KB |
|
||||
| 其它 | 10,792 B | — | 参考 |
|
||||
|
||||
+17
-11
@@ -1,7 +1,7 @@
|
||||
# 运行/自检记录与待机显示设计说明
|
||||
|
||||
> **版本**:v1.3(§4.4 新增"卷锁 fail-open 边沿补投自检记录"一条,道G task-40;v1.2 为 §4.3 随七类记录更新,v1.1 的原始设计口径不变)
|
||||
> **日期**:2026-09-14(v1.2 更新 2026-10-26)
|
||||
> **版本**:v1.4(2026-11-13:§5.2 待机屏从 6 路占位电流改为 UA/UB/UC/IA/IB/IC 六路实时值,§1 R2 按新口径改写、不再引 mockup,§9 对应开放问题销项删行;v1.3 为 §4.4 新增"卷锁 fail-open 边沿补投自检记录"一条,道G task-40;v1.2 为 §4.3 随七类记录更新,v1.1 的原始设计口径不变)
|
||||
> **日期**:2026-09-14(v1.2 更新 2026-10-26,v1.4 更新 2026-11-13)
|
||||
> **状态**:步骤 1–9 全部完成——双端构建 0/0、`--logtest` PASS、ui-verify 五门禁全绿;真机 /serial-boot-test 待上电回归(§8.2)
|
||||
> **关联文档**:`项目架构总览.md` · `STM32F4-Base存储架构说明.md` · `系统墙钟时间维护说明.md` · `UI设计/内容页架构.md`(如存在)· `docs/UI设计/mockups/`(待机显示页面.jpg / 运行记录页.jpg / 自检记录页.jpg / 密码页面实际机器的示例图片.jpg)
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
| # | 需求 | 说明 |
|
||||
|---|------|------|
|
||||
| R1 | 密码错误提示 | 用户密钥页输错密码时提示"密码输入错误",并允许重新输入(现状:仅清空重输、无提示) |
|
||||
| R2 | 待机显示页 | 长时间无操作时默认显示的界面(参考 `mockups/待机显示页面.jpg`:6 路电流值 + 底部时钟);**只有按确认键才进入菜单** |
|
||||
| R2 | 待机显示页 | 长时间无操作时默认显示的界面:UA/UB/UC/IA/IB/IC 六路电量的实时值 + 底部时钟;**只有按确认键才进入菜单** |
|
||||
| R3 | 运行记录页 | 记录装置上电时间、重启时间(参考 `mockups/运行记录页.jpg`:标题 + 逐条"时间戳 + 事件" + 页脚分页) |
|
||||
| R4 | 自检记录页 | 记录开机自检结果,有问题才记录(参考 `mockups/自检记录页.jpg`) |
|
||||
| R5 | FTP 可读存储 | 记录以**纯文本文件**落盘,FTP(根目录 = FatFS 卷根)可直接下载读取 |
|
||||
@@ -225,19 +225,26 @@ int syslog_get_record(syslog_id_t id, uint32_t idx, char *ts, size_t ts_len
|
||||
- 空闲检测 = `lv_timer`(1s 周期,MCU/模拟器均经 `lv_timer_handler` 驱动,无 OS 依赖);
|
||||
- 活动通知挂钩:`menu_key_cb`、`cp_key_cb` 每收到一个键调 `ui_standby_notify_activity()`(重置计时)。
|
||||
|
||||
**待机屏内容**(参考 mockup,全 ASCII 无需新字体字):
|
||||
**待机屏内容**(v1.1 起显示实时值,2026-11-13;全 ASCII 无需新字体字):
|
||||
|
||||
```
|
||||
Ib = 0.00A ← 6 行电流值(v1 占位 0.00A,与 AC/DC 页现状一致;
|
||||
Ic = 0.00A 待交流量标定管线落地后接 TPAFE5160 实时值)
|
||||
Io = 0.00A
|
||||
Ia2 = 0.00A
|
||||
Ib2 = 0.00A
|
||||
Ic2 = 0.00A
|
||||
UA = 0.341 ← 6 行实时值 = ui_data 通道一 yc[](下标 = adc_semantic_t 语义序:
|
||||
UB = 0.338 UA/UB/UC = 0..2,IA/IB/IC = 4..6;UN/IN 不在待机屏——用户点名
|
||||
UC = 0.339 六路,且 UN 本台架永久无数据,摆一排假通道不如不摆)
|
||||
IA = 0.021 ← 示例为现状 ENG_PIN 引脚电压档:数字照显、不挂单位(挂单位 =
|
||||
IB = 0.020 替用户完成没做的标定换算,同交流量页引脚档不造第二口径)
|
||||
IC = 0.021 ← 升二次/一次值档后单位随 eng:UA/UB/UC 挂 V、IA/IB/IC 挂 A
|
||||
────────────────────── ← 分隔线(y≈132)
|
||||
YYYY-MM-DD HH:MM:SS ← 底部实时时钟(每秒重绘,lv_timer 驱动 invalidate)
|
||||
```
|
||||
|
||||
- 空值/坏质口径与格式化的唯一真源 = 交流量页(`ui_page_ac.c`):无首帧或品质带
|
||||
`IV|NT|RAW|SB|BL|OV` → `--`;3 位小数定点格式化复用 `ui_w_editor_fmt_scaled`(不引 %f)。
|
||||
- 帧读取按 `ui_data_rt_seq()` 门控整帧拷(`ui_data.h` 头注);待机 1s 定时器整屏
|
||||
invalidate 即数值刷新节拍,未新增定时器。模拟器 `main.c` 自带固定仿真 rt 帧:待机截图
|
||||
(`--standby`)即双分支实证——UA/IA 显引脚档数字(0.812 / 0.046,不挂单位)、
|
||||
UB/UC/IB/IC 带 `Q_IV|Q_OV` 坏质显 `--`。
|
||||
|
||||
**键语义(用户定案)**:待机屏上**只有 ENTER(确认键)进入菜单**;其余按键忽略(同时重置空闲计时)。
|
||||
- 实现为**屏幕覆盖层**:进入时保存当前活动屏 + 组内焦点对象,加载待机屏并聚焦其容器;ENTER 时还原前屏与焦点。
|
||||
- 内容页打开期间超时 → 同样切待机(页面对象保留在底层,ENTER 返回后原样恢复,编辑态不丢)。
|
||||
@@ -324,7 +331,6 @@ Forbidden:`FAIL`/`ERROR`/`HardFault`。
|
||||
| O1 | 断电 <10min 的"上电/重启"歧义 | §5.3 阈值折中,文档声明;如需精确可后续加掉电标志(PVD) |
|
||||
| O2 | 故障"已复归"/持续监测(mockup 语义) | v2:周期自检 + 活动故障状态机 + 恢复记录 |
|
||||
| O3 | ~~"清除记录"菜单项~~ **已实施(2026-10-26 道F task-4)** | 数据面 = `syslog_request_clear(id)` + `syslog_clear_state(id)`,落地在 defaultTask(唯一写者)的 `syslog_drain()` 尾部;UI 侧页面归记录/维护页批次。细口径见 `App/log/README.md` |
|
||||
| O4 | 待机页电流值接实时数据 | 待交流量标定管线(AC 页占位数据替换)落地后接入 `tpafe5160_snapshot()`(原子快照;旧 `tpafe5160_get_buf()` 已于 2026-10-10 删除,见 `AGENTS.md`) |
|
||||
| — | FAT32 小追加簇开销 | §3 调研结论:写频率极低可接受;容量上限约束增长 |
|
||||
| — | UI 读与落盘并发 | 只读既有内容 + EOF 追加 + FatFS 系统锁,无互斥需求(§4.4) |
|
||||
|
||||
|
||||
@@ -21,4 +21,4 @@ date code ro rw zi er_irom1 er_pct iram1 iram1_pct ccm ccm_pct top_rwzi
|
||||
2026-11-09 255160 31204 2080 152152 286364 27.3 96808 73.9 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;nand_ftl.o=8288;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132
|
||||
2026-11-10 255160 31204 2080 152152 286364 27.3 96808 73.9 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;nand_ftl.o=8288;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132
|
||||
2026-11-11 256024 31760 2080 152368 287784 27.4 97024 74.0 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;nand_ftl.o=8288;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;wave_ring.o=5332;sb_link.o=4376;ch395f.o=4162;console_log.o=4132
|
||||
2026-11-13 256200 31764 2080 152368 287964 27.5 97024 74.0 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;nand_ftl.o=8288;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;wave_ring.o=5332;sb_link.o=4376;ch395f.o=4162;console_log.o=4132
|
||||
2026-11-13 256428 31720 2080 152584 288148 27.5 97240 74.2 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;nand_ftl.o=8288;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;wave_ring.o=5332;sb_link.o=4376;ch395f.o=4162;console_log.o=4132
|
||||
|
||||
|
@@ -1,25 +1,25 @@
|
||||
{
|
||||
"built_at": "2026-11-13T11:25:00+08:00",
|
||||
"fingerprint": "39f4f69a673f97c33cc59b301e723ec8f1e03686f4556ac6abb1a5a6cd438796",
|
||||
"built_at": "2026-11-13T13:11:29+08:00",
|
||||
"fingerprint": "eb152c8e20a33b63da91fd3b5e32877b83b581c43d0c4956375ed13b6531db3f",
|
||||
"fingerprint_files": 1479,
|
||||
"fingerprint_source": "git-index",
|
||||
"gated_regions": [
|
||||
"RW_IRAM1",
|
||||
"RW_CCM"
|
||||
],
|
||||
"git_head": "7c505b2457d977adf7750abbb841b0453fd6bfb9",
|
||||
"git_head": "40a2816a9971928d1ca6fa218921b86dae79bd63",
|
||||
"map": "MDK-ARM/STM32F407-Demo/STM32F407-Demo.map",
|
||||
"map_mtime": 1794540294,
|
||||
"map_mtime": 1794542035,
|
||||
"pct": {
|
||||
"ER_IROM1": 27.46,
|
||||
"ER_IROM1": 27.48,
|
||||
"RW_CCM": 87.89,
|
||||
"RW_IRAM1": 74.02,
|
||||
"RW_IRAM1": 74.19,
|
||||
"UNINIT_CCM": 18.75
|
||||
},
|
||||
"regions": {
|
||||
"ER_IROM1": {
|
||||
"max": 1048576,
|
||||
"size": 287964
|
||||
"size": 288148
|
||||
},
|
||||
"RW_CCM": {
|
||||
"max": 65280,
|
||||
@@ -27,7 +27,7 @@
|
||||
},
|
||||
"RW_IRAM1": {
|
||||
"max": 131072,
|
||||
"size": 97024
|
||||
"size": 97240
|
||||
},
|
||||
"UNINIT_CCM": {
|
||||
"max": 256,
|
||||
@@ -37,10 +37,10 @@
|
||||
"schema": 2,
|
||||
"scope_note": "\u540c\u7801\u51ed\u8bc1\uff1a\u6307\u7eb9\u8986\u76d6\u56fa\u4ef6\u4f53\u79ef\u76f8\u5173\u6e90\u7801\uff0c\u53e3\u5f84\u89c1\u672c\u811a\u672c docstring",
|
||||
"sizes": {
|
||||
"code": 256200,
|
||||
"ro_data": 31764,
|
||||
"code": 256428,
|
||||
"ro_data": 31720,
|
||||
"rw_data": 2080,
|
||||
"zi_data": 152368
|
||||
"zi_data": 152584
|
||||
},
|
||||
"threshold_pct": 92.0,
|
||||
"worktree_dirt_at_stamp": 0,
|
||||
|
||||
Reference in New Issue
Block a user