feat: QO-100 beacon bulletin text display (Phase C)

Decode and show the AO-40 frame payload as text in the beacon scope window.

- RadioController.GetBeaconFrame exposes the latest 256-byte frame.
- BeaconScopeForm: poll the frame counter; on each new frame, parse the
  payload (drop trailing 2-byte CRC, printable ASCII, 64-char lines, as in
  gr-satellites qo100.parse) and append to a scrolling read-only memo.
- Window widened/heightened; constellation size capped to leave room.

Frame format verified offline against a real on-air capture: the decoder
produces the live QO-100 AMSAT bulletin text (RS errors=0).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-22 10:30:36 +03:00
co-authored by Claude Opus 4.8
parent afc8775ddb
commit 8e4106b822
2 changed files with 80 additions and 11 deletions
+7 -1
View File
@@ -49,7 +49,7 @@ interface
uses
Classes, SysUtils, Math,
HPSDRProtocol, HPSDRNetwork, RadioBackend, PlutoBackend, IIOBindings,
WDSPEngine, AudioOutput, AudioInput, BeaconDecoder,
WDSPEngine, AudioOutput, AudioInput, BeaconDecoder, BeaconFEC,
Settings, ChannelStore, FMRepeater, BoardUtils, DeviceStore;
type
@@ -503,6 +503,7 @@ type
procedure SetBeaconDecodeInvert(On_: Boolean); // зеркальный baseband вкл/выкл
function BeaconDecodeInvert: Boolean;
function GetBeaconScope(out S: TBeaconScope): Boolean;
function GetBeaconFrame(out Frame: TBeaconFrame; out RSErrors: Integer): Boolean;
// Отображение / приём
procedure SetCTun(On_: Boolean);
@@ -1473,6 +1474,11 @@ begin
else FillChar(S, SizeOf(S), 0);
end;
function TRadioController.GetBeaconFrame(out Frame: TBeaconFrame; out RSErrors: Integer): Boolean;
begin
Result := Assigned(FBeaconDec) and FBeaconDec.GetLastFrame(Frame, RSErrors);
end;
procedure TRadioController.ApplyModeFilter;
var
Lo, Hi, Half: Integer;