laszlofeher-v/fynescope
GitHub: laszlofeher-v/fynescope
一款基于 Go 和 Fyne 工具包开发的 PicoScope 2000 系列示波器图形化控制软件,支持时域分析、FFT、波特图和多种触发模式。
Stars: 0 | Forks: 0

# fynescope
`fynescope` 是一款用于 PicoScope 2000 系列 PC 示波器的原型图形用户界面和控制 Linux 应用程序,使用 Go 语言编写,基于 Fyne 小部件工具包和 PicoScope 2000 系列 SDK。
## 主要功能与导航
应用程序运行后,你可以使用主标签页在不同的可视化和控制模式之间进行切换:
- **f(t)**:标准时域示波器视图。使用右侧的控制面板调整时基、信号显示插值、触发设置和通道属性(电压范围、耦合、偏移和持久性)。勾选 **Pers** 复选框可叠加连续的信号轨迹并跟踪历史记录。点击绘图底部时基标签旁边的放大镜图标,可打开 **Time Zoom**(时间缩放)窗口,该窗口作为捕获缓冲区的辅助宽屏概览,而主窗口则变为可移动的放大视口。
- **FFT**:用于频谱分析的快速傅里叶变换 (FFT) 视图。勾选 **Pers** 复选框可启用随时间持久跟踪频率幅度的功能。
- **f(f)**:频率响应分析标签页。用于执行自动频率扫描并生成波特图。所有已启用通道的幅度响应会自动绘制,相位绘制可单独切换。支持评估 1Hz 以下的频率(低至 0.01 Hz),并能与兼容 SCPI 的外部信号发生器无缝集成。
- **f(v)**:X-Y 绘图模式,适用于查看李萨如图形或通道间的相位关系。
- **Gen / ExtGen**:用于配置 PicoScope 内置任意波形发生器或已连接的外部 SCPI 信号发生器的控制面板。
- **Filters**:用于简单 **RLC** 滤波器(**仅限模拟器模式**)和数字 **filters**(FIR/IIR)的内置标签页。
- **Simulator Mode**(模拟器模式):使用内置模拟器,无需物理硬件即可探索界面。
## 快速开始
### 前置条件
- Ubuntu 24.04 或更高版本。其他发行版可能需要进行额外的设置。
- Fyne 2.6.1 或更高版本。请在 go.mod 中查看。
- Go 1.27 或更高版本。请在 go.mod 中查看。
- 用于编译 `fyne.io/fyne/v2` 和 CGo 绑定的标准 C 编译器及依赖项。
要使用**真实硬件**,还需要 PicoScope 驱动程序库:
- `libps2000`(PicoScope 2000 系列驱动程序)——可从 [Pico Technology 下载页面](https://www.picotech.com/downloads/linux)获取。
如果你只想在**模拟器模式**下探索 UI,则不需要 PicoScope 驱动程序。请使用 `noscope` 构建标签(参见下方的[构建说明](#building))。
### 构建说明
Linux 下的 Fyne 依赖项:
```
sudo apt-get update && sudo apt-get install -y libxrandr-dev libxcursor-dev libxinerama-dev libxi-dev libgl1-mesa-dev xorg-dev
```
Linux 下的 USB 依赖项(PicoScope 硬件和外部 SCPI 发生器支持必需):
```
sudo apt install libusb-1.0-0-dev
```
获取 go 依赖项:
```
go mod tidy
```
可以通过构建标签启用不同的功能来编译应用程序:
- `noscope`:在没有 PicoScope C 驱动程序库的情况下构建(仅限模拟器模式)。
- `scpi`:包含外部 SCPI 信号发生器模块(需要 `libusb-1.0-0-dev`)。
**构建示例:**
如果要在不需要 PicoScope C 驱动程序库且不支持外部 SCPI 发生器的情况下,纯粹为模拟器构建应用程序:
```
go build -tags=noscope -o fynescope .
```
如果要在安装了 libps2000 驱动程序并支持外部 SCPI 发生器的情况下构建应用程序:
```
go build -tags=scpi -o fynescope .
```
如果要在安装了 libps2000 驱动程序但不依赖 SCPI/USB 的情况下构建应用程序:
```
go build -o fynescope .
```
要嵌入版本号、构建日期和 git commit hash,你可以使用 `ldflags`。例如,使用简短的 git commit hash 作为版本号:
```
go build -ldflags="-X main.GitUUID=$(git rev-parse --short HEAD) -X main.BuildDate=$(date +%Y-%m-%d)" .
```
### 用法
直接运行应用程序。它会尝试检测已连接的 PicoScope 设备,并提示你选择一个。
```
./fynescope
```
要严格在模拟器模式(无连接硬件)下运行应用程序:
```
./fynescope -sim
```
了解更多选项,包括显示版本号、构建日期和许可信息,请运行:
```
./fynescope -help
./fynescope -about
```
#### 可用的命令行参数
| 参数 | 默认值 | 描述 |
|------|---------|-------------|
| `-sim` | `false` | 仅在模拟器模式运行(无需硬件) |
| `-screensize` | `1920x1080` | 设置屏幕大小缩放(例如 `1920x1080`、`1366x768`、`1280x720`、`1024x768`) |
| `-chcount=N` | `2` | 要模拟的通道数(仅限模拟器,1–4) |
| `-extgen` | `false` | 启用外部 SCPI 信号发生器标签页(需要 `scpi` 构建标签) |
| `-loglevel` | `warning` | 日志详细程度:`debug`、`info`、`warning`、`error` |
| `-profile` | `false` | 启用 CPU profiling(输出 `fynescope_0.prof`) |
| `-about` | — | 打印版本、构建日期和许可信息,然后退出 |
## 交互与控制
### 视觉指示器
- **数字滤波器警告**:每当对某个通道主动应用了数字滤波器(lowpass、highpass、bandpass 或 bandstop)时,所有可视化标签页(f(t)、f(v)、FFT、Bode、RLC)上该通道标签旁边都会显示一个警告图标 (⚠️)。以此提醒用户显示的信号已被主动修改。
### 鼠标交互
- **Play 图标**:
- 左键点击 Play 图标会启动 PicoScope 硬件或模拟器。
- **图表与绘图**:
- **滚轮**:在触发点上使用滚轮可改变 hysteresis(迟滞)。
- **通道标签**:在图形边缘的通道标签(例如 `chA`、`chB`)上点击并拖动或滚动,可快速调整相应通道的垂直偏移。右键点击通道标签可将垂直偏移重置为零。
- **时基控制**:在时基标签上左键点击并拖动或滚动以调整时基。点击放大镜图标可打开辅助的 **Time Zoom** 窗口。
- **Time Zoom 窗口**:当 Time Zoom 窗口处于活动状态时,你可以在主窗口上移动时间标签,以放大主窗口的不同部分。
- **通道控制**:在通道控件上左键点击并拖动或滚动以调整通道属性。
- **触发控制**:在触发控件上左键点击并拖动或滚动以调整触发属性。
- **触发位置**:在触发位置线上按住鼠标左键并拖动以移动触发位置。
- **测量游标**:在绘图上右键点击以切换测量游标。
- **输入控件(数字显示)**:
- 当鼠标悬停在数字输入(如频率或幅度设置)的某个数字上时,使用鼠标滚轮可快速增加或减少该特定数字的值。左键点击或使用 delete/backspace 键可清除焦点所在的数字。数字输入框也可以使用上/下方向键。左/右方向键可用于在数字输入框的各个数字间移动。可使用数字小键盘输入数值。
- **按钮/复选框**:
- 在按钮/复选框上使用左键点击以切换其值。
- 在通道按钮上使用右键点击可更改通道颜色。
- **滑块**:
- 在滑块上使用左键点击或鼠标滚轮可调整其值。
## 触发
### Simple Trigger(简单触发)
标准的单通道边沿触发。在触发类型选择器中选择 **Simple**,以使用具有可配置阈值和自动触发回退功能的基础上升沿或下降沿检测。
### Advanced Trigger(高级触发)
为主触发通道使用 PicoScope API 的 `SetTriggerChannelProperties` 和 `SetTriggerChannelConditions` 统一流水线。在标准的 **Level**(电平)触发(边沿检测)中,除了阈值外,还提供了可配置的 hysteresis(迟滞)。
### Window Trigger(窗口触发)
当信号进入、退出或穿过由上下阈值定义的指定电压窗口时触发。此模式在 f(t) 绘图上直接提供交互式边界。
### Interval Trigger(区间触发)
一种基于时间的限定条件,当*相同*极性的两个连续边沿之间的时间间隔满足特定的时序约束时触发:**Less Than**(小于)、**Greater Than**(大于)、**In Range**(在范围内)或 **Out Of Range**(在范围外)。硬件区间触发流水线与高级边沿条件无缝集成,可同时评估电压阈值和持续时间。
### Pulse Width Trigger(脉宽触发)
一种基于时间的限定条件,当脉冲(*相反*极性的两个连续边沿之间的持续时间)满足特定的时序约束时触发:**Less Than**(小于)、**Greater Than**(大于)、**In Range**(在范围内)或 **Out Of Range**(在范围外)。
### Complex Trigger(复杂触发) ⚠️ 实验性功能
复杂触发允许你使用 AND 逻辑在**多个通道同时**定义触发条件。它直接映射到 PicoScope 2000 系列 API 调用 `ps2000aSetTriggerChannelProperties`、`ps2000aSetTriggerChannelConditions` 和 `ps2000aSetTriggerChannelDirections`。
#### 启用复杂触发
通过勾选主触发控制面板中的 **Cmpx** 复选框来启用此功能。
#### 分通道配置
启用 **Cmpx** 后,每个活动通道的控制面板中都会出现一个条件下拉菜单。这允许你为每个通道独立配置触发条件:
- **Condition**:`Don't Care`(忽略)/ `True`(真)/ `False`(假)——该通道是否必须参与触发条件。
- **Direction、Threshold 和 Windows**:用于评估的标准通道触发设置(Direction、Threshold、Hysteresis、Mode)。现在全面支持跨通道并发的复杂 **Window** 触发,利用每个通道独立的 Upper Threshold(上限阈值)、Lower Threshold(下限阈值)、Upper Hysteresis(上限迟滞)和 Lower Hysteresis(下限迟滞)。
这些设置会保存在设备的 YAML 设置文件中,并在下次启动时恢复。你也可以在 f(t) 绘图上**点击并拖动**视觉触发点指示器,从而在屏幕上直观地调整每个通道的上限阈值、下限阈值及其各自的迟滞边界。
#### 触发逻辑
在复杂模式下,只有当所有条件为 `True` 的通道**同时**满足其边沿/电平要求(AND 逻辑)时才会触发。设置为 `Don't Care` 的通道将被忽略。
**示例**:当通道 A 出现高于 500 mV 的上升沿**且**通道 B 低于 −200 mV 时触发:
- ChA:`Condition=True`,`Direction=Rising`,`Threshold=500`
- ChB:`Condition=True`,`Direction=Falling`,`Threshold=-200`
- ChC、ChD:`Condition=Don't Care`
#### 模拟器支持
软件模拟器完全支持复杂触发评估,包括 AC 耦合模拟(使用物理上精确的 1 Hz highpass 滤波器)。在每个模拟的时间步长中,所有活动的通道条件都会被同时评估。模拟器能准确跟踪 Window 触发边界(Enter/Exit 方向规则)的状态,并以采样精度评估 Interval(Pulse Width)持续时间。触发将在满足所有 `True` 条件和时间约束的第一个时间步长发生。复杂模式下不应用子采样插值——触发精度为采样分辨率。
#### 限制与已知问题
- **实验性功能**:复杂触发正在积极开发中。尚未使用真实的 PicoScope 硬件进行全面验证。
- **仅支持 AND 逻辑**:此版本不支持跨通道的 OR 条件。
- **单一条件块**:仅向 API 发送一个 `TriggerConditions` 块;UI 中尚未提供多个重叠条件块的功能。
## 设置与配置
`fynescope` 会自动保存你的应用程序设置,例如通道配置、触发设置、UI 窗口大小和其他首选项。
这些设置保存在工作目录下的 YAML 文件中。文件名特定于设备,这使你可以为不同的 PicoScope 设备或模拟器维护单独的配置:
- `scopesettings_1_1.yaml`(模拟器模式)
- `scopesettings_
.yaml`(例如 `scopesettings_GQ123_456.yaml`)
**恢复默认设置:**
要将所有设置恢复为默认值,只需删除或清除相应 `.yaml` 设置文件的内容。应用程序将在下次运行时自动使用默认值重新生成它。
*注意:设置文件包含校验和,可防止以外或不支持的手修改。如果你手动编辑了该文件,校验和验证将会失败,`fynescope` 将丢弃你的更改并恢复为默认设置。*
## 测试
该项目包含了所有主要包的单元测试。**重要提示:**没有针对真实硬件的测试规范。所有测试均严格使用内置的软件模拟器进行。因此,测试完全在没有任何 PicoScope 硬件的情况下运行——只需使用 `noscope` 标签即可排除 CGo 驱动程序依赖。
### 运行所有测试(无需硬件)
```
go test -tags=noscope ./...
```
### 自动化 UI 模糊测试(随机测试)
顶级 `fynescope` 包测试包含一个自动化的 UI“随机测试”,以确保应用程序的稳定性。在运行测试套件时,应用程序会通过编程方式在各个标签页和控件上,模拟在设定持续时间内快速、随机的用户交互——例如鼠标点击、拖动、滚动和键盘输入。这有助于捕获在异常使用期间可能发生的竞态条件、意外 panic 和 GUI 卡死问题。
要专门运行自动化 UI 测试套件(例如 `Test0`)并使用软件模拟器、详细输出和延长的超时时间:
```
go test -v -tags=noscope,testsw -run Test0 -timeout 105m
go test -tags=noscope -timeout 99999s
go test -tags=noscope -tags=testsw -v
go test -v -tags=noscope -tags=testsw -run Test0 -timeout 105m
time go test -tags=noscope -tags=testsw -v -timeout 99999s
```
### 各包的测试覆盖率
| 包 | 测试内容 |
|---|---|
| `control/` | 通道状态机、屏幕时间和 ETS 时序、插值模式、流模式转换、内置发生器状态 |
| `control/scpi/` | SCPI 命令构建器和解析器 |
| `gui/` | FIR/IIR 数字滤波器应用、频率转换辅助程序、Bode 扫描光栅逻辑 |
| `sim/` | 模拟器波形生成、数字滤波器模拟 |
| `genericps/` | 通用 PicoScope 设备注册表及打开/关闭生命周期 |
| `settings/` | 设置保存/加载、校验和验证 |
| `disp7/` | 七段显示小部件:数值设置、数字编辑、键盘/鼠标/滚动交互 |
| `checkcolorpick/` | 颜色选择器复选框小部件的交互和渲染 |
| `tastybutton/` | 自定义按钮小部件的鼠标状态和渲染 |
| `selectscroll/` | 可滚动选择器小部件的选项解析和滚动 |
| `sliderscroll/` | 可滚动滑块小部件 |
| `fynescope` / `main` | 顶级应用程序集成冒烟测试 |
## 限制
`fynescope` 是一个专注的早期阶段项目。它仅在 Ubuntu 24.04 上使用 PicoScope 2407B 进行了测试。与官方的 [PicoScope 7](https://www.picotech.com/oscilloscope/2000/picoscope-2000-overview) 软件相比,以下功能**未**实现。此列表并不详尽——可能还存在其他差异。
**平台与硬件**
- **仅限 Linux**:PicoScope 驱动程序的 CGo 绑定是 Linux 特有的。不支持 Windows 和 macOS。
- **仅限 PicoScope 2000 系列**:绑定于 `libps2000` 驱动程序;不支持 PS3000、PS4000、PS5000、PS6000 等。
- **不支持 MSO**:未实现混合信号示波器变体上的数字通道。
- **仅限单设备**:不支持同时使用多个 PicoScope 设备。
**显示与导航**
- **UI 仅支持英文**:应用程序界面仅提供英文版本;不支持本地化为其他语言。
- **垂直缩放限制**:虽然通过 Time Zoom 功能支持水平放大,但不支持垂直缩放或任意的多视口缩放。
- **无标尺**:不可使用屏幕上的测量标尺/游标。
- **无多重视口**:一次仅显示每个信号域的单个视图。
**测量与分析**
- **测量功能受限**:仅提供少量内置测量功能。PicoScope 7 提供了数十种自动化参数(THD、SINAD、过冲、相位、功率因数等)。
- **无 DeepMeasure**:不可对数百万个采样点进行逐周期的统计分析。
- **无掩膜测试**:不支持用于波形验证的通过/失败掩膜极限测试。
- **无数学/虚拟通道**:未实现计算通道(例如 A+B、积分、微分、滤波器)。
**FFT / 频谱分析仪**
- **无 FFT 显示模式**:仅显示瞬时 FFT。PicoScope 7 还提供平均和峰值保持累积模式。
- **无频率轴控制**:FFT 跨度始终覆盖完整的采样带宽。PicoScope 7 允许你设置明确的起始/停止频率。
- **无频谱测量**:不提供频域自动测量功能(THD、THD+N、SNR、SINAD、IMD)。
- **无频谱掩膜**:不支持频域中的通过/失败掩膜极限测试。
- **无频谱缓冲区**:PicoScope 7 可以存储和回放数千个频谱快照;而 `fynescope` 仅显示当前帧。
**触发**
- **无 dropout / runt 触发**:已全面实现了边沿(Simple、Advanced)、Window(带方向控制:Enter/Exit/Any)、Interval(Pulse Width 滤波)以及实验性的多通道 Complex 触发。其他高级硬件模式(如 dropout、runt 和逻辑触发)目前尚未实现。
- **复杂触发为实验性功能**:详情及已知限制请参见 [Complex Trigger](#complex-trigger--experimental) 部分。
**协议与数字**
- **无串行总线解码**:不提供协议分析功能(PicoScope 7 中的 UART、SPI、I²C、CAN 以及 39 种以上的解码器)。
**波形管理**
- **无波形缓冲区/存储**:不支持捕获和浏览包含数千个波形的历史记录。
- **无参考波形**:不可存储和叠加先前捕获的波形以进行比较。
- **无波形导出/导入**:不支持从磁盘保存或加载波形(例如 `.psdata`、`.csv`)。
**信号发生器**
- **无任意波形发生器 (AWG)**:仅支持标准波形;不可从 CSV 导入自定义波形或手动绘制。
## 调试
`fynescope` 包含用于调试和性能分析的内置工具:
### 日志
你可以使用 `-loglevel` 参数调整应用程序的日志详细程度。可用的级别包括 `debug`、`info`、`warning` 和 `error`。默认情况下,日志级别为 `warning`。
```
./fynescope -loglevel=debug
```
*注意:对于开发者,可以通过修改 `main.go` 中的 `debugOn` map 来启用针对特定源文件的目标调试。这允许在全局日志级别设置得更高时,依然能为特定组件输出详细的调试日志。*
### CPU Profiling
要分析应用程序的性能,你可以使用 `-profile` 参数启用 CPU profiling。这将生成一个 `fynescope_0.prof` 文件,可使用 `go tool pprof` 进行分析。
```
./fynescope -profile=true
go tool pprof fynescope fynescope_0.prof
```
## 开发工具
`fynescope` 是使用以下工具开发的:
- **[LiteIDE](https://github.com/visualfc/liteide)** ——整个项目中使用的主要 Go IDE。
- **[Antigravity](https://antigravity.dev)** ——由 Google DeepMind 提供的 AI 驱动的编码助手,用于结对编程、重构和文档编写。
- **AI 助手**——使用了各种 AI 语言模型来协助设计算法、编写代码、代码审查以及编写测试和文档。
## 许可
该项目采用 BSD 3-Clause 许可协议授权——详情请参阅 [LICENSE](LICENSE) 文件。
它还整合了来自其他开源项目和硬件供应商的代码及 API 结构。有关第三方库和 API 许可的更多信息,请参阅 [THIRD_PARTY_LICENSES](THIRD_PARTY_LICENSES) 文件。
版权所有 (c) 2026, László Fehér标签:EVTX分析, FFT, Fyne, Go, GUI, Ruby工具, 信号分析, 日志审计, 硬件控制, 示波器