新增复合管控器(pCCU) + 惯导数据解析 + 设备控制页增强 + 0824协议文档归档

- 新增 pCCU 复合管控器程序(src/pCCU):FC/PM 双链路(UDP)、协议编解码器
  (FcProtocol/PmProtocol/Frame/Message/MessageRegistry)、快照与落库(DbStore)、
  内置 WebServer;挂入 src/CMakeLists.txt 与板卡 mission(h100.moos)
- 惯导/深度数据:新增 uDevice_insData 消息解析,接入 UpperCommManager,
  pPowerMangerHost 注册监视,UpmsgTest 覆盖
- pPowerMangerHost 设备控制页增强(web/index.html)
- 部署/运维脚本改为 4 个 systemd 服务(moosdb/pPowerManger/pPowerMangerHost/pCCU):
  deploy/clean-data/fetch-data 同步适配
- 协议文档:归档 0824 控制主机与复合管控器通信协议 xlsx 及关联 docx,移除旧 md
- 测试:新增 pccu 单元/集成测试与 disSysTest Python 配电仿真
- 清理:移除未使用的 CCU 状态调试打印 coutMsg;.gitignore 补充编译产物/临时文件忽略
This commit is contained in:
zjk
2026-08-26 22:43:10 +08:00
parent e0488d513b
commit 54c32a180a
79 changed files with 8731 additions and 1398 deletions
+85
View File
@@ -0,0 +1,85 @@
"""程序入口:python -m app 或 python run.py。
支持 --selftest 无 GUI 自检(协议 / 配置 / 数据库)。
"""
import argparse
import os
import sys
import tempfile
def selftest():
ok = True
print("== 协议自检 ==")
proto_ok, report = _protocol_selftest()
print(report)
ok = ok and proto_ok
print("== 配置自检 ==")
try:
from .config import Config
c = Config()
for key in ("local", "c1", "c2", "host"):
assert key in c.data, f"缺少配置节 {key}"
print(" [OK] 配置加载/默认值")
except Exception as e:
print(f" [FAIL] 配置: {e}")
ok = False
print("== 数据库自检 ==")
try:
from .db import DB, TABLE_NAMES
from . import protocol
assert len(TABLE_NAMES) == 8, "消息表数量应为 8"
fd, path = tempfile.mkstemp(suffix=".db")
os.close(fd)
db = DB(path)
db.connect()
for cls in protocol.ALL_MESSAGES.values():
assert db.insert_message(cls()), f"{cls.__name__} 插入失败"
rows = {name: 0 for name in TABLE_NAMES.values()}
for name in TABLE_NAMES.values():
rows[name] = db.conn.execute(f'SELECT COUNT(*) FROM "{name}"').fetchone()[0]
assert all(v == 1 for v in rows.values()), f"写入行数异常: {rows}"
db.disconnect()
os.unlink(path)
print(" [OK] 建表 / 写入 / disconnect")
except Exception as e:
print(f" [FAIL] 数据库: {e}")
ok = False
print("SELFTEST:", "PASS" if ok else "FAIL")
return 0 if ok else 1
def _protocol_selftest():
from . import protocol
return protocol.self_test()
def main(argv=None):
parser = argparse.ArgumentParser(description="配电系统调试助手")
parser.add_argument("--selftest", action="store_true",
help="运行协议/配置/数据库自检后退出")
parser.add_argument("--config", default=None, help="配置文件路径")
parser.add_argument("--version", action="store_true", help="显示版本")
args = parser.parse_args(argv)
if args.version:
from . import __version__
print(f"配电系统调试助手 v{__version__}")
return 0
if args.selftest:
return selftest()
import tkinter as tk
from .app import PowerManagerApp
root = tk.Tk()
app = PowerManagerApp(root, config_path=args.config)
root.mainloop()
return 0
if __name__ == "__main__":
sys.exit(main())