mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
feat(tx): TX-профиль на слайс — пилюля в шапке флага
Передатчик один, профиль до сих пор был один на устройство: активный профиль звучал независимо от того, какой слайс взял передачу. С панадаптером на FT8 и вторым на FM это значит, что компрессия и EQ голосового профиля уходили в эфир на FT8 (FMRAW прикрыт сам — ApplyTXModeSettings глушит там всю обработку, а DIGU/DIGL нет). У Flex это решается дисциплиной и внешним API; делаем в радио. Привязка «источник передачи → профиль» (-1 = не переключать, звучит активный): TCtrlSlice.TXProfile для B..G, TTXProfileList.MainBind для главного (слайс A). Персист: ключ tx_profile в слайсе пана и main_bind в секции tx_profiles. SetTxSlice зовёт ApplyBoundTXProfile ДО пуша режима и цепи, иначе ApplyTXSettingsToDSP лёг бы на старый режим. Привязали источник, который передаёт прямо сейчас, — применяем сразу. Привязки — индексы, поэтому RemapTXProfileBindings: удаление профиля из середины снимает привязки на него и сдвигает те, что правее; Factory-сброс снимает все (список заменён целиком). UI: пилюля с именем профиля в первой строке флага сразу за шириной фильтра (ЛКМ — fly-out список, первая строка «As active»). Правая граница считается до SPLIT у главного и до RXM у слайса; не рисуем при пустом списке, в DMR (передачи нет) и в FMRAW (профиль там ни на что не влияет). Прокрутка списка общая с AUD — блок стрелок вынесен в DrawScrollArrows. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -286,6 +286,8 @@ type
|
||||
procedure PushAllSliceFlagStates; // все флаги панели (после смены rate и т.п.)
|
||||
procedure PushMainFlagExtState;
|
||||
procedure PushMainFlagAudioDevices;
|
||||
procedure PushFlagTXProfiles(O: TVfoOverlay; SliceId: Integer);
|
||||
procedure PushAllFlagTXProfiles;
|
||||
procedure UpdateSliceDMRFlags;
|
||||
// Тик: S-метр/частота главного флага + позиции + троттленный S-метр слайсов.
|
||||
procedure TickFlags;
|
||||
@@ -1321,6 +1323,23 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
// Список TX-профилей (общий) + привязка ЭТОГО флага (SliceId 0 = главный).
|
||||
procedure TPanafallPanel.PushFlagTXProfiles(O: TVfoOverlay; SliceId: Integer);
|
||||
var
|
||||
L: TStringList;
|
||||
i: Integer;
|
||||
begin
|
||||
if (O = nil) or (FController = nil) then Exit;
|
||||
L := TStringList.Create;
|
||||
try
|
||||
for i := 0 to FController.TXProfileCount - 1 do
|
||||
L.Add(FController.TXProfileName(i));
|
||||
O.SetTXProfiles(L, FController.SliceTXProfile(SliceId));
|
||||
finally
|
||||
L.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
// Заливает во флаг слайса его текущее состояние из контроллера.
|
||||
procedure TPanafallPanel.PushSliceFlagState(SliceId: Integer);
|
||||
var
|
||||
@@ -1352,6 +1371,7 @@ begin
|
||||
// Auto TX (настройка CAT-порта слайса) — бейдж TX подписан AutoTX.
|
||||
O.SetAutoTxState(FController.SliceAutoTx(SliceId));
|
||||
O.SetRxMuteTxState(S.RxMuteOnTx); // бейдж RXM
|
||||
PushFlagTXProfiles(O, SliceId); // пилюля TX-профиля слайса
|
||||
// Список аудио-устройств (общий PA-список) + текущее устройство слайса.
|
||||
if Assigned(FController.FAudioOut) then
|
||||
begin
|
||||
@@ -1399,6 +1419,18 @@ begin
|
||||
FController.FSplitTxB and (FController.FTxSliceId = 0),
|
||||
FController.FTransmitting and (FController.FTxSliceId = 0),
|
||||
FController.FTxSliceId = 0);
|
||||
PushFlagTXProfiles(FMainFlag, 0);
|
||||
end;
|
||||
|
||||
// Обновить пилюли TX-профиля на всех флагах панели (список профилей общий:
|
||||
// переименовали/удалили — видно везде).
|
||||
procedure TPanafallPanel.PushAllFlagTXProfiles;
|
||||
var i: Integer;
|
||||
begin
|
||||
if Assigned(FMainFlag) then PushFlagTXProfiles(FMainFlag, 0);
|
||||
for i := 0 to High(FSliceFlags) do
|
||||
if FSliceFlags[i] <> nil then
|
||||
PushFlagTXProfiles(FSliceFlags[i], FSliceFlags[i].SliceId);
|
||||
end;
|
||||
|
||||
procedure TPanafallPanel.PushMainFlagAudioDevices;
|
||||
|
||||
Reference in New Issue
Block a user