--------------------------------------------------------------------------------
软件下载与售后支持、需求提出
--------------------------------------------------------------------------------
官网marrychip.com
逻辑分析仪QQ群：389908364
FPGA/IC吹水群：377248676
雷电扩展坞群：807604723
--------------------------------------------------------------------------------

    PXView V1.6.2修改
    时间：2026年9月12日
    变更如下：

    【新功能】
    *新增 widget-free 渲染库 pxview-render（CMake/render_sources.cmake）：标尺、光标、信号绘制等渲染代码脱离 Qt Widgets 独立编译，渲染层与 GUI 层解耦

    【重构】
    *渲染层与 GUI 层解耦重构（渲染资产单一编译、多前端壳复用的架构前提）：新增 IRenderView/IRenderViewport 抽象接口（iview_delegates.h，覆盖几何/游标/主题色/缓存桥等视图状态），View/Viewport 实现接口，Trace/Signal 系渲染对象对 View/Viewport 的具体指针引用改为接口注入；17 个渲染翻译单元（render_pass/viewport_painter/trace 系/signal 系/cursor 系/dso_measure/dso_trigger_config）迁入 pxview-render 并经 nm 扫描验证零 Widgets 符号；Ruler 刻度绘制本体抽取为 widget-free ruler_paint（Ruler 委托调用）；decodetrace 的 create_popup 弹窗构建拆至 GUI 侧独立翻译单元 decodetrace_popup.cpp，解码绘制本体保持可无 Widgets 编译；DecoderModel（纯 QtCore QAbstractTableModel）从 pv/view/trace 平移进 pv/data/model（moc 随实现编入 pxview-data）；selectableitem/dockfonts 的 QApplication::palette()/font() 依赖改为 provider 注入（main.cpp 启动时安装，表达式与原实现一致）——pxview-render 仅链接 Qt6::Gui，直调 QApplication 为 incomplete type 编译错误
    *Core 层 Widgets 依赖清零：appconfig.cpp 的 QApplication → QCoreApplication（organizationName/applicationName 系 QCoreApplication 静态成员，7 处 QSettings 键读取点行为等价）——此前为 Core 层唯一 Widgets 泄漏点，使 pxview-core"零 Qt Widgets"硬约束（无头产物与多前端壳共链的架构前提）名存实亡
    *TabContext 无渲染层路径（view==nullptr）支持：restore_view_data/finalize_view/apply_device_intent 三处 _view 解引用点补最小空守护——无 View 的 tab（无头/远控场景）激活时跳过显示层操作，不扰动全局显示状态；Widgets 版恒传真 View，行为不变
    *数据模型重构步骤7（数据代状态机澄清收敛，documentregistry/sigsession/sessiondocument）：
      - 数据代 DataGeneration 访问器全部经 _capture_state_mutex 串行化，data_generation() 返回锁内值拷贝（写点分布 GUI 主线程与 worker 线程）
      - 新增数据代回边 on_capture_frame_started（Frozen→Live 唯一入口）：repeat 连续帧首包（CollectStart 事件）按 owner 归属幂等回边，对齐"执行缓冲正被新一帧重写"的实时语义
      - copy_data_to_document 改返回 bool 门控状态演进：RevEndPacket 仅在数据实际落地时置 Stopped/Frozen，维持 "Stopped ⇒ has_data()" 不变式；release_capture_owner 的 Live 出口按 owner doc 是否持有完整数据收敛为 Frozen/Empty
    *统一数据绑定裁决器 DocumentRegistry::resolve_data_binding：tab 激活绑定（restore_view_data）与渲染数据源（document_snapshot_source）共用唯一裁决表，消除双轨实现漂移；None 判定下外来 ctx 采集返回 nullptr（空白 tab 恒定空白）；tab 渲染身份无条件绑定，修复首次采集进度条/ruler 整场空白
    *显示/执行状态双轨分工（数据模型澄清）：per-tab ViewDataSync::_display_status（显示层：本视图正在显示什么）与全局 _device_status（执行层：采集引擎是否在跑）语义分离；tab 激活绑定（restore_view_data）不再写全局 ST_*（删除原 !is_working() 门控的 set_stopped_status/set_init_status 双写——tab A 采集中切到 tab B 时 B 的显示状态迁移被跳过，是双轨未收敛的根因），改维护 per-tab 状态并由帧事件延续（frame_began→Running、receive_end→Stopped）；交互判定（viewport_interaction/viewport_drag）有意保留全局执行态——"设备忙（任何 ctx 采集进行中）禁止缩放/拖拽/边沿导航"是执行层语义（阶段 9 既定决策），显示/执行分工注释固化于 pxvdef.h
    *SessionDocument::SessionState 状态机澄清（状态机 B）：删除死状态 Copying（零拷贝删除拷贝线程后全仓无任何转移点）；语义契约固化——Idle=无可显示数据（clear() 回此态）、Collecting=本 doc 是采集 owner 且采集进行中（唯一写入点 start_capture）、Stopped=最近一代数据已落地可显示；两条不变式成立并写入注释："Stopped ⇒ has_data()"（RevEndPacket 仅在拷贝实际落地时置位，修复导入路径"有数据但 Idle"破洞的同时不引入"Stopped 但无数据"反向破洞）、"数据清空 ⇒ Idle"全路径成立（clear() 是唯一清快照方法，无私改路径）；_state 原子化（std::atomic），消除 Collecting 主线程写/Stopped worker 线程写/is_collecting 主线程读的跨线程无锁读写
    *渲染管线显示判定收敛：ruler_paint/render_pass/viewport_painter/decodetrace 的 stopped/init/running 判定统一改走 IRenderView per-tab 接口（接口新增 is_stopped_status/is_running_status/is_init_status 虚函数，View 转发 ViewDataSync），不再读全局 session 执行态，其他 ctx 采集时本 tab 完整测量/游标标签不再被错误抑制；SessionDocument 覆写 DataSource 的 is_stopped_status/is_running_status，doc 绑定的信号视图（dsosignal/analogsignal/mathtrace/dso_measure）获得真实显示状态而非恒 false 的 stub；is_run 类硬件/拨盘执行检查保留全局（执行语义正确）
    *数据源消费端空守护（15 处）：document_snapshot_source() 在"外来 ctx 采集 + 本 tab 无历史数据"场景返回 nullptr 后，历史无判空直接解引用的消费点全部补齐——view_data_sync 的 pixel2index/capture_init/show_region/mode_changed/auto_set_max_scale/get_index_delta/resizeEvent/receive_end、View::set_trig_pos、ViewLayout 的 limit_scale_offset/update_scale_offset/get_scroll_layout/get_max_offset、ViewCursors 的触发/搜索游标与 set_cursor_middle/get_cm_time/get_cm_delta；判空策略为跳过或回退空值，正常单机路径行为不变（nullptr 仅在原会读到他人实时数据的污染场景出现）
    *借用与文档绑定收敛修复：CopyToDocDone 处理（event_dispatcher）改绑渲染文档而非所有权文档——借用态数据落在被借的文件池槽（=渲染文档），绑所有权文档会使本 tab 视图指向旧数据/空文档（双轨失同步；owner 态两者相同、行为不变）；rebind_tab_to_fresh_document 绑新空文档而非 nullptr（空文档绑定对全部 document_ptr() 消费点与 nullptr 行为等价且同样清残留快照，此后 document_ptr() == render_document() 恒成立——统一裁决器的 owned_by_me/doc_collecting/gen_owner_is_render_doc 三项身份输入不再有"绑 nullptr 期间整场采集被误判外来"的失真窗口）；TabContext::activate 借用回落后重试恢复本 tab 自身设备（TabSwitch 语义，避免本 tab 通道配置被 apply_device_intent 写到当前全局外来设备；仍失败才置 NULL_HANDLE 走 reload 兜底）；headless 无 owner doc 采集定义为合法行为（数据仅存会话执行缓冲，doc 保持 Idle——定义行为而非遗漏）；文件池槽重放走同一采集管线，数据代 Live/Frozen 语义对借用 tab 完全适用（claim_active_document 定义行为注释）

    【问题修复】
    *修复 tab 栏右键菜单"关闭其他/关闭右侧"无效：信号转发链在 DraggableTabWidget→TabManager 断裂（仅连接了 tabCloseRequested），补齐 tabCloseOthersRequested/tabCloseRightRequested 连接并新增批量关闭处理器（自最高索引向下关闭避免列表移位）（draggabletabwidget.cpp、tab_manager.cpp）
    *修复采集进行中切换 tab 触发断言失败与 SIGSEGV：SamplingBar::bind_context 恢复 per-tab 采集模式时触发 set_collect_mode 断言，断言对话框模态泵事件使排队的 DataUpdated 在 dock 重绑定间隙重入派发，MeasureDock 悬空 _view 空指针解引用；set_collect_mode 改为采集进行中拒绝+告警，MeasureDock update_dist/update_edge/update_cursor_info 加空视图守护（capturemanager.cpp、measuredock.cpp）
    *修复功能坞的字符串资源页面参数（dock_manager.cpp）

    【清理】
    *删除 DataGeneration 冗余 device_handle 字段
    *移除 copy_data_to_document 在正常路径必触发的 Tripwire 断言：拷贝（零拷贝共享）发生在数据代 Live 期属设计内时序（RevEndPacket 唯一落地路径 + restart_decoders 等），"Live 期禁止拷贝"的判定前提与设计矛盾；改为在函数头固化结构约束注释（doc 快照唯一写入路径、只在 RevEndPacket 后调用——release_capture_owner 的 Live→Frozen/Empty 判定依赖此保证）

    PXView V1.6.1修改
    时间：2026年9月7日
    变更如下：

    【新功能】
    *新增 pxviewd 无头守护进程：headless 能力提升为一等公民产物，与 GUI 共享 pv::run_headless 运行时（不链接 Qt Widgets，控制台子系统），随包分发并在 CI 中接入（main_daemon.cpp、CMake 工程）
    *pxview-cli 免 pip 随包分发，新增开始菜单 CLI 入口，CI 打包接入 pxviewd/cli 产物（packaging/）
    *打包并加载 sigrok 固件文件（packaging 与固件加载路径）
    *解码器数据导出：All 多栈模式下支持同时导出全部解码器数据（storesession/导出流程）

    【重构】
    *Session-Centric 多 tab 架构演进（阶段1-11）与 SigSession 收缩第一批（阶段13）：采集/解码/数据摄入/文档注册/测量/光标等职责拆分为独立管理器，SessionStateContext 打破 SigSession 与各 manager 的环依赖（core/、session/）
    *数据模型重构（核心原则："Document 是唯一数据真相与所有权单元；tab 只是视图窗口；设备只是文档的数据来源适配器"，步骤1-7）：
      - 设备键控数据池 + 文档层引用计数化 + 设备身份单一失效点 FileDeviceClosed（documentregistry、sessiondocument）
      - TabContext 收缩为视图句柄：所有权不可变（文档与设备身份创建时定死），新增渲染借用语义（borrow_document/release_borrow，tab 标题"⇢ 来源"角标，切回非文件设备或属主关闭时自动解除）——"导入文件后其他标签页被静默变成文件设备"一类混乱根除
      - SignalModel 列表归 SessionDocument 所有，全局访问器转发到活动/渲染文档，stash/take 搬运机制删除，"全局模型列表空窗期"消除
      - 显式数据代状态机（Empty/Live/Frozen + owner_doc + device_handle）：数据落文档仅由 RevEndPacket 拷贝路径负责，视图绑定裁决查表化（历史绑文档/实时绑缓冲/否则清空），新建空白标签恒定空白
      - DeviceManager 执行租约仲裁（acquire/release，libsigrok 单 sr_session 独占的显式化，忙则拒绝）；_saved_device_handle 单槽记忆机制退役
      - 模型写入守卫：借用过渡期（渲染文档设备≠当前设备）禁止 init_signals/reload 写入，杜绝跨设备模型污染
    *新增多 tab 集成契约测试（tests/qtest/core/test_multi_tab_session）

    【问题修复】
    *修复文件设备 "keeping" release 误调 sr_dev_close 销毁 virtual-session 会话上下文，导致 pxl 重放报 "(null)" 失败（deviceagent.cpp）
    *修复执行租约获取顺序（须先交还旧设备租约再获取新租约），此前任何 set_device（含打开 pxl）都被误判 "lease busy"（sigsession.cpp）
    *修复新建空白标签无通道且无法采集：模型原位恢复要求文档实际持有 SignalModel，空列表回退 reload 构建（tabcontext.cpp）
    *修复借用中关闭属主标签的堆损坏（c0000374）：渲染文档改用 weak_ptr 持有，remove_tab 在列表移位前捕获当前 tab（sigsession.cpp、tab_manager.cpp）
    *修复设备下拉选中项时 SIGSEGV：DsComboPopup（WA_DeleteOnClose）在 setCurrentIndex 同步触发设备切换时被销毁，on_item_clicked/eventFilter/changeEvent 三条 close 路径加 QPointer 自保守卫（dscombobox.cpp）
    *修复文件 tab 切换到 demo 设备后整页空白且数据孤立：删除 CurrentDeviceChanged 中换绑残留块、模型写入守卫前置到任何清空动作之前、设备下拉统一路由（文件会话上选择 demo/硬件跳转对应会话 tab）（event_dispatcher.cpp、sigsession.cpp、mainwindow.cpp）
    *修复 Windows 包内 pxview-cli 源码路径错位（packaging）
    *修复 sdcc 4.6.x 在 MSYS2 下无法解析系统头文件与找不到运行时库（固件构建）
    *修复 ui_hooks.h 被 .gitignore 吞掉导致的 CI 编译失败，固件验证降级为警告

    【清理】
    *移除 Application/SlidingDrawer 事件级 profiler 临时埋点

    PXView V1.6.0修改
    时间：2026年9月4日
    变更如下：

    【新功能】
    *设备意图协议与设备变更裁决重构（Phase 1-5 多阶段重构，从"启发式补丁 + 时序巧合"升级为"显式语义 + 架构保证"）：事件语义化——新增 DeviceChangeReason 枚举（FirstInit/UserSelection/TabSwitch），CurrentDeviceChanged 携带 {reason, handle}、DeviceModeChanged 携带 {mode, reason}，SigSession::set_device/set_default_device 增加 reason 参数（默认 UserSelection，既有调用点零改动）；删除 has_signal_config() 启发式，事件调度改为显式 reason 裁决，正确性不再依赖事件时序巧合（events.h、sigsession.cpp、event_dispatcher.cpp、mainwindow.h）
    *配置单一真相来源：标签页设备/通道状态通过 TabContext::apply_device_intent()/harvest_device_state() 在各自文档中持久化；设备 profile 自动加载只在"设备身份变更"（FirstInit/UserSelection）时发生，TabSwitch 绝不加载 profile（tabcontext.cpp/.h、event_dispatcher.cpp）
    *设备意图协议正式化：TabContext::activate/deactivate 收敛为意图协议调用，契约写入头文件注释
    *时序确定性：新增 loading_device_profile 标志 + 排队清除，抑制 profile 加载内部 CHANNEL_MODE 连锁导致的双重 profile 加载（即历史日志中"一次设备选择双份刷新"的根因）（mainwindow.h、event_dispatcher.cpp）
    *清理：删除 on_tab_changed 的 restore_previous_device() 兜底（所有建签路径均已记录 per-tab handle），并更新三处过时注释
    *事件瀑布收敛：为 DeviceOptionsUpdated 事件增加 skip_model_reload 标志，仅由 TabContext::apply_device_intent() 在已显式重建后置为 true，SigSession 据此跳过二次全量 reload；其余广播点行为不变，GUI 的通道名/布局刷新照常执行（sigsession.cpp、tabcontext.cpp）

    【问题修复】
    *修复多标签页下设备/通道状态错乱：文件设备不再随全局设备切换被释放，改由所属标签页主动释放；每个标签页绑定自己的设备句柄，切换标签时自动恢复对应的设备与配置（deviceagent.cpp/.h、storesession.cpp、file_ops.cpp、tabcontext.cpp）
    *修复启动时 demo 标签页被错误绑定设备句柄的缺陷：on_load_device_first() 改为先完成默认设备初始化再记录句柄，避免把残留的 VCD 文件设备句柄记到 demo 标签，导致切回 demo 时恢复成错误的设备与通道数（mainwindow.cpp）
    *修复采集结束后波形轨道被整体清空的渲染缺陷：on_signals_changed() 原先误用快照源读取空的 SignalModel 列表，重建时删光已有信号却生成 0 个，导致波形轨道消失；现改为始终以 SigSession 持有的 SignalModel 为准（view_signal_sync.cpp）
    *通道名称、启用状态与类型统一以 SignalModel 为唯一可信源：设备选项面板与 .pxc 配置序列化均改为经 SignalModel 读写，重命名后的通道能在设备选项界面和保存的配置中正确显示自定义名称（deviceoptionsdock.cpp/.h、deviceoptions.cpp、storesession.cpp、signalmodel.cpp/.h）
    *修复信号过滤（毛刺滤波）的通道遍历顺序错误：glitch_filter_task 改用 SignalModel 列表（按 index 排序）遍历，确保通道索引与反相映射对应正确（filterprocessor.cpp）
    *修复切回已配置标签页时自定义设置被 profile 覆盖：此前每次 CurrentDeviceChanged（异步 queued）都会触发 load_device_config() 重新加载 demo0.pxc 等默认 profile，把标签页已保存的通道数/header 名覆盖回默认值（"切回 demo 后通道数和 header 名被还原"的真正根因）；现以 ev.reason != TabSwitch 守卫 on_current_device_changed 与 on_device_mode_changed 两处 load_device_config() 调用，TabSwitch 跳过自动 profile 加载、保留标签页自定义配置，首启/新设备首次选择因尚无 config 仍正常加载 profile（event_dispatcher.cpp）
    *修复 Linux 已安装 WebKit 仍误报未检测到的问题
    *修复 Linux 卸载脚本（pkexec）提权失败：执行失败时回退 sudo 而非直接退出，避免从桌面快捷方式调用时无提示失败
    *卸载桌面项的图标由通用的 edit-delete 改为 PXView 自带图标，确保正常显示并与主菜单风格一致
    *修复 Linux 在虚拟机 / 无 GPU 环境下 WebKit 初始化白屏：GTK/WebKit 初始化前按运行环境自动选择合成模式，虚拟机或无 GPU 时退回软件合成，其余默认硬件加速（web/src-tauri/src/lib.rs）

    【构建与工程】
    *用自解压 .sh 安装器取代 AppImage/linuxdeploy 的分发方式：新增 packaging/bundle-runtime-libs.sh 以白名单方式拷贝 Qt 运行时与插件、GCC 运行时、Python 标准库、libsigrok/libpython 等私有依赖，刻意不打包 WebKitGTK/GTK/GStreamer/GLib/X11/Wayland 等桌面栈，避免 ABI 混搭造成窗口白屏；并重写 packaging/check-webkit-stack.sh（安装树黑名单递归扫描去重），删除 AppImage 专用的 packaging/pxview-AppRun
    *新增系统安装器与打包脚本：packaging/install.sh + make-installer.sh 产出自解压安装器，安装到 /opt/PXView，自动处理 udev 规则、图标、.desktop、CLI 封装、桌面快捷方式与 uninstall.sh；CMake install_packaging.cmake 现在一并发装 libsigrok 的 udev 规则，使安装器成为 USB 设备权限的唯一归属，不再单独上传 udev 压缩包；CMakeLists 为 Linux 增加 INSTALL_RPATH，安装树靠 RUNPATH 解析自带库；build_linux.sh 不再捆绑 WebKit 栈
    *自解压安装器产物后缀由 .sh 改为 .run；升级改为工业级暂存切换（staged swap）：旧版本树原子改名暂存→安装新树→自检→提交删除，任一步失败自动回滚到升级前状态；安装前缀之外的所有文件（udev 规则/CLI 封装/.desktop/图标/桌面快捷方式）记入 .pxview/manifest.txt 清单，卸载与升级按清单精确清理并以通配兜底；.pxview/install.json 版本标记防止误接管非 PXView 目录（PXVIEW_FORCE=yes 强制接管）；检测到运行中的 PXView 默认拒绝升级以保护采集中数据（PXVIEW_KILL_RUNNING=yes 自动结束）；PXVIEW_OVERWRITE=yes 纯覆盖、PXVIEW_KEEP_OLD=yes 保留旧版备份；补全卸载入口与桌面项（.desktop/快捷方式）清理
    *NSIS 安装器补充安装目录保护：拒绝盘根与系统目录（C:\、Windows、Program Files 等）作为安装目标，防止卸载时 RMDir /r 误删
    *Linux 自解压安装器改用标准 makeself 生成：仅嵌入 MD5 校验（--nocrc 去除 CRC，运行时单遍校验最快；自动校验，亦可 --check 手动触发）、支持 --target/--noexec/--keep 等标准运行参数、解包前预检 root 权限；产物仍为 .run 单文件，packaging/install.sh 的安装与升级逻辑不变
    *修复严格 umask（如 077）环境下安装的图标/.desktop/udev 规则/资源文件为 600，普通用户无法读取导致桌面图标不显示、应用菜单异常：安装器固定 umask 022 并对安装树与系统集成文件显式归一化权限；GNOME 下 gio 的 trusted 标记补传用户会话总线地址
    *更新应用图标（logo.png / logo.svg），并同步更新 README/INSTALL 文档措辞以反映新的 .sh 安装器分发方式
    *版本号提升到 1.6.0（CMakeLists.txt、README 版本徽章、CI 默认版本、NSIS 安装脚本）

    【测试与 CI】
    *更新 GitHub Actions 依赖版本：actions/checkout v4→v7、actions/upload-artifact→v8、actions/setup-node v4→v6；为 Homebrew 配置 HOMEBREW_NO_REQUIRE_TAP_TRUST，消除 tap 信任警告
    *放宽 ASan/TSan 看门狗与单测超时（方案 A）：ASan 看门狗 120→600、pytest 超时 120→600、任务超时 30→60 分钟；TSan 看门狗 120→900、pytest 超时 300→900、任务超时 30→90 分钟，保留完整 capture 端到端覆盖，避免慢速 sanitizer 进程被误杀
    *macOS-debug 默认不再自动构建：push 到 main 时不再在 macos-14 上完整编译并跑 lldb，以节省 macOS runner；需要抓取崩溃 backtrace 时仍可通过手动 workflow_dispatch 构建并上传产物
    *修复 CI 渲染检查的依赖包安装与提示：修正 xwd 实际属于 x11-apps 而非 x11-utils，更新 apt 包列表与错误提示；新增 tests/ci/check_window_render.py 做像素级窗口渲染校验
    *CI 新增 Linux 安装/卸载冒烟测试与安装器制品上传；随后又移除了 build.yml 中 PXView/PXView-Agent/窗口渲染的安装树冒烟测试步骤以简化 CI 流程
    *新增单元测试覆盖 SignalModel 与 libsigrok 结构体的双向同步（tests/qtest/data/test_signal_model.cpp）

    PXView V1.5.9修改
    时间：2026年9月3日
    变更如下：

    【新功能】
    *新增 Linux AppImage 统一入口分发器 pxview-launcher：单个 AppImage 只能暴露一个 AppRun，新增的分发脚本按首个参数路由——无参数启动经典 PXView GUI，`agent`/`--agent` 启动 PXView-Agent（Tauri 桌面端），另支持 --print-target（供 CI 校验解析目标）与 --help；配套新增 packaging/pxview-AppRun 作为 AppImage 的 AppRun 入口，负责设置 APPDIR/PATH/LD_LIBRARY_PATH 后把参数转交分发器
    *Linux 桌面文件 PXView.desktop 新增多模式启动项：TryExec/Exec 改为 pxview-launcher，并新增 Classic / Agent 两个 Desktop Action，可在应用菜单中直接选择启动经典界面或 Tauri Agent

    【问题修复】
    *修复导入文件（VCD/CSV/WAV/STF 等）后主界面卡在"停止"状态无法恢复：此类采集不产生任何数据包，永远走不到 SR_DF_END，而 CollectEnd 是唯一能复位 View 运行态的事件，导致 Start/Stop 按钮被永久锁死。新增 CollectEnd 投递守卫（SessionStateContext 的原子标志 _frame_end_pending，配 arm_frame_end_pending()/consume_frame_end_pending()）：采集开始时置位、frame_ended() 时清除；on_session_stopped_event() 的自动停止路径发现标志仍置位，即说明本次采集未经 SR_DF_END 就结束，遂合成 CollectEnd 与 ST_STOPPED
    *EndCollectWork 事件补充侧边栏按钮复位：与 StartCollectWork 把 Start/Instant 按钮锁进"运行"态相对称，on_end_collect_work() 现在同步执行 setItemRunning(false)，使这一闩锁不可能泄漏
    *拒绝输入模块设备的无效采集请求：CaptureManager::action_start_capture() 在 device_agent().is_input_module() 时直接返回 false 并打印告警——输入模块（VCD/CSV/二进制/Saleae 导入）没有 libsigrok 驱动，sr_session_run() 立即返回且不产生数据包，此时发起采集只会清空 view_data 丢掉已导入波形并让 UI 卡死；SessionService::can_start_capture() 同步对输入模块返回 false。.pxl/.sr 会话文件走虚拟会话驱动，保留其回放/采集能力，不受影响
    *修复 reload() 在设备报告无通道时误清空已导入数据：输入模块 cleanup 会转移 sdi 通道列表，导致 reload 读到空通道，原先无条件 clear_signals() 会清空整个视口并丢弃导入的波形；改为仅在确实没有任何 signal_models 时才 clear_signals()，否则保留既有模型并打印告警
    *修复窗口缩放后底部状态条错位：新增 View::reposition_status_bar()，把底部状态浮层（ViewStatus）重新贴到时间视口底边（它是手工维护 geometry 的普通子控件，不随 QAbstractScrollArea 的 viewport 自动调整）
    *修复纯纵向缩放时表头/标尺不跟随高度变化：ViewDataSync::resizeEvent 在宽度未变（仅高度变化）的分支补充调用 _view->update_margins() 与 reposition_status_bar()。Header/Ruler/DevMode 的 geometry 由 ViewLayout::update_margins() 手工维护，少了这一步，窗口拉高后表头仍停在旧高度、底部新露出区域无任何绘制而直接透出背景色，反向缩小则表头过高、底边越界
    *修正 MCP 工具数量与文档不一致：实际注册 45 个工具（Tier0 模式管理 3 / Tier1 核心工作流 17 / Tier2 配置 12 / Tier3 高级特性 13），同步更新 mcp_instructions.txt 与 mcp_tool_registry.cpp 的各 Tier 注释；新增"已移除工具及替代方案"章节，明确 get_sample_config→get_session_status(include="config")、get_decoder_class_names→get_analyzer_results(includeMetadata=true)、get_math_results/get_spectrum_results/get_lissajous_results→get_measurement_results(types=[...])、set_save_range→重命名 set_export_config（参数与能力 1:1 不变）
    *libsigrok 子模块：修复 sr_input_release_sdi() 丢失 sdi 通道列表的问题——vcd/csv/wav/stf/protocoldata 的 cleanup() 都会调用 keep_header_for_reread()，把 sdi->channels 与 sdi->channel_groups 转移到模块私有上下文并置 NULL。对 sr_input_free() 而言这是对的（sdi 与 input 一同销毁），但对 release_sdi() 是错的：sdi 所有权即将交给调用者，丢失通道列表会让调用者持有的 sdi 不可用且无法释放（每个通道都泄漏）。改为在 cleanup 前后保存并恢复这两个列表

    【构建与工程】
    *AppImage 打包纳入 PXView-Agent：linuxdeploy 增加 -e install.dir/usr/bin/PXView-Agent；install_packaging.cmake 安装 pxview-launcher 到 bin 目录，并为 Tauri Agent 的 file(INSTALL) 显式指定 OWNER/GROUP/WORLD 执行权限（原默认 0644，落地后无执行权限）
    *自定义 AppRun 作为 AppImage 的真实启动入口：打包前复制 packaging/pxview-AppRun 到 install.dir/AppRun 并 chmod +x，linuxdeploy 不会覆盖已存在的 AppRun，路由逻辑因此得以保留
    *打包流程显式 chmod +x PXView / PXView-Agent / pxview-launcher，修复 AppImage 内二进制无执行权限
    *修复 AppImage 运行时 "Failed to import encodings module"：Python 标准库必须打包成与二进制实际链接的 libpython 相同的小版本。改为用 ldd 读取 PXView 真实链接的 libpython 版本（不再依赖默认 python3 或 CMake 缓存，两者都可能与 libsigrokdecode/PXView 实际链接的版本不一致），再定位对应解释器复制其 stdlib；读取失败时回退 python3，找不到解释器或 encodings 未打包则直接报错退出，避免静默产出坏包
    *.gitattributes 为 packaging/pxview-AppRun 与 PXView/pxview-launcher 强制 LF 行尾（CR 会破坏 shebang 与 exec）；.gitignore 放行 packaging 目录
    *Tauri 端跨平台适配：find_pxview_exe 按平台选择 PXView.exe / PXView，使 Linux/macOS 打包后 Agent 能找到同目录的无头 PXView
    *版本号提升到 1.5.9（CMakeLists.txt、README 版本徽章、CI 默认版本、NSIS 安装脚本）
    *README 修正 PX-Logic 各型号流模式最大采样率，与缓存模式保持一致（PX-Logic 32 与 16 Pro 均 1 GSa/s，16 Plus 500 MSa/s，16 Base 250 MSa/s）

    【测试与 CI】
    *CI 新增 AppImage 启动器双模式验证：分别以 `--headless` 与 `agent`（xvfb-run + webkit2gtk/GTK 运行库）启动 AppImage，轮询 MCP 端口 10110 确认经典 GUI 与 Tauri Agent（含其拉起的无头 PXView）均能独立正常启动
    *macOS CI 移除 x86_64 交叉编译：Homebrew 6.0.19+ 已将 Intel x86_64 标记为 Tier-3 并停发 x86_64 bottle，GitHub 也已停用 macos-13 Intel runner，x86_64 构建在托管 runner 上已不可实现（期间尝试过的 HOMEBREW_DEVELOPER=1 绕过 Tier-3 弃用诊断、--force-bottle 强制预编译包、改用 macos-13 原生 Intel runner 等方案均随之撤销）。build.yml 矩阵简化为仅 ARM64，删除 Rosetta 2 交叉编译步骤、CMake OSX_ARCH_FLAG 与 headless 测试的 cross_compile 分支、workflow_dispatch 的 mac_arch 输入；republish-release.yml 删除 macOS x86_64 DMG 的下载与重打包环节
    *QTest 桩（test_capture_manager / test_decode_task_manager）适配新增的 arm_frame_end_pending()/consume_frame_end_pending() 接口；MCP 协议测试改为精确断言 45 个工具，并把 set_active_session 补入必需工具清单

    PXView V1.5.8修改
    时间：2026年8月22日
    变更如下：

    【新功能】
    *新增 Tauri 桌面端打包支持：新增 web/src-tauri（Tauri v2）项目结构，Rust 后端提供 pxview_status/pxview_restart 无头进程管理命令，前端新增 tauri-bridge 桥接层与窗口控制按钮（最小化/最大化/关闭），关闭原生窗口装饰
    *新增 TDM/PWM 模拟解码触发与音频播放功能：新增 DecoderAnalogData 模拟数据管线（TDM/PWM 解码器模拟输出样本、二分查找、整周期测量、抽取渲染、工程量映射）、解码后模拟显示触发（Repeat 模式，原子翻页显示锁定）、基于 Qt Multimedia 的解码音频播放器（DecoderAudioPlayer，多通道混音矩阵、输出设备选择）、模拟波形点测/区间测量（Shift+拖拽，含周期频率/占空比/过冲统计）、TDM/PWM 解码器专用选项对话框、模拟音频 WAV 导出（8/16/24/32bit PCM）
    *新增自定义 API 端口配置能力：--port（MCP，默认 10110）与 --ws-port（WebSocket，默认 10430）命令行参数，运行时动态调整 MCP 与 WebSocket 端口
    *完整 MCP SDK 实现（mcp_server.h/cpp）：initialize/ping/tools/list/tools/call 协议处理、参数与 schema 构建、异常驱动分发；新增 mcp_tool_registry 用 Builder/Struct API 注册 49 个整合工具，替代手工 tool_schemas.inc
    *MCP 工具新增注解（annotations）支持：read_only()/destructive()/idempotent()/open_world() 链式声明
    *解码器自动生成标签（auto_label）与自定义标签功能：DecoderStack::auto_label() 无自定义标签时按首通道名自动生成，协议列表/导出文件/MCP API 统一显示；新增 list_row_description/Row::description 原生行描述
    *无头（headless/MCP）模式解码器持久化：.pxl/.pxc 文件加载时解析 decoders 条目并重建解码栈（restore_decoders），保存时序列化解码器配置
    *get_analyzer_results/get_decoder_annotations 新增按注解类过滤（ann_class 参数），避免早期大行注解饿死后续行
    *导出接口尊重 set_export_config 保存区间（get_save_start/get_save_end）
    *后台光栅化渲染：新增 RenderWorker 后台渲染线程（三重缓冲）与 SchedulerThread 专用捕获时序线程；DSO/模拟/逻辑信号波形光栅化提取为纯函数 rasterize_logic/dso/analog_channel，交互驱动同步渲染、数据驱动异步渲染
    *每个 DecoderStack 创建专属注解堆（annotation_heap + HeapAllocator），缓解多解码线程进程堆锁竞争
    *libsigrokdecode 批量注解解码路径（srd_pd_output_callback_add_batch + ann_batch.c）
    *可选解码性能检测：perflog.h 性能日志系统（PXVIEW_DECODE_PERF 宏 + ENABLE_DECODE_PERF 编译开关，pxv_decode_perf.log 落盘）
    *xlog 新增 xlog_get_level API，运行时获取当前日志级别
    *LogDock 新增 init_log_receiver 提前注册日志接收器，启动日志（设备扫描等）不丢失
    *Snapshot 基类继承 QObject 并新增 completed() 信号，支持多段采样（get_segment_count/create_new_segment/get_segment_sample_count 等 API）
    *新增崩溃信号处理器 signalhandler（Win32 CaptureStackBackTrace+dbghelp / Unix backtrace）
    *解码器菜单按自然顺序排序（strnatcmp/strnatcasecmp）
    *新增内存/磁盘缓冲指示（get_logic_memory_bytes/get_logic_disk_bytes/get_mmap_total_bytes），状态栏磁盘占用显示精确化
    *FFT 计算移入 worker 线程并新增 fft_updated 信号
    *新增采集诊断 PathDiagWindow 与渲染诊断 RenderDiagRec（>100ms 告警）
    *新增 parallel.h 并行线程池
    *新增 clear_cursors RPC/MCP 工具与游标操作封装（get_cursors/add_cursor/remove_cursor/clear_cursors）
    *pxview-automation 新增 dump-schema 命令、types.py 类型安全 API（CaptureState/ChannelType/ExportFormat 等枚举与数据类）、Windows 作业对象子进程自动清理（异常退出自动终止 PXView 子进程）

    【性能优化】
    *解码渲染性能系列优化：无锁渲染快照（RowDataSnapshot 不可变快照 + atomic<shared_ptr> 发布，消除渲染路径对 _rows_mutex 竞争）、增量式快照发布（分段 AnnotationSegment 复用，发布开销 O(新增)）、解码前沿 LOD 色块渲染、按屏幕像素列聚合绘制（O(N)→O(屏宽)）、发布节流（约 16ms/200ms 门控）
    *解码通知批量化：request_decode_notify + 100ms 批量定时器合并多栈 new_decode_data 通知，新增解码专用重绘路径跳过信号缓存重建
    *RowData::get_visible_range 结束边界二分查找（upper_bound），新增 for_each_index 单次共享锁批量遍历
    *解码时 GUI 卡顿系列优化：错误消息去重、异常注释日志频控、密集行渲染缓存（_dense_row_cache）、frozen_snapshot 大段拆分（kMaxSegAnnotations=500000）
    *append_cross_payload 分块转置主路径（chunk-aligned 单次顺序遍历），ingest 吞吐从约 1620MB/s 提升到接近 memcpy 带宽
    *有限（非 loop）采集无锁快路径：committed_sample_count() 原子读取，get_samples/get_display_edges 等读取函数免锁分支
    *FFT 计算移入 worker 线程；DSO 测量缓存（按 data 指针/channel/ring count/视图高度缓存，消除主线程重复计算）
    *毛刺滤波主循环改用 find_first_different_raw 原始字节扫描（u64 差分 + ctz）替代 mipmap 树搜索
    *文档复制改为零拷贝（移除后台 copy_thread 与 join）；SSE wait_capture 进度推送改用独立线程+原子标志
    *网络传输重构：WsTransport/McpTransport 移入专用 IO 线程，JSON-RPC 业务处理卸载到 2 线程 worker pool，socket 写入统一 post_to_self 避免跨线程
    *文件导入异步化：import_file 主线程不阻塞，后台线程执行读取与 sr_input_send 循环，导入中渐进刷新波形
    *ProtocolDock 图层增量更新（按指针 identity 比对，O(N²)→O(N)）；SignalsChanged 事件 50ms 节流合并；broadcast_async 空类型事件 coalescing
    *DecoderStack 解码改用迭代器协议（SegmentDataIterator 增量推进，begin/continue_sample_iteration 跨 chunk 复用）
    *TDM/PWM 解码内存优化：DecoderAnalogData 几何扩容 + 增量 min/max 缓存；按采样量自适应分块（>1000 万样本或 >10s → 64K，否则 32K）
    *MmapAllocator 页面回收逻辑修正：SEC_RESERVE 下保持 written 标志复用后显式 memset，Linux madvise 返回 true 跳过 memset
    *DeviceAgent 常驻会话线程替代每帧 std::thread，避免 Windows 频繁线程退出造成的 GLib/CRT 状态撕裂
    *移除后台渲染 Worker（RenderWorker/渲染三重缓冲），波形渲染改为 GUI 线程同步渲染，消除交互缩放/平移 1~2 帧延迟

    【问题修复】
    *修复采样率异常时解码崩溃：DecoderStack 捕获 srd_session_metadata_set 返回值，失败销毁 session 提前返回（修复堆损坏 0xC0000374）
    *修复多标签页切换后的多个核心问题：文件设备跳过 reload 避免数据丢失、切回旧 tab 恢复 ST_STOPPED 使波形重新渲染、设备切换只清活动文档解码器、导出样本对齐基准 64→8、全局设备句柄保存/恢复（save_current_device_handle）、流模式 samplelimits 用实际样本数、事件结构由裸指针改槽索引（size_t/SIZE_MAX）、EventBus 非主线程广播重定向
    *修复范围保存 .pxl 文件异常：save_file 应用 SetDataRange、meta_gen 按 64 对齐计算 saved_samples/saved_trig_pos、config JSON 按字节长度读写避免 NUL 截断
    *修复重复采集进度显示：repeat 模式用单帧目标采样数（get_sample_limit）计算，进度条每帧达 100%
    *修复解码器存储/加载：按 base/stacked 区分解码器，恢复每个解码器的 probe 映射与 options（避免栈内解码器覆盖同一字段）
    *修复导出块范围过滤与光标偏移：先按 start_block/end_block 过滤再计 written_bytes，位索引对齐 actual_start/actual_end 语义
    *修复 stream 模式视图时间轴限制在 0-1s 与内存持续增长：改用 get_ring_sample_count 而非 get_sample_limit（demo 设备 loop 模式不再清 limit_samples）
    *修复捕获状态卡死导致无限等待：新增 force_release_capture_state 应急接口、EventBus 重入事件延迟入队（_deferred_broadcasts）、wait_capture_complete 超时兜底强制释放
    *修复重复采集手动停止误触发 CollectEnd（按 is_repeat_mode 抑制）；Repeat 重启失败导致 UI 冻结（50ms 重试 40 次后干净停止）
    *修复解码线程堆释放后仍被访问的崩溃：remove_decoder 先 wait_for_task_finished 等待解码线程结束
    *修复 rst_decoder 竞态：wait_for_task_finished 轮询带 10s 上限，超时中止本次 reset，避免 worker 访问已释放 snapshot 导致 SIGSEGV
    *修复 find_first_different_raw 未实例化常量块 out_pos 错误回跳（返回真实块起点）
    *修复解码器类别信息解析：get_decoder_class_names 的 annotations 按 char** 配对数组解析（长描述回退短标签）
    *修复非 Windows 平台注解堆分配器失效：annotation_heap_alloc/free 改用 malloc/free 回退（原返回 nullptr 抛 bad_alloc 崩溃）
    *修复信号重建后的悬垂指针：Signal 新增 sig_released 信号、Header/Viewport 清缓存指针、MathTrace 源信号失效处理
    *修复解码轨迹注释渲染丢失与密集模式判定（get_min_annotation/min_annWidth，密集模式统一矩形色块）
    *修复文件设备路径无法获取：DeviceAgent 新增 _file_path 保存真实磁盘路径（release/open_by_handle 不再丢失）
    *修复事件总线/网络传输 use-after-free：EventBus _alive_shared 共享原子标志、WsTransport QPointer 守卫、mcp_transport disconnected 立即移除 socket、SSE 客户端清理
    *修复 StoreSession 忙标志竞态（调用线程设置）、快照析构泄漏（显式 free_data + drain_and_join）、MmapAllocator prefault try/catch 防崩溃
    *修复探针因子 vfactor=0 导致断言崩溃（钳制为 1，按通道类型而非工作模式决定 DSO/模拟字段保存）
    *修复下拉框无限闪烁（_bReady 延迟就绪 + 重入守卫）；Windows urllib 代理导致 127.0.0.1 连不上（空 ProxyHandler）
    *修复多线程并发访问：DecoderStack 错误消息/行数据加锁、StoreSession 计数器改 atomic、SignalModel 快照改 shared_ptr、EventBus 先拷贝回调列表再锁外调用
    *将大量 assert 替换为带 pxv_warn/pxv_err 日志的安全处理（越界 clamp/返回默认值），避免 Release 下断言失效直接崩溃
    *修复 get_capture_status state 字段统一为字符串（MCP/RPC 共享 capture_state_to_str 映射）
    *修复 SR_CONF_INSTANT 仅对 demo/DSLogic/DSCope 下发，避免 PXLogic 刷日志/失败
    *修复 MSYS2/MinGW 编译缺 nlohmann_json 头、viewport.cpp 死代码 windows/psapi include 破坏 Linux/macOS 构建
    *修复 demo 设备采集视图时间轴与内存占用、wait_capture 超时未被 timeoutSeconds 尊重
    *修复 Group3 回归测试段错误崩溃（test_36 毛刺滤波 i2c）：毛刺滤波后台任务按原始指针读取当前逻辑快照，与采集/配置边界 init_signals 重建信号模型并发，导致 LogicSnapshot::copy_from 读取已释放的 mmap 块而 SIGSEGV。修复：init_signals 重建前等待滤波任务空闲（FilterProcessor::wait_idle）；新增 _backup_mutex 串行化滤波/反相/清除对 live↔backup 快照的 copy_from；copy_from 执行期间锁定源快照迭代器（_iterator_count），使并发 free_data 延迟释放
    *修复长跑采集后内存耗尽（std::bad_alloc）：采集边界排空上一采集解码线程仍持有的活动迭代器后再执行 free_data（wait_active_iterators_zero），使旧采集 mmap/leaf 块真正被回收，避免多采集累积；修复 begin_sample_iteration 首个分块读取缺少 _ring_published acquire，消除解码线程 get_samples 与采集线程数据写入的 TSan 数据竞态
    *修复添加/移除解码器的内存泄漏：打破 DecoderStack 引用环（decode_task_status::_decoder 由 shared_ptr 改为 weak_ptr，回调经 lock() 取强引用），根除每轮 add/remove 约 80MB 泄漏与 MCP 超时
    *修复 macOS 无头启动崩溃：禁用 mimalloc 全局 malloc override，mimalloc 改为 vendored 子模块源码构建（libsigrokdecode 注解堆继续使用 mi_heap）
    *修复 load_capture 设备切换并发清除解码器栈导致的堆损坏崩溃（Windows 全页堆 verifier stop/SIGSEGV）：GUI 主线程与 MCP worker 并发清空销毁同一 SessionDocument::_decoder_stacks，std::vector 双线程 clear+析构数据竞争导致悬垂/双释放。修复：_decoder_stacks 增加 _stacks_mutex 并统一走加锁且幂等的 clear_decoder_stacks()；set_device 销毁解码栈前先 clear_all_decode_task2() 等待解码 worker 真正结束；修复 main.cpp 消息处理器临时 QByteArray::constData() 悬垂指针 UAF
    *修复解码终快照尾段缺注解（SWD/I2S/MIPI 尾段无解码）：libsigrokdecode 批量收集器仅内部数组达 SRD_ANN_BATCH_MAX(1024) 时自动 flush，尾部分批仅在 srd_session_destroy 时补投递，晚于 publish_snapshot()，导致低注解量解码器发布快照只含整批倍数而尾批丢失（swd_c=1024 等）。修复：srd_session_end 之后、publish_snapshot() 之前显式调用 srd_ann_batch_flush(session)；同步修复 i2c_c 无条件发射 start=end=UINT64_MAX 的无效 ATK 着色注解
    *修复 FilterProcessor::wait_idle 的轮询空窗：改为委托线程池 wait_for_idle 真正 join 等待 glitch/invert 任务完成（覆盖 submit→执行空窗），使 init_signals 重建前的滤波任务可靠结束
    *修复卸载残留文件：卸载时 taskkill /F 强制结束 PXView/PXView-Agent 进程并 Sleep 等待句柄释放，所有 RMDir /r 增加 /REBOOTOK，解决旧主程序未退出导致的文件锁定与卸载后目录残留
    *修复多线程竞争读写的潜在问题，为_work_mode变量添加atomic修饰符


    【重构】
    *完成 Plan B 架构重构：引入 ThreadPool 统一线程管理、SharedState 同步原语（cv.wait_for 取代 QEventLoop 轮询，消除事件队列死锁）、EventBus 改为 subscribe<T>+RAII Subscription（移除 IEventListener 45 个 on_event 虚函数）
    *移除旧 EventObject 基类及其约 17 条死连接，EventBus 支持注入式 IAsyncDispatcher（QtAsyncDispatcher/SyncAsyncDispatcher）
    *完成 MCP 工具集整合：create_mcp_server 拆分为 4 个分层注册函数，工具合并（get_measurement_results 合并 math/spectrum/lissajous、configure_cursors 整合游标四件套、export_raw_data 合并 csv/binary、get_samples 合并 logic/analog/dso、configure_trigger/probe/glitch_filter 等），新增 outputSchema 支持，add_decoder 拆分为 prepare_decoder/apply_prepared 两阶段
    *重组 PXView/pv 目录结构为层级布局（162 文件迁移到 base/session/data/view/mainwindow/platform 等子目录，统一 include 为 pv/ 绝对路径，顶层无直接 .cpp/.h）
    *用 std::unique_ptr 替换大量裸指针（LogicSnapshot 迭代器、StoreProgress、SubMainFrame、SessionManager、LangResource 等），移除手动 delete
    *依赖倒置接口解耦：IDeviceConfigPort/ISessionHost/ISignalModelSource 抽象接口，SessionDocument/DecoderStack/MathStack/SpectrumStack 不再依赖具体 SigSession
    *抽离纯格式化函数：measure_format（电压/时间/频率）、ruler_format、ViewContext 坐标映射；多处坐标换算统一从 document_snapshot_source 取采样率，viewport cur_preX/aftX 改 double
    *新增 change_event.h 纯变化判定函数（ChangeEventKind + compute_change_event_pure）
    *逻辑快照模块拆分：LogicSnapshotPatternSearch/LogicSnapshotEdgeScan 独立子系统；Snapshot 基类简化（移除 QObject 外的多段 API 与手动 moc，改 AUTOMOC）
    *提取 atomic_shared_ptr 到独立头文件（pv/utility/atomic_shared_ptr.h），解决 macOS libc++ 不支持 C++20 atomic_shared_ptr 编译
    *AppConfig 全部配置键重构为 keys::* 常量并新增设置变更监听（SettingChangeListener）；Binding 新增 ConfigChangedCallback 聚合回调
    *MCP 系统提示词单一数据源（mcp_instructions.txt 编译期嵌入 mcp_instructions_gen.h）
    *通道 view_index 归一化重构为唯一赋值入口 normalize_view_indices（按类型优先级+channel index 排序）
    *libsigrokdecode 上游借用（upstream borrow）+ vtable 分发适配（srd_get_last_error/srd_session_inst_list_get 等新 API）
    *解码器选项 prop::Bool 支持眼睛按钮与 int64 存储模式；DecodeTrace 模拟波形渲染与命中测试（hit_test_analog_channel/auto_fit_visible_analog）
    *EventBus 重构为 Copy-on-Write 订阅表（_snapshot + rebuild_snapshot + version()）
    *移除无用的调试日志和冗余警告日志，降低日志噪音

    【构建与工程】
    *MSYS2 工具链切换到 UCRT64 替代 MinGW64（CI/构建脚本/打包脚本/deps 全量适配）
    *完善 mimalloc 依赖：find_package CONFIG/pkg-config/Homebrew/bare 多级查找，统一 ${MIMALLOC_LIB} 变量，替换硬编码链接，为 sigrokdecode_static/主程序/qtest 添加依赖
    *Windows 构建自动查找并安装 libffi-8.dll（Python _ctypes 需要），未找到给出提示
    *改进 MSYS2 UCRT64 Python 检测逻辑：探测 /ucrt64/bin、C:/msys64/ucrt64/bin、MSYSTEM_PREFIX 等多路径，优先标准 GIL Python 规避 python3.14t ABI 问题；新增 PEP 703 自由线程 Python 检测（SRD_FREE_THREADED_PYTHON=1）
    *libsigrok/libsigrokdecode 子模块多次升级/回退到兼容锚点（355f4d41 非 RLE 时代；a7aa591d 等）
    *新增 Tauri 桌面打包目标（ENABLE_TAURI + tauri-desktop，依赖 Rust cargo+npm）与 Qt Multimedia 组件
    *clang-tidy 配置全面启用（clang-analyzer/cert/cppcoreguidelines/concurrency 等），新增 .clang-tidy-ci 与 NOLINT 抑制、run_tidy.ps1/clang-tidy-check.bat 脚本
    *Debug 构建启用 _GLIBCXX_ASSERTIONS；mmap 分配器 ASan 中毒检测（ASAN_POISON_MEMORY_REGION）；关闭 UBSan alignment 检查（minilzo 兼容）
    *Windows 便携包打包优化（zip -r -9 最高压缩并列出内容校验）；移除 Python embeddable 下载（依赖 UCRT64 mingw-w64-python 的 stdlib+.pyd）
    *ENABLE_TESTS 改为 CACHE BOOL 修复 CMP0077 冲突；source 文件清单（core/gui/data）全量适配新目录布局；PCH 路径更新
    *NSIS 打包脚本适配 PXView-Agent：根据是否构建 Agent 通过编译期条件动态生成桌面快捷方式，/DPXVIEW_AGENT 参数由脚本随版本同源一致传入，修复重复定义问题

    【测试与 CI】
    *测试系统迁移到 QTest+CTest 架构（tests/qtest 分 core/data/api/view 四层，QT_QPA_PLATFORM=offscreen 无头运行），移除旧自定义框架与 Google Test
    *新增 qtest 单元测试：test_decode_task_manager、test_rasterize（光栅化纯函数）、test_rowdata_batch（批量/逐注解等价性）、test_logic_snapshot_raw/query/pattern_search/edge_scan、test_analog_snapshot、test_dso_snapshot、test_signal_model、test_disk_cache、test_session_document、test_eventbus（COW/退订中广播/非主线程重定向）、test_change_event、test_binary_codec、test_result_types、test_trigger_config 等
    *新增 E2E 测试套件：test_24_real_decode（PWM/GrayCode）、test_25_pwm_mixed_stress（多解码器并发压力）、test_26_i2c_real_decode、test_27_cursor_export（游标区间导出往返）、test_28_real_decode_spi_uart、test_29_work_mode、test_30_pxl_format（含范围保存回归）、test_31_decoder_persistence、test_34_demo_waveform_check、毛刺滤波定量/触发 E2E 等
    *新增 release-ci.yml：4 并行 job（Release 冒烟/ASan+UBSan 核心子集/TSan 两阶段/Clang-Tidy 快速），Release 构建跑全量 E2E，替代 e2e-linux.yml
    *CI 测试 3 路并行：3 个 PXView 实例（MCP 10110/10111/10112、WS 10430/10431/10432）分 19 个测试文件并行执行并合并报告
    *E2E 崩溃诊断演进：catchsegv→gdb→libSegFault LD_PRELOAD→curl 探测 MCP 端口判断就绪（修复 stale PID 误报）
    *CI 构建修复：Ubuntu24.04 C 扩展复制（_struct 定位+fallback）、UBSan alignment、绝对路径测试报告、setup-python 移到打包前、Python 3.14（deadsnakes PPA）、qtmultimedia/nlohmann-json 依赖
    *新增 republish-release.yml 重发布资产工作流；test-gates.yml 分层门禁工作流（后移除）；release-ci 测试分组扩容（test_29~36 共 8 个新用例）
    *新增三份压力测试脚本：c4_three_load_stress（稠密/稀疏×长时采集+渲染+解码并发压测）
    *可选 8 位 sweep 采样率测试导出左游标改为范围级语义校验（断言导出行数 ≤ 区间长度且均为合法逻辑位），去掉依赖随机位的首行精确断言，消除 flaky
    *修正 pxl 保存范围断言按 8 采样对齐（对齐 64→8），匹配当前正确实现
    *CI：release E2E 超时 30→60 分钟；macOS 构建触发逻辑与说明更新
    *macOS 调试工作流（macos-debug.yml）：新增手动 lldb 崩溃回溯工作流、修复 lldb on-crash 命令导致堆栈未打印、headless 采集改用 'run --headless -l 4'、优化日志输出与 debug info 收集、更新工作流配置
    *CI 作业新增主线程卡死监控与崩溃转储：Ubuntu 构建作业安装 gdb，看门狗脚本检测 PXView 主线程无响应超过 120 秒时通过 gdb 导出所有线程栈并触发 SIGABRT 保留崩溃现场

    PXView V1.5.7修改
    时间：2026年8月9日
    变更如下：

    【新功能】
    *新增二进制编解码器（BinaryCodec），支持高效的波形数据传输，包含逻辑边沿编码、模拟/DSO包络编码和视口重置帧
    *实现WebSocket订阅机制，支持主题订阅/取消订阅、视口订阅/更新/取消，客户端可按需接收特定类型的事件
    *实现版本化状态通知，每次状态变更分配单调递增版本号和时间戳，客户端可检测过期状态
    *新增视口数据定时推送（约30fps），WebSocket客户端订阅视口后自动接收增量波形数据
    *新增批量RPC调用接口（batch_call），单次请求可执行多个JSON-RPC调用，减少网络往返延迟
    *新增二进制视口数据获取接口（get_viewport_binary），支持以二进制帧返回逻辑边沿或模拟包络数据
    *新增解码器自定义标签功能，支持为同类型解码器的多个实例设置区分标签（如"SPI(CH2.SPI)"），标签在协议列表、导出文件、MCP API中统一显示
    *协议解码列表新增"All"模式，支持多解码器同时显示，按时间排序合并所有注解
    *协议解码列表新增解码器切换下拉框，支持在单个解码器和所有解码器视图间快速切换
    *协议解码列表新增Ctrl+F搜索快捷键，Enter键跳转下一个匹配，Shift+Enter跳转上一个
    *协议解码表头新增右键菜单，支持显示/隐藏列

    【问题修复】
    *修复多解码器并发时的空指针竞态问题：在reload()和init_signals()中创建SignalModel后立即设置快照指针，解决添加解码器时其他解码器间歇性失败的问题
    *默认启用Dock测量功能（dock_measure_fen_enabled从false改为true）
    *优化协议表格列宽计算逻辑，同时考虑表头文字宽度和数据内容宽度

    【重构】
    *重构协议解码列表UI：替换PopupLineEdit为标准QLineEdit，添加清空按钮，优化搜索栏布局
    *重构搜索过滤器为AnnotationProxyModel，仅在注解数据列中进行文本匹配，排除预设的Start/Duration列
    *优化表格选择模式为多选（ExtendedSelection），调整默认行高为28px适配UI设计
    *DecoderModel新增多栈（All）模式架构，使用前缀和实现O(stacks)顺序行映射，可见范围使用惰性合并排序
    *DecoderModel新增Start和Duration预设列，显示注解起始时间和持续时间

--------------------------------------------------------------------------------

    PXView V1.5.6修改
    时间：2026年8月8日
    变更如下：

    【新功能】
    *发布pxview-automation Python自动化包，包含CLI命令行工具和三层API（低层McpClient、高层PXView、CLI），封装全部61个MCP工具，零运行时依赖
    *新增协议表格右键菜单功能，支持复制单元格、复制行、复制列、复制全部和全选操作
    *新增多语言翻译：复制单元格、复制行、复制列、复制全部、全选（简体中文、英文、繁体中文）
    *新增Clang-Tidy静态分析配置文件（.clang-tidy），针对项目崩溃模式配置检查规则
    *新增ASAN/TSAN/UBSAN编译选项，支持AddressSanitizer、ThreadSanitizer、UndefinedBehaviorSanitizer运行时检查
    *新增ASAN/TSAN构建脚本（build-debug-asan.sh）

    【问题修复】
    *修复重复采集模式下的SIGSEGV崩溃：在first_payload中停止解码线程后再修改快照，建立严格的快照生命周期协议（可变→不可变→可变）
    *修复重复采集模式下MmapAllocator重建导致的SIGSEGV：复用现有MmapAllocator而非创建新的，避免UnmapViewOfFile使解码线程的裸指针失效
    *修复重复采集模式下leaf block decommit导致的SIGSEGV：first_payload中不再释放leaf block，保留映射供并发解码线程安全访问
    *修复calc_mipmap中decommit常量值leaf block导致的SIGSEGV：仅在_able_free为true时才decommit，保护解码线程的裸指针
    *修复first_payload中_dest_ptr悬垂指针导致的SIGSEGV：重置位对齐状态（_dest_ptr/_ch_fraction/_byte_fraction/_last_ended）
    *修复append_cross_payload中move_first_node_to_last和free_head_blocks后_dest_ptr悬垂：在所有decommit操作后重置位对齐状态
    *修复append_cross_payload尾部阶段_dest_ptr为空时崩溃：新增空指针防御检查
    *修复DiskWriteThread::stop()中submit()永久阻塞：在等待谓词中加入_stopping条件，并通知_cv_full唤醒阻塞的submit()调用
    *修复MmapAllocator文件删除线程泄漏：将detached线程改为可join线程，在析构函数中join确保缓存文件实际删除
    *修复McpTransport::stop()中SSE客户端和pending socket的use-after-free：先断开信号再abort和delete，最后销毁server
    *修复McpTransport::on_service_event中对已断开socket的use-after-free：单次遍历中分离存活和死掉的socket
    *修复WsTransport::stop()中on_client_disconnected的stale iterator问题：先断开信号再清理客户端
    *修复DecodeTaskManager::stop()中的死锁：采用"lock-swap-unlock-join"模式，不在持锁状态下join工作线程
    *修复DecodeTaskManager::add_decode_task()中的锁竞争：先创建线程再移入向量，避免新线程阻塞
    *修复DecodeTaskManager::decode_single_task()中的自detach问题：不再detach当前线程，由stop()路径统一join
    *修复EventBus::broadcast_async()的alive标志被重复设true的问题：仅在构造函数设true、析构函数设false，lambda中用acquire序检查
    *修复FilterProcessor::set_glitch_filter()中的自join死锁：检测递归调用时detach而非join，引入launch mutex防止TOCTOU竞态
    *修复FilterProcessor::glitch_filter_task()中的递归创建线程问题：改为在循环中处理pending请求，不再递归调用set_glitch_filter()
    *修复FilterProcessor::set_signal_invert()中的TOCTOU竞态：引入launch mutex保护启动路径
    *修复SearchDock::search_worker()中的空指针访问：新增_data空指针防御检查
    *修复LogicSignal的use-after-free：新增shared_ptr引用（_data_ref）保持快照生命周期，防止主线程访问已释放的快照
    *修复非流模式停止采集后画面空白问题：非流模式不再clear capture_data，保留最后一次采集数据供查看
    *修复MCP重启时的资源释放竞态：graceful restart先stop清理所有客户端，再延迟500ms释放端口后start
    *移除demo设备循环采集限制，demo设备支持所有图案模式的循环采集
    *修复采样栏重复模式对demo设备的限制：移除is_demo()判断，demo设备与硬件设备一致处理

    【性能优化】
    *移除release构建中的调试符号（-g）编译选项，减小二进制体积并加快编译速度
    *优化WebSocket和RPC服务端的资源释放顺序，减少shutdown时的竞态窗口

    【重构】
    *重构Windows MSYS2/MinGW Python运行时检测和打包逻辑：强制在MSYS2环境下使用MinGW Python，避免错误链接python.org MSVC Python
    *改进appcontrol.cpp的Python路径设置，支持MSYS2的lib/python3.X/ stdlib布局
    *重构copy-deps.sh脚本，添加参数校验、错误处理和计数输出
    *重写package.sh的Python依赖处理逻辑，修复版本检测和stdlib复制
    *移除MSYS2/MinGW Python的遗留处理代码，简化构建和打包流程

    【构建与CI】
    *修复Web UI构建时npm源和node路径问题：指定官方npm源，添加nodejs执行路径到环境变量
    *CI构建Web UI从可选改为必需，构建失败则CI失败
    *CI新增Python DLL和stdlib校验步骤，检查MinGW Python正确链接和encodings模块存在
    *为NSIS安装脚本配置.gitattributes二进制属性，防止Git移除UTF-8 BOM
    *更新Web包名称为pxview-automation-web

--------------------------------------------------------------------------------
  
    PXView V1.5.5修改
    时间：2026年8月7日
    变更如下：

    【新功能】
    *新增入口文件导入功能，基于libsigrok输入模块实现文件导入，工具栏新增导入按钮与国际化文案，支持dark/light主题图标
    *新增函数面板Dock（FunctionDock），支持FFT、数学运算和李萨如图形的可视化控制，从弹出菜单改为可停靠面板
    *新增波形图案模式支持（正弦波、方波、锯齿波、三角波、随机）
    *实现李萨如波形的轴索引和百分比设置功能
    *新增DSO通道配置面板，支持调整每通道参数
    *添加退出时提示保存数据的配置选项
    *新增统一多格式原始数据导出接口（export_raw_data），支持csv/binary/vcd/hex/bits格式导出
    *新增RPC工具schema和MCP客户端接口，统一原有csv/binary导出流程
    *新增配置类型审核CI脚本（audit_config_types.py），增强配置项类型校验逻辑

    【问题修复】
    *修复实时捕获模式下波形显示冻结的问题，优先返回实时数据源
    *优化重复流捕获逻辑，保留单缓冲模式避免界面卡顿，正确维持滚动和视图更新
    *重构触发配置同步逻辑：移除旧的fork版libsigrok触发API兼容代码，新增完整的高级触发配置同步（SR_CONF_TRIGGER_ADV_*系列键值对）
    *修复触发位置（capture_ratio）不生效的问题
    *修复二进制导出时未按有效样本数裁剪导致多导出陈旧数据的问题
    *使用稳定的单调计数器分配文件设备句柄，解决release后句柄失效的问题
    *保存并恢复Mode区域设备级配置键，防止切换选项卡时丢失选择
    *修复采样率变更导致的波形闪烁问题
    *修复触发值同步更新问题
    *修正水平触发位置配置的数据类型错误
    *修复导入文件时的内存泄漏问题
    *修复无可用通道时的空白视图问题
    *修复李萨如追踪的UAF（Use-After-Free）问题，重新获取快照数据
    *修复输入模块设备启动崩溃问题
    *修复datafeedparser中isFile参数错误
    *实现DeviceAgent get_config_int64接口
    *修复回放文件时间戳显示错误
    *修复循环模式下捕获停止后画面空白问题
    *修复MCP传输连接挂起问题
    *完善设备ID异常处理与测试用例
    *修复默认设备选择逻辑，跳过无通道的输入模块设备避免UI崩溃
    *优化StoreSession二进制导出逻辑，修复UTF-8转换和换行符问题
    *修复逻辑通道导出时的样本计数对齐问题，确保保存加载无损耗
    *修复SessionData采样率注入时机，消除波形平窗问题
    *修复缩放范围限制、MSO模式波形不显示等bug
    *修复View析构时游标对象内存泄漏
    *完善Windows安装包：添加多语言提示、进程检测、自动卸载旧版本和强制覆盖安装文件
    *将SR_CONF_CLOCK_EDGE绑定为字符串下拉框以匹配驱动支持
    *修复跨工作模式通道异常启用问题

    【性能优化】
    *优化捕获结束后的解码和数据拷贝逻辑，针对流重复捕获跳过耗时的数据拷贝，直接复用实时缓冲
    *重构会话数据零拷贝共享机制
    *全面替换dynamic_cast为as_*()窄cast方法，新增trace_visitor实现visitor模式消除RTTI开销
    *使用std::vector替代手动new[]/delete[]，将裸指针替换为std::unique_ptr管理资源
    *新增预编译头文件（common_pch.h）优化编译速度

    【重构】
    *完成项目现代化迁移：将boost/optional替换为std::optional，旧式C头文件替换为<cxxx>标准版本，NULL替换为nullptr，dsvdef.h重命名为pxvdef.h并更新所有引用，volatile标志替换为std::atomic，统一C++标准为C++23
    *将MainWindow代码按职责拆分为独立委托类：MainWindowConfigIO（配置序列化）、MainWindowDockManager（Dock管理）、MainWindowEventDispatcher（事件分发）、MainWindowFileOps（文件操作）、MainWindowSignalConnector（信号槽连接）、MainWindowShortcutManager（快捷键）、MainWindowStatusBar（状态栏）、MainWindowTabManager（标签页）、MainWindowThemeManager（主题管理）
    *提取ViewLayout、ViewCursors等委托类，将状态和行为从View剥离，新增IViewCursors、IViewSignalStore接口解耦视图渲染依赖
    *新增RenderPass独立渲染Pass管线，将信号绘制、解码渲染和光标叠加逻辑从ViewportPainter迁移至独立组件
    *将测量叠加层和触发状态信息提取为独立的MeasureOverlayPass和TriggerInfoPass
    *将dsosignal.cpp中的所有绘图方法提取到dsosignal_paint.cpp，提升模块化程度
    *将CaptureManager所有跨线程访问的成员变量替换为std::atomic，修复数据竞争、空指针解引用、悬垂指针及线程不安全的容器访问
    *重构属性绑定生命周期：将属性删除职责移入Binding基类析构函数，移除boost::bind改用lambda表达式，引入GVarPtr自动管理GVariant生命周期
    *将DataSource胖接口拆分为IDataSource/ISignalSource/ICaptureControl/IMeasureSource/IDecoderHost五个细粒度接口，遵循ISP原则
    *废弃ISessionCallback体系，改用统一的IEventListener事件总线
    *新增ISessionState接口，打破Manager与SessionStateContext之间的循环依赖
    *全面迁移容器为std::unique_ptr智能指针管理，移除手动delete代码
    *将GlitchFilterMode改为强类型枚举，移除全局枚举依赖
    *新增SignalListModel实现信号列表Qt模型封装
    *新增IViewLayout接口和MockViewLayout用于单元测试
    *移除RenderPipeline，改为显式调用渲染流程
    *统一派生轨迹、游标、滤镜等资源的清理逻辑
    *拆分LissajousModel和MathStack的实现至独立cpp文件

    【测试】
    *重构测试体系，迁移至pytest自动化测试框架
    *实现完整的MCP E2E测试套件，包含23个测试套件覆盖协议、设备管理、采集、数据完整性、导出导入、解码器（I2C/SPI/UART/CAN/PWM）、信号数据、配置、滤波反转、会话高级、错误处理、压力测试等模块
    *新增Windows批量测试脚本与调试工具
    *新增pytest-timeout依赖并配置全局超时
    *添加Google Test C++单元测试子项目

    【构建与CI】
    *补充Windows/Linux/macOS全平台本地构建脚本
    *新增Windows依赖复制与打包脚本
    *新增GitHub Actions构建流水线，支持view_and_data分支触发构建
    *新增Windows E2E测试CI流水线
    *调整C++标准配置，为CI安装GCC14以支持C++23所需特性
    *添加libsigrok子模块初始化步骤
    *优化版本号构建方式，支持从命令行覆盖PRODUCT_VERSION
    *CI升级至ubuntu-24.04，GCC14 runtime bundling，分层codesign签名
    *修复AppImage TMPDIR问题，移除绝对OUTPUT路径
    *修复手动构建时ref为空导致失败的问题
    *将Python运行时二进制和废弃脚本移出git追踪（本地保留）
    *修复NSIS BOM问题，CI下载Python embeddable时删除python314.zip
    *更新libsigrok和libusb子模块到最新版本
    *同步脚本白名单新增tools目录，优化子模块同步逻辑

--------------------------------------------------------------------------------

    PXView V1.5.4修改
    时间：2026年7月31日
    变更如下：

    【新功能】
    *实现完整的电平相关参数测量功能，支持DSO模式下电压、频率、占空比等电平参数的自动测量
    *适配Linux AppImage运行环境，自动设置Python home路径
    *为macOS平台添加Python home设置逻辑，修复嵌入式Python路径问题

    【问题修复】
    *修复滚动动画期间控件鼠标交互被阻断的问题，移除WA_TransparentForMouseEvents冗余优化逻辑
    *修复手动停止采集后按钮状态异常的问题
    *修复MSO会话文件加载后仅显示逻辑通道不显示模拟通道的问题
    *修复多类UI显示异常与进度条动画问题
    *修复高DPI下文档提示图模糊的问题
    *修复文档预览图片过大导致弹窗异常的问题
    *修复macOS下多标签页重复显示关闭按钮的问题
    *修复mmap分配器prefault线程与copy_from的竞态写零问题
    *修复采集结束时异步写入器未完成处理导致波形数据丢失的竞态问题
    *修复非循环模式下prefault尾部decommit导致Linux平台波形消失的问题
    *修复first_payload中直接置零leaf block导致并发解码器数据破坏的问题
    *修复Apple Silicon(ARM64)平台PREFAULT_PAGE_SIZE硬编码4096导致页大小不匹配的问题
    *修复macOS下Python home路径使用Resources而非Versions/Current的问题
    *安装脚本改用LICENSE文件直接替代LICENSE.txt
    *修复pxv_info调用遗留的孤立格式参数

    【性能优化】
    *大幅提升DSO波形绘制性能并添加帧计时功能
    *重绘模拟信号绘制逻辑，提升Windows平台绘制性能
    *优化示波器波形整体绘制性能

    【重构】
    *重构采集状态UI更新逻辑，简化状态同步流程
    *调整demo设备的硬件类型处理逻辑
    *替换边框组件为通用QWidget并优化属性
    *清理移除全部PWMDBG诊断日志代码

    【构建与文档】
    *为macOS添加rpath配置以修复Qt框架加载问题
    *补充完整手动编译流程文档（fx2lafw固件/Python标准库/qtwayland/DMG打包/Rosetta2交叉编译/Universal二进制）
    *macOS部署目标改为14.0
    *完善并重构两份安装指南文档
    *删除macOS和Linux的GitHub Actions构建脚本

--------------------------------------------------------------------------------

    PXView V1.5.3修改
    时间：2026年7月25日
    变更如下：

    【新功能】
    *新增混合信号示波器(MSO)工作模式，支持逻辑通道与模拟通道同屏显示，新增设备模式切换、数字/模拟通道分组显示与主题色适配
    *全新毛刺滤波功能：新增脉冲分析工具、直方图可视化、阈值调节、滤波区间叠加渲染、撤销栈(Ctrl+Z)、配置持久化与自动应用、滤波提示叠加层
    *实现USB设备热插拔支持，跨平台热插拔API，500ms重连宽限期，事件自动通知UI
    *新增波形数据复制功能，右键菜单复制通道/解码器波形数据，支持同时导出逻辑通道原始数据与解码注释
    *协议列表跟随波形可视范围：协议面板底部新增跟随视口开关，仅显示当前波形窗口内的解码条目
    *实现信号可见性持久化，修复切换标签后信号显示状态丢失问题
    *支持libsigrok浮点模拟信号，升级C++20标准，修复ADC整数路径适配上游float电压数据
    *新增大量硬件驱动：Saleae Logic Pro、Chronovu LA、ASIX Sigma、锐科达DS、FTDI LA、零PLUS逻辑立方、IKALOGIC Scanaplus、恒昌DSO-2100、福禄克DMM、Gwinstek GDS-800、罗德与施瓦茨SME 0x、ipdbg LA、uni-t UT32x、Lascar EL-USB、Tondaj SL-814、PCE-322A、横河DLM、树莓派Pico、dcttech-usbrelay、devantech-eth008、greatfet等
    *新增硬件存储深度接口，用于采样深度选择上限校验
    *扩展MCP API：新增完整的光标/测量/会话状态接口，支持无头模式获取真实测量数据
    *实现全量状态同步：触发配置持久化、设备代理通知一致性、采集归属生命周期管理、MCP事件推送
    *支持在MSO模式下添加协议解码器

    【问题修复】
    *修复MSO模式下会话文件存储与解析的通道类型不匹配问题
    *修复DSO模式多项显示与交互问题：光标自动覆盖用户滚动、信号耦合配置未实时同步、采样率配置导致的无限循环
    *修复DSO视图交互、时基显示和UI卡顿问题
    *修复DSO模式体验问题：实现自由缩放和平移、Windows滚轮节流、滚动条异常、触发位置显示错误
    *修复多线程下段错误和线程安全问题：包括Qt线程数据竞争、Windows工作线程退出SIGSEGV崩溃、触发器内存释放错误
    *修复解码完成后界面刷新和绘制异常
    *修复Stream模式下采集解码卡死及界面刷新异常
    *修复热插拔设备检测和固件升级重连逻辑，改用连接ID替代设备指针避免扫描重分配导致指针失效
    *修复示波器缩放方向逻辑，匹配常规滚轮操作习惯
    *修复DSO模式下时基选择逻辑与配置获取
    *修复工作模式切换时通道使能不同步问题
    *修复侧边栏移除信号处理选项及模拟通道过滤和旋钮同步问题
    *修复多项DSO功能问题：屏蔽默认libusb日志、logic通道除零和空指针、表头交互、探头分压比配置
    *修复DSO通道在MSO模式下不正确显示，为无vdiv配置的设备提供标准电压档位fallback
    *修复macOS链接问题并优化流模式处理
    *修复Windows模态断言弹窗死循环与EventBus护栏问题
    *修复广播同步异步竞态，根治DSO模式切换崩溃
    *修复两处内存悬空和栈溢出崩溃
    *修复多处空指针访问与兼容性问题
    *修复D7通道假边沿和mipmap计算错误
    *修复不选任何通道打不开软件的问题
    *减少冗余日志噪音，优化多设备兼容性
    *系统性修复状态同步漏洞，补全全链路通知
    *修复触发状态不同步问题

    【性能优化】
    *优化渲染性能：移除热路径调试日志、调整DSO信号包络绘制阈值、复用绘图内存缓冲区、缓存探头系数避免频繁调用驱动接口
    *优化模拟信号绘制：复用QPointF缓冲减少内存分配
    *优化Windows滚轮缩放：添加节流机制避免密集重绘，提升滚动流畅度

    【其他】
    *完成核心层现代化重构，替换旧式消息广播为类型安全事件系统
    *将SigSession核心逻辑拆解为独立管理器类（EventBus、CaptureManager、DecodeTaskManager等）
    *完成数据层与视图层解耦，引入SignalModel/DecoderStack等纯数据类作为单一数据源
    *将libsigrok/libsigrokdecode改为git submodule引用
    *全面替换裸指针为std::shared_ptr管理堆内存
    *移除驱动层fork配置键，改用应用层封装接口

--------------------------------------------------------------------------------

    PXView V1.5.2修改
    时间：2026年7月22日
    变更如下：
    修复了若干bug

--------------------------------------------------------------------------------

    PXView V1.5.1修改
    时间：2026年6月27日
    变更如下：
    *调整border颜色值适配样式需求
    *为控件添加WA_StyledBackground属性修复Fusion风格白边
    *重构samplingbar成员为指针避免提前初始化问题
    *改进MainFrame背景色设置逻辑
    *修复libsigrokdecode解码器内存管理问题
    *优化QSS样式表适配新的UI渲染逻辑
    *为StoreSession添加导出通道和类型配置，实现导出数据筛选逻辑
    *在web端新增捕获状态轮询，更新应用的捕获状态管理
    *移除viewport.cpp中重复的dbp.scale(dpr, dpr)调用，合并高DPI修复
    *修复启动时由于未启用通道导致的除以零崩溃问题(SIGFPE)

--------------------------------------------------------------------------------

    PXView V1.5.0修改
    时间：2026年6月13日
    变更如下：
    *升级Qt5到Qt6，升级qt版本到6.11
    *将ribbon的选项移动到标题栏处，加入标题栏折叠功能
    *为侧边栏和ribbon加入动画
    *侧边栏改为推挤模式，替换原覆盖模式
    *加入惯性滑动
    *加入滤波和日志面板
    *加入波形分组以及分通道颜色标识
    *加入逻辑通道高度配置与渐变背景绘制
    *加入波形高度缩放与垂直滚动
    *加入信号表头右键行高管理
    *加入搜索时间跳转功能
    *加入高级触发模式
    *加入可撤销的滤波（双倍空间存储）
    *重写主题系统，能够自定义颜色，字号等
    *重写svg，使其能够跟随主题变化
    *更改浮动测量样式
    *加入FreeType字体渲染引擎，修复渲染像素偏差
    *加入解码器注释字号配置
    *增加多标签页功能，支持拖拽标签到独立窗口
    *增加c解码器分支，迁移了215个解码器
    *加入磁盘缓存功能，分层存储（内存+磁盘）
    *逻辑信号宏观块状合并渲染，大幅提升渲染速度
    *解码通道pixmap双缓冲渲染
    *解码注解mmap磁盘存储优化
    *优化采集后UI卡顿，内存池与异步拷贝
    *优化侧边Dock展开卡顿
    *加入快捷键设置，取消括号中快捷键显示
    *加入Toast提示组件
    *新增繁体中文翻译
    *加入MCP(Model Context Protocol)服务器，支持AI编程工具控制设备
    *加入MCP网页端聊天界面，支持自然语言控制设备
    *加入侧边栏MCP控制面板，显示服务状态和AI工具连接命令
    *支持15个MCP工具：设备管理、采集控制、协议解码、数据导出等
    *Web客户端支持Claude Code、Codex、OpenCode等AI工具接入
    *若干代码架构层面的重构

--------------------------------------------------------------------------------

    PXView V1.4.9修改
    时间：2025年9月26日
    变更如下：
	*修复不同dpi下窗口拖动问题，比如1080P拖动到4K下
	*更新解码库，优化和新增70多种解码库，总解码库超过220种

--------------------------------------------------------------------------------

    PXView V1.4.8修改
    时间：2025年8月18日
    变更如下：
	*修复废弃1.4.7版本带入的32通道开多于16通道有问题（废弃1.4.7版本）
	*适配新硬件PX Logic 16 Pro
 	*适配新硬件PX Logic 16 Plus
 	*适配新硬件PX Logic 16 base
	*USB的VID与PID更换为开源免费的

--------------------------------------------------------------------------------

    PXView V1.4.7修改
    时间：2025年8月11日
    变更如下：
        *适配新硬件PX Logic 16 Pro
 	*适配新硬件PX Logic 16 Plus
 	*适配新硬件PX Logic 16 base
	*USB的VID与PID更换为开源免费的

--------------------------------------------------------------------------------

    PXView V1.4.6修改
    时间：2025年7月15日
    变更如下：
        *修复stream模式buff大小配置无效问题
--------------------------------------------------------------------------------

    PXView V1.4.5修改
    时间：2025年6月12日
    变更如下：
        *优化触发光标与实际触发位置准确度，在8采样点内
	*修复触发时未采集到预设值百分比时，以实际采集百分比开始上传
--------------------------------------------------------------------------------

    PXView V1.4.4修改
    时间：2025年6月10日
    变更如下：
        *修复触发位置偶发出现不准，偏移过大问题
	*修复buff模式触发后采集满ddr内存后不停止采集导致数据被覆盖问题，
	  该问题在V1.42，V1.43均有，废弃这两个版本
--------------------------------------------------------------------------------

    PXView V1.4.3修改
    时间：2025年6月8日
    变更如下：
        *修复触发等待时上位机显示采集百分比一直为0问题
        *修复触发偶发卡在触发位置，不上传数据
        
        
--------------------------------------------------------------------------------

    PXView V1.4.2修改
    时间：2025年6月7日
    变更如下：
        *增加触发可调节百分比功能
        
--------------------------------------------------------------------------------

    PXView V1.4.1修改
    时间：2025年6月3日
    变更如下：
        *优化usb2.0，解决usb2.0丢包问题
        *优化usb3.0
        *增加win7 x64支持
        
--------------------------------------------------------------------------------

    PXView V1.4.0修改
    时间：2025年4月11日
    变更如下：
        *修正USB2.0模式通道如果不是2的倍数会出现数据错位问题
        *新增流模式buff大小可配置
        
--------------------------------------------------------------------------------

    PXView V1.3.9修改
    时间：2025年4月11日
    变更如下：
        *修正steam模式的滚动模式，改为不停止滚动
        *USB2.0模式通道如果不是2的倍数会出现数据错位问题暂未能解决，推荐客户使用usb3.0模式进行连接

        
--------------------------------------------------------------------------------

    PXView V1.3.8修改
    时间：2025年3月18日
    变更如下：
        *修正中英文切换图标
        *修正PWM频率设置过低导致的错误问题
        *优化USB2.0与USB3.0的读取
        
--------------------------------------------------------------------------------

    PXView V1.3.7修改
    时间：2024年12月1日
    变更如下：
        *修正Linux/mac下usb3.0无法使用问题
        
--------------------------------------------------------------------------------

    PXView V1.3.6修改
    时间：2024年10月7日
    祝大家国庆快乐
    变更如下：
        *废弃1.35版本,v1.35版本变更带入v1.36
        *将saribbon引起的关闭程序出现范围非法内存引起的崩溃问题
        *新增1路PWM0输出，输出频率1hz~1Mhz,占空比0~100%,(后续会进行优化pwm输出更高频率)
        *因PWM1在硬件走线靠近ddr时钟走线，对ddr有影响，pwm1不再开启，只有pwm0可以开启
        
--------------------------------------------------------------------------------

    PXView V1.3.5修改(废弃)
    时间：2024年10月7日
    祝大家国庆快乐
    变更如下：
        *将saribbon引起的关闭程序出现范围非法内存引起的崩溃问题
        *新增2路pwm输出，输出频率1hz~1Mhz,占空比0~100%,(后续会进行优化pwm输出更高频率)
        
--------------------------------------------------------------------------------

    PXView V1.3.4修改
    时间：2024年9月10日
    变更如下：
        *fpga io 电平由sstl修改为hstl
        *修复usb2.0模式下采样率高，上位机usb读取超时无数据问题
        
--------------------------------------------------------------------------------

    PXView V1.3.3修改
    时间：2024年9月2日
    变更如下：
        *fpga 修复stream模式1.32版本带来的低采样率数据错乱问题

--------------------------------------------------------------------------------

    PXView V1.3.2修改
    时间：2024年9月1日
    变更如下：
        *fpga 修改采样率100m以下数据采样存储出现错位问题
        *fpga 移除采样前平滑滤波功能,避免干扰真实信号
        *fpga 解决dma预取数据命中失败问题，导致数据上传错误
        
--------------------------------------------------------------------------------

    PXView V1.3.1修改
    时间：2024年8月28日
    变更如下：
        *优化fpga时钟树（可能可以解决杂波问题）
        
--------------------------------------------------------------------------------

    PXView V1.3.0修改
    时间：2024年8月28日
    变更如下：
        *修复采集过程中usb断开导致上位机卡死无响应问题
        *更新FPGA固件，降低ddr IP AXI时钟为100m（可能可以解决杂波问题）
--------------------------------------------------------------------------------

    PXView V1.2.9修改
    时间：2024年8月26日
    变更如下：
        *修复buff模式满带宽8G运行，最后一个通道采样点提前64个周期问题
        
--------------------------------------------------------------------------------

    PXView V1.2.8修改
    时间：2024年8月25日
    变更如下：
        *增加每次采集进行初始化ddr，避免因为温度差异训练导致出现的ddr时序问题
        *修正采集数据每个通道有64个采样点为0的数据问题
        *加入低功耗，采集完毕关闭ddr时钟与通道采集时钟，降低功耗
        *修复1.27用错fpga版本问题
        
--------------------------------------------------------------------------------

    PXView V1.2.7修改
    时间：2024年8月25日
    变更如下：
        *增加每次采集进行初始化ddr，避免因为温度差异训练导致出现的ddr时序问题
        *修正采集数据每个通道有64个采样点为0的数据问题
        *加入低功耗，采集完毕关闭ddr时钟与通道采集时钟，降低功耗
        
--------------------------------------------------------------------------------

    PXView V1.2.6修改
    时间：2024年8月23日
    变更如下：
        *更新fpga固件，修复时序问题，解决偶发数据错误
        
--------------------------------------------------------------------------------

    PXView V1.2.5修改
    时间：2024年8月21日
    变更如下：
        *更新fpga固件，修复时序问题，解决偶发数据错误
        *修复github开源url错误问题
        
--------------------------------------------------------------------------------

    PXView V1.2.4修改
    时间：2024年8月15日
    变更如下：
        *修复流模式采集数据超过512MB后，数据异常问题
        
--------------------------------------------------------------------------------

    PXView V1.2.3修改
    时间：2024年8月14日
    变更如下：
        *逻辑分析仪序列号增加到64位，一台电脑可同时连接多台设备
        *解决usb芯片与fpga芯片通讯因为时序问题出现的误码
        
--------------------------------------------------------------------------------

    PXView V1.2.2修改
    时间：2024年8月11日
    变更如下：
        *更新解码库，增加解码协议数量
        *加入保存通道模式配置，解决关闭程序后，通道配置模式无法保存
        
--------------------------------------------------------------------------------

    PXView V1.2.1修改
    时间：2024年8月10日
    变更如下：
        *修复解码结果多字节搜索导致的崩溃问题
        *开发stream 模式到2通道1G
--------------------------------------------------------------------------------

    PXView V1.2.0修改
    时间：2024年8月8日
    变更如下：
        *增加触发前预先缓存4k数据，解决触发时刻概率丢失第一个触发数据
        *修正第32通道数据偏移64个采样点问题
        
--------------------------------------------------------------------------------

    PXView V1.1.9修改
    时间：2024年8月6日
    变更如下：
        *修正采样时间显示不全
        *修正usb2.0模式电流不够，配置为500ma
        
--------------------------------------------------------------------------------

    PXView V1.1.8修改
    时间：2024年8月5日
    变更如下：
        *修正解码数据与指示延时不对应
        *修正E快捷键模式选择不生效
        *修正修改通道颜色后，点击文件-默认配置无法生效，无法恢复默认通道颜色配置

--------------------------------------------------------------------------------

    PXView V1.1.7~1.1.2修改
    时间：2024年8月4日
    变更如下：
        *修正解码数据与逻辑数据不对应问题
        *修改通道颜色与信号不对应问题
        *修正采集完毕丢了第一次触发数据，采集数据多了一些导致
        *修正因为usb导致通道数据串到另外一个通道问题
      
--------------------------------------------------------------------------------

    PXView V1.1.1
    时间：2024年8月1日
    变更如下：
        *将数据默认颜色修改为彩色
        
--------------------------------------------------------------------------------

    PXView V1.1.0
    时间：2024年7月27日
    变更如下：
        *修正界面被遮挡问题
        *将stream模式2G带宽降低为1.6G，确保usb3.0的hub都能满足

--------------------------------------------------------------------------------
    PXView V1.1.0
    时间：2024年7月27日
    变更如下：
        *修正界面被遮挡问题
        *将stream模式2G带宽降低为1.6G，确保usb3.0的hub都能满足
        

--------------------------------------------------------------------------------
    PXView V1.0.0
    PXview基于DSview 1.3.1 与sigrock 2.0项目，感谢他们的贡献开源贡献
        [dreamsourcelab.com](https://www.dreamsourcelab.com)
        [sigrok.org](https://sigrok.org)
    
    变更如下：
        *加入SCI Logic 支持，usb3.0 32通道1G采样率
        *PXview加入PWM输出功能，基于SCI Logic



