UI 其余五个实时页接入框架自动失效(按内容变化节拍分档取值)
- 描述符各加一行(机制 task-2 已建,本轮零框架代码改动):dc 300ms(电气量与 ac 同账);yx 500ms(遥信变位按 1s 内上屏到位,比 300 档少 40% 稳态重绘); clock 1000ms(快变项只有墙钟秒尾);device_info / runreport 1000ms 并把新鲜度 源换到通道二 .auto_seq = ui_data_info_seq(info 与 rt 同拍 200ms 发布) ——各页取值账目在该页描述符注释 - docs/UI设计:供给说明 §5.5 改六页全接终态(用户裁定 2026-11-13);内容页架构 字段表/内存表/变更记录同步;自动化测试流程补 rtlive 覆盖行;页面扩充方案 追加 74 张现势注(带日期史实行冻结不动) - .dsh/skills/lvgl-simulator:开关表加 --rtlive 行、黄金参考计数 66→74 同步 验证:模拟器 0错0警;菜单 8 状态 + 内容页 74 张 + rtlive PASS(lead 独立复跑 RC=0,池水位 5368/5448B 均不漂移——timer 开页创建关页销毁、分配归还); Keil 0错0警且 Code/RO/RW/ZI 与 task-2 基线逐字节一致(只改常量值);BOM 全补回。
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: lvgl-simulator
|
||||
description: LVGL PC 模拟器构建/运行/自检入口:build_sim.bat 自动探测本机 VS、lvgl_sim.exe 无头截图与自检开关(--screenshot/--keys/--standby/--cfgtest/--logtest/--idle)、三套回归脚本、两份 lv_conf.h 同步门禁、构建报错速查(SDL2/lv_conf 找不到、全黑、键盘无响应)。
|
||||
description: LVGL PC 模拟器构建/运行/自检入口:build_sim.bat 自动探测本机 VS、lvgl_sim.exe 无头截图与自检开关(--screenshot/--keys/--standby/--cfgtest/--logtest/--idle/--rtlive)、三套回归脚本、两份 lv_conf.h 同步门禁、构建报错速查(SDL2/lv_conf 找不到、全黑、键盘无响应)。
|
||||
whenToUse: 需要构建或运行模拟器、无头截图出图、跑模拟器自检或 UI 回归、修改 simulator/ 目录代码或 simulator/lv_conf.h、排查模拟器构建/运行异常时。UI 改动后的完整回归走 ui-verify skill。
|
||||
---
|
||||
|
||||
@@ -28,12 +28,13 @@ PC 上编译运行与 MCU **同一份** UI 源码(CMake + MSVC + SDL2,x64,
|
||||
| `lvgl_sim.exe --standby shot.bin` | 待机页截图 |
|
||||
| `lvgl_sim.exe --cfgtest` | 配置引擎闭环:加载→轮询→外部改文件重载→外科式保存回验。临时用当前 CWD 的 `sim_config.ini`,**跑完无论成败一律删除**(旧行为连 PASS 路径也会留一份 4000 B 伪造档 → 之后每次运行都被加载 → 引擎按设计拒写超长文档 → 网口设置页保存行变 `ERR`,把像素回归带偏) |
|
||||
| `lvgl_sim.exe --logtest` | syslog 后端闭环(定长记录/时间戳/轮转) |
|
||||
| `lvgl_sim.exe --rtlive "dee" a.bin b.bin` | 框架自动失效实证:开交流量页截 A → 发布 1 帧确定性斜坡值 → 直接调 `ui_content_page_auto_poll()` → 截 B;退出码 0 且 A≠B = PASS(零按键新帧落屏;无头黄金参考从不走此路径——无头不跑 `lv_timer_handler`) |
|
||||
|
||||
⚠ **模拟器按当前工作目录读写 `sim_config.ini`**:目录里残留一份配置就会改变页面内容。`simulator/tests/` 两套回归因此一律在**空临时目录**里跑(`cwd=tmp`);手工跑 `--keys`/`--screenshot` 做对比时,也要先确认当前目录没有 `sim_config.ini`,否则"复现不了别人的 FAIL"。
|
||||
|
||||
## UI 改动回归 → 用 `ui-verify` skill(勿在此零散手跑)
|
||||
|
||||
5 步门禁 = 构建 → `check_menu_rows.py`(菜单 8 状态像素 + 池基线)→ `check_content_pages.py`(文本断言 + 66 张黄金参考 + 往返池)→ `/keil-build` → `coding-standard`。
|
||||
5 步门禁 = 构建 → `check_menu_rows.py`(菜单 8 状态像素 + 池基线)→ `check_content_pages.py`(文本断言 + 74 张黄金参考 + 往返池 + rtlive)→ `/keil-build` → `coding-standard`。
|
||||
RemoDispBus 推流回归单独跑:`.venv\Scripts\python.exe simulator/tests/check_remo_sink.py`。
|
||||
黄金参考 `tests/ref/*.bin` **随仓库入库**(`.gitignore` 在全仓 *.bin 兜底之后又显式反选,2026-10-22 起;缺基准 = 新克隆跑 `ui-golden` 必 FAIL):不入库的只是派生目检图 `ref/*.png`,换机后先 `check_content_pages.py --update` 生成,再 `regen_ref_png.py` 出目检 PNG。
|
||||
|
||||
|
||||
@@ -385,4 +385,11 @@ const content_page_def_t ui_page_clock_desc = {
|
||||
.refresh = pg_refresh,
|
||||
.draw_cb = pg_draw,
|
||||
.key_cb = pg_key,
|
||||
/* 自动失效轮询(机制见 ui_content_page.h 的 auto_ms 注;口径见供给说明 §5.5):
|
||||
* 本页快变项只有墙钟秒尾——rt 帧 200ms 一发,但秒每 1s 才变,轮询快于 1s
|
||||
* 只会把同一秒多画几遍(seq 随帧走,每拍都触发整页重绘)。取 1000ms:
|
||||
* 1000 = 5 × 发布节拍 = 50 × LVGL 整刷周期 20ms;最坏屏上滞后 200 + 1000 =
|
||||
* 1200ms,屏显是墙钟字符串(非自走计数),迟到的是展示不是时刻,不累积漂移。
|
||||
* 编辑态无碍:失效只按当前叠层状态重绘,不动编辑数据 */
|
||||
.auto_ms = 1000u,
|
||||
};
|
||||
|
||||
@@ -149,4 +149,9 @@ const content_page_def_t ui_page_dc_desc = {
|
||||
.rows = NULL,
|
||||
.init_cb = dc_init,
|
||||
.refresh = dc_refresh,
|
||||
/* 自动失效轮询(框架级机制见 ui_content_page.h 的 auto_ms 注;口径见供给说明 §5.5):
|
||||
* 直流/站温/温度行随 rt 帧每 200ms 推进,可见内容与电气量同拍——周期账目与
|
||||
* ac 页同构(300 = 15 × LVGL 整刷周期 20ms,最坏屏上滞后 200 + 300 = 500ms),
|
||||
* 四点账全文在 ui_page_ac.c 的 AC_AUTO_MS 注释,此处不复述 */
|
||||
.auto_ms = 300u,
|
||||
};
|
||||
|
||||
@@ -259,4 +259,13 @@ const content_page_def_t ui_page_device_info_desc = {
|
||||
.fixed_total_pages = 1u,
|
||||
.init_cb = di_init,
|
||||
.refresh = di_refresh,
|
||||
/* 自动失效轮询——通道二(新鲜度源换 info_seq;机制见 ui_content_page.h 的
|
||||
* auto_ms/auto_seq 注,口径见供给说明 §5.5):info 与 rt 同拍发布(每 200ms
|
||||
* 两帧连发,见 App/app/ui_data_feed.c 的 ui_data_feed_tick;App 侧节拍值,
|
||||
* 本文件不 include App 头,口径引用文档);本页可见内容近静态(型号/版本/
|
||||
* 身份),只有 IP、端口等网络事件级变化——取 1000ms 大档:事件上屏最坏
|
||||
* 200 + 1000 = 1200ms,对配置生效核对足够;seq 恒随帧走,周期即稳态重绘频率,
|
||||
* 近静态页没必要快 */
|
||||
.auto_ms = 1000u,
|
||||
.auto_seq = ui_data_info_seq,
|
||||
};
|
||||
|
||||
@@ -276,4 +276,11 @@ const content_page_def_t ui_page_runreport_desc = {
|
||||
.count_cb = rr_count,
|
||||
.init_cb = rr_init,
|
||||
.refresh = rr_refresh,
|
||||
/* 自动失效轮询——通道二(.auto_seq = ui_data_info_seq;机制见 ui_content_page.h
|
||||
* 的 auto_ms/auto_seq 注,口径见供给说明 §5.5):本页是上电计数、复位原因、
|
||||
* 104 观测计数与记录条数的汇总,活跃链路(104 轮询、记录追加)下计数秒级
|
||||
* 走动,1000ms 档既让读数"看起来在活",又不在稳态多刷(seq 恒随 info 帧
|
||||
* 前进,周期即重绘频率;info 与 rt 同拍 200ms,见供给说明 §5.2) */
|
||||
.auto_ms = 1000u,
|
||||
.auto_seq = ui_data_info_seq,
|
||||
};
|
||||
|
||||
@@ -202,4 +202,10 @@ const content_page_def_t ui_page_yx_desc = {
|
||||
.init_cb = pg_init,
|
||||
.count_cb = pg_count,
|
||||
.refresh = pg_refresh,
|
||||
/* 自动失效轮询(机制见 ui_content_page.h 的 auto_ms 注;口径见供给说明 §5.5):
|
||||
* 遥信变位是低频事件,屏上可见变化只在 rt 帧(200ms 拍)落地时发生;seq 恒
|
||||
* 随帧前进,所以轮询周期就是稳态整页重绘频率——取 500ms 的账:变位"1s 内
|
||||
* 上屏"够用(最坏 200 + 500 = 700ms 到位),比电气量档 300ms 少 40% 无内容
|
||||
* 变化的重绘;500 = 25 × LVGL 整刷周期 20ms,落整刷边界 */
|
||||
.auto_ms = 500u,
|
||||
};
|
||||
|
||||
@@ -355,9 +355,8 @@ static void pg_refresh(uint16_t row, char *name, char *value) {
|
||||
|
||||
当前口径:
|
||||
|
||||
- **已启用**:`ac` 交流量页 `.auto_ms = AC_AUTO_MS`(300 ms;250~500 ms 允许区间的取值账目详述在 `ui_page_ac.c` 的 `AC_AUTO_MS` 注释——要点:轮询不得快于 200 ms 发布节拍、避开 400 ms 与其锁相、300 = 15 × LVGL 整刷周期 20 ms(两端 `LV_DEF_REFR_PERIOD` 同值),最坏屏上滞后 200 + 300 = 500 ms)。
|
||||
- **六个实时页全部接入(用户裁定 2026-11-13)**。seq 恒随帧前进,所以轮询周期 = 稳态整页重绘频率——可见内容变化越慢取档越大:`ac`/`dc` 300 ms(电气量随 rt 帧帧帧推进;取值账目:轮询不得快于 200 ms 发布节拍、避开 400 ms 与其锁相、300 = 15 × LVGL 整刷周期 20 ms(两端 `LV_DEF_REFR_PERIOD` 同值),最坏屏上滞后 200 + 300 = 500 ms;全文在 `ui_page_ac.c` 的 `AC_AUTO_MS` 注释);`yx` 500 ms(变位低频事件,按"1 s 内上屏"到位——最坏 700 ms,较 300 档少 40% 稳态重绘);`clock` 1000 ms(快变项只有墙钟秒尾,快于 1 s 的轮询只会把同一秒多画几遍);`device_info`/`runreport` 1000 ms 并显式 `.auto_seq = ui_data_info_seq`(通道二;`info` 与 `rt` 同拍——`ui_data_feed_tick` 每 200 ms 拍两帧连发,见 §5.2)。各页取值账目在该页描述符注释里,本文不复述。
|
||||
- **不迁移**:待机屏 `ui_standby.c`(自持 1 s 整屏定时器 + seq 门控)、整定视图 `ui_w_setview.c`(`sv_poll` 定时器盯 `par` 通道)——两处各自已有节拍,纳入框架只会多一只定时器。
|
||||
- **未接入(待 lead/用户裁定)**:`dc`/`yx`/`clock`(读 `rt`)与 `device_info`/`runreport`(读 `info`)仍是"按键才取新数";接入只差描述符一行 `.auto_ms`(info 页另加 `.auto_seq`)。
|
||||
|
||||
**回归确定性**:无头模式(`--keys`/74 张黄金参考)从不跑 `lv_timer_handler`,定时器不可能在截屏前触发,且仿真仍是"一次发布冻结帧"——黄金参考逐字节不变(`check_content_pages.py` 实证)。自动失效路径的验证走新开关 `--rtlive <键序> <A.bin> <B.bin>`:开页截 A → 发布第 1 号确定性斜坡帧 → **直接调用** `ui_content_page_auto_poll()`(等价定时器到点)→ 截 B;A≠B 即证明"零按键、新帧落屏"。窗口模式(真机行为仿真)每 200 ms 发一帧斜坡值,屏上数值自己会走。
|
||||
---
|
||||
|
||||
@@ -26,7 +26,7 @@ cmake --build simulator/build --config Debug # 0) 构建模拟器(须 0 警
|
||||
| 步 | 脚本/命令 | 门禁内容 | 预期输出 |
|
||||
|---|---|---|---|
|
||||
| 1 | `simulator/tests/check_menu_rows.py` | 菜单 8 状态:选中行白带 / 非选行黑底白字 / 框体 1px 边框 / 往返像素一致(MENU-STATE-03==MENU-STATE-01、MENU-STATE-06==MENU-STATE-01、MENU-STATE-07==MENU-STATE-02)+ MENU-STATE-00 池基线 | `PASS: 8 状态全部断言通过(8 图,池基线 5368 B)` |
|
||||
| 2 | `simulator/tests/check_content_pages.py` | ① 文本级断言(字形模板匹配,正向 484 条 + 反向 45 条,独立于 `ref/`)→ ② 74 张截图与 `ref/` 黄金参考**逐字节**比对 + 开页-关页往返池水位 | `PASS: 74 内容页 + 往返池水位全部通过`(文本断言先于像素比对,失败即中止) |
|
||||
| 2 | `simulator/tests/check_content_pages.py` | ① 文本级断言(字形模板匹配,正向 484 条 + 反向 45 条,独立于 `ref/`)→ ② 74 张截图与 `ref/` 黄金参考**逐字节**比对 + 开页-关页往返池水位 → ③ `--rtlive` 框架自动失效实证(开交流量页截 A → 发布 1 帧确定性斜坡值 → 直调 `ui_content_page_auto_poll()` → 截 B,A≠B 即 PASS;机制见 `UI_数据供给设计说明.md` §5.5) | `PASS: 74 内容页 + 往返池水位 + rtlive 全部通过`(文本断言先于像素比对,失败即中止) |
|
||||
| 3 | `keil-build` skill(`keil_build.py`) | MCU 端编译(UI 源码双端共用,改一端必须过另一端) | 退出码 0 = BUILD_OK |
|
||||
| 4 | `scripts/check_coding_standard.py` | 代码规范 V1.0 机械检查 | PASS |
|
||||
|
||||
|
||||
+6
-3
@@ -280,7 +280,9 @@ typedef struct {
|
||||
| `rows` | `const cp_row_t *` | 静态数据表(Flash) | 6 行 | 24 行 | 3 行 | NULL |
|
||||
| `fixed_cur_page` / `fixed_total_pages` | `uint8_t` | 信息页页脚固定值 | 10 / 1 | — | — | — |
|
||||
| `refresh` / `count_cb` / `draw_cb` / `key_cb` | 函数指针 | 扩展钩子 | 全 NULL | 全 NULL | 全 NULL | draw_cb + key_cb(余 NULL) |
|
||||
| `auto_ms` / `auto_seq` | `uint16_t` / 函数指针 | 自动失效轮询周期 / 新鲜度源(`UI_数据供给设计说明.md` §5.5) | 0 / NULL | **300 / NULL** | 0 / NULL | 0 / NULL |
|
||||
| `auto_ms` / `auto_seq` | `uint16_t` / 函数指针 | 自动失效轮询周期 / 新鲜度源(`UI_数据供给设计说明.md` §5.5) | 1000 / `ui_data_info_seq` | 300 / NULL | 300 / NULL | 0 / NULL |
|
||||
|
||||
> 上表仅列这四页;未列出的实时页也已接入:`yx` 500 ms、`clock` 1000 ms、`runreport` 1000 ms(`ui_data_info_seq`)。六个实时页的取值账与"不迁移"清单见 `UI_数据供给设计说明.md` §5.5。
|
||||
|
||||
扩展钩子(机制已实现;密码页用 `draw_cb` + `key_cb`,其余 3 页未用):
|
||||
|
||||
@@ -433,8 +435,8 @@ extern const content_page_def_t ui_page_device_info_desc; /* 描述符(Flash
|
||||
|
||||
| 项 | 值 | 说明 |
|
||||
|---|---|---|
|
||||
| 框架常驻 RAM | ~20 B | `s_open/s_sel/s_scr/s_cont` 4 变量 |
|
||||
| 开页峰值 | +776 B | 屏 + 容器 + 事件列表 + 常量样式引用 |
|
||||
| 框架常驻 RAM | ~28 B | `s_open/s_sel/s_perm/s_scr/s_cont/s_auto_timer/s_auto_seq` 7 变量(后 2 个为自动失效) |
|
||||
| 开页峰值 | +776 B | 屏 + 容器 + 事件列表 + 常量样式引用;启用自动失效的页另占一只 lv_timer 对象(数十字节,关页归还池,2026-11-13 起) |
|
||||
| 关页回落 | 基线 +80 B 一次性残留 | screens 数组高水位 +8、`lv_screen_load` 菜单屏局部 X/Y 样式 +72(LVGL 核心行为,非泄漏;分解见 `菜单页面设计.md` §9.5) |
|
||||
| 池水位门禁 | 5368 B / 5448 B | 菜单基线 / 开页-关页往返(回归脚本常量,2026-10-11 随 LVGL 控件裁剪由 4784/4864 上移;**与池总大小无关**,16 KB 池下实测值不变) |
|
||||
| 描述符/行表/标题 | Flash const | 不进 LVGL 池;每页增量 = 描述符 ~40 B + 行表 + 代码 |
|
||||
@@ -502,5 +504,6 @@ extern const content_page_def_t ui_page_device_info_desc; /* 描述符(Flash
|
||||
| 2026-10-27 | 内容页黄金参考 **47 → 53 页**(通讯设置页落地并绑 `#page=comm`;判据 = `simulator/tests/ref/` 入库 `shot_*.bin` 实数 53 张,`git diff --name-status 31ca4a1f HEAD -- simulator/tests/ref` 实测只有 6 个 `A`、零 `M` ⇒ 存量 47 张逐字节零漂移);本文件的当前态计数已同步 |
|
||||
| 2026-10-26 | 验证与回归段的页数口径修正为 **27 页**黄金参考(`simulator/tests/ref/` 入库 27 个 `shot_*.bin`,含整定 9 态);上方变更记录里的「11 页」是当时事实不动 |
|
||||
| 2026-10-26 | 门禁常量修正为 5368 B / 5448 B(= 两个回归脚本头部现值);本文件正文表早已是 5368/5448,只这一处残留 2026-10-11 裁剪 LVGL 控件类之前的 4784/4864 |
|
||||
| 2026-11-13 | 五个实时页接入框架自动失效(task-3,用户裁定全接):`dc` 300 / `yx` 500 / `clock` 1000(rt 通道)与 `device_info` / `runreport` 1000 + `.auto_seq = ui_data_info_seq`(info 通道,`info` 与 `rt` 同拍 200 ms)描述符加 `.auto_ms`,取值账在各页注释;§三 字段表与 §六 内存表同步;实测黄金参考 74 张、往返水位 5448 B、菜单基线 5368 B 均不动(无头从不跑 `lv_timer_handler`) |
|
||||
| 2026-10-26 | 验证与回归段的黄金参考页数 **27 → 40 页**(UI 三页落地后 `simulator/tests/ref/` 实数 40 张);上方变更记录里的 11 / 27 是各当时下限,保留 |
|
||||
| 2026-11-13 | 框架级自动失效(task-2):描述符尾部新增 `auto_ms`/`auto_seq`(当前仅 ac 页启用 300 ms),新增框架 API `ui_content_page_auto_poll()`(§3.1);§3.1 静态块与代码同步(补 `s_perm` 与自动失效 2 变量);回归脚本新增 `--rtlive` 零按键落屏检查(74 张黄金参考逐字节不变,实测 PASS);机制详述在 `UI_数据供给设计说明.md` §5.5 |
|
||||
|
||||
@@ -626,7 +626,7 @@ SNTP 客户端 ──────→ 批4 SNTP设置
|
||||
| 4 | 无源点显示 `--` | 遥信量无效点、直流量直流通道 |
|
||||
| 5 | 定值整定闭环 | 改 → 保存 → 重启 → 值保持 + 校验和自检通过 + 主站 C_RD 一致。**2026-10-26 半收口**:模拟器侧「改 → 保存 → `OK` → 回首屏新值已在帧里」与「越界被拒、值不落盘」已由像素 + 文本断言覆盖(`sparam_save` / `sparam_landed` / `sparam_oob`);**重启保持与 C_RD 一致只能上板**(模拟器无 NAND)。另注意 40 项里 **13 项 `comm_addr = 0`**(投退、返回系数、过频/低频段、全局软压板)主站不可寻址,不能拿 C_RD 当它们的判据 |
|
||||
| 6 | 分层门禁无新增 | `check_layer_deps.py` 退出码 0,基线 6 → 3。**现状:3**(记录 reader 已削 3 条;写路径走注入式 ops 函数表,未新增 include,见 `docs/UI设计/UI_数据供给设计说明.md` §6.2) |
|
||||
| 7 | 像素回归稳定 | `ui-golden` 连续两次零差异。**已验(2026-10-26)**:27 页连跑两次逐字节一致——**该下限此后已扩至 66 张**(新增 clock / reset / clear 系列 13 张,其后 47→53→60→66,2026-10-29 录波 UI 道 +6 张),66 张上的双次逐字节一致**已验(2026-10-29:任务树重建模拟器后同一批 66 张连跑三次逐字节一致,页面池水位 5,448 B;菜单侧 `check_menu_rows.py` 8 状态连跑三次亦逐字节一致,5,368 B;三次之间未用更新模式写过任何参考图,故这是同口径的传递性证据)** |
|
||||
| 7 | 像素回归稳定 | `ui-golden` 连续两次零差异。**已验(2026-10-26)**:27 页连跑两次逐字节一致——**该下限此后已扩至 66 张**(新增 clock / reset / clear 系列 13 张,其后 47→53→60→66,2026-10-29 录波 UI 道 +6 张),66 张上的双次逐字节一致**已验(2026-10-29:任务树重建模拟器后同一批 66 张连跑三次逐字节一致,页面池水位 5,448 B;菜单侧 `check_menu_rows.py` 8 状态连跑三次亦逐字节一致,5,368 B;三次之间未用更新模式写过任何参考图,故这是同口径的传递性证据)**。集合其后扩至 74 张——2026-11-13 按同口径跑过 74 张零差异(task-3 五页接自动刷新,无头不跑 `lv_timer_handler`,往返水位 5,448 B / 菜单 5,368 B 均不动) |
|
||||
| 8 | 每个新页有 golden 参考 | `simulator/tests/ref/` 新增对应 `.bin`。**整定 4 页已有 9 张**(含保存/越界/落定/回绕各态);参考图入库,改它 = 改判据,须逐页过目 |
|
||||
|
||||
---
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"built_at": "2026-11-13T14:23:05+08:00",
|
||||
"fingerprint": "f44730aca08c9f35b9eec8a83322b342ee21a2280a94ce2c277b5c62a26fb442",
|
||||
"built_at": "2026-11-13T14:51:49+08:00",
|
||||
"fingerprint": "7bca71501bd2582cd221f9cfea5d4db5d196d3d40a583ff119dfd26841355379",
|
||||
"fingerprint_files": 1479,
|
||||
"fingerprint_source": "git-index",
|
||||
"gated_regions": [
|
||||
"RW_IRAM1",
|
||||
"RW_CCM"
|
||||
],
|
||||
"git_head": "5bab248deeac14b0d6235e0fe312bcd9388a5e0a",
|
||||
"git_head": "a5142c6d9d11b751d5ff1390bd815f5202bcdabb",
|
||||
"map": "MDK-ARM/STM32F407-Demo/STM32F407-Demo.map",
|
||||
"map_mtime": 1794549805,
|
||||
"map_mtime": 1794551787,
|
||||
"pct": {
|
||||
"ER_IROM1": 27.53,
|
||||
"RW_CCM": 87.89,
|
||||
|
||||
Reference in New Issue
Block a user