Close the serial link after each MCP board operation
VersaPadLink never closes itself; get_board_status()/load_from_board()/
write_to_board() were leaving the exclusive COM port open for the rest of
the MCP server process's lifetime after a single call. That locked out
Live-Sync, the official VersaGUI, and even the MCP server's own next call
with "busy", live-observed today after a single write_to_board() call. Each
of the three now closes the link in a finally block regardless of outcome.
Also documented in AGENTS.md: this environment can run several independent
versapad_mcp_server.py processes at once, each with its own in-memory
state, which caused a write_to_board() call to silently write blank data
from a fresh process instead of the config that had just been built up on
another one (ACK still said {"ok": true}). Recommended workaround noted
there: load_local() right before write_to_board(), and read back with
load_from_board() + get_profile() afterwards instead of trusting the ACK.
This commit is contained in:
parent
09fbd6ad96
commit
7d40fdaa60
2 changed files with 62 additions and 24 deletions
20
AGENTS.md
20
AGENTS.md
|
|
@ -71,6 +71,26 @@ Nutzerorientierte Einführung: [`README.md`](README.md).
|
|||
Funktionen bleiben direkt aufrufbar (kein `.fn`-Unterschied wie bei
|
||||
älteren FastMCP-Versionen). Tool-Liste: siehe README oder
|
||||
`MCP_INFO_TEXT` in `desktop_viewer.py`.
|
||||
- **Board-Serial-Tools schliessen den Link nach jedem Aufruf** (`get_board_status`,
|
||||
`load_from_board`, `write_to_board` — `finally: _link.close()`). Grund:
|
||||
`VersaPadLink` schliesst nie von selbst, ein einzelner Aufruf hätte sonst
|
||||
den exklusiven COM-Port dauerhaft für den Rest des MCP-Serverprozesses
|
||||
blockiert und Live-Sync/VersaGUI/den nächsten Aufruf mit "busy" ausgesperrt
|
||||
(am 2026-08-14 live so aufgetreten, siehe unten).
|
||||
- **Bug beobachtet 2026-08-14:** In diesem Agenten-Environment (Claude-Code-
|
||||
VSCode-Extension) können mehrere unabhängige `versapad_mcp_server.py`-
|
||||
Prozesse gleichzeitig laufen (bis zu 8 beobachtet, vermutlich durch
|
||||
wiederholte Tool-Ladevorgänge/Reconnects innerhalb einer Session) — jeder
|
||||
mit eigenem, nicht geteiltem In-Memory-State (`_state["combined"]`).
|
||||
Konkret beobachtet: `set_button_*`/`set_macro` + `save_local()` liefen
|
||||
korrekt auf einem Prozess, ein späterer `write_to_board()`-Aufruf landete
|
||||
aber auf einem anderen (frischen, leeren) Prozess und schrieb versehentlich
|
||||
eine leere Default-Config aufs Board, trotz `{"ok": true}`-Antwort. Fix:
|
||||
vor `write_to_board()` immer erst `load_local()` (liest die Datei frisch
|
||||
von der Platte, unabhängig davon welcher Prozess antwortet), und nach
|
||||
jedem Schreibvorgang mit `load_from_board()` + `get_profile()` gegenlesen
|
||||
statt dem ACK allein zu vertrauen — genau dieses Verify-Pattern hat den
|
||||
Fehler hier live aufgedeckt.
|
||||
|
||||
Vollständige Modulübersicht mit Zeilenreferenzen bei Bedarf direkt im Code
|
||||
nachschlagen — die Dateien sind klein genug, dass eine separate
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue