# 数据流图可视化编程工具 **Repository Path**: rabbitc999/EmbedGraph ## Basic Information - **Project Name**: 数据流图可视化编程工具 - **Description**: 本项目是 WorkBuddy 辅助编程工具链中的核心模块之一,旨在为开发者提供可视化的数据流处理系统设计环境,并支持一键生成高质量的实现代码。其交互风格借鉴 MathWorks Simulink,通过拖拽式框图建模,降低数据流编程门槛,提升开发效率,特别适用于 IoT 数据管道、流式计算、信号处理等场景。 - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-31 - **Last Updated**: 2026-07-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # EmbedGraph - 数据流图可视化编程工具 本项目是 WorkBuddy 辅助编程工具链中的核心模块之一,旨在为开发者提供可视化的数据流处理系统设计环境,并支持一键生成高质量的实现代码。其交互风格借鉴 MathWorks Simulink,通过拖拽式框图建模,降低数据流编程门槛,提升开发效率,特别适用于 IoT 数据管道、流式计算、信号处理等场景。 --- ## 核心特性 - **拖拽式节点编辑** — 从工具箱拖拽节点到画布,鼠标拖动移动,端口自动连线 - **67 种内置节点** — 涵盖基础运算、滤波器、信号处理、控制器、复数/四元数运算、FFT/IFFT 等 - **13 种数据类型** — Float / Double / Int32 / Complex / Quaternion / Vector3 / Array\ 等,端口间类型兼容性自动检查 - **企业级 C 代码生成** — 拓扑排序 + 数据路由,生成 `eg_process.h` / `eg_process.c`,符合严格 C 编码规范 - **外部模板系统** — 所有 C 代码模板为 `.tpl` 文件,用户可直接编辑定制生成逻辑 - **仿真引擎** — 串口/文件数据源驱动,实时示波器波形显示,结果导出 CSV - **多模块工程管理** — 模块树视图、模块导入导出、单一 `.flow` 文件持久化 - **跨模块数据总线** — BusGoto / BusFrom 节点,类似 Simulink Goto/From,实现模块间数据传递 - **工程配置管理** — 目标平台(ARM / RISC-V / DSP C2000)、HAL 路径、全局宏定义 --- ## 技术栈 | 项目 | 说明 | |------|------| | 运行时 | .NET 8 (LTS) | | UI 框架 | WPF (Windows Presentation Foundation) | | 架构模式 | MVVM(自实现 ObservableObject + RelayCommand) | | 序列化 | System.Text.Json | | 串口通信 | System.IO.Ports 8.0.0 | | 目标平台 | Windows 10/11 | --- ## 项目结构 ``` EmbedGraph/ ├── EmbedGraph.sln # 解决方案文件 ├── README.md ├── EmbedGraph.csproj # 项目文件 ├── App.xaml / .cs # 应用入口 ├── MainWindow.xaml / .cs # 主窗口(画布 + 工具箱 + 属性面板 + 模块树) │ ├── Models/ # 数据模型层 │ ├── DataType.cs # 数据类型枚举(13 种) │ ├── DataTypeInfo.cs # 类型元数据与兼容性检查 │ ├── PortModel.cs # 端口模型(含元素类型标注) │ ├── NodeModel.cs # 节点模型(含动态端口重建) │ ├── ConnectionModel.cs # 连线模型(折线路由 + 跨线桥跳) │ ├── ModuleModel.cs # 模块模型(支持嵌套子模块) │ ├── ProjectModel.cs # 工程模型(含目标平台配置) │ ├── NodeTemplate.cs # 节点模板定义 │ ├── NodeCategory.cs # 节点类别枚举(11 类) │ ├── PropertyDefinition.cs # 属性定义模型 │ ├── PortType.cs / LineStyle.cs / NodeLayout.cs │ ├── Mvvm/ # MVVM 基础设施 │ ├── ObservableObject.cs # INotifyPropertyChanged 基类 │ └── RelayCommand.cs # ICommand 实现 │ ├── ViewModels/ │ └── MainViewModel.cs # 主窗口视图模型 │ ├── Services/ # 服务层 │ ├── NodeTemplateService.cs # 节点模板注册中心(67 种节点) │ ├── NodePropertyService.cs # 节点属性定义 │ ├── CCodeGenerator.cs # C 代码生成器 │ ├── CodeTemplateEngine.cs # 外部模板引擎(.tpl 加载与替换) │ ├── TopologicalSorter.cs # Kahn 拓扑排序 │ ├── DependencyGraph.cs # 依赖图构建与环检测 │ ├── ProjectSerializer.cs # 工程序列化(.flow JSON) │ ├── SimulationEngine.cs # 仿真引擎(串口/文件/示波器) │ └── BridgeCalculator.cs # 跨线桥跳符号计算 │ ├── Views/ # 弹出窗口 │ ├── NodeConfigWindow.xaml # 节点配置对话框 │ ├── ProjectConfigWindow.xaml # 工程配置对话框 │ ├── ScopeWindow.xaml # 示波器窗口 │ └── SimSourceConfigWindow.xaml # 仿真数据源配置 │ ├── Converters/ │ └── Converters.cs # 类别/数据类型 → 画刷等值转换器 │ └── CodeTemplates/ # 外部 C 代码模板(可编辑定制) ├── eg_process.h.tpl # 头文件主模板 ├── eg_process.c.tpl # 源文件主模板 ├── makefile.tpl # Makefile 模板 └── Nodes/ # 67 个节点 C 代码模板 ├── Add.c.tpl Sub.c.tpl Mul.c.tpl Div.c.tpl ├── Sin.c.tpl Cos.c.tpl Tan.c.tpl ├── Constant.c.tpl TypeCast.c.tpl Mux.c.tpl FSM.c.tpl ├── MeanFilter.c.tpl FIR_Filter.c.tpl ├── Kalman1D.c.tpl Kalman2D.c.tpl Kalman3D.c.tpl EKF.c.tpl ├── FFT.c.tpl IFFT.c.tpl FrameQueue.c.tpl ├── PID.c.tpl LQR.c.tpl Mahony.c.tpl ├── ArrayPack.c.tpl ArrayUnpack.c.tpl ├── Sum.c.tpl Mean.c.tpl Median.c.tpl Sort.c.tpl Slice.c.tpl ├── ByteParser.c.tpl DataPacker.c.tpl UART_Parser.c.tpl ├── ComplexPack/Unpack/Add/Sub/Mul/Div.c.tpl ├── ComplexConjugate/Magnitude/Angle/Normalize.c.tpl ├── QuaternionPack/Unpack/Add/Sub/Mul/Div.c.tpl ├── QuaternionConjugate/Normalize/Magnitude/Angle.c.tpl ├── QuaternionToEuler.c.tpl EulerToQuaternion.c.tpl ├── VectorPack.c.tpl VectorUnpack.c.tpl ├── Vector3Add/Sub/Dot/Cross/Normalize/Magnitude.c.tpl ├── BusGoto.c.tpl BusFrom.c.tpl ├── ExternalInput.c.tpl ExternalOutput.c.tpl ├── Delay.c.tpl Scope.c.tpl └── ... ``` --- ## 内置节点类型(67 种) ### 基础运算(7) | 节点 | 说明 | |------|------| | Add / Sub / Mul / Div | 四则运算(双输入单输出) | | Sin / Cos / Tan | 三角函数 | | Constant | 常量值输出 | | TypeCast | 类型转换(10 种类型互转:数值↔数值、数值↔复合、复合↔复合) | ### 逻辑与控制(2) | 节点 | 说明 | |------|------| | Mux | 多路选择器(输入路数可配置,Select 信号选择输出) | | FSM | 有限状态机(状态转移表驱动,switch-case 实现) | ### 滤波器(4) | 节点 | 说明 | |------|------| | MeanFilter | 均值滤波(滑动窗口 N 可配置) | | FIR_Filter | FIR 滤波器(系数数组可配置) | | Kalman1D / Kalman2D | 卡尔曼滤波器(单轴/双轴,Q/R 可调) | | Kalman3D | 三轴卡尔曼滤波(位置-速度模型) | ### 信号处理(4) | 节点 | 说明 | |------|------| | FFT | 快速傅里叶变换(基-2 DIT,5 种窗函数,输出 Array\) | | IFFT | 逆傅里叶变换(基-2 DIF,输入 Array\,输出 Array\) | | FrameQueue | 帧队列(环形缓冲区,按帧存储,输出最近 N 帧数组) | | EKF | 扩展卡尔曼滤波(6 状态位置-速度模型,Q/R/Dt 可调) | ### 控制器(3) | 节点 | 说明 | |------|------| | PID | PID 控制器(Kp/Ki/Kd 可调,含积分限幅) | | LQR | 线性二次型调节器(状态反馈 u = -K·x) | | Mahony | AHRS 姿态解算(PI 控制器 + 四元数积分 + 归一化) | ### 数组与统计(7) | 节点 | 说明 | |------|------| | ArrayPack / ArrayUnpack | 数组打包/解包(N 个标量 ↔ Array\,元素类型可选) | | Sum / Mean / Median | 求和 / 均值 / 中位数 | | Sort | 排序(升序/降序) | | Slice | 数组切片(StartIndex / EndIndex) | ### 通信与解析(3) | 节点 | 说明 | |------|------| | ByteParser | 字节解析器(帧头搜索 + CRC 校验 + 数据提取) | | DataPacker | 数据打包器(帧头 + 数据 + CRC + 帧尾) | | UART_Parser | 串口帧解析器(帧头/帧尾/CRC,多通道 float 输出) | ### 复数运算(8) | 节点 | 说明 | |------|------| | ComplexPack / ComplexUnpack | 复数打包/解包(2×Float ↔ Complex) | | ComplexAdd / Sub / Mul / Div | 复数四则运算 | | ComplexConjugate | 复数共轭 z* = (re, -im) | | ComplexMagnitude | 复数模长 \|z\| = sqrt(re² + im²) → Float | | ComplexAngle | 复数辐角 atan2(im, re) → Float | | ComplexNormalize | 复数归一化 z / \|z\| | ### 四元数运算(10) | 节点 | 说明 | |------|------| | QuaternionPack / QuaternionUnpack | 四元数打包/解包(4×Float ↔ Quaternion) | | QuaternionAdd / Sub / Mul / Div | 四元数四则运算(除法 = q₁ × q₂⁻¹) | | QuaternionConjugate | 四元数共轭 | | QuaternionNormalize | 归一化为单位四元数 | | QuaternionMagnitude | 模长 \|q\| = sqrt(w² + x² + y² + z²) → Float | | QuaternionAngle | 旋转角 θ = 2·acos(w) → Float | | QuaternionToEuler | 四元数 → 欧拉角(Roll/Pitch/Yaw) | | EulerToQuaternion | 欧拉角 → 四元数 | ### 向量运算(8) | 节点 | 说明 | |------|------| | VectorPack / VectorUnpack | 向量打包/解包(2D/3D,Float ↔ Vector3) | | Vector3Add / Sub | 向量加减 | | Vector3Dot / Cross | 点积 / 叉积 | | Vector3Normalize | 向量归一化 | | Vector3Magnitude | 向量模长 → Float | ### 延时与可视化(2) | 节点 | 说明 | |------|------| | Delay | 延时器(初始值可配,支持环路调度) | | Scope | 示波器(仿真时实时波形显示) | ### IO 端口(2) | 节点 | 说明 | |------|------| | ExternalInput | 外部输入端口(映射到 `EG_Input_T` 通道) | | ExternalOutput | 外部输出端口(映射到 `EG_Output_T` 通道) | ### 数据总线(2) | 节点 | 说明 | |------|------| | BusGoto | 总线写入(通过 BusName 绑定,写入全局变量 `g_bus_`) | | BusFrom | 总线读取(通过 BusName 绑定,读取全局变量 `g_bus_`) | --- ## 数据类型系统 | 类型 | 说明 | C 映射 | |------|------|--------| | Float | 单精度浮点 | `float` | | Double | 双精度浮点 | `double` | | Int32 / UInt32 | 32 位整数 | `int32_t` / `uint32_t` | | Int16 / UInt16 | 16 位整数 | `int16_t` / `uint16_t` | | Byte | 8 位字节 | `uint8_t` | | Complex | 复数(实部 + 虚部) | `Complex_T { float real, imag }` | | Quaternion | 四元数(w, x, y, z) | `Quaternion_T { float w, x, y, z }` | | Vector3 | 三维向量 | `Vector3_T { float x, y, z }` | | Array | 动态数组(支持元素类型标注) | `uint8_t[]` 字节缓冲区 + 类型强转 | | ByteArray | 字节数组 | `uint8_t[]` | 端口间连线时自动执行类型兼容性检查:同类型直连、数值标量互转、标量扩展到复数/向量、数组元素类型匹配。 --- ## 代码生成 ### 生成接口 生成的 C 代码聚焦数据处理模块,核心接口为: ```c void EG_Init(void); void EG_Process(EG_Input_T *input, EG_Output_T *output); ``` 不生成 `main.c` / `hal.h`,由用户在目标平台自行集成。 ### 生成文件 | 文件 | 内容 | |------|------| | `eg_process.h` | 类型定义、结构体、函数声明、宏定义 | | `eg_process.c` | EG_Process 实现 + 节点函数 + EG_Init + 数据路由 | | `makefile` | 静态库构建脚本(生成 .a) | | `CodeTemplates/` | 模板文件副本(方便查看和二次定制) | ### 动态宏定义 以下宏根据图中节点类型和属性**动态计算**,非固定常量: ```c #define EG_MAX_PORT_COUNT (动态) // 根据实际节点端口数 #define EG_MAX_STATE_SIZE (动态) // 根据节点类型计算所需 state 字节数 #define EG_DEFAULT_ARRAY_SIZE (动态) // 根据节点类型计算所需 array 元素数 #define EG_MAX_INPUT_CHANNELS (动态) // ExternalInput 节点数 #define EG_MAX_OUTPUT_CHANNELS (动态) // ExternalOutput 节点数 ``` ### C 编码规范 | 规则 | 示例 | |------|------| | 静态变量 `s_` 前缀 | `static NodeCtx_T s_NodeCtxs[8];` | | 外部变量 `g_` 前缀 | `float g_bus_sensorData;` | | 结构体 `_T` 后缀 | `typedef struct { ... } NodeCtx_T;` | | 结构体成员小驼峰 | `ctx->inputs[0].f` | | 函数 `模块_功能` | `EG_Process`, `FFT_Compute` | | 宏全大写下划线 | `#define EG_MAX_PORT_COUNT (8)` | | 头文件守卫 | `#ifndef __EG_PROCESS_H` | | 指针非空判断 | `if (ptr != NULL)` | ### 模板定制 所有 C 代码模板位于 `CodeTemplates/` 目录,采用占位符语法: | 占位符 | 说明 | 示例 | |--------|------|------| | `{{KEY}}` | 简单替换 | `{{NODE_NAME}}` → `Add_1` | | `{{PROP:Name}}` | 节点属性值 | `{{PROP:Kp}}` → `1.5` | | `/*{{SECTION}}*/` | 段落标记 | `/*{{WINDOW_CODE}}*/` → 窗函数代码 | 用户可直接编辑 `.tpl` 文件修改生成逻辑,无需重新编译程序。 --- ## 仿真引擎 ### 数据源 | 模式 | 说明 | |------|------| | 串口 | 通过 `System.IO.Ports.SerialPort` 实时接收数据,可配置波特率/分隔符/列映射 | | 文件 | 读取 CSV/TXT 文件,按行解析,支持循环播放 | | 无 | 手动单步执行 | ### 仿真控制 | 操作 | 快捷键 | 说明 | |------|--------|------| | 运行 | F5 | 开始/继续仿真 | | 暂停 | F6 | 暂停仿真 | | 单步 | F10 | 执行一步 | | 停止 | — | 停止并重置 | | 示波器 | — | 打开示波器窗口查看实时波形 | | 导出 | — | 将仿真结果导出为 CSV 文件 | ### 示波器 - 多通道波形显示(8 种颜色) - 自动缩放 Y 轴 - 网格线背景 - 深色主题 --- ## 多模块工程管理 ### 模块树 左侧面板显示模块树视图,支持: - 单击切换当前编辑模块 - `+` 按钮创建新模块 - 右键菜单:切换 / 重命名 / 导出 / 删除 ### 模块导入导出 - **导入模块** — 从 `.flow` 文件加载模块到当前工程,自动重新生成 GUID 避免冲突 - **导出模块** — 将当前模块导出为独立 `.flow` 文件 ### 工程配置 通过工程配置对话框管理: - 工程名称 - 目标平台(ARM / RISC-V / DSP C2000 / Custom) - HAL 头文件路径 - 全局宏定义列表(添加/删除) ### 跨模块数据总线 BusGoto / BusFrom 节点通过 `BusName` 属性绑定同名总线: - C 代码生成全局变量 `float g_bus_` - BusGoto 写入、BusFrom 读取 - 不同模块间可通过总线名传递数据 --- ## 使用方法 ### 环境要求 - .NET 8 SDK - Windows 10/11 ### 编译运行 ```bash dotnet build dotnet run --project src/EmbedGraph ``` ### 基本操作 1. **添加节点** — 从左侧工具箱拖拽节点模板到画布 2. **移动节点** — 鼠标按住节点拖动 3. **连线** — 点击输出端口(右侧),拖拽到输入端口(左侧) 4. **配置节点** — 双击节点打开配置窗口 5. **删除** — 选中节点/连线后按 Delete 键 6. **生成代码** — 工具栏点击「生成代码」按钮,选择输出目录 7. **仿真** — 菜单「仿真」→ 配置数据源 → F5 运行 → 打开示波器查看波形 ### 工程文件 工程保存为单一 `.flow` 文件(JSON 格式),包含所有模块、节点、连线和配置信息。 --- ## 开源协议 本项目采用 [GPL-3.0](LICENSE) (GNU General Public License v3.0) 开源协议。 - 任何人可以自由使用、修改和分发本项目 - 修改后的作品必须同样以 GPL-3.0 协议开源 - 不提供任何担保,详见 LICENSE 文件第 15-16 条