mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 18:43:51 +00:00
7a554eb04e0df708342df1abed92b1ec9a25a734
ReadTelemetry делал 5-6 синхронных iio_channel_attr_read_* — каждое это USB round-trip, вместе ~30 мс. Звался из MeterTimerTick, то есть прямо в главном потоке, дважды в секунду (POLL_MS=500). Замер зонным профайлером: тик метра занимал 5633 мкс настенного времени при пиках до 51 мс, тогда как CPU-времени в нём было всего 140 мкс — чистое ожидание USB, ронявшее кадры. Опрос переехал в TPlutoTeleThread: он раз в 500 мс читает те же атрибуты и публикует снимок под FTeleLock. ReadTelemetry теперь только отдаёт снимок и никогда не блокирует, поэтому RadioController.ServicePlutoTelemetry и MainForm.MeterTimerTick не менялись — вся фильтрация температуры на месте. Прежнее блокирующее тело стало PollTelemetryBlocking (только из потока). Конкуренция за контекст libiio не выросла: UI-поток и раньше читал атрибуты параллельно с iio_buffer_refill в RX-потоке. Сменился лишь тот, кто ждёт. StopTelemetry идёт первой строкой Disconnect — до iio_context_destroy, иначе поток продолжил бы читать атрибуты разрушенного контекста. Результат: ui.meter_tick 5633 -> 110 мкс. Значение телеметрии теперь может отставать до секунды (троттл контроллера + период потока) — на 10-герцовом индикаторе температуры это незаметно. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…
Languages
Pascal
96.4%
Python
2.9%
Shell
0.6%