Files
STM32F4-Base/simulator/CMakeLists.txt
T
wandering1 94b0d79026 feat(ui)+chore(docs): UI 补齐清单清空;数据可信销项与「卡」号清退
本笔含两组收尾工作(同一工作区内交错在 6 个共享文档/门禁配置里,
拆开会产生"文档声称的页数与树里黄金数不一致"的中间提交,故合为一笔):

一、UI 补齐(清单清空)
- 新建 6 个内容页模块:ui_page_accident / oper / alarm / start / yk
  复用 ui_w_records 共享组件(分页、空态"无记录"、按实例读盘缓存),
  记录层与五个写入点已由道F task-10 / 道G task-12 落地,本批只补页面;
  ui_page_runreport 为 13 行 2 页只读统计,四个数逐个挂范围标签
  (自电池周期 / 本次开机),boot_ready=0 显 "--" 不显 0。
- 数据面:ui_data_info_t 尾部追加 9 字段,ui_data_feed 用
  boot_stats_get() + iec104_serv_get_stats() 纯搬运;模拟器填确定值假数据
  (差异登记 docs/测试说明/模拟器差距清单.md §2.3 两行)。
- 接线:菜单树 6 叶绑 #page=,绑定叶 22→28、UI_PAGE_MAP_COUNT=28;
  字库 185→218 字 / 280→313 字形;双端注册 uvprojx +30、CMakeLists +6。
- 回归:内容页黄金 53→60(含 runreport_p2 真拍第 2 页),文本断言
  425 正向 / 36 反向;存量 53 张逐字节零漂移;记录 5 页各用独立空目录
  (模拟器把操作留痕写进 cwd 的 sim_oper.log,共用 tmp 会让空态拍不到)。

二、数据可信销项 + 「数据可信」任务卡号整族清退
- 删除已闭环的"已知电压注入验证"行与闭环结论块(证据在
  docs/硬件平台/ADC通道映射说明.md §8.1 与
  docs/测试说明/ADC前端注入验证流程.md §5~§7),§5 标识列改语义短语。
- 卡 0/0b/1~12 共 14 个号全仓 288 站点 / 56 文件清退成语义短语,
  代码注释、测试、门禁配置与文档一并改;换算表入 docs/编号规范.md §9.3。
  这一族是中文前缀,不进 check_ids 语料,刻意不入 id_aliases.json。

验证(实测)
- @build 0 错 0 警:Code=236456 RO=28124 RW=1876 ZI=137084;
  RAM +464 B(RW +304 / ZI +160),RW_IRAM1 62.2% / RW_CCM 87.9%,
  体积同码凭证与 RAM 台账已回填。
- check_menu_rows 8 状态 rc=0(池 5368/5448 常量未动);
  check_content_pages 60 页 rc=0;check_font_charset / registration /
  coding-standard / bom-drift / mojibake / doc-links --all / layer-deps /
  nested-comment 全 rc=0;check_ids --strict 无错误;主机单测
  ui_data 295 / boot_stats 21 / sys_log_mcu 141 / soe 32 / soe_store 27。

未做(不是遗漏)
- 六页真机判据(真记录翻页、掉电保持、清除后归零、boot_count 自增、
  拔 RTC 电池落 RESTARTED、IWDG 复位落 rst_cause、主站连一次 conn_up+1)
  已登记 docs/任务规划/登记簿.md §7;模拟器结构上照不到。
- docs/产品需求/产品需求设计文档.md 属另一条在飞改动,本笔不含;
  其中我已同步 6 处现状数字(28 叶 / 60 页 / 218 字),随该笔入库。
2026-10-28 07:23:16 +08:00

234 lines
9.9 KiB
CMake
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
${UI_DIR}/ui_page_comm.c
${UI_DIR}/ui_page_accident.c
${UI_DIR}/ui_page_alarm.c
${UI_DIR}/ui_page_oper.c
${UI_DIR}/ui_page_runreport.c
${UI_DIR}/ui_page_start.c
${UI_DIR}/ui_page_yk.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}")