Merge branch 'develop' of bitbucket.org:k1jt/wsjtx into develop

This commit is contained in:
Steven Franke 2020-04-13 10:24:29 -05:00
commit 65dd843bfb
10 changed files with 126 additions and 102 deletions

View File

@ -107,6 +107,12 @@ OmniRigTransceiver::OmniRigTransceiver (std::unique_ptr<TransceiverBase> wrapped
, send_update_signal_ {false}
, reversed_ {false}
{
CoInitializeEx (nullptr, 0 /*COINIT_APARTMENTTHREADED*/); // required because Qt only does this for GUI thread
}
OmniRigTransceiver::~OmniRigTransceiver ()
{
CoUninitialize ();
}
// returns false on time out
@ -121,9 +127,8 @@ bool OmniRigTransceiver::await_notification_with_timeout (int timeout)
int OmniRigTransceiver::do_start ()
{
TRACE_CAT ("OmniRigTransceiver", "starting");
if (wrapped_) wrapped_->start (0);
CoInitializeEx (nullptr, 0 /*COINIT_APARTMENTTHREADED*/); // required because Qt only does this for GUI thread
if (wrapped_) wrapped_->start (0);
omni_rig_.reset (new OmniRig::OmniRigX {this});
if (omni_rig_->isNull ())
@ -315,18 +320,19 @@ void OmniRigTransceiver::do_stop ()
port_->clear ();
port_.reset ();
}
if (omni_rig_)
if (omni_rig_ && !omni_rig_->isNull ())
{
if (rig_)
if (rig_ && !rig_->isNull ())
{
rig_->clear ();
rig_.reset ();
}
omni_rig_->clear ();
omni_rig_.reset ();
CoUninitialize ();
}
if (wrapped_) wrapped_->stop ();
TRACE_CAT ("OmniRigTransceiver", "stopped");
}
@ -344,7 +350,6 @@ void OmniRigTransceiver::handle_visible_change ()
void OmniRigTransceiver::handle_rig_type_change (int rig_number)
{
if (!omni_rig_ || omni_rig_->isNull ()) return;
TRACE_CAT ("OmniRigTransceiver", "rig type change: rig =" << rig_number);
if (rig_number_ == rig_number)
{
@ -361,7 +366,6 @@ void OmniRigTransceiver::handle_rig_type_change (int rig_number)
void OmniRigTransceiver::handle_status_change (int rig_number)
{
if (!omni_rig_ || omni_rig_->isNull ()) return;
TRACE_CAT ("OmniRigTransceiver", QString {"status change for rig %1"}.arg (rig_number).toLocal8Bit ());
if (rig_number_ == rig_number)
{
@ -394,7 +398,6 @@ void OmniRigTransceiver::handle_status_change (int rig_number)
void OmniRigTransceiver::handle_params_change (int rig_number, int params)
{
if (!omni_rig_ || omni_rig_->isNull ()) return;
TRACE_CAT ("OmniRigTransceiver", QString {"params change: params = 0x%1 for rig %2"}
.arg (params, 8, 16, QChar ('0'))
.arg (rig_number).toLocal8Bit ()
@ -647,7 +650,6 @@ void OmniRigTransceiver::handle_custom_reply (int rig_number, QVariant const& co
(void)command;
(void)reply;
if (!omni_rig_ || omni_rig_->isNull ()) return;
if (rig_number_ == rig_number)
{
if (!rig_ || rig_->isNull ()) return;
@ -664,11 +666,14 @@ void OmniRigTransceiver::do_ptt (bool on)
if (use_for_ptt_ && TransceiverFactory::PTT_method_CAT == ptt_type_)
{
TRACE_CAT ("OmniRigTransceiver", "set PTT");
if (rig_ && !rig_->isNull ())
{
rig_->SetTx (on ? OmniRig::PM_TX : OmniRig::PM_RX);
}
}
else
{
if (port_)
if (port_ && !port_->isNull ())
{
if (TransceiverFactory::PTT_method_RTS == ptt_type_)
{
@ -695,6 +700,7 @@ void OmniRigTransceiver::do_ptt (bool on)
void OmniRigTransceiver::do_frequency (Frequency f, MODE m, bool /*no_ignore*/)
{
TRACE_CAT ("OmniRigTransceiver", f << state ());
if (!rig_ || rig_->isNull ()) return;
if (UNK != m)
{
do_mode (m);
@ -723,6 +729,7 @@ void OmniRigTransceiver::do_frequency (Frequency f, MODE m, bool /*no_ignore*/)
void OmniRigTransceiver::do_tx_frequency (Frequency tx, MODE m, bool /*no_ignore*/)
{
TRACE_CAT ("OmniRigTransceiver", tx << state ());
if (!rig_ || rig_->isNull ()) return;
bool split {tx != 0};
if (split)
{
@ -787,6 +794,7 @@ void OmniRigTransceiver::do_tx_frequency (Frequency tx, MODE m, bool /*no_ignore
void OmniRigTransceiver::do_mode (MODE mode)
{
TRACE_CAT ("OmniRigTransceiver", mode << state ());
if (!rig_ || rig_->isNull ()) return;
// TODO: G4WJS OmniRig doesn't seem to have any capability of tracking/setting VFO B mode
auto mapped = map_mode (mode);
if (mapped & writable_params_)

View File

@ -32,6 +32,7 @@ public:
// takes ownership of wrapped Transceiver
explicit OmniRigTransceiver (std::unique_ptr<TransceiverBase> wrapped, RigNumber, TransceiverFactory::PTTMethod ptt_type, QString const& ptt_port, QObject * parent = nullptr);
~OmniRigTransceiver ();
int do_start () override;
void do_stop () override;

View File

@ -59,8 +59,10 @@ be attempted in each state.
|CALLING CQ | 1, 2
|===========================================
Decoding with _a priori_ information behaves slightly differently
in JT65. Some details are provided in Tables 3 and 4.
Decoding with _a priori_ information behaves slightly differently in
JT65. Some details are provided in Tables 3 and 4. Notations such as
`a63`, use a second digit to indicate the number of Rx intervals
averaged to obtain the decode.
[[JT65_AP_INFO_TABLE]]
.JT65 AP information types

View File

@ -93,6 +93,7 @@ subroutine decode65a(dd,npts,newdat,nqd,f0,nflip,mode65,ntrials, &
call timer('dec65b ',0)
qualbest=0.
nftbest=0
qual0=-1.e30
minsmo=0
maxsmo=0
@ -126,7 +127,6 @@ subroutine decode65a(dd,npts,newdat,nqd,f0,nflip,mode65,ntrials, &
call decode65b(s2,nflip,nadd,mode65,ntrials,naggressive,ndepth, &
mycall,hiscall,hisgrid,nQSOProgress,ljt65apon,nqd,nft,qual, &
nhist,decoded)
if(nft.eq.1) then
nsmo=ismo
param(9)=nsmo
@ -138,18 +138,20 @@ subroutine decode65a(dd,npts,newdat,nqd,f0,nflip,mode65,ntrials, &
qualbest=qual
nnbest=nn
nsmobest=ismo
nftbest=nft
endif
endif
if(qual.lt.qual0) exit
qual0=qual
enddo
if(nft.eq.2) then
if(nftbest.eq.2) then
decoded=decoded_best
qual=qualbest
nsmo=nsmobest
param(9)=nsmo
nn=nnbest
nft=nftbest
endif
call timer('dec65b ',1)

View File

@ -408,6 +408,8 @@ contains
go to 100
endif
! write(*,3001) ft,nsum,qual,sync,bVHF
!3001 format('a',3i3,f5.1,L3)
if(ft.eq.0 .and. minsync.ge.0 .and. int(sync).lt.minsync) then
write(*,1010) params%nutc,snr,dt,freq
else
@ -415,18 +417,19 @@ contains
if(bVHF .and. ft.gt.0) then
cflags='f '
if(is_deep) then
cflags(1:2)='d1'
write(cflags(3:3),'(i1)') min(qual,9)
if(qual.ge.10) cflags(3:3)='*'
cflags='d '
write(cflags(2:2),'(i1)') min(qual,9)
if(qual.ge.10) cflags(2:2)='*'
if(qual.lt.3) decoded(22:22)='?'
endif
if(is_average) then
write(cflags(2:2),'(i1)') min(nsum,9)
if(nsum.ge.10) cflags(2:2)='*'
write(cflags(3:3),'(i1)') min(nsum,9)
if(nsum.ge.10) cflags(3:3)='*'
endif
nap=ishft(ft,-2)
if(nap.ne.0) then
write(cflags(1:3),'(a1,i1)') 'a',nap
if(nsum.lt.2) write(cflags(1:3),'(a1,i1," ")') 'a',nap
if(nsum.ge.2) write(cflags(1:3),'(a1,2i1)') 'a',nap,min(nsum,9)
endif
endif
csync='# '
@ -445,6 +448,12 @@ contains
endif
endif
endif
n=len(trim(decoded))
if(n.eq.2 .or. n.eq.3) csync='# '
if(cflags(1:1).eq.'f') then
cflags(2:2)=cflags(3:3)
cflags(3:3)=' '
endif
write(*,1010) params%nutc,snr,dt,freq,csync,decoded,cflags
1010 format(i4.4,i4,f5.1,i5,1x,a2,1x,a22,1x,a3)
endif

View File

@ -179,7 +179,6 @@ subroutine extract(s3,nadd,mode65,ntrials,naggressive,ndepth,nflip, &
if(nft.gt.0) exit
enddo
!write(*,*) nft
if(nft.eq.0 .and. iand(ndepth,32).eq.32) then
qmin=2.0 - 0.1*naggressive
call timer('hint65 ',0)

View File

@ -76,7 +76,7 @@ contains
character*22 decoded
end type accepted_decode
type(accepted_decode) dec(50)
logical :: first_time,prtavg,single_decode,bVHF
logical :: first_time,prtavg,single_decode,bVHF,clear_avg65
integer h0(0:11),d0(0:11)
real r0(0:11)
@ -90,7 +90,7 @@ contains
! 0 1 2 3 4 5 6 7 8 9 10 11
data r0/0.70,0.72,0.74,0.76,0.78,0.80,0.82,0.84,0.86,0.88,0.90,0.90/
data nutc0/-999/,nfreq0/-999/,nsave/0/
data nutc0/-999/,nfreq0/-999/,nsave/0/,clear_avg65/.true./
save
this%callback => callback
@ -208,6 +208,7 @@ contains
if(clearave) then
nsum=0
nsave=0
clear_avg65=.true.
endif
if(bVHF) then
@ -235,10 +236,11 @@ contains
naggressive,ndepth,ntol,mycall,hiscall,hisgrid,nQSOProgress, &
ljt65apon,bVHF,sync2,a,dtx,nft,nspecial,qual, &
nhist,nsmo,decoded)
call timer('decod65a',1)
if(nspecial.eq.0 .and. sync1.eq.5.0 .and. dtx.eq.2.5) cycle
if(nspecial.eq.2) decoded='RO'
if(nspecial.eq.3) decoded='RRR'
if(nspecial.eq.4) decoded='73'
call timer('decod65a',1)
if(sync1.lt.float(minsync) .and. &
decoded.eq.' ') nflip=0
if(nft.ne.0) nsum=1
@ -262,9 +264,9 @@ contains
if(nsnr.lt.-30) nsnr=-30
if(nsnr.gt.-1) nsnr=-1
nftt=0
!********* DOES THIS STILL WORK WHEN NFT INCLUDES # OF AP SYMBOLS USED??
if(nft.ne.1 .and. iand(ndepth,16).eq.16 .and. (.not.prtavg)) then
if(nft.ne.1 .and. iand(ndepth,16).eq.16 .and. &
sync1.ge.float(minsync) .and. (.not.prtavg)) then
! Single-sequence FT decode failed, so try for an average FT decode.
if(nutc.ne.nutc0 .or. abs(nfreq-nfreq0).gt.ntol) then
! This is a new minute or a new frequency, so call avg65.
@ -273,13 +275,14 @@ contains
nsave=nsave+1
nsave=mod(nsave-1,64)+1
call avg65(nutc,nsave,sync1,dtx,nflip,nfreq,mode65,ntol, &
ndepth,nagain,ntrials,naggressive,clearave,neme,mycall, &
hiscall,hisgrid,nftt,avemsg,qave,deepave,nsum,ndeepave, &
nQSOProgress,ljt65apon)
ndepth,nagain,ntrials,naggressive,clear_avg65,neme, &
mycall,hiscall,hisgrid,nftt,avemsg,qave,deepave,nsum, &
ndeepave,nQSOProgress,ljt65apon)
nsmo=param(9)
nqave=int(qave)
if (associated(this%callback) .and. nsum.ge.2) then
if (associated(this%callback) .and.nftt.ge.1 .and. nsum.ge.2) then
! Display a decoded message obtained by averaging 2 or more transmissions
call this%callback(sync1,nsnr,dtx-1.0,nfreq,ndrift, &
nflip,width,avemsg,nftt,nqave,nsmo,nsum,minsync)
prtavg=.true.
@ -288,14 +291,15 @@ contains
endif
endif
if(nftt.eq.1) then
! nft=1
decoded=avemsg
go to 5
endif
if(nftt.eq.0) go to 5
! if(nftt.eq.1) then
!! nft=1
! decoded=avemsg
! go to 5
! endif
n=naggressive
rtt=0.001*nrtt1000
if(nft.lt.2 .and. minsync.ge.0 .and. nspecial.eq.0) then
if(nft.lt.2 .and. minsync.ge.0 .and. nspecial.eq.0 .and. .not.bVHF) then
if(nhard_min.gt.50) cycle
if(nhard_min.gt.h0(n)) cycle
if(ntotal_min.gt.d0(n)) cycle
@ -305,7 +309,8 @@ contains
5 continue
if(decoded.eq.decoded0 .and. abs(freq-freq0).lt. 3.0 .and. &
minsync.ge.0) cycle !Don't display dupes
if(decoded.ne.' ' .or. minsync.lt.0) then
! if(decoded.ne.' ' .or. minsync.lt.0) then
if(decoded.ne.' ' .or. bVHF) then
if(nsubtract.eq.1) then
call timer('subtr65 ',0)
call subtract65(dd,npts,freq,dtx)
@ -319,7 +324,7 @@ contains
exit
endif
enddo
if(ndupe.ne.1 .and. sync1.ge.float(minsync)) then
if(ndupe.ne.1 .and. ((sync1.ge.float(minsync)) .or. bVHF)) then
if(ipass.eq.1) n65a=n65a + 1
if(ipass.eq.2) n65b=n65b + 1
if(ndecoded.lt.50) ndecoded=ndecoded+1
@ -329,7 +334,7 @@ contains
dec(ndecoded)%decoded=decoded
nqual=min(int(qual),9999)
if (associated(this%callback)) then
if(associated(this%callback)) then
call this%callback(sync1,nsnr,dtx-1.0,nfreq,ndrift, &
nflip,width,decoded,nft,nqual,nsmo,1,minsync)
end if
@ -345,8 +350,8 @@ contains
end subroutine decode
subroutine avg65(nutc,nsave,snrsync,dtxx,nflip,nfreq,mode65,ntol,ndepth, &
nagain, ntrials,naggressive,clearave,neme,mycall,hiscall,hisgrid,nftt, &
avemsg,qave,deepave,nsum,ndeepave,nQSOProgress,ljt65apon)
nagain, ntrials,naggressive,clear_avg65,neme,mycall,hiscall,hisgrid, &
nftt,avemsg,qave,deepave,nsum,ndeepave,nQSOProgress,ljt65apon)
! Decodes averaged JT65 data
@ -369,20 +374,21 @@ contains
real s3c(64,63)
real dtsave(MAXAVE)
real syncsave(MAXAVE)
logical first,clearave,ljt65apon
logical first,clear_avg65,ljt65apon
data first/.true./
save
if(first .or. clearave) then
if(first .or. clear_avg65) then
iutc=-1
nfsave=0
dtdiff=0.2
first=.false.
s3save=0.
s1save=0.
nsave=1 !### ???
! Silence compiler warnings
if(nagain .and. ndeepave.eq.-99 .and. neme.eq.-99) stop
first=.false.
clear_avg65=.false.
endif
do i=1,64
@ -398,6 +404,9 @@ contains
nflipsave(nsave)=nflip
s1save(-255:256,1:126,nsave)=s1
s3save(1:64,1:63,nsave)=s3a
avemsg=' '
deepbest=' '
nfttbest=0
10 syncsum=0.
dtsum=0.
@ -409,7 +418,7 @@ contains
do i=1,MAXAVE !Consider all saved spectra
cused(i)='.'
if(iutc(i).lt.0) cycle
if(iutc(i).lt.0) exit
if(mod(iutc(i),2).ne.mod(nutc,2)) cycle !Use only same (odd/even) seq
if(abs(dtxx-dtsave(i)).gt.dtdiff) cycle !DT must match
if(abs(nfreq-nfsave(i)).gt.ntol) cycle !Freq must match
@ -442,7 +451,6 @@ contains
enddo
if(nsum.lt.2) go to 900
nftt=0
df=1378.125/512.0
! Do the smoothing loop
@ -455,6 +463,7 @@ contains
endif
nn=0
do ismo=minsmo,maxsmo
nftt=0
if(ismo.gt.0) then
do j=1,126
call smo121(s1b(-255,j),512)
@ -492,7 +501,7 @@ contains
nsmo=ismo
param(9)=nsmo
go to 900
else if(nftt.eq.2) then
else if(nftt.ge.2) then
if(qual.gt.qualbest) then
deepbest=avemsg
qualbest=qual
@ -502,7 +511,6 @@ contains
endif
endif
enddo
if(nfttbest.eq.2) then
avemsg=deepbest !### ???
deepave=deepbest

View File

@ -169,23 +169,19 @@ program jt65sim
if(csubmode.eq.'B' .and. snrdb.eq.0.0) xsnr=-21 - isig
if(csubmode.eq.'C' .and. snrdb.eq.0.0) xsnr=-21 - isig
!###
! call1="K1ABC"
! ic3=65+mod(isig-1,26)
! ic2=65+mod((isig-1)/26,26)
! ic1=65
! call2="W9"//char(ic1)//char(ic2)//char(ic3)
! write(msg,1010) call1,call2,nint(xsnr)
!1010 format(a5,1x,a5,1x,i3.2)
!###
call packmsg(msg,dgen,itype) !Pack message into 12 six-bit bytes
call rs_encode(dgen,sent) !Encode using RS(63,12)
call interleave63(sent,1) !Interleave channel symbols
call graycode65(sent,63,1) !Apply Gray code
nprc_test=0
i1=len(trim(msg))
if(i1.gt.10) then
if(msg(i1-3:i1).eq.' OOO') nprc_test=1
endif
k=0
do j=1,nsym !Insert sync and data into itone()
if(nprc(j).eq.0) then
if(nprc(j).eq.nprc_test) then
k=k+1
itone(j)=sent(k)+2
else

View File

@ -2468,7 +2468,7 @@ void MainWindow::on_actionCopyright_Notice_triggered()
"\"The algorithms, source code, look-and-feel of WSJT-X and related "
"programs, and protocol specifications for the modes FSK441, FT8, JT4, "
"JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) "
"2001-2019 by one or more of the following authors: Joseph Taylor, "
"2001-2020 by one or more of the following authors: Joseph Taylor, "
"K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, "
"IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; "
"Philip Karn, KA9Q; and other members of the WSJT Development Group.\"");
@ -2593,15 +2593,15 @@ void MainWindow::on_actionColors_triggered()
void MainWindow::on_actionMessage_averaging_triggered()
{
if(!m_msgAvgWidget) {
if(m_msgAvgWidget == NULL) {
m_msgAvgWidget.reset (new MessageAveraging {m_settings, m_config.decoded_text_font ()});
// Connect signals from Message Averaging window
connect (this, &MainWindow::finished, m_msgAvgWidget.data (), &MessageAveraging::close);
}
m_msgAvgWidget->showNormal();
m_msgAvgWidget->raise ();
m_msgAvgWidget->activateWindow ();
m_msgAvgWidget->raise();
m_msgAvgWidget->activateWindow();
}
void MainWindow::on_actionOpen_triggered() //Open File
@ -3086,17 +3086,6 @@ void MainWindow::decodeDone ()
if(dec_data.params.nzhsym==m_earlyDecode2) m_blankLine=false;
}
if(SpecOp::FOX == m_config.special_op_id()) houndCallers();
/*
auto now = QDateTime::currentDateTimeUtc();
double tsec = fmod(double(now.toMSecsSinceEpoch()),86400000.0)/1000.0;
double tseq = fmod(double(now.toMSecsSinceEpoch() ),1000.0*m_TRperiod)/1000.0;
if(tseq < 0.5*m_TRperiod) tseq+= m_TRperiod;
QString t="";
t.sprintf("ee decodeDone %11.3f %5d %5d %7.3f ",tsec,m_ihsym,m_ihsym,tseq);
qDebug().noquote() << t << QDateTime::currentDateTimeUtc().toString("hh:mm:ss.zzz");
*/
to_jt9(m_ihsym,-1,1); //Tell jt9 we know it has finished
}
@ -3104,19 +3093,18 @@ void MainWindow::readFromStdout() //readFromStdout
{
while(proc_jt9.canReadLine()) {
auto line_read = proc_jt9.readLine ();
if (auto p = std::strpbrk (line_read.constData (), "\n\r"))
{
if (auto p = std::strpbrk (line_read.constData (), "\n\r")) {
// truncate before line ending chars
line_read = line_read.left (p - line_read.constData ());
}
if(m_mode!="FT8" and m_mode!="FT4") {
//Pad 22-char msg to at least 37 chars
line_read = line_read.left(43) + " " + line_read.mid(43);
line_read = line_read.left(44) + " " + line_read.mid(44);
}
bool bAvgMsg=false;
int navg=0;
if(line_read.indexOf("<DecodeFinished>") >= 0) {
// qDebug() << "bb" << QDateTime::currentDateTimeUtc().toString("hh:mm:ss.zzz") << line_read;
if(m_mode!="FT8" or dec_data.params.nzhsym==50) m_nDecodes=0;
if(m_mode=="QRA64") m_wideGraph->drawRed(0,0);
m_bDecoded = line_read.mid(20).trimmed().toInt() > 0;
@ -3140,17 +3128,26 @@ void MainWindow::readFromStdout() //readFromStdout
m_nDecodes+=1;
ndecodes_label.setText(QString::number(m_nDecodes));
if(m_mode=="JT4" or m_mode=="JT65" or m_mode=="QRA64") {
int n=line_read.indexOf("f");
if(n<0) n=line_read.indexOf("d");
if(n>0) {
QString tt=line_read.mid(n+1,1);
navg=tt.toInt();
if(navg==0) {
char c = tt.data()->toLatin1();
if(int(c)>=65 and int(c)<=90) navg=int(c)-54;
int nf=line_read.indexOf("f");
if(nf>0) {
navg=line_read.mid(nf+1,1).toInt();
if(line_read.indexOf("f*")>0) navg=10;
}
if(navg>1 or line_read.indexOf("f*")>0) bAvgMsg=true;
int nd=-1;
if(nf<0) nd=line_read.indexOf("d");
if(nd>0) {
navg=line_read.mid(nd+2,1).toInt();
if(line_read.mid(nd+2,1)=="*") navg=10;
}
if(m_mode=="JT65") {
int na=-1;
if(nf<0 and nd<0) na=line_read.indexOf("a");
if(na>0) {
navg=line_read.mid(na+2,1).toInt();
if(line_read.mid(na+2,1)=="*") navg=10;
}
}
if(navg>=2) bAvgMsg=true;
}
write_all("Rx",line_read.trimmed());
if (m_config.insert_blank () && m_blankLine && SpecOp::FOX != m_config.special_op_id()) {
@ -3237,7 +3234,8 @@ void MainWindow::readFromStdout() //readFromStdout
if(SpecOp::FOX!=m_config.special_op_id() and (for_us or (abs(audioFreq - m_wideGraph->rxFreq()) <= 10))) bDisplayRight=true;
}
} else {
if(abs(audioFreq - m_wideGraph->rxFreq()) <= 10) bDisplayRight=true;
if((abs(audioFreq - m_wideGraph->rxFreq()) <= 10) and
!m_config.enable_VHF_features()) bDisplayRight=true;
}
if (bDisplayRight) {
@ -4025,9 +4023,7 @@ void MainWindow::guiUpdate()
//Once per second:
if(nsec != m_sec0) {
// qDebug() << "onesec" << m_config.force_call_1st();
// if((!m_msgAvgWidget or (m_msgAvgWidget and !m_msgAvgWidget->isVisible()))
// and (SpecOp::NONE < m_config.special_op_id()) and (SpecOp::HOUND > m_config.special_op_id())) on_actionFox_Log_triggered();
// qDebug() << "onesec" << m_mode;
if(m_freqNominal!=0 and m_freqNominal<50000000 and m_config.enable_VHF_features()) {
if(!m_bVHFwarned) vhfWarning();
} else {
@ -7293,8 +7289,11 @@ void::MainWindow::VHF_features_enabled(bool b)
ui->actionMessage_averaging->setEnabled(b);
ui->actionEnable_AP_DXcall->setVisible (m_mode=="QRA64");
ui->actionEnable_AP_JT65->setVisible (b && m_mode=="JT65");
if(!b && m_msgAvgWidget and (SpecOp::FOX != m_config.special_op_id()) and !m_config.autoLog()) {
if(m_msgAvgWidget->isVisible()) m_msgAvgWidget->close();
if(m_msgAvgWidget->isVisible() and m_mode!="JT4" and m_mode!="JT9" and m_mode!="JT65") {
m_msgAvgWidget->close();
}
}
}