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:
@@ -79,6 +79,10 @@ var
|
||||
out val: clonglong): cint; cdecl;
|
||||
iio_device_attr_write_longlong: function(dev: Piio_device; attr: PAnsiChar;
|
||||
val: clonglong): cint; cdecl;
|
||||
// 'calib_mode' — режим калибровок AD936x (строка): 'auto' = драйвер сам
|
||||
// переигрывает TX quad (утечка LO + квадратура) на каждой смене TX LO.
|
||||
iio_device_attr_write: function(dev: Piio_device; attr: PAnsiChar;
|
||||
src: PAnsiChar): ptrint; cdecl;
|
||||
|
||||
// ---- Debug-атрибуты устройства (debugfs) ----
|
||||
// Нужны для выбора антенного разъёма у AD936x в режиме 1R1T:
|
||||
@@ -195,6 +199,7 @@ begin
|
||||
iio_channel_attr_write_double := Sym('iio_channel_attr_write_double');
|
||||
iio_device_attr_read_longlong := Sym('iio_device_attr_read_longlong');
|
||||
iio_device_attr_write_longlong := Sym('iio_device_attr_write_longlong');
|
||||
iio_device_attr_write := Sym('iio_device_attr_write');
|
||||
iio_device_debug_attr_read := Sym('iio_device_debug_attr_read');
|
||||
iio_device_debug_attr_write := Sym('iio_device_debug_attr_write');
|
||||
iio_device_debug_attr_write_longlong := Sym('iio_device_debug_attr_write_longlong');
|
||||
|
||||
Reference in New Issue
Block a user