mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 19:45:09 +00:00
feat(puresignal): PureSignal-предыскажение для openHPSDR P2 + кнопки PS/2TON
Протокол (по pihpsdr new_protocol.c): на PTT при PS DDC0<-ADC0 (RX-feedback), DDC1<-ADC2 (TX DAC loopback), 192к/24бит, sync DDC1->DDC0 (byte 1363=0x02, interleaved в потоке DDC0), частоты DDC0/1 = TX в HP-пакете, Alex0 bit18 (мост обратной связи). Caps.HasPureSignal для плат с DDCBase=2 (Angelia/Orion/Orion2/Saturn); попутно NumADCs=2 для Angelia. WDSPEngine: PushPSFeedback (деинтерлив -> pscc(TXA, tx=DDC1, rx=DDC0) из сетевого потока), PS-параметры calcc в кэше с переприменением после пересоздания TXA; SetTXTwoTone (PostGen mode 1, 700/1900, 0.49+0.49, инверсия LSB/CWL/DIGL, мьют mic как TUN). RadioController: state machine команд (порт Thetis PSForm timer1) в PureSignalTick @10Гц + auto-attenuate (AttOnTX по уровню feedback, цель ~152, через DUC Specific); SetPSMox и перестройка feedback-DDC на T/R; маршрутизация DDC0 в pscc из OnDDCIQ; SetTwoTone с гейтами safety. UI: кнопки PS (ЛКМ = поповер настроек, ПКМ = быстрый toggle) и 2TON в блоке TX; поповер TPureSignalPopup (дочерний контрол, Wayland-safe): PS ON/OFF, CAL, RESET, 2TON, лампа/уровень feedback, cals, corr, GetPk/SetPk, MOX/CAL wait, PH#, Auto-atten, Relax ptol, Pin/Map/Stbl, Tint, тона двухтональника. Персист ps_* в tx-секции per-device. Не проверено на железе; Save/Restore коррекции не реализованы. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -209,6 +209,19 @@ type
|
||||
TXSpecRefLevel: Double; // dBm reference (top of scale), e.g. 0
|
||||
TXSpecRange: Double; // dB range, e.g. 80
|
||||
TXSpecGridStep: Double; // grid step in dB, e.g. 10
|
||||
// PureSignal (WDSP calcc; дефолты = Thetis PSForm, протокол 2)
|
||||
PSMoxDelay: Double; // с — задержка после MOX до сбора feedback (0.2)
|
||||
PSLoopDelay: Double; // с — пауза между итерациями калибровки (0)
|
||||
PSTXDelayNs: Integer; // нс — компенсация задержки TX-тракта (150)
|
||||
PSRelaxPtol: Boolean; // ослабленный допуск фазы (ptol 0.4 вместо 0.8)
|
||||
PSAutoAtten: Boolean; // авто-подстройка AttOnTX по уровню feedback
|
||||
PSPin: Boolean; // pin mode (True)
|
||||
PSMap: Boolean; // map mode (True)
|
||||
PSStabilize: Boolean; // stabilize (False)
|
||||
PSIntsIdx: Integer; // 0=16/256, 1=8/512, 2=4/1024
|
||||
PSHWPeak: Double; // SetPk (0.2899 для P2, 0.6121 Saturn)
|
||||
PSTTFreq1: Integer; // Гц — тон 1 двухтональника (700)
|
||||
PSTTFreq2: Integer; // Гц — тон 2 двухтональника (1900)
|
||||
end;
|
||||
|
||||
// Web-сервер — глобальные настройки (не привязаны к устройству, секция "web").
|
||||
@@ -1170,6 +1183,19 @@ begin
|
||||
T.TXSpecRefLevel := 0.0;
|
||||
T.TXSpecRange := 80.0;
|
||||
T.TXSpecGridStep := 10.0;
|
||||
// PureSignal — дефолты Thetis PSForm (протокол 2)
|
||||
T.PSMoxDelay := 0.2;
|
||||
T.PSLoopDelay := 0.0;
|
||||
T.PSTXDelayNs := 150;
|
||||
T.PSRelaxPtol := False;
|
||||
T.PSAutoAtten := True;
|
||||
T.PSPin := True;
|
||||
T.PSMap := True;
|
||||
T.PSStabilize := False;
|
||||
T.PSIntsIdx := 0; // 16 ints / 256 spi
|
||||
T.PSHWPeak := 0.2899;
|
||||
T.PSTTFreq1 := 700;
|
||||
T.PSTTFreq2 := 1900;
|
||||
end;
|
||||
|
||||
function TSettingsManager.LoadTX(const MAC: array of Byte;
|
||||
@@ -1236,6 +1262,19 @@ begin
|
||||
T.TXSpecRefLevel := JD(O,'tx_spec_ref_level', T.TXSpecRefLevel);
|
||||
T.TXSpecRange := JD(O,'tx_spec_range', T.TXSpecRange);
|
||||
T.TXSpecGridStep := JD(O,'tx_spec_grid_step', T.TXSpecGridStep);
|
||||
// PureSignal
|
||||
T.PSMoxDelay := JD(O,'ps_mox_delay', T.PSMoxDelay);
|
||||
T.PSLoopDelay := JD(O,'ps_loop_delay', T.PSLoopDelay);
|
||||
T.PSTXDelayNs := JI(O,'ps_tx_delay_ns', T.PSTXDelayNs);
|
||||
T.PSRelaxPtol := JB(O,'ps_relax_ptol', T.PSRelaxPtol);
|
||||
T.PSAutoAtten := JB(O,'ps_auto_atten', T.PSAutoAtten);
|
||||
T.PSPin := JB(O,'ps_pin', T.PSPin);
|
||||
T.PSMap := JB(O,'ps_map', T.PSMap);
|
||||
T.PSStabilize := JB(O,'ps_stabilize', T.PSStabilize);
|
||||
T.PSIntsIdx := EnsureRange(JI(O,'ps_ints_idx', T.PSIntsIdx), 0, 2);
|
||||
T.PSHWPeak := JD(O,'ps_hw_peak', T.PSHWPeak);
|
||||
T.PSTTFreq1 := JI(O,'ps_tt_freq1', T.PSTTFreq1);
|
||||
T.PSTTFreq2 := JI(O,'ps_tt_freq2', T.PSTTFreq2);
|
||||
end;
|
||||
|
||||
procedure TSettingsManager.SaveTX(const MAC: array of Byte;
|
||||
@@ -1294,6 +1333,19 @@ begin
|
||||
JW(O,'tx_spec_ref_level', T.TXSpecRefLevel);
|
||||
JW(O,'tx_spec_range', T.TXSpecRange);
|
||||
JW(O,'tx_spec_grid_step', T.TXSpecGridStep);
|
||||
// PureSignal
|
||||
JW(O,'ps_mox_delay', T.PSMoxDelay);
|
||||
JW(O,'ps_loop_delay', T.PSLoopDelay);
|
||||
JW(O,'ps_tx_delay_ns', T.PSTXDelayNs);
|
||||
JW(O,'ps_relax_ptol', T.PSRelaxPtol);
|
||||
JW(O,'ps_auto_atten', T.PSAutoAtten);
|
||||
JW(O,'ps_pin', T.PSPin);
|
||||
JW(O,'ps_map', T.PSMap);
|
||||
JW(O,'ps_stabilize', T.PSStabilize);
|
||||
JW(O,'ps_ints_idx', T.PSIntsIdx);
|
||||
JW(O,'ps_hw_peak', T.PSHWPeak);
|
||||
JW(O,'ps_tt_freq1', T.PSTTFreq1);
|
||||
JW(O,'ps_tt_freq2', T.PSTTFreq2);
|
||||
end;
|
||||
|
||||
class procedure TSettingsManager.DefaultAlex(out A: TAlexSettings);
|
||||
|
||||
Reference in New Issue
Block a user