fix(cat): align Andromeda panel mapping with real G2 hardware (Thetis)

Button/encoder indices follow Thetis MakeNewAndromedaDataset (our 0-based
index = Thetis Number - 1), verified against andromeda_test/AndDecode.pas.
The old map assumed sequential 0,1,2.. and truncated at 32; the real panel
sends sparse indices up to 47.

- AndromedaMap: AND_MAX_BUTTONS 32->48, renumbered button/encoder tables;
  new actions abVFOAtoB/abVFOBtoA/abVFOLock/abStartStop/abShift.
- RadioController: VFO Lock (FVfoLock, rfVfoLock, SetVfoLock, gate in
  TuneActiveBy).
- AndromedaPanel: wire A>B/B>A/SDR-ON/Lock; Shift band-keypad layer
  (#28 latch, #29..39 -> SetBand 160m..6m, non-sticky); aiVFOLock/aiShift
  indicators.
- Filter High/Low (#4/#5) left as width approximation per decision.
- doc/ANDROMEDA.md updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-29 16:11:12 +03:00
co-authored by Claude Opus 4.8
parent 2d7290e44d
commit 0e550dd9f9
4 changed files with 179 additions and 53 deletions
+13 -1
View File
@@ -60,7 +60,7 @@ type
// Поле, которое изменилось — для гранулярных уведомлений наружу.
TRadioField = (
rfVfoA, rfVfoB, rfActiveVfo,
rfVfoA, rfVfoB, rfActiveVfo, rfVfoLock,
rfMode, rfFilter, rfFilterBW,
rfAGCMode, rfAGCTop,
rfRxGain, // Pluto: hw-gain (auto/manual dB)
@@ -217,6 +217,7 @@ type
FTransmitting: Boolean;
FTuning: Boolean;
FSplitTxB: Boolean;
FVfoLock: Boolean; // блокировка перестройки VFO (Andromeda Lock)
FDisplayDuplex: Boolean;
// QO-100 full-duplex self-monitor: True — RX-аудио глушится на TX (по умолч.),
// False — слышим свой downlink со спутника при передаче. Кнопка RX MUTE.
@@ -515,6 +516,7 @@ type
procedure SetMOX(On_: Boolean);
procedure SetTune(On_: Boolean); // TUN
procedure SetSplit(TxOnB: Boolean); // split: TX на VFO-B (иначе VFO-A)
procedure SetVfoLock(On_: Boolean); // блокировка перестройки VFO
// FM
procedure SetFMStep(Idx: Integer);
@@ -1899,6 +1901,7 @@ end;
procedure TRadioController.TuneActiveBy(DeltaHz: Double);
begin
if FVfoLock then Exit; // VFO заблокирован — перестройку игнорируем
if FActiveVfo = 0 then SetVfoA(FVfoA + DeltaHz)
else SetVfoB(FVfoB + DeltaHz);
end;
@@ -2712,6 +2715,15 @@ begin
Changed(rfActiveVfo);
end;
procedure TRadioController.SetVfoLock(On_: Boolean);
// VFO Lock: пока включён, относительная перестройка (TuneActiveBy — энкодер VFO
// панели, CAT UP/DN) игнорируется. Подсветка — индикатор aiVFOLock (#11).
begin
if FVfoLock = On_ then Exit;
FVfoLock := On_;
Changed(rfVfoLock);
end;
procedure TRadioController.SetFMRpt(Dir: Integer);
begin
FFMRptDir := Dir;