feat(UI/采集/104): 通讯设置页 + 开机账本 + adc_cal 可诊断化——三车道同树一次构建入库
三条道在同一棵树上交付,故合并成**一次权威构建**(@build 0 错 0 警,Code=235236 RO=26308 RW=1572
ZI=136924)后同笔入库;台账已按该构建回填(`ram_baseline.py --update` + `--write`、`chec
k_mem_numbers.py
--write`),凭证与实际 .map 同源。归属如下:
· **通讯设置页**(道G task-9):新增 `Drivers/BSP/UI/ui_page_comm.{c,h}`(通道六注入,与死
区页同骨架同纪
律),`#page=comm` 绑定使 bound **21 → 22**、内容页黄金 **47 → 53**(旧 47 页字节零变化,
新增六态含
WAIT/OK 两张);`iec104_comm` 脏位 + store_save(**无事件位**)挂 defaultTask 同点位
轮询;`port_104` 由
宏改走 getter、`IEC104_SERV_PORT` 删除;字体 +听/监(185 字全覆)。**实机链已闭环**:FTP 外改
[comm]
的 ca/port → 复位 → 串口出现 `section 'comm' (2 keys)` 与 `i104: listening o
n 9004` → 还原 2404,全程无
FAIL ⇒「重启即生效 + 端口真值」不是推断是实测。上限核对 6/8 段、2/16 键,超限现象由 TC-CONFIG-056/057
钉死(注册 -1 + `comm init: FAIL` 锚 + getter 回 ROM),**不抬宏**。
· **开机账本**(道F task-12):新增 `App/util/boot_stats.{c,h}`——上电次数落 SD2506 用户
SRAM(magic +
小端计数 + 版本 + 异或校验),一次上电 = 1 读 + ≤1 写,**零 NAND、零卷锁、零配置段**;四态互斥
UNKNOWN / FRESH / CONTINUED / RESTARTED(BLF=1 才算电池域掉过电),**读失败绝不回写**;
文案口径「自 RTC
电池周期起」,**禁写终身次数**。复位原因优先级链从 `app_main.c` 的 if-else 收进一份真源(串口与屏幕同
源);104 四个只增不清计数 + `iec104_serv_get_stats()` 留在 serv、未塞进 link(会被 open
/close 洗掉)。
运行时长按用户裁定 = **只报本次开机以来**,零新增代码。新套件 `test/host/boot_stats` 21/21,五处注入
**全部有牙**(含「漂一字节被校验和挡下而不是报 256 倍错账」)。
· **adc_cal 可诊断化**(道E task-43):三个 volatile 计数 + `adc_cal_get_stats()`
/ `adc_cal_note_persisted()`
(水位**盖写非自增**,因为一次 save 覆盖整档,数 save 会留假未落盘);「差额 × 脏位」三态语义唯一落在
`adc_cal.h`,其中「差额 > 0 且脏位恒 0」= 绕过语义 setter 的静默丢失;TC-ADCCAL-019~023。
三条**必须留档的自纠**(都是执行道自己报的,我不替他们润色):
① stdint 那条断链是**宿主套件抓到、通讯道先修**,采集道承认自己是重复添加者并删掉自己那份;
② 「exit 2 不是证据,断言变红才是」——采集道第一版反证注入了未声明标识符导致编译错,差点当成功;
③ 套件汇总行原写 `s_total/s_total`,失败时会打印「21/21 PASSED (failed=1)」这种自相矛盾的行,已改。
另修:`check_registration.py` 的 `SIM_EXEMPT` 加一行豁免 `App/util/boot_stats.c
`(依赖 I2C 与 RCC 位掩码,
MCU 专属;核过 `sys_clock.c`/`sha256.c` 同形态先例),注册反向校验 exit 1 → 0。发号 TC-IEC1
04-034、
TC-UIDATA-029 已实抬游标(`TC-IEC104-033→034`、`TC-UIDATA-026→029`)。
门禁:id-check --strict 与 plain 均 rc=0、doc-links --all rc=0、注册校验 0、cppche
ck / coding-standard /
bom-drift 0;iec104 179/179、ui_data 295/295、boot_stats 21/21、adc_cal 11
7/117、run_par 67/67;菜单 8 状态
池 5368 不变、内容页 53/53。**已知遗留**:内容页数 47 → 53 的全仓文本同步尚未做(另卡跟踪),本笔只保
证代码与黄金一致;面板注键真机那一腿缺 CLI,交台架道补。
This commit is contained in:
+90
-1
@@ -291,6 +291,15 @@ static float s_yt_k[UI_DATA_YT_CH_N] = {
|
||||
static uint8_t s_yt_dirty; /* 镜像 run_par 的整档脏位(页面上 WAIT 的唯一来源) */
|
||||
static int s_yt_nopump; /* --yt-nopump:拍 WAIT 态黄金专用(截图前不清脏) */
|
||||
|
||||
/* 道G task-9 通讯参数假件:镜像 App/protocol/iec104/iec104_comm.c 的 RAM 副本
|
||||
* 与脏位。模拟器不链 iec104_comm.c(与 run_par 假件同一条理由,见上方镜像
|
||||
* 纪律注):值与合法带是镜像,初值 = IEC104_COMM_DEF_CA/_PORT,变更纪律同
|
||||
* s_yt_* 三件套 */
|
||||
static uint32_t s_comm_ca = 1u; /* 镜像 [comm] ca(工厂默认 1) */
|
||||
static uint32_t s_comm_port = 2404u; /* 镜像 [comm] port(工厂默认 2404) */
|
||||
static uint8_t s_comm_dirty; /* 镜像 iec104_comm 脏位 */
|
||||
static int s_comm_nopump; /* --comm-nopump:拍通讯页 WAIT 态黄金专用 */
|
||||
|
||||
/* 死区粗守上限(工程量):镜像 RUN_PAR_DB_MAX_U/I/F 三档;分档与 feed 的 unit
|
||||
* 分档必须同序(同一条对表纪律) */
|
||||
/* 函数功能:假死区粗守上限(工程量档,镜像 RUN_PAR_DB_MAX_U/I/F) 返回值:上限 float */
|
||||
@@ -404,6 +413,75 @@ static void sim_yt_pump(void) {
|
||||
}
|
||||
s_yt_dirty = 0u;
|
||||
}
|
||||
|
||||
/* ── 道G task-9:通讯参数假件(通道六的注入侧镜像) ────────────────────── */
|
||||
|
||||
/*
|
||||
* 函数功能:假 [comm] 读行(值 + 合法带;带 = iec104_comm.h 带宏的镜像)
|
||||
* 入口参数:a_idx - UI_DATA_COMM_ROW_CA/_PORT uint8_t
|
||||
* a_out - 行现状 ui_data_comm_row_t *
|
||||
* 返回值:0 - 已整份写出;-1 - idx 越界 int
|
||||
*/
|
||||
static int sim_comm_row(uint8_t a_idx, ui_data_comm_row_t *a_out) {
|
||||
if (a_idx == UI_DATA_COMM_ROW_CA) {
|
||||
a_out->val = s_comm_ca;
|
||||
a_out->lo = 1u;
|
||||
a_out->hi = 65535u;
|
||||
return 0;
|
||||
}
|
||||
if (a_idx == UI_DATA_COMM_ROW_PORT) {
|
||||
a_out->val = s_comm_port;
|
||||
a_out->lo = 1024u;
|
||||
a_out->hi = 65535u;
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:假 [comm] 写行(带外拒、带内落副本并置脏——与真 setter 同形)
|
||||
* 返回值:0 - 已写并置脏;-1 - 越界或带外拒 int
|
||||
*/
|
||||
static int sim_comm_set(uint8_t a_idx, uint32_t a_val) {
|
||||
ui_data_comm_row_t r;
|
||||
|
||||
if (sim_comm_row(a_idx, &r) != 0) {
|
||||
return -1;
|
||||
}
|
||||
if ((a_val < r.lo) || (a_val > r.hi)) {
|
||||
return -1;
|
||||
}
|
||||
if (a_idx == UI_DATA_COMM_ROW_CA) {
|
||||
s_comm_ca = a_val;
|
||||
} else {
|
||||
s_comm_port = a_val;
|
||||
}
|
||||
s_comm_dirty = 1u;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* 函数功能:假 [comm] 落盘脏位 返回值:1 有未落盘;0 干净 uint8_t */
|
||||
static uint8_t sim_comm_pending(void) {
|
||||
return s_comm_dirty;
|
||||
}
|
||||
|
||||
static const ui_data_comm_ops_t s_comm_ops = {
|
||||
sim_comm_row,
|
||||
sim_comm_set,
|
||||
sim_comm_pending
|
||||
};
|
||||
|
||||
/*
|
||||
* 函数功能:假 [comm] 落盘 pump(镜像 defaultTask 每轮无条件
|
||||
* iec104_comm_store_save;模拟器无失败面,pump 即落盘)
|
||||
* 限定条件:与 sim_yt_pump 同两个调用点;--comm-nopump 时停转拍 WAIT
|
||||
*/
|
||||
static void sim_comm_pump(void) {
|
||||
if (s_comm_nopump != 0) {
|
||||
return;
|
||||
}
|
||||
s_comm_dirty = 0u;
|
||||
}
|
||||
/*
|
||||
* 函数功能:SOE 记录假源——固定 3 条(镜像 App/task/ui_task.c 真机绑定的形态)
|
||||
* 入口参数:无
|
||||
@@ -584,7 +662,7 @@ static void sim_publish_data_frames(void) {
|
||||
(void)memset(&info, 0, sizeof(info));
|
||||
info.valid = 1u;
|
||||
info.uptime_s = 0u;
|
||||
info.port_104 = 2404u; /* App/task/iec104_serv.h 的 IEC104_SERV_PORT */
|
||||
info.port_104 = (uint16_t)s_comm_port; /* 镜像 [comm] getter(真机 feed 同款:宏出口已删,道G task-9) */
|
||||
info.port_disp = (uint16_t)UI_NET_SINK_PORT; /* 同源常量(BSP 头,模拟器可见) */
|
||||
(void)snprintf(info.model, sizeof(info.model), "%s", "F30");
|
||||
(void)snprintf(info.sw_ver, sizeof(info.sw_ver), "%s", "SV0.010");
|
||||
@@ -725,6 +803,9 @@ static int run_headless(const char * keys, const char * path, int standby) {
|
||||
if (ui_data_yt_bind(&s_yt_ops) != 0) {
|
||||
printf("[sim] UI yt bind: FAIL\n");
|
||||
}
|
||||
if (ui_data_comm_bind(&s_comm_ops) != 0) { /* 道G task-9 通讯参数假表(两处同文 replace_all) */
|
||||
printf("[sim] UI comm bind: FAIL\n");
|
||||
}
|
||||
/* task-14 数据快照:镜像 ui_task.c 的 ui_data_init + 首帧发布(先于建页,
|
||||
* 页面任何时刻打开都拿得到帧,不必等装配节拍) */
|
||||
sim_publish_data_frames();
|
||||
@@ -759,6 +840,7 @@ static int run_headless(const char * keys, const char * path, int standby) {
|
||||
* OK/ERR/LOCK 三条判据的像素证据也就全都不成立) */
|
||||
sim_param_pump();
|
||||
sim_yt_pump(); /* 道F task-7:截图前清脏 = 拍 OK 黄金;--yt-nopump 停转 = 拍 WAIT 黄金(Lead 裁定④:两态都要有像素证据) */
|
||||
sim_comm_pump(); /* 道G task-9:通讯页同款两态;--comm-nopump 停转拍 WAIT */
|
||||
|
||||
/* --standby:注键后强制进入待机屏(截图前) */
|
||||
if (standby != 0) {
|
||||
@@ -1154,6 +1236,9 @@ int main(int argc, char **argv) {
|
||||
if (strcmp(argv[i], "--yt-nopump") == 0) {
|
||||
s_yt_nopump = 1; /* 落盘 pump 停转:拍"已受理未落盘"(WAIT)黄金专用 */
|
||||
}
|
||||
if (strcmp(argv[i], "--comm-nopump") == 0) {
|
||||
s_comm_nopump = 1; /* 道G task-9:通讯页 WAIT 态黄金专用(同款语义独立开关) */
|
||||
}
|
||||
}
|
||||
|
||||
/* 截图/自检模式:--screenshot / --keys / --standby / --cfgtest / --logtest */
|
||||
@@ -1228,6 +1313,9 @@ int main(int argc, char **argv) {
|
||||
if (ui_data_yt_bind(&s_yt_ops) != 0) {
|
||||
printf("[sim] UI yt bind: FAIL\n");
|
||||
}
|
||||
if (ui_data_comm_bind(&s_comm_ops) != 0) { /* 道G task-9 通讯参数假表(两处同文 replace_all) */
|
||||
printf("[sim] UI comm bind: FAIL\n");
|
||||
}
|
||||
/* task-14 数据快照:镜像 ui_task.c 的 ui_data_init + 首帧发布(先于建页,
|
||||
* 页面任何时刻打开都拿得到帧,不必等装配节拍) */
|
||||
sim_publish_data_frames();
|
||||
@@ -1277,6 +1365,7 @@ int main(int argc, char **argv) {
|
||||
* 出队 → prot_set 落值 → 重发参数帧);队列空时只是一次计数判断 */
|
||||
sim_param_pump();
|
||||
sim_yt_pump(); /* 道F task-7:窗口模式同样每轮无条件清脏(真机 50 ms 落盘的镜像) */
|
||||
sim_comm_pump(); /* 道G task-9:通讯页脏位同款镜像 */
|
||||
|
||||
/* 配置文件轮询(2s 周期:外部文件变更 4s 沉降后自动重载) */
|
||||
uint32_t now_ms = (uint32_t)SDL_GetTicks();
|
||||
|
||||
Reference in New Issue
Block a user