mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
feat(cat): TX-тракт и телеграф; ревизия алиасов, подписей и валидации
Со времён прошлой правки CAT в EWSDR появились TX-профили со всей «звуковой» цепью и телеграф — команды, которые doc/CAT_STATUS.md объявлял незакрываемыми, стали рабочими. TX-тракт: MG/ZZMG (усиление микрофона), MO/ZZMO + ZZTM (монитор передачи и его уровень), ZZTL/ZZTH (кромки TX-фильтра), PR/ZZPK + ZZPL (речевой компрессор), ZZET + ZZEB (эквалайзер), ZZTO + ZZTU (мощность и кнопка настройки), ZZUT (2TON), ZZLI + ZZUS (PureSignal), ZZTP (выбор профиля), ZZFD (девиация). Телеграф (были проброшены только KS/KY/ZZKS/ZZKY): ZZCS скорость, ZZCL тон, ZZCI иамбик, ZZCB/ZZCD break-in и hang-time, ZZCM сайдтон. Ревизия подписей. Комментарии у заглушек писались по буквам кода, а не по Thetis, и врали примерно в 150 местах. Хуже: часть РАБОТАЮЩИХ команд была привязана не к своей функции — внешний софт получал осмысленный, но неверный ответ, что хуже честной заглушки. Всё сверено с CATCommands.cs: ZZMA режим -> кнопка MUT ZZNN заглушка -> SNB ZZRX переход в RX -> аттенюатор RX1 ZZNS SNB -> кнопка NR2 ZZRV версия ПО -> напряжение питания ZZVS алиас ZZSP -> операции с VFO ZZMV индекс режима-> счётчик памяти ZZBM режим -> VFO B вниз на nn ZZKM режим кейера -> запуск CW-макроса ZZFT всегда A -> TX-частота (split) ZZFI/ZZBS были алиасами -> сами держат фильтр и диапазон Ошибочные алиасы на громкость/мощность сняты (ZZAA ZZVG ZZOA ZZAP ZZDN ZZAC ZZBI ZZMB ZZVA ZZPD ZZPO ZZQM ZZSR ZZRD ZZRU) — теперь честные заглушки с указанием, где функция живёт на самом деле. Кенвудовские команды сверены отдельно, покрытие полное (все 40 из Thetis), ширины полей совпадают с CATStructs.xml. Исправлено: SM отдавал 4 цифры вместо 5; RD/RU перестраивали VFO, хотя это RIT; KY не срезал набивку поля пробелами и гнал её в эфир паузами; CT принимала любой символ и «CT9;» молча гасил тон; OF/OS несли реализацию сами, а ZZOT/ZZOS были заглушками — клиент Thetis обращается как раз к ZZ* и не получал ничего. Валидация. Команды без параметров не проверяли суффикс: «TXanything;» доходил до CmdTX и ПОДНИМАЛ ПЕРЕДАЧУ (так же RX UP DN BD BU QI RC ID IF) — эталон отбраковывает лишний суффикс в парсере, у нас теперь список в IsParamless. ZZTX поднимал передачу на любом значении кроме нуля («2=TUNE» — выдумка). ZZFL/ZZFH принимали поле любой длины от 4 символов и через StrToIntDef молча схлопывали кромку в ноль. ZZMG принимал 1-2 символа. KY/ZZKY не ограничивали текст 25 символами, и очередь передачи могла расти произвольно. Осознанные отклонения от эталона сведены в отдельную таблицу документа: ZZBS (индекс диапазона вместо кода), ZZMN (имя режима вместо пресетов фильтров), ZZST (шаг FM вместо размера шага настройки), ZZCD (потолок 2000 мс — наш предел, он же в поле HangDelay пакета DUC Specific). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+400
@@ -39,6 +39,10 @@ type
|
||||
FSyncInt: Integer;
|
||||
FSyncBool: Boolean;
|
||||
FSyncStr: string;
|
||||
// Какое поле TX-настроек правит SyncTXField (значение — в FSyncInt/FSyncBool).
|
||||
FSyncTXFld: (txfMicGain, txfFiltLow, txfFiltHigh, txfCompOn, txfCompGain,
|
||||
txfEQOn, txfTUNLevel, txfFMDev);
|
||||
FSyncEQ: TCATEQGains;
|
||||
|
||||
// ── Геттеры (CAT-поток, read-only) ──
|
||||
function GetVfoA: Double;
|
||||
@@ -96,6 +100,76 @@ type
|
||||
procedure SyncCWSpeed;
|
||||
procedure SyncCWKeyerMode;
|
||||
procedure SyncCWText;
|
||||
// ── Телеграф: тон, break-in, сайдтон ──
|
||||
function GetCWPitch: Integer;
|
||||
procedure SetCWPitch(V: Integer);
|
||||
function GetCWBreakIn: Boolean;
|
||||
procedure SetCWBreakIn(V: Boolean);
|
||||
function GetCWHangTime: Integer;
|
||||
procedure SetCWHangTime(V: Integer);
|
||||
function GetCWMonitor: Boolean;
|
||||
procedure SetCWMonitor(V: Boolean);
|
||||
procedure SyncCWPitch;
|
||||
procedure SyncCWBreakIn;
|
||||
procedure SyncCWHangTime;
|
||||
procedure SyncCWMonitor;
|
||||
// ── TX-тракт (активный TX-профиль + вкладка Transmit) ──
|
||||
function GetMicGain: Integer;
|
||||
procedure SetMicGain(V: Integer);
|
||||
function GetTXFilterLow: Integer;
|
||||
procedure SetTXFilterLow(V: Integer);
|
||||
function GetTXFilterHigh: Integer;
|
||||
procedure SetTXFilterHigh(V: Integer);
|
||||
function GetCompOn: Boolean;
|
||||
procedure SetCompOn(V: Boolean);
|
||||
function GetCompGain: Integer;
|
||||
procedure SetCompGain(V: Integer);
|
||||
function GetTXEQOn: Boolean;
|
||||
procedure SetTXEQOn(V: Boolean);
|
||||
function GetTXEQ(out Gains: TCATEQGains): Integer;
|
||||
procedure SetTXEQ(NumBands: Integer; const Gains: TCATEQGains);
|
||||
function GetTUNLevel: Integer;
|
||||
procedure SetTUNLevel(V: Integer);
|
||||
function GetFMDeviation: Integer;
|
||||
procedure SetFMDeviation(V: Integer);
|
||||
function GetTXProfile: Integer;
|
||||
procedure SetTXProfile(V: Integer);
|
||||
function GetTXProfileCount: Integer;
|
||||
function GetMonitorOn: Boolean;
|
||||
procedure SetMonitorOn(V: Boolean);
|
||||
function GetMonitorLevel: Integer;
|
||||
procedure SetMonitorLevel(V: Integer);
|
||||
function GetTuning: Boolean;
|
||||
procedure SetTuning(V: Boolean);
|
||||
function GetTwoTone: Boolean;
|
||||
procedure SetTwoTone(V: Boolean);
|
||||
function GetPureSignal: Boolean;
|
||||
procedure SetPureSignal(V: Boolean);
|
||||
procedure DoPSSingleCal;
|
||||
// ── Приёмник и сервис ──
|
||||
function GetMuted: Boolean;
|
||||
procedure SetMuted(V: Boolean);
|
||||
function GetAtten: Integer;
|
||||
procedure SetAtten(V: Integer);
|
||||
function GetSupplyVolts: Double;
|
||||
procedure DoVfoSwap;
|
||||
function GetMemoryCount: Integer;
|
||||
procedure SendCWMacro(V: Integer);
|
||||
procedure SyncMuted;
|
||||
procedure SyncAtten;
|
||||
procedure SyncVfoSwap;
|
||||
procedure SyncCWMacro;
|
||||
// Правка одного поля TX-настроек: копия записи, поле, SetTXSettings. Так же
|
||||
// это делает вкладка Transmit — она тоже отдаёт запись целиком.
|
||||
procedure SyncTXField;
|
||||
procedure SyncTXEQ;
|
||||
procedure SyncTXProfile;
|
||||
procedure SyncMonitorOn;
|
||||
procedure SyncMonitorLevel;
|
||||
procedure SyncTuning;
|
||||
procedure SyncTwoTone;
|
||||
procedure SyncPureSignal;
|
||||
procedure SyncPSSingleCal;
|
||||
procedure DoBandUp;
|
||||
procedure DoBandDown;
|
||||
procedure DoTuneUp;
|
||||
@@ -234,6 +308,59 @@ begin
|
||||
Ctx.SetCWKeyerMode := @SetCWKeyerMode;
|
||||
Ctx.SendCWText := @SendCWText;
|
||||
Ctx.CWTextBusy := @GetCWTextBusy;
|
||||
// Телеграф: тон (ZZCL), break-in и его hang-time (ZZCB/ZZCD), сайдтон (ZZCM).
|
||||
Ctx.GetCWPitch := @GetCWPitch;
|
||||
Ctx.SetCWPitch := @SetCWPitch;
|
||||
Ctx.GetCWBreakIn := @GetCWBreakIn;
|
||||
Ctx.SetCWBreakIn := @SetCWBreakIn;
|
||||
Ctx.GetCWHangTime := @GetCWHangTime;
|
||||
Ctx.SetCWHangTime := @SetCWHangTime;
|
||||
Ctx.GetCWMonitor := @GetCWMonitor;
|
||||
Ctx.SetCWMonitor := @SetCWMonitor;
|
||||
// TX-тракт: усиление микрофона, кромки TX-фильтра, компрессор, эквалайзер,
|
||||
// TUN/2TON/PS и выбор TX-профиля.
|
||||
Ctx.GetMicGain := @GetMicGain;
|
||||
Ctx.SetMicGain := @SetMicGain;
|
||||
Ctx.GetTXFilterLow := @GetTXFilterLow;
|
||||
Ctx.SetTXFilterLow := @SetTXFilterLow;
|
||||
Ctx.GetTXFilterHigh := @GetTXFilterHigh;
|
||||
Ctx.SetTXFilterHigh := @SetTXFilterHigh;
|
||||
Ctx.GetCompOn := @GetCompOn;
|
||||
Ctx.SetCompOn := @SetCompOn;
|
||||
Ctx.GetCompGain := @GetCompGain;
|
||||
Ctx.SetCompGain := @SetCompGain;
|
||||
Ctx.GetTXEQOn := @GetTXEQOn;
|
||||
Ctx.SetTXEQOn := @SetTXEQOn;
|
||||
Ctx.GetTXEQ := @GetTXEQ;
|
||||
Ctx.SetTXEQ := @SetTXEQ;
|
||||
Ctx.GetTUNLevel := @GetTUNLevel;
|
||||
Ctx.SetTUNLevel := @SetTUNLevel;
|
||||
Ctx.GetFMDeviation := @GetFMDeviation;
|
||||
Ctx.SetFMDeviation := @SetFMDeviation;
|
||||
Ctx.GetTXProfile := @GetTXProfile;
|
||||
Ctx.SetTXProfile := @SetTXProfile;
|
||||
Ctx.GetTXProfileCount := @GetTXProfileCount;
|
||||
Ctx.GetMonitorOn := @GetMonitorOn;
|
||||
Ctx.SetMonitorOn := @SetMonitorOn;
|
||||
Ctx.GetMonitorLevel := @GetMonitorLevel;
|
||||
Ctx.SetMonitorLevel := @SetMonitorLevel;
|
||||
Ctx.GetTuning := @GetTuning;
|
||||
Ctx.SetTuning := @SetTuning;
|
||||
Ctx.GetTwoTone := @GetTwoTone;
|
||||
Ctx.SetTwoTone := @SetTwoTone;
|
||||
Ctx.GetPureSignal := @GetPureSignal;
|
||||
Ctx.SetPureSignal := @SetPureSignal;
|
||||
Ctx.DoPSSingleCal := @DoPSSingleCal;
|
||||
// Приёмник и сервис: MUT (ZZMA), шаговый аттенюатор (ZZRX), напряжение
|
||||
// питания (ZZRV), обмен VFO (ZZVS), счётчик памяти (ZZMV), CW-макрос (ZZKM).
|
||||
Ctx.GetMuted := @GetMuted;
|
||||
Ctx.SetMuted := @SetMuted;
|
||||
Ctx.GetAtten := @GetAtten;
|
||||
Ctx.SetAtten := @SetAtten;
|
||||
Ctx.GetSupplyVolts := @GetSupplyVolts;
|
||||
Ctx.DoVfoSwap := @DoVfoSwap;
|
||||
Ctx.GetMemoryCount := @GetMemoryCount;
|
||||
Ctx.SendCWMacro := @SendCWMacro;
|
||||
Ctx.OnPanelVfoStep := @PanelVfoStep;
|
||||
Ctx.OnPanelEncoder := @PanelEncoder;
|
||||
Ctx.OnPanelButton := @PanelButton;
|
||||
@@ -476,6 +603,279 @@ begin FController.CWXSend(FSyncStr); end;
|
||||
function TCATAdapter.GetCWTextBusy: Boolean;
|
||||
begin Result := FController.CWXBusy; end;
|
||||
|
||||
function TCATAdapter.GetCWPitch: Integer;
|
||||
begin Result := FController.CWSettings.Pitch; end;
|
||||
|
||||
procedure TCATAdapter.SetCWPitch(V: Integer);
|
||||
begin FSyncInt := V; FController.Invoke(@SyncCWPitch); end;
|
||||
|
||||
procedure TCATAdapter.SyncCWPitch;
|
||||
var C: TCWSettings;
|
||||
begin
|
||||
C := FController.CWSettings;
|
||||
C.Pitch := FSyncInt;
|
||||
FController.SetCWSettings(C);
|
||||
end;
|
||||
|
||||
function TCATAdapter.GetCWBreakIn: Boolean;
|
||||
begin Result := FController.CWSettings.BreakIn; end;
|
||||
|
||||
procedure TCATAdapter.SetCWBreakIn(V: Boolean);
|
||||
begin FSyncBool := V; FController.Invoke(@SyncCWBreakIn); end;
|
||||
|
||||
procedure TCATAdapter.SyncCWBreakIn;
|
||||
var C: TCWSettings;
|
||||
begin
|
||||
C := FController.CWSettings;
|
||||
C.BreakIn := FSyncBool;
|
||||
FController.SetCWSettings(C);
|
||||
end;
|
||||
|
||||
function TCATAdapter.GetCWHangTime: Integer;
|
||||
begin Result := FController.CWSettings.HangTimeMS; end;
|
||||
|
||||
procedure TCATAdapter.SetCWHangTime(V: Integer);
|
||||
begin FSyncInt := V; FController.Invoke(@SyncCWHangTime); end;
|
||||
|
||||
procedure TCATAdapter.SyncCWHangTime;
|
||||
var C: TCWSettings;
|
||||
begin
|
||||
C := FController.CWSettings;
|
||||
C.HangTimeMS := FSyncInt;
|
||||
FController.SetCWSettings(C);
|
||||
end;
|
||||
|
||||
function TCATAdapter.GetCWMonitor: Boolean;
|
||||
// Сайдтонов два, и они не взаимозаменяемы: аппаратный звучит в наушниках
|
||||
// трансивера, программный — в звуковой карте PC. ZZCM правит тот, что отвечает
|
||||
// за текущий источник манипуляции, иначе команда молча промахивалась бы мимо.
|
||||
begin
|
||||
if FController.CWLocalSource then Result := FController.CWSettings.SidetoneSW
|
||||
else Result := FController.CWSettings.SidetoneHW;
|
||||
end;
|
||||
|
||||
procedure TCATAdapter.SetCWMonitor(V: Boolean);
|
||||
begin FSyncBool := V; FController.Invoke(@SyncCWMonitor); end;
|
||||
|
||||
procedure TCATAdapter.SyncCWMonitor;
|
||||
var C: TCWSettings;
|
||||
begin
|
||||
C := FController.CWSettings;
|
||||
if FController.CWLocalSource then C.SidetoneSW := FSyncBool
|
||||
else C.SidetoneHW := FSyncBool;
|
||||
FController.SetCWSettings(C);
|
||||
end;
|
||||
|
||||
// ── TX-тракт ─────────────────────────────────────────────────────────────────
|
||||
// Геттеры читают живые TX-настройки контроллера (они же — активный профиль),
|
||||
// сеттеры кладут значение в scratch и правят одно поле в потоке контроллера.
|
||||
|
||||
function TCATAdapter.GetMicGain: Integer;
|
||||
begin Result := Round(FController.FTXSettings.MicGainDB); end;
|
||||
|
||||
procedure TCATAdapter.SetMicGain(V: Integer);
|
||||
begin FSyncTXFld := txfMicGain; FSyncInt := V; FController.Invoke(@SyncTXField); end;
|
||||
|
||||
function TCATAdapter.GetTXFilterLow: Integer;
|
||||
begin Result := FController.FTXSettings.FilterLow; end;
|
||||
|
||||
procedure TCATAdapter.SetTXFilterLow(V: Integer);
|
||||
begin FSyncTXFld := txfFiltLow; FSyncInt := V; FController.Invoke(@SyncTXField); end;
|
||||
|
||||
function TCATAdapter.GetTXFilterHigh: Integer;
|
||||
begin Result := FController.FTXSettings.FilterHigh; end;
|
||||
|
||||
procedure TCATAdapter.SetTXFilterHigh(V: Integer);
|
||||
begin FSyncTXFld := txfFiltHigh; FSyncInt := V; FController.Invoke(@SyncTXField); end;
|
||||
|
||||
function TCATAdapter.GetCompOn: Boolean;
|
||||
begin Result := FController.FTXSettings.CompressorOn; end;
|
||||
|
||||
procedure TCATAdapter.SetCompOn(V: Boolean);
|
||||
begin FSyncTXFld := txfCompOn; FSyncBool := V; FController.Invoke(@SyncTXField); end;
|
||||
|
||||
function TCATAdapter.GetCompGain: Integer;
|
||||
begin Result := Round(FController.FTXSettings.CompressorGain); end;
|
||||
|
||||
procedure TCATAdapter.SetCompGain(V: Integer);
|
||||
begin FSyncTXFld := txfCompGain; FSyncInt := V; FController.Invoke(@SyncTXField); end;
|
||||
|
||||
function TCATAdapter.GetTXEQOn: Boolean;
|
||||
begin Result := FController.FTXSettings.EQOn; end;
|
||||
|
||||
procedure TCATAdapter.SetTXEQOn(V: Boolean);
|
||||
begin FSyncTXFld := txfEQOn; FSyncBool := V; FController.Invoke(@SyncTXField); end;
|
||||
|
||||
function TCATAdapter.GetTXEQ(out Gains: TCATEQGains): Integer;
|
||||
var i: Integer;
|
||||
begin
|
||||
for i := 0 to High(Gains) do Gains[i] := Round(FController.FTXSettings.EQGains[i]);
|
||||
Result := FController.FTXSettings.EQNumBands;
|
||||
end;
|
||||
|
||||
procedure TCATAdapter.SetTXEQ(NumBands: Integer; const Gains: TCATEQGains);
|
||||
begin
|
||||
FSyncInt := NumBands;
|
||||
FSyncEQ := Gains;
|
||||
FController.Invoke(@SyncTXEQ);
|
||||
end;
|
||||
|
||||
procedure TCATAdapter.SyncTXEQ;
|
||||
// Частоты полос команда не несёт (их в формате Thetis попросту нет) — трогаем
|
||||
// только усиления и число полос, сетка остаётся той, что настроена в UI.
|
||||
var
|
||||
T: TTXSettings;
|
||||
i: Integer;
|
||||
begin
|
||||
T := FController.FTXSettings;
|
||||
T.EQNumBands := FSyncInt;
|
||||
for i := 0 to High(FSyncEQ) do
|
||||
if i <= FSyncInt then T.EQGains[i] := FSyncEQ[i];
|
||||
FController.SetTXSettings(T);
|
||||
end;
|
||||
|
||||
function TCATAdapter.GetTUNLevel: Integer;
|
||||
begin Result := FController.FTXSettings.TUNLevel; end;
|
||||
|
||||
procedure TCATAdapter.SetTUNLevel(V: Integer);
|
||||
begin FSyncTXFld := txfTUNLevel; FSyncInt := V; FController.Invoke(@SyncTXField); end;
|
||||
|
||||
function TCATAdapter.GetFMDeviation: Integer;
|
||||
begin Result := Round(FController.FTXSettings.FMDeviation); end;
|
||||
|
||||
procedure TCATAdapter.SetFMDeviation(V: Integer);
|
||||
begin FSyncTXFld := txfFMDev; FSyncInt := V; FController.Invoke(@SyncTXField); end;
|
||||
|
||||
procedure TCATAdapter.SyncTXField;
|
||||
var T: TTXSettings;
|
||||
begin
|
||||
T := FController.FTXSettings;
|
||||
case FSyncTXFld of
|
||||
txfMicGain: T.MicGainDB := FSyncInt;
|
||||
txfFiltLow: T.FilterLow := FSyncInt;
|
||||
txfFiltHigh: T.FilterHigh := FSyncInt;
|
||||
txfCompOn: T.CompressorOn := FSyncBool;
|
||||
txfCompGain: T.CompressorGain := FSyncInt;
|
||||
txfEQOn: T.EQOn := FSyncBool;
|
||||
txfTUNLevel: T.TUNLevel := FSyncInt;
|
||||
txfFMDev: T.FMDeviation := FSyncInt;
|
||||
end;
|
||||
FController.SetTXSettings(T);
|
||||
end;
|
||||
|
||||
function TCATAdapter.GetTXProfile: Integer;
|
||||
begin Result := FController.ActiveTXProfile; end;
|
||||
|
||||
procedure TCATAdapter.SetTXProfile(V: Integer);
|
||||
begin FSyncInt := V; FController.Invoke(@SyncTXProfile); end;
|
||||
|
||||
procedure TCATAdapter.SyncTXProfile;
|
||||
begin FController.SelectTXProfile(FSyncInt); end;
|
||||
|
||||
function TCATAdapter.GetTXProfileCount: Integer;
|
||||
begin Result := FController.TXProfileCount; end;
|
||||
|
||||
function TCATAdapter.GetMonitorOn: Boolean;
|
||||
begin Result := not FController.FRxMuteOnTx; end;
|
||||
|
||||
procedure TCATAdapter.SetMonitorOn(V: Boolean);
|
||||
begin FSyncBool := V; FController.Invoke(@SyncMonitorOn); end;
|
||||
|
||||
procedure TCATAdapter.SyncMonitorOn;
|
||||
begin FController.SetRxMuteOnTx(not FSyncBool); end;
|
||||
|
||||
function TCATAdapter.GetMonitorLevel: Integer;
|
||||
begin Result := FController.FTxMonVolume; end;
|
||||
|
||||
procedure TCATAdapter.SetMonitorLevel(V: Integer);
|
||||
begin FSyncInt := V; FController.Invoke(@SyncMonitorLevel); end;
|
||||
|
||||
procedure TCATAdapter.SyncMonitorLevel;
|
||||
begin FController.SetTXMonVolume(FSyncInt); end;
|
||||
|
||||
function TCATAdapter.GetTuning: Boolean;
|
||||
begin Result := FController.FTuning; end;
|
||||
|
||||
procedure TCATAdapter.SetTuning(V: Boolean);
|
||||
begin FSyncBool := V; FController.Invoke(@SyncTuning); end;
|
||||
|
||||
procedure TCATAdapter.SyncTuning;
|
||||
begin FController.SetTune(FSyncBool); end;
|
||||
|
||||
function TCATAdapter.GetTwoTone: Boolean;
|
||||
begin Result := FController.FTwoTone; end;
|
||||
|
||||
procedure TCATAdapter.SetTwoTone(V: Boolean);
|
||||
begin FSyncBool := V; FController.Invoke(@SyncTwoTone); end;
|
||||
|
||||
procedure TCATAdapter.SyncTwoTone;
|
||||
begin FController.SetTwoTone(FSyncBool); end;
|
||||
|
||||
function TCATAdapter.GetPureSignal: Boolean;
|
||||
begin Result := FController.FPSEnabled; end;
|
||||
|
||||
procedure TCATAdapter.SetPureSignal(V: Boolean);
|
||||
begin FSyncBool := V; FController.Invoke(@SyncPureSignal); end;
|
||||
|
||||
procedure TCATAdapter.SyncPureSignal;
|
||||
begin FController.SetPureSignal(FSyncBool); end;
|
||||
|
||||
procedure TCATAdapter.DoPSSingleCal;
|
||||
begin FController.Invoke(@SyncPSSingleCal); end;
|
||||
|
||||
procedure TCATAdapter.SyncPSSingleCal;
|
||||
begin FController.PSSingleCal; end;
|
||||
|
||||
// ── Приёмник и сервис ────────────────────────────────────────────────────────
|
||||
|
||||
function TCATAdapter.GetMuted: Boolean;
|
||||
begin Result := FController.FMuted; end;
|
||||
|
||||
procedure TCATAdapter.SetMuted(V: Boolean);
|
||||
begin FSyncBool := V; FController.Invoke(@SyncMuted); end;
|
||||
|
||||
procedure TCATAdapter.SyncMuted;
|
||||
begin FController.SetMute(FSyncBool); end;
|
||||
|
||||
function TCATAdapter.GetAtten: Integer;
|
||||
begin Result := FController.FAtten; end;
|
||||
|
||||
procedure TCATAdapter.SetAtten(V: Integer);
|
||||
begin FSyncInt := V; FController.Invoke(@SyncAtten); end;
|
||||
|
||||
procedure TCATAdapter.SyncAtten;
|
||||
begin FController.SetAtten(FSyncInt); end;
|
||||
|
||||
function TCATAdapter.GetSupplyVolts: Double;
|
||||
// Телеметрия платы; -1 = данных ещё нет (движок отдаст ноль, как Thetis).
|
||||
begin Result := FController.FLastSupplyV; end;
|
||||
|
||||
procedure TCATAdapter.DoVfoSwap;
|
||||
begin FController.Invoke(@SyncVfoSwap); end;
|
||||
|
||||
procedure TCATAdapter.SyncVfoSwap;
|
||||
begin FController.VfoSwap; end;
|
||||
|
||||
function TCATAdapter.GetMemoryCount: Integer;
|
||||
begin
|
||||
if Assigned(FController.FChannelStore) then Result := FController.FChannelStore.Count
|
||||
else Result := 0;
|
||||
end;
|
||||
|
||||
procedure TCATAdapter.SendCWMacro(V: Integer);
|
||||
begin FSyncInt := V; FController.Invoke(@SyncCWMacro); end;
|
||||
|
||||
procedure TCATAdapter.SyncCWMacro;
|
||||
// Макрос n (1..9) = ячейка памяти сообщений n. Ячеек восемь (F1..F8): девятая
|
||||
// и пустые просто ничего не передают — очередь дёргать незачем.
|
||||
var Idx: Integer;
|
||||
begin
|
||||
Idx := FSyncInt - 1;
|
||||
if (Idx < 0) or (Idx >= CW_MSG_COUNT) then Exit;
|
||||
if FController.CWSettings.Messages[Idx] = '' then Exit;
|
||||
FController.CWXSend(FController.CWSettings.Messages[Idx]);
|
||||
end;
|
||||
|
||||
procedure TCATAdapter.SyncMOX;
|
||||
begin FController.SetMOX(FSyncBool); end;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user