feat: Pluto board name + hardware telemetry in status bar

- Status bar / web now show Pluto/LibreSDR model + serial instead of
  "Unknown Board" (BoardDisplayName in controller; UI just renders it).
- Field 3 shows AD936x chip temperature + RX RSSI for Pluto (no PA →
  Supply only for openHPSDR). Polled via backend.ReadTelemetry (~2 Hz),
  filtered for sensor glitches (plausibility window + slew-limit, with
  anti-stick) — fixes rare bogus -15°C readings.
- Add libiio binding iio_channel_attr_read_double.
- Remove stale root pluto_integration.MD (superseded by
  doc/PLUTO_INTEGRATION_PLAN.md).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-19 11:31:27 +03:00
co-authored by Claude Opus 4.8
parent 4d253909ca
commit 1321e415f7
8 changed files with 199 additions and 522 deletions
+19
View File
@@ -73,6 +73,13 @@ type
PRadioDevice = ^TRadioDevice;
TRadioDeviceArray = array of TRadioDevice;
const
// Признак «значение телеметрии недоступно» (ReadTelemetry). Заведомо вне
// физического диапазона температур/RSSI.
TELEMETRY_NONE = -1.0E9;
type
// Колбэки данных (вызываются из рабочих потоков бэкенда).
TOnDeviceFound = procedure(const Dev: TRadioDevice) of object;
TOnDDCIQPacket = procedure(DDCIndex: Integer;
@@ -143,6 +150,11 @@ type
procedure SendSpeakerAudio(const Left, Right: array of Single; Count: Integer); virtual;
procedure SetSpeakerAudio(AEnabled: Boolean); virtual;
// Аппаратная телеметрия, не приходящая в потоке (опрашивается контроллером).
// Pluto/AD936x: температура чипа (°C) и RSSI приёмника (дБ). HPSDR — нет такой
// (использует HP-status), возвращает False. Недоступные значения = TELEMETRY_NONE.
function ReadTelemetry(out TempC, RSSIdB: Double): Boolean; virtual;
// ---- Свойства состояния (полиморфные через виртуальные геттеры) ----
property Connected: Boolean read GetConnected;
property Running: Boolean read GetRunning;
@@ -231,4 +243,11 @@ procedure TRadioBackend.SetSpeakerAudio(AEnabled: Boolean);
begin
end;
function TRadioBackend.ReadTelemetry(out TempC, RSSIdB: Double): Boolean;
begin
TempC := TELEMETRY_NONE;
RSSIdB := TELEMETRY_NONE;
Result := False;
end;
end.