mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 17:27:32 +00:00
fix(cw): первый прогон на железе — частота, мощность, индикация, полоса
Семь дефектов, вскрытых проверкой в эфире. Общий корень у большинства: с кейером в прошивке FTransmitting не поднимается вовсе — передачей владеет FPGA, — а половина проекта считала этот флаг признаком эфира. Обрыв посылки после первого элемента. При break-in железо само поднимает T/R на каждую посылку, HPS_PTT это отражает, и разбор статуса гонял по фронту SetMOX(True/False); снятие MOX гасило CWX. Теперь в телеграфе фронт HPS_PTT не управляет передачей. Без этого и работа манипулятором пересобирала бы передающий тракт на каждой точке. Обрыв по «key hit» переведён на фронт лепестка: на плате без ключа входы могут стоять в единице, и проверка уровня убивала бы передачу сразу. Посылка уходила по центру дисплея, а не на VFO. StartRunning ставил DUC на центр DDC; до первой перестройки VFO или до первого MOX там и оставалось. Без CTUN центр совпадает с VFO, поэтому баг и дожил до телеграфа, где MOX не бывает. SetRunAndFreq получает TX-частоту, SetSliceTarget толкает кадр, когда перестраивают слайс-источник. Правило: DUC обязан стоять правильно всегда, а не только на передаче. Мощность ниже, чем на TUN: уровень (байт 345) клался в кадр только при FIsTransmitting. Введён SetCWKeyerArmed — пока кейер вооружён, уровень лежит в каждом HP-кадре. Там же пересчитывается FDriveLevel, иначе до первого касания ручки в железо уходил ноль. Индикация не показывала передачу: события rfTransmitting в телеграфе не бывает, поэтому блок рендера не выполнялся ни разу. ApplyHPStatus шлёт его сам на фронтах RadioKeyed («железо в эфире» = передача или замыкание ключа прошивкой, выдержка 8 точек и не меньше 500 мс). На RadioKeyed переведены S-метр, красная полоса главного VFO и TX-бейджи флагов вместе с красной полосой слайса на панадаптерах. Полоса на спектре рисовалась как SSB: TXSignedEdges обязана отдавать для CW голосовую боковую (через bp0 идёт тон pitch при настройке), поэтому экранные кромки развязаны в TXFilterEdgesHz — занимаемая полоса манипуляции симметрично несущей. Тот же класс, что был у ЧМ. F1..F8 молчали, пока не откроешь окно памяти: обработчик упирался в проверку лениво создаваемой формы. Текст берётся из настроек. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+14
-2
@@ -170,6 +170,7 @@ type
|
||||
FAlexConfig: TAlexSettings; // per-band antenna + routing config
|
||||
FStepAtten: Byte; // ADC0 step attenuator 0-31 dB
|
||||
FCWXKey: Boolean; // бит CWX (HP байт 5): программный ключ
|
||||
FCWKeyerArmed: Boolean; // кейер прошивки вооружён (см. байт 345)
|
||||
// ---- OC Control (Open Collector выходы Penny/Alex, byte 1401) ----
|
||||
FOCConfig: TOCSettings;
|
||||
FTuning: Boolean; // TUN активен (для TX pin action)
|
||||
@@ -271,6 +272,7 @@ type
|
||||
Tuning: Boolean = False; TwoTone: Boolean = False); override;
|
||||
procedure SetStepAtten(dB: Byte); override;
|
||||
procedure SetCWXKey(Down: Boolean); override;
|
||||
procedure SetCWKeyerArmed(Armed: Boolean); override;
|
||||
procedure SetFreqCalPPM(P: Double); override;
|
||||
// Частота с поправкой опорника — для частотного слова DDC/DUC.
|
||||
function CalFreq(Hz: Double): Double;
|
||||
@@ -1812,6 +1814,13 @@ begin
|
||||
if FConnected then SendFullHP;
|
||||
end;
|
||||
|
||||
procedure THPSDRNetwork.SetCWKeyerArmed(Armed: Boolean);
|
||||
begin
|
||||
if FCWKeyerArmed = Armed then Exit;
|
||||
FCWKeyerArmed := Armed;
|
||||
if FConnected then SendFullHP;
|
||||
end;
|
||||
|
||||
procedure THPSDRNetwork.SetStepAtten(dB: Byte);
|
||||
begin
|
||||
if dB > 31 then dB := 31;
|
||||
@@ -1899,8 +1908,11 @@ begin
|
||||
Buf[331] := (Ph shr 8) and $FF;
|
||||
Buf[332] := Ph and $FF;
|
||||
|
||||
// Drive level (byte 345)
|
||||
if FIsTransmitting then
|
||||
// Drive level (byte 345). Обычно уровень нужен только на передаче, но с
|
||||
// вооружённым кейером телеграфа «передачи» в понимании софта не бывает:
|
||||
// прошивка замыкает ключ сама, и в кадре, который она в этот момент видит,
|
||||
// уровень уже обязан стоять — иначе посылка уходит с чужой мощностью.
|
||||
if FIsTransmitting or FCWKeyerArmed then
|
||||
Buf[345] := FCurrentDrive;
|
||||
|
||||
// ALEX0 filter bits (bytes 1432-1435)
|
||||
|
||||
Reference in New Issue
Block a user