Releases: Horldsence/vofa-NEXT
Release list
v0.3.0
VOFA-NEXT v0.3.0 Release Notes
✨ New Features
Compiler Pipeline
- Three-stage pipeline: HIR → plane projection → lowering. Backend owns all compilation; frontend reads snapshots only.
- Compile error view: offending nodes get red box-shadow, edges turn red, with structured help popovers.
String-Domain Plane
- New string plane alongside numeric plane, carrying TextInput, Str operations (Mid/Delete/Replace), and Trigger text outputs.
- Protocol out port exposes raw bytes as
strport (legacychplaceholders preserved with gating). - Raw data view shows the text port; UI syncs.
Trigger Backend-Driven
- Edge state (
prev_trigger) tracked backend‑side, eliminating false rising edges in manual mode; polling replaced by single event. - Text output routed via string plane; frontend read‑only.
Widget Palette
- Virtualized with
@tanstack/react-virtualfor large sets. - Compact collapsible layout with quick‑jump bar for filtering and navigation.
- Dedicated sections for Trigger, TextInput, and Str widgets.
Waveform Improvements
- History lookback while running: zoom/pan doesn’t pause refresh; scrub back without losing live tail.
- Cursor snaps to nearest visible channel instead of always channel 0.
Unified Error Crate
- Strong‑typed domain errors (protocol/node/transport, etc.) replace
Box<dyn Error>; frontend gets actionable structured guidance.
Auto‑Update
- Static release manifests replace GitHub API calls, bypassing rate limits and ensuring deterministic channel behavior.
🛠 Backend Refactor (Rust Workspace)
- Split into 23 focused sub‑crates + 7 façades (
core,protocol,buffer,nodes,transport,automotive,dsp);src-tauribecomes thin shell. - Commands split into 7
cmd_*sub‑crates; app shell split intoapp_state,notify_events,subscription,pipeline_*,menu_shell,update_flow. - Backend is sole authority for protocol ports, biquad packing, frame packing,
ProtocolSourceinjection, and Trigger edge detection. - Node engine arm‑ified per
NodeKindvariant – adding a new kind doesn’t touch unrelated code. - Tests reorganized per port domain and kind; Str coverage added; clippy
denycleaned.
🐛 Fixes & Performance
- Tab snapshot resilience: surviving tabs re‑sync to backend after deletion/replacement – no phantom nodes.
- Preset auto‑channels: auto‑derived channels always resolve correctly.
- SlidingPill indicator: uses
ResizeObserverper tab, follows active tab correctly after re‑render and resize. - Raw data append: active state shown in UI.
- Manual‑mode Trigger:
prev_triggertracked properly, preventing spurious rising edges on threshold toggle. - Waveform zoom/pan: no longer auto‑pause refresh, eliminating touchpad stalls.
- Light theme: backgrounds follow color tokens, no hard‑coded hex.
- Clippy deny: Rust 1.97 strict lints fixed across all crates.
📦 Installers
- macOS:
.dmg(universal / arm64 / amd64) - Linux:
.deb/.AppImage/.rpm - Windows:
.msi/.exe(NSIS)
✨ 新特性
编译器重构
- 三段流水线:HIR → 平面投影 → 降级。后端全权编译,前端只读快照。
- 编译错误视图:出错节点红框、连线染红,带结构化帮助气泡。
字符串域平面
- 新增字符串平面,与数值平面并列,承载 TextInput、Str 操作(Mid/Delete/Replace)及触发器文本输出。
- 协议 out 端口暴露原始字节为
str端口(旧ch占位保留,门控切换)。 - 原始数据视图显示文本端口,UI 同步更新。
触发器后端化
- 边沿状态(
prev_trigger)由后端追踪,消除手动模式假上升沿;轮询改单次事件。 - 文本输出走字符串平面,前端只读。
控件面板
- 虚拟化渲染(
@tanstack/react-virtual),支持海量控件。 - 紧凑折叠布局 + 快速跳转条,按名称过滤并一键跳转分类。
- 触发器、TextInput、Str 各自独立分组。
波形增强
- 运行中历史回看:缩放/平移不暂停刷新,可边实时边回看。
- 光标吸附最近可见通道,不再固定通道 0。
统一错误 crate
- 强类型领域错误(protocol/node/transport 等)替代
Box<dyn Error>,前端获得结构化可操作指引。
自动更新
- 静态发布清单替代 GitHub API,规避速率限制,通道行为确定。
🛠 后端重构(Rust 工作区)
- 拆分为 23 个聚焦子 crate + 7 个 façade(core/protocol/buffer/nodes/transport/automotive/dsp),
src-tauri收为薄壳。 - 命令拆为 7 个
cmd_*子 crate,应用壳拆为app_state、notify_events、subscription、pipeline_*、menu_shell、update_flow。 - 后端作为唯一权威:协议端口、双二阶节打包、帧打包、ProtocolSource 注入、触发器边沿检测均走单一所有者。
- 节点引擎按
NodeKindvariant 分臂实现,新增 kind 无需改动无关代码。 - 测试按端口域和 kind 拆分,新增 Str 覆盖,clippy deny 全部清理。
🐛 修复与性能
- Tab 快照韧性:删除/替换 Tab 后,存活 Tab 自动与后端同步,杜绝幻影节点。
- 预设自动通道:自动派生通道每次正确解析。
- SlidingPill 指示器:使用
ResizeObserver跟踪每个 Tab 尺寸,重渲染后仍正确跟随。 - 原始数据追加:UI 显式显示激活状态。
- 手动模式触发器:正确追踪
prev_trigger,防止阈值切换导致虚假上升沿。 - 波形缩放/平移:不再自动暂停刷新,消除触摸板卡顿。
- 浅色主题:背景改用颜色令牌,去除硬编码十六进制。
- Clippy deny:Rust 1.97 严格 lint 一次性修复。
📦 安装包
- macOS:
.dmg(universal / arm64 / amd64) - Linux:
.deb/.AppImage/.rpm - Windows:
.msi/.exe(NSIS)
v0.2.2
📢 公告:下个版本将重构后端图编译器以提高性能和稳定性,期间暂不处理新的 Issue 和 PR,感谢理解。
📢 Announcement: the next release rewrites the backend graph compiler for performance and stability — new issues and PRs are on hold until then.
VOFA-NEXT Release Notes
v0.2.2
This is a string-domain release: the graph engine gains a string plane, so text flows through nodes like numbers do. New Str and TextInput widgets produce strings, the Trigger widget moves to backend evaluation, and RawData exposes a str text port. The waveform keeps refreshing while you zoom/pan and snaps its cursor to the nearest visible channel. Under the hood, the backend crates were split into focused sub-crates with a unified typed error crate.
✨ New Features
1. String Plane in the Graph Engine
- Strings are now a first-class domain: string edges route through the graph, are evaluated in the backend, and publish to the text snapshot channel.
2. Str & TextInput Widgets
- Str: string operations (Mid / Delete / Replace) with inline numeric params and its own palette section.
- TextInput: writes a text param into the string plane via a
stroutput port.
3. Trigger: Backend Evaluation
- Trigger nodes are evaluated in the backend graph with edge-detection state; the frontend no longer evaluates locally and reads backend snapshots instead.
4. RawData String Port
- Raw bytes pass through the protocol out port; a new
strtext port replaces thechplaceholder ports (gated on the effective rawData preset).
5. Waveform: Live Pan & Zoom
- Zoom/pan no longer auto-pauses refresh — history lookback works while running; the cursor snaps to the nearest visible channel instead of always ch0.
🐛 Fixes
- Trigger manual mode no longer fires a false rising edge.
- Mid / Delete / Replace saturate
start + countinstead of overflowing. - Output snapshot refreshes after graph commit; raw data append option shows its active state; TextInput label editing fixed.
- Strict clippy errors on Rust 1.97 resolved.
🔧 Internal
- Backend crates split into focused sub-crates (commands → 7
cmd_*; dsp / transport / nodes / automotive / protocol / buffer);vofa-next-*façade crates dropped; new unified typed error crate.
📦 Installers
- macOS:
.dmg— universal / arm64 / amd64 - Linux:
.deb/.AppImage - Windows:
.msi/.exe(NSIS)
VOFA-NEXT 发布说明
v0.2.2
本次为 字符串域 版本:图引擎新增字符串数据面,文本像数值一样在节点间流动。新增 Str 与 TextInput 控件产出字符串,Trigger 控件改为后端求值,RawData 暴露 str 文本端口。波形在缩放/平移时保持刷新,游标吸附最近可见通道。底层方面,后端 crate 拆分为更聚焦的子 crate,并引入统一的强类型 error crate。
✨ 新特性
1. 图引擎字符串面
- 字符串成为一等数据域:字符串边在图中路由、由后端求值,并发布到文本快照通道。
2. Str 与 TextInput 控件
- Str:字符串运算(Mid / Delete / Replace),数值参数内联编辑,面板独立分组。
- TextInput:通过 str 输出端口将文本参数写入字符串面。
3. Trigger 后端求值
- Trigger 节点纳入后端图求值,带边沿检测状态;前端不再本地求值,改为读取后端快照。
4. RawData 字符串端口
- 原始字节经协议输出端口透传;新增 str 文本端口替代原 ch 占位端口(按实际 rawData 预设门控)。
5. 波形:实时平移缩放
- 缩放/平移不再自动暂停刷新——运行中可回看历史;游标吸附最近可见通道,而非固定 ch0。
🐛 修复
- 修复 Trigger 手动模式误触发上升沿的问题。
- Mid / Delete / Replace 的
start + count改为饱和运算,不再溢出。 - 图提交后刷新输出快照;原始数据追加选项正确显示激活状态;修复 TextInput 标签编辑。
- 解决 Rust 1.97 下的严格 clippy 报错。
🔧 内部改进
- 后端 crate 拆分为聚焦的子 crate(commands → 7 个
cmd_*;dsp / transport / nodes / automotive / protocol / buffer);移除vofa-next-*门面 crate;新增统一的强类型 error crate。
📦 安装包
- macOS:
.dmg— universal / arm64 / amd64 - Linux:
.deb/.AppImage - Windows:
.msi/.exe(NSIS)
v0.2.1
VOFA-NEXT Release Notes
v0.2.1
This is a palette & trigger patch release: the widget palette is rebuilt as a compact, searchable, virtualized list with a quick-jump bar; a new Trigger widget matches command strings against a rule table (exact / prefix / contains / regex / range / glob) and outputs numbers or text, paired with a new Text Display widget; the 3D display gains a combined trajectory + attitude mode with rotation ports. On the fix side, update checks no longer break on GitHub API rate limits (static release manifests instead), and light-theme backgrounds now actually follow the color tokens.
✨ New Features
1. Trigger Widget: Command Matching Rule Table
- A new Trigger control widget maps command strings to outputs via an ordered rule table — first hit wins, with configurable default miss value/text.
- Six match types per rule: Exact, Prefix, Contains, Regex (with flags), Range (
min..max,Infinitysupported), and Glob (*/?/[abc]/{a,b,c}); each rule outputs either a number or a string. - Manual mode fires the typed command with
Ctrl/Cmd + Enter; Auto mode triggers on upstream input. The backend matcher node mirrors the frontend rule config and caches compiled regex/glob patterns per rule.
2. Text Display Widget
- New Text Display widget renders string values in the data tab — the natural sink for the Trigger widget's string output.
3. Widget Palette Redesign
- Category tabs are replaced by a single scrollable list of collapsible sections (input / transport / protocol / display / math / filter / fft / custom) with compact single-line rows, plus a search box with match highlighting.
- A quick-jump icon bar pinned at the panel top scrolls the inner list to each section and highlights the active one; the jump/highlight logic is a deterministic state machine — no timers, no flicker mid-scroll.
- The list is virtualized (
@tanstack/react-virtual) over a flat header/row model, so scrolling re-renders only visible rows; the model is pure functions with unit tests. - The drag ghost is now centered on the cursor with a scale-up fade on drop, disabled under
prefers-reduced-motion; the sidebar height chain is fixed so panels scroll internally.
4. 3D Display: Trajectory + Attitude Mode
- New combined trajectory-attitude mode renders the trail and the rotating model together; input ports grow to x / y / z (position) plus roll / pitch / yaw (rotation, missing channels default to 0).
- The custom GLB/GLTF model import entry was pulled from this release — the built-in cube remains the only model source for now.
🐛 Fixes
- Update check no longer hits GitHub API 403 rate limits: unauthenticated
api.github.comrequests are capped at 60/hour per egress IP (easily exceeded on shared NAT/VPN egress). Both channels now resolve a static manifest served by the release asset service — stable viareleases/latest/download/latest.json, beta via a rollingbetatag refreshed by the release workflow. Release notes and date come from the manifest itself; the frontend contract is unchanged. - Light theme backgrounds follow tokens: the window base layer uses the
bg-windowtoken, the light theme'sbgActivityis now an actual light color, and activity bar icons stay readable on both light and dark bar backgrounds — locked in by a luminance regression test.
📦 Installers
- macOS:
.dmg— universal - Linux:
.deb/.AppImage - Windows:
.msi/.exe(NSIS)
VOFA-NEXT 发布说明
v0.2.1
本次为 控件面板与触发器 补丁版本:控件面板重构为紧凑、可搜索、虚拟化的折叠列表并配备快捷跳转栏;新增 触发器(Trigger)控件,按规则表匹配命令字符串(精确 / 前缀 / 包含 / 正则 / 区间 / Glob)并输出数值或文本,配套新增 文本显示 控件;3D 显示新增 轨迹+姿态 组合模式与旋转端口。修复方面:更新检查改为静态发布清单,不再受 GitHub API 限流影响;浅色主题背景现在正确遵循颜色令牌。
✨ 新特性
1. 触发器控件:命令匹配规则表
- 新增 触发器 控件,通过有序规则表将命令字符串映射为输出——首个命中规则生效,未命中可配置默认值/默认文本。
- 每条规则支持六种匹配类型:精确、前缀、包含、正则(支持 flags)、区间(
min..max,支持Infinity)、Glob(*/?/[abc]/{a,b,c});输出可选 数值 或 字符串。 - 手动 模式下输入命令后按
Ctrl/Cmd + Enter触发;自动 模式跟随上游输入触发。后端匹配节点镜像前端规则配置,正则/glob 按规则缓存编译结果。
2. 文本显示控件
- 新增 文本显示 控件,在数据页渲染字符串值——触发器控件字符串输出的天然下游。
3. 控件面板重构
- 分类标签页替换为 单滚动折叠分区列表(输入 / 传输 / 协议 / 显示 / 数学 / 滤波 / FFT / 自定义),紧凑单行布局,新增 搜索框。
- 面板顶部固定 快捷跳转图标栏,点击滚动到对应分区并高亮当前分区;跳转/高亮为确定性状态机——无定时器,滚动路径上不高亮闪烁。
- 列表基于
@tanstack/react-virtual虚拟化(扁平 header/row 模型),滚动仅重渲染可见行;模型为纯函数并附单元测试。 - 拖拽幽灵居中于光标,落下时缩放淡入动画(
prefers-reduced-motion下禁用);修复侧栏高度链,面板内部滚动而非外层容器滚动。
4. 3D 显示:轨迹+姿态模式
- 新增 轨迹+姿态 组合模式,拖尾轨迹与旋转模型同屏显示;输入端口扩展为 x / y / z(位置)+ roll / pitch / yaw(旋转,缺失通道补 0)。
- 自定义 GLB/GLTF 模型导入入口本版本撤回——目前模型来源仅保留内置立方体。
🐛 修复
- 更新检查不再触发 GitHub API 403 限流:未认证的
api.github.com请求每出口 IP 限 60 次/小时(共享 NAT/VPN 出口极易超限)。两个通道改为解析 静态清单——stable 走releases/latest/download/latest.json,beta 走发布工作流持续刷新的滚动beta标签。发布说明与日期取自清单本身,前端契约不变。 - 浅色主题背景遵循令牌:窗口基础层改用
bg-window令牌,浅色主题的bgActivity改为真正的浅色,活动栏图标在深浅背景上均可读——并有亮度回归测试锁定。
📦 安装包
- macOS:
.dmg— universal - Linux:
.deb/.AppImage - Windows:
.msi/.exe(NSIS)
v0.2.0
VOFA-NEXT Release Notes
v0.2.0
This release is a protocol & widget release: all devices (transports and protocols) are now widgets living in the unified node graph, and every protocol is rebuilt on a custom frame schema engine — a protocol is just a frame schema (a list of blocks) shared by decoding and encoding, so user-defined frames get named ports and transport hot-update for free. The Command widget grows into a multi-frame sender with per-frame auto-send; the raw data view understands byte-source channels with scoped send targets; theming gains a full CSS style theme layer (with external URL loading and reduced-motion); and the app can now update itself, with stable/beta channels and an in-app release-notes dialog. On the reliability side, the raw data filter moved to a zero-IPC local incremental view (fixing the >10 MB/s freeze), CAN/logic/decoded lists are wired to backend filtered subscriptions, and the waveform gets proper pan gestures plus auto-set that finally works for sub-mV signals.
✨ New Features
1. Everything Is a Widget: Devices Unified into the Node Graph
- Transports and protocols are no longer special-cased "devices" — they are widgets in the same node graph as displays and solvers, with unified creation, configuration, and connection flows.
- The backend node crates were restructured around this model (frame decoder blocks, compile/eval pipelines, byte plan), and the frontend store, quick-start templates, and app export/import were migrated to the widget model.
2. Custom Frame Schema Engine
- A protocol is now defined as a frame schema — a block list shared by decoding (frame decode) and encoding (frame generation/sending). All existing protocol kinds (JustFloat / FireWater / RawData / Slcan / CandleLight / LogicDecode) are schema presets; users can define fully custom blocks.
- Blocks get named ports, so schema-defined fields wire directly into the node graph; transports support hot-update of their configuration without reconnecting.
- New
schemamodel in the core crate (shared serde contract with the frontend) and aschema_enginein the protocol crate, including checksum algorithms (sum8 / xor8 / crc8 / crc16-Modbus / crc16-CCITT / crc32 / LRC / custom script).
3. Multi-Frame Command Sender
- The Command widget now holds multiple frames instead of a single block list: add, remove, and edit frames in a sidebar, each with its own send mode — manual or per-frame auto-send timer.
var_refblocks across all frames derive named input ports on the widget node (union, deduplicated), so graph edges can drive any frame field. Legacy single-frame configs are normalized transparently.
4. Raw Data Byte-Source Channels & Scoped Send
- Each raw data channel is classified as decoder-node (FrameDecoder raw bypass bytes), byte-source (raw RX/TX bytes of the upstream transport, traced through protocol nodes), or numeric — byte-source channels show the transport's actual wire bytes.
- The send panel in the raw data view sends to the scoped transport target of the selected channel, and new graphs get a sensible initial seed.
5. CSS Style Themes & Reduced Motion
- A new CSS style theme layer sits alongside color-token themes, with built-in Default and Monet CSS themes under
public/themes/; custom CSS themes can be loaded from external URLs. - The theme editor is now tabbed (Color Theme / CSS Style Theme), and a new reduced-motion accessibility toggle disables animations app-wide.
6. Auto Update with Release / Beta Channels
- The app checks for updates on startup (toggleable) and shows status in the status bar; the update dialog displays release notes and supports skip this version.
- Switchable stable / beta channel (follows the current version by default, switching asks for confirmation); cross-channel upgrades are allowed, downgrades are never offered. Download and install reuse tauri-plugin-updater with verified signatures.
7. Custom Baud Rate & Blur Validation
- The baud rate dropdown is now an editable input with preset suggestions — any baud rate can be entered (closes #3). Numeric fields keep a local text state and validate on blur instead of clamping per keystroke; the same pattern applies to the test-data sample rate.
8. Backend Filtered Subscriptions for CAN / Logic / Decoded Streams
- New unified filtered stream sources (
Filtered{Can,Logic,Decoded}StreamSource) withCanFrameFilter/LogicSampleFilter/DecodedEventFilterin the core crates; a filtered subscription replays full matching history then goes incremental. - The CAN frame list (ID / direction filter) and the decoded event list (protocol type filter) now run on local buffers fed by these backend filtered subscriptions instead of client-side array filtering.
- Shard activation fix: backlog now reports per-cursor unread bytes, so idle shards sleep instead of waking on stored history.
🐛 Fixes & Performance
- Raw data freeze eliminated (refs #8): the backend filtered subscription pushed a second full-rate stream over IPC (measured 2×16.6 MB/s base64 at >10 MB/s) with no backpressure, freezing the app for 10+ seconds when switching filters. Filtering now runs in a local incremental view over the existing frontend buffer — instant filter switch, zero extra IPC — with 13 new unit tests.
- Data-path performance instrumentation: rate-limited
perfLogaggregation (msg/s, MB/s, queue depth) toggleable via localStorage, plus a fix for a subscribe-cancel race that leaked backend tasks. - Waveform pan & zoom: left-drag keeps box-select; pan via right-drag, shift+left-drag, or middle-drag (with a one-time hint toast); the browser and app context menus are suppressed over the chart. Auto-set snaps vPerDiv to 1-2-5 steps across any decade and formats with SI prefixes (e.g.
20uV/div), so sub-mV signals are no longer flattened. - ResizeObserver loops silenced: all RO callbacks deferred to rAF; benign third-party loop errors filtered.
- Structured backend errors: backend errors serialize as a tagged enum for structured, actionable frontend guidance.
- Backend refactor: 8 oversized modules (500+ lines) split into focused subdirectories with tests extracted to
tests/— no behavior change.
📦 Installers
- macOS:
.dmg— universal / arm64 / amd64 - Linux:
.deb/.AppImage/.rpm - Windows:
.msi/.exe(NSIS)
VOFA-NEXT 发布说明
v0.2.0
本次发布是 协议与控件 版本:所有设备(传输层与协议)统一为 节点图控件,协议全部重构在 自定义帧 Schema 引擎 之上——协议即一份帧 schema(块列表),解码与编码共用同一份定义,用户自定义帧天然拥有命名端口与传输热更新。命令发送控件升级为 多帧发送器,支持逐帧定时自动发送;原始数据视图理解 字节源通道 并支持定向发送;主题系统新增完整的 CSS 样式主题 层(支持外部 URL 加载与减弱动效);应用现在可以 自更新,支持 stable/beta 通道与应用内发布说明对话框。可靠性方面:原始数据过滤改为零 IPC 的本地增量视图(修复 >10MB/s 卡死),CAN/逻辑/解码列表接入后端过滤订阅,波形获得完整的平移手势与适配亚毫伏信号的 auto-set。
✨ 新特性
1. 万物皆控件:设备统一进节点图
- 传输层与协议不再是特殊处理的"设备"——它们与显示、求解器一样成为节点图中的控件,创建、配置与连线流程完全统一。
- 后端 nodes crate 围绕此模型重构(帧解码块、编译/求值流水线、字节规划),前端 store、快速开始模板与应用导入导出同步迁移到控件模型。
2. 自定义帧 Schema 引擎
- 协议现在定义为一份 帧 schema——解码(帧解析)与编码(帧生成/发送)共用的块列表。所有现有协议 kind(JustFloat / FireWater / RawData / Slcan / CandleLight / LogicDecode)都是 schema 预设;用户可完全自定义块。
- 块拥有 命名端口,schema 定义的字段可直接接入节点图连线;传输层支持 热更新 配置,无需断开重连。
- core crate 新增 schema 模型(与前端共享 serde 契约),protocol crate 新增 schema_engine,内置校验算法(sum8 / xor8 / crc8 / crc16-Modbus / crc16-CCITT / crc32 / LRC / 自定义脚本)。
3. 多帧命令发送器
- 命令控件从单块列表升级为 多帧:侧边栏增删编辑帧,每帧独立发送模式——手动或 逐帧定时自动发送。
- 所有帧的 var_ref 块在控件节点上派生 命名输入端口(并集去重),节点图边可驱动任意帧字段;旧版单帧配置自动透明归一化。
4. 原始数据字节源通道与定向发送
- 原始数据每条通道分类为 解码节点(FrameDecoder raw 旁路字节)、字节源(经协议节点上溯到的上游传输原始收发字节流)或 数值——字节源通道展示传输线上真实字节。
- 原始数据视图的发送面板按所选通道 定向发送到对应传输,新建图获得合理的初始节点种子。
5. CSS 样式主题与减弱动效
- 新增 CSS 样式主题 层,与颜色令牌主题并存;内置 Default 与 Monet 两套 CSS 主题(位于 public/themes/),支持从 外部 URL 加载自定义 CSS 主题。
- 主题编辑器改为分页(颜色主题 / CSS 样式主题),新增 减弱动效 无障碍开关,一键禁用全应用动画。
6. 自动更新(Release / Beta 通道)
- 启动时检查更新(可关闭),状态栏显示更新状态;更新对话框展示 发布说明,支持 跳过此版本。
- 可切换 stable / beta 通道(默认跟随当前版本,切换需确认);允许跨通道升级,永不提供降级。下载与安装复用 tauri-plugin-updater,签名校验。
7. 自定义波特率与失焦校验
- 波特率下拉框改为 可编辑输入框 + 预设建议,可输入任意波特率(closes #3)。数值字段保留本地文本状态、失焦时校验,不再逐键钳制;测试数据采样率字段采用同样模式。
8. CAN / 逻辑 / 解码流的后端过滤订阅
- 新增统一过滤流源(Filtered{Can,Logic,Decoded}StreamSource)与核心 crate 中的 CanFrameFilter / LogicSampleFilter / DecodedEventFilter;过滤订阅先 回放全部匹配历史 再增量推送。
- CAN 帧列表(ID / 方向过滤)与解码事件列表(协议类型过滤)改为由后端过滤订阅喂入本地缓冲,不再做前端数组过滤。
- 分片激活修复:积压量按游标未读字节统计,空闲分片不再因存量历史被唤醒。
🐛 修复与性能
- 原始数据卡死消除(refs #8):后端过滤订阅经 IPC 推送了第二条全速率流(实测 >10MB/s 时 2×16.6MB/s base64)且无背压,切换过滤时应用卡死 10 秒以上。过滤改为在现有前端缓冲上做 本地增量视图——切换即时、零额外 IPC——并新增 13 个单元测试。
- 数据路径性能埋点:速率受限的 perfLog 聚合(msg/s、MB/s、队列深度),localStorage 开关;修复订阅取消竞态导致的后端任务泄漏。
- 波形平移与缩放:左键拖拽保持框选;右键拖拽、Shift+左键或中键 平移(带一次性提示 toast);屏蔽图表上的浏览器与应用右键菜单。auto-set 按 1-2-5 步进跨数量级吸附 vPerDiv 并以 SI 前缀格式化(如 20uV/div),亚毫伏信号不再被压成一条直线。
- ResizeObserver 循环静音:所有 RO 回调延迟到 rAF;过滤第三方良性循环报错。
- 结构化后端错误:后端错误序列化为标记枚举,前端可给出结构化、可操作的指引。
- 后端重构:8 个超过 500 行的模块拆分为子目录,测试抽取到 tests/——无行为变化。
📦 安装包
- macOS:
.dmg— universal / arm64 / amd64 - Linux:
.deb/.AppImage/.rpm - Windows:
.msi/.exe(NSIS)
v0.1.9
VOFA-NEXT Release Notes
v0.1.9
This release is a raw data release: the raw data view now distinguishes receive (RX) vs send (TX) — every byte sent from the send panel is recorded into the raw data stream and marked with a color-coded direction indicator (↓ green RX / ↑ blue TX); a new filter toolbar adds direction (All / RX / TX) and content search, with the filtering executed in the Rust backend — only matching chunks are pushed to the frontend, so even at 20 MB/s+ rates the view only receives what it actually displays; the raw data collector is rebuilt as a cursor-based non-consuming buffer so every subscriber reads shared history independently. The DSP graph gains FFT/IFFT solver nodes with time/frequency domain-typed port wiring (cross-domain connections are blocked, plus a new FFT quick-start template); on Windows the serial port list now shows device descriptions; and the built-in themes get a refreshed palette with a new window-background token.
✨ New Features
1. Cursor-Based Non-Consuming Raw Data Collector
- The raw data collector no longer consumes data on drain: it is a fixed-capacity ring of chunks with an absolute
base_index; every subscriber reads with its own cursor (read_from/read_filtered_from), so multiple views share the same history within capacity, and a stale cursor auto-aligns tobase_indexwhen data has been dropped.
2. FFT / IFFT Solver Nodes with Domain-Typed Port Wiring
- New FFT (SpectrumSink) and IFFT solver nodes in the node graph (30 FPS spectrum ticker, zero-phase IFFT reconstruction with ring playback); the Spectrum widget gains a frequency-domain
spectruminput port fed by graph edges instead of a dropdown (legacysourceIdfallback kept). - Ports are typed by domain (time / frequency): hover tooltips show the domain and connection validation blocks cross-domain edges (RawData dynamic ports resolve as time domain).
- Quick Start gains an FFT spectrum analysis template (FFT → Spectrum → IFFT).
3. Windows: Serial Port Device Descriptions
- The Windows serial port list now shows the device description / friendly name for each port (previously ID-only; closes #4), displayed in the port picker.
4. Theme Refresh & Window Background Token
- New
bgWindowtheme token; the body background now uses it instead of the editor background, and it participates in acrylic blending. - Dark / Monet / Light palettes are rebalanced for deeper backgrounds and higher contrast (brighter primary/secondary text, sharper disabled/hover states, finer waveform grid and text).
5. About & Project Polish
- The About dialog uses the project icon, updates the author to Horldsence and the license to GPLv2; GitHub and Docs links corrected to Horldsence/vofa-NEXT (#7). Local state/cache directories are removed from the repo and ignored.
📦 Installers
- macOS:
.dmg— universal / arm64 / amd64 - Linux:
.deb/.AppImage/.rpm - Windows:
.msi/.exe(NSIS)
VOFA-NEXT 发布说明
v0.1.9
本次发布是 原始数据 版本:原始数据视图现在区分 接收 (RX) 与 发送 (TX)——发送面板发出的每一字节都会进入原始数据流并带颜色区分的方向标识(↓ 绿色 RX / ↑ 蓝色 TX);新增 过滤工具栏(方向 全部/RX/TX + 内容搜索),且过滤在 Rust 后端完成——只把匹配的 chunk 推给前端,20MB/s 以上高码率下前端也只需显示什么收什么;原始数据收集器重构为 游标式非消费缓冲,各订阅者独立读取共享历史。DSP 节点图新增 FFT/IFFT 求解节点并带 时域/频域 类型化端口接线(跨域连线被拦截,另有新的 FFT 快速开始模板);Windows 串口列表显示 设备描述;内置主题刷新配色并新增 窗口背景 令牌。
✨ 新特性
1. 游标式非消费原始数据收集器
- 原始数据收集器不再"取出即消费":改为固定容量环形 chunk 存储 + 绝对 base_index;每个订阅者用自己的游标读取(read_from / read_filtered_from),多个视图在容量内共享同一份历史;游标落后(数据已被丢弃)时自动对齐到 base_index。
2. FFT/IFFT 求解节点与时域/频域类型化端口
- 节点图新增 FFT(SpectrumSink)与 IFFT 求解节点(30 FPS 频谱 ticker、零相位 IFFT 重建 + 环形回放);Spectrum 控件新增频域 spectrum 输入端口,数据源由节点图边提供(不再用下拉框,保留旧 sourceId 回退)。
- 端口按域(时域/频域)类型化:悬停 tooltip 显示所属域,连线校验拦截跨域连接(RawData 动态端口解析为时域)。
- 快速开始新增 FFT 频谱分析模板(FFT → Spectrum → IFFT)。
3. Windows:串口设备描述
- Windows 串口列表现在显示每个串口的设备描述 / 友好名称(此前只有 ID;closes #4),端口选择器同步展示。
4. 主题刷新与窗口背景令牌
- 新增 bgWindow 主题令牌;body 背景改用窗口背景(不再用编辑器背景),并参与亚克力混合。
- Dark / Monet / Light 三套配色重新平衡:背景更深、对比度更高(主/次文字更亮、禁用/悬停态更清晰、波形网格与文字更细腻)。
5. 关于与项目打磨
- 关于对话框改用项目图标,作者更新为 Horldsence,许可证改为 GPLv2;GitHub 与文档链接修正为 Horldsence/vofa-NEXT(#7)。本地状态/缓存目录移出仓库并加入忽略。
📦 安装包
- macOS:
.dmg— universal / arm64 / amd64 - Linux:
.deb/.AppImage/.rpm - Windows:
.msi/.exe(NSIS)
v0.1.8
VOFA-NEXT Release Notes
v0.1.8
This release is a usability & polish release: dock dragging is rebuilt on pointer events with a ghost preview that follows the cursor — reliable under WKWebView, where the old HTML5 drag-and-drop was flaky; a third built-in theme "Monet" joins the list together with a concentric radius token system, pill-style activity bar buttons and an overflow-driven responsive status bar; the new Quick Start panel applies built-in or imported workspace templates in one click, and backups become v2 sectioned snapshots that can be split-exported and selectively imported; double-clicking a widget node now reopens its data window (with a first-close onboarding hint); on Windows the broken native menu bar on transparent windows is replaced by a fully themed in-app menu bar with working zoom shortcuts; plus a waveform cursor fix for DPR displays.
✨ New Features
1. Pointer-Based Drag & Drop with Ghost Preview
- New dockDrag controller: pointer-based dragging for tabs / cards / widgets / sidebar title bars — reliable under WKWebView where HTML5 DnD is flaky.
- Ghost preview follows the pointer; drop zones (page edges, card edges, sidebar edges, node canvas) are hit-tested by the controller instead of dataTransfer.
- Tab-bar merge hover and canvas drop highlights are driven from the controller.
- Removed SnapDropOverlay and all HTML5 drag handlers; added unit tests for the drag controller.
2. Monet Theme, Radius Tokens, Activity Bar Pills & Overflow-Driven Status Bar
- New "Monet", a low-saturation grey dark theme — the 3rd built-in theme.
- Concentric radius tokens (12 / 8 / 6) applied across chrome components.
- Activity bar switches to pill-style buttons with even inset alignment.
- Status bar tiers are now overflow-driven (replacing fixed pixel breakpoints) with compact percentage-only buffer indicators; the status bar visibility toggle is wired up.
- Fix inline search input double focus ring (Settings search, port filter).
3. Quick Start Templates & Sectioned Split Backup
- Quick Start panel (Rocket in the activity bar): one-click apply of built-in templates (Math / Filter / CAN / Serial / Demo) or an imported template file.
- Applying replaces the workspace, or merges the template as a new control tab with full ID remapping (widgets, nodes, edges, RawData port handles, dock cards).
- Backup snapshots move to v2 and become sectioned: node graph, window layout, settings, transport+protocol, widgets+tabs. The new Split Backup dialog exports only the selected sections and imports selectively; legacy v1 snapshots migrate automatically (all sections).
4. Double-Click to Reopen Windows & Unified Prompt Style
- Double-clicking a widget node on the canvas now reopens or activates its data window; the widget→tab mapping is centralized in lib/utils/widgetTab.ts (tab id equals widget id), shared by addWidget and the new reopen path.
- Window-backed nodes show a "double-click to open" hint and tooltip.
- Closing a data window for the first time (per session) pops an onboarding-style toast explaining that the widget node stays on the canvas and can be reopened by double-clicking; it respects the global contextual-tips setting.
- In-app prompt surfaces are unified with the first-run tour look: a new prompt-card CSS family (card chrome, eyebrow, title, body, primary/ghost buttons) applied to notification toasts, contextual hint bars and the dropped-data popover.
5. Windows: Custom Menu Bar for Transparent Windows
- The Windows native menu bar cannot render correctly on a transparent (WS_EX_LAYERED) window — white-on-white text with content showing through. It is replaced by a fully themed custom menu bar (App / File / Edit / View / Window / Help) rendered in the webview on Windows; macOS and Linux keep the native menu.
- Previously inert zoom items are wired to real WebView2 zoom via setZoom, with a Windows-only capability for the required window APIs; menu accelerators (Ctrl+T/W/B/R, zoom keys) are handled.
6. Waveform Cursor Fix on DPR Displays
- The uPlot bounding box is now converted to CSS pixels so cursor positions line up correctly on high-DPI displays.
📦 Installers
- macOS:
.dmg— universal / arm64 / amd64 - Linux:
.deb/.AppImage/.rpm - Windows:
.msi/.exe(NSIS)
VOFA-NEXT 发布说明
v0.1.8
本次发布是 体验与打磨 版本:停靠区拖拽全面改为 基于指针事件 + 幽灵预览(WKWebView 下更可靠,替代了不稳定的 HTML5 拖拽);新增第三个内置主题 Monet(低饱和度灰暗色),配套同心圆半径令牌(12/8/6)、活动栏胶囊按钮与 溢出驱动的分级状态栏;新增 快速开始 面板(一键套用内置/导入的工作区模板),备份升级为 v2 分节快照(可分节导出、选择性导入);画布上 双击控件节点即可重新打开/激活其数据窗口(首次关闭时有引导提示);Windows 上透明窗口无法正常渲染原生菜单栏,改为完全主题化的应用内菜单栏并接通真实缩放快捷键;另修复高 DPI 显示器上的波形光标定位。
✨ 新特性
1. 基于指针事件的拖拽与幽灵预览
- 新增 dockDrag 控制器:标签页 / 卡片 / 控件 / 侧边栏标题栏统一走指针拖拽——在 WKWebView 下可靠(HTML5 DnD 在此环境不稳定)。
- 幽灵预览跟随指针移动;放置区(页面边缘、卡片边缘、侧边栏边缘、节点画布)由控制器命中测试,不再依赖 dataTransfer。
- 标签栏合并悬停与画布放置高亮均由控制器驱动。
- 移除 SnapDropOverlay 与全部 HTML5 拖拽处理,新增拖拽控制器单元测试。
2. Monet 主题、半径令牌、活动栏胶囊与溢出驱动状态栏
- 新增 Monet:低饱和度灰色暗色主题(第 3 个内置主题)。
- 同心圆半径令牌(12 / 8 / 6)统一应用于各界面组件。
- 活动栏改为胶囊样式按钮,内边距对齐更均匀。
- 状态栏分级改为溢出驱动(取代固定像素断点),缓冲指示改为紧凑的纯百分比样式;状态栏可见性开关已接通。
- 修复内联搜索框的双重聚焦环(设置搜索、串口过滤)。
3. 快速开始模板与分节拆分备份
- 新增 快速开始 面板(活动栏火箭图标):一键套用内置模板(Math / Filter / CAN / Serial / Demo)或导入的模板文件。
- 套用可替换整个工作区,或作为新控件标签页合并(完整 ID 重映射:控件、节点、边、RawData 端口句柄、停靠卡片)。
- 备份快照升级 v2 并分节:节点图、窗口布局、设置、传输+协议、控件+标签页。新的拆分备份对话框可只导出所选分节、选择性导入;旧版 v1 快照自动迁移(全分节)。
4. 双击重开窗口与统一提示样式
- 画布上双击控件节点即可重新打开/激活其数据窗口;控件→标签页映射集中到 lib/utils/widgetTab.ts(标签页 id 即控件 id),新建与重开共用。
- 窗口型控件节点显示"双击打开"提示与 tooltip。
- 首次(每次会话内)关闭数据窗口时弹出引导式 toast,说明控件节点仍在画布上、可双击重新打开;遵循全局"上下文提示"设置。
- 应用内提示面统一为首次运行向导的视觉风格:新增 prompt-card CSS 系列(卡片边框、eyebrow、标题、正文、主/幽灵按钮),应用于通知 toast、上下文提示条与丢弃数据弹层。
5. Windows:透明窗口自定义菜单栏
- Windows 原生菜单栏在透明(WS_EX_LAYERED)窗口上无法正确渲染——白字白底、内容透出。改为在 webview 内渲染完全主题化的自定义菜单栏(App / File / Edit / View / Window / Help);macOS 与 Linux 保留原生菜单。
- 原先无效的缩放菜单项接通真实 WebView2 缩放(setZoom),新增 Windows 专属 capability;接管菜单快捷键(Ctrl+T/W/B/R、缩放键)。
6. 高 DPI 波形光标修复
- uPlot 包围盒换算为 CSS 像素,高 DPI 显示器上光标定位准确。
📦 安装包
- macOS:
.dmg— universal / arm64 / amd64 - Linux:
.deb/.AppImage/.rpm - Windows:
.msi/.exe(NSIS)
v0.1.7
VOFA-NEXT Release Notes
v0.1.7
This release is a performance & high-throughput release centered on the data pipeline: the RX path is now a two-stage data loop (feed → eval) with auto-scaling parallel parsing — when backlog builds up, the stream is split at frame boundaries and parsed by up to N parallel workers with order-preserving merge, falling back to sequential mode with zero loss when the backlog clears. All data streams (raw data / waveform / CAN / logic samples / decoded events) share a new unified sharded subscription framework that automatically activates extra channels under backlog and reorders batches by a group-level seq. The frontend coalesces high-frequency pushes into one store update per frame, raw-data chunks are now base64-encoded (~2.6× smaller JSON), a new Settings → Performance category exposes seven live-tunable pipeline parameters, and the status bar now clearly distinguishes real data loss (red drop alarm) from preview overflow (yellow badge) with explanatory guidance.
✨ New Features
1. Auto-Scaling Parallel Data Pipeline
- Two-stage data loop: RX feed and graph evaluation are now decoupled stages connected by bounded channels, so a slow evaluation no longer directly back-pressures parsing.
- Auto-scaling parallel feed: at low backlog the feed parses sequentially in a single worker (behavior identical to before); when backlog exceeds a threshold it automatically scales up to maxFeedWorkers parallel workers.
- Frame-aligned split: the byte stream is split at frame boundaries (ProtocolEngine::split_aligned) and each block is parsed by an independent stateless protocol engine; results are merged in block order — exactly equivalent to sequential parsing.
- Backlog subsides → automatic fallback to sequential mode; incomplete trailing bytes are fed back into the main engine's internal buffer — zero loss across mode switches.
- Parallel split is supported for frame-delimited protocols only (JustFloat / FireWater / Slcan / CandleLight); LogicDecoder (cross-byte state machine) and RawData (no frames) automatically fall back to sequential.
- Protocol parsing unified into a single-pass feed (FeedOutput) with linear-time parsers.
2. Unified Sharded Stream Subscription
- All data streams (global raw data / raw-data node bypass / waveform / CAN frames / logic samples / decoded events) now share a single subscription protocol and dispatch mechanism.
- Subscription groups: the first Channel creates a group and returns a group id; subsequent Channels join the same group (up to maxStreamShards), sharing one stream source instance and a group-level monotonic seq (assigned under the source lock, strictly consistent with drain order).
- Automatic concurrency: shard 0 is always active; shard i activates only when backlog ≥ threshold and sleeps again when it clears — a single channel costs nothing extra when it suffices, and multiple channels push in parallel when it doesn't.
- Ordering: incremental streams (raw data / CAN / logic / decoded events) are strictly re-ordered by seq on the frontend (with a stall-guard jump if a shard dies); snapshot streams (waveform) use "latest seq wins" and simply discard out-of-order stale snapshots.
- Adaptive rate: the push interval speeds up to 16 ms while data is flowing and backs off to 250 ms when idle.
3. High-Frequency Event Batching & Stream Efficiency
- RAF coalescing: graphOutputs / customInputs / spectrumResults channel pushes are written to a module-level cache and applied to the zustand store once per animation frame (~16 ms) instead of once per message — far fewer React renders at high data rates.
- Narrow widget subscriptions: useGraphInput / useGraphInputs now subscribe only to the upstream outputs a widget actually reads (useShallow per-port comparison); scalar widgets no longer re-render on every graph snapshot.
- Raw data chunks are now base64-encoded (bytes_b64) — roughly 2.6× smaller JSON payload, decoded once with atob.
- Removed no-op Tauri event listeners (transport:frames / can-frames / logic-samples / decoded-events); data flows exclusively through the sharded Channel path. Buffers gained monotonic version counters and incremental cursor reads (drain_from).
4. Pipeline Performance Settings
- New Settings → Performance category (Gauge icon) with seven live-tunable parameters, pushed to the backend immediately on change (set_pipeline_config); the backend does not persist them — the frontend replays the saved config on startup.
- Max Feed Workers (1–8): cap on workers parsing data in parallel; increase for high-rate sources.
- Feed Parallel Unit (1–256): message batch size dispatched to parallel workers each time.
- Min Worker Bytes (4–1024 KB): below this size data is not split across workers, avoiding scheduling overhead.
- Coalesce Max Messages (1–1024) / Coalesce Max Bytes (16–4096 KB): caps for a single coalesced push.
- Max Stream Shards (1–8): subscription stream shard cap; more shards improve push concurrency.
- Parse Channel Cap (16–4096): capacity of the feed mpsc channel.
5. Data Loss vs Preview Drop Indicators
- Real loss is now visible: the status bar shows a red pulsing dot with the per-window dropped message count (broadcast Lagged — bytes that never reached the parser, leaving waveform gaps); the 0 → >0 rising edge also fires a warning notification (30 s throttled).
- Preview drops stay distinct: the raw-data view's overflow badge is now yellow (not red) — those bytes were parsed normally and reached the waveform; only the preview did not retain them. This is not data loss.
- DroppedInfoPopover explains both cases ("What / Why / What to do"), with a one-click Open Settings shortcut that jumps to the right category (Data Cache vs Performance).
6. Responsive Status Bar
- The status bar now collapses in tiers driven by a ResizeObserver: full content at ≥960 px; rx/tx frame counters hidden below 960 px; transport/protocol labels hidden below 780 px; compact ↓/↑ byte counters and hidden buffer stats below 620 px. Connection state, alarms and the refresh button are always kept.
7. Graph Evaluation & Protocol Parsing Performance
- Compiled slot-based graph evaluation: each graph is compiled once into a flat op sequence over pre-allocated output slots, so per-frame evaluation is pure array reads/writes with zero string hashing; output value maps use FxHash (~3–5× faster lookups on the hot path).
- Linear-time frame-decoder drain and encode_frame helper fixes.
📦 Installers
- macOS:
.dmg— universal / arm64 / amd64 - Linux:
.deb/.AppImage/.rpm - Windows:
.msi/.exe(NSIS)
VOFA-NEXT 发布说明
v0.1.7
本次发布是围绕 数据管道 的 性能与高通量 版本:接收链路重构为 两段式数据循环(feed → eval),并在积压时 自动扩展并行解析(按帧边界切分、多 worker 并行、按块序合并,积压消退自动回落且零丢失);所有数据流(原始数据 / 波形 / CAN / 逻辑采样 / 解码事件)统一接入新的 分片订阅框架(积压时自动多通道并行推送、按组级 seq 重组顺序);前端对高频推送做 RAF 合批(每帧一次 store 更新),原始数据分片改为 base64 编码(JSON 体积缩小约 2.6 倍);新增 设置→性能 分类,七个管道参数实时可调;状态栏新增 数据丢失 vs 预览丢弃 的明确区分(红色丢弃告警 vs 黄色预览徽标)并附说明引导。
✨ 新特性
1. 自动扩展的并行数据管道
- 两段式数据循环:RX 喂入与图求值解耦为独立阶段,通过有界通道连接——图求值变慢不再直接反压解析。
- 自动扩展并行喂入:积压低时单 worker 顺序解析(与之前行为完全一致);积压超过阈值时自动扩展到最多 maxFeedWorkers 个并行 worker。
- 按帧边界切分(ProtocolEngine::split_aligned):每块交给独立的空状态协议引擎解析,结果按块序合并——与顺序解析严格等价。
- 积压消退自动回落顺序模式;跨批次的不完整尾字节喂回主引擎内部缓冲——模式切换零丢失。
- 仅帧定界协议(JustFloat / FireWater / Slcan / CandleLight)支持并行切分;LogicDecoder(跨字节状态机)与 RawData(无帧)自动回退顺序解析。
- 协议解析统一为单遍 feed 输出(FeedOutput),各解析器线性时间。
2. 统一分片订阅流
- 所有数据流(全局原始数据 / RawData 节点旁路 / 波形 / CAN 帧 / 逻辑采样 / 解码事件)共用同一套订阅协议与分发机制。
- 分片组:首个 Channel 建组并返回组 id,后续 Channel 凭组 id 加入(最多 maxStreamShards 个),组内共享一个流源实例与组级单调 seq(在源锁内分配,与 drain 顺序严格一致)。
- 自动并发:shard 0 常活;shard i 仅在积压 ≥ 阈值时激活、消退自动休眠——单通道够用不浪费,不够自动多通道并行推送。
- 顺序保证:增量流(原始数据 / CAN / 逻辑 / 解码)前端按 seq 严格重组(含分片异常时的防卡死跳变保护);快照流(波形)按"最新 seq 胜出",乱序旧快照直接丢弃。
- 自适应速率:有数据时提速到 16ms,空闲时退避到 250ms。
3. 高频事件合批与流效率
- RAF 合批:graphOutputs / customInputs / spectrumResults 的 Channel 推送先写入模块级缓存,每动画帧(约 16ms)只更新一次 zustand store,而不是每条消息一次——高码率下大幅减少 React 渲染。
- 窄订阅:useGraphInput / useGraphInputs 只订阅本控件实际读取的上游输出(useShallow 逐端口比较),标量控件不再随每个图快照重渲染。
- 原始数据分片改为 base64 编码(bytes_b64)——JSON 体积缩小约 2.6 倍,一次 atob 解码。
- 移除无意义的 Tauri 事件监听(transport:frames / can-frames / logic-samples / decoded-events),数据只走分片 Channel 路径;缓冲新增单调版本号与增量游标读取(drain_from)。
4. 管道性能设置
- 新增 设置→性能 分类(Gauge 图标),七个参数变更即推送到后端(set_pipeline_config);后端不持久化,前端启动时重放已保存配置。
- 并行解析 Worker 上限(1–8):并行解析数据的 worker 数量上限,数据源速率高时可调大。
- 并行分发单元(1–256):每次分发给并行 worker 的消息批大小。
- Worker 最小数据量(4–1024 KB):低于该数据量时不拆分给多个 worker,避免调度开销。
- 合批最大消息数(1–1024)/ 合批最大字节数(16–4096 KB):单次合批推送允许的上限。
- 流分片上限(1–8):订阅流的最大分片数量,分片越多并发推送能力越强。
- 解析通道容量(16–4096):feed mpsc 通道容量。
5. 数据丢失 vs 预览丢弃 指示
- 真实丢失可见:状态栏显示红色脉冲点 + 当前窗口丢弃条数(broadcast Lagged——未进入解析、波形存在缺口的字节);0 → >0 上升沿触发警告通知(30 秒节流)。
- 预览丢弃区分开:原始数据视图的溢出徽标改为黄色(不再是红色)——这些字节已被正常解析并进入波形,只是预览未全部保留,不代表数据丢失。
- DroppedInfoPopover 说明弹层统一解释两类情况(是什么 / 为什么 / 怎么办),并提供"打开设置"一键跳转到对应分类(数据缓存 vs 性能)。
6. 状态栏分级收缩
- 状态栏按宽度分级收缩(ResizeObserver 驱动):≥960px 显示全量;<960px 隐藏 rx/tx 帧数;<780px 再隐藏传输/协议文本标签;<620px 字节数改为 ↓/↑ 紧凑格式并隐藏缓冲统计。任意档位都保留连接状态、告警与刷新按钮。
7. 图求值与协议解析性能
- 编译期槽位图求值:每个图编译为预分配输出槽位上的平坦操作序列,逐帧求值纯数组读写、零字符串哈希;输出值表改用 FxHash(热路径查找快约 3–5 倍)。
- 帧解码器线性时间 drain,encode_frame 辅助函数修复。
📦 安装包
- macOS:
.dmg— universal / arm64 / amd64 - Linux:
.deb/.AppImage/.rpm - Windows:
.msi/.exe(NSIS)
v0.1.6
VOFA-NEXT Release Notes
v0.1.6
This release is a stability & pipeline fix release centered on the frame decoding and command sending chain: a new loopback mode for FrameDecoder (bytes injected via loopback edges instead of the live RX stream), send modes decoupled from loopback so manual / on-change / timer sending now work in any mode, loopback byte injection from CommandSender to connected decoders that works even without a serial connection, immediate graph feedback for input controls, and fixes for the RawData channel display (dynamic port id normalization) plus control / rendering stability (wheel handling, CustomWidget getSnapshot, node port refresh).
✨ New Features
1. Frame Decoder & Command Sender Loopback Rework
- FrameDecoder loopback mode: a new
loopbackoption adds aloopbackInbyte input port — the decoder then only receives bytes injected via loopback edges instead of the default live RX stream (independent of thelive/manualdata mode). - Loopback byte injection: in loopback mode, CommandSender routes the sent bytes along loopback edges to all connected FrameDecoders via a new
inject_loopback_bytescommand. It is decoupled from the serial port state — no connection needed for local parse-and-display. - Send modes decoupled from loopback: the send mode selector (manual / on-change / timer with interval) moved out of the loopback section and now applies to every send path; in timer mode a stable interval auto-sends, in on-change mode the final byte stream is auto-sent whenever it changes.
- Loopback edge routing: edges targeting
loopbackInare collected separately as byte-routing edges and excluded from the f32 topological sort — connecting a Commandvar_refinput back to a decoder output no longer falsely triggers a cycle error. - Connection validation:
loopbackOut(CommandSender byte output port) can only connect toloopbackInand vice versa; regular numeric ports stay unrestricted. send_and_captureindependent of connection: when the transport is not connected it skips the hardware send and still performs the local protocol parse comparison.- FrameDecoder
rawoutput port: emits the full raw frame bytes consumed by the decoder (non-f32 semantics) for RawData-style display of complete frames.
2. Immediate Graph Feedback for Inputs
set_input_value(Knob / Slider / Button / Radio / Checkbox) andsubmit_custom_outputnow trigger an immediate empty-frame graph evaluation, so value changes are reflected instantly on downstream widgets (Gauge etc.) and CommandSender on-change sending — no longer dependent on an active transport data stream.
3. RawData Channel Display Fixes
- Introduced a unified dynamic port id convention
src:<sourceId>:<handle>(rawDataPortId) for RawData input ports; both connection creation and snapshot import now rewrite the edgetargetHandleto the derived port id, fixing the React Flow handle-not-found warning (#8) where edges failed to render. - Snapshot migration: importing older app snapshots that still carry the fallback
datatarget handle is normalized automatically.
4. Control & Rendering Stability
- Knob / Slider wheel handling: replaced the passive React
onWheel(wherepreventDefaultis ignored, causing the page to scroll while adjusting) with native non-passivewheellisteners. - CustomWidget infinite-loop fix: the missing-inputs fallback now uses a stable module-level empty object, preventing a
getSnapshot should be cachedre-render loop. - WidgetNode port refresh: when a widget's port set changes (var_ref add/remove, loopback toggle),
updateNodeInternalsis invoked so new handles are connectable immediately; widget cards also gained thenowheelclass. - FrameDecoder settings UI: option toggles unified to the same button style as CommandSender, with the new loopback switch.
📦 Installers
- macOS:
.dmg— universal / arm64 / amd64 - Linux:
.deb/.AppImage/.rpm - Windows:
.msi/.exe(NSIS)
VOFA-NEXT 发布说明
v0.1.6
本次发布是围绕 帧解码与命令发送链路 的 稳定性与修复 版本:帧解码器新增 回环模式(通过回环边注入字节,不再默认接收实时 RX 流)、发送模式与回环解耦(手动 / 值变化 / 定时发送任意模式下均可使用)、CommandSender 到解码器的 回环字节注入(无需串口连接即可本地解析显示)、输入控件的 即时图反馈,以及 RawData 通道显示 的修复(动态端口 id 归一化)与控件 / 渲染稳定性改进(滚轮处理、CustomWidget getSnapshot、节点端口刷新)。
✨ 新特性
1. 帧解码器与命令发送链路回环重构
- 帧解码器回环模式:新增
loopback开关,开启后解码器显示loopbackIn字节输入口,只接收回环边注入的字节,不再默认接收实时 RX 流(与live/manual数据模式相互独立)。 - 回环字节注入:回环模式下,CommandSender 发送的字节沿回环边路由到所有连线的帧解码器(新增
inject_loopback_bytes命令);与串口开关无关——未连接时也能完成本地解析与对照显示。 - 发送模式与回环解耦:发送模式选择(手动 / 值变化 / 定时,含定时间隔)从回环区块移出,对所有发送路径生效——定时模式按间隔自动发送,值变化模式在最终字节流变化时自动发送。
- 回环边路由:以
loopbackIn为目标的边单独收集为字节路由边,不参与 f32 拓扑排序——Command 的var_ref输入回连解码器输出时不再误判成环。 - 连线校验:
loopbackOut(CommandSender 字节发送口)只能连loopbackIn,反之亦然;普通数值口之间维持现状。 send_and_capture与连接状态解耦:未连接串口时跳过硬件发送,仅做本地协议引擎解析对照。- 帧解码器
raw输出端口:输出解码器消费的整帧原始字节(非 f32 语义),便于以 RawData 方式展示完整帧内容。
2. 输入控件即时图反馈
set_input_value(旋钮 / 滑块 / 按钮 / 单选 / 复选)与submit_custom_output提交后立即触发一次空帧图求值,值变化即时反映到下游控件(Gauge 等)与 CommandSender 值变化发送——不再依赖传输数据流。
3. RawData 通道显示修复
- 统一 RawData 输入端口动态端口 id 约定
src:<sourceId>:<handle>(rawDataPortId);新建连线与快照导入均会将边的targetHandle改写为派生端口 id,修复 React Flow 找不到 handle 的告警(#8)导致边无法渲染的问题。 - 快照迁移:导入旧版快照时,仍携带回退端口
data的边会被自动归一化。
4. 控件与渲染稳定性
- 旋钮 / 滑块滚轮处理:将被动模式的 React
onWheel(preventDefault无效、调节时页面会跟随滚动)替换为原生非被动wheel监听。 - CustomWidget 无限循环修复:缺失输入时的兜底对象改用模块级常量以保持引用稳定,避免
getSnapshot should be cached导致的无限重渲染。 - WidgetNode 端口刷新:控件端口集合变化(var_ref 增删、回环开关)时调用
updateNodeInternals,新端口立即可连线;控件卡片同时补充nowheel类。 - 帧解码器设置界面:选项开关统一为与 CommandSender 同款的按钮样式,并新增回环模式开关。
📦 安装包
- macOS:
.dmg— universal / arm64 / amd64 - Linux:
.deb/.AppImage/.rpm - Windows:
.msi/.exe(NSIS)
v0.1.5
VOFA-NEXT Release Notes
v0.1.5
This release focuses on startup experience and performance: a brand-new splashscreen window, a full React 19 modernization (lazy-loaded widgets / modals, non-blocking UI updates, form actions), per-frame batching for high-frequency data paths, a semantic color token layer with automatic theme migration, and a polished chrome (status bar / activity bar / sidebar / dock tabs / widget cards). The frontend also gains its first automated test harness (Vitest) and a domain-grouped directory restructure.
✨ New Features
1. Startup Splashscreen
- A frameless, always-on-top splashscreen window (logo + brand + animated progress) now appears instantly at launch while the main window initializes.
- The main window starts hidden and is revealed automatically once settings are loaded and the first frame is rendered; a 10-second fallback force-switches the windows so you never get stuck on the splash.
2. React 19 Modernization & Performance
- Code splitting: heavy widgets (3D viewer / Three.js) and all modals (Settings / About / Onboarding / Help Center / Custom Widget Editor) are lazy-loaded behind a shared Suspense fallback — faster startup and a smaller initial bundle.
- Non-blocking UI: tab switching, sidebar and settings updates now run in
startTransition, keeping the UI responsive during heavy state updates. - Form actions: the connect flow for all 7 transport forms and the settings form now use
useActionStatewith unified pending / error states. - Isolated rendering: data tabs are memoized so updating one tab no longer cascades re-renders to sibling tabs; high-frequency data paths (waveform / CAN / raw data / logic) are batched per animation frame — only the latest value is flushed once per frame, dramatically reducing React renders.
- Narrowed store selectors:
useShallow+ narrow selectors in chrome components;memoon heavy components with stable callbacks.
3. Semantic Theme Layer
- New semantic color token layer (12 alias tokens: surface / elevated / inset, muted text, subtle border, accent hover / active, danger / warning / success / info) resolved at runtime — custom themes and the acrylic effect now propagate correctly.
- Persisted custom themes are migrated automatically on load (missing tokens backfilled defensively).
index.csssplit intotheme.css(tokens) andcomponents.css(component styles); interaction states and motion tokens standardized.
4. UI Polish
- Refined StatusBar / ActivityBar / Sidebar / Dock tabs / widget cards.
- Widget Palette rebuilt: sliding-pill tab indicator, grouped math / filter sections, input widgets (Knob / Button / Radio / Checkbox / Slider).
- CSS-only switch animation (no JS re-render) and tuned virtual lists.
5. Test Harness & Code Quality
- First automated frontend test harness: Vitest + Testing Library + jsdom, with full mocks for every
@tauri-apps/*module — stores, utils and components now run without a live Tauri runtime. - 13 test suites covering data batching, theme migration, settings store, transitions, connect actions and component rendering.
- Frontend directory restructured by domain:
components/displays/{waveform,can,logic,decoder,command,rawdata,widgets}andlib/{tauri,buffers,hooks,utils}.
6. Fixes
- Fixed the 3D track rendering issue in the model viewer.
📦 Installers
- macOS:
.dmg— universal / arm64 / amd64 - Linux:
.deb/.AppImage/.rpm - Windows:
.msi/.exe(NSIS)
VOFA-NEXT 发布说明
v0.1.5
本次发布聚焦 启动体验与性能:全新的 启动页(Splashscreen)、完整的 React 19 现代化改造(控件 / 弹窗懒加载、非阻塞 UI 更新、表单动作)、高频数据路径的 逐帧批量合并、带自动迁移的 语义化颜色 Token 层,以及打磨后的界面框架(状态栏 / 活动栏 / 侧边栏 / Dock 标签页 / 控件卡片)。前端同时迎来首个 自动化测试框架(Vitest)与按领域分组的目录重构。
✨ 新特性
1. 启动页 Splashscreen
- 启动时立即显示一个无边框、置顶的 启动页窗口(Logo + 品牌名 + 动画进度条),同时主窗口后台初始化。
- 主窗口默认隐藏,待设置加载完成、首帧渲染后自动显示;若前端异常,10 秒兜底强制切换窗口,避免一直卡在启动页。
2. React 19 现代化与性能优化
- 代码分割:重型控件(3D 查看器 / Three.js)与所有弹窗(设置 / 关于 / 引导向导 / 帮助中心 / 自定义控件编辑器)均改为懒加载,并统一使用 Suspense 兜底——启动更快、首包更小。
- 非阻塞 UI:标签页切换、侧边栏与设置更新改用
startTransition,重度状态更新时界面依然流畅。 - 表单动作:全部 7 种传输表单的连接流程与设置表单改用
useActionState,统一 pending / error 状态。 - 渲染隔离:数据标签页 memo 化,单个标签页更新不再级联触发兄弟标签页重渲染;高频数据路径(波形 / CAN / 原始数据 / 逻辑分析)按动画帧批量合并——每帧只刷新一次最新值,大幅减少 React 渲染次数。
- 收窄 store 选择器:界面框架组件使用
useShallow与窄选择器;重型组件memo化并稳定回调引用。
3. 语义化主题层
- 新增 语义化颜色 Token 层(12 个别名 Token:surface / elevated / inset、次级文字、细边框、accent 悬停 / 激活、danger / warning / success / info),运行时动态解析——自定义主题与毛玻璃效果现在能正确传导。
- 已保存的自定义主题在加载时自动迁移(防御性补齐缺失 Token)。
index.css拆分为theme.css(Token)与components.css(组件样式);交互状态与动效 Token 统一规范。
4. UI 打磨
- 精修 状态栏 / 活动栏 / 侧边栏 / Dock 标签页 / 控件卡片。
- 控件面板重构:滑动胶囊标签指示器、按组划分的数学 / 滤波区块、输入类控件(旋钮 / 按钮 / 单选 / 复选 / 滑块)。
- 纯 CSS 开关切换动画(不再触发 JS 重渲染),并调优虚拟列表。
5. 测试框架与代码质量
- 首个 前端自动化测试框架:Vitest + Testing Library + jsdom,mock 了全部
@tauri-apps/*模块——store、工具函数与组件可在无 Tauri 运行时下独立测试。 - 共 13 个测试套件,覆盖数据批量合并、主题迁移、设置 store、过渡动画、连接动作与组件渲染。
- 前端目录按领域重构:
components/displays/{waveform,can,logic,decoder,command,rawdata,widgets}与lib/{tauri,buffers,hooks,utils}。
6. 修复
- 修复 3D 查看器中 3D track 轨道渲染问题。
📦 安装包
- macOS:
.dmg— universal / arm64 / amd64 - Linux:
.deb/.AppImage/.rpm - Windows:
.msi/.exe(NSIS)
v0.1.4
VOFA-NEXT Release Notes
v0.1.4
This is the first stable release of VOFA-NEXT. It brings a fully standalone RawData widget with newline grouping and 2D view modes, one-click full-app config export / import, and a built-in auto-update mechanism.
✨ New Features
1. Standalone RawData Widget
- RawData is now a first-class widget in the Widget Palette (display category) — drag it onto the canvas and wire it to any data source, or use the default widget created on first launch.
- Newline grouping: the raw byte stream is indexed by newline-delimited records, so structured logs stay on their own rows.
- 2D view modes: orthogonal
grid | line×hex | asciiswitching; line mode offers compact ASCII rendering. - Smoother auto-scroll (rAF-driven) and row entrance animations.
2. Per-Port Raw Data Channels
- Each connected source becomes a dedicated channel port on the widget — pick the channel you want to inspect.
- When wired to a FrameDecoder, the widget shows the exact frame bytes consumed by the decoder; other sources show their numeric stream.
- The backend now captures per-decoder raw frame bytes and exposes node-scoped rawdata subscriptions (ref-counted, deduplicated).
3. Per-Widget View Preferences
- Grouping, representation, timestamp / offset display, auto-scroll, hex color mode, send-panel mode and append mode are saved per widget and restored automatically.
4. Full-App Config Export / Import
- Export the entire app configuration — settings, protocol, transport, widgets, node graph, data tabs and view preferences — to a single JSON file via the native system file dialog.
- Import it back anytime for quick backup, sharing, or migration between machines.
5. In-App Auto Update
- Built-in update checker powered by
tauri-plugin-updater: Settings → Check for Updates. - Downloads with live progress, then installs and restarts the app in one click.
- Releases are now signed; CI generates a
latest.jsonupdater manifest and publishes per-platform update packages.
6. Packaging & CI
- macOS build matrix split into universal / arm64 / amd64; Linux now also ships
.rpm. - New updater artifacts:
.app.tar.gz(macOS) and NSIS zip (Windows), all with.sigsignatures.
📦 Installers
- macOS:
.dmg— universal / arm64 / amd64 - Linux:
.deb/.AppImage/.rpm - Windows:
.msi/.exe(NSIS)
VOFA-NEXT 发布说明
v0.1.4
这是 VOFA-NEXT 的首个 正式 release。本次带来完全独立的 RawData 原始数据控件(支持换行分组与 2D 视图模式)、一键 全量配置导出 / 导入,以及内置的 自动更新 机制。
✨ 新特性
1. 独立 RawData 控件
- RawData 现已成为控件面板中的独立控件(显示类)——拖到画布上并连接任意数据源即可查看;首次启动时也会自动创建默认控件。
- 换行分组:原始字节流按换行分隔的记录建立索引,结构化的日志数据可保持独立行显示。
- 2D 视图模式:
grid | line(网格 / 行)与hex | ascii(十六进制 / ASCII)正交切换;行模式下提供紧凑的 ASCII 渲染。 - 更平滑的自动滚动(rAF 驱动)与行进入动画。
2. 按端口的数据通道
- 每个已连接的数据源自动成为控件上的一个通道端口,可随时切换查看。
- 连接到 FrameDecoder 时,控件精确显示解码器消费的帧字节;其他数据源显示其数值流。
- 后端新增按解码器捕获原始帧字节,并暴露节点级原始数据订阅(引用计数、去重)。
3. 控件级视图偏好持久化
- 分组方式、表示形式、时间戳 / 偏移显示、自动滚动、十六进制着色、发送面板模式与追加模式均按控件独立保存并自动恢复。
4. 全量配置导出 / 导入
- 通过系统文件对话框,将全部应用配置——设置、协议、传输、控件、节点图、数据标签页与视图偏好——导出为单个 JSON 文件。
- 可随时重新导入,便于备份、分享或跨机器迁移。
5. 应用内自动更新
- 基于
tauri-plugin-updater的内置更新检查:设置 → 检查更新。 - 带实时进度的下载,一键安装并重启应用。
- 发布包现已签名,CI 生成
latest.json更新清单并发布各平台的更新包。
6. 打包与 CI
- macOS 构建矩阵拆分为 universal / arm64 / amd64;Linux 新增
.rpm包。 - 新增更新用产物:macOS
.app.tar.gz、Windows NSIS zip,均带.sig签名。
📦 安装包
- macOS:
.dmg— universal / arm64 / amd64 - Linux:
.deb/.AppImage/.rpm - Windows:
.msi/.exe(NSIS)