4.0 KiB
4.0 KiB
CLAUDE.md — KVMote (Go/Wails)
Reescrita em Go do KVMote (original em C#/WinForms em C:\vscode\KVMote).
O que é
KVM over Bluetooth/BLE. Controla PC remoto (cliente) a partir do host usando microcontrolador como HID USB. Sem software no PC cliente.
Host PC ──BLE NUS──► ESP32-S3 ──USB HID──► Cliente PC (sem sw)
Hardware suportado: ESP32-S3 (BLE NUS) e Arduino Leonardo + HC-06 (Serial SPP). Ver CLAUDE.md do projeto C# para detalhes de hardware e firmware.
Stack
- Go 1.23 + Wails v2 (webview desktop)
- tinygo.org/x/bluetooth — BLE via WinRT
- golang.org/x/sys/windows — hooks globais (WH_MOUSE_LL, WH_KEYBOARD_LL)
- github.com/atotto/clipboard — leitura de clipboard
- Frontend: HTML estático em
frontend/dist/(sem framework JS)
Estrutura
main.go — entry point Wails, bind App
app.go — App struct, métodos expostos ao frontend
internal/
transport/
transport.go — interface Transport (Detect/Connect/Send/SendLossy...)
ble_windows.go — BLE NUS via tinygo/bluetooth
kvm/
engine.go — lógica KVM: mouse, teclado, clipboard, modo cliente
input/
input.go — interface InputHandler + tipos (Point, MouseEvent, KeyboardEvent)
input_windows.go — hooks Win32, SetCursorPos, ShowCursor, GetSystemMetrics
frontend/
dist/index.html — UI
wails.json — config Wails
Protocolo binário (Host → Dispositivo)
Idêntico ao projeto C#:
| Cmd | Bytes | Ação |
|---|---|---|
M dx dy |
3 | Mouse move (int8) |
W delta |
2 | Scroll (int8) |
K char |
2 | Keyboard.write |
P key |
2 | Keyboard.press |
U key |
2 | Keyboard.release |
A |
1 | releaseAll |
C L|R |
2 | Click |
D L|R |
2 | Mouse press |
E L|R |
2 | Mouse release |
T lenH lenL data |
3+N | Clipboard batch (Go-specific) |
O |
1 | LED magenta (modo cliente) |
H |
1 | LED azul (host conectado) |
G |
1 | LED verde (desconectado) |
~ |
1 | Ping → [PONG] |
Lógica KVM (engine.go)
- Entrada modo cliente: cursor atinge borda configurada → esconde cursor, warp centro, acumula deltas (técnica FPS)
- Retorno ao host: coordenadas virtuais cruzam
-ReturnThreshold(120px) na direção de entrada - Debounce: 800ms anti-bounce após troca de modo
- Mouse throttle: 40ms (~25 pacotes/s)
- Scroll:
scrollActivesuprime warp por 200ms durante scroll (evita cancelar gesto touchpad) - Clipboard: Ctrl+C no host seta
clipboardReady, Ctrl+V em modo cliente envia via comandoT(batch) - Ctrl+Alt+Del: sequência P/U com delay 50ms
Hooks Win32 (input_windows.go)
runtime.LockOSThread()obrigatório — hooks Win32 exigem message pump na mesma thread- Loop
GetMessageWmantém thread viva Uninstall()viaPostThreadMessageW(WM_QUIT)SetProcessDPIAwarechamado no init()
Build
# Dev
wails dev
# Produção
wails build
Saída: build/bin/kvmote.exe
Diferenças do projeto C#
| Aspecto | C# (WinForms) | Go (Wails) |
|---|---|---|
| UI | WinForms nativo | Webview (HTML) |
| Transporte | Serial + BLE (dual) | Só BLE (por enquanto) |
| Clipboard | char-a-char com delay | Batch via comando T |
| ClipboardMax | 500/1000 chars | 65536 chars |
| Scroll | acumulador _wheelAccum + _scrollActive | scrollActive only |
| ReturnThreshold | 15px | 120px |
| Reconexão | auto-reconnect loop | manual |
| Heartbeat/Watchdog | sim | não implementado |
⚠️ Cuidados
- Scroll touchpad:
scrollActiveescrollTimernão devem ser resetados em enter/exitClientMode - runtime.LockOSThread: nunca remover da goroutine de hooks
- isWarping flag: previne loop infinito SetCursorPos → WM_MOUSEMOVE → SetCursorPos
- Mutex ordering: engine.mu protege todo estado KVM; transport.mu protege conexão BLE