Radio: optional radio task, slot gate and measured TX lead

Three compile-time switches, all off by default:

- MESHTASTIC_RADIO_TASK (ESP32, nRF52): runs the RadioLib radio thread
  from its own FreeRTOS task, one priority above the loop and below the
  RX readout task. The task holds a recursive radio lock while the thread
  runs; loop-side entry points into the radio take it with
  RADIO_TASK_LOCK(). The static packet pool claims slots in a critical
  section. The task's log lines are queued and printed by the loop
  (MESHTASTIC_RADIO_TASK_LOG_LINES sets the depth;
  MESHTASTIC_RADIO_TASK_LOG_DIRECT writes them from the task instead),
  and no log line sits between the TX timer and SET_TX.
- MESHTASTIC_TX_SLOT_GATE_MS=<ms>: a TX with a slot parity scans only in
  the first <ms> of a slot of its parity on the frame-end grid. The timer
  fires MESHTASTIC_TX_SLOT_GATE_EARLY_SLOTS (default 2) slots early and the
  radio thread waits out the rest; a timer further ahead is set again
  (MESHTASTIC_TX_SLOT_GATE_REARM=0 scans at once instead).
- MESHTASTIC_TX_SLOT_LEAD (needs the gate): aims SET_TX
  MESHTASTIC_TX_SLOT_SET_TX_AT_MS (default 1) into the slot, starting the
  scan the measured scan-to-SET_TX time before it and firing the timer the
  measured wake latency plus MESHTASTIC_TX_SLOT_LEAD_GUARD_MS (default 1)
  before the scan. Works with the early TX stage on a CH341 host.

Co-Authored-By: Jonathan Bennett <jbennett@incomsystems.biz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REkPVFh6kvG4AZJ5A8AtM9
This commit is contained in:
Jonathan BennettandClaude Opus 5.5 committed 2026-10-10 15:25:15 +00:00
1 parent 0300d706ea
commit a33b0bbdf2
21 files changed
+644 -19

No files matched your search

+1 -1
View File
@@ -346,7 +346,7 @@ void SerialConsole::log_to_serial(const char *logLevel, const char *format, va_l
if (usingProtobufs) {
if (config.security.debug_log_api_enabled && !pauseBluetoothLogging) {
meshtastic_LogRecord_Level ll = RedirectablePrint::getLogLevel(logLevel);
auto thread = concurrency::OSThread::currentThread;
auto thread = concurrency::OSThread::current();
emitLogRecord(ll, thread ? thread->ThreadName.c_str() : "", format, arg);
}
return;