diff --git a/RadioController.pas b/RadioController.pas index 9af8e2c..bb63a69 100644 --- a/RadioController.pas +++ b/RadioController.pas @@ -1324,8 +1324,11 @@ procedure TRadioController.PushNetworkState; begin if Assigned(FNetwork) and FNetwork.Connected and FNetwork.Running then begin + // Состояние передачи для ЖЕЛЕЗА — RadioKeyed, а не FTransmitting: в + // телеграфе ключ замыкает прошивка, и реле T/R с антенной и OC обязаны + // ехать за ней. PTT в кадре этим не поднимается (он живёт в SendPTT). FNetwork.UpdateState(XvtrTranslate(FCenterFreq), XvtrTranslateTX(ActiveTXFreqHz), - FDriveLevel, FTransmitting, True, True, FTuning, FTwoTone); + FDriveLevel, RadioKeyed, True, True, FTuning, FTwoTone); FNetwork.SendFullHP; end; end; @@ -1578,6 +1581,17 @@ begin // модуляции, — но передачей по нему не управляем. if CWTXActive then begin + // ★Ниже стоит Exit, поэтому падающий фронт HWPTT здесь обработать НЕКОМУ. + // Если в эфир нас увёл именно HWPTT, пока источником передачи был не + // телеграф (например слайс в голосовом режиме), а телеграф включился уже + // после — передача залипала бы НАВСЕГДА: FTransmitting остаётся взведённым, + // Alex стоит в TX, PTT не снимается, и приёмник всю дорогу видит свой же + // передатчик. Снимаем такую передачу здесь. + if FHWPTTStartedTX and (not FHPpHWPTT) then + begin + FHWPTTStartedTX := False; + SetMOX(False); + end; FHWPTTActive := FHPpHWPTT; if FHPpHWPTT then FCWKeyedAt := GetTickCount64; // UI про телеграфную передачу иначе не узнает вовсе: SetMOX здесь не @@ -1586,6 +1600,11 @@ begin if FCWKeyedShown <> RadioKeyed then begin FCWKeyedShown := RadioKeyed; + // ★Железная обвязка обязана идти за фактическим ключом: реле T/R (Alex + // bit 27), TX-антенна, bypass/Ext1 и выходы OC (ими ключуется усилитель) + // считаются в бэкенде от состояния передачи. Без этого пути прошивка + // гнала бы несущую, пока Alex стоит в ПРИЁМНОЙ конфигурации. + PushNetworkState; Changed(rfTransmitting); end; Exit; @@ -1594,6 +1613,7 @@ begin if FCWKeyedShown then begin FCWKeyedShown := False; + PushNetworkState; Changed(rfTransmitting); end; // Hardware PTT (footswitch / mic PTT): фронт на rate HP Status — не пропустить @@ -5683,11 +5703,16 @@ function TRadioController.RadioKeyed: Boolean; // выдержка гасила бы индикацию между словами. var Hold: QWord; begin - Result := FTransmitting or FTuning; + Result := FTransmitting; if Result then Exit; if not CWTXActive then Exit(False); if FCWKeyedAt = 0 then Exit(False); + // Выдержка = hang прошивки + запас, но не меньше 8 точек: полурывок semi-QSK. + // По ней же переключается реле T/R, поэтому щёлкать оно обязано РАЗ на + // передачу, а не на каждую посылку. Hold := 8 * (1200 div EnsureRange(FCWSettings.Speed, 5, 60)); + if Hold < QWord(FCWSettings.HangTimeMS) + 250 then + Hold := QWord(FCWSettings.HangTimeMS) + 250; if Hold < 500 then Hold := 500; Result := (GetTickCount64 - FCWKeyedAt) < Hold; end;