# 主菜单层级定义（声明式源）
# 规则：缩进即层级，每级 2 空格；`#` 开头为注释；空行忽略。
#       行尾可选 ` #P` = 该叶子需密码（密码页按所输密码授权：查看密码→只读 / 修改密码→可修改）；无尾注 = 不需密码页（直接进，只读）。
#       密码值：Drivers/BSP/UI/ui_pwd_def.h 编译期配置（查看/修改各一个，改值 = 重新编译）。
#       行尾可选 ` #page=<模块名>` = 该叶子绑定一个内容页实例（UI 页面原型化的页面注册表）：
#           模块名 = Drivers/BSP/UI/ui_page_<模块名>.c，其描述符符号须为 ui_page_<模块名>_desc。
#           声明了 #page 但实例文件缺失/符号不符 → 生成器报错（不产出半成品表）。
#           未被任何叶子 #page 引用的 ui_page_*.c 同样报错（写了却从不生效的死代码）。
#           注：密码页**不是**节点绑定的（任何 #P 叶子都进同一页），故由下方 @password 指令单独声明。
# 指令（整份文件级，写在注释行里）：
#   # @password=<模块名>  = 需密码叶子统一进的内容页模块名（省略 = 无密码页）。
# 改菜单/改页面绑定只需编辑本文件，然后重跑：
#     python tools/menu_gen/gen_menu.py
# 产物：Drivers/BSP/UI/ui_menu_tab.c / ui_menu_tab.h
#       Drivers/BSP/UI/ui_page_registry.c / ui_page_registry.h（节点→页面注册表，自动生成）
# 生成器并自动把新增的 ui_page_*.c 写进 MDK-ARM/STM32F407-Demo.uvprojx 与
# simulator/CMakeLists.txt 两处显式列表（双端注册），无需手工编辑注册文件。
# @password=password
主界面
  装置信息 #page=device_info
  实时数据
    交流量 #page=ac
    直流量 #page=dc
    遥信量 #page=yx
  参数定值
    整定
      参数 #P #page=view_param
      定值 #P #page=view_set
      控制字 #P #page=view_word
      软压板 #P #page=view_plate
    查看
      参数 #page=view_param
      定值 #page=view_set
      控制字 #page=view_word
      软压板 #page=view_plate
  三遥设置
    遥测死区 #P #page=deadband
    遥测系数 #P #page=calib
    遥信类型 #P
    遥信防抖 #P
    双点遥信 #P
  装置维护
    时钟设置 #P #page=clock
    强制复归 #P #page=reset
    手动录波 #P
    清除记录 #P #page=clear
  通讯参数
    通讯设置 #P #page=comm
    网口设置 #P #page=net_cfg
    SNTP设置 #P
  记录查询
    SOE记录 #page=soe
    事故记录 #page=accident
    操作记录 #page=oper
    保护告警 #page=alarm
    保护启动 #page=start
    遥控记录 #page=yk
    自检记录 #page=selftest
    运行记录 #page=runlog
    运行报告 #page=runreport
