Skip to content

feat(gui): 完成 #1 实时波形监测界面重构#2

Open
somhairle-marisol wants to merge 3 commits intoluiox:mainfrom
somhairle-marisol:1
Open

feat(gui): 完成 #1 实时波形监测界面重构#2
somhairle-marisol wants to merge 3 commits intoluiox:mainfrom
somhairle-marisol:1

Conversation

@somhairle-marisol
Copy link

@somhairle-marisol somhairle-marisol commented Mar 27, 2026

Closes #1

这次做了什么

这次把 issue #1 的主体需求完整落到了 host GUI 上,范围一共分成三块:

  • 实时波形监控界面重构
  • host 侧 Python 质量工具链补齐
  • 第二轮 GUI 工作台重构,把界面从通用工具布局继续收敛到更适合调参场景的 Minimal Signal Lab 风格

GUI / 监控侧改动

第一阶段:实时波形监控能力落地

  • 将旧的 host/gui.py 拆成 host/gui/ 包结构
  • 新增主窗口、侧栏、顶部栏、波形区、值卡、日志面板等组件
  • 引入 pyqtgraph,波形支持实时刷新、多变量叠加、时间窗口切换、暂停、PNG/CSV 导出
  • GUI 监测链路不再依赖 QTimer 做单次轮询,而是接到设备周期上传的数据流
  • 新增 DeviceManagerMonitorStore,用于管理监测回调、缓存样本和驱动界面更新
  • 新增 mock 预览入口 sparam-gui-mock,在没有硬件时也能直接看界面和假数据效果

第二阶段:工作台布局重构

  • 主窗口重组为左侧控制栏、中央信号工作区、右侧 inspector 三段式布局
  • 值卡区从厚重的卡片排布收敛为更轻的 signal stats strip
  • 图表区改成更明确的主工作区,右侧 inspector 负责 connection / monitor / activity 信息
  • 重写 GUI 色阶,区分页面底、壳层、面板、卡片和输入控件层级,避免整屏同一层白底
  • 收敛按钮、chip、图表网格、legend 和语义色的视觉权重
  • mock 预览状态现在会明确显示 Preview

协议、mock 与测试侧改动

  • 扩展了 socket 模拟设备,补上周期推流能力
  • 新增监测缓存测试,覆盖 ring buffer 行为
  • 新增 GUI 布局测试,钉住 workspaceShellinspectorPanelsignalStatsStrip 三个骨架锚点
  • 保留原有 host 通信与协议路径,mock 预览和真实 GUI 走同一套主路径

Python 质量工具链

  • host/pyproject.toml 里新增 dev extra
  • 引入 ruff 负责 format / lint
  • 引入 mypy 做静态类型检查
  • 增加 .editorconfig
  • 更新 .gitignore,清理 __pycache__.pytest_cache.venv 等本地噪音
  • 更新 .vscode/tasks.json,补上 format / lint / type-check / test / quality 任务
  • 更新 host/README.md,把开发、mock 预览和质量检查命令写清楚
  • 顺手修了一轮 host 侧类型边界和签名问题,让工具链能在当前代码上直接跑通

如何运行

1. 安装依赖

cd host
uv sync --extra dev --extra test --extra gui

2. 运行真实 GUI

uv run sparam-gui

3. 运行 mock 预览窗口

不接硬件时建议先跑这个:

uv run --extra gui sparam-gui-mock

它会直接注入模拟变量和持续变化的波形数据,用来确认界面布局、图表、值卡、右侧 inspector 和日志区域是否正常。

如何运行测试

cd host
QT_QPA_PLATFORM=offscreen uv run --extra gui --extra test pytest -q

当前覆盖了:

  • socket 模拟设备交互
  • 周期监测数据流
  • monitor store / ring buffer 行为
  • GUI 工作台骨架布局

如何运行 formatter / linter / type check

formatter

cd host
uv run --extra dev ruff format .

lint

cd host
uv run --extra dev ruff check .

type check

cd host
uv run --extra dev mypy cli.py gui sparam tests

一次跑完整质量门禁

cd host
uv run --extra dev ruff format .
uv run --extra dev ruff check .
uv run --extra dev mypy cli.py gui sparam tests
QT_QPA_PLATFORM=offscreen uv run --extra gui --extra test pytest -q

本地已验证

这次更新前我本地重新跑过:

  • uv run --extra dev ruff check .
  • uv run --extra dev mypy cli.py gui sparam tests
  • QT_QPA_PLATFORM=offscreen uv run --extra gui --extra test pytest -q
  • QT_QPA_PLATFORM=offscreen uv run --extra gui python -c "... MockPreviewController ..."

结果分别是:

  • All checks passed!
  • Success: no issues found in 22 source files
  • 5 passed in 0.60s
  • mock 预览离屏实例化成功,并确认状态为 Preview

备注

这个 PR 现在包含三部分提交:

  • feat(gui): 重构实时波形监测界面
  • chore(host): 引入 Python 代码质量工具链
  • refactor(gui): 重构监测工作台布局

第一部分对应 issue #1 的主体能力,第二部分是把 host 工程拉到可持续维护的状态,第三部分是在能力已经落地的基础上,把 GUI 进一步收敛到更适合实时调参的工作台结构。

[变更性质]
- 此提交是上位机 GUI 的功能升级,不是缺陷修复或纯样式微调。
- 此提交将旧的单文件界面重构为模块化界面,并补齐实时波形监测所需的数据层与 mock 预览入口。

[新增功能]
- 此提交新增基于 pyqtgraph 的实时波形显示、值卡、日志面板和拼贴式监测布局。
- 此提交新增 DeviceManager、MonitorStore 和 SamplePoint,用于接收周期采样流、缓存时序数据并向界面分发。
- 此提交新增 sparam-gui-mock 入口与周期推流模拟,支持在无硬件时预览界面与数据流。

[实现方案]
- 此提交将 host/gui.py 拆分为 host/gui/ 包,按主窗口、侧栏、顶部栏、波形、值卡、日志和样式分离职责。
- 此提交在测试中的 Socket 模拟设备上补充周期推流能力,并新增监测缓冲测试,覆盖持续采样与 ring buffer 行为。
- 此提交补充 pyqtgraph GUI 依赖与 lockfile 更新,使 mock 预览和正式界面走同一套渲染路径。

[影响范围]
- 影响 host/gui、host/sparam 和 host/tests 相关模块,以及 host/pyproject.toml 与 host/uv.lock。
- 运行方式新增 uv run sparam-gui-mock,原有 sparam-gui 入口继续保留。
- 已验证 cd host && uv run --extra test pytest -q 通过,现有主机侧测试保持绿色。
[变更性质]
- 此提交是主机侧工程的维护性建设,不是新功能开发或缺陷修复。
- 此提交在项目仍然较小时引入统一的 lint、format 与 type-check 工具链,并同步清理现有代码。

[维护内容]
- 此提交新增 Ruff、Mypy、.editorconfig、VS Code 任务与 README 开发说明。
- 此提交补充 host 目录的格式化、静态检查、类型检查与测试命令,并完善缓存目录忽略规则。
- 此提交将 host 侧现有模块补齐必要类型标注,修正连接抽象、GUI 方法签名与测试模拟类型。

[实现方案]
- 此提交在 host/pyproject.toml 中增加 dev extra,并集中配置 Ruff 与 Mypy 规则。
- 此提交更新 .vscode/tasks.json、host/README.md 与 .gitignore,使本地开发、验证与编辑器入口保持一致。
- 此提交调整 cli.py、host/gui、host/sparam 与 tests 中的类型边界与异常处理,确保工具链在现有代码上直接可用。

[影响范围]
- 影响 host 目录全部 Python 模块、开发配置文件与 lockfile。
- 本地质量门禁已验证通过:ruff format、ruff check、mypy、pytest 全部绿色。
- 运行时行为保持兼容,新增的是开发规范与静态质量保障能力。
[变更性质]
- 此提交是上位机界面的结构性重构,不是新增协议能力或缺陷修复。
- 此提交将现有监测界面从表单式工具布局调整为更适合实时调参的工作台布局,并同步收敛视觉层级。

[重构动机]
- 旧界面的色块层级过于平均,左侧表单、波形、值卡和日志之间缺少明确主次。
- 当前布局更像通用桌面工具,不能充分突出波形主视图,也没有形成稳定的 inspector 区域。
- mock 预览缺少界面骨架约束,后续继续调样式时容易把结构做散。

[重构方案]
- 此提交将主窗口重组为左侧控制栏、中央信号工作区、右侧 inspector 三段式结构,并将值卡区收敛为更轻的 signal stats strip。
- 此提交重写 GUI 样式色阶,区分页面底、壳层、面板、卡片和输入控件层级,同时收敛按钮、chip、图表网格和语义色的视觉权重。
- 此提交调整 toolbar、sidebar、waveform、value card、log panel 与 mock preview 的细节,并新增 GUI 布局测试钉住 workspaceShell、inspectorPanel 和 signalStatsStrip 三个关键锚点。

[影响范围]
- 影响 host/gui 下的主窗口、样式和主要部件,以及 host/tests/test_gui_layout.py。
- 界面行为保持兼容,监测、导出、mock 预览和现有数据链路仍按原方式工作。
- 本地已验证 ruff、mypy、offscreen pytest 全绿,mock 预览离屏实例化正常。
@luiox
Copy link
Owner

luiox commented Mar 27, 2026

/gemini review

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request significantly refactors the host tools, modularizing the GUI into a more maintainable structure and introducing a DeviceManager and MonitorStore for improved signal monitoring. It also enhances code quality by adding comprehensive type hints, configuring ruff and mypy, and providing VS Code tasks for development workflows. Review feedback suggests ensuring the "host quality" task executes the full suite of checks and recommends using explicit exception chaining and specific exception types in the ELF parser for better debugging and robustness.

Comment on lines +59 to +60
"type": "shell",
"command": "echo Host quality checks done",

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

当前 sparam: host quality 任务的 command 只是打印一条消息,并没有实际执行质量检查。为了确保此任务能够完整运行所有质量检查,建议将其 command 更新为按顺序执行 formatlinttype-checktest 任务的命令。

Suggested change
"type": "shell",
"command": "echo Host quality checks done",
"command": "uv run --extra dev ruff format . && uv run --extra dev ruff check . && uv run --extra dev mypy cli.py gui sparam tests && QT_QPA_PLATFORM=offscreen uv run --extra gui --extra test pytest -q",

Comment on lines +40 to +41
except ImportError as exc:
raise ImportError("pyelftools is required: pip install pyelftools") from exc

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

使用 from exc 进行异常链式处理是 Python 3 中的最佳实践,它能保留原始异常的上下文,有助于调试。

Suggested change
except ImportError as exc:
raise ImportError("pyelftools is required: pip install pyelftools") from exc
raise ImportError("pyelftools is required: pip install pyelftools") from exc

Comment on lines +69 to 70
except Exception:
continue

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

捕获特定异常(如 Exception)比使用裸 except 更具可读性和健壮性。这有助于区分预期错误和意外错误。

Suggested change
except Exception:
continue
except Exception:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

GUI Refactor: Real-time Waveform Visualization and Modern Interface

3 participants