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
+36
View File
@@ -95,6 +95,7 @@ type
procedure SendFullHP; override;
procedure SendPTT(Active: Boolean); override;
procedure SetRxGain(ModeIdx: Integer; GainDb: Integer); override;
function ReadTelemetry(out TempC, RSSIdB: Double): Boolean; override;
end;
// Стабильный 6-байтовый ключ (synthetic MAC) из serial/URI — для per-device
@@ -578,4 +579,39 @@ begin
if FConnected then ApplyGain;
end;
function TPlutoBackend.ReadTelemetry(out TempC, RSSIdB: Double): Boolean;
// Опрос аппаратной телеметрии ad9361-phy (вызывается контроллером, не из RX-потока):
// temp0/input — температура чипа в миллиградусах C (longlong);
// voltage0/rssi — RSSI входного тракта в дБ (double; строка вида '12.34 dB',
// libiio парсит ведущее число). Валиден только во время приёма.
var
Ch: Piio_channel;
raw: clonglong;
d: cdouble;
begin
TempC := TELEMETRY_NONE;
RSSIdB := TELEMETRY_NONE;
Result := False;
if (not FConnected) or (FPhy = nil) or (not IIOLoaded) then Exit;
Ch := iio_device_find_channel(FPhy, 'temp0', 0);
if (Ch <> nil) and (iio_channel_attr_read_longlong(Ch, 'input', raw) = 0) then
begin
TempC := raw / 1000.0;
Result := True;
end;
// RSSI имеет смысл только при активном RX-стриме (иначе чтение даёт ошибку/мусор).
if FStreaming then
begin
Ch := iio_device_find_channel(FPhy, 'voltage0', 0);
if (Ch <> nil) and Assigned(iio_channel_attr_read_double)
and (iio_channel_attr_read_double(Ch, 'rssi', d) = 0) then
begin
RSSIdB := d;
Result := True;
end;
end;
end;
end.