f711130b4c
域5 新增 3 对文件(双端注册 uvprojx + CMakeLists),只做渲染与输入抽象、 不接真实数据源(数据绑定 = 批 2 道E ui_data/prot_set 经回调注入): - ui_w_editor:定点整数(10^decimals)逐位编辑——上下步进(0..9 环绕无进位)、 左右移数字光标(首末环绕)、ENTER 提交经 min/max 范围校验,越界拒绝并 显示"越界"提示留在编辑态;光标反显盒与 ui_page_net_cfg 字节光标同画法 (含"只画单字符防折行"实测坑注释);共享格式化 ui_w_editor_fmt_scaled() 单一规则源(值列显示与编辑光标恒同串) - ui_w_setlist:定值四视图(参数/定值/控制字/软压板)共用列表渲染 + 整定输入——行表(名称<=7字/id/类型/小数位/范围/二态串表) + 回调注入 (get/set/commit/state/bad);查看视图(commit=NULL)与整定视图只差绑定: 整定视图末行固定"保存"行,值随交接态 ENTER/WAIT/OK/ERR(net_cfg 先例), 整表一次提交(一次封存一次校验和,页面补齐规划 §3.2);二态行 ENTER 循环切换;保存失败越界行经 bad 回调反显(页面扩充详细方案 §3.2.7) - ui_page_action:可复用操作确认链——一次确认 -> 二次确认 -> ok_cb 只投递不阻塞 -> done_text 回报(或成功即关页),拒收显示 ERR 可重试; ESC/LEFT 关页取消(实测取消后菜单与基线逐字节一致);单例描述符由 开页装载(内容页框架全局单页前提),不定义 ui_page_action_desc (registration-check 页面模块判据不误拦,批 2 跳板各自出口) 组件文案用字全部落在上一分支预置字集内(font-charset WARN 60->52 印证 确/取/消/越/二/次/返/回 已转源码在用),无需再动字库。 BSP 公开 API 约定合规(首提被 cppcheck/coding-standard/bsp-err 三钩拦下, 按门禁口径修净后复验全绿): - 键分发返回值取 uint8_t 1/0 不用 bool(bsp-err/err-type:bool 只许 is_/has_ 谓词);ui_w_editor_value 直返 int32_t(出参形状无错误通道) - ui_page_action_open 返回 bsp_err_t:BSP_ERR_PARAM 参数无效 / BSP_ERR_STATE 已有页打开 / BSP_ERR_NO_SPACE 框架开页失败(可判分支) - get/state/bad 回调 typedef 各补"返回值:"注释块(bsp-err/return-doc) - cppcheck variableScope 变量收scope 7 处;CODE-RULE-18 Yoda 1 处 (sel+1u==total -> sel==count);提交内已不含 --wdemo/--wact harness 验证: - 模拟器零警告;组件行为经临时 sim-only harness(--wdemo/--wact) 截图 目检 7 态:基线视图/bad 反显/进编辑步进/越界拒绝/二态切换/保存整表 提交 OK/确认链三段/取消回菜单;harness(main.c 4 处 + CMake 1 行 + ui_w_demo.c)已完整还原删除,提交内不含(最终树 main.c 无改动, CMakeLists diff 仅 3 行注册) - 回归:菜单 8 状态 + 内容页 11 页黄金参考逐字节 PASS(ref 无变化, 无基线更新提交);池基线 5368/往返 5448 不变 - 门禁:coding-standard PASS / font-charset PASS / layer-deps PASS (新文件零 App include,基线 6 不变——减基线归 task-6) - @build 0 Error 0 Warning;Code +324 B、RO/RW/ZI 0(组件尚无引用方, ARM 链接器未剥离仅因新 TU;批 2 页面接线后实例 RAM 每页约 +40~60 B) gate: 全钩子正常执行通过,无 --no-verify - pre-commit run --all-files 全绿(含 mem-budget/mem-numbers:本分支基于 回填后台账 d9ab955,RAM 0 变化、RO 不变,仅 Code +324 B 不涉受管区) - 手工自查:6 新文件 BOM=EF BB BF 齐全、全 LF、U+FFFD=0、字面量仅 UTF-8 中文(UI 带 BOM 先例口径:保存/越界/二次确认/告警/跳闸等, 全部已在字体子集);ASCII 串仅 ENTER/WAIT/OK/ERR 状态字
195 lines
7.8 KiB
CMake
195 lines
7.8 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/log # sys_log.h(运行/自检记录引擎,双端共享核心)
|
||
${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
|
||
)
|
||
|
||
# 运行/自检记录引擎(双端共享核心 + 平台存储后端;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
|
||
)
|
||
|
||
# 网络后端(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})
|
||
|
||
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}")
|