From a686d19e61592661a3571e3ff9a1d8508ab9a418 Mon Sep 17 00:00:00 2001 From: lenn Date: Thu, 2 Apr 2026 17:54:10 +0800 Subject: [PATCH] feat:add slave --- .VSCodeCounter/2026-04-02_14-42-07/details.md | 62 ++++++ .../2026-04-02_14-42-07/diff-details.md | 21 ++ .VSCodeCounter/2026-04-02_14-42-07/diff.csv | 8 + .VSCodeCounter/2026-04-02_14-42-07/diff.md | 26 +++ .VSCodeCounter/2026-04-02_14-42-07/diff.txt | 35 +++ .../2026-04-02_14-42-07/results.csv | 49 ++++ .../2026-04-02_14-42-07/results.json | 1 + .VSCodeCounter/2026-04-02_14-42-07/results.md | 50 +++++ .../2026-04-02_14-42-07/results.txt | 100 +++++++++ package-lock.json | 4 +- package.json | 2 +- src-tauri/Cargo.lock | 44 ++-- src-tauri/Cargo.toml | 2 +- ...am.log2026-04-01 => program.log2026-04-02} | 0 src-tauri/src/commands/serial.rs | 1 + src-tauri/src/serial_core/codecs/tactile_a.rs | 169 +++++++++++--- src-tauri/src/serial_core/codecs/test.rs | 6 +- src-tauri/src/serial_core/error.rs | 2 + src-tauri/src/serial_core/serial.rs | 210 +++++++++++++++++- src-tauri/src/serial_core/utils.rs | 50 +++-- src/routes/+page.svelte | 14 +- static/favicon.png | Bin 1571 -> 0 bytes static/svelte.svg | 1 - static/tauri.svg | 6 - static/vite.svg | 1 - 25 files changed, 763 insertions(+), 101 deletions(-) create mode 100644 .VSCodeCounter/2026-04-02_14-42-07/details.md create mode 100644 .VSCodeCounter/2026-04-02_14-42-07/diff-details.md create mode 100644 .VSCodeCounter/2026-04-02_14-42-07/diff.csv create mode 100644 .VSCodeCounter/2026-04-02_14-42-07/diff.md create mode 100644 .VSCodeCounter/2026-04-02_14-42-07/diff.txt create mode 100644 .VSCodeCounter/2026-04-02_14-42-07/results.csv create mode 100644 .VSCodeCounter/2026-04-02_14-42-07/results.json create mode 100644 .VSCodeCounter/2026-04-02_14-42-07/results.md create mode 100644 .VSCodeCounter/2026-04-02_14-42-07/results.txt rename src-tauri/{program.log2026-04-01 => program.log2026-04-02} (100%) delete mode 100644 static/favicon.png delete mode 100644 static/svelte.svg delete mode 100644 static/tauri.svg delete mode 100644 static/vite.svg diff --git a/.VSCodeCounter/2026-04-02_14-42-07/details.md b/.VSCodeCounter/2026-04-02_14-42-07/details.md new file mode 100644 index 0000000..fab2f7c --- /dev/null +++ b/.VSCodeCounter/2026-04-02_14-42-07/details.md @@ -0,0 +1,62 @@ +# Details + +Date : 2026-04-02 14:42:07 + +Directory e:\\Workspace\\joyson-serial + +Total : 47 files, 9155 codes, 95 comments, 1279 blanks, all 10529 lines + +[Summary](results.md) / Details / [Diff Summary](diff.md) / [Diff Details](diff-details.md) + +## Files +| filename | language | code | comment | blank | total | +| :--- | :--- | ---: | ---: | ---: | ---: | +| [.idea/modules.xml](/.idea/modules.xml) | XML | 8 | 0 | 0 | 8 | +| [.idea/tauri-demo.iml](/.idea/tauri-demo.iml) | XML | 11 | 0 | 0 | 11 | +| [README.md](/README.md) | Markdown | 34 | 0 | 20 | 54 | +| [flowus\_tools.json](/flowus_tools.json) | JSON | 1 | 0 | 1 | 2 | +| [frontend\_prompt.md](/frontend_prompt.md) | Markdown | 189 | 0 | 66 | 255 | +| [package-lock.json](/package-lock.json) | JSON | 1,957 | 0 | 1 | 1,958 | +| [package.json](/package.json) | JSON | 31 | 0 | 1 | 32 | +| [src-tauri/build.rs](/src-tauri/build.rs) | Rust | 3 | 0 | 1 | 4 | +| [src-tauri/capabilities/default.json](/src-tauri/capabilities/default.json) | JSON | 15 | 0 | 1 | 16 | +| [src-tauri/src/commands/mod.rs](/src-tauri/src/commands/mod.rs) | Rust | 2 | 0 | 1 | 3 | +| [src-tauri/src/commands/serial.rs](/src-tauri/src/commands/serial.rs) | Rust | 246 | 0 | 44 | 290 | +| [src-tauri/src/commands/window.rs](/src-tauri/src/commands/window.rs) | Rust | 27 | 0 | 6 | 33 | +| [src-tauri/src/lib.rs](/src-tauri/src/lib.rs) | Rust | 22 | 0 | 2 | 24 | +| [src-tauri/src/log.rs](/src-tauri/src/log.rs) | Rust | 34 | 0 | 2 | 36 | +| [src-tauri/src/main.rs](/src-tauri/src/main.rs) | Rust | 8 | 1 | 2 | 11 | +| [src-tauri/src/serial\_core/codec.rs](/src-tauri/src/serial_core/codec.rs) | Rust | 6 | 0 | 1 | 7 | +| [src-tauri/src/serial\_core/codecs/mod.rs](/src-tauri/src/serial_core/codecs/mod.rs) | Rust | 4 | 0 | 1 | 5 | +| [src-tauri/src/serial\_core/codecs/tactile\_a.rs](/src-tauri/src/serial_core/codecs/tactile_a.rs) | Rust | 220 | 0 | 28 | 248 | +| [src-tauri/src/serial\_core/codecs/test.rs](/src-tauri/src/serial_core/codecs/test.rs) | Rust | 215 | 8 | 38 | 261 | +| [src-tauri/src/serial\_core/error.rs](/src-tauri/src/serial_core/error.rs) | Rust | 49 | 0 | 6 | 55 | +| [src-tauri/src/serial\_core/frame.rs](/src-tauri/src/serial_core/frame.rs) | Rust | 47 | 3 | 8 | 58 | +| [src-tauri/src/serial\_core/mod.rs](/src-tauri/src/serial_core/mod.rs) | Rust | 22 | 0 | 7 | 29 | +| [src-tauri/src/serial\_core/model.rs](/src-tauri/src/serial_core/model.rs) | Rust | 377 | 57 | 67 | 501 | +| [src-tauri/src/serial\_core/record.rs](/src-tauri/src/serial_core/record.rs) | Rust | 50 | 4 | 11 | 65 | +| [src-tauri/src/serial\_core/serial.rs](/src-tauri/src/serial_core/serial.rs) | Rust | 141 | 0 | 22 | 163 | +| [src-tauri/src/serial\_core/utils.rs](/src-tauri/src/serial_core/utils.rs) | Rust | 47 | 0 | 13 | 60 | +| [src-tauri/tauri.conf.json](/src-tauri/tauri.conf.json) | JSON | 36 | 0 | 1 | 37 | +| [src/app.html](/src/app.html) | HTML | 13 | 0 | 1 | 14 | +| [src/lib/components/CenterStage.svelte](/src/lib/components/CenterStage.svelte) | Svelte | 691 | 0 | 96 | 787 | +| [src/lib/components/ConfigPanel.svelte](/src/lib/components/ConfigPanel.svelte) | Svelte | 398 | 0 | 63 | 461 | +| [src/lib/components/HudPanel.svelte](/src/lib/components/HudPanel.svelte) | Svelte | 861 | 0 | 110 | 971 | +| [src/lib/components/PressureMatrixViewer.svelte](/src/lib/components/PressureMatrixViewer.svelte) | Svelte | 558 | 0 | 97 | 655 | +| [src/lib/components/SignalChart.svelte](/src/lib/components/SignalChart.svelte) | Svelte | 382 | 0 | 71 | 453 | +| [src/lib/components/SummaryCurve.svelte](/src/lib/components/SummaryCurve.svelte) | Svelte | 497 | 0 | 88 | 585 | +| [src/lib/config/color-map.ts](/src/lib/config/color-map.ts) | TypeScript | 55 | 0 | 3 | 58 | +| [src/lib/styles/theme.css](/src/lib/styles/theme.css) | PostCSS | 43 | 1 | 7 | 51 | +| [src/lib/types/hud.ts](/src/lib/types/hud.ts) | TypeScript | 126 | 0 | 20 | 146 | +| [src/routes/+layout.svelte](/src/routes/+layout.svelte) | Svelte | 13 | 0 | 5 | 18 | +| [src/routes/+layout.ts](/src/routes/+layout.ts) | TypeScript | 1 | 4 | 1 | 6 | +| [src/routes/+page.svelte](/src/routes/+page.svelte) | Svelte | 1,286 | 0 | 176 | 1,462 | +| [static/svelte.svg](/static/svelte.svg) | XML | 1 | 0 | 0 | 1 | +| [static/tauri.svg](/static/tauri.svg) | XML | 6 | 0 | 1 | 7 | +| [static/vite.svg](/static/vite.svg) | XML | 1 | 0 | 0 | 1 | +| [svelte.config.js](/svelte.config.js) | JavaScript | 11 | 5 | 3 | 19 | +| [tauri-event.md](/tauri-event.md) | Markdown | 374 | 0 | 181 | 555 | +| [tsconfig.json](/tsconfig.json) | JSON with Comments | 14 | 5 | 1 | 20 | +| [vite.config.js](/vite.config.js) | JavaScript | 22 | 7 | 4 | 33 | + +[Summary](results.md) / Details / [Diff Summary](diff.md) / [Diff Details](diff-details.md) \ No newline at end of file diff --git a/.VSCodeCounter/2026-04-02_14-42-07/diff-details.md b/.VSCodeCounter/2026-04-02_14-42-07/diff-details.md new file mode 100644 index 0000000..22f8c1d --- /dev/null +++ b/.VSCodeCounter/2026-04-02_14-42-07/diff-details.md @@ -0,0 +1,21 @@ +# Diff Details + +Date : 2026-04-02 14:42:07 + +Directory e:\\Workspace\\joyson-serial + +Total : 6 files, 247 codes, 1 comments, 29 blanks, all 277 lines + +[Summary](results.md) / [Details](details.md) / [Diff Summary](diff.md) / Diff Details + +## Files +| filename | language | code | comment | blank | total | +| :--- | :--- | ---: | ---: | ---: | ---: | +| [src-tauri/src/serial\_core/codecs/tactile\_a.rs](/src-tauri/src/serial_core/codecs/tactile_a.rs) | Rust | 153 | 0 | 11 | 164 | +| [src-tauri/src/serial\_core/codecs/test.rs](/src-tauri/src/serial_core/codecs/test.rs) | Rust | 2 | 1 | -2 | 1 | +| [src-tauri/src/serial\_core/error.rs](/src-tauri/src/serial_core/error.rs) | Rust | 2 | 0 | 0 | 2 | +| [src-tauri/src/serial\_core/frame.rs](/src-tauri/src/serial_core/frame.rs) | Rust | 1 | 0 | -1 | 0 | +| [src-tauri/src/serial\_core/serial.rs](/src-tauri/src/serial_core/serial.rs) | Rust | 68 | 0 | 14 | 82 | +| [src-tauri/src/serial\_core/utils.rs](/src-tauri/src/serial_core/utils.rs) | Rust | 21 | 0 | 7 | 28 | + +[Summary](results.md) / [Details](details.md) / [Diff Summary](diff.md) / Diff Details \ No newline at end of file diff --git a/.VSCodeCounter/2026-04-02_14-42-07/diff.csv b/.VSCodeCounter/2026-04-02_14-42-07/diff.csv new file mode 100644 index 0000000..df93fd4 --- /dev/null +++ b/.VSCodeCounter/2026-04-02_14-42-07/diff.csv @@ -0,0 +1,8 @@ +"filename", "language", "Rust", "comment", "blank", "total" +"e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\tactile_a.rs", "Rust", 153, 0, 11, 164 +"e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\test.rs", "Rust", 2, 1, -2, 1 +"e:\Workspace\joyson-serial\src-tauri\src\serial_core\error.rs", "Rust", 2, 0, 0, 2 +"e:\Workspace\joyson-serial\src-tauri\src\serial_core\frame.rs", "Rust", 1, 0, -1, 0 +"e:\Workspace\joyson-serial\src-tauri\src\serial_core\serial.rs", "Rust", 68, 0, 14, 82 +"e:\Workspace\joyson-serial\src-tauri\src\serial_core\utils.rs", "Rust", 21, 0, 7, 28 +"Total", "-", 247, 1, 29, 277 \ No newline at end of file diff --git a/.VSCodeCounter/2026-04-02_14-42-07/diff.md b/.VSCodeCounter/2026-04-02_14-42-07/diff.md new file mode 100644 index 0000000..7ddf4f1 --- /dev/null +++ b/.VSCodeCounter/2026-04-02_14-42-07/diff.md @@ -0,0 +1,26 @@ +# Diff Summary + +Date : 2026-04-02 14:42:07 + +Directory e:\\Workspace\\joyson-serial + +Total : 6 files, 247 codes, 1 comments, 29 blanks, all 277 lines + +[Summary](results.md) / [Details](details.md) / Diff Summary / [Diff Details](diff-details.md) + +## Languages +| language | files | code | comment | blank | total | +| :--- | ---: | ---: | ---: | ---: | ---: | +| Rust | 6 | 247 | 1 | 29 | 277 | + +## Directories +| path | files | code | comment | blank | total | +| :--- | ---: | ---: | ---: | ---: | ---: | +| . | 6 | 247 | 1 | 29 | 277 | +| src-tauri | 6 | 247 | 1 | 29 | 277 | +| src-tauri\\src | 6 | 247 | 1 | 29 | 277 | +| src-tauri\\src\\serial_core | 6 | 247 | 1 | 29 | 277 | +| src-tauri\\src\\serial_core (Files) | 4 | 92 | 0 | 20 | 112 | +| src-tauri\\src\\serial_core\\codecs | 2 | 155 | 1 | 9 | 165 | + +[Summary](results.md) / [Details](details.md) / Diff Summary / [Diff Details](diff-details.md) \ No newline at end of file diff --git a/.VSCodeCounter/2026-04-02_14-42-07/diff.txt b/.VSCodeCounter/2026-04-02_14-42-07/diff.txt new file mode 100644 index 0000000..300ede8 --- /dev/null +++ b/.VSCodeCounter/2026-04-02_14-42-07/diff.txt @@ -0,0 +1,35 @@ +Date : 2026-04-02 14:42:07 +Directory : e:\Workspace\joyson-serial +Total : 6 files, 247 codes, 1 comments, 29 blanks, all 277 lines + +Languages ++----------+------------+------------+------------+------------+------------+ +| language | files | code | comment | blank | total | ++----------+------------+------------+------------+------------+------------+ +| Rust | 6 | 247 | 1 | 29 | 277 | ++----------+------------+------------+------------+------------+------------+ + +Directories ++--------------------------------------------------------------------------+------------+------------+------------+------------+------------+ +| path | files | code | comment | blank | total | ++--------------------------------------------------------------------------+------------+------------+------------+------------+------------+ +| . | 6 | 247 | 1 | 29 | 277 | +| src-tauri | 6 | 247 | 1 | 29 | 277 | +| src-tauri\src | 6 | 247 | 1 | 29 | 277 | +| src-tauri\src\serial_core | 6 | 247 | 1 | 29 | 277 | +| src-tauri\src\serial_core (Files) | 4 | 92 | 0 | 20 | 112 | +| src-tauri\src\serial_core\codecs | 2 | 155 | 1 | 9 | 165 | ++--------------------------------------------------------------------------+------------+------------+------------+------------+------------+ + +Files ++--------------------------------------------------------------------------+----------+------------+------------+------------+------------+ +| filename | language | code | comment | blank | total | ++--------------------------------------------------------------------------+----------+------------+------------+------------+------------+ +| e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\tactile_a.rs | Rust | 153 | 0 | 11 | 164 | +| e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\test.rs | Rust | 2 | 1 | -2 | 1 | +| e:\Workspace\joyson-serial\src-tauri\src\serial_core\error.rs | Rust | 2 | 0 | 0 | 2 | +| e:\Workspace\joyson-serial\src-tauri\src\serial_core\frame.rs | Rust | 1 | 0 | -1 | 0 | +| e:\Workspace\joyson-serial\src-tauri\src\serial_core\serial.rs | Rust | 68 | 0 | 14 | 82 | +| e:\Workspace\joyson-serial\src-tauri\src\serial_core\utils.rs | Rust | 21 | 0 | 7 | 28 | +| Total | | 247 | 1 | 29 | 277 | ++--------------------------------------------------------------------------+----------+------------+------------+------------+------------+ \ No newline at end of file diff --git a/.VSCodeCounter/2026-04-02_14-42-07/results.csv b/.VSCodeCounter/2026-04-02_14-42-07/results.csv new file mode 100644 index 0000000..76193d2 --- /dev/null +++ b/.VSCodeCounter/2026-04-02_14-42-07/results.csv @@ -0,0 +1,49 @@ +"filename", "language", "Markdown", "JSON with Comments", "JSON", "XML", "JavaScript", "HTML", "Rust", "TypeScript", "Svelte", "PostCSS", "comment", "blank", "total" +"e:\Workspace\joyson-serial\.idea\modules.xml", "XML", 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8 +"e:\Workspace\joyson-serial\.idea\tauri-demo.iml", "XML", 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 11 +"e:\Workspace\joyson-serial\README.md", "Markdown", 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 54 +"e:\Workspace\joyson-serial\flowus_tools.json", "JSON", 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2 +"e:\Workspace\joyson-serial\frontend_prompt.md", "Markdown", 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 255 +"e:\Workspace\joyson-serial\package-lock.json", "JSON", 0, 0, 1957, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1958 +"e:\Workspace\joyson-serial\package.json", "JSON", 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 32 +"e:\Workspace\joyson-serial\src-tauri\build.rs", "Rust", 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 4 +"e:\Workspace\joyson-serial\src-tauri\capabilities\default.json", "JSON", 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16 +"e:\Workspace\joyson-serial\src-tauri\src\commands\mod.rs", "Rust", 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 3 +"e:\Workspace\joyson-serial\src-tauri\src\commands\serial.rs", "Rust", 0, 0, 0, 0, 0, 0, 246, 0, 0, 0, 0, 44, 290 +"e:\Workspace\joyson-serial\src-tauri\src\commands\window.rs", "Rust", 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 6, 33 +"e:\Workspace\joyson-serial\src-tauri\src\lib.rs", "Rust", 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 2, 24 +"e:\Workspace\joyson-serial\src-tauri\src\log.rs", "Rust", 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 2, 36 +"e:\Workspace\joyson-serial\src-tauri\src\main.rs", "Rust", 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 1, 2, 11 +"e:\Workspace\joyson-serial\src-tauri\src\serial_core\codec.rs", "Rust", 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 1, 7 +"e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\mod.rs", "Rust", 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 1, 5 +"e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\tactile_a.rs", "Rust", 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 28, 248 +"e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\test.rs", "Rust", 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 8, 38, 261 +"e:\Workspace\joyson-serial\src-tauri\src\serial_core\error.rs", "Rust", 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 6, 55 +"e:\Workspace\joyson-serial\src-tauri\src\serial_core\frame.rs", "Rust", 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 3, 8, 58 +"e:\Workspace\joyson-serial\src-tauri\src\serial_core\mod.rs", "Rust", 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 7, 29 +"e:\Workspace\joyson-serial\src-tauri\src\serial_core\model.rs", "Rust", 0, 0, 0, 0, 0, 0, 377, 0, 0, 0, 57, 67, 501 +"e:\Workspace\joyson-serial\src-tauri\src\serial_core\record.rs", "Rust", 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 4, 11, 65 +"e:\Workspace\joyson-serial\src-tauri\src\serial_core\serial.rs", "Rust", 0, 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, 22, 163 +"e:\Workspace\joyson-serial\src-tauri\src\serial_core\utils.rs", "Rust", 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 13, 60 +"e:\Workspace\joyson-serial\src-tauri\tauri.conf.json", "JSON", 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 37 +"e:\Workspace\joyson-serial\src\app.html", "HTML", 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 1, 14 +"e:\Workspace\joyson-serial\src\lib\components\CenterStage.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 691, 0, 0, 96, 787 +"e:\Workspace\joyson-serial\src\lib\components\ConfigPanel.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 398, 0, 0, 63, 461 +"e:\Workspace\joyson-serial\src\lib\components\HudPanel.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 861, 0, 0, 110, 971 +"e:\Workspace\joyson-serial\src\lib\components\PressureMatrixViewer.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 558, 0, 0, 97, 655 +"e:\Workspace\joyson-serial\src\lib\components\SignalChart.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 382, 0, 0, 71, 453 +"e:\Workspace\joyson-serial\src\lib\components\SummaryCurve.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 497, 0, 0, 88, 585 +"e:\Workspace\joyson-serial\src\lib\config\color-map.ts", "TypeScript", 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 3, 58 +"e:\Workspace\joyson-serial\src\lib\styles\theme.css", "PostCSS", 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 1, 7, 51 +"e:\Workspace\joyson-serial\src\lib\types\hud.ts", "TypeScript", 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, 20, 146 +"e:\Workspace\joyson-serial\src\routes\+layout.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 5, 18 +"e:\Workspace\joyson-serial\src\routes\+layout.ts", "TypeScript", 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 1, 6 +"e:\Workspace\joyson-serial\src\routes\+page.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 1286, 0, 0, 176, 1462 +"e:\Workspace\joyson-serial\static\svelte.svg", "XML", 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 +"e:\Workspace\joyson-serial\static\tauri.svg", "XML", 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1, 7 +"e:\Workspace\joyson-serial\static\vite.svg", "XML", 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 +"e:\Workspace\joyson-serial\svelte.config.js", "JavaScript", 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 5, 3, 19 +"e:\Workspace\joyson-serial\tauri-event.md", "Markdown", 374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181, 555 +"e:\Workspace\joyson-serial\tsconfig.json", "JSON with Comments", 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 20 +"e:\Workspace\joyson-serial\vite.config.js", "JavaScript", 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 7, 4, 33 +"Total", "-", 597, 14, 2040, 27, 33, 13, 1520, 182, 4686, 43, 95, 1279, 10529 \ No newline at end of file diff --git a/.VSCodeCounter/2026-04-02_14-42-07/results.json b/.VSCodeCounter/2026-04-02_14-42-07/results.json new file mode 100644 index 0000000..cd62fe3 --- /dev/null +++ b/.VSCodeCounter/2026-04-02_14-42-07/results.json @@ -0,0 +1 @@ +{"file:///e%3A/Workspace/joyson-serial/frontend_prompt.md":{"language":"Markdown","code":189,"comment":0,"blank":66},"file:///e%3A/Workspace/joyson-serial/tsconfig.json":{"language":"JSON with Comments","code":14,"comment":5,"blank":1},"file:///e%3A/Workspace/joyson-serial/flowus_tools.json":{"language":"JSON","code":1,"comment":0,"blank":1},"file:///e%3A/Workspace/joyson-serial/static/vite.svg":{"language":"XML","code":1,"comment":0,"blank":0},"file:///e%3A/Workspace/joyson-serial/tauri-event.md":{"language":"Markdown","code":374,"comment":0,"blank":181},"file:///e%3A/Workspace/joyson-serial/static/svelte.svg":{"language":"XML","code":1,"comment":0,"blank":0},"file:///e%3A/Workspace/joyson-serial/static/tauri.svg":{"language":"XML","code":6,"comment":0,"blank":1},"file:///e%3A/Workspace/joyson-serial/vite.config.js":{"language":"JavaScript","code":22,"comment":7,"blank":4},"file:///e%3A/Workspace/joyson-serial/src-tauri/tauri.conf.json":{"language":"JSON","code":36,"comment":0,"blank":1},"file:///e%3A/Workspace/joyson-serial/package.json":{"language":"JSON","code":31,"comment":0,"blank":1},"file:///e%3A/Workspace/joyson-serial/svelte.config.js":{"language":"JavaScript","code":11,"comment":5,"blank":3},"file:///e%3A/Workspace/joyson-serial/README.md":{"language":"Markdown","code":34,"comment":0,"blank":20},"file:///e%3A/Workspace/joyson-serial/src/app.html":{"language":"HTML","code":13,"comment":0,"blank":1},"file:///e%3A/Workspace/joyson-serial/.idea/tauri-demo.iml":{"language":"XML","code":11,"comment":0,"blank":0},"file:///e%3A/Workspace/joyson-serial/.idea/modules.xml":{"language":"XML","code":8,"comment":0,"blank":0},"file:///e%3A/Workspace/joyson-serial/src-tauri/build.rs":{"language":"Rust","code":3,"comment":0,"blank":1},"file:///e%3A/Workspace/joyson-serial/src/routes/%2Blayout.ts":{"language":"TypeScript","code":1,"comment":4,"blank":1},"file:///e%3A/Workspace/joyson-serial/src/lib/types/hud.ts":{"language":"TypeScript","code":126,"comment":0,"blank":20},"file:///e%3A/Workspace/joyson-serial/package-lock.json":{"language":"JSON","code":1957,"comment":0,"blank":1},"file:///e%3A/Workspace/joyson-serial/src-tauri/capabilities/default.json":{"language":"JSON","code":15,"comment":0,"blank":1},"file:///e%3A/Workspace/joyson-serial/src/routes/%2Blayout.svelte":{"language":"Svelte","code":13,"comment":0,"blank":5},"file:///e%3A/Workspace/joyson-serial/src/lib/config/color-map.ts":{"language":"TypeScript","code":55,"comment":0,"blank":3},"file:///e%3A/Workspace/joyson-serial/src/lib/components/SignalChart.svelte":{"language":"Svelte","code":382,"comment":0,"blank":71},"file:///e%3A/Workspace/joyson-serial/src/lib/styles/theme.css":{"language":"PostCSS","code":43,"comment":1,"blank":7},"file:///e%3A/Workspace/joyson-serial/src/lib/components/PressureMatrixViewer.svelte":{"language":"Svelte","code":558,"comment":0,"blank":97},"file:///e%3A/Workspace/joyson-serial/src/routes/%2Bpage.svelte":{"language":"Svelte","code":1286,"comment":0,"blank":176},"file:///e%3A/Workspace/joyson-serial/src-tauri/src/serial_core/utils.rs":{"language":"Rust","code":47,"comment":0,"blank":13},"file:///e%3A/Workspace/joyson-serial/src-tauri/src/serial_core/serial.rs":{"language":"Rust","code":141,"comment":0,"blank":22},"file:///e%3A/Workspace/joyson-serial/src/lib/components/SummaryCurve.svelte":{"language":"Svelte","code":497,"comment":0,"blank":88},"file:///e%3A/Workspace/joyson-serial/src-tauri/src/serial_core/record.rs":{"language":"Rust","code":50,"comment":4,"blank":11},"file:///e%3A/Workspace/joyson-serial/src-tauri/src/serial_core/mod.rs":{"language":"Rust","code":22,"comment":0,"blank":7},"file:///e%3A/Workspace/joyson-serial/src-tauri/src/serial_core/model.rs":{"language":"Rust","code":377,"comment":57,"blank":67},"file:///e%3A/Workspace/joyson-serial/src-tauri/src/serial_core/frame.rs":{"language":"Rust","code":47,"comment":3,"blank":8},"file:///e%3A/Workspace/joyson-serial/src-tauri/src/serial_core/error.rs":{"language":"Rust","code":49,"comment":0,"blank":6},"file:///e%3A/Workspace/joyson-serial/src-tauri/src/serial_core/codecs/tactile_a.rs":{"language":"Rust","code":220,"comment":0,"blank":28},"file:///e%3A/Workspace/joyson-serial/src-tauri/src/serial_core/codecs/test.rs":{"language":"Rust","code":215,"comment":8,"blank":38},"file:///e%3A/Workspace/joyson-serial/src-tauri/src/serial_core/codecs/mod.rs":{"language":"Rust","code":4,"comment":0,"blank":1},"file:///e%3A/Workspace/joyson-serial/src-tauri/src/serial_core/codec.rs":{"language":"Rust","code":6,"comment":0,"blank":1},"file:///e%3A/Workspace/joyson-serial/src-tauri/src/main.rs":{"language":"Rust","code":8,"comment":1,"blank":2},"file:///e%3A/Workspace/joyson-serial/src-tauri/src/log.rs":{"language":"Rust","code":34,"comment":0,"blank":2},"file:///e%3A/Workspace/joyson-serial/src-tauri/src/commands/window.rs":{"language":"Rust","code":27,"comment":0,"blank":6},"file:///e%3A/Workspace/joyson-serial/src-tauri/src/commands/serial.rs":{"language":"Rust","code":246,"comment":0,"blank":44},"file:///e%3A/Workspace/joyson-serial/src-tauri/src/commands/mod.rs":{"language":"Rust","code":2,"comment":0,"blank":1},"file:///e%3A/Workspace/joyson-serial/src-tauri/src/lib.rs":{"language":"Rust","code":22,"comment":0,"blank":2},"file:///e%3A/Workspace/joyson-serial/src/lib/components/CenterStage.svelte":{"language":"Svelte","code":691,"comment":0,"blank":96},"file:///e%3A/Workspace/joyson-serial/src/lib/components/HudPanel.svelte":{"language":"Svelte","code":861,"comment":0,"blank":110},"file:///e%3A/Workspace/joyson-serial/src/lib/components/ConfigPanel.svelte":{"language":"Svelte","code":398,"comment":0,"blank":63}} \ No newline at end of file diff --git a/.VSCodeCounter/2026-04-02_14-42-07/results.md b/.VSCodeCounter/2026-04-02_14-42-07/results.md new file mode 100644 index 0000000..d4f72c7 --- /dev/null +++ b/.VSCodeCounter/2026-04-02_14-42-07/results.md @@ -0,0 +1,50 @@ +# Summary + +Date : 2026-04-02 14:42:07 + +Directory e:\\Workspace\\joyson-serial + +Total : 47 files, 9155 codes, 95 comments, 1279 blanks, all 10529 lines + +Summary / [Details](details.md) / [Diff Summary](diff.md) / [Diff Details](diff-details.md) + +## Languages +| language | files | code | comment | blank | total | +| :--- | ---: | ---: | ---: | ---: | ---: | +| Svelte | 8 | 4,686 | 0 | 706 | 5,392 | +| JSON | 5 | 2,040 | 0 | 5 | 2,045 | +| Rust | 18 | 1,520 | 73 | 260 | 1,853 | +| Markdown | 3 | 597 | 0 | 267 | 864 | +| TypeScript | 3 | 182 | 4 | 24 | 210 | +| PostCSS | 1 | 43 | 1 | 7 | 51 | +| JavaScript | 2 | 33 | 12 | 7 | 52 | +| XML | 5 | 27 | 0 | 1 | 28 | +| JSON with Comments | 1 | 14 | 5 | 1 | 20 | +| HTML | 1 | 13 | 0 | 1 | 14 | + +## Directories +| path | files | code | comment | blank | total | +| :--- | ---: | ---: | ---: | ---: | ---: | +| . | 47 | 9,155 | 95 | 1,279 | 10,529 | +| . (Files) | 9 | 2,633 | 17 | 278 | 2,928 | +| .idea | 2 | 19 | 0 | 0 | 19 | +| src | 13 | 4,924 | 5 | 738 | 5,667 | +| src (Files) | 1 | 13 | 0 | 1 | 14 | +| src-tauri | 20 | 1,571 | 73 | 262 | 1,906 | +| src-tauri (Files) | 2 | 39 | 0 | 2 | 41 | +| src-tauri\\capabilities | 1 | 15 | 0 | 1 | 16 | +| src-tauri\\src | 17 | 1,517 | 73 | 259 | 1,849 | +| src-tauri\\src (Files) | 3 | 64 | 1 | 6 | 71 | +| src-tauri\\src\\commands | 3 | 275 | 0 | 51 | 326 | +| src-tauri\\src\\serial_core | 11 | 1,178 | 72 | 202 | 1,452 | +| src-tauri\\src\\serial_core (Files) | 8 | 739 | 64 | 135 | 938 | +| src-tauri\\src\\serial_core\\codecs | 3 | 439 | 8 | 67 | 514 | +| src\\lib | 9 | 3,611 | 1 | 555 | 4,167 | +| src\\lib\\components | 6 | 3,387 | 0 | 525 | 3,912 | +| src\\lib\\config | 1 | 55 | 0 | 3 | 58 | +| src\\lib\\styles | 1 | 43 | 1 | 7 | 51 | +| src\\lib\\types | 1 | 126 | 0 | 20 | 146 | +| src\\routes | 3 | 1,300 | 4 | 182 | 1,486 | +| static | 3 | 8 | 0 | 1 | 9 | + +Summary / [Details](details.md) / [Diff Summary](diff.md) / [Diff Details](diff-details.md) \ No newline at end of file diff --git a/.VSCodeCounter/2026-04-02_14-42-07/results.txt b/.VSCodeCounter/2026-04-02_14-42-07/results.txt new file mode 100644 index 0000000..f3a8553 --- /dev/null +++ b/.VSCodeCounter/2026-04-02_14-42-07/results.txt @@ -0,0 +1,100 @@ +Date : 2026-04-02 14:42:07 +Directory : e:\Workspace\joyson-serial +Total : 47 files, 9155 codes, 95 comments, 1279 blanks, all 10529 lines + +Languages ++--------------------+------------+------------+------------+------------+------------+ +| language | files | code | comment | blank | total | ++--------------------+------------+------------+------------+------------+------------+ +| Svelte | 8 | 4,686 | 0 | 706 | 5,392 | +| JSON | 5 | 2,040 | 0 | 5 | 2,045 | +| Rust | 18 | 1,520 | 73 | 260 | 1,853 | +| Markdown | 3 | 597 | 0 | 267 | 864 | +| TypeScript | 3 | 182 | 4 | 24 | 210 | +| PostCSS | 1 | 43 | 1 | 7 | 51 | +| JavaScript | 2 | 33 | 12 | 7 | 52 | +| XML | 5 | 27 | 0 | 1 | 28 | +| JSON with Comments | 1 | 14 | 5 | 1 | 20 | +| HTML | 1 | 13 | 0 | 1 | 14 | ++--------------------+------------+------------+------------+------------+------------+ + +Directories ++---------------------------------------------------------------------------+------------+------------+------------+------------+------------+ +| path | files | code | comment | blank | total | ++---------------------------------------------------------------------------+------------+------------+------------+------------+------------+ +| . | 47 | 9,155 | 95 | 1,279 | 10,529 | +| . (Files) | 9 | 2,633 | 17 | 278 | 2,928 | +| .idea | 2 | 19 | 0 | 0 | 19 | +| src | 13 | 4,924 | 5 | 738 | 5,667 | +| src (Files) | 1 | 13 | 0 | 1 | 14 | +| src-tauri | 20 | 1,571 | 73 | 262 | 1,906 | +| src-tauri (Files) | 2 | 39 | 0 | 2 | 41 | +| src-tauri\capabilities | 1 | 15 | 0 | 1 | 16 | +| src-tauri\src | 17 | 1,517 | 73 | 259 | 1,849 | +| src-tauri\src (Files) | 3 | 64 | 1 | 6 | 71 | +| src-tauri\src\commands | 3 | 275 | 0 | 51 | 326 | +| src-tauri\src\serial_core | 11 | 1,178 | 72 | 202 | 1,452 | +| src-tauri\src\serial_core (Files) | 8 | 739 | 64 | 135 | 938 | +| src-tauri\src\serial_core\codecs | 3 | 439 | 8 | 67 | 514 | +| src\lib | 9 | 3,611 | 1 | 555 | 4,167 | +| src\lib\components | 6 | 3,387 | 0 | 525 | 3,912 | +| src\lib\config | 1 | 55 | 0 | 3 | 58 | +| src\lib\styles | 1 | 43 | 1 | 7 | 51 | +| src\lib\types | 1 | 126 | 0 | 20 | 146 | +| src\routes | 3 | 1,300 | 4 | 182 | 1,486 | +| static | 3 | 8 | 0 | 1 | 9 | ++---------------------------------------------------------------------------+------------+------------+------------+------------+------------+ + +Files ++---------------------------------------------------------------------------+--------------------+------------+------------+------------+------------+ +| filename | language | code | comment | blank | total | ++---------------------------------------------------------------------------+--------------------+------------+------------+------------+------------+ +| e:\Workspace\joyson-serial\.idea\modules.xml | XML | 8 | 0 | 0 | 8 | +| e:\Workspace\joyson-serial\.idea\tauri-demo.iml | XML | 11 | 0 | 0 | 11 | +| e:\Workspace\joyson-serial\README.md | Markdown | 34 | 0 | 20 | 54 | +| e:\Workspace\joyson-serial\flowus_tools.json | JSON | 1 | 0 | 1 | 2 | +| e:\Workspace\joyson-serial\frontend_prompt.md | Markdown | 189 | 0 | 66 | 255 | +| e:\Workspace\joyson-serial\package-lock.json | JSON | 1,957 | 0 | 1 | 1,958 | +| e:\Workspace\joyson-serial\package.json | JSON | 31 | 0 | 1 | 32 | +| e:\Workspace\joyson-serial\src-tauri\build.rs | Rust | 3 | 0 | 1 | 4 | +| e:\Workspace\joyson-serial\src-tauri\capabilities\default.json | JSON | 15 | 0 | 1 | 16 | +| e:\Workspace\joyson-serial\src-tauri\src\commands\mod.rs | Rust | 2 | 0 | 1 | 3 | +| e:\Workspace\joyson-serial\src-tauri\src\commands\serial.rs | Rust | 246 | 0 | 44 | 290 | +| e:\Workspace\joyson-serial\src-tauri\src\commands\window.rs | Rust | 27 | 0 | 6 | 33 | +| e:\Workspace\joyson-serial\src-tauri\src\lib.rs | Rust | 22 | 0 | 2 | 24 | +| e:\Workspace\joyson-serial\src-tauri\src\log.rs | Rust | 34 | 0 | 2 | 36 | +| e:\Workspace\joyson-serial\src-tauri\src\main.rs | Rust | 8 | 1 | 2 | 11 | +| e:\Workspace\joyson-serial\src-tauri\src\serial_core\codec.rs | Rust | 6 | 0 | 1 | 7 | +| e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\mod.rs | Rust | 4 | 0 | 1 | 5 | +| e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\tactile_a.rs | Rust | 220 | 0 | 28 | 248 | +| e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\test.rs | Rust | 215 | 8 | 38 | 261 | +| e:\Workspace\joyson-serial\src-tauri\src\serial_core\error.rs | Rust | 49 | 0 | 6 | 55 | +| e:\Workspace\joyson-serial\src-tauri\src\serial_core\frame.rs | Rust | 47 | 3 | 8 | 58 | +| e:\Workspace\joyson-serial\src-tauri\src\serial_core\mod.rs | Rust | 22 | 0 | 7 | 29 | +| e:\Workspace\joyson-serial\src-tauri\src\serial_core\model.rs | Rust | 377 | 57 | 67 | 501 | +| e:\Workspace\joyson-serial\src-tauri\src\serial_core\record.rs | Rust | 50 | 4 | 11 | 65 | +| e:\Workspace\joyson-serial\src-tauri\src\serial_core\serial.rs | Rust | 141 | 0 | 22 | 163 | +| e:\Workspace\joyson-serial\src-tauri\src\serial_core\utils.rs | Rust | 47 | 0 | 13 | 60 | +| e:\Workspace\joyson-serial\src-tauri\tauri.conf.json | JSON | 36 | 0 | 1 | 37 | +| e:\Workspace\joyson-serial\src\app.html | HTML | 13 | 0 | 1 | 14 | +| e:\Workspace\joyson-serial\src\lib\components\CenterStage.svelte | Svelte | 691 | 0 | 96 | 787 | +| e:\Workspace\joyson-serial\src\lib\components\ConfigPanel.svelte | Svelte | 398 | 0 | 63 | 461 | +| e:\Workspace\joyson-serial\src\lib\components\HudPanel.svelte | Svelte | 861 | 0 | 110 | 971 | +| e:\Workspace\joyson-serial\src\lib\components\PressureMatrixViewer.svelte | Svelte | 558 | 0 | 97 | 655 | +| e:\Workspace\joyson-serial\src\lib\components\SignalChart.svelte | Svelte | 382 | 0 | 71 | 453 | +| e:\Workspace\joyson-serial\src\lib\components\SummaryCurve.svelte | Svelte | 497 | 0 | 88 | 585 | +| e:\Workspace\joyson-serial\src\lib\config\color-map.ts | TypeScript | 55 | 0 | 3 | 58 | +| e:\Workspace\joyson-serial\src\lib\styles\theme.css | PostCSS | 43 | 1 | 7 | 51 | +| e:\Workspace\joyson-serial\src\lib\types\hud.ts | TypeScript | 126 | 0 | 20 | 146 | +| e:\Workspace\joyson-serial\src\routes\+layout.svelte | Svelte | 13 | 0 | 5 | 18 | +| e:\Workspace\joyson-serial\src\routes\+layout.ts | TypeScript | 1 | 4 | 1 | 6 | +| e:\Workspace\joyson-serial\src\routes\+page.svelte | Svelte | 1,286 | 0 | 176 | 1,462 | +| e:\Workspace\joyson-serial\static\svelte.svg | XML | 1 | 0 | 0 | 1 | +| e:\Workspace\joyson-serial\static\tauri.svg | XML | 6 | 0 | 1 | 7 | +| e:\Workspace\joyson-serial\static\vite.svg | XML | 1 | 0 | 0 | 1 | +| e:\Workspace\joyson-serial\svelte.config.js | JavaScript | 11 | 5 | 3 | 19 | +| e:\Workspace\joyson-serial\tauri-event.md | Markdown | 374 | 0 | 181 | 555 | +| e:\Workspace\joyson-serial\tsconfig.json | JSON with Comments | 14 | 5 | 1 | 20 | +| e:\Workspace\joyson-serial\vite.config.js | JavaScript | 22 | 7 | 4 | 33 | +| Total | | 9,155 | 95 | 1,279 | 10,529 | ++---------------------------------------------------------------------------+--------------------+------------+------------+------------+------------+ \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b68bf59..3b1aaa3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "tauri-demo", + "name": "joyson-serial", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "tauri-demo", + "name": "joyson-serial", "version": "0.1.0", "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index ad83466..5c8e37c 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "tauri-demo", + "name": "joyson-serial", "version": "0.1.0", "description": "", "type": "module", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index ad33af4..48cc34b 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1941,6 +1941,28 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +[[package]] +name = "joyson-serial" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "chrono", + "crc", + "csv", + "fern", + "humantime", + "log", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-opener", + "tokio", + "tokio-serial", + "tokio-util", +] + [[package]] name = "js-sys" version = "0.3.91" @@ -3862,28 +3884,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "tauri-demo" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-trait", - "chrono", - "crc", - "csv", - "fern", - "humantime", - "log", - "serde", - "serde_json", - "tauri", - "tauri-build", - "tauri-plugin-opener", - "tokio", - "tokio-serial", - "tokio-util", -] - [[package]] name = "tauri-macros" version = "2.5.5" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index a6b0f0d..94ccf1b 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "tauri-demo" +name = "joyson-serial" version = "0.1.0" description = "A Tauri App" authors = ["you"] diff --git a/src-tauri/program.log2026-04-01 b/src-tauri/program.log2026-04-02 similarity index 100% rename from src-tauri/program.log2026-04-01 rename to src-tauri/program.log2026-04-02 diff --git a/src-tauri/src/commands/serial.rs b/src-tauri/src/commands/serial.rs index 2e643a1..d3d3855 100644 --- a/src-tauri/src/commands/serial.rs +++ b/src-tauri/src/commands/serial.rs @@ -1,6 +1,7 @@ use crate::serial_core::codecs::test::{export_recording_csv, TestCodec, TestCsvImporter, TestHandler}; use crate::serial_core::error::SerialError; use crate::serial_core::record::CsvImporter; +use crate::serial_core::serial::PollMode; use crate::serial_core::{TestRecording, serial}; use log::info; use serde::Serialize; diff --git a/src-tauri/src/serial_core/codecs/tactile_a.rs b/src-tauri/src/serial_core/codecs/tactile_a.rs index 8eed943..2a1a8d9 100644 --- a/src-tauri/src/serial_core/codecs/tactile_a.rs +++ b/src-tauri/src/serial_core/codecs/tactile_a.rs @@ -1,9 +1,16 @@ -use std::time::Instant; use crate::serial_core::error::CodecError; -use crate::serial_core::frame::{FrameHandler, TactileAFrameMetaData, TactileARepFrame, TestFrame}; -use crate::serial_core::utils::elapsed_millis; -use crate::serial_core::{codec::Codec, codecs::test::TestCodec, frame::{TactileAFrame, TactileAFrameStatusCode}}; - +use crate::serial_core::frame::{ + FrameHandler, TactileAFrameMetaData, TactileARepFrame, TactileAReqFrame, TestFrame, +}; +use crate::serial_core::record::Recording; +use crate::serial_core::record::{self, CsvExporter}; +use crate::serial_core::utils::{calc_crc8_itu, elapsed_millis, usize_to_u16_le_bytes}; +use crate::serial_core::{ + codec::Codec, + frame::{TactileAFrame, TactileAFrameStatusCode}, +}; +use async_trait::async_trait; +use std::time::Instant; const FRAME_BUFFER_MIN_LENGTH: usize = 15; pub struct TactileACodec { @@ -11,10 +18,14 @@ pub struct TactileACodec { frame_nb: u64, } -pub struct TactileACsvExporter; +pub struct TactileACsvExporter { + channels: usize, +} pub struct TactileACsvImporter { - + channels: usize, + data_row: usize, + packets: Vec, } pub struct TactileAHandler; @@ -29,32 +40,74 @@ impl From for TactileAFrameStatusCode { fn from(value: u8) -> Self { match value { 0 => TactileAFrameStatusCode::Success, - _ => TactileAFrameStatusCode::Failure + _ => TactileAFrameStatusCode::Failure, } } } +impl TryFrom<&TactileARepFrame> for TactileADataPacket { + type Error = CodecError; + fn try_from(value: &TactileARepFrame) -> Result { + let data = TactileACodec::parse_data_frame(&value.payload)?; + let dts_ms = value.dts_ms; + Ok(TactileADataPacket { + data: data, + dts_ms: dts_ms, + }) + } +} + impl TactileACodec { - pub fn new() -> TactileACodec { + pub fn new(cols: usize, rows: usize) -> TactileACodec { Self { buffer: Vec::new(), - frame_nb: 0 + frame_nb: 0, } } - pub fn parse_data_frame(data: &[u8]) -> Result> { - if data.len() % 2 == 0 { + pub fn parse_data_frame(data: &[u8]) -> Result, CodecError> { + if data.len() % 2 != 0 { return Err(CodecError::InvalidLength); } let vals: Vec = data - .chunks_exact(2) - .map(|chunk| u16::from_be_bytes(bytes)) - } + .chunks_exact(2) + .map(|chunk| u16::from_le_bytes([chunk[0], chunk[1]]) as i32) + .collect::>(); + + Ok(vals) + } + + pub fn build_req_frame(cols: usize, rows: usize) -> anyhow::Result { + let header = [0x55, 0xAA]; + let payload_len: usize = 9; + let device_addr: u8 = 0x34; + let extend_code: u8 = 0x00; + let func_code: u8 = 0xFB; + let start_addr: u32 = 7168; + let except_data_len: usize = cols * rows * 2; + let checksum: u8 = 0; + Ok(TactileAFrame::Req(TactileAReqFrame { + meta: TactileAFrameMetaData { + header, + payload_len, + device_addr, + extend_code, + func_code, + start_addr, + except_data_len, + checksum, + }, + })) + } } impl Codec for TactileACodec { - fn decode(&mut self, input: &[u8], session_started_at: std::time::Instant) -> Result, CodecError> { + fn decode( + &mut self, + input: &[u8], + session_started_at: std::time::Instant, + ) -> Result, CodecError> { self.buffer.extend_from_slice(input); let mut frames: Vec = Vec::new(); @@ -63,9 +116,7 @@ impl Codec for TactileACodec { break; } - let header_pos = self.buffer - .windows(2) - .position(|w| w == [0xAA, 0x55]); + let header_pos = self.buffer.windows(2).position(|w| w == [0xAA, 0x55]); let Some(pos) = header_pos else { self.buffer.clear(); @@ -84,10 +135,15 @@ impl Codec for TactileACodec { let device_addr = self.buffer[4]; let extend_code = self.buffer[5]; let func_code = self.buffer[6]; - let start_addr = u32::from_le_bytes([self.buffer[7],self.buffer[8],self.buffer[9],self.buffer[10]]); - let except_data_len = u16::from_le_bytes([self.buffer[11], self.buffer[12]]) as usize; + let start_addr = u32::from_le_bytes([ + self.buffer[7], + self.buffer[8], + self.buffer[9], + self.buffer[10], + ]); + let except_data_len = u16::from_le_bytes([self.buffer[11], self.buffer[12]]) as usize; let status = TactileAFrameStatusCode::from(self.buffer[13]); - let payload = self.buffer[14..14+except_data_len].to_vec(); + let payload = self.buffer[14..14 + except_data_len].to_vec(); let crc8_itu_alg = crc::Crc::::new(&crc::CRC_8_I_432_1); let checksum = crc8_itu_alg.checksum(&payload.as_slice()); let frame_length = except_data_len + FRAME_BUFFER_MIN_LENGTH; @@ -111,7 +167,7 @@ impl Codec for TactileACodec { meta, status, payload, - dts_ms + dts_ms, } })); @@ -119,11 +175,29 @@ impl Codec for TactileACodec { } Ok(frames) - } - fn encode(&self, frame: &TactileAFrame) -> Result, crate::serial_core::error::CodecError> { - todo!() + fn encode( + &self, + frame: &TactileAFrame, + ) -> Result, crate::serial_core::error::CodecError> { + match frame { + TactileAFrame::Req(f) => { + let mut req_bytes: Vec = Vec::new(); + req_bytes.extend_from_slice(f.meta.header.as_slice()); + req_bytes.extend_from_slice(usize_to_u16_le_bytes(f.meta.payload_len).as_slice()); + req_bytes.push(f.meta.device_addr); + req_bytes.push(f.meta.extend_code); + req_bytes.push(f.meta.func_code); + req_bytes.extend_from_slice(f.meta.start_addr.to_le_bytes().as_slice()); + let checksum = calc_crc8_itu(req_bytes.as_slice()); + req_bytes.push(checksum); + Ok(req_bytes) + } + _ => { + Err(CodecError::InvalidFrameType) + } + } } } @@ -131,12 +205,43 @@ impl Codec for TactileACodec { impl FrameHandler for TactileAHandler { async fn on_frame(&mut self, frame: &TactileAFrame) -> anyhow::Result>> { match frame { - TactileARepFrame => { - - } - _ => { - + TactileAFrame::Rep(rep) => { + let vals = TactileACodec::parse_data_frame(&rep.payload)?; + Ok(Some(vals)) } + _ => Ok(None), } } -} \ No newline at end of file +} + +impl TactileACsvExporter { + fn new(channels: usize) -> Self { + TactileACsvExporter { channels } + } +} + +impl CsvExporter for TactileACsvExporter { + type Error = CodecError; + fn csv_header(&self, recording: &Recording) -> Vec { + let mut header: Vec = Vec::new(); + for i in 0..self.channels { + header.push(format!("channel{}", i + 1)); + } + + header.push("dts".to_string()); + header + } + + fn csv_row( + &self, + item: &record::RecordedFrame, + ) -> anyhow::Result> { + let packet = TactileADataPacket::try_from(&item.frame)?; + let mut row: Vec = packet.data.iter().map(|x| x.to_string()).collect(); + row.push(packet.dts_ms.to_string()); + Ok(row) + } +} + +#[cfg(test)] +mod tests {} diff --git a/src-tauri/src/serial_core/codecs/test.rs b/src-tauri/src/serial_core/codecs/test.rs index 1dba7e6..07f53c9 100644 --- a/src-tauri/src/serial_core/codecs/test.rs +++ b/src-tauri/src/serial_core/codecs/test.rs @@ -1,7 +1,6 @@ use std::io::Read; use std::time::Instant; use crate::serial_core::frame::{FrameHandler}; -use crate::serial_core::utils::*; use crate::serial_core::{codec::Codec, error::CodecError, frame::TestFrame}; use anyhow::anyhow; use async_trait::async_trait; @@ -9,7 +8,10 @@ use chrono::Local; use csv::StringRecord; use crate::serial_core::record::{write_csv, CsvExporter, CsvImporter, RecordedFrame, Recording}; use crc::{Crc, CRC_8_SMBUS}; -use crate::serial_core::utils::*; +use crate::serial_core::utils::{ + elapsed_millis, + usize_to_u16_be_bytes +}; pub struct TestCodec { buffer: Vec, } diff --git a/src-tauri/src/serial_core/error.rs b/src-tauri/src/serial_core/error.rs index a7f38df..fae6738 100644 --- a/src-tauri/src/serial_core/error.rs +++ b/src-tauri/src/serial_core/error.rs @@ -35,6 +35,7 @@ pub enum CodecError { InvalidHeader, InvalidTail, InvalidLength, + InvalidFrameType, PayloadTooLarge, } @@ -44,6 +45,7 @@ impl fmt::Display for CodecError { CodecError::InvalidHeader => write!(f, "Invalid Header"), CodecError::InvalidTail => write!(f, "Invalid Tail"), CodecError::InvalidLength => write!(f, "Invalid Length"), + CodecError::InvalidFrameType => write!(f, "Invalid Frame Type"), CodecError::PayloadTooLarge => write!(f, "Payload too large"), } } diff --git a/src-tauri/src/serial_core/serial.rs b/src-tauri/src/serial_core/serial.rs index 7b38e31..0322964 100644 --- a/src-tauri/src/serial_core/serial.rs +++ b/src-tauri/src/serial_core/serial.rs @@ -1,32 +1,197 @@ use crate::serial_core::codec::Codec; -use crate::serial_core::frame::{FrameHandler, TestFrame}; -use crate::serial_core::model::HudChartState; +use crate::serial_core::codecs::tactile_a::TactileACodec; +use crate::serial_core::frame::{FrameHandler, TactileAFrame, TestFrame}; +use crate::serial_core::model::{HudChartState, HudPacket}; +use crate::serial_core::record::Recording; use anyhow::Result; use tauri::{AppHandle, Emitter}; -use tokio::io::AsyncReadExt; +use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::time::{self, Duration, MissedTickBehavior}; use tokio_serial::SerialStream; use tokio_util::sync::CancellationToken; +use std::future::pending; use std::sync::{Arc, Mutex}; use std::time::Instant; use log::info; use crate::serial_core::record::{FrameTiming, RecordedFrame}; -use crate::serial_core::TestRecording; -pub async fn run_serial( +pub enum PollMode { + Disable, + Enabled(Box>) +} + +pub trait SerialFrame: Clone + Send + 'static { + fn dts_ms(&self) -> u64; + + fn to_hud_packet( + &self, + chart_state: &mut HudChartState, + display_values: Option<&[i32]>, + ) -> Option; +} + +impl SerialFrame for TestFrame { + fn dts_ms(&self) -> u64 { + self.dts_ms + } + + fn to_hud_packet( + &self, + chart_state: &mut HudChartState, + display_values: Option<&[i32]>, + ) -> Option { + Some(chart_state.apply_frame(self, display_values)) + } +} + +impl SerialFrame for TactileAFrame { + fn dts_ms(&self) -> u64 { + match self { + TactileAFrame::Req(_) => 0, + TactileAFrame::Rep(rep) => rep.dts_ms, + } + } + + fn to_hud_packet( + &self, + _chart_state: &mut HudChartState, + _display_values: Option<&[i32]>, + ) -> Option { + None + } +} + +pub trait PollRequester: Send { + fn poll_interval(&self) -> Option { + None + } + + fn should_request(&mut self) -> bool { + true + } + + fn next_request(&mut self) -> Result> { + Ok(None) + } + + fn on_rx_frame(&mut self, _frame: &F) {} +} + +#[derive(Default)] +pub struct NoopPollRequester; + +impl PollRequester for NoopPollRequester {} + +pub struct TactileAPollRequester { + period: Duration, + cols: usize, + rows: usize, + awaiting_reply: bool, + last_request_at: Option, + reply_timeout: Duration, +} + +impl TactileAPollRequester { + pub fn new(period: Duration, cols: usize, rows: usize, reply_timeout: Duration) -> Self { + Self { + period, + cols, + rows, + awaiting_reply: false, + last_request_at: None, + reply_timeout, + } + } +} + +impl PollRequester for TactileAPollRequester { + fn poll_interval(&self) -> Option { + Some(self.period) + } + + fn should_request(&mut self) -> bool { + if !self.awaiting_reply { + return true; + } + let timed_out = self + .last_request_at + .map(|t| t.elapsed() >= self.reply_timeout) + .unwrap_or(false); + + if timed_out { + self.awaiting_reply = false; + self.last_request_at = None; + return true; + } + + false + } + + fn next_request(&mut self) -> Result> { + let req = TactileACodec::build_req_frame(self.cols, self.rows)?; + self.awaiting_reply = true; + self.last_request_at = Some(Instant::now()); + Ok(Some(req)) + } + + fn on_rx_frame(&mut self, frame: &TactileAFrame) { + if matches!(frame, TactileAFrame::Rep(_)) { + self.awaiting_reply = false; + self.last_request_at = None + } + } +} + +pub async fn run_serial( app: AppHandle, mut port: SerialStream, mut codec: C, mut handler: H, session_started_at: Instant, - recording: Arc>, + recording: Arc>>, cancel: CancellationToken, ) -> Result<()> where - C: Codec + Send + 'static, - H: FrameHandler + Send + 'static, + F: SerialFrame, + C: Codec + Send + 'static, + H: FrameHandler + Send + 'static, + T: Into +{ + run_serial_with_poll( + app, port, codec, handler, session_started_at, recording, cancel, PollMode::Disable + ).await +} + +pub async fn run_serial_with_poll( + app: AppHandle, + mut port: SerialStream, + mut codec: C, + mut handler: H, + session_started_at: Instant, + recording: Arc>>, + cancel: CancellationToken, + poll_mode: PollMode +) -> Result<()> +where + F: SerialFrame, + C: Codec + Send + 'static, + H: FrameHandler + Send + 'static, T: Into, { + let mut requester = match poll_mode { + PollMode::Disable => None, + PollMode::Enabled(r) => Some(r), + }; + + let mut poll_interval = requester + .as_ref() + .and_then(|r| r.poll_interval()) + .map(|d| { + let mut it = time::interval(d); + it.set_missed_tick_behavior(MissedTickBehavior::Skip); + it + }); + let mut chart_state = HudChartState::new(); let mut buffer = [0u8; 1024]; let mut prune_interval = time::interval(Duration::from_millis(450)); @@ -35,6 +200,23 @@ where loop { tokio::select! { _ = cancel.cancelled() => break, + _ = async { + match poll_interval.as_mut() { + Some(it) => { + it.tick().await; + } + None => pending::<()>().await, + } + } => { + if let Some(r) = requester.as_mut() { + if r.should_request() { + if let Some(req) = r.next_request()? { + let bytes = codec.encode(&req)?; + port.write_all(&bytes).await?; + } + } + } + } _ = prune_interval.tick() => { if let Some(packet) = chart_state.prune_stale() { app.emit("hud_stream", packet)?; @@ -48,6 +230,10 @@ where let frames = codec.decode(&buffer[..n], session_started_at)?; for frame in frames { + if let Some(r) = requester.as_mut() { + r.on_rx_frame(&frame); + } + let decode_res = handler .on_frame(&frame) .await? @@ -55,7 +241,7 @@ where let mut record = recording.lock().map_err(|_| anyhow::anyhow!("recording state poisoned"))?; record.push(RecordedFrame{ - timing: FrameTiming { pts_ms: None, dts_ms: frame.dts_ms }, + timing: FrameTiming { pts_ms: None, dts_ms: frame.dts_ms() }, frame: frame.clone(), }); @@ -69,12 +255,12 @@ where None }; - let packet = chart_state.apply_frame(&frame, display_values.as_deref()); - app.emit("hud_stream", packet)?; + if let Some(packet) = frame.to_hud_packet(&mut chart_state, display_values.as_deref()) { + app.emit("hud_stream", packet)?; + } } } } } - Ok(()) } diff --git a/src-tauri/src/serial_core/utils.rs b/src-tauri/src/serial_core/utils.rs index 6397bf5..20407dd 100644 --- a/src-tauri/src/serial_core/utils.rs +++ b/src-tauri/src/serial_core/utils.rs @@ -1,3 +1,5 @@ +use anyhow::Ok; +use crc::{Crc, CRC_8_I_432_1, CRC_8_SMBUS}; use std::time::Instant; pub fn usize_to_u16_be_bytes(n: usize) -> [u8; 2] { @@ -16,23 +18,43 @@ pub fn u16_to_hex_le_bytes(n: u16) -> [u8; 2] { (n as u16).to_le_bytes() } -pub fn crc8(data: &[u8]) -> u8 { - let mut crc: u8 = 0x00; +pub fn calc_crc8_smbus(c: &[u8]) -> u8 { + let crc8_smbus = crc::Crc::::new(&crc::CRC_8_SMBUS); + let checksum = crc8_smbus.checksum(c); + return checksum; +} - for &byte in data { - crc ^= byte; - for _ in 0..8 { - if (crc & 0x80) != 0 { - crc = (crc << 1) ^ 0x07; - } else { - crc <<= 1; - } - } - } - - crc +pub fn calc_crc8_itu(c: &[u8]) -> u8 { + let crc8_itu_alg = crc::Crc::::new(&crc::CRC_8_I_432_1); + let checksum = crc8_itu_alg.checksum(c); + return checksum; } pub fn elapsed_millis(start_at: Instant) -> u64 { start_at.elapsed().as_millis() as u64 +} + +#[cfg(test)] +mod test { + use anyhow::Ok; + + use crate::serial_core::utils::{calc_crc8_itu, calc_crc8_smbus}; + + #[test] + fn test_crc8_itu() -> anyhow::Result<()> { + let req_vec = vec![0x55, 0xAA, 0x09, 0x00, 0x34, 0x00, 0xFB, 0x00, 0x1C, 0x00, 0x00, 0x18, 0x00]; + let checksum = calc_crc8_itu(req_vec.as_slice()); + assert_eq!(checksum, 0x7A); + + Ok(()) + } + + #[test] + fn test_crc8_smbus() -> anyhow::Result<()> { + let req_vec = vec![0x55, 0xAA, 0x09, 0x00, 0x34, 0x00, 0xFB, 0x00, 0x1C, 0x00, 0x00, 0x18, 0x00]; + let checksum = calc_crc8_smbus(req_vec.as_slice()); + assert_eq!(checksum, 0x2F); + + Ok(()) + } } \ No newline at end of file diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index ad5eb43..b5c95f4 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -35,8 +35,8 @@ const copyByLocale: Record = { "zh-CN": { - appName: "PAXINI HUD", - suiteName: "PX-6AX GEN3", + appName: "JOYSON HUD", + suiteName: "v0.1.0", stageTitle: "WebGL2 主渲染区", stageHint: "底图与三维操作将在此区域加载", configPanelTitle: "参数配置", @@ -77,8 +77,8 @@ disconnectedLabel: "未连接" }, "en-US": { - appName: "PAXINI HUD", - suiteName: "PX-6AX GEN3", + appName: "JOYSON HUD", + suiteName: "v0.1.0", stageTitle: "WebGL2 Main Surface", stageHint: "Map texture and 3D interactions will render here", configPanelTitle: "Config Panel", @@ -162,9 +162,9 @@ let connectionNotice = ""; let connectionNoticeTone: HudNoticeTone = "info"; let isExporting = false; - let deviceValue = "PX-Sense Unit"; - let sampleRateValue = "120Hz"; - let channelsValue = "8"; + let deviceValue = "JY-Sense Unit"; + let sampleRateValue = "100Hz"; + let channelsValue = "84"; let webglStatusTone: StageStatusTone = "warn"; let isWindowMaximized = false; let activeConfigLinkId = "stream-on"; diff --git a/static/favicon.png b/static/favicon.png deleted file mode 100644 index 825b9e65af7c104cfb07089bb28659393b4f2097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1571 zcmV+;2Hg3HP)Px)-AP12RCwC$UE6KzI1p6{F2N z1VK2vi|pOpn{~#djwYcWXTI_im_u^TJgMZ4JMOsSj!0ma>B?-(Hr@X&W@|R-$}W@Z zgj#$x=!~7LGqHW?IO8+*oE1MyDp!G=L0#^lUx?;!fXv@l^6SvTnf^ac{5OurzC#ZMYc20lI%HhX816AYVs1T3heS1*WaWH z%;x>)-J}YB5#CLzU@GBR6sXYrD>Vw(Fmt#|JP;+}<#6b63Ike{Fuo!?M{yEffez;| zp!PfsuaC)>h>-AdbnwN13g*1LowNjT5?+lFVd#9$!8Z9HA|$*6dQ8EHLu}U|obW6f z2%uGv?vr=KNq7YYa2Roj;|zooo<)lf=&2yxM@e`kM$CmCR#x>gI>I|*Ubr({5Y^rb zghxQU22N}F51}^yfDSt786oMTc!W&V;d?76)9KXX1 z+6Okem(d}YXmmOiZq$!IPk5t8nnS{%?+vDFz3BevmFNgpIod~R{>@#@5x9zJKEHLHv!gHeK~n)Ld!M8DB|Kfe%~123&Hz1Z(86nU7*G5chmyDe ziV7$pB7pJ=96hpxHv9rCR29%bLOXlKU<_13_M8x)6;P8E1Kz6G<&P?$P^%c!M5`2` zfY2zg;VK5~^>TJGQzc+33-n~gKt{{of8GzUkWmU110IgI0DLxRIM>0US|TsM=L|@F z0Bun8U!cRB7-2apz=y-7*UxOxz@Z0)@QM)9wSGki1AZ38ceG7Q72z5`i;i=J`ILzL z@iUO?SBBG-0cQuo+an4TsLy-g-x;8P4UVwk|D8{W@U1Zi z!M)+jqy@nQ$p?5tsHp-6J304Q={v-B>66$P0IDx&YT(`IcZ~bZfmn11#rXd7<5s}y zBi9eim&zQc0Dk|2>$bs0PnLmDfMP5lcXRY&cvJ=zKxI^f0%-d$tD!`LBf9^jMSYUA zI8U?CWdY@}cRq6{5~y+)#h1!*-HcGW@+gZ4B};0OnC~`xQOyH19z*TA!!BJ%9s0V3F?CAJ{hTd#*tf+ur-W9MOURF-@B77_-OshsY}6 zOXRY=5%C^*26z?l)1=$bz30!so5tfABdSYzO+H=CpV~aaUefmjvfZ3Ttu9W&W3Iu6 zROlh0MFA5h;my}8lB0tAV-Rvc2Zs_CCSJnx@d`**$idgy-iMob4dJWWw|21b4NB=LfsYp0Aeh{Ov)yztQi;eL4y5 zMi>8^SzKqk8~k?UiQK^^-5d8c%bV?$F8%X~czyiaKCI2=UH