diff --git a/Framework/Core/scripts/dpl-mcp-server/dpl_mcp_server.py b/Framework/Core/scripts/dpl-mcp-server/dpl_mcp_server.py index febb1278f6045..3900a646632a1 100644 --- a/Framework/Core/scripts/dpl-mcp-server/dpl_mcp_server.py +++ b/Framework/Core/scripts/dpl-mcp-server/dpl_mcp_server.py @@ -237,6 +237,16 @@ async def get_logs(max_lines: int = 100) -> str: return "\n".join(lines) +@mcp.tool() +async def start_devices() -> str: + """Resume all stopped DPL devices (send SIGCONT). + + Use this when the workflow was started with -s (all devices paused). + """ + await _send({"cmd": "start_devices"}) + return "Sent SIGCONT to all active devices." + + @mcp.tool() async def enable_signpost(device: str, streams: list[str]) -> str: """Enable one or more signpost log streams for a DPL device. diff --git a/Framework/Core/src/StatusWebSocketHandler.cxx b/Framework/Core/src/StatusWebSocketHandler.cxx index cdf08c4f2f349..065a6f4b05b4a 100644 --- a/Framework/Core/src/StatusWebSocketHandler.cxx +++ b/Framework/Core/src/StatusWebSocketHandler.cxx @@ -13,6 +13,8 @@ #include "DPLWebSocket.h" #include "DriverServerContext.h" #include "Framework/DeviceControl.h" +#include +#include #include "Framework/DeviceController.h" #include "Framework/DeviceInfo.h" #include "Framework/DeviceMetricsInfo.h" @@ -254,6 +256,8 @@ void StatusWebSocketHandler::frame(char const* data, size_t s) handleSubscribeLogs(deviceName); } else if (cmd == "unsubscribe_logs") { handleUnsubscribeLogs(deviceName); + } else if (cmd == "start_devices") { + handleStartDevices(); } else if (cmd == "enable_signpost") { handleEnableSignpost(deviceName, extractArrayField(msg, "streams")); } else if (cmd == "disable_signpost") { @@ -441,6 +445,15 @@ size_t StatusWebSocketHandler::findDeviceIndex(std::string_view name) const return SIZE_MAX; } +void StatusWebSocketHandler::handleStartDevices() +{ + for (auto const& info : *mContext.infos) { + if (info.active) { + kill(info.pid, SIGCONT); + } + } +} + void StatusWebSocketHandler::handleEnableSignpost(std::string_view deviceName, std::string_view streamsArr) { if (streamsArr.empty()) { diff --git a/Framework/Core/src/StatusWebSocketHandler.h b/Framework/Core/src/StatusWebSocketHandler.h index 3b040d68e26f0..fb2f0beebbec2 100644 --- a/Framework/Core/src/StatusWebSocketHandler.h +++ b/Framework/Core/src/StatusWebSocketHandler.h @@ -95,6 +95,7 @@ struct StatusWebSocketHandler : public WebSocketHandler { void handleUnsubscribe(std::string_view deviceName, std::string_view metricsJson); void handleSubscribeLogs(std::string_view deviceName); void handleUnsubscribeLogs(std::string_view deviceName); + void handleStartDevices(); void handleEnableSignpost(std::string_view deviceName, std::string_view streamsArr); void handleDisableSignpost(std::string_view deviceName, std::string_view streamsArr); size_t findDeviceIndex(std::string_view name) const;