diff --git a/Transceiver/OmniRigTransceiver.cpp b/Transceiver/OmniRigTransceiver.cpp index 00d76546a..48219ecde 100644 --- a/Transceiver/OmniRigTransceiver.cpp +++ b/Transceiver/OmniRigTransceiver.cpp @@ -107,6 +107,12 @@ OmniRigTransceiver::OmniRigTransceiver (std::unique_ptr 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"); - rig_->SetTx (on ? OmniRig::PM_TX : OmniRig::PM_RX); + 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_) diff --git a/Transceiver/OmniRigTransceiver.hpp b/Transceiver/OmniRigTransceiver.hpp index 4269a3346..30c46348b 100644 --- a/Transceiver/OmniRigTransceiver.hpp +++ b/Transceiver/OmniRigTransceiver.hpp @@ -32,6 +32,7 @@ public: // takes ownership of wrapped Transceiver explicit OmniRigTransceiver (std::unique_ptr wrapped, RigNumber, TransceiverFactory::PTTMethod ptt_type, QString const& ptt_port, QObject * parent = nullptr); + ~OmniRigTransceiver (); int do_start () override; void do_stop () override; diff --git a/doc/user_guide/en/decoder_notes.adoc b/doc/user_guide/en/decoder_notes.adoc index cdae09a01..214f0bb17 100644 --- a/doc/user_guide/en/decoder_notes.adoc +++ b/doc/user_guide/en/decoder_notes.adoc @@ -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 diff --git a/lib/decode65a.f90 b/lib/decode65a.f90 index 777031e69..ec9fbd311 100644 --- a/lib/decode65a.f90 +++ b/lib/decode65a.f90 @@ -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) diff --git a/lib/decode65b.f90 b/lib/decode65b.f90 index 2be808145..0ff169bc7 100644 --- a/lib/decode65b.f90 +++ b/lib/decode65b.f90 @@ -21,7 +21,7 @@ subroutine decode65b(s2,nflip,nadd,mode65,ntrials,naggressive,ndepth, & call extract(s3,nadd,mode65,ntrials,naggressive,ndepth,nflip,mycall, & hiscall,hisgrid,nQSOProgress,ljt65apon,ncount, & - nhist,decoded,ltext,nft,qual) + nhist,decoded,ltext,nft,qual) ! Suppress "birdie messages" and other garbage decodes: if(decoded(1:7).eq.'000AAA ') ncount=-1 diff --git a/lib/decoder.f90 b/lib/decoder.f90 index 6902c3a58..9e06c649d 100644 --- a/lib/decoder.f90 +++ b/lib/decoder.f90 @@ -407,7 +407,9 @@ contains 1011 format(i4.4,i4,i5,f6.2,f8.0,i4,3x,a22,' QRA64',i3) 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 diff --git a/lib/extract.f90 b/lib/extract.f90 index 197448fe5..234f51370 100644 --- a/lib/extract.f90 +++ b/lib/extract.f90 @@ -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) diff --git a/lib/jt65_decode.f90 b/lib/jt65_decode.f90 index 6d0bd6243..ed12a3f3a 100644 --- a/lib/jt65_decode.f90 +++ b/lib/jt65_decode.f90 @@ -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,19 +236,20 @@ 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 - + nhard_min=param(1) nrtt1000=param(4) ntotal_min=param(5) nsmo=param(9) - + nfreq=nint(freq+a(1)) ndrift=nint(2.0*a(2)) if(bVHF) then @@ -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,7 +404,10 @@ 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. nfsum=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 @@ -512,7 +520,7 @@ contains nftt=nfttbest endif 900 continue - + return end subroutine avg65 diff --git a/lib/jt65sim.f90 b/lib/jt65sim.f90 index 6f7030cf4..26e558f44 100644 --- a/lib/jt65sim.f90 +++ b/lib/jt65sim.f90 @@ -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 diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 8f09e2c58..1fe392178 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -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")) - { - // truncate before line ending chars - line_read = line_read.left (p - line_read.constData ()); - } + 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("") >= 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; - } - if(navg>1 or line_read.indexOf("f*")>0) bAvgMsg=true; + 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; } + 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(); + } } }