diff --git a/.gitignore b/.gitignore
index 725f1869..d04ac415 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,3 +40,4 @@ CLAUDE.md
# Secrets (compile-time configuration)
secrets.toml
.env
+/docs/
diff --git a/Cargo.toml b/Cargo.toml
index c246fdd3..899b0b3e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "one-kvm"
-version = "0.1.4"
+version = "0.1.5"
edition = "2021"
authors = ["SilentWind"]
description = "A open and lightweight IP-KVM solution written in Rust"
diff --git a/README.md b/README.md
index e20c6845..7798cb72 100644
--- a/README.md
+++ b/README.md
@@ -7,13 +7,6 @@
[](https://github.com/mofeng-git/One-KVM/stargazers)
[](https://github.com/mofeng-git/One-KVM/network/members)
[](https://github.com/mofeng-git/One-KVM/issues)
-
-
- ๐ ๆๆฏๆๆกฃ โข
- โก ๅฟซ้ๅผๅง โข
- ๐ ๅ่ฝไป็ป โข
- ๐ ่ฟ็งป่ฏดๆ
-
---
@@ -26,7 +19,7 @@
- **ๅผๆพ**๏ผไธ็ปๅฎ็นๅฎ็กฌไปถ้
็ฝฎ๏ผๅฐฝ้้้
ๅธธ่ง Linux ่ฎพๅค
- **่ฝป้**๏ผๅไบ่ฟๅถๅๅ๏ผ้จ็ฝฒ่ฟ็จๆด็ฎๅ
-- **ๆ็จ**๏ผ็ฝ้กต็้ขๅฎๆ่ฎพๅคไธๅๆฐ้
็ฝฎ๏ผๅฐฝ้ๅๅฐๆๅจๆน้
็ฝฎๆไปถ
+- **ๆ็จ**๏ผ็ฝ้กต็้ขๅฎๆ่ฎพๅคไธๅๆฐ้
็ฝฎ๏ผๆ ้ๆๅจๆน้
็ฝฎๆไปถ
> **ๆณจๆ๏ผ** One-KVM Rust ็ฎๅไปๅคไบๅผๅๆฉๆ้ถๆฎต๏ผๅ่ฝไธ็ป่ไผๅฟซ้่ฟญไปฃ๏ผๆฌข่ฟไฝ้ชไธๅ้ฆใ
@@ -35,7 +28,7 @@
ๅผๅ้ๅฟๆญฃๅจไป **One-KVM Python** ้ๆญฅ่ฝฌๅ **One-KVM Rust**ใ
- ๅฆๆไฝ ๅจไฝฟ็จ **One-KVM Python๏ผๅบไบ PiKVM๏ผ**๏ผ่ฏทๆฅ็ [One-KVM Python ๆๆกฃ](https://docs.one-kvm.cn/python/)
-- One-KVM Rust ็ธ่พไบ One-KVM Python๏ผ**ๅฐๆช้้
CSI HDMI ้้ๅก**ใ**ไธๆฏๆ VNC ่ฎฟ้ฎ**๏ผไปๅคไบๅผๅๆฉๆ้ถๆฎต
+- One-KVM Rust ็ธ่พไบ One-KVM Python๏ผ**ๅฐๆชๅฎๅ
จ้้
CSI HDMI ้้ๅก**ใ**ไธๆฏๆ VNC ่ฎฟ้ฎ**๏ผไปๅคไบๅผๅๆฉๆ้ถๆฎต
## ๐ ๅ่ฝไป็ป
@@ -55,13 +48,13 @@
- **VAAPI**๏ผIntel/AMD GPU
- **RKMPP**๏ผRockchip SoC
-- **V4L2 M2M**๏ผ้็จ็กฌไปถ็ผ็ ๅจ๏ผๅฐๆชๅฎ็ฐ๏ผ
+- **V4L2 M2M**๏ผ้็จ็กฌไปถ็ผ็ ๅจ
- **่ฝฏไปถ็ผ็ **๏ผCPU ็ผ็
### ๆฉๅฑ่ฝๅ
- Web UI ้
็ฝฎ๏ผๅค่ฏญ่จๆฏๆ๏ผไธญๆ/่ฑๆ๏ผ
-- ๅ
็ฝฎ Web ็ป็ซฏ๏ผttyd๏ผๅ
็ฝ็ฉฟ้ๆฏๆ๏ผgostc๏ผใP2P ็ป็ฝๆฏๆ๏ผEasyTier๏ผใRustDesk ๅ่ฎฎ้ๆ๏ผ็จไบ่ทจๅนณๅฐ่ฟ็จ่ฎฟ้ฎ่ฝๅๆฉๅฑ๏ผ
+- ๅ
็ฝฎ Web ็ป็ซฏ๏ผttyd๏ผใๅ
็ฝ็ฉฟ้ๆฏๆ๏ผgostc๏ผใP2P ็ป็ฝๆฏๆ๏ผEasyTier๏ผใRustDesk ๅ่ฎฎ้ๆ๏ผ็จไบ่ทจๅนณๅฐ่ฟ็จ่ฎฟ้ฎ่ฝๅๆฉๅฑ๏ผๅ RTSP ่ง้ขๆต๏ผ็จไบ่ง้ขๆจๆต๏ผ
## โก ๅฎ่ฃ
ไฝฟ็จ
@@ -195,6 +188,10 @@
- ็ฑๅ็ต็จๆท_JT6c
+- MaxZ
+
+- ็ฑๅ็ต็จๆท_d3d9c
+
- ......
diff --git a/docs/README.md b/docs/README.md
deleted file mode 100644
index 24545f82..00000000
--- a/docs/README.md
+++ /dev/null
@@ -1,130 +0,0 @@
-# One-KVM ๆๆฏๆๆกฃ
-
-ๆฌ็ฎๅฝๅ
ๅซ One-KVM ้กน็ฎ็ๅฎๆดๆๆฏๆๆกฃใ
-
-## ๆๆกฃ็ปๆ
-
-```
-docs/
-โโโ README.md # ๆฌๆไปถ - ๆๆกฃ็ดขๅผ
-โโโ system-architecture.md # ็ณป็ปๆถๆๆๆกฃ
-โโโ tech-stack.md # ๆๆฏๆ ๆๆกฃ
-โโโ modules/ # ๆจกๅๆๆกฃ
- โโโ video.md # ่ง้ขๆจกๅ
- โโโ hid.md # HID ๆจกๅ
- โโโ otg.md # OTG ๆจกๅ
- โโโ msd.md # MSD ๆจกๅ
- โโโ atx.md # ATX ๆจกๅ
- โโโ audio.md # ้ณ้ขๆจกๅ
- โโโ webrtc.md # WebRTC ๆจกๅ
- โโโ rustdesk.md # RustDesk ๆจกๅ
- โโโ auth.md # ่ฎค่ฏๆจกๅ
- โโโ config.md # ้
็ฝฎๆจกๅ
- โโโ events.md # ไบไปถๆจกๅ
- โโโ web.md # Web ๆจกๅ
-```
-
-## ๅฟซ้ๅฏผ่ช
-
-### ๆ ธๅฟๆๆกฃ
-
-| ๆๆกฃ | ๆ่ฟฐ |
-|------|------|
-| [็ณป็ปๆถๆ](./system-architecture.md) | ๆดไฝๆถๆ่ฎพ่ฎกใๆฐๆฎๆตใๆจกๅไพ่ต |
-| [ๆๆฏๆ ](./tech-stack.md) | ไฝฟ็จ็ๆๆฏใๅบๅๅผๅ่ง่ |
-
-### ๅ่ฝๆจกๅ
-
-| ๆจกๅ | ๆ่ฟฐ | ๅ
ณ้ฎๆไปถ |
-|------|------|---------|
-| [Video](./modules/video.md) | ่ง้ข้้ๅ็ผ็ | `src/video/` |
-| [HID](./modules/hid.md) | ้ฎ็้ผ ๆ ๆงๅถ | `src/hid/` |
-| [OTG](./modules/otg.md) | USB Gadget ็ฎก็ | `src/otg/` |
-| [MSD](./modules/msd.md) | ่ๆๅญๅจ่ฎพๅค | `src/msd/` |
-| [ATX](./modules/atx.md) | ็ตๆบๆงๅถ | `src/atx/` |
-| [Audio](./modules/audio.md) | ้ณ้ข้้็ผ็ | `src/audio/` |
-| [WebRTC](./modules/webrtc.md) | WebRTC ๆตๅชไฝ | `src/webrtc/` |
-| [RustDesk](./modules/rustdesk.md) | RustDesk ๅ่ฎฎ้ๆ | `src/rustdesk/` |
-
-### ๅบ็ก่ฎพๆฝ
-
-| ๆจกๅ | ๆ่ฟฐ | ๅ
ณ้ฎๆไปถ |
-|------|------|---------|
-| [Auth](./modules/auth.md) | ่ฎค่ฏๅไผ่ฏ | `src/auth/` |
-| [Config](./modules/config.md) | ้
็ฝฎ็ฎก็ | `src/config/` |
-| [Events](./modules/events.md) | ไบไปถ็ณป็ป | `src/events/` |
-| [Web](./modules/web.md) | HTTP API | `src/web/` |
-
-## ๆถๆๆฆ่ง
-
-```
-โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
-โ One-KVM System โ
-โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
-โ โ
-โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
-โ โ Web Frontend (Vue3) โ โ
-โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
-โ โ โ
-โ โผ โ
-โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
-โ โ Axum Web Server โ โ
-โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
-โ โ โ
-โ โผ โ
-โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
-โ โ AppState โ โ
-โ โ โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโ โ โ
-โ โ โ Video โ โ HID โ โ MSD โ โ ATX โ โ โ
-โ โ โ Module โ โ Module โ โ Module โ โ Module โ โ โ
-โ โ โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโ โ โ
-โ โ โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโ โ โ
-โ โ โ Audio โ โ WebRTC โ โRustDeskโ โ Events โ โ โ
-โ โ โ Module โ โ Module โ โ Module โ โ Bus โ โ โ
-โ โ โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโ โ โ
-โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
-โ โ โ
-โ โผ โ
-โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
-โ โ Hardware Layer โ โ
-โ โ V4L2 โ USB OTG โ GPIO โ ALSA โ Network โ โ
-โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
-โ โ
-โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
-```
-
-## ๅ
ณ้ฎ็นๆง
-
-- **ๅไธไบ่ฟๅถ**: Web UI + ๅ็ซฏไธไฝๅ้จ็ฝฒ
-- **ๅๆตๆจกๅผ**: WebRTC (H264/H265/VP8/VP9) + MJPEG
-- **USB OTG**: ่ๆ้ฎ้ผ ใ่ๆๅญๅจ
-- **็กฌไปถๅ ้**: VAAPI/RKMPP/V4L2 M2M
-- **RustDesk**: ่ทจๅนณๅฐ่ฟ็จ่ฎฟ้ฎ
-- **ๆ ้
็ฝฎๆไปถ**: SQLite ้
็ฝฎๅญๅจ
-
-## ็ฎๆ ๅนณๅฐ
-
-| ๅนณๅฐ | ๆถๆ | ็จ้ |
-|------|------|------|
-| aarch64-unknown-linux-gnu | ARM64 | ไธป่ฆ็ฎๆ |
-| armv7-unknown-linux-gnueabihf | ARMv7 | ๅค้ |
-| x86_64-unknown-linux-gnu | x86-64 | ๅผๅ/ๆต่ฏ |
-
-## ๅฟซ้ๅผๅง
-
-```bash
-# ๆๅปบๅ็ซฏ
-cd web && npm install && npm run build && cd ..
-
-# ๆๅปบๅ็ซฏ
-cargo build --release
-
-# ่ฟ่ก
-./target/release/one-kvm --enable-https
-```
-
-## ็ธๅ
ณ้พๆฅ
-
-- [้กน็ฎไปๅบ](https://github.com/mofeng-git/One-KVM)
-- [ๅผๅ่ฎกๅ](./DEVELOPMENT_PLAN.md)
-- [้กน็ฎ็ฎๆ ](./PROJECT_GOALS.md)
diff --git a/docs/modules/atx.md b/docs/modules/atx.md
deleted file mode 100644
index 316d4a34..00000000
--- a/docs/modules/atx.md
+++ /dev/null
@@ -1,484 +0,0 @@
-# ATX ๆจกๅๆๆกฃ
-
-## 1. ๆจกๅๆฆ่ฟฐ
-
-ATX ๆจกๅๆไพ็ตๆบๆงๅถๅ่ฝ๏ผ้่ฟ GPIO ๆ USB ็ปง็ตๅจๆงๅถ็ฎๆ ่ฎก็ฎๆบ็็ตๆบๅ้็ฝฎๆ้ฎใ
-
-### 1.1 ไธป่ฆๅ่ฝ
-
-- ็ตๆบๆ้ฎๆงๅถ
-- ้็ฝฎๆ้ฎๆงๅถ
-- ็ตๆบ LED ็ถๆ็่ง
-- Wake-on-LAN ๆฏๆ
-- ๅคๅ็ซฏๆฏๆ (GPIO/USB ็ปง็ตๅจ)
-
-### 1.2 ๆไปถ็ปๆ
-
-```
-src/atx/
-โโโ mod.rs # ๆจกๅๅฏผๅบ
-โโโ controller.rs # AtxController (11KB)
-โโโ executor.rs # ๅจไฝๆง่กๅจ (10KB)
-โโโ types.rs # ็ฑปๅๅฎไน (7KB)
-โโโ led.rs # LED ็่ง (5KB)
-โโโ wol.rs # Wake-on-LAN (5KB)
-```
-
----
-
-## 2. ๆถๆ่ฎพ่ฎก
-
-```
-โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
-โ ATX Architecture โ
-โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
-
- Web API
- โ
- โผ
- โโโโโโโโโโโโโโโโโโโ
- โ AtxController โ
- โ (controller.rs) โ
- โโโโโโโโโโฌโโโโโโโโโ
- โ
- โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโ
- โ โ โ
- โผ โผ โผ
-โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโ
-โ Power โ โ Reset โ โ LED โ
-โExecutorโ โExecutorโ โMonitor โ
-โโโโโฌโโโโโ โโโโโฌโโโโโ โโโโโฌโโโโโ
- โ โ โ
- โผ โผ โผ
-โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโ
-โ GPIO โ โ GPIO โ โ GPIO โ
-โ or USB โ โ or USB โ โ Input โ
-โ Relay โ โ Relay โ โ โ
-โโโโโฌโโโโโ โโโโโฌโโโโโ โโโโโฌโโโโโ
- โ โ โ
- โโโโโโโโโโโโโผโโโโโโโโโโโโโโ
- โ
- โผ
- โโโโโโโโโโโโโโโโโ
- โ Target PC โ
- โ (ATX Header) โ
- โโโโโโโโโโโโโโโโโ
-```
-
----
-
-## 3. ๆ ธๅฟ็ปไปถ
-
-### 3.1 AtxController (controller.rs)
-
-```rust
-pub struct AtxController {
- /// ็ตๆบๆ้ฎ้
็ฝฎ
- power: Arc,
-
- /// ้็ฝฎๆ้ฎ้
็ฝฎ
- reset: Arc,
-
- /// LED ็่งๅจ
- led_monitor: Arc>>,
-
- /// WoL ๆงๅถๅจ
- wol: Arc>>,
-
- /// ๅฝๅ็ถๆ
- state: Arc>,
-
- /// ไบไปถๆป็บฟ
- events: Arc,
-}
-
-impl AtxController {
- /// ๅๅปบๆงๅถๅจ
- pub fn new(config: &AtxConfig, events: Arc) -> Result;
-
- /// ็ญๆ็ตๆบๆ้ฎ (ๅผๆบ/ๆญฃๅธธๅ
ณๆบ)
- pub async fn power_short_press(&self) -> Result<()>;
-
- /// ้ฟๆ็ตๆบๆ้ฎ (ๅผบๅถๅ
ณๆบ)
- pub async fn power_long_press(&self) -> Result<()>;
-
- /// ๆ้็ฝฎๆ้ฎ
- pub async fn reset_press(&self) -> Result<()>;
-
- /// ่ทๅ็ตๆบ็ถๆ
- pub fn power_state(&self) -> PowerState;
-
- /// ๅ้ WoL ้ญๆฏๅ
- pub async fn wake_on_lan(&self, mac: &str) -> Result<()>;
-
- /// ่ทๅ็ถๆ
- pub fn state(&self) -> AtxState;
-
- /// ้ๆฐๅ ่ฝฝ้
็ฝฎ
- pub async fn reload(&self, config: &AtxConfig) -> Result<()>;
-}
-
-pub struct AtxState {
- /// ๆฏๅฆๅฏ็จ
- pub available: bool,
-
- /// ็ตๆบๆฏๅฆๅผๅฏ
- pub power_on: bool,
-
- /// ๆๅๆไฝๆถ้ด
- pub last_action: Option>,
-
- /// ้่ฏฏไฟกๆฏ
- pub error: Option,
-}
-
-pub enum PowerState {
- On,
- Off,
- Unknown,
-}
-```
-
-### 3.2 AtxButton (executor.rs)
-
-```rust
-pub struct AtxButton {
- /// ๆ้ฎๅ็งฐ
- name: String,
-
- /// ้ฉฑๅจ็ฑปๅ
- driver: AtxDriverType,
-
- /// GPIO ๅฅๆ
- gpio: Option,
-
- /// USB ็ปง็ตๅจๅฅๆ
- relay: Option,
-
- /// ้
็ฝฎ
- config: AtxKeyConfig,
-}
-
-impl AtxButton {
- /// ๅๅปบๆ้ฎ
- pub fn new(name: &str, config: &AtxKeyConfig) -> Result;
-
- /// ็ญๆ (100ms)
- pub async fn short_press(&self) -> Result<()>;
-
- /// ้ฟๆ (3000ms)
- pub async fn long_press(&self) -> Result<()>;
-
- /// ่ชๅฎไนๆๅๆถ้ด
- pub async fn press(&self, duration: Duration) -> Result<()>;
-
- /// ่ฎพ็ฝฎ่พๅบ็ถๆ
- fn set_output(&self, high: bool) -> Result<()>;
-}
-
-pub enum AtxDriverType {
- /// GPIO ็ด่ฟ
- Gpio,
-
- /// USB ็ปง็ตๅจ
- UsbRelay,
-
- /// ็ฆ็จ
- None,
-}
-```
-
-### 3.3 LedMonitor (led.rs)
-
-```rust
-pub struct LedMonitor {
- /// GPIO ๅผ่
- pin: u32,
-
- /// GPIO ๅฅๆ
- line: LineHandle,
-
- /// ๅฝๅ็ถๆ
- state: Arc,
-
- /// ็่งไปปๅก
- monitor_task: Option>,
-}
-
-impl LedMonitor {
- /// ๅๅปบ็่งๅจ
- pub fn new(config: &AtxLedConfig) -> Result;
-
- /// ๅฏๅจ็่ง
- pub fn start(&mut self, events: Arc) -> Result<()>;
-
- /// ๅๆญข็่ง
- pub fn stop(&mut self);
-
- /// ่ทๅๅฝๅ็ถๆ
- pub fn state(&self) -> bool;
-}
-```
-
-### 3.4 WolController (wol.rs)
-
-```rust
-pub struct WolController {
- /// ็ฝ็ปๆฅๅฃ
- interface: String,
-
- /// ๅนฟๆญๅฐๅ
- broadcast_addr: SocketAddr,
-}
-
-impl WolController {
- /// ๅๅปบๆงๅถๅจ
- pub fn new(interface: Option<&str>) -> Result;
-
- /// ๅ้ WoL ้ญๆฏๅ
- pub async fn wake(&self, mac: &str) -> Result<()>;
-
- /// ๆๅปบ้ญๆฏๅ
- fn build_magic_packet(mac: &[u8; 6]) -> [u8; 102];
-
- /// ่งฃๆ MAC ๅฐๅ
- fn parse_mac(mac: &str) -> Result<[u8; 6]>;
-}
-```
-
----
-
-## 4. ้
็ฝฎ
-
-```rust
-#[derive(Serialize, Deserialize)]
-#[typeshare]
-pub struct AtxConfig {
- /// ๆฏๅฆๅฏ็จ
- pub enabled: bool,
-
- /// ็ตๆบๆ้ฎ้
็ฝฎ
- pub power: AtxKeyConfig,
-
- /// ้็ฝฎๆ้ฎ้
็ฝฎ
- pub reset: AtxKeyConfig,
-
- /// LED ็่ง้
็ฝฎ
- pub led: AtxLedConfig,
-
- /// WoL ้
็ฝฎ
- pub wol: WolConfig,
-}
-
-#[derive(Serialize, Deserialize)]
-#[typeshare]
-pub struct AtxKeyConfig {
- /// ้ฉฑๅจ็ฑปๅ
- pub driver: AtxDriverType,
-
- /// GPIO ่ฏ็ (ๅฆ /dev/gpiochip0)
- pub gpio_chip: Option,
-
- /// GPIO ๅผ่ๅท
- pub gpio_pin: Option,
-
- /// USB ็ปง็ตๅจ่ฎพๅค
- pub relay_device: Option,
-
- /// ็ปง็ตๅจ้้
- pub relay_channel: Option,
-
- /// ๆฟๆดป็ตๅนณ
- pub active_level: ActiveLevel,
-}
-
-#[derive(Serialize, Deserialize)]
-#[typeshare]
-pub struct AtxLedConfig {
- /// ๆฏๅฆๅฏ็จ
- pub enabled: bool,
-
- /// GPIO ่ฏ็
- pub gpio_chip: Option,
-
- /// GPIO ๅผ่ๅท
- pub gpio_pin: Option,
-
- /// ๆฟๆดป็ตๅนณ
- pub active_level: ActiveLevel,
-}
-
-pub enum ActiveLevel {
- High,
- Low,
-}
-
-impl Default for AtxConfig {
- fn default() -> Self {
- Self {
- enabled: false,
- power: AtxKeyConfig::default(),
- reset: AtxKeyConfig::default(),
- led: AtxLedConfig::default(),
- wol: WolConfig::default(),
- }
- }
-}
-```
-
----
-
-## 5. API ็ซฏ็น
-
-| ็ซฏ็น | ๆนๆณ | ๆ่ฟฐ |
-|------|------|------|
-| `/api/atx/status` | GET | ่ทๅ ATX ็ถๆ |
-| `/api/atx/power/short` | POST | ็ญๆ็ตๆบ |
-| `/api/atx/power/long` | POST | ้ฟๆ็ตๆบ |
-| `/api/atx/reset` | POST | ๆ้็ฝฎ |
-| `/api/atx/wol` | POST | ๅ้ WoL |
-
-### ๅๅบๆ ผๅผ
-
-```json
-// GET /api/atx/status
-{
- "available": true,
- "power_on": true,
- "last_action": "2024-01-15T10:30:00Z",
- "error": null
-}
-
-// POST /api/atx/wol
-// Request: { "mac": "00:11:22:33:44:55" }
-{
- "success": true
-}
-```
-
----
-
-## 6. ็กฌไปถ่ฟๆฅ
-
-### 6.1 GPIO ็ด่ฟ
-
-```
-One-KVM Device Target PC
-โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
-โ GPIO Pin โโโโโโโโโโโโโโโโโ Power SW โ
-โ (Output) โ โ โ
-โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
-
-ๆฅ็บฟ่ฏดๆ:
-- GPIO ๅผ่่ฟๆฅๅฐ ATX ็ตๆบๆ้ฎ
-- ไฝฟ็จๅ
่ฆๆ็ปง็ตๅจ้็ฆป (ๆจ่)
-- ๆณจๆ็ตๅนณๅน้
-```
-
-### 6.2 USB ็ปง็ตๅจ
-
-```
-One-KVM Device USB Relay Target PC
-โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
-โ USB โโโโโโโโโโโโโโโโโ Relay โโโโโโโโโโโโ Power SW โ
-โ โ โ โ โ โ
-โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
-
-ไผ็น:
-- ๅฎๅ
จ้็ฆป
-- ๆ ้ๆ
ๅฟ็ตๅนณ้ฎ้ข
-- ๆดๅฎๅ
จ
-```
-
----
-
-## 7. ไบไปถ
-
-```rust
-pub enum SystemEvent {
- AtxStateChanged {
- power_on: bool,
- last_action: Option,
- error: Option,
- },
-
- AtxActionPerformed {
- action: String, // "power_short" | "power_long" | "reset" | "wol"
- success: bool,
- },
-}
-```
-
----
-
-## 8. ้่ฏฏๅค็
-
-```rust
-#[derive(Debug, thiserror::Error)]
-pub enum AtxError {
- #[error("ATX not available")]
- NotAvailable,
-
- #[error("GPIO error: {0}")]
- GpioError(String),
-
- #[error("Relay error: {0}")]
- RelayError(String),
-
- #[error("WoL error: {0}")]
- WolError(String),
-
- #[error("Invalid MAC address: {0}")]
- InvalidMac(String),
-
- #[error("Operation in progress")]
- Busy,
-}
-```
-
----
-
-## 9. ไฝฟ็จ็คบไพ
-
-```rust
-let atx = AtxController::new(&config, events)?;
-
-// ๅผๆบ
-atx.power_short_press().await?;
-
-// ๆฃๆฅ็ถๆ
-tokio::time::sleep(Duration::from_secs(5)).await;
-if atx.power_state() == PowerState::On {
- println!("PC is now on");
-}
-
-// ๅผบๅถๅ
ณๆบ
-atx.power_long_press().await?;
-
-// ้็ฝฎ
-atx.reset_press().await?;
-
-// Wake-on-LAN
-atx.wake_on_lan("00:11:22:33:44:55").await?;
-```
-
----
-
-## 10. ๅธธ่ง้ฎ้ข
-
-### Q: GPIO ๆ ๆณๆงๅถ?
-
-1. ๆฃๆฅๅผ่้
็ฝฎ
-2. ๆฃๆฅๆ้ (`/dev/gpiochip*`)
-3. ๆฃๆฅๆฅ็บฟ
-
-### Q: LED ็ถๆไธๆญฃ็กฎ?
-
-1. ๆฃๆฅ active_level ้
็ฝฎ
-2. ๆฃๆฅ GPIO ่พๅ
ฅๆจกๅผ
-
-### Q: WoL ไธๅทฅไฝ?
-
-1. ๆฃๆฅ็ฎๆ PC BIOS ่ฎพ็ฝฎ
-2. ๆฃๆฅ็ฝๅกๆฏๆ
-3. ๆฃๆฅ็ฝ็ปๅนฟๆญ
diff --git a/docs/modules/audio.md b/docs/modules/audio.md
deleted file mode 100644
index 670f4469..00000000
--- a/docs/modules/audio.md
+++ /dev/null
@@ -1,463 +0,0 @@
-# Audio ๆจกๅๆๆกฃ
-
-## 1. ๆจกๅๆฆ่ฟฐ
-
-Audio ๆจกๅ่ด่ดฃ้ณ้ข้้ๅ็ผ็ ๏ผๆฏๆ ALSA ้้ๅ Opus ็ผ็ ใ
-
-### 1.1 ไธป่ฆๅ่ฝ
-
-- ALSA ้ณ้ข้้
-- Opus ็ผ็
-- ๅค่ดจ้้
็ฝฎ
-- WebSocket/WebRTC ไผ ่พ
-
-### 1.2 ๆไปถ็ปๆ
-
-```
-src/audio/
-โโโ mod.rs # ๆจกๅๅฏผๅบ
-โโโ controller.rs # AudioController (15KB)
-โโโ capture.rs # ALSA ้้ (12KB)
-โโโ encoder.rs # Opus ็ผ็ (8KB)
-โโโ shared_pipeline.rs # ๅ
ฑไบซ็ฎก้ (15KB)
-โโโ monitor.rs # ๅฅๅบท็่ง (11KB)
-โโโ device.rs # ่ฎพๅคๆไธพ (8KB)
-```
-
----
-
-## 2. ๆถๆ่ฎพ่ฎก
-
-```
-โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
-โ Audio Architecture โ
-โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
-
-ALSA Device (hw:0,0)
- โ
- โ PCM 48kHz/16bit/Stereo
- โผ
-โโโโโโโโโโโโโโโโโโโ
-โ AudioCapturer โ
-โ (capture.rs) โ
-โโโโโโโโโโฌโโโโโโโโโ
- โ
- โผ
-โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
-โ SharedAudioPipeline โ
-โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
-โ โ Opus Encoder โ โ
-โ โ 48kHz โ 24-96 kbps โ โ
-โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
-โโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโ
- โ
- โโโโโโโโโโโดโโโโโโโโโโ
- โ โ
- โผ โผ
-โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
-โ WebSocket โ โ WebRTC โ
-โ Stream โ โ Audio Track โ
-โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
-```
-
----
-
-## 3. ๆ ธๅฟ็ปไปถ
-
-### 3.1 AudioController (controller.rs)
-
-```rust
-pub struct AudioController {
- /// ้้ๅจ
- capturer: Arc>>,
-
- /// ๅ
ฑไบซ็ฎก้
- pipeline: Arc,
-
- /// ้
็ฝฎ
- config: Arc>,
-
- /// ็ถๆ
- state: Arc>,
-
- /// ไบไปถๆป็บฟ
- events: Arc,
-}
-
-impl AudioController {
- /// ๅๅปบๆงๅถๅจ
- pub fn new(config: &AudioConfig, events: Arc) -> Result;
-
- /// ๅฏๅจ้ณ้ข
- pub async fn start(&self) -> Result<()>;
-
- /// ๅๆญข้ณ้ข
- pub async fn stop(&self) -> Result<()>;
-
- /// ่ฎข้
้ณ้ขๅธง
- pub fn subscribe(&self) -> broadcast::Receiver;
-
- /// ่ทๅ็ถๆ
- pub fn status(&self) -> AudioStatus;
-
- /// ่ฎพ็ฝฎ่ดจ้
- pub fn set_quality(&self, quality: AudioQuality) -> Result<()>;
-
- /// ๅๅบ่ฎพๅค
- pub fn list_devices(&self) -> Vec;
-
- /// ้ๆฐๅ ่ฝฝ้
็ฝฎ
- pub async fn reload(&self, config: &AudioConfig) -> Result<()>;
-}
-
-pub struct AudioStatus {
- pub enabled: bool,
- pub streaming: bool,
- pub device: Option,
- pub sample_rate: u32,
- pub channels: u16,
- pub bitrate: u32,
- pub error: Option,
-}
-```
-
-### 3.2 AudioCapturer (capture.rs)
-
-```rust
-pub struct AudioCapturer {
- /// PCM ๅฅๆ
- pcm: PCM,
-
- /// ่ฎพๅคๅ
- device: String,
-
- /// ้ๆ ท็
- sample_rate: u32,
-
- /// ้้ๆฐ
- channels: u16,
-
- /// ๅธงๅคงๅฐ
- frame_size: usize,
-
- /// ่ฟ่ก็ถๆ
- running: AtomicBool,
-}
-
-impl AudioCapturer {
- /// ๆๅผ่ฎพๅค
- pub fn open(device: &str, config: &CaptureConfig) -> Result;
-
- /// ่ฏปๅ้ณ้ขๅธง
- pub fn read_frame(&self) -> Result>;
-
- /// ๅฏๅจ้้
- pub fn start(&self) -> Result<()>;
-
- /// ๅๆญข้้
- pub fn stop(&self);
-
- /// ๆฏๅฆ่ฟ่กไธญ
- pub fn is_running(&self) -> bool;
-}
-
-pub struct CaptureConfig {
- pub sample_rate: u32, // 48000
- pub channels: u16, // 2
- pub frame_size: usize, // 960 (20ms)
- pub buffer_size: usize, // 4800
-}
-```
-
-### 3.3 OpusEncoder (encoder.rs)
-
-```rust
-pub struct OpusEncoder {
- /// Opus ็ผ็ ๅจ
- encoder: audiopus::Encoder,
-
- /// ้ๆ ท็
- sample_rate: u32,
-
- /// ้้ๆฐ
- channels: u16,
-
- /// ๅธงๅคงๅฐ
- frame_size: usize,
-
- /// ็ ็
- bitrate: u32,
-}
-
-impl OpusEncoder {
- /// ๅๅปบ็ผ็ ๅจ
- pub fn new(quality: AudioQuality) -> Result;
-
- /// ็ผ็ PCM ๆฐๆฎ
- pub fn encode(&mut self, pcm: &[i16]) -> Result>;
-
- /// ่ฎพ็ฝฎ็ ็
- pub fn set_bitrate(&mut self, bitrate: u32) -> Result<()>;
-
- /// ่ทๅ็ ็
- pub fn bitrate(&self) -> u32;
-
- /// ้็ฝฎ็ผ็ ๅจ
- pub fn reset(&mut self) -> Result<()>;
-}
-```
-
-### 3.4 SharedAudioPipeline (shared_pipeline.rs)
-
-```rust
-pub struct SharedAudioPipeline {
- /// ้้ๅจ
- capturer: Arc>>,
-
- /// ็ผ็ ๅจ
- encoder: Arc>,
-
- /// ๅนฟๆญ้้
- tx: broadcast::Sender,
-
- /// ้้ไปปๅก
- capture_task: Arc>>>,
-
- /// ้
็ฝฎ
- config: Arc>,
-}
-
-impl SharedAudioPipeline {
- /// ๅๅปบ็ฎก้
- pub fn new(config: &AudioConfig) -> Result;
-
- /// ๅฏๅจ็ฎก้
- pub async fn start(&self) -> Result<()>;
-
- /// ๅๆญข็ฎก้
- pub async fn stop(&self) -> Result<()>;
-
- /// ่ฎข้
้ณ้ขๅธง
- pub fn subscribe(&self) -> broadcast::Receiver;
-
- /// ่ทๅ็ป่ฎก
- pub fn stats(&self) -> PipelineStats;
-}
-
-pub struct AudioFrame {
- /// Opus ๆฐๆฎ
- pub data: Bytes,
-
- /// ๆถ้ดๆณ
- pub timestamp: u64,
-
- /// ๅธงๅบๅท
- pub sequence: u64,
-}
-```
-
----
-
-## 4. ้ณ้ข่ดจ้
-
-```rust
-pub enum AudioQuality {
- /// 24 kbps - ๆไฝๅธฆๅฎฝ
- VeryLow,
-
- /// 48 kbps - ไฝๅธฆๅฎฝ
- Low,
-
- /// 64 kbps - ไธญ็ญ
- Medium,
-
- /// 96 kbps - ้ซ่ดจ้
- High,
-}
-
-impl AudioQuality {
- pub fn bitrate(&self) -> u32 {
- match self {
- Self::VeryLow => 24000,
- Self::Low => 48000,
- Self::Medium => 64000,
- Self::High => 96000,
- }
- }
-}
-```
-
----
-
-## 5. ้
็ฝฎ
-
-```rust
-#[derive(Serialize, Deserialize)]
-#[typeshare]
-pub struct AudioConfig {
- /// ๆฏๅฆๅฏ็จ
- pub enabled: bool,
-
- /// ่ฎพๅคๅ
- pub device: Option,
-
- /// ้ณ้ข่ดจ้
- pub quality: AudioQuality,
-
- /// ่ชๅจๅฏๅจ
- pub auto_start: bool,
-}
-
-impl Default for AudioConfig {
- fn default() -> Self {
- Self {
- enabled: true,
- device: None, // ไฝฟ็จ้ป่ฎค่ฎพๅค
- quality: AudioQuality::Medium,
- auto_start: false,
- }
- }
-}
-```
-
----
-
-## 6. API ็ซฏ็น
-
-| ็ซฏ็น | ๆนๆณ | ๆ่ฟฐ |
-|------|------|------|
-| `/api/audio/status` | GET | ่ทๅ้ณ้ข็ถๆ |
-| `/api/audio/start` | POST | ๅฏๅจ้ณ้ข |
-| `/api/audio/stop` | POST | ๅๆญข้ณ้ข |
-| `/api/audio/devices` | GET | ๅๅบ่ฎพๅค |
-| `/api/audio/quality` | GET | ่ทๅ่ดจ้ |
-| `/api/audio/quality` | POST | ่ฎพ็ฝฎ่ดจ้ |
-| `/api/ws/audio` | WS | ้ณ้ขๆต |
-
-### ๅๅบๆ ผๅผ
-
-```json
-// GET /api/audio/status
-{
- "enabled": true,
- "streaming": true,
- "device": "hw:0,0",
- "sample_rate": 48000,
- "channels": 2,
- "bitrate": 64000,
- "error": null
-}
-
-// GET /api/audio/devices
-{
- "devices": [
- {
- "name": "hw:0,0",
- "description": "USB Audio Device",
- "is_default": true
- }
- ]
-}
-```
-
----
-
-## 7. WebSocket ้ณ้ขๆต
-
-```javascript
-// ่ฟๆฅ WebSocket
-const ws = new WebSocket('/api/ws/audio');
-ws.binaryType = 'arraybuffer';
-
-// ๅๅงๅ Opus ่งฃ็ ๅจ
-const decoder = new OpusDecoder();
-
-// ๆฅๆถ้ณ้ขๅธง
-ws.onmessage = (event) => {
- const frame = new Uint8Array(event.data);
- const pcm = decoder.decode(frame);
- audioContext.play(pcm);
-};
-```
-
----
-
-## 8. ไบไปถ
-
-```rust
-pub enum SystemEvent {
- AudioStateChanged {
- enabled: bool,
- streaming: bool,
- device: Option,
- error: Option,
- },
-}
-```
-
----
-
-## 9. ้่ฏฏๅค็
-
-```rust
-#[derive(Debug, thiserror::Error)]
-pub enum AudioError {
- #[error("Device not found: {0}")]
- DeviceNotFound(String),
-
- #[error("Device busy: {0}")]
- DeviceBusy(String),
-
- #[error("ALSA error: {0}")]
- AlsaError(String),
-
- #[error("Encoder error: {0}")]
- EncoderError(String),
-
- #[error("Not streaming")]
- NotStreaming,
-}
-```
-
----
-
-## 10. ไฝฟ็จ็คบไพ
-
-```rust
-let controller = AudioController::new(&config, events)?;
-
-// ๅฏๅจ้ณ้ข
-controller.start().await?;
-
-// ่ฎข้
้ณ้ขๅธง
-let mut rx = controller.subscribe();
-while let Ok(frame) = rx.recv().await {
- // ๅค็ Opus ๆฐๆฎ
- send_to_client(frame.data);
-}
-
-// ๅๆญข
-controller.stop().await?;
-```
-
----
-
-## 11. ๅธธ่ง้ฎ้ข
-
-### Q: ๆพไธๅฐ้ณ้ข่ฎพๅค?
-
-1. ๆฃๆฅ ALSA ้
็ฝฎ
-2. ่ฟ่ก `arecord -l`
-3. ๆฃๆฅๆ้
-
-### Q: ้ณ้ขๅปถ่ฟ้ซ?
-
-1. ๅๅฐๅธงๅคงๅฐ
-2. ้ไฝ่ดจ้
-3. ๆฃๆฅ็ฝ็ป
-
-### Q: ้ณ้ขๆญๆญ็ปญ็ปญ?
-
-1. ๅขๅคง็ผๅฒๅบ
-2. ๆฃๆฅ CPU ่ด่ฝฝ
-3. ไฝฟ็จๆดไฝ่ดจ้
diff --git a/docs/modules/auth.md b/docs/modules/auth.md
deleted file mode 100644
index a1e4a4b6..00000000
--- a/docs/modules/auth.md
+++ /dev/null
@@ -1,340 +0,0 @@
-# Auth ๆจกๅๆๆกฃ
-
-## 1. ๆจกๅๆฆ่ฟฐ
-
-Auth ๆจกๅๆไพ็จๆท่ฎค่ฏๅไผ่ฏ็ฎก็ๅ่ฝใ
-
-### 1.1 ไธป่ฆๅ่ฝ
-
-- ็จๆท็ฎก็
-- ๅฏ็ ๅๅธ (Argon2)
-- ไผ่ฏ็ฎก็
-- ่ฎค่ฏไธญ้ดไปถ
-- ๆ้ๆงๅถ
-
-### 1.2 ๆไปถ็ปๆ
-
-```
-src/auth/
-โโโ mod.rs # ๆจกๅๅฏผๅบ
-โโโ user.rs # ็จๆท็ฎก็ (5KB)
-โโโ session.rs # ไผ่ฏ็ฎก็ (4KB)
-โโโ password.rs # ๅฏ็ ๅๅธ (1KB)
-โโโ middleware.rs # ไธญ้ดไปถ (4KB)
-```
-
----
-
-## 2. ๆ ธๅฟ็ปไปถ
-
-### 2.1 UserStore (user.rs)
-
-```rust
-pub struct UserStore {
- db: Pool,
-}
-
-impl UserStore {
- /// ๅๅปบๅญๅจ
- pub async fn new(db: Pool) -> Result;
-
- /// ๅๅปบ็จๆท
- pub async fn create_user(&self, user: &CreateUser) -> Result;
-
- /// ่ทๅ็จๆท
- pub async fn get_user(&self, id: &str) -> Result