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)