From fc9648ea8b1b65503536b8c3e2133bca8ef732f8 Mon Sep 17 00:00:00 2001 From: kerms Date: Mon, 9 Jun 2025 17:48:20 +0200 Subject: [PATCH] feat(widget): add Widget Panel with i18n, layout enhancements, and draggable UI - Replaces AtCommand with WidgetPannel - Adds export/import, local storage support - Implements translation (i18n) - Improves UI spacing and grid logic - Adds reset-to-default and command loop composables --- README.cn.md | 85 ++++ README.md | 93 +++- assets/uart.png | Bin 0 -> 105065 bytes assets/widgetPannel.png | Bin 0 -> 38685 bytes index.html | 2 +- package-lock.json | 187 ++++---- package.json | 2 +- src/App.vue | 96 ++-- src/assets/icon/close.svg | 1 + src/assets/icon/lock.svg | 1 + src/assets/icon/lock_open.svg | 1 + src/assets/icon/play.svg | 1 + src/assets/icon/repeat.svg | 1 + src/assets/icon/text-data.svg | 1 + src/composables/useCommandLoopManager.ts | 176 ++++++++ src/composables/useSequentialUart.ts | 83 ++++ src/composables/useUartModule.ts | 81 ++++ src/locales/en.ts | 34 +- src/locales/fr.ts | 35 +- src/locales/zh.ts | 37 +- src/router/index.ts | 16 +- src/stores/useWidgetStore.ts | 424 ++++++++++++++++++ src/types/grid.ts | 26 ++ src/views/AtCommand.vue | 14 - src/views/Uart.vue | 29 +- src/views/WidgetPannel.vue | 345 ++++++++++++++ src/views/navigation/NavBar.vue | 15 +- src/views/text-data-viewer/textDataViewer.vue | 21 +- src/views/widgets/uartAtCommand.vue | 69 +++ src/views/widgets/widgetLoop.vue | 233 ++++++++++ src/views/widgets/widgetTemplate.vue | 37 ++ 31 files changed, 1951 insertions(+), 195 deletions(-) create mode 100644 README.cn.md create mode 100644 assets/uart.png create mode 100644 assets/widgetPannel.png create mode 100644 src/assets/icon/close.svg create mode 100644 src/assets/icon/lock.svg create mode 100644 src/assets/icon/lock_open.svg create mode 100644 src/assets/icon/play.svg create mode 100644 src/assets/icon/repeat.svg create mode 100644 src/assets/icon/text-data.svg create mode 100644 src/composables/useCommandLoopManager.ts create mode 100644 src/composables/useSequentialUart.ts create mode 100644 src/composables/useUartModule.ts create mode 100644 src/stores/useWidgetStore.ts create mode 100644 src/types/grid.ts delete mode 100644 src/views/AtCommand.vue create mode 100644 src/views/WidgetPannel.vue create mode 100644 src/views/widgets/uartAtCommand.vue create mode 100644 src/views/widgets/widgetLoop.vue create mode 100644 src/views/widgets/widgetTemplate.vue diff --git a/README.cn.md b/README.cn.md new file mode 100644 index 0000000..f812036 --- /dev/null +++ b/README.cn.md @@ -0,0 +1,85 @@ +# wireless-esp32-tools 网页用户界面 + +本项目是 [wireless-esp32-tools](https://github.com/kerms/wireless-esp32-tools) 项目的网页用户界面。 + +`wireless-esp32-tools` 项目为多种ESP芯片提供了兼容CMSIS-DAP的无线调试工具,可将ESP芯片变为一个功能强大的无线调试器。 + +## 关于此网页界面 + +此Web应用程序提供了一个用户友好的仪表板,用于管理您的 `wireless-esp32-tools` 设备并与之交互。它采用 Vue.js 3、Vite 和 Element Plus 构建,并设计为直接托管在 ESP32 上。 + +通过此界面,您可以构建一个自定义的仪表板来监控目标设备并与之交互。 + +### 主要功能 + +* **Wi-Fi配置**:包括终端模式(STA)和热点模式(AP),支持静态/动态IP地址分配和DNS设置。 +* **动态组件仪表板**:一个完全灵活的基于网格的面板。 +* **实时数据可视化**:包括一个用于监控目标设备串行通信的UART数据查看器。 +* **嵌入式优先设计**:部署为单个.html文件以减少http连接数。 +* **适用于小屏幕设计**:响应式布局适配移动设备和平板电脑,具有触摸友好的控件和针对小屏幕优化的UI元素。 + +## 界面截图 + +**组件面板** +![组件面板](assets/widgetPannel.png) + +**UART数据显示** +![UART数据显示](assets/uart.png) + +## 使用说明 + +### 最终用户 + +1. 将您的计算机或移动设备连接到运行 `wireless-esp32-tools` 的ESP32所承载的Wi-Fi网络。 +2. 打开Web浏览器并导航到ESP32设备的IP地址(例如 `http://dap.local` 或 `http://192.168.1.1`(连接AP的情况下))。 + +### 开发人员 (针对此Web UI) + +请按照以下步骤设置项目以进行本地开发或构建以进行部署。 + +#### 环境准备 + +* [Node.js](https://nodejs.org/) (v16 或更高版本) +* [npm](https://www.npmjs.com/) + +#### 本地开发 + +1. **安装依赖:** + ```sh + npm install + ``` +2. **运行开发服务器:** + ```sh + npm run dev + ``` + 这将在本地启动一个服务器,通常地址为 `http://localhost:5173`。 + +3. **为移动/远程调试运行:** + 要从同一网络上的其他设备(如手机)访问开发服务器,请使用: + ```sh + npm run devh + ``` + 这将把服务器暴露给您的本地网络(例如 `http://192.168.X.X:5173`)。 + +#### 构建生产版本 (部署到ESP32) + +1. **构建项目:** + ```sh + npm run build + ``` + 此命令将编译和打包应用程序到 `dist/` 目录,生成 `index.html` 和 `ws.sharedworker.js`。 + +2. **压缩输出文件:** + 进入 `dist/` 目录并使用gzip压缩构建产物。 + ```sh + cd dist + gzip * + ``` + 这将生成 `index.html.gz` 和 `ws.sharedworker.js.gz`。 + +3. **部署到ESP32:** + 将压缩后的 `.gz` 文件复制到您的 `wireless-esp32-tools` ESP-IDF项目中的相应目录(例如 `project_components/html/`),然后将固件刷入您的设备。 + +## 许可证 + +根据MIT许可证分发。更多信息请参见 `LICENCE.txt` 文件。 \ No newline at end of file diff --git a/README.md b/README.md index aaa15da..46ddc3d 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,87 @@ -# 允斯无线透传器的内嵌网页版上位机 +# Web UI for wireless-esp32-tools -此项目使用`NPM`包管理, 需要先安装`node`工具。 +This is the web user interface for the [wireless-esp32-tools](https://github.com/kerms/wireless-esp32-tools) project. -# 环境准备步骤 +The `wireless-esp32-tools` project provides CMSIS-DAP compatible wireless debugging tools for various ESP chips, turning them into powerful wireless debug probes. -##### 本地测试: +## About This Web Interface -1. `npm install` -2. `npm run dev`,或用 `npm run devh` 则可以用其他设备访问,如手机调试移动界面。 -3. 根据显示的地址,使用浏览器打开,默认地址为`localhost:5173`, 或者其他设备访问`192.168.X.X:5173` +This web application provides a user-friendly dashboard to manage and interact with your `wireless-esp32-tools` device. It is built with Vue.js 3, Vite, and Element Plus, and is designed to be hosted directly on the ESP32. -##### 发布至esp32: +From this interface, you can build a customized dashboard to monitor and interact with your target device. -1. `npm install` -2. `npm run build` -> 会在`dist/`生成`index.html`和`ws.sharedworker.js` -3. 在`dist/`里执行`gzip *` -> -> 会在`dist/`生成`index.html.gz`和`ws.sharedworker.js.gz` -4. 至此,可以使用这两个文件覆盖ESP32目录中的`project_components/html`里相对应的文件了。 +### Key Features + +* **Wi-Fi Configuration**: Easily configure Wi-Fi settings including station mode (STA) and access point mode (AP), with support for static/dynamic IP addressing and DNS settings. +* **Dynamic Widget Dashboard**: A fully flexible grid-based panel. +* **Real-time Data Visualization**: Includes a UART data viewer for monitoring serial communication from your target device. +* **Embedded-First Design**: Deploy in single .html file to reduce the number of http connection. +* **Designed to be usable on small screen**: Responsive layout that adapts to mobile devices and tablets, with touch-friendly controls and optimized UI elements for small displays. + +## Screenshots + +**Widget Panel** +![Widget Panel](assets/widgetPannel.png) + +**UART Data Viewer** +![UART Data Viewer](assets/uart.png) + +## Getting Started + +### For End-Users + +1. Connect your computer or mobile device to the Wi-Fi network hosted by the ESP32 running `wireless-esp32-tools`. +2. Open a web browser and navigate to the IP address of the ESP32 device (e.g., `http://dap.local` or `http://192.168.1.1`(when connected to the AP)). + +### For Developers (of this Web UI) + +Follow these steps to set up the project for local development or to build it for deployment. + +#### Prerequisites + +* [Node.js](https://nodejs.org/) (v16 or later) +* [npm](https://www.npmjs.com/) + +#### Local Development + +1. **Install dependencies:** + ```sh + npm install + ``` +2. **Run the development server:** + ```sh + npm run dev + ``` + This will start a local server, typically at `http://localhost:5173`. + +3. **Run for mobile/remote debugging:** + To access the development server from other devices on the same network (like a mobile phone), use: + ```sh + npm run devh + ``` + This will expose the server to your local network (e.g., `http://192.168.X.X:5173`). + +#### Building for Production (Deploying to ESP32) + +1. **Build the project:** + ```sh + npm run build + ``` + This command compiles and bundles the application into the `dist/` directory, creating `index.html` and `ws.sharedworker.js`. + + There is some bugs on Firefox or Vue3 when embbeding sharedWorker in single file mode. So at the time, the sharedWorker are build separately. + +2. **Compress the output files:** + Navigate into the `dist/` directory and compress the build artifacts using gzip. + ```sh + cd dist + gzip * + ``` + This will generate `index.html.gz` and `ws.sharedworker.js.gz`. + +3. **Deploy to ESP32:** + Copy the compressed `.gz` files to the appropriate directory in your `wireless-esp32-tools` ESP-IDF project (e.g., `project_components/html/`) and flash the firmware to your device. + +## License + +Distributed under the MIT License. See `LICENCE.txt` for more information. diff --git a/assets/uart.png b/assets/uart.png new file mode 100644 index 0000000000000000000000000000000000000000..3cb6f58c7584589377c7978a55f607629b9e04fc GIT binary patch literal 105065 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 MQhQkV;PLbS1!#R1{{R30 literal 0 HcmV?d00001 diff --git a/assets/widgetPannel.png b/assets/widgetPannel.png new file mode 100644 index 0000000000000000000000000000000000000000..ed2f51a4cf6345dab362ab506f92c81b66c012f5 GIT binary patch literal 38685 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 - Vite App + yunsi.studio project
diff --git a/package-lock.json b/package-lock.json index 6b22e3e..2fe64b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "element-plus": "^2.8.1", "mitt": "^3.0.1", "pinia": "^2.1.7", - "vue": "^3.4.21", + "vue": "^3.5.16", "vue-draggable-plus": "^0.4.1", "vue-grid-layout-v3": "^3.1.2", "vue-i18n": "^9.10.2", @@ -78,10 +78,29 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "dependencies": { + "@babel/types": "^7.27.3" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -89,6 +108,18 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/types": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@ctrl/tinycolor": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", @@ -499,9 +530,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", @@ -1102,49 +1133,49 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", - "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.16.tgz", + "integrity": "sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==", "dependencies": { - "@babel/parser": "^7.23.9", - "@vue/shared": "3.4.21", + "@babel/parser": "^7.27.2", + "@vue/shared": "3.5.16", "entities": "^4.5.0", "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", - "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.16.tgz", + "integrity": "sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==", "dependencies": { - "@vue/compiler-core": "3.4.21", - "@vue/shared": "3.4.21" + "@vue/compiler-core": "3.5.16", + "@vue/shared": "3.5.16" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", - "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.16.tgz", + "integrity": "sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==", "dependencies": { - "@babel/parser": "^7.23.9", - "@vue/compiler-core": "3.4.21", - "@vue/compiler-dom": "3.4.21", - "@vue/compiler-ssr": "3.4.21", - "@vue/shared": "3.4.21", + "@babel/parser": "^7.27.2", + "@vue/compiler-core": "3.5.16", + "@vue/compiler-dom": "3.5.16", + "@vue/compiler-ssr": "3.5.16", + "@vue/shared": "3.5.16", "estree-walker": "^2.0.2", - "magic-string": "^0.30.7", - "postcss": "^8.4.35", - "source-map-js": "^1.0.2" + "magic-string": "^0.30.17", + "postcss": "^8.5.3", + "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", - "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.16.tgz", + "integrity": "sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==", "dependencies": { - "@vue/compiler-dom": "3.4.21", - "@vue/shared": "3.4.21" + "@vue/compiler-dom": "3.5.16", + "@vue/shared": "3.5.16" } }, "node_modules/@vue/compiler-vue2": { @@ -1225,48 +1256,49 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz", - "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.16.tgz", + "integrity": "sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==", "dependencies": { - "@vue/shared": "3.4.21" + "@vue/shared": "3.5.16" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz", - "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.16.tgz", + "integrity": "sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==", "dependencies": { - "@vue/reactivity": "3.4.21", - "@vue/shared": "3.4.21" + "@vue/reactivity": "3.5.16", + "@vue/shared": "3.5.16" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", - "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.16.tgz", + "integrity": "sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==", "dependencies": { - "@vue/runtime-core": "3.4.21", - "@vue/shared": "3.4.21", + "@vue/reactivity": "3.5.16", + "@vue/runtime-core": "3.5.16", + "@vue/shared": "3.5.16", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz", - "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.16.tgz", + "integrity": "sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==", "dependencies": { - "@vue/compiler-ssr": "3.4.21", - "@vue/shared": "3.4.21" + "@vue/compiler-ssr": "3.5.16", + "@vue/shared": "3.5.16" }, "peerDependencies": { - "vue": "3.4.21" + "vue": "3.5.16" } }, "node_modules/@vue/shared": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", - "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==" + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.16.tgz", + "integrity": "sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==" }, "node_modules/@vue/tsconfig": { "version": "0.5.1", @@ -3328,14 +3360,11 @@ } }, "node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/mdn-data": { @@ -3445,9 +3474,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -3936,9 +3965,9 @@ } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", + "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", "funding": [ { "type": "opencollective", @@ -3954,7 +3983,7 @@ } ], "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -5168,15 +5197,15 @@ "dev": true }, "node_modules/vue": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", - "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.16.tgz", + "integrity": "sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==", "dependencies": { - "@vue/compiler-dom": "3.4.21", - "@vue/compiler-sfc": "3.4.21", - "@vue/runtime-dom": "3.4.21", - "@vue/server-renderer": "3.4.21", - "@vue/shared": "3.4.21" + "@vue/compiler-dom": "3.5.16", + "@vue/compiler-sfc": "3.5.16", + "@vue/runtime-dom": "3.5.16", + "@vue/server-renderer": "3.5.16", + "@vue/shared": "3.5.16" }, "peerDependencies": { "typescript": "*" diff --git a/package.json b/package.json index 4564802..4956047 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "element-plus": "^2.8.1", "mitt": "^3.0.1", "pinia": "^2.1.7", - "vue": "^3.4.21", + "vue": "^3.5.16", "vue-draggable-plus": "^0.4.1", "vue-grid-layout-v3": "^3.1.2", "vue-i18n": "^9.10.2", diff --git a/src/App.vue b/src/App.vue index 627b695..b37be23 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,83 +1,89 @@ diff --git a/src/assets/icon/close.svg b/src/assets/icon/close.svg new file mode 100644 index 0000000..fbc8515 --- /dev/null +++ b/src/assets/icon/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icon/lock.svg b/src/assets/icon/lock.svg new file mode 100644 index 0000000..07b2ef7 --- /dev/null +++ b/src/assets/icon/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icon/lock_open.svg b/src/assets/icon/lock_open.svg new file mode 100644 index 0000000..c061381 --- /dev/null +++ b/src/assets/icon/lock_open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icon/play.svg b/src/assets/icon/play.svg new file mode 100644 index 0000000..47a9e72 --- /dev/null +++ b/src/assets/icon/play.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icon/repeat.svg b/src/assets/icon/repeat.svg new file mode 100644 index 0000000..701ed95 --- /dev/null +++ b/src/assets/icon/repeat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icon/text-data.svg b/src/assets/icon/text-data.svg new file mode 100644 index 0000000..7a53266 --- /dev/null +++ b/src/assets/icon/text-data.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/composables/useCommandLoopManager.ts b/src/composables/useCommandLoopManager.ts new file mode 100644 index 0000000..dc28fa8 --- /dev/null +++ b/src/composables/useCommandLoopManager.ts @@ -0,0 +1,176 @@ +/** + * @file Composable for managing a task scheduler that executes callbacks at specified intervals. + * This scheduler avoids time drift and handles race conditions from stale timers. + */ +import { ref, onUnmounted } from 'vue' +import { isDevMode } from './buildMode' + +interface ScheduledTask { + id: string + intervalMS: number + nextExecutionTime: number + executeCallback: () => Promise | void + oneTime: boolean + version: number +} + +// --- Module-level state (Singleton pattern) --- + +/** A sorted array of tasks to be executed. The task at index 0 is always the next one. */ +const scheduledTasks = ref([]) +/** Tracks the latest version for a given task ID to prevent stale timers from running. */ +const taskVersions = new Map() +/** The ID of the currently active `setTimeout` instance. */ +let currentTimerId: number | null = null +/** A reactive flag indicating if the scheduler has any pending tasks. */ +export const isSchedulerRunning = ref(false) +/** A lock to prevent concurrent task executions */ +let isTaskExecuting = false + +export function useCommandLoopManager() { + // --- Private Scheduler Core --- + + /** + * Executes the task at the front of the queue and reschedules it if it's recurring. + */ + const executeNextTask = async () => { + // If a task is already running, wait before trying to execute the next one. + if (isTaskExecuting) { + if (isDevMode()) console.log('[Scheduler] Delaying task execution: another task is already running.') + // This is a simple back-off strategy. + currentTimerId = window.setTimeout(executeNextTask, 50) + return + } + + if (scheduledTasks.value.length === 0) { + isSchedulerRunning.value = false + return + } + + const taskToExecute = scheduledTasks.value.shift()! + + // Stale check + const latestVersion = taskVersions.get(taskToExecute.id) + if (taskToExecute.version !== latestVersion) { + if (isDevMode()) console.log(`[Scheduler] Discarding stale task '${taskToExecute.id}' v${taskToExecute.version}.`) + scheduleNextExecution() // The queue has changed, so recalculate. + return + } + + // Acquire the lock and execute the callback. + try { + isTaskExecuting = true + if (isDevMode()) console.log(`[Scheduler] Executing task '${taskToExecute.id}' v${taskToExecute.version}`) + await taskToExecute.executeCallback() + } catch (error) { + console.error(`[Scheduler] Error in task '${taskToExecute.id}':`, error) + } finally { + isTaskExecuting = false // ALWAYS release the lock + } + + // If it's a recurring task, reschedule it. + if (!taskToExecute.oneTime) { + taskToExecute.nextExecutionTime = Date.now() + taskToExecute.intervalMS + // Re-insert the task and re-sort the queue. + scheduledTasks.value.push(taskToExecute) + scheduledTasks.value.sort((a, b) => a.nextExecutionTime - b.nextExecutionTime) + } else { + taskVersions.delete(taskToExecute.id) + } + + // Set the timer for the next task in the queue. + scheduleNextExecution() + } + + /** + * Sets a single master timer for the next task in the queue. + */ + const scheduleNextExecution = () => { + if (currentTimerId !== null) { + window.clearTimeout(currentTimerId) + currentTimerId = null + } + + if (scheduledTasks.value.length === 0) { + isSchedulerRunning.value = false + return + } + + const nextTask = scheduledTasks.value[0] + const timeout = Math.max(0, nextTask.nextExecutionTime - Date.now()) + + currentTimerId = window.setTimeout(executeNextTask, timeout) + isSchedulerRunning.value = true + + if (isDevMode()) { + console.log(`[Scheduler] Next task '${nextTask.id}' v${nextTask.version} scheduled in ${timeout}ms.`) + } + } + + // --- Public API --- + + /** + * Registers a new task, updates an existing one, or removes a task. + * This is the single entry point for all scheduling changes. + * @param id A unique identifier for the task. + * @param intervalMS The interval in milliseconds. Pass 0 or an invalid value to unregister. + * @param executeCallback The function to execute. + * @param oneTime If true, the task runs once and is not rescheduled. + */ + const registerLoop = ( + id: string, + intervalMS: number | string, + executeCallback: () => Promise | void, + oneTime = false, + ) => { + scheduledTasks.value = scheduledTasks.value.filter((task) => task.id !== id) + + const interval = typeof intervalMS === 'string' ? parseInt(intervalMS, 10) : intervalMS + if (!interval || isNaN(interval) || interval <= 0) { + if (isDevMode()) console.log(`[Scheduler] Unregistered task '${id}'.`) + taskVersions.delete(id) + scheduleNextExecution() + return + } + + const newVersion = (taskVersions.get(id) || 0) + 1 + taskVersions.set(id, newVersion) + + const newTask: ScheduledTask = { + id, + intervalMS: interval, + nextExecutionTime: Date.now() + interval, + executeCallback, + oneTime, + version: newVersion, + } + + scheduledTasks.value.push(newTask) + scheduledTasks.value.sort((a, b) => a.nextExecutionTime - b.nextExecutionTime) + + if (isDevMode()) { + console.log(`[Scheduler] Registered task '${id}' v${newVersion} with interval ${interval}ms.`) + } + + scheduleNextExecution() + } + + /** + * A convenience helper to explicitly remove a task from the scheduler. + * @param id The identifier of the task to remove. + */ + const unregisterLoop = (id: string) => { + registerLoop(id, -1, () => {}) + } + + // --- Lifecycle Hook --- + + onUnmounted(() => { + if (currentTimerId !== null) window.clearTimeout(currentTimerId) + scheduledTasks.value = [] + taskVersions.clear() + isSchedulerRunning.value = false + }) + + return { registerLoop, unregisterLoop, isRunning: isSchedulerRunning } +} \ No newline at end of file diff --git a/src/composables/useSequentialUart.ts b/src/composables/useSequentialUart.ts new file mode 100644 index 0000000..6d9ddb5 --- /dev/null +++ b/src/composables/useSequentialUart.ts @@ -0,0 +1,83 @@ +import { useDataViewerStore } from '@/stores/dataViewerStore' +import { watch } from 'vue' +import type { IDataBuf } from '@/stores/dataViewerStore' +import { isDevMode } from '@/composables/buildMode' + +function decodeUtf8(u8Arr: Uint8Array) { + try { + const decoder = new TextDecoder() + const decodedText = decoder.decode(u8Arr) // Attempt to decode + return decodedText.replace(/\uFFFD/g, '') // Remove all � characters + } catch (error) { + return '' + } +} + +export function useSequentialUart() { + const dataViewerStore = useDataViewerStore() as any + + async function sendCommand(command: string): Promise { + return new Promise((resolve) => { + let responseBuffer = '' + let responseTimeout: number | null = null + const RESPONSE_WAIT_TIME = 10 // Wait 500ms after last response before resolving + + // Index to track which messages we've already processed + let lastProcessedIndex = dataViewerStore.dataFiltered.length - 1 + + const stopWatch = watch( + () => dataViewerStore.dataFiltered, + (newBuf: IDataBuf[]) => { + if (isDevMode()) { + console.log('watch data', newBuf) + } + + // Process only new messages + for (let i = lastProcessedIndex + 1; i < newBuf.length; i++) { + const message = newBuf[i] + if (message.isRX) { + // Add to response buffer + responseBuffer += decodeUtf8(message.data) + + // Reset timeout to wait for more responses + if (responseTimeout) { + clearTimeout(responseTimeout) + } + + responseTimeout = window.setTimeout(() => { + stopWatch() + resolve(responseBuffer) + }, RESPONSE_WAIT_TIME) + } + } + + // Update last processed index + lastProcessedIndex = newBuf.length - 1 + }, + { deep: true } + ) + + dataViewerStore.addString(command, false, true) + + // Set a maximum timeout in case no response is received + const maxTimeout = window.setTimeout(() => { + stopWatch() + resolve(responseBuffer) + }, 1000) // 5 seconds maximum wait time + }) + } + + async function sendCommands(commands: string[]): Promise { + const responses: string[] = [] + for (const command of commands) { + const response = await sendCommand(command) + responses.push(response) + } + if (isDevMode()) { + console.log('sendCommands', responses) + } + return responses + } + + return { sendCommands } +} diff --git a/src/composables/useUartModule.ts b/src/composables/useUartModule.ts new file mode 100644 index 0000000..9a3e826 --- /dev/null +++ b/src/composables/useUartModule.ts @@ -0,0 +1,81 @@ +import type { IUartMsgConfig, IUartMsgNum } from '@/api/apiUart' +import type { IUartMsgBaud } from '@/api/apiUart' +import { uart_get_baud, uart_get_config, WtUartCmd } from '@/api/apiUart' +import { useUartStore } from '@/stores/useUartStore' +import { registerModule } from '@/router/msgRouter' +import * as api from '@/api' +import { isDevMode } from './buildMode' +import { useDataViewerStore } from '@/stores/dataViewerStore' +import type { ApiBinaryMsg } from '@/api/binDataDef' +import { ControlEvent } from '@/api' +import * as df from '@/api/apiDataFlow' +import { uart_get_default_num } from '@/api/apiUart' + +export function useUartModule() { + const dataViewerStore = useDataViewerStore() + const uartStore = useUartStore() + + function updateUartData() { + /* TODO: hard code for the moment, 0 is UART instance id (can be changed in the future) */ + uart_get_default_num() + df.wt_data_flow_attach_cur_to_sender(0) + } + + const onUartJsonMsg = (msg: api.ApiJsonMsg) => { + switch (msg.cmd as WtUartCmd) { + case WtUartCmd.GET_BAUD: + case WtUartCmd.SET_BAUD: { + const uartMsg = msg as IUartMsgBaud + if (uartMsg.baud) { + dataViewerStore.setUartBaud(uartMsg.baud) + } + break + } + case WtUartCmd.GET_CONFIG: + case WtUartCmd.SET_CONFIG: { + const uartMsg = msg as IUartMsgConfig + dataViewerStore.uartConfig.data_bits = uartMsg.data_bits + dataViewerStore.uartConfig.stop_bits = uartMsg.stop_bits + dataViewerStore.uartConfig.parity = uartMsg.parity + break + } + case WtUartCmd.GET_DEFAULT_NUM: + uartStore.uartNum = (msg as IUartMsgNum).num + uart_get_baud(uartStore.uartNum) + uart_get_config(uartStore.uartNum) + break + default: + if (isDevMode()) { + console.log('uart not treated', msg) + } + break + } + } + + const onUartBinaryMsg = (msg: ApiBinaryMsg) => { + if (isDevMode()) { + console.log('uart', msg) + } + + dataViewerStore.addSegment(new Uint8Array(msg.payload), true) + } + + const onClientCtrl = (msg: api.ControlMsg) => { + if (msg.type !== api.ControlMsgType.WS_EVENT) { + return + } + + if (msg.data === ControlEvent.DISCONNECTED) { + dataViewerStore.acceptIncomingData = false + } else if (msg.data === ControlEvent.CONNECTED) { + updateUartData() + dataViewerStore.acceptIncomingData = true + } + } + + registerModule(api.WtModuleID.UART, { + ctrlCallback: onClientCtrl, + serverJsonMsgCallback: onUartJsonMsg, + serverBinMsgCallback: onUartBinaryMsg + }) +} diff --git a/src/locales/en.ts b/src/locales/en.ts index 640aeee..d05d2a7 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -37,7 +37,7 @@ export default { wifi: "Wi-Fi", about: "About", uart: "Uart", - at: "AT Command", + widget: "Widget", feedback: "Feedback", close: "Close", update: "Update", @@ -200,6 +200,36 @@ export default { connectionSuccess: "Connection Successful", enterAPName: "Entre the AP name", debuggerNotConnected: "Debugger not connected", - } + }, + widget: { + editGrid: 'Edit Grid', + editCell: 'Edit Cell', + loopWidget: 'Loop Widget', + loopWidgetDesc: 'Container for command sequences.', + addGrid: 'Add to Grid', + dataViewer: 'Data Viewer', + dataViewerDesc: 'Displays raw text data from UART.', + exportSettings: 'Export Settings', + importSettings: 'Import Settings', + resetToDefault: 'Reset to Default', + gridItemName: 'Widget name', + dropHere: 'Drop here', + run: 'Run', + loop: 'Loop', + delay: 'Delay', + addCommand: 'Add Command', + loopInterval: 'Loop Interval', + uartViewOnce: 'UART View Widget can only be added once.' + }, + + common: { + debuggerConnected: 'Debugger connected', + ok: 'OK' + }, + + navbar: { + navigationSidebar: 'Navigation Sidebar', + getSomeFries: "Let's go to the dock and get some fries", + }, }; \ No newline at end of file diff --git a/src/locales/fr.ts b/src/locales/fr.ts index 8daba3d..8973caa 100644 --- a/src/locales/fr.ts +++ b/src/locales/fr.ts @@ -37,7 +37,7 @@ export default { wifi: "Wi-Fi", about: "À propos", uart: "Uart", - at: "Commande AT", + widget: "Widget", feedback: "Feedback", close: "Fermer", update: "Mise à jour", @@ -201,5 +201,36 @@ export default { connectionSuccess: "Connexion Réussie", enterAPName: "Entrez le nom du AP", debuggerNotConnected: "Debugger non connecté", - } + }, + + widget: { + editGrid: 'Modifier la grille', + editCell: 'Modifier les cellules', + loopWidget: 'Widget Boucle', + loopWidgetDesc: 'Conteneur pour les séquences de commandes.', + addGrid: 'Ajouter à la grille', + dataViewer: 'Visualiseur de données', + dataViewerDesc: "Affiche les données texte brutes de l'UART.", + exportSettings: 'Exporter les paramètres', + importSettings: 'Importer les paramètres', + resetToDefault: 'Réinitialiser par défaut', + gridItemName: "Nom", + dropHere: 'Déposer ici', + run: 'Exécuter', + loop: 'Boucle', + delay: 'Délai', + addCommand: 'Ajouter une commande', + loopInterval: 'Intervalle de répétition', + uartViewOnce: "Le widget de vue UART ne peut être ajouté qu'une seule fois." + }, + + common: { + debuggerConnected: 'Débogueur connecté', + ok: 'OK' + }, + + navbar: { + navigationSidebar: 'Barre latérale de navigation', + getSomeFries: 'Allons au quai prendre des frites', + }, }; \ No newline at end of file diff --git a/src/locales/zh.ts b/src/locales/zh.ts index ce1e502..6999b9f 100644 --- a/src/locales/zh.ts +++ b/src/locales/zh.ts @@ -37,7 +37,7 @@ export default { wifi: "Wi-Fi", about: "关于", uart: "UART", - at: "AT命令", + widget: "组件", feedback: "反馈", close: "关闭", update: "更新", @@ -143,7 +143,7 @@ export default { autoUpdate: "自动刷新", tempDisplayTooltip: "未满足断帧规则的数据(如:未超时),暂时实时显示在此区域。超过8192字节,自动断帧;", loopSend: "循环发送", - loopSendTooltip: "实际频率受界面刷新率影响,如需要更精确,可以尝试关闭‘自动刷新’", + loopSendTooltip: "实际频率受界面刷新率影响,如需要更精确,可以尝试关闭'自动刷新'", sendFormat: "发送格式", cachedFrame: "缓存帧数", format: "格式化", @@ -204,5 +204,36 @@ export default { connectionSuccess: "连接成功", enterAPName: "请输入AP名", debuggerNotConnected: "调试器未连接", - } + }, + + widget: { + editGrid: '编辑网格', + editCell: '编辑单元', + loopWidget: '循环小部件', + loopWidgetDesc: '用于命令序列的容器。', + addGrid: '添加到网格', + dataViewer: '数据显示器', + dataViewerDesc: '显示来自UART的原始文本数据。', + exportSettings: '导出设置', + importSettings: '导入设置', + resetToDefault: '重置', + gridItemName: '组件名称', + dropHere: '在此处放置', + run: '运行', + loop: '循环', + delay: '延迟', + addCommand: '添加命令', + loopInterval: '循环间隔', + uartViewOnce: 'UART视图组件只能添加一次。' + }, + + common: { + debuggerConnected: '调试器已连接', + ok: '好的' + }, + + navbar: { + navigationSidebar: '导航侧栏', + getSomeFries: '走,去码头整点薯条', + }, } \ No newline at end of file diff --git a/src/router/index.ts b/src/router/index.ts index a08ad0d..216e840 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,18 +1,18 @@ -import {createRouter, createWebHistory, type RouteLocationNormalizedLoaded} from 'vue-router' +import {createRouter, createWebHashHistory, type RouteLocationNormalizedLoaded} from 'vue-router' import Wifi from '@/views/Wifi.vue' import Feedback from '@/views/Feedback.vue' import About from '@/views/About.vue' import Uart from '@/views/Uart.vue' import Page404 from '@/views/404.vue' import Update from '@/views/Update.vue' -import AtCommand from '@/views/AtCommand.vue' +import WidgetPannel from '@/views/WidgetPannel.vue' import {translate} from "@/locales"; import {isOTAEnabled} from "@/composables/buildMode"; import {reactive, watch} from "vue"; import {getLang} from "@/i18n"; const languageState = reactive({ - currentLanguage: getLang(), // Get the current language from your i18n setup + lang: getLang() }); interface AppRouteMeta { @@ -37,14 +37,14 @@ function updateDocumentTitle(route: RouteLocationNormalizedLoaded) { } // Watch for language changes to update the titles dynamically -watch(() => languageState.currentLanguage, () => { +watch(() => languageState.lang, () => { // Recompute all route meta titles updateMetaTitles(); updateDocumentTitle(router.currentRoute.value); }, {deep: true}); const router = createRouter({ - history: createWebHistory(import.meta.env.BASE_URL), + history: createWebHashHistory(import.meta.env.BASE_URL), routes: [ { path: '/', @@ -68,9 +68,9 @@ const router = createRouter({ meta: { titleKey: 'page.uart' }, component: Uart, }, { - path: '/at:ext(.*)', - meta: { titleKey: 'page.at' }, - component: AtCommand, + path: '/widget:ext(.*)', + meta: { titleKey: 'page.widget' }, + component: WidgetPannel, }, { path: '/feedback:ext(.*)', meta: { titleKey: 'page.feedback' }, diff --git a/src/stores/useWidgetStore.ts b/src/stores/useWidgetStore.ts new file mode 100644 index 0000000..fc79645 --- /dev/null +++ b/src/stores/useWidgetStore.ts @@ -0,0 +1,424 @@ +import { computed, markRaw, ref, toRaw, watch } from 'vue' +import { defineStore } from 'pinia' +import type { WidgetItem } from '@/types/grid' +import { globalNotify } from '@/composables/notification' +import { ElMessageBox } from 'element-plus' +import UartAtCommand from '@/views/widgets/uartAtCommand.vue' +import WidgetLoop from '@/views/widgets/widgetLoop.vue' +import textDataViewer from '@/views/text-data-viewer/textDataViewer.vue' + +const componentMap: { [key: string]: any } = { + WidgetLoop, + textDataViewer, + UartAtCommand +} + +const getComponentName = (component: any): string | null => { + const rawComponent = toRaw(component) + for (const name in componentMap) { + if (componentMap[name] === rawComponent) { + return name + } + } + return null +} + +const getDefaultLayout = (): WidgetItem[] => [ + { + x: 0, + y: 0, + w: 10, + h: 10, + i: 0, + name: 'Widget A', + static: false, + widget: markRaw(WidgetLoop), + widgetProps: [ + { + id: 1, + componentType: markRaw(UartAtCommand), + props: { label: 'Device ID', command: 'AT+ID?', response: 'ID:xxxx' } + }, + { + id: 2, + componentType: markRaw(UartAtCommand), + props: { label: 'Version', command: 'AT+VER?', response: 'V1.0.0' } + }, + { + id: 3, + componentType: markRaw(UartAtCommand), + props: { label: 'Reset', command: 'AT+RESET', response: 'OK' } + } + ] + }, + { + x: 10, + y: 0, + w: 10, + h: 10, + i: 1, + name: 'Widget B', + static: false, + widget: markRaw(WidgetLoop), + widgetProps: [ + { + id: 1, + componentType: markRaw(UartAtCommand), + props: { + label: 'Scan WiFi', + command: 'AT+WSCANasdfasdfasdf', + response: 'SCAN OKasd fsdaf asdf asdf asdf asdf ' + } + }, + { + id: 2, + componentType: markRaw(UartAtCommand), + props: { + label: 'Connect WiFi', + command: 'AT+WCONN=ssid,pwd', + response: 'CONN OK' + } + } + ] + }, + { + x: 0, + y: 10, + w: 10, + h: 10, + i: 2, + name: 'Widget C', + static: false, + widget: markRaw(WidgetLoop), + widgetProps: [ + { + id: 1, + componentType: markRaw(UartAtCommand), + props: { + label: 'Ping Test', + command: 'AT+PING=google.com', + response: 'PING OK' + } + } + ] + }, + { + x: 10, + y: 10, + w: 10, + h: 10, + i: 3, + name: 'Widget D', + static: false, + widget: markRaw(textDataViewer), + widgetProps: [] + } +] + +const throttle = (fn: Function, wait: number) => { + let inThrottle: boolean, lastFn: number, lastTime: number + return function (this: any, ...args: any[]) { + const context = this + if (!inThrottle) { + fn.apply(context, args) + lastTime = Date.now() + inThrottle = true + } else { + clearTimeout(lastFn) + lastFn = window.setTimeout(() => { + if (Date.now() - lastTime >= wait) { + fn.apply(context, args) + lastTime = Date.now() + } + }, Math.max(wait - (Date.now() - lastTime), 0)) + } + } +} + +export const useWidgetStore = defineStore('widget', () => { + const layout = ref(getDefaultLayout()) + + const editCell = ref(false) + const editGrid = ref(false) + const showOptions = ref(true) + + const isUartViewAdded = computed(() => + layout.value.some((item) => toRaw(item.widget) === textDataViewer) + ) + + watch( + () => editGrid.value, + (newValue) => { + if (newValue) { + editCell.value = false + } + } + ) + + watch( + () => editCell.value, + (newValue) => { + if (newValue) { + editGrid.value = false + } + } + ) + + const getNextId = (): number => { + const numericIds = layout.value.map((item) => Number(item.i)).filter((id) => !isNaN(id)) + if (numericIds.length === 0) { + return 0 + } + return Math.max(...numericIds) + 1 + } + + const addLoopWidget = () => { + const nextId = getNextId() + let y = 0 + if (layout.value.length > 0) { + y = Math.max(...layout.value.map((item) => item.y + item.h)) + } + const newWidget: WidgetItem = { + x: 0, + y: y, + w: 10, + h: 5, + i: nextId, + name: `New Loop Widget`, + static: false, + widget: markRaw(WidgetLoop), + widgetProps: [] + } + layout.value.push(newWidget) + } + + const addUartViewWidget = () => { + if (isUartViewAdded.value) { + globalNotify('UART View Widget can only be added once.', 'warning') + return + } + + const nextId = getNextId() + let y = 0 + if (layout.value.length > 0) { + y = Math.max(...layout.value.map((item) => item.y + item.h)) + } + + const newWidget: WidgetItem = { + x: 0, + y: y, + w: 10, + h: 10, + i: nextId, + name: 'UART Data Viewer', + static: false, + widget: markRaw(textDataViewer), + widgetProps: [] + } + layout.value.push(newWidget) + } + + const deleteWidget = (index: number) => { + layout.value.splice(index, 1) + } + + const resetToDefault = () => { + ElMessageBox.confirm( + 'This will reset your layout to the default settings. Are you sure?', + 'Warning', + { + confirmButtonText: 'OK', + cancelButtonText: 'Cancel', + type: 'warning' + } + ) + .then(() => { + layout.value = getDefaultLayout() + globalNotify('Layout reset to default.', 'success') + }) + .catch(() => { + globalNotify('Layout reset cancelled.', 'info') + }) + } + + const exportSettings = () => { + try { + const layoutToSave = toRaw(layout.value).map((item) => { + const rawItem = toRaw(item) + return { + ...rawItem, + widget: getComponentName(rawItem.widget), + widgetProps: rawItem.widgetProps?.map((prop: any) => { + const rawProp = toRaw(prop) + return { + ...rawProp, + componentType: getComponentName(rawProp.componentType) + } + }) + } + }) + + const dataStr = JSON.stringify(layoutToSave, null, 2) + const dataUri = 'data:application/json;charset=utf-8,' + encodeURIComponent(dataStr) + + const exportFileDefaultName = 'at-command-settings.json' + + const linkElement = document.createElement('a') + linkElement.setAttribute('href', dataUri) + linkElement.setAttribute('download', exportFileDefaultName) + linkElement.click() + globalNotify('Settings exported successfully.', 'success') + } catch (error) { + console.error('Failed to export settings:', error) + globalNotify('Failed to export settings.', 'error') + } + } + + const importSettings = () => { + const input = document.createElement('input') + input.type = 'file' + input.accept = '.json' + input.onchange = (e) => { + const file = (e.target as HTMLInputElement).files?.[0] + if (!file) return + + const reader = new FileReader() + reader.onload = (event) => { + try { + const fileContent = event.target?.result as string + const parsedLayout = JSON.parse(fileContent) + + // Basic validation + if (!Array.isArray(parsedLayout)) { + throw new Error('Invalid format: expected an array of widgets.') + } + + const newLayout = parsedLayout + .map((item: any) => { + if (item.widget && componentMap[item.widget]) { + item.widget = markRaw(componentMap[item.widget]) + } else { + console.warn(`Unknown widget type "${item.widget}" during import. Skipping item.`) + return null + } + + if (item.widgetProps) { + item.widgetProps.forEach((prop: any) => { + if (prop.componentType && componentMap[prop.componentType]) { + prop.componentType = markRaw(componentMap[prop.componentType]) + } else if (prop.componentType) { + console.warn( + `Unknown componentType "${prop.componentType}" for widget "${item.name}". It will be ignored.` + ) + prop.componentType = null + } + }) + item.widgetProps = item.widgetProps.filter((prop: any) => prop.componentType) + } + return item + }) + .filter(Boolean) // remove null items + + layout.value = newLayout + globalNotify('Settings imported successfully.', 'success') + } catch (error: any) { + console.error('Failed to import settings:', error) + globalNotify(`Failed to import settings: ${error.message}`, 'error') + } + } + reader.readAsText(file) + } + input.click() + } + + const saveLayoutToLocalStorage = () => { + try { + const layoutToSave = toRaw(layout.value).map((item) => { + const rawItem = toRaw(item) + return { + ...rawItem, + widget: getComponentName(rawItem.widget), + widgetProps: rawItem.widgetProps?.map((prop: any) => { + const rawProp = toRaw(prop) + return { + ...rawProp, + componentType: getComponentName(rawProp.componentType) + } + }) + } + }) + localStorage.setItem('at-command-layout', JSON.stringify(layoutToSave)) + } catch (error) { + console.error('Failed to save layout to localStorage:', error) + } + } + + const loadLayoutFromLocalStorage = () => { + const savedLayoutJSON = localStorage.getItem('at-command-layout') + if (!savedLayoutJSON) return + + try { + const parsedLayout = JSON.parse(savedLayoutJSON) + + if (!Array.isArray(parsedLayout)) { + throw new Error('Invalid format in localStorage: expected an array of widgets.') + } + + const newLayout = parsedLayout + .map((item: any) => { + if (item.widget && componentMap[item.widget]) { + item.widget = markRaw(componentMap[item.widget]) + } else { + console.warn(`Unknown widget type "${item.widget}" from localStorage. Skipping item.`) + return null + } + + if (item.widgetProps) { + item.widgetProps.forEach((prop: any) => { + if (prop.componentType && componentMap[prop.componentType]) { + prop.componentType = markRaw(componentMap[prop.componentType]) + } else if (prop.componentType) { + console.warn( + `Unknown componentType "${prop.componentType}" for widget "${item.name}" from localStorage. It will be ignored.` + ) + prop.componentType = null + } + }) + item.widgetProps = item.widgetProps.filter((prop: any) => prop.componentType) + } + return item + }) + .filter(Boolean) // remove null items + + layout.value = newLayout + globalNotify('Settings restored from last session.', 'success') + } catch (error: any) { + console.error('Failed to load layout from localStorage:', error) + globalNotify(`Failed to load settings from localStorage: ${error.message}`, 'error') + localStorage.removeItem('at-command-layout') + } + } + + watch( + layout, + throttle(() => saveLayoutToLocalStorage(), 1000), + { deep: true } + ) + + loadLayoutFromLocalStorage() + + return { + layout, + editGrid, + editCell, + showOptions, + isUartViewAdded, + addLoopWidget, + addUartViewWidget, + deleteWidget, + resetToDefault, + exportSettings, + importSettings, + getNextId + } +}) diff --git a/src/types/grid.ts b/src/types/grid.ts new file mode 100644 index 0000000..ea33981 --- /dev/null +++ b/src/types/grid.ts @@ -0,0 +1,26 @@ +import type { Component } from 'vue' + +export interface UartCommandData { + command: string + label: string + response: string +} + +export interface DraggableComponent> { + id: number + componentType: Component | string + props: T +} + +export interface WidgetItem { + x: number + y: number + w: number + h: number + i: number + name: string + static: boolean + widget: Component | string + widgetIconName?: string + widgetProps: DraggableComponent[] +} \ No newline at end of file diff --git a/src/views/AtCommand.vue b/src/views/AtCommand.vue deleted file mode 100644 index 3572375..0000000 --- a/src/views/AtCommand.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/views/Uart.vue b/src/views/Uart.vue index 5481547..27fa9ce 100644 --- a/src/views/Uart.vue +++ b/src/views/Uart.vue @@ -12,7 +12,7 @@
- +
@@ -82,17 +82,18 @@ import { /* TODO: use https://antoniandre.github.io/splitpanes/ */ +import { type ApiBinaryMsg } from '@/api/binDataDef' +import * as df from '@/api/apiDataFlow' +import textDataViewer from '@/views/text-data-viewer/textDataViewer.vue' +import textDataConfig from '@/views/text-data-viewer/textDataConfig.vue' +import { registerModule } from '@/router/msgRouter' +import { isDevMode } from '@/composables/buildMode' +import { useWsStore } from '@/stores/websocket' +import { useUartStore } from '@/stores/useUartStore' +import TextDataMacro from '@/views/text-data-viewer/textDataMacro.vue' +import { translate } from '@/locales' +import { useUartModule } from '@/composables/useUartModule' -import {type ApiBinaryMsg} from '@/api/binDataDef'; -import * as df from '@/api/apiDataFlow'; -import textDataViewer from "@/views/text-data-viewer/textDataViewer.vue"; -import textDataConfig from "@/views/text-data-viewer/textDataConfig.vue" -import {registerModule} from "@/router/msgRouter"; -import {isDevMode} from "@/composables/buildMode"; -import {useWsStore} from "@/stores/websocket"; -import {useUartStore} from "@/stores/useUartStore"; -import TextDataMacro from "@/views/text-data-viewer/textDataMacro.vue"; -import {translate} from "@/locales"; const store = useDataViewerStore() const wsStore = useWsStore() @@ -422,11 +423,7 @@ function handleWinSizeRefresh() { } onMounted(() => { - registerModule(api.WtModuleID.UART, { - ctrlCallback: onClientCtrl, - serverJsonMsgCallback: onUartJsonMsg, - serverBinMsgCallback: onUartBinaryMsg, - }); + useUartModule() firstWinResizeRef.value.style.borderWidth = store.winLeft.borderSize + "px"; thirdWinResizeRef.value.style.borderWidth = store.winRight.borderSize + "px"; diff --git a/src/views/WidgetPannel.vue b/src/views/WidgetPannel.vue new file mode 100644 index 0000000..30c5682 --- /dev/null +++ b/src/views/WidgetPannel.vue @@ -0,0 +1,345 @@ + + + + + + diff --git a/src/views/navigation/NavBar.vue b/src/views/navigation/NavBar.vue index 58f6ca4..e0da2b1 100644 --- a/src/views/navigation/NavBar.vue +++ b/src/views/navigation/NavBar.vue @@ -3,22 +3,17 @@
-