Add ready probe to esp32_connect for reliable startup
The boot event fires early in app_main before the UART command handler task is fully initialised. This means the first command after connect can get lost, causing transient ping timeouts. Now esp32_connect retries a ping (up to 5 attempts, 1s timeout each) after the boot-event wait, so it only returns "connected" when the firmware is actually responsive.
This commit is contained in:
parent
82cd0e5c9d
commit
397b164eee
@ -8,7 +8,7 @@ from typing import Any
|
|||||||
from fastmcp import FastMCP
|
from fastmcp import FastMCP
|
||||||
|
|
||||||
from ..protocol import CMD_GET_INFO, CMD_GET_STATUS, CMD_PING, CMD_RESET, Status
|
from ..protocol import CMD_GET_INFO, CMD_GET_STATUS, CMD_PING, CMD_RESET, Status
|
||||||
from ..serial_client import NotConnected, get_client, init_client
|
from ..serial_client import CommandTimeout, NotConnected, get_client, init_client
|
||||||
|
|
||||||
|
|
||||||
def register_tools(mcp: FastMCP) -> None:
|
def register_tools(mcp: FastMCP) -> None:
|
||||||
@ -51,11 +51,25 @@ def register_tools(mcp: FastMCP) -> None:
|
|||||||
except TimeoutError:
|
except TimeoutError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# Ready probe: retry ping until the firmware's command handler is up.
|
||||||
|
# The boot event fires early in app_main, before the UART command
|
||||||
|
# task is fully initialised, so the first command can get lost.
|
||||||
|
ready = False
|
||||||
|
for attempt in range(5):
|
||||||
|
try:
|
||||||
|
resp = await client.send_command(CMD_PING, timeout=1.0)
|
||||||
|
if resp.status == Status.OK:
|
||||||
|
ready = True
|
||||||
|
break
|
||||||
|
except (CommandTimeout, NotConnected):
|
||||||
|
await asyncio.sleep(0.3)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"connected": True,
|
"connected": True,
|
||||||
"port": port,
|
"port": port,
|
||||||
"baudrate": baudrate,
|
"baudrate": baudrate,
|
||||||
"boot_event": boot_received,
|
"boot_event": boot_received,
|
||||||
|
"ready": ready,
|
||||||
}
|
}
|
||||||
|
|
||||||
@mcp.tool()
|
@mcp.tool()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user