48a8ef0564
这两页是「UI补齐」里唯一带**持久化语义**的一档,所以整笔的设计重心不在画面上,而在**页面如何诚实表达 「已受理」与「已落盘」**——这一点由 setpage-scout 在开工前的只读查实钉下来:cfg_file_save() 全仓唯一调用 者是 run_par_store_save(),而 default_task.c:246 **每轮无条件**调它、函数首行 s_dirty==0 就直接返回 ⇒ 落盘动力本来就在 defaultTask,不在 104 会话、也不在事件位。因此本笔走 A2(UI 不当授权写者),不需要 新事件位、不需要新同步口。 页面三态判据 = run_par_dirty_peek():ENTER / WAIT(脏位仍在 = 已受理未落盘)/ OK(脏位归零 = 整档已外科 保存成功)/ 写被拒 = ERR。两条限制写在页面注释里没藏:脏位是**整档全局**的(一趟落 [run_par] 9 键 + [adc_cal] 两段,归零只证明「这一档落盘了」,不证明「我这一项单独落盘」);他人随后再改会重新置脏 ⇒ 沿用 clear/clock 页的结果锁存,把「我这次动作的结果」与「档位此刻的状态」分开。 **为什么黄金必须出两张**(这条是本轮最有价值的防假证据规则):模拟器假件**保留脏位**、全仓唯一的 s_yt_dirty=0 写点是 sim_yt_pump()(setter 只置不清),于是 WAIT 与 OK 各出一帧——两组同键序、唯一差别是 EXTRA 里的 --yt-nopump。若假件同步清脏位,真机的 WAIT 态永远不会被像素回归覆盖,黄金就成了「只钉住最 好看那一帧」。TC-UIDATA-028o 另钉住 ui_data 层零缓存。 形状:新增 ui_data 第四张注入表(八字段整表校验、拒残表),实现落在装配层 App/app/ui_data_feed.c, 页面零 App include(分层方向 + 模拟器不链 run_par 两条老理由都成立);共用视图模型 ui_w_ytview 承载两页。 合法域一律由执行侧出口给(run_par_db_range / RUN_PAR_K_MAX_UV),页面不抄第二真源——系数页 v1 只用粗守 并在注释写明两层守卫互不掩盖,µV/码 ×[0.5,2.0] 那条真带的出口器归 task-43,**没有**在页面里抄常量。 取舍与遗留(如实):系数行 d=0 整 µV(1e9 装不下两位小数,注释写了「要小数改哪、不收紧假上限」);b 覆盖 无口未做;徽标只画系数页;行名因「率」缺字改为 Hz死区(font-charset 机器先抓到的,不是我目测判的)。 实测:@build 0 错误 0 警告(Code=233,900 / RW-data=1,536);ui_data 单测 277/277、run_par 67/67 零回归; 内容页黄金 47 页全过、**存量 40 张逐字节零漂移**(git 里只有 7 张新增);menu_rows / 池水位 / font-charset / bom / mojibake / nested-comment / cppcheck / coding-standard / layer-deps / bsp-err 全 0 新增;编号五项式 refs 8,778 / dec 7,622 / und **1,156**(上限 1,166)/ 比值 86.83%(基线 86.0% 之上)/ 错误差值 0,注释零裸形 字母+数字。generated-fresh 与 registration-check 本地 PASS;新增 6 只源文件按规矩**双端注册同笔**(叶子 + registry 19→21 + uvprojx + CMakeLists),uvprojx 这次属「真的增删源文件」才入库。 移交三条不混进本笔:① 全量 --selftest 现 exit 1 是 task-41 硬闸在模拟器上也拒 reset/clear(既有红,快检档 不受影响),归台架道定夺;② 内容页 40→47 的全仓文档计数改写由 Lead 派;③ run_par_deadband_set 的限定 条件语措辞(「iec104Task 上下文」已被装配层裁定覆盖)归算法层下一笔。
227 lines
9.7 KiB
CMake
227 lines
9.7 KiB
CMake
cmake_minimum_required(VERSION 3.15)
|
||
project(lvgl_sim C)
|
||
|
||
#=============================================================================
|
||
# 路径配置(相对于 simulator/ 目录)
|
||
#=============================================================================
|
||
set(PROJECT_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/..")
|
||
set(LVGL_DIR "${PROJECT_ROOT}/Lib/lvgl")
|
||
set(UI_DIR "${PROJECT_ROOT}/Drivers/BSP/UI")
|
||
set(NET_DIR "${PROJECT_ROOT}/Drivers/BSP/NET")
|
||
set(NETCFG_DIR "${PROJECT_ROOT}/Drivers/BSP/NETCFG")
|
||
set(SDL2_DIR "${CMAKE_CURRENT_SOURCE_DIR}/SDL2/SDL2-2.32.10")
|
||
|
||
#=============================================================================
|
||
# 编译标准
|
||
#=============================================================================
|
||
set(CMAKE_C_STANDARD 99)
|
||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||
|
||
# Windows 控制台输出(显示 printf)
|
||
if(WIN32)
|
||
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
|
||
endif()
|
||
|
||
# MSVC:源码为 UTF-8 编码(含中文注释),强制按 UTF-8 解析消除 C4819 警告
|
||
if(MSVC)
|
||
add_compile_options(/utf-8)
|
||
endif()
|
||
|
||
#=============================================================================
|
||
# SDL2 头文件路径(需先于 add_subdirectory 定义,供 LVGL SDL 驱动使用)
|
||
#=============================================================================
|
||
# LVGL SDL 驱动内部 #include "SDL2/SDL.h",include 目录下已有 SDL2/ 子目录
|
||
set(SDL2_INCLUDE_DIR "${SDL2_DIR}/include" CACHE PATH "SDL2 include directory for LVGL")
|
||
|
||
#=============================================================================
|
||
# LVGL 子目录(引用项目自带的 LVGL v9.3.0 源码)
|
||
#=============================================================================
|
||
# LVGL 内部会自动检测 lv_conf.h(通过 LV_CONF_INCLUDE_SIMPLE 宏)
|
||
# 需要将 simulator 目录加入 LVGL 的包含路径,使其能找到 lv_conf.h
|
||
set(LV_CONF_DIR "${CMAKE_CURRENT_SOURCE_DIR}" CACHE PATH "Directory containing lv_conf.h for LVGL")
|
||
add_subdirectory("${LVGL_DIR}" lvgl_build)
|
||
|
||
#=============================================================================
|
||
# 包含路径
|
||
#=============================================================================
|
||
include_directories(
|
||
${CMAKE_CURRENT_SOURCE_DIR} # lv_conf.h (LVGL 找), dbg_log.h
|
||
${CMAKE_CURRENT_SOURCE_DIR}/sim # sim_port.h 等模拟器平台层
|
||
${LVGL_DIR} # lvgl.h
|
||
${LVGL_DIR}/src # lvgl 内部头文件
|
||
${UI_DIR} # ui_menu.h, ui_font_cn_12.h
|
||
${NET_DIR} # net_socket.h / net_types.h(net_* API 双端共享核心)
|
||
${NETCFG_DIR} # net_cfg.h(网络配置,双端共享核心)
|
||
${PROJECT_ROOT}/test/board # test_config.h / net_latency_test.h(共享核心
|
||
# ui_net_sink.c、net_socket.c 引含;探针默认关闭,
|
||
# 声明宿主安全;2026-09-21 修复模拟器构建断链;
|
||
# 2026-10-02 测试目录重构后头文件移入 test/board/)
|
||
${PROJECT_ROOT}/App/cfg # cfg_file.h / cfg_file_store.h(通用配置文件引擎,双端共享核心)
|
||
${PROJECT_ROOT}/App/protocol/iec104 # iec104_comm.h([comm] 段契约头,供 IEC104_SOURCES 编译;道G task-8)
|
||
${PROJECT_ROOT}/App/log # sys_log.h(运行/自检记录引擎,双端共享核心)
|
||
${PROJECT_ROOT}/App/algo # prot_set.h(定值模型纯算法,双端共享核心;见 ALGO_SOURCES)
|
||
${PROJECT_ROOT}/Drivers/BSP # dbg_log.h(使用 simulator 的 dbg_cfg.h 配置)
|
||
${SDL2_DIR}/include # SDL2 头文件
|
||
)
|
||
|
||
#=============================================================================
|
||
# SDL2 库(使用本地预编译版本)
|
||
#=============================================================================
|
||
set(SDL2_INCLUDE_PARENT "${SDL2_DIR}/include")
|
||
set(SDL2_LIB_X64 "${SDL2_DIR}/lib/x64")
|
||
|
||
#=============================================================================
|
||
# 源文件
|
||
#=============================================================================
|
||
set(SIM_SOURCES
|
||
main.c
|
||
sim/sim_port.c
|
||
sim/sim_latency_stub.c # 探针符号宿主空实现(ui_net_sink.c 引用,见文件头注释)
|
||
)
|
||
|
||
# UI 源文件(与 MCU 端共用,直接编译)
|
||
set(UI_SOURCES
|
||
${UI_DIR}/ui_menu.c
|
||
${UI_DIR}/ui_menu_view.c
|
||
${UI_DIR}/ui_content_page.c
|
||
${UI_DIR}/ui_deco.c
|
||
${UI_DIR}/ui_page_device_info.c
|
||
${UI_DIR}/ui_page_ac.c
|
||
${UI_DIR}/ui_page_dc.c
|
||
${UI_DIR}/ui_page_password.c
|
||
${UI_DIR}/ui_page_net_cfg.c
|
||
${UI_DIR}/ui_page_runlog.c
|
||
${UI_DIR}/ui_page_selftest.c
|
||
${UI_DIR}/ui_standby.c
|
||
${UI_DIR}/ui_menu_tab.c
|
||
${UI_DIR}/ui_font_cn_12.c
|
||
${UI_DIR}/ui_net_sink.c
|
||
${UI_DIR}/ui_page_registry.c
|
||
${UI_DIR}/ui_style.c
|
||
${UI_DIR}/ui_w_records.c
|
||
${UI_DIR}/ui_w_editor.c
|
||
${UI_DIR}/ui_w_setlist.c
|
||
${UI_DIR}/ui_page_action.c
|
||
${UI_DIR}/ui_data.c # 数据快照存侧(道E task-14;写侧 App/app/ui_data_feed.c 不进模拟器,见 scripts/check_registration.py)
|
||
${UI_DIR}/ui_w_soe.c # SOE 记录组件(道E task-14;reader 已在批 2 两端绑定)
|
||
${UI_DIR}/ui_w_setview.c # 定值查看视图模型(道E task-15 批 3:四张视图表 + Q10 换算 + 越界反显)
|
||
${UI_DIR}/ui_w_ytview.c # 遥测整定视图模型(道F task-7:死区/系数两页共用注入表视图 + 落盘确认状态机)
|
||
${UI_DIR}/ui_page_soe.c
|
||
${UI_DIR}/ui_page_view_param.c
|
||
${UI_DIR}/ui_page_view_plate.c
|
||
${UI_DIR}/ui_page_view_set.c
|
||
${UI_DIR}/ui_page_view_word.c
|
||
${UI_DIR}/ui_page_yx.c
|
||
${UI_DIR}/ui_page_clear.c
|
||
${UI_DIR}/ui_page_clock.c
|
||
${UI_DIR}/ui_page_reset.c
|
||
${UI_DIR}/ui_page_calib.c
|
||
${UI_DIR}/ui_page_deadband.c
|
||
)
|
||
|
||
# 运行/自检记录引擎(双端共享核心 + 平台存储后端;MCU 端编 sys_log_mcu.c,见 Keil 工程)
|
||
set(SYSLOG_SOURCES
|
||
sim/sim_syslog.c
|
||
)
|
||
|
||
# 网络配置(双端共享核心 + cfg_file 引擎 + 平台存储后端;MCU 端编 cfg_file_store_mcu.c,见 Keil 工程)
|
||
set(NETCFG_SOURCES
|
||
${NETCFG_DIR}/net_cfg.c
|
||
${NETCFG_DIR}/ftp_cfg.c
|
||
${PROJECT_ROOT}/App/cfg/cfg_file.c
|
||
sim/cfg_file_store_sim.c
|
||
)
|
||
|
||
# 保护定值模型(App/algo/prot_set.c 零平台依赖,双端共享核心)。
|
||
# 模拟器只需要"出厂默认定值"来发布 UI 快照帧(main.c 的 sim_publish_data_frames),
|
||
# 不在这里复制一份 40 项数字——抄表就等于造第二真相(同 scripts/check_font_charset.py
|
||
# "单一规则源"的同一治理口径)。
|
||
set(ALGO_SOURCES
|
||
${PROJECT_ROOT}/App/algo/prot_set.c
|
||
)
|
||
|
||
# IEC 104 [comm] 配置段(道G task-8):模拟器运行期不跑 104 任务、无消费路径,
|
||
# 本 TU 仅为双端注册事实一致而编译(iec104 其余 .c 走 scripts 白名单逐个点名,
|
||
# 白名单是门禁地盘不在这里扩——新配对模块按 new-source-file 口径进显式源列表)。
|
||
set(IEC104_SOURCES
|
||
${PROJECT_ROOT}/App/protocol/iec104/iec104_comm.c
|
||
)
|
||
|
||
# 网络后端(net_* 核心 API 的 Winsock 实现 + UI 推流平台后端;MCU 端另编 net_socket.c 与 _mcu 后端)
|
||
set(NET_SOURCES
|
||
sim/net_socket_sim.c
|
||
sim/ui_net_sink_backend_sim.c
|
||
)
|
||
|
||
#=============================================================================
|
||
# 构建可执行文件
|
||
#=============================================================================
|
||
add_executable(lvgl_sim WIN32 ${SIM_SOURCES} ${UI_SOURCES} ${NETCFG_SOURCES} ${SYSLOG_SOURCES} ${NET_SOURCES} ${ALGO_SOURCES} ${IEC104_SOURCES})
|
||
|
||
target_compile_definitions(lvgl_sim PRIVATE
|
||
LV_CONF_INCLUDE_SIMPLE # 让 lvgl.h 找到 lv_conf.h
|
||
LV_LVGL_H_INCLUDE_SIMPLE # ui_font_cn_12.c 内部 include 简化
|
||
WIN32_LEAN_AND_MEAN # 防止 Windows.h 拉入 winsock.h(与 winsock2.h 冲突)
|
||
NET_NO_OS # 剥离 net_socket.h 的 FreeRTOS 相关接口(纯 BSD Socket)
|
||
)
|
||
|
||
target_include_directories(lvgl_sim PRIVATE
|
||
${SDL2_INCLUDE_PARENT} # SDL2/SDL.h 路径
|
||
)
|
||
|
||
target_link_directories(lvgl_sim PRIVATE
|
||
${SDL2_LIB_X64}
|
||
)
|
||
|
||
target_link_libraries(lvgl_sim
|
||
lvgl
|
||
SDL2
|
||
SDL2main
|
||
ws2_32
|
||
)
|
||
|
||
# 数学库(非 MSVC)
|
||
if(NOT MSVC)
|
||
target_link_libraries(lvgl_sim m pthread)
|
||
endif()
|
||
|
||
# Windows 子系统:控制台(显示 printf 输出)
|
||
if(WIN32)
|
||
if(MSVC)
|
||
target_link_options(lvgl_sim PRIVATE "/SUBSYSTEM:CONSOLE")
|
||
else()
|
||
target_link_options(lvgl_sim PRIVATE "-mconsole")
|
||
endif()
|
||
endif()
|
||
|
||
# 复制 SDL2.dll 到输出目录
|
||
add_custom_command(TARGET lvgl_sim POST_BUILD
|
||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||
"${SDL2_LIB_X64}/SDL2.dll"
|
||
"$<TARGET_FILE_DIR:lvgl_sim>/SDL2.dll"
|
||
COMMENT "Copying SDL2.dll to output directory"
|
||
)
|
||
|
||
#=============================================================================
|
||
# 自定义目标:运行模拟器
|
||
#=============================================================================
|
||
add_custom_target(run COMMAND ${CMAKE_BINARY_DIR}/lvgl_sim DEPENDS lvgl_sim)
|
||
|
||
#=============================================================================
|
||
# 调试模式额外警告
|
||
#=============================================================================
|
||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||
message(STATUS "Debug mode enabled for simulator")
|
||
if(MSVC)
|
||
target_compile_options(lvgl_sim PRIVATE /W4)
|
||
else()
|
||
target_compile_options(lvgl_sim PRIVATE -Wall -Wextra -Wpedantic)
|
||
endif()
|
||
endif()
|
||
|
||
message(STATUS "=== LVGL Simulator ===")
|
||
message(STATUS "Screen: 160x160, 1bpp monochrome")
|
||
message(STATUS "LVGL dir: ${LVGL_DIR}")
|
||
message(STATUS "UI dir: ${UI_DIR}")
|
||
message(STATUS "SDL2: ${SDL2_DIR}")
|