# lua-debug-electron **Repository Path**: michaelhyg/lua-debug-electron ## Basic Information - **Project Name**: lua-debug-electron - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-29 - **Last Updated**: 2026-04-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Lua 调试助手 基于 Electron + React + Monaco 的 ESP32 Lua 调试工作台,用来连接设备串口、管理设备脚本、编辑 Lua 代码、保存到 Flash、执行/停止脚本,并查看串口日志和设备状态。 ## 当前能力 - Electron 桌面工作台,Renderer 保持 `contextIsolation: true`、`nodeIntegration: false` - Monaco Lua 多标签编辑器,支持新建、打开本地文件、保存、dirty 标记、关闭标签 - 真实串口接入,支持串口枚举、连接、断开、状态同步、发送数据 - 设备协议层,支持文件列表、读取脚本、写入 Flash、执行脚本、停止脚本、内存信息、模块列表 - 左侧活动栏,支持资源管理器和搜索面板切换 - 设备资源树,显示设备 Lua 文件和设备模块 - 模块函数浏览,函数目录来自 `src/data/luaModuleFunctions.json` - 右侧设备摘要,显示连接状态、当前脚本、LittleFS、Lua 内存、模块数量 - 底部日志栏,包含串口日志、操作日志、问题、调试输出,支持过滤、清空、自动滚动 - 工作台布局记忆,左侧、右侧、底部显示状态和尺寸会在下次启动恢复 - 串口设置记忆,启动后会尝试使用上次保存的串口配置自动连接并刷新资源 - Mock Device 模式,方便没有 ESP32 设备时验证 UI 和基础流程 ## 最近更新 - 工作台 UI 从单体 `App.tsx` 拆分为 `components/`、`hooks/`、`utils/` 和 `settings/`,主入口只负责组装页面 - 新增工作台控制层 Hook,串口、设备资源、脚本动作、布局拖拽等逻辑开始从 UI 组件中拆出 - 新增 `eslint.config.mjs`,为后续 TypeScript/React 代码整理提供统一检查入口 - 资源管理器底部动作补齐:支持新建 Lua、刷新设备资源、批量上传 Lua、删除当前脚本 - 资源管理器脚本树支持右键菜单:打开、重命名、删除 - 资源管理器脚本树支持 `Cmd/Ctrl` 多选、`Shift` 范围选择,并可批量删除选中的 Lua 脚本 - 设备脚本重命名流程打通:读取旧脚本、写入新文件名、删除旧文件、刷新资源树 - 编辑器标签支持右键菜单:关闭右侧、关闭其他、关闭所有 - 编辑器标签栏右侧 `+` 按钮可直接新建空白 Lua 标签 - 日志栏支持独立字体设置,工具栏和菜单栏都可打开日志字体配置 - 日志栏工具区样式收紧:自动滚动和追加 `CRLF` 保持单行显示,复选框和控件尺寸更协调 ## 运行 安装依赖: ```bash npm install ``` 连接真实设备运行: ```bash npm run dev ``` 无设备 Mock 模式运行: ```bash npm run dev:mock ``` 构建前端: ```bash npm run build ``` ## 界面入口 顶部主工具栏保留高频设备动作: - 执行 - 停止 - 保存到 Flash - 串口设置 - 连接 / 断开 菜单栏按功能分组: - 文件:新建、打开、保存、保存到 Flash、执行、停止、退出 - 设备:刷新资源、串口设置、连接 / 断开 - 视图:显示/隐藏资源管理器、显示/隐藏右侧摘要、显示/隐藏底部日志、恢复默认布局、编辑器字体、日志字体 - 帮助:关于 ## 典型流程 1. 启动软件后自动尝试连接上次保存的串口。 2. 连接成功后自动刷新设备资源。 3. 左侧资源管理器点击 `/lua/*.lua` 文件,读取设备脚本并打开到 Monaco。 4. 修改脚本后标签会显示 `*`。 5. 点击“保存到 Flash”写入设备。 6. 点击“执行”运行当前脚本,点击“停止”停止设备脚本。 7. 底部“串口日志”查看设备 `print` 输出,也可以直接发送串口文本。 ## 串口与设备协议 串口由 Electron Main Process 中的 `electron/serial-manager.cjs` 统一管理,Renderer 不直接访问 `serialport`。 设备控制协议由 `electron/device-protocol.cjs` 负责。当前协议跟随 Qt 上位机使用二进制帧: - 帧头:`0xAA 0x55` - Header:`payload length + command + sequence` - Payload:命令数据 - CRC:CRC16-CCITT - 命令:`LIST`、`LOAD_SCRIPT`、`STORE`、`EXEC`、`RESET`、`FS_INFO`、`MODULE_LIST` 等 协议帧和普通串口文本分流: - 协议响应用于完成 `device.*` 命令 Promise - 普通串口文本进入底部“串口日志” - 协议错误进入“问题”日志 ## Renderer 安全 API `electron/preload.cjs` 通过 `contextBridge` 暴露安全 API: ```ts window.localFile.open() window.localFile.openMany() window.localFile.save(path, content) window.localFile.saveAs(suggestedName, content) window.device.listPorts() window.device.connect(options) window.device.disconnect() window.device.getStatus() window.device.listFiles(path) window.device.listModules() window.device.readFile(path) window.device.writeFile(path, content) window.device.deleteFile(path) window.device.runScript(path, content) window.device.stopScript() window.device.getMemInfo() window.device.onEvent(callback) window.device.onError(callback) window.serial.write(data) window.serial.onData(callback) window.serial.onStatus(callback) window.serial.onError(callback) ``` 不要在 Renderer 中直接 `require("fs")`、`require("serialport")` 或暴露完整 `ipcRenderer`。 ## 目录结构 ```text electron/ main.cjs Electron 主进程、菜单、IPC、窗口管理 preload.cjs 安全桥接 API serial-manager.cjs 串口枚举、连接、读写、状态事件 device-protocol.cjs ESP32 Lua 设备协议层 src/ App.tsx 工作台 UI 和业务动作编排 store/ useReducer 状态管理 types/ 设备、文件、日志、编辑器、Electron API 类型 mock/ 初始空状态和 Mock 数据 data/ Lua 模块函数索引 JSON styles.css 工作台布局和组件样式 docs/ qt-plan-short.md Qt 上位机规划精简版 qt-todo-short.md 后续 Todo 精简版 ``` ## Mock Device `npm run dev:mock` 会设置 `MOCK_DEVICE=1`,设备相关接口返回本地 mock 数据: - `device.listFiles` - `device.listModules` - `device.readFile` - `device.writeFile` - `device.runScript` - `device.stopScript` - `device.getMemInfo` 这个模式适合没有硬件时验证编辑器、资源树、保存、执行、日志和布局逻辑。 ## 后续计划 精简版路线图见 [docs/qt-plan-short.md](docs/qt-plan-short.md)。 执行清单见 [docs/qt-todo-short.md](docs/qt-todo-short.md)。