mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 18:43:51 +00:00
feat: Pluto support in headless daemon (connect/autostart/discover/dev_add) + headless audio
The headless daemon (ewsdrd) only ever built HPSDR devices, so Pluto could not be used: backend is chosen by Dev.Kind and Pluto opens by URI, neither of which the daemon propagated. Also local audio played on the host and web Discover never probed network Plutos. Shared, backend-agnostic helpers in TRadioController (used by GUI + daemon): - ResolveDevice(IP): discovered->saved lookup restoring Kind/URI/Serial/ BoardType/MAC. MainForm.ResolveDevice now delegates here. - AddSavedDevice(name, addr): web dev_add saves Pluto when addr has a URI scheme (ip:/usb:/local:), else HPSDR. Both web hosts use it. - SeedPlutoProbeFromSaved: seed network-probe URIs from saved Plutos (no mDNS -> a network Pluto is only found by direct URI probe). - LocalAudioEnabled flag (GUI=True): when False the local sound card is neither opened nor written; RX audio goes only to web (OnAudioConsume). DeviceStore.AutoStartDevice(out Dev): full autostart record (Kind/URI/ Serial) so a saved Pluto (URI-addressed, empty IPAddress on USB) can autostart. Daemon (ewsdrd.lpr): LocalAudioEnabled:=False; SyncConnect via ResolveDevice; autostart via AutoStartDevice; SyncDiscover seeds probe URIs then Discover; SyncDevAdd via AddSavedDevice. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+27
-26
@@ -28,7 +28,7 @@ uses
|
||||
{$IFDEF UNIX}cthreads, BaseUnix,{$ENDIF}
|
||||
Classes, SysUtils,
|
||||
RadioController, WebServer, WebAdapter,
|
||||
HPSDRNetwork, Settings, WDSP, PlatformUtils;
|
||||
HPSDRNetwork, Settings, WDSP, PlatformUtils, DeviceStore;
|
||||
|
||||
const
|
||||
DAEMON_SPEC_WIDTH = 1024; // ширина спектра для StartRunning (web-буфер = 1024)
|
||||
@@ -66,6 +66,7 @@ type
|
||||
// Sync* — выполняются в главном потоке через DoInvoke.
|
||||
procedure SyncConnect;
|
||||
procedure SyncDisconnect;
|
||||
procedure SyncDiscover;
|
||||
procedure SyncRun;
|
||||
procedure SyncDevAdd;
|
||||
procedure SyncDevRemove;
|
||||
@@ -112,6 +113,7 @@ var
|
||||
begin
|
||||
inherited Create;
|
||||
FCtrl := TRadioController.Create; // создаёт FSettings + FDeviceStore (LoadSaved)
|
||||
FCtrl.LocalAudioEnabled := False; // headless: звук только в web, не на карту хоста
|
||||
FCtrl.OnInvoke := @DoInvoke;
|
||||
FCtrl.OnStateChanged := @OnState;
|
||||
|
||||
@@ -298,7 +300,7 @@ procedure THeadlessHost.WebConnect(const IP: string);
|
||||
begin FsStr1 := IP; FCtrl.Invoke(@SyncConnect); end;
|
||||
|
||||
procedure THeadlessHost.WebDiscover;
|
||||
begin FCtrl.Invoke(@FCtrl.Discover); end; // Discover уже headless
|
||||
begin FCtrl.Invoke(@SyncDiscover); end;
|
||||
|
||||
procedure THeadlessHost.WebDisconnect;
|
||||
begin FCtrl.Invoke(@SyncDisconnect); end;
|
||||
@@ -315,25 +317,11 @@ begin FsInt := Idx; FCtrl.Invoke(@SyncDevAutoStart); end;
|
||||
// --- Sync* (главный поток) ---
|
||||
|
||||
procedure THeadlessHost.SyncConnect;
|
||||
var
|
||||
Dev: THPSDRDevice;
|
||||
i: Integer;
|
||||
begin
|
||||
if FCtrl.FNetwork.Connected then Exit;
|
||||
FillChar(Dev, SizeOf(Dev), 0);
|
||||
Dev.IPAddress := FsStr1;
|
||||
// BoardType не приходит при Connect — берём из discovery, иначе из saved по IP.
|
||||
i := FCtrl.FDeviceStore.FindDiscoveredByIP(FsStr1);
|
||||
if i >= 0 then
|
||||
Dev.BoardType := FCtrl.FDeviceStore.Discovered(i).BoardType
|
||||
else
|
||||
for i := 0 to FCtrl.FDeviceStore.SavedCount - 1 do
|
||||
if FCtrl.FDeviceStore.Saved(i).IPAddress = FsStr1 then
|
||||
begin
|
||||
Dev.BoardType := FCtrl.FDeviceStore.Saved(i).BoardType;
|
||||
Break;
|
||||
end;
|
||||
ConnectTo(Dev);
|
||||
// Kind/URI/Serial/BoardType при Connect не приходят — восстанавливаем из store
|
||||
// (discovered→saved). Без Kind/URI бэкенд бы выбрался HPSDR, и Pluto не открылся.
|
||||
ConnectTo(FCtrl.ResolveDevice(FsStr1));
|
||||
end;
|
||||
|
||||
procedure THeadlessHost.SyncDisconnect;
|
||||
@@ -345,6 +333,15 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure THeadlessHost.SyncDiscover;
|
||||
begin
|
||||
// Сетевой Pluto без mDNS находится только прямым probe URI — сидируем список из
|
||||
// сохранённых Pluto (в GUI это делает BuildProbeURIs). Без этого Discover видит
|
||||
// лишь HPSDR-broadcast и USB-Pluto, а сетевые Pluto — никогда.
|
||||
FCtrl.SeedPlutoProbeFromSaved;
|
||||
FCtrl.Discover;
|
||||
end;
|
||||
|
||||
procedure THeadlessHost.SyncRun;
|
||||
begin
|
||||
// set_run:true бессмыслен без выбранного устройства (web стартует через connect);
|
||||
@@ -357,7 +354,7 @@ begin
|
||||
end;
|
||||
|
||||
procedure THeadlessHost.SyncDevAdd;
|
||||
begin FCtrl.FDeviceStore.AddSaved(FsStr1, FsStr2, 0); PushDeviceList; end;
|
||||
begin FCtrl.AddSavedDevice(FsStr1, FsStr2); PushDeviceList; end;
|
||||
|
||||
procedure THeadlessHost.SyncDevRemove;
|
||||
begin FCtrl.FDeviceStore.RemoveSaved(FsInt); PushDeviceList; end;
|
||||
@@ -374,7 +371,7 @@ procedure THeadlessHost.Run;
|
||||
var
|
||||
WebCfg: TWebSettings;
|
||||
Dev: THPSDRDevice;
|
||||
AutoIP: string;
|
||||
AutoDev: TSavedDevice;
|
||||
lastPush, nowMs: QWord;
|
||||
begin
|
||||
FCtrl.FSettings.LoadWebSettings(WebCfg);
|
||||
@@ -391,13 +388,17 @@ begin
|
||||
// не перетрётся обратно в True.
|
||||
FRunning := True;
|
||||
|
||||
// Autostart — подключаемся сразу к отмеченному устройству.
|
||||
AutoIP := FCtrl.FDeviceStore.AutoStartIP;
|
||||
if AutoIP <> '' then
|
||||
// Autostart — подключаемся сразу к отмеченному устройству. Берём полную запись
|
||||
// (Kind/URI/Serial), иначе Pluto не подключить: бэкенд выбирается по Kind, USB-
|
||||
// Pluto открывается по URI ('usb:..') и не имеет IPAddress.
|
||||
if FCtrl.FDeviceStore.AutoStartDevice(AutoDev) then
|
||||
begin
|
||||
FillChar(Dev, SizeOf(Dev), 0);
|
||||
Dev.IPAddress := AutoIP;
|
||||
Dev.BoardType := FCtrl.FDeviceStore.AutoStartBoardType;
|
||||
Dev.Kind := AutoDev.Kind;
|
||||
Dev.IPAddress := AutoDev.IPAddress;
|
||||
Dev.URI := AutoDev.URI;
|
||||
Dev.Serial := AutoDev.Serial;
|
||||
Dev.BoardType := AutoDev.BoardType;
|
||||
ConnectTo(Dev);
|
||||
end
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user