ReplayPacer (MsgListener+MsgTalker) sits between packetizer output and
downstream listeners; sleeps after each complete NMEA/UBX frame before
forwarding. FileBackend no longer owns the delay — it reads as fast as
possible and the pacer provides back-pressure on the same thread.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ConnectionConfig: new file_path and delay fields
- ConnectionRow: File page with path input, Browse button, delay
spinner (0–10 s), and auto-fill of receiver-ID from filename
- ReceiverManager.connect_receiver: FileBackend wired for 'file' type;
UBX poll timer skipped for file sources
- FileBackend.register_xcvr: fallback to first unoccupied entry when
name does not match filename pattern
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>