diff --git a/core/archipelago/src/mesh/meshtastic.rs b/core/archipelago/src/mesh/meshtastic.rs index f6fd1e97..cafccc89 100644 --- a/core/archipelago/src/mesh/meshtastic.rs +++ b/core/archipelago/src/mesh/meshtastic.rs @@ -217,11 +217,20 @@ impl MeshtasticDevice { path ))?; // See probe_rnode() in reticulum.rs for why: ESP32-S3 native-USB - // boards reset on a DTR/RTS transition, so deassert both and settle - // before the handshake below. + // boards (and CP2102/CH340-bridged boards wired for Arduino-style + // auto-reset) reset on a DTR/RTS transition, so deassert both and + // settle before the handshake below. 300ms is nowhere near a real + // firmware boot time (LoRa radio init alone can take longer) — + // confirmed live 2026-07-23: with every one of Reticulum/Meshcore/ + // Meshtastic's open() doing this same reset, a single auto-detect + // cycle trying multiple protocols in sequence kept re-resetting the + // board before it ever finished booting from the PREVIOUS attempt's + // reset, on both a Heltec V3 and V4, regardless of firmware family — + // a self-sustaining "never finishes booting" loop with a boot-time + // root cause hiding behind what looked like a per-protocol failure. let _ = port.set_dtr(false); let _ = port.set_rts(false); - tokio::time::sleep(Duration::from_millis(300)).await; + tokio::time::sleep(Duration::from_millis(2000)).await; info!(path = %path, baud = BAUD_RATE, "Opened Meshtastic serial port"); Ok(Self { diff --git a/core/archipelago/src/mesh/serial.rs b/core/archipelago/src/mesh/serial.rs index 8ce13f32..32f0451b 100644 --- a/core/archipelago/src/mesh/serial.rs +++ b/core/archipelago/src/mesh/serial.rs @@ -58,11 +58,20 @@ impl MeshcoreDevice { path ))?; // See probe_rnode() in reticulum.rs for why: ESP32-S3 native-USB - // boards reset on a DTR/RTS transition, so deassert both and settle - // before the handshake below. + // boards (and CP2102/CH340-bridged boards wired for Arduino-style + // auto-reset) reset on a DTR/RTS transition, so deassert both and + // settle before the handshake below. 300ms is nowhere near a real + // firmware boot time (LoRa radio init alone can take longer) — + // confirmed live 2026-07-23: with every one of Reticulum/Meshcore/ + // Meshtastic's open() doing this same reset, a single auto-detect + // cycle trying multiple protocols in sequence kept re-resetting the + // board before it ever finished booting from the PREVIOUS attempt's + // reset, on both a Heltec V3 and V4, regardless of firmware family — + // a self-sustaining "never finishes booting" loop with a boot-time + // root cause hiding behind what looked like a per-protocol failure. let _ = port.set_dtr(false); let _ = port.set_rts(false); - tokio::time::sleep(Duration::from_millis(300)).await; + tokio::time::sleep(Duration::from_millis(2000)).await; info!(path = %path, baud = BAUD_RATE, "Opened serial port");