fd2e3e0e1ff146f3d23ca60a23be091e2817eb61
2
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
ca833d944c |
Fix serial protobuf corruption on short USB CDC writes (#10976)
* Fix serial protobuf corruption on short writes SerialConsole shared raw debug output and framed protobuf traffic on one HWCDC stream. Raw text could interleave inside an active frame when API logging was disabled. Separately, HWCDC deliberately returns a short write after bounded backpressure; StreamAPI abandoned that frame after PhoneAPI had already advanced, so the next 0x94c3 header landed inside the previous declared payload. Suppress all unframed output after protobuf mode starts and honor the existing config-replay log pause. For HWCDC, retain short frame tails in the persistent tx buffers and finish them on later loop passes before dequeuing another FromRadio packet. Logs remain best-effort and only start when their complete frame fits; main packets are deferred rather than dropped if a synchronous log is pending. Do not call HWCDC flush for framed serial output, since its no-progress path can discard queued bytes. TCP and non-HWCDC transports keep their existing behavior. Validated on Cardputer ADV (200-node DB) and Heltec Tracker V2: 400 initial full-DB sessions plus 140 final sessions across both API-log settings, zero malformed frames/timeouts/incomplete DBs; 2-20s forced reader stalls resume with complete DBs; abrupt stalled-client replacement 5/5 per board; 150s post-close reboot counts stable. Builds pass for Cardputer, Heltec, tbeam, and rak4631. * Add serial frame continuation regression tests Extract the HWCDC pending/deferred frame state machine into a small transport-independent helper so native tests exercise the same production logic used by SerialConsole. Keep framing, persistent buffer ownership and locking in SerialConsole. Cover short-tail continuation, deferred main-frame ordering, best-effort log admission, bounded zero-progress calls, generic StreamAPI failure semantics, PhoneAPI advancement gating, framed-log gating and raw output suppression. The coverage suite passes 31/31 suites and 582/582 tests. * Address review: guard flush, assert deferred invariant, dedup framing - Make SerialConsole::flush() a no-op in protobuf mode: HWCDC::flush()'s no-progress path discards queued TX bytes, which would tear a framed stream when the sleep path flushes with a stalled host. - Assert the single required-frame producer invariant in StreamFrameWriter::writeFrame() instead of silently dropping a second required frame. - Hoist 0x94C3 header construction into StreamAPI::buildFrameHeader() so SerialConsole no longer re-hardcodes the framing constants. * Test retained serial tail across client replacement Model a replacement client arriving while an older required frame has an unwritten tail. Require the old frame to complete before the new frame starts, so a new 0x94C3 header can never land inside the old declared payload. * Document serial frame APIs and regression tests Add concise Doxygen comments for the frame continuation hooks, production helper, native test doubles, and regression scenarios. Document why retained frame tails intentionally survive client disconnects: HWCDC may still hold the accepted prefix, so dropping metadata could insert a new frame header inside the old declared payload. |
||
|
|
144b07986b |
Fix ESP32-S3 USB CDC: post-disconnect task-WDT reboot from blocking console log writes (#10956)
* Fix ESP32-S3 USB CDC: post-disconnect task-WDT reboot from blocking console log writes When a serial API client disconnects (USB cable still attached), the host stops draining the USB-Serial/JTAG CDC buffer. The next raw-text debug log write can then block the main loop task indefinitely (measured: a single write blocked 52.4 s). The loop task stops feeding the app task watchdog (APP_WATCHDOG_SECS = 90 s, trigger_panic), so the device reboots with esp_reset_reason = ESP_RST_TASK_WDT ~97 s after every serial disconnect. On 2.7.x (arduino-esp32 2.x / IDF 4.4) the reboot also re-enumerated USB; since the Arduino 3.x migration the reboot is silent (USB stays enumerated), making it look like a random reboot ~90 s after using the CLI. Fix: on USB CDC targets, keep console TX in non-blocking mode (txTimeout 0, drop-oldest) whenever no API client is provably alive, and restore the normal bounded timeout while a client is connected so protobuf API frames are never truncated. Toggle points: boot, handleToRadio (host sent bytes), and onConnectionChanged (set non-blocking before disconnect handling emits more log lines to a dead port). Repro/validation on HELTEC_WIRELESS_TRACKER_V2 (macOS + Linux hosts): open+close any meshtastic-python session, wait 150 s: reboot_count +1 every time on unpatched builds; flat with this fix. Max observed log write stall drops from 52405 ms to 30 ms. * Condense comments per review feedback --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com> |