mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
feat(cw): программный кейер — телеграф на Pluto/LibreSDR
У openHPSDR точки и тире формирует кейер в FPGA, и это остаётся путём по умолчанию: тайминги в железе, джиттер PC не влияет вовсе. У AD936x такого кейера нет вовсе, поэтому телеграфа на Pluto не было в принципе — голосовой TXA в CW не запускается, а несущую давать некому. CWKeyer.pas: TCWLocalKeyer рисует манипулированную несущую прямо в поток IQ, мимо WDSP (эталон pihpsdr cw_shape_buffer: в WDSP режим TXA_CWL — ветка SSB, да и PostGen не умеет огибающей). Длительности живут В СЭМПЛАХ, а не в миллисекундах: планировщик ОС влияет только на темп выдачи блоков, а его сглаживает FIFO бэкенда. Умеет текст, иамбик A/B и прямой ключ; TCWKeyPort читает манипулятор с модемных линий COM/USB-serial (DTR/RTS питают ключ, CTS/DSR/DCD/RI — лепестки). Оффлайн-прогон: PARIS занимает ровно 43 точки, все посылки и паузы 1/3/7 dit с точностью до сэмпла. Сессия = одна передача, а не одна посылка: PTT, реле T/R, антенна, OC и аттенюатор Pluto поднимаются один раз и держатся до конца hang — внутри манипуляция чисто цифровая. Предзаполнение FIFO задано железом: TX-поток Pluto наполняет буфер целиком (16384 пары ≈ 28 мс на 576k) и добивает нулями, чего не хватило. Сайдтон эту латентность не наследует — кольцо огибающей листается, если отставание больше 20 мс. Сдвиг несущей: у zero-IF ноль бейсбенда совпадает с частотой гетеродина, и там же его утечка — манипуляция на нуле дала бы backwave ровно на рабочей частоте. Поэтому несущая идёт на сдвиге, а гетеродин уезжает навстречу через новую единую дверь TXTuneFreqHz (все пуши TX-частоты переведены на неё). Знак (CW_TX_BB_SIGN) замерен на эфире, а не выведен. Развилка источника в UI — один список Keyer: firmware / software (PC) / off; хранится прежней парой флагов, и на железе без кейера выбор «прошивка» вырождается в программный, поэтому Pluto работает из коробки. Новое поле caps HasCWKeyer (раньше это неявно жило в HasHWMic). Попутно: у AD9361 calib_mode стоял manual_tx_quad, то есть драйвер не переигрывал калибровку TX quad (она нулит утечку гетеродина) на сменах TX LO — выставляем auto при подключении. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -458,6 +458,7 @@ begin
|
||||
Result.HasWideband := False;
|
||||
Result.HasDitherRandom := False;
|
||||
Result.HasHWMic := False;
|
||||
Result.HasCWKeyer := False; // голый AD936x — телеграф формирует PC
|
||||
Result.HasPLLStatus := False;
|
||||
Result.HasHWGain := True; // manual gain / hw-AGC
|
||||
Result.HasRFBandwidth := True;
|
||||
@@ -634,6 +635,15 @@ begin
|
||||
if not (FRx2Avail or FRxMuxAvail) then FRxChanSel := 0;
|
||||
|
||||
FConnected := True;
|
||||
// ★Калибровки — в автомат. AD936x нулит утечку гетеродина и квадратурный
|
||||
// разбаланс передатчика калибровкой TX quad, и в режиме 'auto' драйвер сам
|
||||
// прогоняет её на каждой смене TX LO. Найдено на живом Pluto: там стояло
|
||||
// 'manual_tx_quad', то есть калибровка НЕ переигрывалась вовсе — утечка LO
|
||||
// (в телеграфе она видна отдельной несущей в стороне от рабочей частоты)
|
||||
// оставалась такой, какой её оставила прошлая программа. Состояние живёт в
|
||||
// чипе между сессиями, поэтому выставляем явно.
|
||||
if Assigned(iio_device_attr_write) then
|
||||
iio_device_attr_write(FPhy, 'calib_mode', 'auto');
|
||||
// Приводим железо в известное состояние: валидный rate + вход + усиление.
|
||||
if FSampleRate < PLUTO_MIN_SR then FSampleRate := PLUTO_DEF_SR;
|
||||
ApplySampleRate(FSampleRate);
|
||||
|
||||
Reference in New Issue
Block a user