diff --git a/platformio/commands/debug/helpers.py b/platformio/commands/debug/helpers.py index 0ec7d447..4604a861 100644 --- a/platformio/commands/debug/helpers.py +++ b/platformio/commands/debug/helpers.py @@ -125,7 +125,8 @@ def validate_debug_options(cmd_ctx, env_options): server_options["executable"] = server_options["arguments"][0] server_options["arguments"] = server_options["arguments"][1:] elif "server" in tool_settings: - server_package = tool_settings["server"].get("package") + server_options = tool_settings["server"] + server_package = server_options.get("package") server_package_dir = ( platform.get_package_dir(server_package) if server_package else None ) @@ -134,15 +135,17 @@ def validate_debug_options(cmd_ctx, env_options): with_packages=[server_package], skip_default_package=True, silent=True ) server_package_dir = platform.get_package_dir(server_package) - server_options = dict( - cwd=server_package_dir if server_package else None, - executable=tool_settings["server"].get("executable"), - arguments=[ - a.replace("$PACKAGE_DIR", server_package_dir) - if server_package_dir - else a - for a in tool_settings["server"].get("arguments", []) - ], + server_options.update( + dict( + cwd=server_package_dir if server_package else None, + executable=server_options.get("executable"), + arguments=[ + a.replace("$PACKAGE_DIR", server_package_dir) + if server_package_dir + else a + for a in server_options.get("arguments", []) + ], + ) ) extra_cmds = _cleanup_cmds(env_options.get("debug_extra_cmds")) diff --git a/platformio/commands/debug/server.py b/platformio/commands/debug/server.py index a74b1684..d50ac9d0 100644 --- a/platformio/commands/debug/server.py +++ b/platformio/commands/debug/server.py @@ -35,6 +35,7 @@ class DebugServer(BaseProcess): self._debug_port = ":3333" self._transport = None self._process_ended = False + self._ready = False @defer.inlineCallbacks def spawn(self, patterns): # pylint: disable=too-many-branches @@ -126,15 +127,7 @@ class DebugServer(BaseProcess): timeout = 10 elapsed = 0 delay = 1 - ready_delay = 0.5 - while ( - not self._process_ended - and elapsed < timeout - and ( - not self._last_activity - or not (self._last_activity < (time.time() - ready_delay)) - ) - ): + while not self._ready and not self._process_ended and elapsed < timeout: yield self.async_sleep(delay) elapsed += delay @@ -151,6 +144,14 @@ class DebugServer(BaseProcess): super(DebugServer, self).outReceived( escape_gdbmi_stream("@", data) if is_gdbmi_mode() else data ) + if self._ready: + return + ready_pattern = self.debug_options.get("server", {}).get("ready_pattern") + if ready_pattern: + self._ready = ready_pattern.encode() in data + else: + ready_delay = 0.5 + self._ready = self._last_activity < (time.time() - ready_delay) def processEnded(self, reason): self._process_ended = True