From a5be2fb4efc10a16080d6281f5aae30d54bcca10 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 26 Oct 2021 08:58:06 -0400 Subject: [PATCH 01/74] TEMPORARY: save downsampled data at f0=1500 Hz, for testing ft8q3. --- CMakeLists.txt | 4 ++++ lib/ft8/ft8b.f90 | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index e1dd5989a..a330f6187 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -423,6 +423,7 @@ set (wsjt_FSRCS lib/ft8/ft8b.f90 lib/ft8/ft8code.f90 lib/ft8/ft8_downsample.f90 + lib/ft8/ft8q3.f90 lib/ft8/ft8sim.f90 lib/gen4.f90 lib/gen65.f90 @@ -1177,6 +1178,9 @@ target_link_libraries (ft4code wsjt_fort wsjt_cxx) add_executable (ft8sim lib/ft8/ft8sim.f90) target_link_libraries (ft8sim wsjt_fort wsjt_cxx) +add_executable (ft8q3 lib/ft8/ft8q3.f90) +target_link_libraries (ft8q3 wsjt_fort wsjt_cxx) + add_executable (msk144sim lib/msk144sim.f90) target_link_libraries (msk144sim wsjt_fort wsjt_cxx) diff --git a/lib/ft8/ft8b.f90 b/lib/ft8/ft8b.f90 index d96cbd9c7..c66a8d92f 100644 --- a/lib/ft8/ft8b.f90 +++ b/lib/ft8/ft8b.f90 @@ -104,6 +104,12 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,nzhsym,lapon, & call timer('ft8_down',0) call ft8_downsample(dd0,newdat,f1,cd0) !Mix f1 to baseband and downsample call timer('ft8_down',1) + if(f1.eq.1500.0) then + do i=0,3199 + write(40,3040) i,i/200.0,cd0(i) +3040 format(i5,f10.6,2x,2f10.3) + enddo + endif i0=nint((xdt+0.5)*fs2) !Initial guess for start of signal smax=0.0 From 0ed62e4f80931eac5bfec219ab2f2f5eae1c516d Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 26 Oct 2021 12:14:32 -0400 Subject: [PATCH 02/74] Save test routine ft8q3.f90 -- first, as a main program. --- lib/ft8/ft8q3.f90 | 84 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 lib/ft8/ft8q3.f90 diff --git a/lib/ft8/ft8q3.f90 b/lib/ft8/ft8q3.f90 new file mode 100644 index 000000000..41bd9313b --- /dev/null +++ b/lib/ft8/ft8q3.f90 @@ -0,0 +1,84 @@ +program ft8q3 + +! Test q3-style decodes for FT8. + + use packjt77 + parameter(NN=79,NSPS=32) + parameter(NWAVE=NN*NSPS) !2528 + parameter(NZ=3200,NLAGS=NZ-NWAVE) + character arg*12 + character msg37*37 + character c77*77 + complex cwave(0:NWAVE-1) + complex cd(0:NZ-1) + complex z + real xjunk(NWAVE) + real ccf(0:NLAGS-1) + integer itone(NN) + integer*1 msgbits(77) + +! Get command-line argument(s) + nargs=iargc() + if(nargs.ne.3) then + print*,'Usage: ft8q3 DT f0 "message"' + go to 999 + endif + call getarg(1,arg) + read(arg,*) xdt !Time offset from nominal (s) + call getarg(2,arg) + read(arg,*) f0 !Frequency (Hz) + call getarg(3,msg37) !Message to be transmitted + + fs=200.0 !Sample rate (Hz) + dt=1.0/fs !Sample interval (s) + bt=2.0 + +! Source-encode, then get itone() + i3=-1 + n3=-1 + call pack77(msg37,i3,n3,c77) + call genft8(msg37,i3,n3,msgsent37,msgbits,itone) +! Generate complex cwave + call gen_ft8wave(itone,NN,NSPS,bt,fs,f0,cwave,xjunk,1,NWAVE) + + do i=0,NZ-1 + read(40,3040) cd(i) +3040 format(17x,2f10.3) + enddo + + lagbest=-1 + ccfbest=0. + nsum=32*2 + do lag=0,nlags-1 + z=0. + s=0. + do i=0,NWAVE-1 + z=z + cd(i+lag)*conjg(cwave(i)) + if(mod(i,nsum).eq.nsum-1 .or. i.eq.NWAVE-1) then + s=s + abs(z) + z=0. + endif + enddo +! ccf(lag)=abs(z) + ccf(lag)=s + write(42,3042) lag-100,(lag-100)/200.0,ccf(lag) +3042 format(i5,f10.3,f10.0) + if(ccf(lag).gt.ccfbest) then + ccfbest=ccf(lag) + lagbest=lag + endif + enddo + + z=0. + do i=0,NWAVE-1 + z=z + cd(i+lagbest)*conjg(cwave(i)) + if(mod(i,32).eq.31) then + amp=abs(z)**2 + pha=atan2(aimag(z),real(z)) + j=i/32 + write(43,3043) z,j,amp,pha +3043 format(2f12.0,i6,f12.0,f12.6) + endif + enddo + +999 end program ft8q3 From 384899754facc50c46a6bbe6334fc279082022ea Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 26 Oct 2021 12:31:24 -0400 Subject: [PATCH 03/74] Add initial version of test_ft8q3.f90. --- CMakeLists.txt | 5 ++- lib/ft8/test_ft8q3.f90 | 84 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 lib/ft8/test_ft8q3.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index a330f6187..29984ba52 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -424,6 +424,7 @@ set (wsjt_FSRCS lib/ft8/ft8code.f90 lib/ft8/ft8_downsample.f90 lib/ft8/ft8q3.f90 + lib/ft8/test_ft8q3.f90 lib/ft8/ft8sim.f90 lib/gen4.f90 lib/gen65.f90 @@ -1178,8 +1179,8 @@ target_link_libraries (ft4code wsjt_fort wsjt_cxx) add_executable (ft8sim lib/ft8/ft8sim.f90) target_link_libraries (ft8sim wsjt_fort wsjt_cxx) -add_executable (ft8q3 lib/ft8/ft8q3.f90) -target_link_libraries (ft8q3 wsjt_fort wsjt_cxx) +add_executable (test_ft8q3 lib/ft8/test_ft8q3.f90) +target_link_libraries (test_ft8q3 wsjt_fort wsjt_cxx) add_executable (msk144sim lib/msk144sim.f90) target_link_libraries (msk144sim wsjt_fort wsjt_cxx) diff --git a/lib/ft8/test_ft8q3.f90 b/lib/ft8/test_ft8q3.f90 new file mode 100644 index 000000000..06ad11ef0 --- /dev/null +++ b/lib/ft8/test_ft8q3.f90 @@ -0,0 +1,84 @@ +program test_ft8q3 + +! Test q3-style decodes for FT8. + + use packjt77 + parameter(NN=79,NSPS=32) + parameter(NWAVE=NN*NSPS) !2528 + parameter(NZ=3200,NLAGS=NZ-NWAVE) + character arg*12 + character msg37*37 + character c77*77 + complex cwave(0:NWAVE-1) + complex cd(0:NZ-1) + complex z + real xjunk(NWAVE) + real ccf(0:NLAGS-1) + integer itone(NN) + integer*1 msgbits(77) + +! Get command-line argument(s) + nargs=iargc() + if(nargs.ne.3) then + print*,'Usage: ft8q3 DT f0 "message"' + go to 999 + endif + call getarg(1,arg) + read(arg,*) xdt !Time offset from nominal (s) + call getarg(2,arg) + read(arg,*) f0 !Frequency (Hz) + call getarg(3,msg37) !Message to be transmitted + + fs=200.0 !Sample rate (Hz) + dt=1.0/fs !Sample interval (s) + bt=2.0 + +! Source-encode, then get itone() + i3=-1 + n3=-1 + call pack77(msg37,i3,n3,c77) + call genft8(msg37,i3,n3,msgsent37,msgbits,itone) +! Generate complex cwave + call gen_ft8wave(itone,NN,NSPS,bt,fs,f0,cwave,xjunk,1,NWAVE) + + do i=0,NZ-1 + read(40,3040) cd(i) +3040 format(17x,2f10.3) + enddo + + lagbest=-1 + ccfbest=0. + nsum=32*2 + do lag=0,nlags-1 + z=0. + s=0. + do i=0,NWAVE-1 + z=z + cd(i+lag)*conjg(cwave(i)) + if(mod(i,nsum).eq.nsum-1 .or. i.eq.NWAVE-1) then + s=s + abs(z) + z=0. + endif + enddo +! ccf(lag)=abs(z) + ccf(lag)=s + write(42,3042) lag-100,(lag-100)/200.0,ccf(lag) +3042 format(i5,f10.3,f10.0) + if(ccf(lag).gt.ccfbest) then + ccfbest=ccf(lag) + lagbest=lag + endif + enddo + + z=0. + do i=0,NWAVE-1 + z=z + cd(i+lagbest)*conjg(cwave(i)) + if(mod(i,32).eq.31) then + amp=abs(z)**2 + pha=atan2(aimag(z),real(z)) + j=i/32 + write(43,3043) z,j,amp,pha +3043 format(2f12.0,i6,f12.0,f12.6) + endif + enddo + +999 end program test_ft8q3 From 901e9dbc38ac5bcfbd588196d7b1007ce78419d4 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 26 Oct 2021 16:40:14 -0400 Subject: [PATCH 04/74] Working program test_ft8q3 and subroutine ft8q3(). --- lib/ft8/ft8b.f90 | 3 +- lib/ft8/ft8q3.f90 | 140 ++++++++++++++++++++++++----------------- lib/ft8/test_ft8q3.f90 | 71 +++++---------------- 3 files changed, 99 insertions(+), 115 deletions(-) diff --git a/lib/ft8/ft8b.f90 b/lib/ft8/ft8b.f90 index c66a8d92f..71f1addaa 100644 --- a/lib/ft8/ft8b.f90 +++ b/lib/ft8/ft8b.f90 @@ -104,7 +104,8 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,nzhsym,lapon, & call timer('ft8_down',0) call ft8_downsample(dd0,newdat,f1,cd0) !Mix f1 to baseband and downsample call timer('ft8_down',1) - if(f1.eq.1500.0) then + if(abs(nint(f1)-527).le.1) then + rewind(40) do i=0,3199 write(40,3040) i,i/200.0,cd0(i) 3040 format(i5,f10.6,2x,2f10.3) diff --git a/lib/ft8/ft8q3.f90 b/lib/ft8/ft8q3.f90 index 41bd9313b..441564a1c 100644 --- a/lib/ft8/ft8q3.f90 +++ b/lib/ft8/ft8q3.f90 @@ -1,84 +1,110 @@ -program ft8q3 +subroutine ft8q3(cd,xdt,f0,call_1,call_2,grid4,msgbest,snr) -! Test q3-style decodes for FT8. +! Get q3-style decodes for FT8. use packjt77 parameter(NN=79,NSPS=32) parameter(NWAVE=NN*NSPS) !2528 parameter(NZ=3200,NLAGS=NZ-NWAVE) - character arg*12 - character msg37*37 + character*12 call_1,call_2 + character*4 grid4 + character*37 msg,msgbest,msgsent character c77*77 complex cwave(0:NWAVE-1) complex cd(0:NZ-1) complex z real xjunk(NWAVE) real ccf(0:NLAGS-1) + real ccfmsg(207) integer itone(NN) integer*1 msgbits(77) + logical std_1,std_2 -! Get command-line argument(s) - nargs=iargc() - if(nargs.ne.3) then - print*,'Usage: ft8q3 DT f0 "message"' - go to 999 - endif - call getarg(1,arg) - read(arg,*) xdt !Time offset from nominal (s) - call getarg(2,arg) - read(arg,*) f0 !Frequency (Hz) - call getarg(3,msg37) !Message to be transmitted + if(xdt.eq.-99.0) return !Silence compiler warning + call stdcall(call_1,std_1) + call stdcall(call_2,std_2) fs=200.0 !Sample rate (Hz) dt=1.0/fs !Sample interval (s) - bt=2.0 + bt=2.0 + ccfbest=0. + lagbest=-1 + + do imsg=1,207 + msg=trim(call_1)//' '//trim(call_2) + i=imsg + if(.not.std_1) then + if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2) + if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>' + else if(.not.std_2) then + if(i.le.4 .or. i.eq.6) msg='<'//trim(call_1)//'> '//trim(call_2) + if(i.ge.7) msg=trim(call_1)//' <'//trim(call_2)//'>' + endif + j0=len(trim(msg))+2 + if(i.eq.2) msg(j0:j0+2)='RRR' + if(i.eq.3) msg(j0:j0+3)='RR73' + if(i.eq.4) msg(j0:j0+1)='73' + if(i.eq.5) then + if(std_2) msg='CQ '//trim(call_2)//' '//grid4 + if(.not.std_2) msg='CQ '//trim(call_2) + endif + if(i.eq.6 .and. std_2) msg(j0:j0+3)=grid4 + if(i.ge.7 .and. i.le.206) then + isnr = -50 + (i-7)/2 + if(iand(i,1).eq.1) then + write(msg(j0:j0+2),'(i3.2)') isnr + if(msg(j0:j0).eq.' ') msg(j0:j0)='+' + else + write(msg(j0:j0+3),'("R",i3.2)') isnr + if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+' + endif + endif + if(i.eq.207) msg='TNX 73 GL' ! Source-encode, then get itone() - i3=-1 - n3=-1 - call pack77(msg37,i3,n3,c77) - call genft8(msg37,i3,n3,msgsent37,msgbits,itone) + i3=-1 + n3=-1 + call pack77(msg,i3,n3,c77) + call genft8(msg,i3,n3,msgsent,msgbits,itone) ! Generate complex cwave - call gen_ft8wave(itone,NN,NSPS,bt,fs,f0,cwave,xjunk,1,NWAVE) + call gen_ft8wave(itone,NN,NSPS,bt,fs,f0,cwave,xjunk,1,NWAVE) - do i=0,NZ-1 - read(40,3040) cd(i) -3040 format(17x,2f10.3) - enddo - - lagbest=-1 - ccfbest=0. - nsum=32*2 - do lag=0,nlags-1 - z=0. - s=0. - do i=0,NWAVE-1 - z=z + cd(i+lag)*conjg(cwave(i)) - if(mod(i,nsum).eq.nsum-1 .or. i.eq.NWAVE-1) then - s=s + abs(z) - z=0. + lagmax=-1 + ccfmax=0. + nsum=32*2 + do lag=0,nlags-1 + z=0. + s=0. + do i=0,NWAVE-1 + z=z + cd(i+lag)*conjg(cwave(i)) + if(mod(i,nsum).eq.nsum-1 .or. i.eq.NWAVE-1) then + s=s + abs(z) + z=0. + endif + enddo + ccf(lag)=s + if(ccf(lag).gt.ccfmax) then + ccfmax=ccf(lag) + lagmax=lag endif - enddo -! ccf(lag)=abs(z) - ccf(lag)=s - write(42,3042) lag-100,(lag-100)/200.0,ccf(lag) -3042 format(i5,f10.3,f10.0) - if(ccf(lag).gt.ccfbest) then - ccfbest=ccf(lag) - lagbest=lag + enddo ! lag + ccfmsg(imsg)=ccfmax + if(ccfmax.gt.ccfbest) then + ccfbest=ccfmax + lagbest=lagmax + msgbest=msg endif - enddo + enddo ! imsg - z=0. - do i=0,NWAVE-1 - z=z + cd(i+lagbest)*conjg(cwave(i)) - if(mod(i,32).eq.31) then - amp=abs(z)**2 - pha=atan2(aimag(z),real(z)) - j=i/32 - write(43,3043) z,j,amp,pha -3043 format(2f12.0,i6,f12.0,f12.6) - endif + call pctile(ccfmsg,207,50,base) + call pctile(ccfmsg,207,67,sigma) + sigma=sigma-base + ccfmsg=(ccfmsg-base)/(2.5*sigma) + do imsg=1,207 + write(44,3044) imsg,ccfmsg(imsg) +3044 format(i5,f10.3) enddo + snr=maxval(ccfmsg) -999 end program ft8q3 + return +end subroutine ft8q3 diff --git a/lib/ft8/test_ft8q3.f90 b/lib/ft8/test_ft8q3.f90 index 06ad11ef0..4a3802c3c 100644 --- a/lib/ft8/test_ft8q3.f90 +++ b/lib/ft8/test_ft8q3.f90 @@ -7,78 +7,35 @@ program test_ft8q3 parameter(NWAVE=NN*NSPS) !2528 parameter(NZ=3200,NLAGS=NZ-NWAVE) character arg*12 - character msg37*37 - character c77*77 - complex cwave(0:NWAVE-1) + character*37 msg + character*12 call_1,call_2 + character*4 grid4 complex cd(0:NZ-1) - complex z - real xjunk(NWAVE) - real ccf(0:NLAGS-1) - integer itone(NN) - integer*1 msgbits(77) ! Get command-line argument(s) nargs=iargc() - if(nargs.ne.3) then - print*,'Usage: ft8q3 DT f0 "message"' + if(nargs.ne.4 .and. nargs.ne.5) then + print*,'Usage: ft8q3 DT f0 call_1 call_2 [grid4]' go to 999 endif call getarg(1,arg) read(arg,*) xdt !Time offset from nominal (s) call getarg(2,arg) read(arg,*) f0 !Frequency (Hz) - call getarg(3,msg37) !Message to be transmitted - - fs=200.0 !Sample rate (Hz) - dt=1.0/fs !Sample interval (s) - bt=2.0 - -! Source-encode, then get itone() - i3=-1 - n3=-1 - call pack77(msg37,i3,n3,c77) - call genft8(msg37,i3,n3,msgsent37,msgbits,itone) -! Generate complex cwave - call gen_ft8wave(itone,NN,NSPS,bt,fs,f0,cwave,xjunk,1,NWAVE) + call getarg(3,call_1) !First callsign + call getarg(4,call_2) !Second callsign + grid4=' ' + if(nargs.eq.5) call getarg(5,grid4) !Locator for call_2 do i=0,NZ-1 read(40,3040) cd(i) 3040 format(17x,2f10.3) enddo - lagbest=-1 - ccfbest=0. - nsum=32*2 - do lag=0,nlags-1 - z=0. - s=0. - do i=0,NWAVE-1 - z=z + cd(i+lag)*conjg(cwave(i)) - if(mod(i,nsum).eq.nsum-1 .or. i.eq.NWAVE-1) then - s=s + abs(z) - z=0. - endif - enddo -! ccf(lag)=abs(z) - ccf(lag)=s - write(42,3042) lag-100,(lag-100)/200.0,ccf(lag) -3042 format(i5,f10.3,f10.0) - if(ccf(lag).gt.ccfbest) then - ccfbest=ccf(lag) - lagbest=lag - endif - enddo - - z=0. - do i=0,NWAVE-1 - z=z + cd(i+lagbest)*conjg(cwave(i)) - if(mod(i,32).eq.31) then - amp=abs(z)**2 - pha=atan2(aimag(z),real(z)) - j=i/32 - write(43,3043) z,j,amp,pha -3043 format(2f12.0,i6,f12.0,f12.6) - endif - enddo + call sec0(0,t) + call ft8q3(cd,xdt,f0,call_1,call_2,grid4,msg,snr) + call sec0(1,t) + write(*,1100) t,snr,trim(msg) +1100 format('Time:',f6.2,' S/N:',f6.1,' msg: ',a) 999 end program test_ft8q3 From f51a7d4f7dac1f4fa765b75910bf2a8cdd120504 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 27 Oct 2021 12:09:23 -0400 Subject: [PATCH 05/74] Correct a longstanding error in values of "nw()" returned by subroutine split77(). --- lib/77bit/packjt77.f90 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/77bit/packjt77.f90 b/lib/77bit/packjt77.f90 index b8a4ac424..9bd60f05d 100644 --- a/lib/77bit/packjt77.f90 +++ b/lib/77bit/packjt77.f90 @@ -824,7 +824,9 @@ subroutine split77(msg,nwords,nw,w) iz=j !Message length nwords=k !Number of words in msg if(nwords.le.0) go to 900 - nw(k)=len(trim(w(k))) + do i=1,nwords + nw(i)=len(trim(w(i))) + enddo msg(iz+1:)=' ' if(nwords.lt.3) go to 900 call chkcall(w(3),bcall_1,ok1) @@ -833,7 +835,7 @@ subroutine split77(msg,nwords,nw,w) w(2:12)=w(3:13) !Move all remaining words down by one nwords=nwords-1 endif - + 900 return end subroutine split77 From 5a0cb0f0a0882b45c0e093740b0e39d779d31293 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 28 Oct 2021 11:47:00 -0400 Subject: [PATCH 06/74] Fix a bug in gen_ft8wave.f90 that failed to update pulse and ctab when sample rate changes. --- lib/ft8/gen_ft8wave.f90 | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/ft8/gen_ft8wave.f90 b/lib/ft8/gen_ft8wave.f90 index 9e2773758..c7be09159 100644 --- a/lib/ft8/gen_ft8wave.f90 +++ b/lib/ft8/gen_ft8wave.f90 @@ -9,11 +9,12 @@ subroutine gen_ft8wave(itone,nsym,nsps,bt,fsample,f0,cwave,wave,icmplx,nwave) real pulse(23040) real dphi(0:(nsym+2)*nsps-1) integer itone(nsym) - data ibt0/0/ - save pulse,twopi,dt,hmod,ibt0,ctab + data fchk0/0.0/ + save pulse,twopi,dt,hmod,fchk0,ctab ibt=nint(10*bt) - if(ibt0.ne.ibt) then + fchk=nsym+nsps+bt+fsample + if(fchk.ne.fchk0) then twopi=8.0*atan(1.0) dt=1.0/fsample hmod=1.0 @@ -22,11 +23,11 @@ subroutine gen_ft8wave(itone,nsym,nsps,bt,fsample,f0,cwave,wave,icmplx,nwave) tt=(i-1.5*nsps)/real(nsps) pulse(i)=gfsk_pulse(bt,tt) enddo - ibt0=nint(10*bt) do i=0,NTAB-1 phi=i*twopi/NTAB ctab(i)=cmplx(cos(phi),sin(phi)) enddo + fchk0=fchk endif ! Compute the smoothed frequency waveform. From 2b25c51169dfd8ed61cae454a75861ff4ea9a7a0 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 28 Oct 2021 15:01:00 -0400 Subject: [PATCH 07/74] First fully working version of 'a7' (q3-style) decoding for FT8. --- CMakeLists.txt | 1 + lib/ft8/ft8b.f90 | 7 ------ lib/ft8/ft8q3.f90 | 8 +++++++ lib/ft8_decode.f90 | 56 +++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 62 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 29984ba52..83b1cc6d7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -336,6 +336,7 @@ set (wsjt_FSRCS lib/timer_module.f90 lib/wavhdr.f90 lib/qra/q65/q65_encoding_modules.f90 + lib/ft8_a7.f90 # remaining non-module sources lib/addit.f90 diff --git a/lib/ft8/ft8b.f90 b/lib/ft8/ft8b.f90 index 71f1addaa..d96cbd9c7 100644 --- a/lib/ft8/ft8b.f90 +++ b/lib/ft8/ft8b.f90 @@ -104,13 +104,6 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,nzhsym,lapon, & call timer('ft8_down',0) call ft8_downsample(dd0,newdat,f1,cd0) !Mix f1 to baseband and downsample call timer('ft8_down',1) - if(abs(nint(f1)-527).le.1) then - rewind(40) - do i=0,3199 - write(40,3040) i,i/200.0,cd0(i) -3040 format(i5,f10.6,2x,2f10.3) - enddo - endif i0=nint((xdt+0.5)*fs2) !Initial guess for start of signal smax=0.0 diff --git a/lib/ft8/ft8q3.f90 b/lib/ft8/ft8q3.f90 index 441564a1c..715581af8 100644 --- a/lib/ft8/ft8q3.f90 +++ b/lib/ft8/ft8q3.f90 @@ -69,6 +69,14 @@ subroutine ft8q3(cd,xdt,f0,call_1,call_2,grid4,msgbest,snr) ! Generate complex cwave call gen_ft8wave(itone,NN,NSPS,bt,fs,f0,cwave,xjunk,1,NWAVE) + if(imsg.eq.79) then + print*,NN,NSPS,bt,fs,f0,NWAVE,itone(1:7) + do i=0,NWAVE-1 + write(45,3045) i,cd(i),100*cwave(i) +3045 format(i5,4e12.3) + enddo + endif + lagmax=-1 ccfmax=0. nsum=32*2 diff --git a/lib/ft8_decode.f90 b/lib/ft8_decode.f90 index 73d0f8c2a..626284fc8 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -38,6 +38,7 @@ contains use iso_c_binding, only: c_bool, c_int use timer_module, only: timer use shmem, only: shmem_lock, shmem_unlock + use ft8_a7 include 'ft8/ft8_params.f90' @@ -64,13 +65,31 @@ contains integer itone_save(NN,MAX_EARLY) real f1_save(MAX_EARLY) real xdt_save(MAX_EARLY) + complex cd0(0:3199) + data nutc0/-1/ - save s,dd,dd1,ndec_early,itone_save,f1_save,xdt_save,lsubtracted,allmessages + save s,dd,dd1,nutc0,ndec_early,itone_save,f1_save,xdt_save,lsubtracted,& + allmessages this%callback => callback write(datetime,1001) nutc !### TEMPORARY ### 1001 format("000000_",i6.6) + if(nutc0.eq.-1) then + msg0=' ' + endif + if(nutc.ne.nutc0) then +! New UTC. Move previously saved 'a7' data from k=1 to k=0 + iz=ndec(jseq,1) + dt0(1:iz,jseq,0) = dt0(1:iz,jseq,1) + f0(1:iz,jseq,0) = f0(1:iz,jseq,1) + msg0(1:iz,jseq,0) = msg0(1:iz,jseq,1) + ndec(jseq,0)=iz + ndec(jseq,1)=0 + nutc0=nutc +! print*,'BBB',jseq,ndec(0,0),ndec(0,1) + endif + if(ndepth.eq.1 .and. nzhsym.lt.50) then ndec_early=0 return @@ -178,7 +197,7 @@ contains hiscall12,f1,xdt,xbase,apsym2,aph10,nharderrors,dmin, & nbadcrc,iappass,msg37,xsnr,itone) call timer('ft8b ',1) - nsnr=nint(xsnr) + nsnr=nint(xsnr) xdt=xdt-0.5 hd=nharderrors+dmin if(nbadcrc.eq.0) then @@ -198,6 +217,7 @@ contains qual=1.0-(nharderrors+dmin)/60.0 ! scale qual to [0.0,1.0] if(emedelay.ne.0) xdt=xdt+2.0 call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual) + call ft8_a7_save(nutc,xdt,f1,msg37) endif endif call timestamp(tsec,tseq,ctime) @@ -209,7 +229,37 @@ contains 800 ndec_early=0 if(nzhsym.lt.50) ndec_early=ndecodes -900 return +900 continue +! if(nzhsym.eq.50) print*,'AA0',jseq,ndec(0,0),ndec(0,1) + if(nzhsym.eq.50 .and. ndec(jseq,0).ge.1) then + call timer('ft8_dec7',0) + newdat=.true. + do i=1,ndec(jseq,0) + if(f0(i,jseq,0).eq.-99.0) exit + if(f0(i,jseq,0).eq.-98.0) cycle +! f0(i,jseq,0)=527 +! msg0(i,jseq,0)='LX1KL OE6MDF' +! print*,'aa',i,jseq,newdat,f0(i,jseq,0),trim(msg0(i,jseq,0)) + call ft8_downsample(dd,newdat,f0(i,jseq,0),cd0) + call ft8_dec7(cd0,dt0(i,jseq,0),f0(i,jseq,0),msg0(i,jseq,0),msg37,snr7) + if(snr7.gt.4.0) then +! print*,i,msg0(i,jseq,0)(1:22),msg37(1:22),snr7 + if(associated(this%callback)) then + nsnr=nint(db(snr7)-24.0) + xdt=0. + f1=f0(i,jseq,0) + iaptype=7 + qual=1.0 + call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual) + endif + + endif + newdat=.false. + enddo + call timer('ft8_dec7',1) + endif + + return end subroutine decode subroutine timestamp(tsec,tseq,ctime) From 48b1ad1e461c30d5ab62bb804ff817ec18d9014e Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 28 Oct 2021 15:19:40 -0400 Subject: [PATCH 08/74] Send xdt and xsnr from ft8_dec7 to ft8_decode. --- lib/ft8_decode.f90 | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/lib/ft8_decode.f90 b/lib/ft8_decode.f90 index 626284fc8..259ccc10c 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -237,22 +237,17 @@ contains do i=1,ndec(jseq,0) if(f0(i,jseq,0).eq.-99.0) exit if(f0(i,jseq,0).eq.-98.0) cycle -! f0(i,jseq,0)=527 -! msg0(i,jseq,0)='LX1KL OE6MDF' -! print*,'aa',i,jseq,newdat,f0(i,jseq,0),trim(msg0(i,jseq,0)) call ft8_downsample(dd,newdat,f0(i,jseq,0),cd0) - call ft8_dec7(cd0,dt0(i,jseq,0),f0(i,jseq,0),msg0(i,jseq,0),msg37,snr7) - if(snr7.gt.4.0) then -! print*,i,msg0(i,jseq,0)(1:22),msg37(1:22),snr7 + call ft8_dec7(cd0,dt0(i,jseq,0),f0(i,jseq,0),msg0(i,jseq,0), & + xdt,xsnr,msg37) + if(xsnr.gt.-99.0) then if(associated(this%callback)) then - nsnr=nint(db(snr7)-24.0) - xdt=0. + nsnr=nint(xsnr) f1=f0(i,jseq,0) iaptype=7 qual=1.0 call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual) endif - endif newdat=.false. enddo From f13e31820470291fdd49627287a2dc08f3fa674c Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 29 Oct 2021 15:28:42 -0400 Subject: [PATCH 09/74] Improvements to a7 decoding for FT8. --- lib/ft8_a7.f90 | 209 +++++++++++++++++++++++++++++++++++++++++++++ lib/ft8_decode.f90 | 25 ++++-- 2 files changed, 225 insertions(+), 9 deletions(-) create mode 100644 lib/ft8_a7.f90 diff --git a/lib/ft8_a7.f90 b/lib/ft8_a7.f90 new file mode 100644 index 000000000..96ffe13e6 --- /dev/null +++ b/lib/ft8_a7.f90 @@ -0,0 +1,209 @@ +module ft8_a7 + + parameter(MAXDEC=100) + +! For the following three arrays +! First index i=decode number in this sequence +! Second index j=0 or 1 for even or odd sequence +! Third index k=0 or 1 for previous or current tally for this j + real dt0(MAXDEC,0:1,0:1) !dt0(i,j,k) + real f0(MAXDEC,0:1,0:1) !f0(i,j,k) + character*37 msg0(MAXDEC,0:1,0:1) !msg0(i,j,k) + + integer jseq !even=0, odd=1 + integer ndec(0:1,0:1) !ndec(j,k) + data ndec/4*0/,jseq/0/ + +contains + +subroutine ft8_a7_save(nutc,dt,f,msg) + + use packjt77 + character*37 msg,msg1 + character*13 w(19) + character*4 g4 + integer nw(19) + logical isgrid4 + +! Statement function: + isgrid4(g4)=(len_trim(g4).eq.4 .and. & + ichar(g4(1:1)).ge.ichar('A') .and. ichar(g4(1:1)).le.ichar('R') .and. & + ichar(g4(2:2)).ge.ichar('A') .and. ichar(g4(2:2)).le.ichar('R') .and. & + ichar(g4(3:3)).ge.ichar('0') .and. ichar(g4(3:3)).le.ichar('9') .and. & + ichar(g4(4:4)).ge.ichar('0') .and. ichar(g4(4:4)).le.ichar('9')) + + j=mod(nutc/5,2) !j is 0 or 1 for odd/even sequence + jseq=j + +! Add this decode to current table for this sequence + ndec(j,1)=ndec(j,1)+1 !Number of decodes in this sequence + i=ndec(j,1) !i is pointer to new table entry + if(i.ge.MAXDEC-1) return !Prevent table overflow + if(index(msg,'<...>').ge.1) return !Don't save an unknown hashcall + + dt0(i,j,1)=dt !Save dt in table + f0(i,j,1)=f !Save f in table + f0(i+1,j,1)=-99.0 !Flag after last entry in current table + call split77(msg,nwords,nw,w) !Parse msg into words + msg0(i,j,1)=trim(w(1))//' '//trim(w(2)) + if(w(1)(1:3).eq.'CQ ' .and. nw(2).le.2) then + msg0(i,j,1)='CQ '//trim(w(2))//' '//trim(w(3)) + endif + msg1=msg0(i,j,1) !Message without grid + nn=len(trim(msg1)) !Message length without grid + if(isgrid4(w(nwords))) msg0(i,j,1)=trim(msg0(i,j,1))//' '//trim(w(nwords)) + +! If a transmission at this frequency with this message fragment +! was decoded in the previous sequence, flag it as "DO NOT USE" because +! we have already decoded that station's next transmission. + + call split77(msg1,nwords,nw,w) !Parse msg into words + do i=1,ndec(j,0) + if(f0(i,j,0).le.-98.0) cycle + i2=index(msg0(i,j,0),' '//trim(w(2))) + if(abs(f-f0(i,j,0)).lt.2.0 .and. i2.ge.3) then + f0(i,j,0)=-98.0 !Remove from list of to-be-tried a7 decodes + endif + enddo + + return +end subroutine ft8_a7_save + +subroutine ft8_dec7(cd,xdt0,f0,msg0,xdt,xsnr,msgbest,snr7,snr7b) + +! Get a7 (q3-style) decodes for FT8. + + use packjt77 + parameter(NN=79,NSPS=32) + parameter(NWAVE=NN*NSPS) !2528 + parameter(NZ=3200,NLAGS=NZ-NWAVE) + parameter(MAXMSG=206) + character*12 call_1,call_2 + character*13 w(19) + character*4 grid4 + character*37 msg0,msg,msgbest,msgsent + character c77*77 + complex cwave(0:NWAVE-1) + complex cd(0:NZ-1) + complex z + real xjunk(NWAVE) + real ccf(0:NLAGS-1) + real ccfmsg(MAXMSG) + integer itone(NN) + integer nw(19) + integer*1 msgbits(77) + logical std_1,std_2 + + if(xdt0.eq.-999.0) return !Silence compiler warning + + snr7=0. + ccfmsg=0. + call split77(msg0,nwords,nw,w) !Parse msg0 into words + call_1=w(1)(1:12) + call_2=w(2)(1:12) + grid4=w(3)(1:4) + if(call_1(1:3).eq.'CQ_') call_1(3:3)=' ' + + call stdcall(call_1,std_1) + if(call_1(1:3).eq.'CQ ') std_1=.true. + call stdcall(call_2,std_2) + + fs=200.0 !Sample rate (Hz) + bt=2.0 + ccfbest=0. + lagbest=-1 + imsgbest=1 + + do imsg=1,MAXMSG + msg=trim(call_1)//' '//trim(call_2) + i=imsg + if(call_1(1:3).eq.'CQ ' .and. i.ne.5) msg='CQ0XYZ '//trim(call_2) + if(.not.std_1) then + if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2) + if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>' + else if(.not.std_2) then + if(i.le.4 .or. i.eq.6) msg='<'//trim(call_1)//'> '//trim(call_2) + if(i.ge.7) msg=trim(call_1)//' <'//trim(call_2)//'>' + endif + j0=len(trim(msg))+2 + if(i.eq.2) msg(j0:j0+2)='RRR' + if(i.eq.3) msg(j0:j0+3)='RR73' + if(i.eq.4) msg(j0:j0+1)='73' + if(i.eq.5) then + if(std_2) then + msg='CQ '//trim(call_2) + if(call_1(3:3).eq.'_') msg=trim(call_1)//' '//trim(call_2) + if(grid4.ne.'RR73') msg=trim(msg)//' '//grid4 + endif + if(.not.std_2) msg='CQ '//trim(call_2) + endif + if(i.eq.6 .and. std_2) msg(j0:j0+3)=grid4 + if(i.ge.7) then + isnr = -50 + (i-7)/2 + if(iand(i,1).eq.1) then + write(msg(j0:j0+2),'(i3.2)') isnr + if(msg(j0:j0).eq.' ') msg(j0:j0)='+' + else + write(msg(j0:j0+3),'("R",i3.2)') isnr + if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+' + endif + endif + +! Source-encode, then get itone() + i3=-1 + n3=-1 + call pack77(msg,i3,n3,c77) + call genft8(msg,i3,n3,msgsent,msgbits,itone) + ! Generate complex cwave + f00=0.0 + call gen_ft8wave(itone,NN,NSPS,bt,fs,f00,cwave,xjunk,1,NWAVE) + + lagmax=-1 + ccfmax=0. + nsum=32*2 + lag0=200.0*(xdt0+0.5) + lag1=max(0,lag0-20) + lag2=min(nlags-1,lag0+20) + do lag=lag1,lag2 + z=0. + s=0. + do i=0,NWAVE-1 + z=z + cd(i+lag)*conjg(cwave(i)) + if(mod(i,nsum).eq.nsum-1 .or. i.eq.NWAVE-1) then + s=s + abs(z) + z=0. + endif + enddo + ccf(lag)=s + if(ccf(lag).gt.ccfmax) then + ccfmax=ccf(lag) + lagmax=lag + endif + enddo ! lag + ccfmsg(imsg)=ccfmax + if(ccfmax.gt.ccfbest) then + ccfbest=ccfmax + lagbest=lagmax + msgbest=msg + imsgbest=imsg + endif + enddo ! imsg + + call pctile(ccfmsg,MAXMSG,50,base) + call pctile(ccfmsg,MAXMSG,84,sigma) + sigma=sigma-base + if(sigma.eq.0.0) sigma=1.0 + ccfmsg=(ccfmsg-base)/sigma + xdt=lagbest/200.0 - 0.5 + snr7=maxval(ccfmsg) + ccfmsg(imsgbest)=0. + snr7b=snr7/maxval(ccfmsg) + if(index(msgbest,'CQ0XYZ').ge.1) snr7=0. + xsnr=-99.0 + if(snr7.gt.4.0) xsnr=db(snr7)-24.0 + + return +end subroutine ft8_dec7 + + +end module ft8_a7 diff --git a/lib/ft8_decode.f90 b/lib/ft8_decode.f90 index 259ccc10c..bd08dde5c 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -237,17 +237,24 @@ contains do i=1,ndec(jseq,0) if(f0(i,jseq,0).eq.-99.0) exit if(f0(i,jseq,0).eq.-98.0) cycle + if(index(msg0(i,jseq,0),'<').ge.1) cycle !### Temporary ### call ft8_downsample(dd,newdat,f0(i,jseq,0),cd0) call ft8_dec7(cd0,dt0(i,jseq,0),f0(i,jseq,0),msg0(i,jseq,0), & - xdt,xsnr,msg37) - if(xsnr.gt.-99.0) then - if(associated(this%callback)) then - nsnr=nint(xsnr) - f1=f0(i,jseq,0) - iaptype=7 - qual=1.0 - call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual) - endif + xdt,xsnr,msg37,snr7,snr7b) + ddt=xdt-dt0(i,jseq,0) + write(41,3041) nutc,snr7,snr7b,xdt,ddt,nint(f0(i,jseq,0)),trim(msg37) +3041 format(i6.6,3f7.2,2f6.2,i5,2x,a) + if(snr7.lt.6.0 .or. snr7b.lt.1.8) cycle + write(42,3041) nutc,snr7,snr7b,xdt,ddt,nint(f0(i,jseq,0)),trim(msg37) + flush(41) + flush(42) + if(xsnr.gt.-99.0 .and. associated(this%callback)) then + nsnr=xsnr + f1=f0(i,jseq,0) + iaptype=7 + qual=1.0 + call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual) +! Call subtract here? endif newdat=.false. enddo From c30b91cb6919ab6b0b9205609f93f963b26a527f Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 29 Oct 2021 15:31:22 -0400 Subject: [PATCH 10/74] Correct a format. --- lib/ft8_decode.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ft8_decode.f90 b/lib/ft8_decode.f90 index bd08dde5c..b9e01be4c 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -243,7 +243,7 @@ contains xdt,xsnr,msg37,snr7,snr7b) ddt=xdt-dt0(i,jseq,0) write(41,3041) nutc,snr7,snr7b,xdt,ddt,nint(f0(i,jseq,0)),trim(msg37) -3041 format(i6.6,3f7.2,2f6.2,i5,2x,a) +3041 format(i6.6,4f7.2,i5,2x,a) if(snr7.lt.6.0 .or. snr7b.lt.1.8) cycle write(42,3041) nutc,snr7,snr7b,xdt,ddt,nint(f0(i,jseq,0)),trim(msg37) flush(41) From 93ade73af72d8fea7c2105442b017f16f529c889 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 29 Oct 2021 16:22:48 -0400 Subject: [PATCH 11/74] Remove diagnostic writes. Include subtraction of a7 decodes. --- lib/ft8/subtractft8.f90 | 2 ++ lib/ft8_a7.f90 | 2 ++ lib/ft8_decode.f90 | 18 ++++++++++-------- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/ft8/subtractft8.f90 b/lib/ft8/subtractft8.f90 index 7c3b59082..40657e7e7 100644 --- a/lib/ft8/subtractft8.f90 +++ b/lib/ft8/subtractft8.f90 @@ -58,6 +58,8 @@ subroutine subtractft8(dd0,itone,f0,dt,lrefinedt) sq0=sqf(0) !Do the subtraction with idt=0 endif dd0=dd !Return dd0 with this signal subtracted +! write(44,3044) nint(f0),dt-0.5,1.e-8*sum(dd*dd) +!3044 format(i4,f7.2,f10.6) return contains diff --git a/lib/ft8_a7.f90 b/lib/ft8_a7.f90 index 96ffe13e6..7a73d7655 100644 --- a/lib/ft8_a7.f90 +++ b/lib/ft8_a7.f90 @@ -10,6 +10,7 @@ module ft8_a7 real f0(MAXDEC,0:1,0:1) !f0(i,j,k) character*37 msg0(MAXDEC,0:1,0:1) !msg0(i,j,k) + integer itone_a7(79) integer jseq !even=0, odd=1 integer ndec(0:1,0:1) !ndec(j,k) data ndec/4*0/,jseq/0/ @@ -186,6 +187,7 @@ subroutine ft8_dec7(cd,xdt0,f0,msg0,xdt,xsnr,msgbest,snr7,snr7b) lagbest=lagmax msgbest=msg imsgbest=imsg + itone_a7=itone endif enddo ! imsg diff --git a/lib/ft8_decode.f90 b/lib/ft8_decode.f90 index b9e01be4c..f9a4320ad 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -87,8 +87,8 @@ contains ndec(jseq,0)=iz ndec(jseq,1)=0 nutc0=nutc -! print*,'BBB',jseq,ndec(0,0),ndec(0,1) endif +! write(44,*) 'AAA',nutc,nzhsym if(ndepth.eq.1 .and. nzhsym.lt.50) then ndec_early=0 @@ -234,6 +234,7 @@ contains if(nzhsym.eq.50 .and. ndec(jseq,0).ge.1) then call timer('ft8_dec7',0) newdat=.true. + write(44,*) 'BBB',nutc do i=1,ndec(jseq,0) if(f0(i,jseq,0).eq.-99.0) exit if(f0(i,jseq,0).eq.-98.0) cycle @@ -242,21 +243,22 @@ contains call ft8_dec7(cd0,dt0(i,jseq,0),f0(i,jseq,0),msg0(i,jseq,0), & xdt,xsnr,msg37,snr7,snr7b) ddt=xdt-dt0(i,jseq,0) - write(41,3041) nutc,snr7,snr7b,xdt,ddt,nint(f0(i,jseq,0)),trim(msg37) -3041 format(i6.6,4f7.2,i5,2x,a) +! write(41,3041) nutc,snr7,snr7b,xdt,ddt,nint(f0(i,jseq,0)),trim(msg37) +!3041 format(i6.6,4f7.2,i5,2x,a) if(snr7.lt.6.0 .or. snr7b.lt.1.8) cycle - write(42,3041) nutc,snr7,snr7b,xdt,ddt,nint(f0(i,jseq,0)),trim(msg37) - flush(41) - flush(42) - if(xsnr.gt.-99.0 .and. associated(this%callback)) then +! write(42,3041) nutc,snr7,snr7b,xdt,ddt,nint(f0(i,jseq,0)),trim(msg37) +! flush(41) +! flush(42) + if(associated(this%callback)) then nsnr=xsnr f1=f0(i,jseq,0) iaptype=7 qual=1.0 call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual) ! Call subtract here? + call subtractft8(dd,itone_a7,f1,xdt+0.5,.false.) !### ??? ### endif - newdat=.false. +! newdat=.false. enddo call timer('ft8_dec7',1) endif From 994e00c5d20a27fd21106549300d30bb11d5d9f6 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 1 Nov 2021 10:22:41 -0400 Subject: [PATCH 12/74] Adjust the and-correction numbers for averaged Q65 decodes. --- lib/qra/q65/q65.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 0d9d09d16..b0ed85d8d 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -785,9 +785,9 @@ subroutine q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2) sig_area=sum(spec(ia+nsum:ib-nsum)-1.0) w_equiv=sig_area/(smax-1.0) snr2=db(max(1.0,sig_area)) - db(2500.0/df) - if(nused.eq.2) snr2=snr2 - 2.0 - if(nused.eq.3) snr2=snr2 - 2.9 - if(nused.ge.4) snr2=snr2 - 3.5 + if(nused.eq.2) snr2=snr2 - 1.5 + if(nused.eq.3) snr2=snr2 - 2.4 + if(nused.ge.4) snr2=snr2 - 3.0 return end subroutine q65_snr From 7e078c805f3cfbc06136fc7efa9cb514a2c50cda Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 2 Nov 2021 15:17:51 -0400 Subject: [PATCH 13/74] Fix the issue noted by N9JIM by allowing decodes near frequencies already searched, but not displaying dupes. --- lib/q65_decode.f90 | 129 +++++++++++++++++++++++++------------------- lib/qra/q65/q65.f90 | 1 - 2 files changed, 75 insertions(+), 55 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index c0793d06f..ad57ccff5 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -62,6 +62,7 @@ contains character(len=12) :: mycall, hiscall !Used for AP decoding character(len=6) :: hisgrid character*37 decoded !Decoded message + character*37 decodes(100) character*77 c77 character*78 c78 character*6 cutc @@ -82,6 +83,8 @@ contains ! Start by setting some parameters and allocating storage for large arrays call sec0(0,tdecode) + ndecodes=0 + decodes=' ' nfa=nfa0 nfb=nfb0 nqd=nqd0 @@ -161,8 +164,8 @@ contains call q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & emedelay,xdt,f0,snr1,width,dat4,snr2,idec,stageno) call timer('q65_dec0',1) -! write(*,3001) '=a',sum(abs(float(iwave))),nfqso,ntol,ndepth,xdt,f0,idec -!3001 format(a2,f15.0,3i5,f7.2,f7.1,i5) +! write(*,3001) '=a',nfqso,ntol,ndepth,xdt,f0,idec +!3001 format(a2,3i5,f7.2,f7.1,i5) if(idec.ge.0) then dtdec=xdt !We have a q3 or q0 decode at nfqso @@ -201,6 +204,7 @@ contains call q65_loops(c00,npts/2,nsps/2,nsubmode,ndepth,jpk0, & xdt,f0,iaptype,xdt1,f1,snr2,dat4,idec) call timer('q65loops',1) +! write(*,3001) '=b',nfqso,ntol,ndepth,xdt,f0,idec if(idec.ge.0) then dtdec=xdt1 f0dec=f1 @@ -268,33 +272,41 @@ contains ! Unpack decoded message for display to user write(c77,1000) dat4(1:12),dat4(13)/2 1000 format(12b6.6,b5.5) - call unpack77(c77,1,decoded,unpk77_success) !Unpack to get msgsent - call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2) - nsnr=nint(snr2) - call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, & - idec,nused,ntrperiod) - call q65_hist(nint(f0dec),msg0=decoded) - if(iand(ndepth,128).ne.0 .and. .not.lagain .and. & - int(abs(f0dec-nfqso)).le.ntol ) call q65_clravg !AutoClrAvg - call sec0(1,tdecode) - open(22,file=trim(data_dir)//'/q65_decodes.dat',status='unknown', & - position='append',iostat=ios) - if(ios.eq.0) then + call unpack77(c77,1,decoded,unpk77_success) !Unpack to get decoded + idupe=0 + do i=1,ndecodes + if(decodes(i).eq.decoded) idupe=1 + enddo + if(idupe.eq.0) then + ndecodes=min(ndecodes+1,100) + decodes(ndecodes)=decoded + call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2) + nsnr=nint(snr2) + call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, & + idec,nused,ntrperiod) + call q65_hist(nint(f0dec),msg0=decoded) + if(iand(ndepth,128).ne.0 .and. .not.lagain .and. & + int(abs(f0dec-nfqso)).le.ntol ) call q65_clravg !AutoClrAvg + call sec0(1,tdecode) + open(22,file=trim(data_dir)//'/q65_decodes.dat',status='unknown', & + position='append',iostat=ios) + if(ios.eq.0) then ! Save decoding parameters to q65_decoded.dat, for later analysis. - write(cmode,'(i3)') ntrperiod - cmode(4:4)=char(ichar('A')+nsubmode) - c6=hiscall(1:6) - if(c6.eq.' ') c6=' ' - c4=hisgrid(1:4) - if(c4.eq.' ') c4=' ' - fmt='(i6.4,1x,a4,4i2,6i3,i4,f6.2,f7.1,f6.1,f7.1,f6.2,'// & - '1x,a6,1x,a6,1x,a4,1x,a)' - if(ntrperiod.le.30) fmt(5:5)='6' - if(idec.eq.3) nrc=0 - write(22,fmt) nutc,cmode,nQSOprogress,idec,idfbest,idtbest,ibw, & - ndistbest,nused,icand,ncand,nrc,ndepth,xdt,f0,snr2,plog, & - tdecode,mycall(1:6),c6,c4,trim(decoded) - close(22) + write(cmode,'(i3)') ntrperiod + cmode(4:4)=char(ichar('A')+nsubmode) + c6=hiscall(1:6) + if(c6.eq.' ') c6=' ' + c4=hisgrid(1:4) + if(c4.eq.' ') c4=' ' + fmt='(i6.4,1x,a4,i5,4i2,6i3,i4,f6.2,f7.1,f6.1,f7.1,f6.2,'// & + '1x,a6,1x,a6,1x,a4,1x,a)' + if(ntrperiod.le.30) fmt(5:5)='6' + if(idec.eq.3) nrc=0 + write(22,fmt) nutc,cmode,nfqso,nQSOprogress,idec,idfbest,idtbest, & + ibw,ndistbest,nused,icand,ncand,nrc,ndepth,xdt,f0,snr2,plog, & + tdecode,mycall(1:6),c6,c4,trim(decoded) + close(22) + endif endif endif navg0=1000*navg(0) + navg(1) @@ -333,6 +345,7 @@ contains call q65_loops(c00,npts/2,nsps/2,nsubmode,ndepth,jpk0, & xdt,f0,iaptype,xdt1,f1,snr2,dat4,idec) call timer('q65loops',1) +! write(*,3001) '=e',nfqso,ntol,ndepth,xdt,f0,idec if(idec.ge.0) then dtdec=xdt1 f0dec=f1 @@ -344,33 +357,41 @@ contains if(idec.ge.0) then ! Unpack decoded message for display to user write(c77,1000) dat4(1:12),dat4(13)/2 - call unpack77(c77,1,decoded,unpk77_success) !Unpack to get msgsent - call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2) - nsnr=nint(snr2) - call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, & - idec,nused,ntrperiod) - call q65_hist(nint(f0dec),msg0=decoded) - if(iand(ndepth,128).ne.0 .and. .not.lagain .and. & - int(abs(f0dec-nfqso)).le.ntol ) call q65_clravg !AutoClrAvg - call sec0(1,tdecode) - open(22,file=trim(data_dir)//'/q65_decodes.dat',status='unknown', & - position='append',iostat=ios) - if(ios.eq.0) then + call unpack77(c77,1,decoded,unpk77_success) !Unpack to get decoded + idupe=0 + do i=1,ndecodes + if(decodes(i).eq.decoded) idupe=1 + enddo + if(idupe.eq.0) then + ndecodes=min(ndecodes+1,100) + decodes(ndecodes)=decoded + call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2) + nsnr=nint(snr2) + call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, & + idec,nused,ntrperiod) + call q65_hist(nint(f0dec),msg0=decoded) + if(iand(ndepth,128).ne.0 .and. .not.lagain .and. & + int(abs(f0dec-nfqso)).le.ntol ) call q65_clravg !AutoClrAvg + call sec0(1,tdecode) + open(22,file=trim(data_dir)//'/q65_decodes.dat',status='unknown', & + position='append',iostat=ios) + if(ios.eq.0) then ! Save decoding parameters to q65_decoded.dat, for later analysis. - write(cmode,'(i3)') ntrperiod - cmode(4:4)=char(ichar('A')+nsubmode) - c6=hiscall(1:6) - if(c6.eq.' ') c6=' ' - c4=hisgrid(1:4) - if(c4.eq.' ') c4=' ' - fmt='(i6.4,1x,a4,4i2,6i3,i4,f6.2,f7.1,f6.1,f7.1,f6.2,'// & - '1x,a6,1x,a6,1x,a4,1x,a)' - if(ntrperiod.le.30) fmt(5:5)='6' - if(idec.eq.3) nrc=0 - write(22,fmt) nutc,cmode,nQSOprogress,idec,idfbest,idtbest,ibw, & - ndistbest,nused,icand,ncand,nrc,ndepth,xdt,f0,snr2,plog, & - tdecode,mycall(1:6),c6,c4,trim(decoded) - close(22) + write(cmode,'(i3)') ntrperiod + cmode(4:4)=char(ichar('A')+nsubmode) + c6=hiscall(1:6) + if(c6.eq.' ') c6=' ' + c4=hisgrid(1:4) + if(c4.eq.' ') c4=' ' + fmt='(i6.4,1x,a4,i5,4i2,6i3,i4,f6.2,f7.1,f6.1,f7.1,f6.2,'// & + '1x,a6,1x,a6,1x,a4,1x,a)' + if(ntrperiod.le.30) fmt(5:5)='6' + if(idec.eq.3) nrc=0 + write(22,fmt) nutc,cmode,nfqso,nQSOprogress,idec,idfbest,idtbest, & + ibw,ndistbest,nused,icand,ncand,nrc,ndepth,xdt,f0,snr2,plog, & + tdecode,mycall(1:6),c6,c4,trim(decoded) + close(22) + endif endif endif enddo ! icand diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index b0ed85d8d..fd913c6b0 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -570,7 +570,6 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, & i=indx(k)+ia-1 if(ccf2(i).lt.3.3) exit !Candidate limit f=i*df - if(f.ge.(nfqso-ftol) .and. f.le.(nfqso+ftol)) cycle !Looked here already i3=max(1, i-mode_q65) i4=min(iz,i+mode_q65) biggest=maxval(ccf2(i3:i4)) From 8097f25c9cb89abd82fe6f8313f702853e19732d Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 1 Nov 2021 14:12:32 -0400 Subject: [PATCH 14/74] Make "Fast/Normal/Deep" a sticky setting in Q65 mode. --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 5502f69f5..a8376dce2 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -6451,7 +6451,7 @@ void MainWindow::on_actionQ65_triggered() fast_config(false); WSPR_config(false); setup_status_bar(true); - ui->actionQuickDecode->setChecked(true); +// ui->actionQuickDecode->setChecked(true); m_nsps=6912; //For symspec only m_FFTSize = m_nsps / 2; Q_EMIT FFTSize(m_FFTSize); From 77c532b1a326584920032aeb96453ee46e1ccf15 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 1 Nov 2021 14:57:52 -0400 Subject: [PATCH 15/74] Always use Deep for manual Q65 decodes (lagain==true). --- lib/q65_decode.f90 | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index ad57ccff5..1368f8ab0 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -76,9 +76,7 @@ contains logical single_decode,lagain complex, allocatable :: c00(:) !Analytic signal, 6000 Sa/s complex, allocatable :: c0(:) !Analytic signal, 6000 Sa/s - -!w3sz added - integer stageno + integer stageno !Added by W3SZ stageno=0 ! Start by setting some parameters and allocating storage for large arrays @@ -99,7 +97,7 @@ contains nfft1=ntrperiod*12000 nfft2=ntrperiod*6000 npasses=1 - + if(lagain) ndepth=ior(ndepth,3) !Use 'Deep' for manual Q65 decodes dxcall13=hiscall ! initialize for use in packjt77 mycall13=mycall From 5b406effcf3a36d332392bdca71c70a7f27070b3 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 2 Nov 2021 16:07:52 -0400 Subject: [PATCH 16/74] Minor code cleanup. --- lib/qra/q65/q65.f90 | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index fd913c6b0..4fe24a16e 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -171,8 +171,6 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & call timer('list_dec',0) call q65_dec_q3(s1,iz,jz,s3,LL,ipk,jpk,snr2,dat4,idec,decoded) call timer('list_dec',1) -! if(idec.ge.0) write(70,3070) idec,mode_q65,better,trim(decoded) -!3070 format(i3,i5,f8.2,2x,a) endif ! If idec=3 we have a q3 decode. Continue to compute sync curve for plotting. endif @@ -250,16 +248,15 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & call q65_ccf_85(s1w,iz,jz,nfqso,ia,ia2,ipk,jpk,f0,xdt,imsg_best, & better,ccf1) call timer('ccf_85 ',1) - ! nsubmode is Tone-spacing indicator, 0-4 for A-E: a 0; b 1; c 2; d 3; e 4. - ! and mode_q65=2**nsubmode + +! nsubmode is Tone-spacing indicator, 0-4 for A-E: a 0; b 1; c 2; d 3; e 4. +! and mode_q65=2**nsubmode if(better.ge.1.10) then ! if(better.ge.1.04 .or. mode_q65.ge.8) then ! if(better.ge.1.10 .or. mode_q65.ge.8) then ORIGINAL call timer('list_dec',0) call q65_dec_q3(s1w,iz,jz,s3,LL,ipk,jpk,snr2,dat4,idec,decoded) call timer('list_dec',1) - ! if(idec.ge.0) write(70,3070) idec,mode_q65,better,trim(decoded) - !3070 format(i3,i5,f8.2,2x,a) endif ! if(better.ge.1.10) endif ! if(ncw.gt.0 .and. iavg.le.1) ! If idec=3 we have a q3 decode. Continue to compute sync curve for plotting. From 393265a0e0609d48d0a2a82fb736cb9008080192 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 4 Nov 2021 11:55:15 -0400 Subject: [PATCH 17/74] Working code for FT8 'a7' decodes. Still needs some cleanup. --- CMakeLists.txt | 6 +- lib/ft8/ft8c.f90 | 264 +++++++++++++++++++++++++++++++++++++++++++++ lib/ft8/ft8q3.f90 | 8 +- lib/ft8_decode.f90 | 51 +++++---- 4 files changed, 297 insertions(+), 32 deletions(-) create mode 100644 lib/ft8/ft8c.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index 83b1cc6d7..cfd1dcf17 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -422,10 +422,9 @@ set (wsjt_FSRCS lib/freqcal.f90 lib/ft8/ft8apset.f90 lib/ft8/ft8b.f90 + lib/ft8/ft8c.f90 lib/ft8/ft8code.f90 lib/ft8/ft8_downsample.f90 - lib/ft8/ft8q3.f90 - lib/ft8/test_ft8q3.f90 lib/ft8/ft8sim.f90 lib/gen4.f90 lib/gen65.f90 @@ -1180,9 +1179,6 @@ target_link_libraries (ft4code wsjt_fort wsjt_cxx) add_executable (ft8sim lib/ft8/ft8sim.f90) target_link_libraries (ft8sim wsjt_fort wsjt_cxx) -add_executable (test_ft8q3 lib/ft8/test_ft8q3.f90) -target_link_libraries (test_ft8q3 wsjt_fort wsjt_cxx) - add_executable (msk144sim lib/msk144sim.f90) target_link_libraries (msk144sim wsjt_fort wsjt_cxx) diff --git a/lib/ft8/ft8c.f90 b/lib/ft8/ft8c.f90 new file mode 100644 index 000000000..55a94f895 --- /dev/null +++ b/lib/ft8/ft8c.f90 @@ -0,0 +1,264 @@ +subroutine ft8c(dd0,newdat,call_1,call_2,grid4,f1,xdt,nharderrors,dmin,msg37,xsnr) + + use crc + use timer_module, only: timer + use packjt77 + include 'ft8_params.f90' + parameter(NP2=2812) + character*37 msg37,msg,msgsent,msgbest + character*12 call_1,call_2 + character*4 grid4 + real a(5) + real s8(0:7,NN) + real s2(0:511) + real bmeta(174),bmetb(174),bmetc(174),bmetd(174) + real llra(174),llrb(174),llrc(174),llrd(174),llrbest(174) !Soft symbols + real dd0(15*12000) + real ss(9) + real rcw(174) + integer*1 cw(174) + integer*1 msgbits(77) + integer*1 nxor(174),hdec(174) + integer itone(NN) + integer icos7(0:6),ip(1) + logical one(0:511,0:8) + integer graymap(0:7) + integer iloc(1) + complex cd0(0:3199) + complex ctwk(32) + complex csymb(32) + complex cs(0:7,NN) + logical std_1,std_2 + logical first,newdat + data icos7/3,1,4,0,6,5,2/ ! Flipped w.r.t. original FT8 sync array + data first/.true./ + data graymap/0,1,3,2,5,6,4,7/ + save one + + if(first) then + one=.false. + do i=0,511 + do j=0,8 + if(iand(i,2**j).ne.0) one(i,j)=.true. + enddo + enddo + first=.false. + endif + + call stdcall(call_1,std_1) + if(call_1(1:3).eq.'CQ ') std_1=.true. + call stdcall(call_2,std_2) + + max_iterations=30 + nharderrors=-1 + fs2=12000.0/NDOWN + dt2=1.0/fs2 + twopi=8.0*atan(1.0) + delfbest=0. + ibest=0 + + call timer('ft8_down',0) + call ft8_downsample(dd0,newdat,f1,cd0) !Mix f1 to baseband and downsample + call timer('ft8_down',1) + + i0=nint((xdt+0.5)*fs2) !Initial guess for start of signal + smax=0.0 + do idt=i0-10,i0+10 !Search over +/- one quarter symbol + call sync8d(cd0,idt,ctwk,0,sync) + if(sync.gt.smax) then + smax=sync + ibest=idt + endif + enddo + +! Now peak up in frequency + smax=0.0 + do ifr=-5,5 !Search over +/- 2.5 Hz + delf=ifr*0.5 + dphi=twopi*delf*dt2 + phi=0.0 + do i=1,32 + ctwk(i)=cmplx(cos(phi),sin(phi)) + phi=mod(phi+dphi,twopi) + enddo + call sync8d(cd0,ibest,ctwk,1,sync) + if( sync .gt. smax ) then + smax=sync + delfbest=delf + endif + enddo + a=0.0 + a(1)=-delfbest + call twkfreq1(cd0,NP2,fs2,a,cd0) + f1=f1+delfbest !Improved estimate of DF + + call timer('ft8_down',0) + call ft8_downsample(dd0,.false.,f1,cd0) !Mix f1 to baseband and downsample + call timer('ft8_down',1) + + smax=0.0 + do idt=-4,4 !Search over +/- one quarter symbol + call sync8d(cd0,ibest+idt,ctwk,0,sync) + ss(idt+5)=sync + enddo + smax=maxval(ss) + iloc=maxloc(ss) + ibest=iloc(1)-5+ibest + xdt=(ibest-1)*dt2 - 0.5 + sync=smax + + do k=1,NN + i1=ibest+(k-1)*32 + csymb=cmplx(0.0,0.0) + if( i1.ge.0 .and. i1+31 .le. NP2-1 ) csymb=cd0(i1:i1+31) + call four2a(csymb,32,1,-1,1) + cs(0:7,k)=csymb(1:8)/1e3 + s8(0:7,k)=abs(csymb(1:8)) + enddo + +! sync quality check + is1=0 + is2=0 + is3=0 + do k=1,7 + ip=maxloc(s8(:,k)) + if(icos7(k-1).eq.(ip(1)-1)) is1=is1+1 + ip=maxloc(s8(:,k+36)) + if(icos7(k-1).eq.(ip(1)-1)) is2=is2+1 + ip=maxloc(s8(:,k+72)) + if(icos7(k-1).eq.(ip(1)-1)) is3=is3+1 + enddo +! hard sync sum - max is 21 + nsync=is1+is2+is3 + if(nsync .le. 6) then ! bail out + nbadcrc=1 + return + endif + + do nsym=1,3 + nt=2**(3*nsym) + do ihalf=1,2 + do k=1,29,nsym + if(ihalf.eq.1) ks=k+7 + if(ihalf.eq.2) ks=k+43 + amax=-1.0 + do i=0,nt-1 + i1=i/64 + i2=iand(i,63)/8 + i3=iand(i,7) + if(nsym.eq.1) then + s2(i)=abs(cs(graymap(i3),ks)) + elseif(nsym.eq.2) then + s2(i)=abs(cs(graymap(i2),ks)+cs(graymap(i3),ks+1)) + elseif(nsym.eq.3) then + s2(i)=abs(cs(graymap(i1),ks)+cs(graymap(i2),ks+1)+cs(graymap(i3),ks+2)) + else + print*,"Error - nsym must be 1, 2, or 3." + endif + enddo + i32=1+(k-1)*3+(ihalf-1)*87 + if(nsym.eq.1) ibmax=2 + if(nsym.eq.2) ibmax=5 + if(nsym.eq.3) ibmax=8 + do ib=0,ibmax + bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - & + maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)) + if(i32+ib .gt.174) cycle + if(nsym.eq.1) then + bmeta(i32+ib)=bm + den=max(maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)), & + maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib))) + if(den.gt.0.0) then + cm=bm/den + else ! erase it + cm=0.0 + endif + bmetd(i32+ib)=cm + elseif(nsym.eq.2) then + bmetb(i32+ib)=bm + elseif(nsym.eq.3) then + bmetc(i32+ib)=bm + endif + enddo + enddo + enddo + enddo + call normalizebmet(bmeta,174) + call normalizebmet(bmetb,174) + call normalizebmet(bmetc,174) + call normalizebmet(bmetd,174) + + scalefac=2.83 + llra=scalefac*bmeta + llrb=scalefac*bmetb + llrc=scalefac*bmetc + llrd=scalefac*bmetd + +! apmag=maxval(abs(llra))*1.01 + + MAXMSG=206 + pbest=0. + do imsg=1,MAXMSG + msg=trim(call_1)//' '//trim(call_2) + i=imsg + if(call_1(1:3).eq.'CQ ' .and. i.ne.5) msg='QQ0XYZ '//trim(call_2) + if(.not.std_1) then + if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2) + if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>' + else if(.not.std_2) then + if(i.le.4 .or. i.eq.6) msg='<'//trim(call_1)//'> '//trim(call_2) + if(i.ge.7) msg=trim(call_1)//' <'//trim(call_2)//'>' + endif + j0=len(trim(msg))+2 + if(i.eq.2) msg(j0:j0+2)='RRR' + if(i.eq.3) msg(j0:j0+3)='RR73' + if(i.eq.4) msg(j0:j0+1)='73' + if(i.eq.5) then + if(std_2) then + msg='CQ '//trim(call_2) + if(call_1(3:3).eq.'_') msg=trim(call_1)//' '//trim(call_2) + if(grid4.ne.'RR73') msg=trim(msg)//' '//grid4 + endif + if(.not.std_2) msg='CQ '//trim(call_2) + endif + if(i.eq.6 .and. std_2) msg(j0:j0+3)=grid4 + if(i.ge.7) then + isnr = -50 + (i-7)/2 + if(iand(i,1).eq.1) then + write(msg(j0:j0+2),'(i3.2)') isnr + if(msg(j0:j0).eq.' ') msg(j0:j0)='+' + else + write(msg(j0:j0+3),'("R",i3.2)') isnr + if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+' + endif + endif + +! Source-encode, then get codeword + i3=-1 + n3=-1 + call genft8(msg,i3,n3,msgsent,msgbits,itone) + call encode174_91(msgbits,cw) + rcw=2*cw-1 + pa=sum(llra*rcw) + pb=sum(llrb*rcw) + pc=sum(llrc*rcw) + pd=sum(llrd*rcw) + + if(pa.gt.pbest) then + pbest=pa + msgbest=msgsent + llrbest=llra + nharderrors=count((2*cw-1)*llra.lt.0.0) + hdec=0 + where(llra.ge.0.0) hdec=1 + nxor=ieor(hdec,cw) + dmin=sum(nxor*abs(llra)) + endif + enddo ! imsg + +! write(*,4001) pbest,nharderrors,dmin,trim(msgbest) +!4001 format('$$$',f7.1,i4,f7.1,2x,a) + msg37=msgbest + + return +end subroutine ft8c diff --git a/lib/ft8/ft8q3.f90 b/lib/ft8/ft8q3.f90 index 715581af8..fbfd66edf 100644 --- a/lib/ft8/ft8q3.f90 +++ b/lib/ft8/ft8q3.f90 @@ -108,10 +108,10 @@ subroutine ft8q3(cd,xdt,f0,call_1,call_2,grid4,msgbest,snr) call pctile(ccfmsg,207,67,sigma) sigma=sigma-base ccfmsg=(ccfmsg-base)/(2.5*sigma) - do imsg=1,207 - write(44,3044) imsg,ccfmsg(imsg) -3044 format(i5,f10.3) - enddo +! do imsg=1,207 +! write(44,3044) imsg,ccfmsg(imsg) +!3044 format(i5,f10.3) +! enddo snr=maxval(ccfmsg) return diff --git a/lib/ft8_decode.f90 b/lib/ft8_decode.f90 index f9a4320ad..3a11bd976 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -54,7 +54,8 @@ contains logical newdat,lsubtract,ldupe,lrefinedt logical*1 ldiskdat logical lsubtracted(MAX_EARLY) - character*12 mycall12,hiscall12 + character*12 mycall12,hiscall12,call_1,call_2 + character*4 grid4 integer*2 iwave(15*12000) integer apsym2(58),aph10(10) character datetime*13,msg37*37 @@ -65,7 +66,6 @@ contains integer itone_save(NN,MAX_EARLY) real f1_save(MAX_EARLY) real xdt_save(MAX_EARLY) - complex cd0(0:3199) data nutc0/-1/ save s,dd,dd1,nutc0,ndec_early,itone_save,f1_save,xdt_save,lsubtracted,& @@ -232,35 +232,40 @@ contains 900 continue ! if(nzhsym.eq.50) print*,'AA0',jseq,ndec(0,0),ndec(0,1) if(nzhsym.eq.50 .and. ndec(jseq,0).ge.1) then - call timer('ft8_dec7',0) newdat=.true. - write(44,*) 'BBB',nutc do i=1,ndec(jseq,0) if(f0(i,jseq,0).eq.-99.0) exit if(f0(i,jseq,0).eq.-98.0) cycle if(index(msg0(i,jseq,0),'<').ge.1) cycle !### Temporary ### - call ft8_downsample(dd,newdat,f0(i,jseq,0),cd0) - call ft8_dec7(cd0,dt0(i,jseq,0),f0(i,jseq,0),msg0(i,jseq,0), & - xdt,xsnr,msg37,snr7,snr7b) - ddt=xdt-dt0(i,jseq,0) -! write(41,3041) nutc,snr7,snr7b,xdt,ddt,nint(f0(i,jseq,0)),trim(msg37) -!3041 format(i6.6,4f7.2,i5,2x,a) - if(snr7.lt.6.0 .or. snr7b.lt.1.8) cycle -! write(42,3041) nutc,snr7,snr7b,xdt,ddt,nint(f0(i,jseq,0)),trim(msg37) -! flush(41) -! flush(42) - if(associated(this%callback)) then - nsnr=xsnr - f1=f0(i,jseq,0) - iaptype=7 - qual=1.0 - call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual) -! Call subtract here? - call subtractft8(dd,itone_a7,f1,xdt+0.5,.false.) !### ??? ### + msg37=msg0(i,jseq,0) + i1=index(msg37,' ') + i2=index(msg37(i1+1:),' ') + i1 + call_1=msg37(1:i1-1) + call_2=msg37(i1+1:i2-1) + grid4=msg37(i2+1:i2+4) + if(grid4.eq.'RR73' .or. index(grid4,'+').gt.0 .or. & + index(grid4,'-').gt.0) grid4=' ' +! print*,'aa ',call_1,call_2,grid4,' ',msg37 + msg37=' ' + xdt=dt0(i,jseq,0) + f1=f0(i,jseq,0) + write(50,3050) i,sum(dd),newdat,mycall12,hiscall12,xdt,f1 +3050 format(i3,f10.3,L3,2x,2a12,f7.2,f7.1) + call timer('ft8c ',0) + call ft8c(dd,newdat,call_1,call_2,grid4,f1,xdt,nharderrors,dmin,msg37,xsnr) + call timer('ft8c ',1) + if(nharderrors.ge.0 .and. nharderrors.le.44 .and. dmin.le.80.0) then + if(associated(this%callback)) then + nsnr=xsnr + iaptype=7 + qual=1.0 + call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual) + endif +! write(*,3901) xdt,nint(f1),nharderrors,dmin,trim(msg37) +!3901 format('$$$',f6.1,i5,i5,f7.1,1x,a) endif ! newdat=.false. enddo - call timer('ft8_dec7',1) endif return From 4a68d3c4cfc24a87781bbedfc1c170745c787751 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 5 Nov 2021 09:21:49 -0400 Subject: [PATCH 18/74] Adjustments to FT8 a7 code. Still more to come ... --- lib/ft8/ft8c.f90 | 9 +++------ lib/ft8_a7.f90 | 2 +- lib/ft8_decode.f90 | 23 +++++++++++++++-------- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/lib/ft8/ft8c.f90 b/lib/ft8/ft8c.f90 index 55a94f895..a7d1ccb90 100644 --- a/lib/ft8/ft8c.f90 +++ b/lib/ft8/ft8c.f90 @@ -1,4 +1,5 @@ -subroutine ft8c(dd0,newdat,call_1,call_2,grid4,f1,xdt,nharderrors,dmin,msg37,xsnr) +subroutine ft8c(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & + msg37,xsnr) use crc use timer_module, only: timer @@ -49,7 +50,6 @@ subroutine ft8c(dd0,newdat,call_1,call_2,grid4,f1,xdt,nharderrors,dmin,msg37,xsn if(call_1(1:3).eq.'CQ ') std_1=.true. call stdcall(call_2,std_2) - max_iterations=30 nharderrors=-1 fs2=12000.0/NDOWN dt2=1.0/fs2 @@ -130,10 +130,7 @@ subroutine ft8c(dd0,newdat,call_1,call_2,grid4,f1,xdt,nharderrors,dmin,msg37,xsn enddo ! hard sync sum - max is 21 nsync=is1+is2+is3 - if(nsync .le. 6) then ! bail out - nbadcrc=1 - return - endif +! if(nsync .le. 6) return ! bail out do nsym=1,3 nt=2**(3*nsym) diff --git a/lib/ft8_a7.f90 b/lib/ft8_a7.f90 index 7a73d7655..71cb2eb95 100644 --- a/lib/ft8_a7.f90 +++ b/lib/ft8_a7.f90 @@ -32,7 +32,7 @@ subroutine ft8_a7_save(nutc,dt,f,msg) ichar(g4(2:2)).ge.ichar('A') .and. ichar(g4(2:2)).le.ichar('R') .and. & ichar(g4(3:3)).ge.ichar('0') .and. ichar(g4(3:3)).le.ichar('9') .and. & ichar(g4(4:4)).ge.ichar('0') .and. ichar(g4(4:4)).le.ichar('9')) - + j=mod(nutc/5,2) !j is 0 or 1 for odd/even sequence jseq=j diff --git a/lib/ft8_decode.f90 b/lib/ft8_decode.f90 index 3a11bd976..0c4ee3768 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -77,6 +77,8 @@ contains if(nutc0.eq.-1) then msg0=' ' + dt0=0. + f0=0. endif if(nutc.ne.nutc0) then ! New UTC. Move previously saved 'a7' data from k=1 to k=0 @@ -87,8 +89,9 @@ contains ndec(jseq,0)=iz ndec(jseq,1)=0 nutc0=nutc + dt0(:,jseq,1)=0. + f0(:,jseq,1)=0. endif -! write(44,*) 'AAA',nutc,nzhsym if(ndepth.eq.1 .and. nzhsym.lt.50) then ndec_early=0 @@ -218,6 +221,10 @@ contains if(emedelay.ne.0) xdt=xdt+2.0 call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual) call ft8_a7_save(nutc,xdt,f1,msg37) +! ii=ndec(jseq,1) +! write(41,3041) jseq,ii,nint(f0(ii,jseq,0)),msg0(ii,jseq,0)(1:22),& +! nint(f0(ii,jseq,1)),msg0(ii,jseq,1)(1:22) +!3041 format(3i5,2x,a22,i5,2x,a22) endif endif call timestamp(tsec,tseq,ctime) @@ -230,7 +237,6 @@ contains if(nzhsym.lt.50) ndec_early=ndecodes 900 continue -! if(nzhsym.eq.50) print*,'AA0',jseq,ndec(0,0),ndec(0,1) if(nzhsym.eq.50 .and. ndec(jseq,0).ge.1) then newdat=.true. do i=1,ndec(jseq,0) @@ -245,21 +251,22 @@ contains grid4=msg37(i2+1:i2+4) if(grid4.eq.'RR73' .or. index(grid4,'+').gt.0 .or. & index(grid4,'-').gt.0) grid4=' ' -! print*,'aa ',call_1,call_2,grid4,' ',msg37 - msg37=' ' xdt=dt0(i,jseq,0) f1=f0(i,jseq,0) - write(50,3050) i,sum(dd),newdat,mycall12,hiscall12,xdt,f1 -3050 format(i3,f10.3,L3,2x,2a12,f7.2,f7.1) + msg37=' ' call timer('ft8c ',0) - call ft8c(dd,newdat,call_1,call_2,grid4,f1,xdt,nharderrors,dmin,msg37,xsnr) + call ft8c(dd,newdat,call_1,call_2,grid4,xdt,f1,nharderrors, & + dmin,msg37,xsnr) call timer('ft8c ',1) - if(nharderrors.ge.0 .and. nharderrors.le.44 .and. dmin.le.80.0) then +! write(51,3051) i,xdt,nint(f1),nharderrors,dmin,call_1,call_2,grid4 +!3051 format(i3,f7.2,2i5,f7.1,1x,a12,a12,1x,a4) + if(nharderrors.ge.0 .and. dmin.le.80.0) then if(associated(this%callback)) then nsnr=xsnr iaptype=7 qual=1.0 call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual) + call ft8_a7_save(nutc,xdt,f1,msg37) endif ! write(*,3901) xdt,nint(f1),nharderrors,dmin,trim(msg37) !3901 format('$$$',f6.1,i5,i5,f7.1,1x,a) From 9aa4786f119e4bbf967aa25a2214b0dbb5366612 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 5 Nov 2021 15:57:24 -0400 Subject: [PATCH 19/74] Re-organize some of the FT8 a7 code. --- CMakeLists.txt | 3 +- lib/ft8/ft8_a7.f90 | 339 +++++++++++++++++++++++++++++++++++++++++++++ lib/ft8_a7.f90 | 211 ---------------------------- lib/ft8_decode.f90 | 6 +- 4 files changed, 343 insertions(+), 216 deletions(-) create mode 100644 lib/ft8/ft8_a7.f90 delete mode 100644 lib/ft8_a7.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index cfd1dcf17..6cb5043ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -336,7 +336,7 @@ set (wsjt_FSRCS lib/timer_module.f90 lib/wavhdr.f90 lib/qra/q65/q65_encoding_modules.f90 - lib/ft8_a7.f90 + lib/ft8/ft8_a7.f90 # remaining non-module sources lib/addit.f90 @@ -422,7 +422,6 @@ set (wsjt_FSRCS lib/freqcal.f90 lib/ft8/ft8apset.f90 lib/ft8/ft8b.f90 - lib/ft8/ft8c.f90 lib/ft8/ft8code.f90 lib/ft8/ft8_downsample.f90 lib/ft8/ft8sim.f90 diff --git a/lib/ft8/ft8_a7.f90 b/lib/ft8/ft8_a7.f90 new file mode 100644 index 000000000..cc679478f --- /dev/null +++ b/lib/ft8/ft8_a7.f90 @@ -0,0 +1,339 @@ +module ft8_a7 + + parameter(MAXDEC=100) + +! For the following three arrays +! First index i=decode number in this sequence +! Second index j=0 or 1 for even or odd sequence +! Third index k=0 or 1 for previous or current tally for this j + real dt0(MAXDEC,0:1,0:1) !dt0(i,j,k) + real f0(MAXDEC,0:1,0:1) !f0(i,j,k) + character*37 msg0(MAXDEC,0:1,0:1) !msg0(i,j,k) + + integer itone_a7(79) + integer jseq !even=0, odd=1 + integer ndec(0:1,0:1) !ndec(j,k) + data ndec/4*0/,jseq/0/ + +contains + +subroutine ft8_a7_save(nutc,dt,f,msg) + + use packjt77 + character*37 msg,msg1 + character*13 w(19) + character*4 g4 + integer nw(19) + logical isgrid4 + +! Statement function: + isgrid4(g4)=(len_trim(g4).eq.4 .and. & + ichar(g4(1:1)).ge.ichar('A') .and. ichar(g4(1:1)).le.ichar('R') .and. & + ichar(g4(2:2)).ge.ichar('A') .and. ichar(g4(2:2)).le.ichar('R') .and. & + ichar(g4(3:3)).ge.ichar('0') .and. ichar(g4(3:3)).le.ichar('9') .and. & + ichar(g4(4:4)).ge.ichar('0') .and. ichar(g4(4:4)).le.ichar('9')) + + j=mod(nutc/5,2) !j is 0 or 1 for odd/even sequence + jseq=j + +! Add this decode to current table for this sequence + ndec(j,1)=ndec(j,1)+1 !Number of decodes in this sequence + i=ndec(j,1) !i is pointer to new table entry + if(i.ge.MAXDEC-1) return !Prevent table overflow + if(index(msg,'<...>').ge.1) return !Don't save an unknown hashcall + + dt0(i,j,1)=dt !Save dt in table + f0(i,j,1)=f !Save f in table + f0(i+1,j,1)=-99.0 !Flag after last entry in current table + call split77(msg,nwords,nw,w) !Parse msg into words + msg0(i,j,1)=trim(w(1))//' '//trim(w(2)) + if(w(1)(1:3).eq.'CQ ' .and. nw(2).le.2) then + msg0(i,j,1)='CQ '//trim(w(2))//' '//trim(w(3)) + endif + msg1=msg0(i,j,1) !Message without grid + nn=len(trim(msg1)) !Message length without grid + if(isgrid4(w(nwords))) msg0(i,j,1)=trim(msg0(i,j,1))//' '//trim(w(nwords)) + +! If a transmission at this frequency with this message fragment +! was decoded in the previous sequence, flag it as "DO NOT USE" because +! we have already decoded that station's next transmission. + + call split77(msg1,nwords,nw,w) !Parse msg into words + do i=1,ndec(j,0) + if(f0(i,j,0).le.-98.0) cycle + i2=index(msg0(i,j,0),' '//trim(w(2))) + if(abs(f-f0(i,j,0)).lt.2.0 .and. i2.ge.3) then + f0(i,j,0)=-98.0 !Remove from list of to-be-tried a7 decodes + endif + enddo + + return +end subroutine ft8_a7_save + +subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & + msg37,xsnr) + + use crc + use timer_module, only: timer + use packjt77 + include 'ft8_params.f90' + parameter(NP2=2812) + character*37 msg37,msg,msgsent,msgbest + character*12 call_1,call_2 + character*4 grid4 + real a(5) + real s8(0:7,NN) + real s2(0:511) + real bmeta(174),bmetb(174),bmetc(174),bmetd(174) + real llra(174),llrb(174),llrc(174),llrd(174),llrbest(174) !Soft symbols + real dd0(15*12000) + real ss(9) + real rcw(174) + integer*1 cw(174) + integer*1 msgbits(77) + integer*1 nxor(174),hdec(174) + integer itone(NN) + integer icos7(0:6),ip(1) + logical one(0:511,0:8) + integer graymap(0:7) + integer iloc(1) + complex cd0(0:3199) + complex ctwk(32) + complex csymb(32) + complex cs(0:7,NN) + logical std_1,std_2 + logical first,newdat + data icos7/3,1,4,0,6,5,2/ ! Flipped w.r.t. original FT8 sync array + data first/.true./ + data graymap/0,1,3,2,5,6,4,7/ + save one + + if(first) then + one=.false. + do i=0,511 + do j=0,8 + if(iand(i,2**j).ne.0) one(i,j)=.true. + enddo + enddo + first=.false. + endif + + call stdcall(call_1,std_1) + if(call_1(1:3).eq.'CQ ') std_1=.true. + call stdcall(call_2,std_2) + + nharderrors=-1 + fs2=12000.0/NDOWN + dt2=1.0/fs2 + twopi=8.0*atan(1.0) + delfbest=0. + ibest=0 + + call timer('ft8_down',0) + call ft8_downsample(dd0,newdat,f1,cd0) !Mix f1 to baseband and downsample + call timer('ft8_down',1) + + i0=nint((xdt+0.5)*fs2) !Initial guess for start of signal + smax=0.0 + do idt=i0-10,i0+10 !Search over +/- one quarter symbol + call sync8d(cd0,idt,ctwk,0,sync) + if(sync.gt.smax) then + smax=sync + ibest=idt + endif + enddo + +! Now peak up in frequency + smax=0.0 + do ifr=-5,5 !Search over +/- 2.5 Hz + delf=ifr*0.5 + dphi=twopi*delf*dt2 + phi=0.0 + do i=1,32 + ctwk(i)=cmplx(cos(phi),sin(phi)) + phi=mod(phi+dphi,twopi) + enddo + call sync8d(cd0,ibest,ctwk,1,sync) + if( sync .gt. smax ) then + smax=sync + delfbest=delf + endif + enddo + a=0.0 + a(1)=-delfbest + call twkfreq1(cd0,NP2,fs2,a,cd0) + f1=f1+delfbest !Improved estimate of DF + + call timer('ft8_down',0) + call ft8_downsample(dd0,.false.,f1,cd0) !Mix f1 to baseband and downsample + call timer('ft8_down',1) + + smax=0.0 + do idt=-4,4 !Search over +/- one quarter symbol + call sync8d(cd0,ibest+idt,ctwk,0,sync) + ss(idt+5)=sync + enddo + smax=maxval(ss) + iloc=maxloc(ss) + ibest=iloc(1)-5+ibest + xdt=(ibest-1)*dt2 - 0.5 + sync=smax + + do k=1,NN + i1=ibest+(k-1)*32 + csymb=cmplx(0.0,0.0) + if( i1.ge.0 .and. i1+31 .le. NP2-1 ) csymb=cd0(i1:i1+31) + call four2a(csymb,32,1,-1,1) + cs(0:7,k)=csymb(1:8)/1e3 + s8(0:7,k)=abs(csymb(1:8)) + enddo + +! sync quality check + is1=0 + is2=0 + is3=0 + do k=1,7 + ip=maxloc(s8(:,k)) + if(icos7(k-1).eq.(ip(1)-1)) is1=is1+1 + ip=maxloc(s8(:,k+36)) + if(icos7(k-1).eq.(ip(1)-1)) is2=is2+1 + ip=maxloc(s8(:,k+72)) + if(icos7(k-1).eq.(ip(1)-1)) is3=is3+1 + enddo +! hard sync sum - max is 21 + nsync=is1+is2+is3 +! if(nsync .le. 6) return ! bail out + + do nsym=1,3 + nt=2**(3*nsym) + do ihalf=1,2 + do k=1,29,nsym + if(ihalf.eq.1) ks=k+7 + if(ihalf.eq.2) ks=k+43 + amax=-1.0 + do i=0,nt-1 + i1=i/64 + i2=iand(i,63)/8 + i3=iand(i,7) + if(nsym.eq.1) then + s2(i)=abs(cs(graymap(i3),ks)) + elseif(nsym.eq.2) then + s2(i)=abs(cs(graymap(i2),ks)+cs(graymap(i3),ks+1)) + elseif(nsym.eq.3) then + s2(i)=abs(cs(graymap(i1),ks)+cs(graymap(i2),ks+1)+cs(graymap(i3),ks+2)) + else + print*,"Error - nsym must be 1, 2, or 3." + endif + enddo + i32=1+(k-1)*3+(ihalf-1)*87 + if(nsym.eq.1) ibmax=2 + if(nsym.eq.2) ibmax=5 + if(nsym.eq.3) ibmax=8 + do ib=0,ibmax + bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - & + maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)) + if(i32+ib .gt.174) cycle + if(nsym.eq.1) then + bmeta(i32+ib)=bm + den=max(maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)), & + maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib))) + if(den.gt.0.0) then + cm=bm/den + else ! erase it + cm=0.0 + endif + bmetd(i32+ib)=cm + elseif(nsym.eq.2) then + bmetb(i32+ib)=bm + elseif(nsym.eq.3) then + bmetc(i32+ib)=bm + endif + enddo + enddo + enddo + enddo + call normalizebmet(bmeta,174) + call normalizebmet(bmetb,174) + call normalizebmet(bmetc,174) + call normalizebmet(bmetd,174) + + scalefac=2.83 + llra=scalefac*bmeta + llrb=scalefac*bmetb + llrc=scalefac*bmetc + llrd=scalefac*bmetd + +! apmag=maxval(abs(llra))*1.01 + + MAXMSG=206 + pbest=0. + dmin=1.e30 + do imsg=1,MAXMSG + msg=trim(call_1)//' '//trim(call_2) + i=imsg + if(call_1(1:3).eq.'CQ ' .and. i.ne.5) msg='QQ0XYZ '//trim(call_2) + if(.not.std_1) then + if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2) + if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>' + else if(.not.std_2) then + if(i.le.4 .or. i.eq.6) msg='<'//trim(call_1)//'> '//trim(call_2) + if(i.ge.7) msg=trim(call_1)//' <'//trim(call_2)//'>' + endif + j0=len(trim(msg))+2 + if(i.eq.2) msg(j0:j0+2)='RRR' + if(i.eq.3) msg(j0:j0+3)='RR73' + if(i.eq.4) msg(j0:j0+1)='73' + if(i.eq.5) then + if(std_2) then + msg='CQ '//trim(call_2) + if(call_1(3:3).eq.'_') msg=trim(call_1)//' '//trim(call_2) + if(grid4.ne.'RR73') msg=trim(msg)//' '//grid4 + endif + if(.not.std_2) msg='CQ '//trim(call_2) + endif + if(i.eq.6 .and. std_2) msg(j0:j0+3)=grid4 + if(i.ge.7) then + isnr = -50 + (i-7)/2 + if(iand(i,1).eq.1) then + write(msg(j0:j0+2),'(i3.2)') isnr + if(msg(j0:j0).eq.' ') msg(j0:j0)='+' + else + write(msg(j0:j0+3),'("R",i3.2)') isnr + if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+' + endif + endif + +! Source-encode, then get codeword + i3=-1 + n3=-1 + call genft8(msg,i3,n3,msgsent,msgbits,itone) + call encode174_91(msgbits,cw) + rcw=2*cw-1 + pa=sum(llra*rcw) + pb=sum(llrb*rcw) + pc=sum(llrc*rcw) + pd=sum(llrd*rcw) + + hdec=0 + where(llra.ge.0.0) hdec=1 + nxor=ieor(hdec,cw) + da=sum(nxor*abs(llra)) + + if(da.lt.dmin) then + dmin=da + pbest=pa + msgbest=msgsent + llrbest=llra + nharderrors=count((2*cw-1)*llra.lt.0.0) + endif + + enddo ! imsg + + write(41,3041) nharderrors,pbest,dmin,trim(msgbest) +3041 format(i5,2f10.3,2x,a) + msg37=msgbest + + return +end subroutine ft8_a7d + +end module ft8_a7 diff --git a/lib/ft8_a7.f90 b/lib/ft8_a7.f90 deleted file mode 100644 index 71cb2eb95..000000000 --- a/lib/ft8_a7.f90 +++ /dev/null @@ -1,211 +0,0 @@ -module ft8_a7 - - parameter(MAXDEC=100) - -! For the following three arrays -! First index i=decode number in this sequence -! Second index j=0 or 1 for even or odd sequence -! Third index k=0 or 1 for previous or current tally for this j - real dt0(MAXDEC,0:1,0:1) !dt0(i,j,k) - real f0(MAXDEC,0:1,0:1) !f0(i,j,k) - character*37 msg0(MAXDEC,0:1,0:1) !msg0(i,j,k) - - integer itone_a7(79) - integer jseq !even=0, odd=1 - integer ndec(0:1,0:1) !ndec(j,k) - data ndec/4*0/,jseq/0/ - -contains - -subroutine ft8_a7_save(nutc,dt,f,msg) - - use packjt77 - character*37 msg,msg1 - character*13 w(19) - character*4 g4 - integer nw(19) - logical isgrid4 - -! Statement function: - isgrid4(g4)=(len_trim(g4).eq.4 .and. & - ichar(g4(1:1)).ge.ichar('A') .and. ichar(g4(1:1)).le.ichar('R') .and. & - ichar(g4(2:2)).ge.ichar('A') .and. ichar(g4(2:2)).le.ichar('R') .and. & - ichar(g4(3:3)).ge.ichar('0') .and. ichar(g4(3:3)).le.ichar('9') .and. & - ichar(g4(4:4)).ge.ichar('0') .and. ichar(g4(4:4)).le.ichar('9')) - - j=mod(nutc/5,2) !j is 0 or 1 for odd/even sequence - jseq=j - -! Add this decode to current table for this sequence - ndec(j,1)=ndec(j,1)+1 !Number of decodes in this sequence - i=ndec(j,1) !i is pointer to new table entry - if(i.ge.MAXDEC-1) return !Prevent table overflow - if(index(msg,'<...>').ge.1) return !Don't save an unknown hashcall - - dt0(i,j,1)=dt !Save dt in table - f0(i,j,1)=f !Save f in table - f0(i+1,j,1)=-99.0 !Flag after last entry in current table - call split77(msg,nwords,nw,w) !Parse msg into words - msg0(i,j,1)=trim(w(1))//' '//trim(w(2)) - if(w(1)(1:3).eq.'CQ ' .and. nw(2).le.2) then - msg0(i,j,1)='CQ '//trim(w(2))//' '//trim(w(3)) - endif - msg1=msg0(i,j,1) !Message without grid - nn=len(trim(msg1)) !Message length without grid - if(isgrid4(w(nwords))) msg0(i,j,1)=trim(msg0(i,j,1))//' '//trim(w(nwords)) - -! If a transmission at this frequency with this message fragment -! was decoded in the previous sequence, flag it as "DO NOT USE" because -! we have already decoded that station's next transmission. - - call split77(msg1,nwords,nw,w) !Parse msg into words - do i=1,ndec(j,0) - if(f0(i,j,0).le.-98.0) cycle - i2=index(msg0(i,j,0),' '//trim(w(2))) - if(abs(f-f0(i,j,0)).lt.2.0 .and. i2.ge.3) then - f0(i,j,0)=-98.0 !Remove from list of to-be-tried a7 decodes - endif - enddo - - return -end subroutine ft8_a7_save - -subroutine ft8_dec7(cd,xdt0,f0,msg0,xdt,xsnr,msgbest,snr7,snr7b) - -! Get a7 (q3-style) decodes for FT8. - - use packjt77 - parameter(NN=79,NSPS=32) - parameter(NWAVE=NN*NSPS) !2528 - parameter(NZ=3200,NLAGS=NZ-NWAVE) - parameter(MAXMSG=206) - character*12 call_1,call_2 - character*13 w(19) - character*4 grid4 - character*37 msg0,msg,msgbest,msgsent - character c77*77 - complex cwave(0:NWAVE-1) - complex cd(0:NZ-1) - complex z - real xjunk(NWAVE) - real ccf(0:NLAGS-1) - real ccfmsg(MAXMSG) - integer itone(NN) - integer nw(19) - integer*1 msgbits(77) - logical std_1,std_2 - - if(xdt0.eq.-999.0) return !Silence compiler warning - - snr7=0. - ccfmsg=0. - call split77(msg0,nwords,nw,w) !Parse msg0 into words - call_1=w(1)(1:12) - call_2=w(2)(1:12) - grid4=w(3)(1:4) - if(call_1(1:3).eq.'CQ_') call_1(3:3)=' ' - - call stdcall(call_1,std_1) - if(call_1(1:3).eq.'CQ ') std_1=.true. - call stdcall(call_2,std_2) - - fs=200.0 !Sample rate (Hz) - bt=2.0 - ccfbest=0. - lagbest=-1 - imsgbest=1 - - do imsg=1,MAXMSG - msg=trim(call_1)//' '//trim(call_2) - i=imsg - if(call_1(1:3).eq.'CQ ' .and. i.ne.5) msg='CQ0XYZ '//trim(call_2) - if(.not.std_1) then - if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2) - if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>' - else if(.not.std_2) then - if(i.le.4 .or. i.eq.6) msg='<'//trim(call_1)//'> '//trim(call_2) - if(i.ge.7) msg=trim(call_1)//' <'//trim(call_2)//'>' - endif - j0=len(trim(msg))+2 - if(i.eq.2) msg(j0:j0+2)='RRR' - if(i.eq.3) msg(j0:j0+3)='RR73' - if(i.eq.4) msg(j0:j0+1)='73' - if(i.eq.5) then - if(std_2) then - msg='CQ '//trim(call_2) - if(call_1(3:3).eq.'_') msg=trim(call_1)//' '//trim(call_2) - if(grid4.ne.'RR73') msg=trim(msg)//' '//grid4 - endif - if(.not.std_2) msg='CQ '//trim(call_2) - endif - if(i.eq.6 .and. std_2) msg(j0:j0+3)=grid4 - if(i.ge.7) then - isnr = -50 + (i-7)/2 - if(iand(i,1).eq.1) then - write(msg(j0:j0+2),'(i3.2)') isnr - if(msg(j0:j0).eq.' ') msg(j0:j0)='+' - else - write(msg(j0:j0+3),'("R",i3.2)') isnr - if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+' - endif - endif - -! Source-encode, then get itone() - i3=-1 - n3=-1 - call pack77(msg,i3,n3,c77) - call genft8(msg,i3,n3,msgsent,msgbits,itone) - ! Generate complex cwave - f00=0.0 - call gen_ft8wave(itone,NN,NSPS,bt,fs,f00,cwave,xjunk,1,NWAVE) - - lagmax=-1 - ccfmax=0. - nsum=32*2 - lag0=200.0*(xdt0+0.5) - lag1=max(0,lag0-20) - lag2=min(nlags-1,lag0+20) - do lag=lag1,lag2 - z=0. - s=0. - do i=0,NWAVE-1 - z=z + cd(i+lag)*conjg(cwave(i)) - if(mod(i,nsum).eq.nsum-1 .or. i.eq.NWAVE-1) then - s=s + abs(z) - z=0. - endif - enddo - ccf(lag)=s - if(ccf(lag).gt.ccfmax) then - ccfmax=ccf(lag) - lagmax=lag - endif - enddo ! lag - ccfmsg(imsg)=ccfmax - if(ccfmax.gt.ccfbest) then - ccfbest=ccfmax - lagbest=lagmax - msgbest=msg - imsgbest=imsg - itone_a7=itone - endif - enddo ! imsg - - call pctile(ccfmsg,MAXMSG,50,base) - call pctile(ccfmsg,MAXMSG,84,sigma) - sigma=sigma-base - if(sigma.eq.0.0) sigma=1.0 - ccfmsg=(ccfmsg-base)/sigma - xdt=lagbest/200.0 - 0.5 - snr7=maxval(ccfmsg) - ccfmsg(imsgbest)=0. - snr7b=snr7/maxval(ccfmsg) - if(index(msgbest,'CQ0XYZ').ge.1) snr7=0. - xsnr=-99.0 - if(snr7.gt.4.0) xsnr=db(snr7)-24.0 - - return -end subroutine ft8_dec7 - - -end module ft8_a7 diff --git a/lib/ft8_decode.f90 b/lib/ft8_decode.f90 index 0c4ee3768..036a9479c 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -254,10 +254,10 @@ contains xdt=dt0(i,jseq,0) f1=f0(i,jseq,0) msg37=' ' - call timer('ft8c ',0) - call ft8c(dd,newdat,call_1,call_2,grid4,xdt,f1,nharderrors, & + call timer('ft8_a7d ',0) + call ft8_a7d(dd,newdat,call_1,call_2,grid4,xdt,f1,nharderrors, & dmin,msg37,xsnr) - call timer('ft8c ',1) + call timer('ft8_a7d ',1) ! write(51,3051) i,xdt,nint(f1),nharderrors,dmin,call_1,call_2,grid4 !3051 format(i3,f7.2,2i5,f7.1,1x,a12,a12,1x,a4) if(nharderrors.ge.0 .and. dmin.le.80.0) then From 21f8303511ad2a917aef2b9f69875ee307aec8c6 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 9 Nov 2021 11:00:55 -0500 Subject: [PATCH 20/74] W3SZ patch: Initialize AP params and set npasses=2 before first call to q65_dec0(). --- lib/q65_decode.f90 | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index 1368f8ab0..04e58eb86 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -156,6 +156,13 @@ contains call q65_enc(dgen,codewords) !Initialize the Q65 codec nused=1 iavg=0 + +! W3SZ patch: Initialize AP params here, rather than afer the call to ana64(). + call ft8apset(mycall,hiscall,ncontest,apsym0,aph10) ! Generate ap symbols + where(apsym0.eq.-1) apsym0=0 + npasses=2 + if(nQSOprogress.eq.5) npasses=3 + call timer('q65_dec0',0) ! Call top-level routine in q65 module: establish sync and try for a ! q3 or q0 decode. @@ -176,11 +183,6 @@ contains if(ntrperiod.le.30) jpk0=(xdt+0.5)*6000 !For shortest sequences if(jpk0.lt.0) jpk0=0 call ana64(iwave,npts,c00) !Convert to complex c00() at 6000 Sa/s - call ft8apset(mycall,hiscall,ncontest,apsym0,aph10) ! Generate ap symbols - where(apsym0.eq.-1) apsym0=0 - - npasses=2 - if(nQSOprogress.eq.5) npasses=3 if(lapcqonly) npasses=1 iaptype=0 do ipass=0,npasses !Loop over AP passes From c13407612e16483e2db4a0d3c56f61460b13d046 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 10 Nov 2021 10:44:56 -0500 Subject: [PATCH 21/74] Temporary save of changes related to a7 decodes. --- lib/ft8/ft8_a7.f90 | 202 +++++++++++++++++++++++++++++++++++++++------ lib/ft8_decode.f90 | 12 ++- 2 files changed, 183 insertions(+), 31 deletions(-) diff --git a/lib/ft8/ft8_a7.f90 b/lib/ft8/ft8_a7.f90 index cc679478f..f846ad2b3 100644 --- a/lib/ft8/ft8_a7.f90 +++ b/lib/ft8/ft8_a7.f90 @@ -38,32 +38,31 @@ subroutine ft8_a7_save(nutc,dt,f,msg) ! Add this decode to current table for this sequence ndec(j,1)=ndec(j,1)+1 !Number of decodes in this sequence - i=ndec(j,1) !i is pointer to new table entry + i=ndec(j,1) !i is index of a new table entry if(i.ge.MAXDEC-1) return !Prevent table overflow - if(index(msg,'<...>').ge.1) return !Don't save an unknown hashcall dt0(i,j,1)=dt !Save dt in table f0(i,j,1)=f !Save f in table - f0(i+1,j,1)=-99.0 !Flag after last entry in current table call split77(msg,nwords,nw,w) !Parse msg into words - msg0(i,j,1)=trim(w(1))//' '//trim(w(2)) + msg0(i,j,1)=trim(w(1))//' '//trim(w(2)) !Save "call_1 call_2" if(w(1)(1:3).eq.'CQ ' .and. nw(2).le.2) then - msg0(i,j,1)='CQ '//trim(w(2))//' '//trim(w(3)) + msg0(i,j,1)='CQ '//trim(w(2))//' '//trim(w(3)) !Save "CQ DX Call_2" endif msg1=msg0(i,j,1) !Message without grid nn=len(trim(msg1)) !Message length without grid +! Include grid as part of message if(isgrid4(w(nwords))) msg0(i,j,1)=trim(msg0(i,j,1))//' '//trim(w(nwords)) -! If a transmission at this frequency with this message fragment +! If a transmission at this frequency with message fragment "call_1 call_2" ! was decoded in the previous sequence, flag it as "DO NOT USE" because -! we have already decoded that station's next transmission. +! we have already decoded and subtracted that station's next transmission. - call split77(msg1,nwords,nw,w) !Parse msg into words + call split77(msg0(i,j,1),nwords,nw,w) !Parse msg into words do i=1,ndec(j,0) if(f0(i,j,0).le.-98.0) cycle i2=index(msg0(i,j,0),' '//trim(w(2))) - if(abs(f-f0(i,j,0)).lt.2.0 .and. i2.ge.3) then - f0(i,j,0)=-98.0 !Remove from list of to-be-tried a7 decodes + if(abs(f-f0(i,j,0)).le.3.0 .and. i2.ge.3) then + f0(i,j,0)=-98.0 !Flag as "do not use" for a potential a7 decode endif enddo @@ -73,6 +72,8 @@ end subroutine ft8_a7_save subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & msg37,xsnr) +! Examine the raw data in dd0() for possible "a7" decodes. + use crc use timer_module, only: timer use packjt77 @@ -84,8 +85,9 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & real a(5) real s8(0:7,NN) real s2(0:511) + real dabcd(4) real bmeta(174),bmetb(174),bmetc(174),bmetd(174) - real llra(174),llrb(174),llrc(174),llrd(174),llrbest(174) !Soft symbols + real llra(174),llrb(174),llrc(174),llrd(174) !Soft symbols real dd0(15*12000) real ss(9) real rcw(174) @@ -94,6 +96,7 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & integer*1 nxor(174),hdec(174) integer itone(NN) integer icos7(0:6),ip(1) + integer ndm(4) logical one(0:511,0:8) integer graymap(0:7) integer iloc(1) @@ -103,10 +106,10 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & complex cs(0:7,NN) logical std_1,std_2 logical first,newdat - data icos7/3,1,4,0,6,5,2/ ! Flipped w.r.t. original FT8 sync array + data icos7/3,1,4,0,6,5,2/ !Sync array data first/.true./ data graymap/0,1,3,2,5,6,4,7/ - save one + save one,ndm if(first) then one=.false. @@ -116,13 +119,13 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & enddo enddo first=.false. + ndm=0 endif call stdcall(call_1,std_1) if(call_1(1:3).eq.'CQ ') std_1=.true. call stdcall(call_2,std_2) - nharderrors=-1 fs2=12000.0/NDOWN dt2=1.0/fs2 twopi=8.0*atan(1.0) @@ -135,15 +138,15 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & i0=nint((xdt+0.5)*fs2) !Initial guess for start of signal smax=0.0 - do idt=i0-10,i0+10 !Search over +/- one quarter symbol - call sync8d(cd0,idt,ctwk,0,sync) + do idt=i0-10,i0+10 !Search over +/- one quarter symbol + call sync8d(cd0,idt,ctwk,0,sync) !NB: ctwk not used here if(sync.gt.smax) then smax=sync ibest=idt endif enddo -! Now peak up in frequency +! Peak up in frequency smax=0.0 do ifr=-5,5 !Search over +/- 2.5 Hz delf=ifr*0.5 @@ -268,6 +271,8 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & MAXMSG=206 pbest=0. dmin=1.e30 + nharderrors=-1 + do imsg=1,MAXMSG msg=trim(call_1)//' '//trim(call_2) i=imsg @@ -303,11 +308,10 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & endif endif -! Source-encode, then get codeword i3=-1 n3=-1 - call genft8(msg,i3,n3,msgsent,msgbits,itone) - call encode174_91(msgbits,cw) + call genft8(msg,i3,n3,msgsent,msgbits,itone) !Source-encode this message + call encode174_91(msgbits,cw) !Get codeword for this message rcw=2*cw-1 pa=sum(llra*rcw) pb=sum(llrb*rcw) @@ -319,21 +323,165 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & nxor=ieor(hdec,cw) da=sum(nxor*abs(llra)) - if(da.lt.dmin) then - dmin=da - pbest=pa + hdec=0 + where(llrb.ge.0.0) hdec=1 + nxor=ieor(hdec,cw) + db=sum(nxor*abs(llrb)) + + hdec=0 + where(llrc.ge.0.0) hdec=1 + nxor=ieor(hdec,cw) + dc=sum(nxor*abs(llrc)) + + hdec=0 + where(llrd.ge.0.0) hdec=1 + nxor=ieor(hdec,cw) + dd=sum(nxor*abs(llrd)) + + dm=min(da,db,dc,dd) + + if(dm.lt.dmin) then + dmin=dm + dabcd(1)=da + dabcd(2)=db + dabcd(3)=dc + dabcd(4)=dd msgbest=msgsent - llrbest=llra - nharderrors=count((2*cw-1)*llra.lt.0.0) + if(dmin.le.60.0) nharderrors=count((2*cw-1)*llra.lt.0.0) endif enddo ! imsg - write(41,3041) nharderrors,pbest,dmin,trim(msgbest) -3041 format(i5,2f10.3,2x,a) + if(dmin.le.60.0) then + if(dmin.eq.dabcd(1)) ndm(1)=ndm(1)+1 + if(dmin.eq.dabcd(2)) ndm(2)=ndm(2)+1 + if(dmin.eq.dabcd(3)) ndm(3)=ndm(3)+1 + if(dmin.eq.dabcd(4)) ndm(4)=ndm(4)+1 +! write(41,3041) nharderrors,dmin,dabcd,ndm,ibest,delfbest,trim(msgbest) +!3041 format(i5,5f8.2,4i4,i5,f7.1,1x,a) +! else +! f00=0.0 +! call ft8q3(cd0,xdt,f00,call_1,call_2,grid4,msgbest,snr) +! if(snr.gt.5.0) then +! nharderrors=0 +! dmin=0. +! xsnr=snr-25.0 +! endif + endif + msg37=msgbest return end subroutine ft8_a7d +subroutine ft8q3(cd,xdt,f0,call_1,call_2,grid4,msgbest,snr) + +! Get q3-style decodes for FT8. + + use packjt77 + parameter(NN=79,NSPS=32) + parameter(NWAVE=NN*NSPS) !2528 + parameter(NZ=3200,NLAGS=NZ-NWAVE) + character*12 call_1,call_2 + character*4 grid4 + character*37 msg,msgbest,msgsent + character c77*77 + complex cwave(0:NWAVE-1) + complex cd(0:NZ-1) + complex z + real xjunk(NWAVE) + real ccf(0:NLAGS-1) + real ccfmsg(206) + integer itone(NN) + integer*1 msgbits(77) + logical std_1,std_2 + + if(xdt.eq.-99.0) return !Silence compiler warning + call stdcall(call_1,std_1) + call stdcall(call_2,std_2) + + fs=200.0 !Sample rate (Hz) + dt=1.0/fs !Sample interval (s) + bt=2.0 + ccfbest=0. + lagbest=-1 + + do imsg=1,206 + msg=trim(call_1)//' '//trim(call_2) + i=imsg + if(.not.std_1) then + if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2) + if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>' + else if(.not.std_2) then + if(i.le.4 .or. i.eq.6) msg='<'//trim(call_1)//'> '//trim(call_2) + if(i.ge.7) msg=trim(call_1)//' <'//trim(call_2)//'>' + endif + j0=len(trim(msg))+2 + if(i.eq.2) msg(j0:j0+2)='RRR' + if(i.eq.3) msg(j0:j0+3)='RR73' + if(i.eq.4) msg(j0:j0+1)='73' + if(i.eq.5) then + if(std_2) msg='CQ '//trim(call_2)//' '//grid4 + if(.not.std_2) msg='CQ '//trim(call_2) + endif + if(i.eq.6 .and. std_2) msg(j0:j0+3)=grid4 + if(i.ge.7 .and. i.le.206) then + isnr = -50 + (i-7)/2 + if(iand(i,1).eq.1) then + write(msg(j0:j0+2),'(i3.2)') isnr + if(msg(j0:j0).eq.' ') msg(j0:j0)='+' + else + write(msg(j0:j0+3),'("R",i3.2)') isnr + if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+' + endif + endif + +! Source-encode, then get itone() + i3=-1 + n3=-1 + call pack77(msg,i3,n3,c77) + call genft8(msg,i3,n3,msgsent,msgbits,itone) +! Generate complex cwave + call gen_ft8wave(itone,NN,NSPS,bt,fs,f0,cwave,xjunk,1,NWAVE) + + lagmax=-1 + ccfmax=0. + nsum=32*2 + do lag=0,nlags-1 + z=0. + s=0. + do i=0,NWAVE-1 + z=z + cd(i+lag)*conjg(cwave(i)) + if(mod(i,nsum).eq.nsum-1 .or. i.eq.NWAVE-1) then + s=s + abs(z) + z=0. + endif + enddo + ccf(lag)=s + if(ccf(lag).gt.ccfmax) then + ccfmax=ccf(lag) + lagmax=lag + endif + enddo ! lag + ccfmsg(imsg)=ccfmax + if(ccfmax.gt.ccfbest) then + ccfbest=ccfmax + lagbest=lagmax + msgbest=msg + endif + enddo ! imsg + + call pctile(ccfmsg,207,50,base) + call pctile(ccfmsg,207,67,sigma) + sigma=sigma-base + ccfmsg=(ccfmsg-base)/sigma +! do imsg=1,207 +! write(44,3044) imsg,ccfmsg(imsg) +!3044 format(i5,f10.3) +! enddo + snr=maxval(ccfmsg) + + return +end subroutine ft8q3 + end module ft8_a7 diff --git a/lib/ft8_decode.f90 b/lib/ft8_decode.f90 index 036a9479c..c1578a558 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -220,7 +220,7 @@ contains qual=1.0-(nharderrors+dmin)/60.0 ! scale qual to [0.0,1.0] if(emedelay.ne.0) xdt=xdt+2.0 call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual) - call ft8_a7_save(nutc,xdt,f1,msg37) + call ft8_a7_save(nutc,xdt,f1,msg37) !Enter decode in table ! ii=ndec(jseq,1) ! write(41,3041) jseq,ii,nint(f0(ii,jseq,0)),msg0(ii,jseq,0)(1:22),& ! nint(f0(ii,jseq,1)),msg0(ii,jseq,1)(1:22) @@ -260,13 +260,16 @@ contains call timer('ft8_a7d ',1) ! write(51,3051) i,xdt,nint(f1),nharderrors,dmin,call_1,call_2,grid4 !3051 format(i3,f7.2,2i5,f7.1,1x,a12,a12,1x,a4) - if(nharderrors.ge.0 .and. dmin.le.80.0) then + + if(nharderrors.ge.0) then if(associated(this%callback)) then nsnr=xsnr iaptype=7 + if(nharderrors.eq.0 .and.dmin.eq.0.0) iaptype=8 qual=1.0 +! if(iaptype.eq.8) print*,'b',nsnr,xdt,f1,msg37,'a8' call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual) - call ft8_a7_save(nutc,xdt,f1,msg37) + call ft8_a7_save(nutc,xdt,f1,msg37) !Enter decode in table endif ! write(*,3901) xdt,nint(f1),nharderrors,dmin,trim(msg37) !3901 format('$$$',f6.1,i5,i5,f7.1,1x,a) @@ -274,7 +277,8 @@ contains ! newdat=.false. enddo endif - +! if(nzhsym.eq.50) print*,'A',ndec(0,0:1),ndec(1,0:1) + return end subroutine decode From 6020552473c0e0c076752b2c51120b41d29af364 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 11 Nov 2021 12:28:24 -0500 Subject: [PATCH 22/74] Varioous adjustments to a7 decoding for FT8. --- lib/ft8/chkdec.f90 | 161 ++++++++++++++++++++++++++++++++++++++ lib/ft8/ft8_a7.f90 | 166 +++++++--------------------------------- lib/ft8/ft8q3.f90 | 15 +--- lib/ft8/subtractft8.f90 | 2 +- lib/ft8_decode.f90 | 8 -- 5 files changed, 192 insertions(+), 160 deletions(-) create mode 100644 lib/ft8/chkdec.f90 diff --git a/lib/ft8/chkdec.f90 b/lib/ft8/chkdec.f90 new file mode 100644 index 000000000..7a5e7618a --- /dev/null +++ b/lib/ft8/chkdec.f90 @@ -0,0 +1,161 @@ +program chkdec + + parameter(NMAX=100) + character*88 line + character*37 msg(NMAX),msg0,msg1 + character*2 c2(NMAX) + character*1 c1(NMAX) + character*1 only + integer nsnr(NMAX,0:1),nf(NMAX,0:1) + real dt(NMAX,0:1) + logical found,eof + +! These files are sorted by freq within each Rx sequence + open(10,file='all.wsjtx',status='old') + open(11,file='all.jtdx',status='old') + write(20,1030) +1030 format(' iseq B w j W W+ J E B w j W', & + ' W+ J E'/80('-')) + + nutc0=-1 + nbt=0 !Both + nwt=0 !WSJT-X only + njt=0 !JTDX only + net=0 !Either + n7t=0 !a7 + eof=.false. + + do iseq=1,9999 + j=0 + msg=' ' + nsnr=-99 + nf=-99 + dt=-99 + c1=' ' + c2=' ' + do i=1,NMAX + read(10,'(a88)',end=8) line !Read from the WSJT-X file + if(line(25:30).ne.'Rx FT8') cycle !Ignore any line not an FT8 decode + read(line(8:13),*) nutc + if(nutc0.lt.0) nutc0=nutc !First time only + if(nutc.ne.nutc0) then + backspace(10) + go to 10 !Finished WSJT-X for this sequence + endif + j=j+1 + if(j.eq.1) then + nf(j,0)=-1 + j=j+1 + endif + read(line,1001) nsnr(j,0),dt(j,0),nf(j,0),msg(j),c2(j) +1001 format(30x,i7,f5.1,i5,1x,a36,2x,a2) +! if(nutc.eq.180215 .and. c2(j).eq.'a7') print*,'aaa',j,nf(j,0),c2(j) + nutc0=nutc + enddo ! i + +8 eof=.true. +10 jz=j + do i=1,NMAX + read(11,'(a88)',end=20) line !Read from the JTDX file + if(line(31:31).ne.'~') cycle !Ignore any line not an FT8 decode + read(line(10:15),*) nutc + if(nutc.ne.nutc0) then + backspace(11) + go to 20 !Finished JTDX for this sequence + endif + msg1=line(33:58) + read(line(25:29),*) nf1 + found=.false. + do j=1,jz + if(msg(j).eq.msg1) then + read(line,1002) nsnr(j,1),dt(j,1),nf(j,1),c1(j) +1002 format(15x,i4,f5.1,i5,29x,a1) + found=.true. + exit + endif + i1=index(msg(j),'<') + if(i1.gt.0) then + i2=index(msg(j),'>') + msg0=msg(j)(1:i1-1)//msg(j)(i1+1:i2-1)//msg(j)(i2+1:) + if(msg0.eq.msg1) then + read(line,1002) nsnr(j,1),dt(j,1),nf(j,1),c1(j) + found=.true. + exit + endif + endif + enddo ! j + + if(.not.found) then !Insert this one as a new message + do j=1,jz + if(nf1.ge.nf(j,0) .and. nf1.lt.nf(j+1,0)) then + jj=j+1 + exit + endif + enddo + do j=jz+1,jj+1,-1 + nsnr(j,0)=nsnr(j-1,0) + dt(j,0)=dt(j-1,0) + nf(j,0)=nf(j-1,0) + msg(j)=msg(j-1) + c1(j)=c1(j-1) + c2(j)=c2(j-1) + enddo ! j + read(line,1004) nsnr(jj,1),dt(jj,1),nf(jj,1),msg(jj),c1(jj) +1004 format(15x,i4,f5.1,i5,3x,a26,a1) + c2(jj)=' ' + nsnr(jj,0)=-99 + dt(jj,0)=-99.0 + nf(jj,0)=-99 + jz=jz+1 + endif + enddo ! i + +20 nb=0 + nw=0 + nj=0 + ne=0 + n7=0 + do j=2,jz + write(line,1020) nutc0,j,nsnr(j,:),dt(j,:),nf(j,:),msg(j)(1:26), & + c2(j),c1(j) +1020 format(i6.6,i3,1x,2i4,1x,2f6.1,1x,2i5,1x,a26,1x,a2,1x,a1) + if(c2(j).eq.'a7') n7=n7+1 + only=' ' + if(line(12:14).eq.'-99') then + line(12:14)=' ' + only='j' + nj=nj+1 +! if(c2(j).eq.'a7') print*,'aaa ',trim(line) + endif + if(line(16:18).eq.'-99') then + line(16:18)=' ' + only='w' + nw=nw+1 + endif + if(line(12:14).ne.' ' .or. line(16:19).ne.' ') ne=ne+1 + if(line(12:14).ne.' ' .and. line(16:19).ne.' ') nb=nb+1 + if(line(21:25).eq.'-99.0') line(21:25)=' ' + if(line(27:31).eq.'-99.0') line(27:31)=' ' + if(line(35:37).eq.'-99') line(35:37)=' ' + if(line(40:42).eq.'-99') line(40:42)=' ' +! if(line(12:14).ne.' ') nw=nw+1 +! if(line(16:18).ne.' ') nj=nj+1 + write(*,'(a74,1x,a1)') line(1:74),only + enddo ! j + + nbt=nbt+nb + nwt=nwt+nw + n7t=n7t+n7 + njt=njt+nj + net=net+ne + nutc0=nutc + write(*,*) + + write(20,1031) iseq,nb,nw,nj,nb+nw-n7,nb+nw,nb+nj,ne,nbt,nwt,njt, & + nbt+nwt-n7t,nbt+nwt,nbt+njt,net +1031 format(i5,2x,7i4,2x,7i6) + if(eof) exit +! if(iseq.eq.2) exit + enddo ! iseq + +end program chkdec diff --git a/lib/ft8/ft8_a7.f90 b/lib/ft8/ft8_a7.f90 index f846ad2b3..b54870f7e 100644 --- a/lib/ft8/ft8_a7.f90 +++ b/lib/ft8/ft8_a7.f90 @@ -85,7 +85,7 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & real a(5) real s8(0:7,NN) real s2(0:511) - real dabcd(4) + real dmm(206) real bmeta(174),bmetb(174),bmetc(174),bmetd(174) real llra(174),llrb(174),llrc(174),llrd(174) !Soft symbols real dd0(15*12000) @@ -96,7 +96,6 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & integer*1 nxor(174),hdec(174) integer itone(NN) integer icos7(0:6),ip(1) - integer ndm(4) logical one(0:511,0:8) integer graymap(0:7) integer iloc(1) @@ -109,7 +108,7 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & data icos7/3,1,4,0,6,5,2/ !Sync array data first/.true./ data graymap/0,1,3,2,5,6,4,7/ - save one,ndm + save one if(first) then one=.false. @@ -119,7 +118,6 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & enddo enddo first=.false. - ndm=0 endif call stdcall(call_1,std_1) @@ -326,7 +324,7 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & hdec=0 where(llrb.ge.0.0) hdec=1 nxor=ieor(hdec,cw) - db=sum(nxor*abs(llrb)) + dbb=sum(nxor*abs(llrb)) hdec=0 where(llrc.ge.0.0) hdec=1 @@ -338,150 +336,40 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & nxor=ieor(hdec,cw) dd=sum(nxor*abs(llrd)) - dm=min(da,db,dc,dd) - + dm=min(da,dbb,dc,dd) + dmm(imsg)=dm if(dm.lt.dmin) then dmin=dm - dabcd(1)=da - dabcd(2)=db - dabcd(3)=dc - dabcd(4)=dd msgbest=msgsent - if(dmin.le.60.0) nharderrors=count((2*cw-1)*llra.lt.0.0) + if(dm.eq.da) then + nharderrors=count((2*cw-1)*llra.lt.0.0) + pbest=pa + else if(dm.eq.dbb) then + nharderrors=count((2*cw-1)*llrb.lt.0.0) + pbest=pb + else if(dm.eq.dc) then + nharderrors=count((2*cw-1)*llrc.lt.0.0) + pbest=pc + else if(dm.eq.dd) then + nharderrors=count((2*cw-1)*llrd.lt.0.0) + pbest=pd + endif endif enddo ! imsg - if(dmin.le.60.0) then - if(dmin.eq.dabcd(1)) ndm(1)=ndm(1)+1 - if(dmin.eq.dabcd(2)) ndm(2)=ndm(2)+1 - if(dmin.eq.dabcd(3)) ndm(3)=ndm(3)+1 - if(dmin.eq.dabcd(4)) ndm(4)=ndm(4)+1 -! write(41,3041) nharderrors,dmin,dabcd,ndm,ibest,delfbest,trim(msgbest) -!3041 format(i5,5f8.2,4i4,i5,f7.1,1x,a) -! else -! f00=0.0 -! call ft8q3(cd0,xdt,f00,call_1,call_2,grid4,msgbest,snr) -! if(snr.gt.5.0) then -! nharderrors=0 -! dmin=0. -! xsnr=snr-25.0 -! endif - endif - + iloc=minloc(dmm) + dmm(iloc(1))=1.e30 + iloc=minloc(dmm) + dmin2=dmm(iloc(1)) + xsnr=-24. + if(pbest.gt.0.0) xsnr=db(pbest/50.0) - 24.0 +! write(41,3041) nharderrors,dmin,dmin2,dmin2/dmin,xsnr,trim(msgbest) +!3041 format(i3,2f7.1,f7.2,f7.1,1x,a) + if(dmin.gt.100.0 .or. dmin2/dmin.lt.1.3) nharderrors=-1 msg37=msgbest return end subroutine ft8_a7d -subroutine ft8q3(cd,xdt,f0,call_1,call_2,grid4,msgbest,snr) - -! Get q3-style decodes for FT8. - - use packjt77 - parameter(NN=79,NSPS=32) - parameter(NWAVE=NN*NSPS) !2528 - parameter(NZ=3200,NLAGS=NZ-NWAVE) - character*12 call_1,call_2 - character*4 grid4 - character*37 msg,msgbest,msgsent - character c77*77 - complex cwave(0:NWAVE-1) - complex cd(0:NZ-1) - complex z - real xjunk(NWAVE) - real ccf(0:NLAGS-1) - real ccfmsg(206) - integer itone(NN) - integer*1 msgbits(77) - logical std_1,std_2 - - if(xdt.eq.-99.0) return !Silence compiler warning - call stdcall(call_1,std_1) - call stdcall(call_2,std_2) - - fs=200.0 !Sample rate (Hz) - dt=1.0/fs !Sample interval (s) - bt=2.0 - ccfbest=0. - lagbest=-1 - - do imsg=1,206 - msg=trim(call_1)//' '//trim(call_2) - i=imsg - if(.not.std_1) then - if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2) - if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>' - else if(.not.std_2) then - if(i.le.4 .or. i.eq.6) msg='<'//trim(call_1)//'> '//trim(call_2) - if(i.ge.7) msg=trim(call_1)//' <'//trim(call_2)//'>' - endif - j0=len(trim(msg))+2 - if(i.eq.2) msg(j0:j0+2)='RRR' - if(i.eq.3) msg(j0:j0+3)='RR73' - if(i.eq.4) msg(j0:j0+1)='73' - if(i.eq.5) then - if(std_2) msg='CQ '//trim(call_2)//' '//grid4 - if(.not.std_2) msg='CQ '//trim(call_2) - endif - if(i.eq.6 .and. std_2) msg(j0:j0+3)=grid4 - if(i.ge.7 .and. i.le.206) then - isnr = -50 + (i-7)/2 - if(iand(i,1).eq.1) then - write(msg(j0:j0+2),'(i3.2)') isnr - if(msg(j0:j0).eq.' ') msg(j0:j0)='+' - else - write(msg(j0:j0+3),'("R",i3.2)') isnr - if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+' - endif - endif - -! Source-encode, then get itone() - i3=-1 - n3=-1 - call pack77(msg,i3,n3,c77) - call genft8(msg,i3,n3,msgsent,msgbits,itone) -! Generate complex cwave - call gen_ft8wave(itone,NN,NSPS,bt,fs,f0,cwave,xjunk,1,NWAVE) - - lagmax=-1 - ccfmax=0. - nsum=32*2 - do lag=0,nlags-1 - z=0. - s=0. - do i=0,NWAVE-1 - z=z + cd(i+lag)*conjg(cwave(i)) - if(mod(i,nsum).eq.nsum-1 .or. i.eq.NWAVE-1) then - s=s + abs(z) - z=0. - endif - enddo - ccf(lag)=s - if(ccf(lag).gt.ccfmax) then - ccfmax=ccf(lag) - lagmax=lag - endif - enddo ! lag - ccfmsg(imsg)=ccfmax - if(ccfmax.gt.ccfbest) then - ccfbest=ccfmax - lagbest=lagmax - msgbest=msg - endif - enddo ! imsg - - call pctile(ccfmsg,207,50,base) - call pctile(ccfmsg,207,67,sigma) - sigma=sigma-base - ccfmsg=(ccfmsg-base)/sigma -! do imsg=1,207 -! write(44,3044) imsg,ccfmsg(imsg) -!3044 format(i5,f10.3) -! enddo - snr=maxval(ccfmsg) - - return -end subroutine ft8q3 - end module ft8_a7 diff --git a/lib/ft8/ft8q3.f90 b/lib/ft8/ft8q3.f90 index fbfd66edf..122e49c99 100644 --- a/lib/ft8/ft8q3.f90 +++ b/lib/ft8/ft8q3.f90 @@ -15,7 +15,7 @@ subroutine ft8q3(cd,xdt,f0,call_1,call_2,grid4,msgbest,snr) complex z real xjunk(NWAVE) real ccf(0:NLAGS-1) - real ccfmsg(207) + real ccfmsg(206) integer itone(NN) integer*1 msgbits(77) logical std_1,std_2 @@ -30,7 +30,7 @@ subroutine ft8q3(cd,xdt,f0,call_1,call_2,grid4,msgbest,snr) ccfbest=0. lagbest=-1 - do imsg=1,207 + do imsg=1,206 msg=trim(call_1)//' '//trim(call_2) i=imsg if(.not.std_1) then @@ -59,7 +59,6 @@ subroutine ft8q3(cd,xdt,f0,call_1,call_2,grid4,msgbest,snr) if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+' endif endif - if(i.eq.207) msg='TNX 73 GL' ! Source-encode, then get itone() i3=-1 @@ -69,14 +68,6 @@ subroutine ft8q3(cd,xdt,f0,call_1,call_2,grid4,msgbest,snr) ! Generate complex cwave call gen_ft8wave(itone,NN,NSPS,bt,fs,f0,cwave,xjunk,1,NWAVE) - if(imsg.eq.79) then - print*,NN,NSPS,bt,fs,f0,NWAVE,itone(1:7) - do i=0,NWAVE-1 - write(45,3045) i,cd(i),100*cwave(i) -3045 format(i5,4e12.3) - enddo - endif - lagmax=-1 ccfmax=0. nsum=32*2 @@ -107,7 +98,7 @@ subroutine ft8q3(cd,xdt,f0,call_1,call_2,grid4,msgbest,snr) call pctile(ccfmsg,207,50,base) call pctile(ccfmsg,207,67,sigma) sigma=sigma-base - ccfmsg=(ccfmsg-base)/(2.5*sigma) + ccfmsg=(ccfmsg-base)/sigma ! do imsg=1,207 ! write(44,3044) imsg,ccfmsg(imsg) !3044 format(i5,f10.3) diff --git a/lib/ft8/subtractft8.f90 b/lib/ft8/subtractft8.f90 index 40657e7e7..7d6084875 100644 --- a/lib/ft8/subtractft8.f90 +++ b/lib/ft8/subtractft8.f90 @@ -8,7 +8,7 @@ subroutine subtractft8(dd0,itone,f0,dt,lrefinedt) ! Subtract : dd(t) = dd(t) - 2*REAL{cref*cfilt} parameter (NMAX=15*12000,NFRAME=1920*79) - parameter (NFFT=NMAX,NFILT=4000) + parameter (NFFT=NMAX,NFILT=6500) real dd(NMAX),dd0(NMAX) real window(-NFILT/2:NFILT/2) real x(NFFT+2) diff --git a/lib/ft8_decode.f90 b/lib/ft8_decode.f90 index c1578a558..d0d2fd9ad 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -258,26 +258,18 @@ contains call ft8_a7d(dd,newdat,call_1,call_2,grid4,xdt,f1,nharderrors, & dmin,msg37,xsnr) call timer('ft8_a7d ',1) -! write(51,3051) i,xdt,nint(f1),nharderrors,dmin,call_1,call_2,grid4 -!3051 format(i3,f7.2,2i5,f7.1,1x,a12,a12,1x,a4) if(nharderrors.ge.0) then if(associated(this%callback)) then nsnr=xsnr iaptype=7 - if(nharderrors.eq.0 .and.dmin.eq.0.0) iaptype=8 qual=1.0 -! if(iaptype.eq.8) print*,'b',nsnr,xdt,f1,msg37,'a8' call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual) call ft8_a7_save(nutc,xdt,f1,msg37) !Enter decode in table endif -! write(*,3901) xdt,nint(f1),nharderrors,dmin,trim(msg37) -!3901 format('$$$',f6.1,i5,i5,f7.1,1x,a) endif -! newdat=.false. enddo endif -! if(nzhsym.eq.50) print*,'A',ndec(0,0:1),ndec(1,0:1) return end subroutine decode From 500e565d77d20a3717978c7d1581944fe9036cba Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 8 Jan 2022 14:20:55 -0500 Subject: [PATCH 23/74] For now, at least, revert to NFILT=4000 in subtractft8.f90. --- lib/ft8/subtractft8.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ft8/subtractft8.f90 b/lib/ft8/subtractft8.f90 index 7d6084875..40657e7e7 100644 --- a/lib/ft8/subtractft8.f90 +++ b/lib/ft8/subtractft8.f90 @@ -8,7 +8,7 @@ subroutine subtractft8(dd0,itone,f0,dt,lrefinedt) ! Subtract : dd(t) = dd(t) - 2*REAL{cref*cfilt} parameter (NMAX=15*12000,NFRAME=1920*79) - parameter (NFFT=NMAX,NFILT=6500) + parameter (NFFT=NMAX,NFILT=4000) real dd(NMAX),dd0(NMAX) real window(-NFILT/2:NFILT/2) real x(NFFT+2) From d7747336364a5fe44eda35b8e75c9008b6cf107f Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 8 Jan 2022 15:09:28 -0500 Subject: [PATCH 24/74] Set build_type to devel (RC 0), not RC 1. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f624998e3..9b0a5ed31 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,7 +71,7 @@ message (STATUS "******************************************************") include (set_build_type) # RC 0 or omitted is a development build, GA is a General Availability release build -set_build_type (RC 1) +set_build_type (RC 0) set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}") # From 5797e51fe3793fc6ed143283f8cccea59e3d0088 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 9 Jan 2022 09:46:33 -0500 Subject: [PATCH 25/74] Protect against a blank message. --- lib/ft8/ft8_a7.f90 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/ft8/ft8_a7.f90 b/lib/ft8/ft8_a7.f90 index b54870f7e..d02c77fbf 100644 --- a/lib/ft8/ft8_a7.f90 +++ b/lib/ft8/ft8_a7.f90 @@ -44,6 +44,7 @@ subroutine ft8_a7_save(nutc,dt,f,msg) dt0(i,j,1)=dt !Save dt in table f0(i,j,1)=f !Save f in table call split77(msg,nwords,nw,w) !Parse msg into words + if(nwords.lt.1) go to 999 msg0(i,j,1)=trim(w(1))//' '//trim(w(2)) !Save "call_1 call_2" if(w(1)(1:3).eq.'CQ ' .and. nw(2).le.2) then msg0(i,j,1)='CQ '//trim(w(2))//' '//trim(w(3)) !Save "CQ DX Call_2" @@ -66,7 +67,7 @@ subroutine ft8_a7_save(nutc,dt,f,msg) endif enddo - return +999 return end subroutine ft8_a7_save subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & From 3e49dfacc5c495492bb327e3cc8bdc42b98aa3f6 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 10 Jan 2022 10:34:08 +0100 Subject: [PATCH 26/74] Improve ft8 decoder sensitivity for Normal and Deep settings --- lib/ft8_decode.f90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/ft8_decode.f90 b/lib/ft8_decode.f90 index 73d0f8c2a..c0b0584f4 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -145,8 +145,9 @@ contains if(ndepth.eq.1) npass=1 do ipass=1,npass newdat=.true. - syncmin=1.3 - if(ndepth.le.2) syncmin=1.6 + syncmin=1.2 + if(ndepth.eq.1) syncmin=1.6 + if(ndepth.eq.2) syncmin=1.4 if(ipass.eq.1) then lsubtract=.true. ndeep=ndepth From ab89d70b6a0e74487ccfd3e5264a9b17ab18c399 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 10 Jan 2022 10:41:23 +0100 Subject: [PATCH 27/74] Improve ft8 decoder sensitivity --- lib/ft8/ft8b.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ft8/ft8b.f90 b/lib/ft8/ft8b.f90 index d96cbd9c7..6be5830a9 100644 --- a/lib/ft8/ft8b.f90 +++ b/lib/ft8/ft8b.f90 @@ -451,11 +451,11 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,nzhsym,lapon, & if(.not.nagain) then xsnr=xsnr2 endif - if(nsync.le.10 .and. xsnr.lt.-24.0) then !bail out, likely false decode + if(nsync.le.6 .and. xsnr.lt.-26.0) then !bail out, likely false decode nbadcrc=1 return endif - if(xsnr .lt. -24.0) xsnr=-24.0 + if(xsnr .lt. -26.0) xsnr=-26.0 return enddo return From b68e90ae8823ec1f07b0c3eb9de63bf5407849d4 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 10 Jan 2022 11:04:11 +0100 Subject: [PATCH 28/74] Slightly reduce number of false decodes --- lib/ft8/ft8b.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ft8/ft8b.f90 b/lib/ft8/ft8b.f90 index 6be5830a9..87c98931e 100644 --- a/lib/ft8/ft8b.f90 +++ b/lib/ft8/ft8b.f90 @@ -451,11 +451,11 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,nzhsym,lapon, & if(.not.nagain) then xsnr=xsnr2 endif - if(nsync.le.6 .and. xsnr.lt.-26.0) then !bail out, likely false decode + if(nsync.le.6 .and. xsnr.lt.-25.0) then !bail out, likely false decode nbadcrc=1 return endif - if(xsnr .lt. -26.0) xsnr=-26.0 + if(xsnr .lt. -25.0) xsnr=-25.0 return enddo return From 96974e0537667d88feb87c66c9455ca64a78987c Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 10 Jan 2022 11:20:55 +0100 Subject: [PATCH 29/74] Prevent self spotting when running multiple instances --- widgets/mainwindow.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index ecb5e8603..05485fd2a 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3709,7 +3709,8 @@ void MainWindow::auto_sequence (DecodedText const& message, unsigned start_toler void MainWindow::pskPost (DecodedText const& decodedtext) { - if (m_diskData || !m_config.spot_to_psk_reporter() || decodedtext.isLowConfidence ()) return; + if (m_diskData || !m_config.spot_to_psk_reporter() || decodedtext.isLowConfidence () + || (decodedtext.string().contains(m_baseCall) && dec_data.params.mygrid)) return; // prevent self spotting when running multiple instances QString msgmode=m_mode; QString deCall; From 9ffa81e59a60ea49ebfe134fbe79881892f7b777 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 10 Jan 2022 11:26:03 +0100 Subject: [PATCH 30/74] Add tune watchdog (60s) --- widgets/mainwindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 05485fd2a..769c3e1e4 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -7035,6 +7035,7 @@ void MainWindow::on_rptSpinBox_valueChanged(int n) void MainWindow::on_tuneButton_clicked (bool checked) { + tuneATU_Timer.start (60000); // tune watchdog (60s) static bool lastChecked = false; if (lastChecked == checked) return; lastChecked = checked; From 39b63f419075aee8e57640ed8e4afa8717782f03 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 10 Jan 2022 13:54:48 +0100 Subject: [PATCH 31/74] Add mode buttons to the mainwindow --- Configuration.cpp | 24 ++ Configuration.hpp | 3 + widgets/mainwindow.cpp | 59 ++- widgets/mainwindow.h | 6 + widgets/mainwindow.ui | 918 +++++++++++++++++++++++----------------- widgets/signalmeter.cpp | 2 +- 6 files changed, 612 insertions(+), 400 deletions(-) diff --git a/Configuration.cpp b/Configuration.cpp index 7b78abed0..386c1ee1d 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -920,6 +920,30 @@ void Configuration::set_location (QString const& grid_descriptor) m_->dynamic_grid_ = grid_descriptor.trimmed (); } +void Configuration::setSpecial_Hound() +{ + m_->bSpecialOp_=true; + m_->ui_->gbSpecialOpActivity->setChecked(m_->bSpecialOp_); + m_->ui_->rbHound->setChecked(true); + m_->SelectedActivity_ = static_cast (SpecialOperatingActivity::HOUND); + m_->write_settings(); +} + +void Configuration::setSpecial_Fox() +{ + m_->bSpecialOp_=true; + m_->ui_->gbSpecialOpActivity->setChecked(m_->bSpecialOp_); + m_->ui_->rbFox->setChecked(true); + m_->SelectedActivity_ = static_cast (SpecialOperatingActivity::FOX); + m_->write_settings(); +} + +void Configuration::setSpecial_None() +{ + m_->bSpecialOp_=false; + m_->ui_->gbSpecialOpActivity->setChecked(m_->bSpecialOp_); + m_->write_settings(); +} namespace { #if defined (Q_OS_MAC) diff --git a/Configuration.hpp b/Configuration.hpp index b0f6bf75b..5f9e30bbf 100644 --- a/Configuration.hpp +++ b/Configuration.hpp @@ -181,6 +181,9 @@ public: bool highlight_by_mode () const; bool highlight_only_fields () const; bool include_WAE_entities () const; + void setSpecial_Hound(); + void setSpecial_Fox(); + void setSpecial_None(); enum class SpecialOperatingActivity {NONE, NA_VHF, EU_VHF, FIELD_DAY, RTTY, WW_DIGI, FOX, HOUND}; SpecialOperatingActivity special_op_id () const; diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 769c3e1e4..5138b1253 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -6222,7 +6222,6 @@ void MainWindow::on_actionFT8_triggered() m_bFast9=false; m_bFastMode=false; WSPR_config(false); - switch_mode (Modes::FT8); m_nsps=6912; m_FFTSize = m_nsps / 2; Q_EMIT FFTSize (m_FFTSize); @@ -6273,6 +6272,8 @@ void MainWindow::on_actionFT8_triggered() on_fox_log_action_triggered(); } if(SpecOp::HOUND == m_config.special_op_id()) { + ui->houndButton->setChecked(true); + ui->houndButton->setStyleSheet("background-color: #ff0000;"); ui->txFirstCheckBox->setChecked(false); ui->txFirstCheckBox->setEnabled(false); ui->cbAutoSeq->setEnabled(false); @@ -6290,6 +6291,8 @@ void MainWindow::on_actionFT8_triggered() ui->txb4->setEnabled(false); ui->txb5->setEnabled(false); ui->txb6->setEnabled(false); + } else { + switch_mode (Modes::FT8); } if (SpecOp::NONE < m_config.special_op_id () && SpecOp::FOX > m_config.special_op_id ()) { @@ -9445,3 +9448,57 @@ QString MainWindow::WSPR_message() } return msg2; } + +void MainWindow::on_houndButton_clicked (bool checked) +{ + if (checked) { + ui->houndButton->setStyleSheet("background-color: #ff0000;"); + m_config.setSpecial_Hound(); + } else { + ui->houndButton->setStyleSheet(""); + m_config.setSpecial_None(); + } + on_actionFT8_triggered(); +} + +void MainWindow::on_ft8Button_clicked() +{ + ui->houndButton->setChecked(false); + ui->houndButton->setStyleSheet(""); + m_config.setSpecial_None(); + on_actionFT8_triggered(); +} + +void MainWindow::on_ft4Button_clicked() +{ + ui->houndButton->setChecked(false); + ui->houndButton->setStyleSheet(""); + m_config.setSpecial_None(); + on_actionFT4_triggered(); +} + +void MainWindow::on_msk144Button_clicked() +{ + ui->houndButton->setChecked(false); + ui->houndButton->setStyleSheet(""); + m_config.setSpecial_None(); + on_actionMSK144_triggered(); +} + +void MainWindow::on_q65Button_clicked() +{ + ui->houndButton->setChecked(false); + ui->houndButton->setStyleSheet(""); + m_config.setSpecial_None(); + on_actionQ65_triggered(); +// ui->sbTR->setValue (m_settings->value ("TRPeriod", 30).toInt()); // set default TRPeriod to 30s +} + +void MainWindow::on_fst4Button_clicked() +{ + ui->houndButton->setChecked(false); + ui->houndButton->setStyleSheet(""); + m_config.setSpecial_None(); + on_actionFST4_triggered(); +// ui->sbTR->setValue (m_settings->value ("TRPeriod", 60).toInt()); // set default TRPeriod to 60s +} diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 139c30c3b..553577fe2 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -141,6 +141,12 @@ private: private slots: void initialize_fonts (); + void on_houndButton_clicked(bool checked); + void on_ft8Button_clicked(); + void on_ft4Button_clicked(); + void on_msk144Button_clicked(); + void on_q65Button_clicked(); + void on_fst4Button_clicked(); void on_tx1_editingFinished(); void on_tx2_editingFinished(); void on_tx3_editingFinished(); diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index bb9b22b77..bd86233cb 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -2,6 +2,14 @@ MainWindow + + + 0 + 0 + 930 + 644 + + WSJT-X by K1JT @@ -552,362 +560,15 @@ - - - - - false - - - <html><head/><body><p>If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode.</p></body></html> - - - If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode. - - - QPushButton { - font-family: helvetica; - font-size: 9pt; - font-weight: bold; - background-color: white; - color: black; - border-style: solid; - border-width:1px; - border-radius:10px; - border-color: gray; - max-width:20px; - max-height:20px; - min-width:20px; - min-height:20px; -} -QPushButton[state="error"] { - background-color: red; -} -QPushButton[state="warning"] { - background-color: orange; -} -QPushButton[state="ok"] { - background-color: #00ff00; -} - - - ? - - - - + + Pwr - - - - Adjust Tx audio level - - - 450 - - - 0 - - - Qt::Vertical - - - true - - - true - - - QSlider::TicksBelow - - - 50 - - - - - - - - 0 - 0 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - 252 - 252 - 252 - - - - - - - 159 - 175 - 213 - - - - - - - - - 252 - 252 - 252 - - - - - - - 159 - 175 - 213 - - - - - - - - - 159 - 175 - 213 - - - - - - - 159 - 175 - 213 - - - - - - - - true - - - DX Call - - - Qt::AlignCenter - - - 5 - - - 2 - - - dxCallEntry - - - - - - - - - - - - 252 - 252 - 252 - - - - - - - 159 - 175 - 213 - - - - - - - - - 252 - 252 - 252 - - - - - - - 159 - 175 - 213 - - - - - - - - - 159 - 175 - 213 - - - - - - - 159 - 175 - 213 - - - - - - - - true - - - DX Grid - - - Qt::AlignCenter - - - 5 - - - 2 - - - dxGridEntry - - - - - - - - 0 - 0 - - - - Callsign of station to be worked - - - 11 - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - Locator of station to be worked - - - ` - - - 6 - - - Qt::AlignCenter - - - - - - - - - Search for callsign in database - - - &Lookup - - - - - - - Add callsign and locator to database - - - Add - - - - - - - true - - - Az: 251 16553 km - - - Qt::AlignCenter - - - 4 - - - - - - - - - + @@ -946,40 +607,7 @@ QPushButton[state="ok"] { - - - - - 0 - 0 - - - - USB dial frequency - - - QLabel { - font-family: MS Shell Dlg 2; - font-size: 16pt; - color : yellow; - background-color : black; -} -QLabel[oob="true"] { - background-color: red; -} - - - 14.078 000 - - - Qt::AlignCenter - - - 5 - - - - + @@ -2761,10 +2389,44 @@ Double-click to reset to the standard 73 message + + + + + 100 + 16777215 + + + + <html><head/><body><p>Select operating band or enter frequency in MHz or enter kHz increment followed by k.</p></body></html> + + + Frequency entry + + + Select operating band or enter frequency in MHz or enter kHz increment followed by k. + + + true + + + QComboBox::NoInsert + + + QComboBox::AdjustToMinimumContentsLengthWithIcon + + + + + + 100 + 16777215 + + Qt::AlignCenter @@ -2818,28 +2480,489 @@ Yellow when too low - - + + + + + 0 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + 252 + 252 + 252 + + + + + + + 159 + 175 + 213 + + + + + + + + + 252 + 252 + 252 + + + + + + + 159 + 175 + 213 + + + + + + + + + 159 + 175 + 213 + + + + + + + 159 + 175 + 213 + + + + + + + + true + + + DX Call + + + Qt::AlignCenter + + + 5 + + + 2 + + + dxCallEntry + + + + + + + + + + + + 252 + 252 + 252 + + + + + + + 159 + 175 + 213 + + + + + + + + + 252 + 252 + 252 + + + + + + + 159 + 175 + 213 + + + + + + + + + 159 + 175 + 213 + + + + + + + 159 + 175 + 213 + + + + + + + + true + + + DX Grid + + + Qt::AlignCenter + + + 5 + + + 2 + + + dxGridEntry + + + + + + + + 0 + 0 + + + + Callsign of station to be worked + + + 11 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + Locator of station to be worked + + + ` + + + 6 + + + Qt::AlignCenter + + + + + + + + + Search for callsign in database + + + &Lookup + + + + + + + Add callsign and locator to database + + + Add + + + + + + + true + + + Az: 251 16553 km + + + Qt::AlignCenter + + + 4 + + + + + + + + + + - <html><head/><body><p>Select operating band or enter frequency in MHz or enter kHz increment followed by k.</p></body></html> + Adjust Tx audio level - - Frequency entry + + 450 - - Select operating band or enter frequency in MHz or enter kHz increment followed by k. + + 0 - + + Qt::Vertical + + true - - QComboBox::NoInsert + + true - - QComboBox::AdjustToMinimumContentsLengthWithIcon + + QSlider::TicksBelow + + + 50 + + + + false + + + <html><head/><body><p>If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode.</p></body></html> + + + If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode. + + + QPushButton { + font-family: helvetica; + font-size: 9pt; + font-weight: bold; + background-color: white; + color: black; + border-style: solid; + border-width:1px; + border-radius:10px; + border-color: gray; + max-width:20px; + max-height:20px; + min-width:20px; + min-height:20px; +} +QPushButton[state="error"] { + background-color: red; +} +QPushButton[state="warning"] { + background-color: orange; +} +QPushButton[state="ok"] { + background-color: #00ff00; +} + + + ? + + + + + + + + 0 + 0 + + + + USB dial frequency + + + QLabel { + font-family: MS Shell Dlg 2; + font-size: 16pt; + color : yellow; + background-color : black; +} +QLabel[oob="true"] { + background-color: red; +} + + + 14.078 000 + + + Qt::AlignCenter + + + 5 + + + + + + + + + + 32 + 16777215 + + + + Toggle FT8 hound mode on/off + + + H + + + true + + + + + + + + 32 + 16777215 + + + + Switch to FT8 mode + + + FT8 + + + + + + + + 32 + 16777215 + + + + Switch to FT4 mode + + + FT4 + + + + + + + + 32 + 16777215 + + + + Switch to MSK144 mode + + + MSK + + + + + + + + 32 + 16777215 + + + + Switch to Q65 mode + + + Q65 + + + + + + + + 32 + 16777215 + + + + Switch to FST4 mode + + + FST4 + + + + + @@ -2852,7 +2975,7 @@ Yellow when too low 0 0 - 842 + 930 21 @@ -3521,7 +3644,6 @@ Yellow when too low tuneButton cbMenus bandComboBox - readFreq sbNB dxCallEntry dxGridEntry diff --git a/widgets/signalmeter.cpp b/widgets/signalmeter.cpp index 60e49b565..b9724d16a 100644 --- a/widgets/signalmeter.cpp +++ b/widgets/signalmeter.cpp @@ -77,7 +77,7 @@ SignalMeter::SignalMeter (QWidget * parent) outer_layout->setSpacing (0); auto inner_layout = new QHBoxLayout; - inner_layout->setContentsMargins (9, 0, 9, 0); + inner_layout->setContentsMargins (1, 0, 1, 0); inner_layout->setSpacing (0); m_meter = new MeterWidget; From d992c9bbafaa487b8cac5dc752f276abc1a2e8db Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 10 Jan 2022 15:30:22 +0100 Subject: [PATCH 32/74] Correct layoutColumnStretch --- widgets/mainwindow.ui | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index bd86233cb..e77826657 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -6,8 +6,8 @@ 0 0 - 930 - 644 + 882 + 718 @@ -560,7 +560,7 @@ - + @@ -2975,7 +2975,7 @@ QLabel[oob="true"] { 0 0 - 930 + 882 21 From 39fecf92c950a717cca992ae5e76c308acb50848 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 10 Jan 2022 19:54:04 +0100 Subject: [PATCH 33/74] Fix a typo (needed for compilation) --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b0a5ed31..9b51c4037 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,7 +45,7 @@ if (POLICY CMP0075) endif () project (wsjtx - VERSION 2.6.0 + VERSION 2.6.0.0 LANGUAGES C CXX Fortran ) set (PROJECT_DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio") From 11b23ae9cd4ec961b9a35571d428a6f27b2eef18 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 10 Jan 2022 19:59:28 +0100 Subject: [PATCH 34/74] A more balanced stretching --- widgets/mainwindow.ui | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index e77826657..ef5830860 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -7,7 +7,7 @@ 0 0 882 - 718 + 658 @@ -560,7 +560,7 @@ - + From fb4eb56508e24da65fac00e6a5892a768a4df20b Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 10 Jan 2022 20:16:54 +0100 Subject: [PATCH 35/74] Minor tooltip cleanup --- widgets/mainwindow.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index ef5830860..a6c208480 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -2871,7 +2871,7 @@ QLabel[oob="true"] { - Toggle FT8 hound mode on/off + Toggle FT8 hound mode On/Off H From 947ab4eb2570b984c2bd950ff1b518ce25d84965 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Tue, 11 Jan 2022 10:51:48 +0100 Subject: [PATCH 36/74] Add features Highlight DX Call / DX Grid and Clear DX Call / DX Grid after QSO --- Configuration.cpp | 24 +++++++++++ Configuration.hpp | 4 ++ Configuration.ui | 96 +++++++++++++++++++++++++++--------------- widgets/mainwindow.cpp | 11 +++++ 4 files changed, 101 insertions(+), 34 deletions(-) diff --git a/Configuration.cpp b/Configuration.cpp index 386c1ee1d..f5bb816e3 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -670,6 +670,10 @@ private: bool bLowSidelobes_; bool pwrBandTxMemory_; bool pwrBandTuneMemory_; + bool highlight_DXcall_; + bool clear_DXcall_; + bool highlight_DXgrid_; + bool clear_DXgrid_; QAudioDeviceInfo audio_input_device_; QAudioDeviceInfo next_audio_input_device_; @@ -787,6 +791,10 @@ DecodeHighlightingModel const& Configuration::decode_highlighting () const {retu bool Configuration::highlight_by_mode () const {return m_->highlight_by_mode_;} bool Configuration::highlight_only_fields () const {return m_->highlight_only_fields_;} bool Configuration::include_WAE_entities () const {return m_->include_WAE_entities_;} +bool Configuration::highlight_DXcall () const {return m_->highlight_DXcall_;} +bool Configuration::clear_DXcall () const {return m_->clear_DXcall_;} +bool Configuration::highlight_DXgrid () const {return m_->highlight_DXgrid_;} +bool Configuration::clear_DXgrid () const {return m_->clear_DXgrid_;} void Configuration::set_calibration (CalibrationParams params) { @@ -1422,6 +1430,10 @@ void Configuration::impl::initialize_models () ui_->only_fields_check_box->setChecked (highlight_only_fields_); ui_->include_WAE_check_box->setChecked (include_WAE_entities_); ui_->LotW_days_since_upload_spin_box->setValue (LotW_days_since_upload_); + ui_->cbHighlightDXcall->setChecked(highlight_DXcall_); + ui_->cbClearDXcall->setChecked(clear_DXcall_); + ui_->cbHighlightDXgrid->setChecked(highlight_DXgrid_); + ui_->cbClearDXgrid->setChecked(clear_DXgrid_); set_rig_invariants (); } @@ -1578,6 +1590,10 @@ void Configuration::impl::read_settings () calibration_.slope_ppm = settings_->value ("CalibrationSlopePPM", 0.).toDouble (); pwrBandTxMemory_ = settings_->value("pwrBandTxMemory",false).toBool (); pwrBandTuneMemory_ = settings_->value("pwrBandTuneMemory",false).toBool (); + highlight_DXcall_ = settings_->value("highlight_DXcall",false).toBool (); + clear_DXcall_ = settings_->value("clear_DXcall",false).toBool (); + highlight_DXgrid_ = settings_->value("highlight_DXgrid",false).toBool (); + clear_DXgrid_ = settings_->value("clear_DXgrid",false).toBool (); } void Configuration::impl::find_audio_devices () @@ -1709,6 +1725,10 @@ void Configuration::impl::write_settings () settings_->setValue ("pwrBandTuneMemory", pwrBandTuneMemory_); settings_->setValue ("Region", QVariant::fromValue (region_)); settings_->setValue ("AutoGrid", use_dynamic_grid_); + settings_->setValue ("highlight_DXcall", highlight_DXcall_); + settings_->setValue ("clear_DXcall", clear_DXcall_); + settings_->setValue ("highlight_DXgrid", highlight_DXgrid_); + settings_->setValue ("clear_DXgrid", clear_DXgrid_); settings_->sync (); } @@ -2196,6 +2216,10 @@ void Configuration::impl::accept () dynamic_grid_.clear (); } use_dynamic_grid_ = ui_->use_dynamic_grid->isChecked(); + highlight_DXcall_ = ui_->cbHighlightDXcall->isChecked(); + clear_DXcall_ = ui_->cbClearDXcall->isChecked(); + highlight_DXgrid_ = ui_->cbHighlightDXgrid->isChecked(); + clear_DXgrid_ = ui_->cbClearDXgrid->isChecked(); write_settings (); // make visible to all } diff --git a/Configuration.hpp b/Configuration.hpp index 5f9e30bbf..cb45858a3 100644 --- a/Configuration.hpp +++ b/Configuration.hpp @@ -184,6 +184,10 @@ public: void setSpecial_Hound(); void setSpecial_Fox(); void setSpecial_None(); + bool highlight_DXcall () const; + bool clear_DXcall () const; + bool highlight_DXgrid () const; + bool clear_DXgrid () const; enum class SpecialOperatingActivity {NONE, NA_VHF, EU_VHF, FIELD_DAY, RTTY, WW_DIGI, FOX, HOUND}; SpecialOperatingActivity special_op_id () const; diff --git a/Configuration.ui b/Configuration.ui index 17fd1a326..e08657002 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -181,29 +181,6 @@ - - - - Show if decoded stations are new DXCC entities or worked before. - - - Show &DXCC, grid, and worked-before status - - - false - - - - - - - <html><head/><body><p>Check to have decodes for a new period start at the top of the Band Activity window and not scroll off the top when the window is full.</p><p>This is to aid selecting decodes to double-click while decoding is still in progress. Use the Band Activity vertical scroll bar to reveal decodes past the bottom of the window.</p></body></html> - - - Start new period decodes at top - - - @@ -265,13 +242,10 @@ - - - - Include a separator line between periods in the band activity window. - + + - &Blank line between decoding periods + Highlight DX Call in message @@ -285,6 +259,60 @@ + + + + Show if decoded stations are new DXCC entities or worked before. + + + Show &DXCC, grid, and worked-before status + + + false + + + + + + + <html><head/><body><p>Check to have decodes for a new period start at the top of the Band Activity window and not scroll off the top when the window is full.</p><p>This is to aid selecting decodes to double-click while decoding is still in progress. Use the Band Activity vertical scroll bar to reveal decodes past the bottom of the window.</p></body></html> + + + Start new period decodes at top + + + + + + + Clear DX Grid after QSO + + + + + + + Include a separator line between periods in the band activity window. + + + &Blank line between decoding periods + + + + + + + Highlight DX Grid in message + + + + + + + Clear DX Call after QSO + + + @@ -3233,13 +3261,13 @@ Right click for insert and delete options. + + + + - - - - - + diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 5138b1253..81b962c8c 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3457,6 +3457,15 @@ void MainWindow::readFromStdout() //readFromStdout ui->cbCQonly->isVisible() && ui->cbCQonly->isChecked(), haveFSpread, fSpread); + if (m_config.highlight_DXcall () && (m_hisCall!="") && ((decodedtext.string().contains(QRegularExpression {"(\\w+) " + m_hisCall})) + || (decodedtext.string().contains(QRegularExpression {"(\\w+) <" + m_hisCall +">"})) + || (decodedtext.string().contains(QRegularExpression {"<(\\w+)> " + m_hisCall})))) { + ui->decodedTextBrowser->highlight_callsign(m_hisCall, QColor(255,0,0), QColor(255,255,255), true); // highlight dxCallEntry + } + if (m_config.highlight_DXgrid () && (m_hisGrid!="") && (decodedtext.string().contains(m_hisGrid))) { + ui->decodedTextBrowser->highlight_callsign(m_hisGrid, QColor(0,0,255), QColor(255,255,255), true); // highlight dxGridEntry + } + if(m_bBestSPArmed && m_mode=="FT4" && CALLING == m_QSOProgress) { QString messagePriority=ui->decodedTextBrowser->CQPriority(); if(messagePriority!="") { @@ -6013,6 +6022,8 @@ void MainWindow::acceptQSO (QDateTime const& QSO_date_off, QString const& call, m_xSent.clear (); m_xRcvd.clear (); + if (m_config.clear_DXcall ()) ui->dxCallEntry->clear (); + if (m_config.clear_DXgrid ()) ui->dxGridEntry->clear (); } qint64 MainWindow::nWidgets(QString t) From 3a765e3b1229e261edee9fe0a54ca9ccff020c2d Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Tue, 11 Jan 2022 14:35:15 +0100 Subject: [PATCH 37/74] Add optional highlighting of messages with 73 or RR73 --- Configuration.cpp | 7 +++++++ Configuration.hpp | 1 + Configuration.ui | 45 ++++++++++++++++++++++++----------------- widgets/displaytext.cpp | 5 +++-- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/Configuration.cpp b/Configuration.cpp index f5bb816e3..661a42d6e 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -593,6 +593,7 @@ private: bool highlight_by_mode_; bool highlight_only_fields_; bool include_WAE_entities_; + bool highlight_73_; int LotW_days_since_upload_; TransceiverFactory::ParameterPack rig_params_; @@ -791,6 +792,7 @@ DecodeHighlightingModel const& Configuration::decode_highlighting () const {retu bool Configuration::highlight_by_mode () const {return m_->highlight_by_mode_;} bool Configuration::highlight_only_fields () const {return m_->highlight_only_fields_;} bool Configuration::include_WAE_entities () const {return m_->include_WAE_entities_;} +bool Configuration::highlight_73 () const {return m_->highlight_73_;} bool Configuration::highlight_DXcall () const {return m_->highlight_DXcall_;} bool Configuration::clear_DXcall () const {return m_->clear_DXcall_;} bool Configuration::highlight_DXgrid () const {return m_->highlight_DXgrid_;} @@ -1016,6 +1018,7 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network , highlight_by_mode_ {false} , highlight_only_fields_ {false} , include_WAE_entities_ {false} + , highlight_73_ {false} , LotW_days_since_upload_ {0} , last_port_type_ {TransceiverFactory::Capabilities::none} , rig_is_dummy_ {false} @@ -1429,6 +1432,7 @@ void Configuration::impl::initialize_models () ui_->highlight_by_mode_check_box->setChecked (highlight_by_mode_); ui_->only_fields_check_box->setChecked (highlight_only_fields_); ui_->include_WAE_check_box->setChecked (include_WAE_entities_); + ui_->highlight_73_check_box->setChecked (highlight_73_); ui_->LotW_days_since_upload_spin_box->setValue (LotW_days_since_upload_); ui_->cbHighlightDXcall->setChecked(highlight_DXcall_); ui_->cbClearDXcall->setChecked(clear_DXcall_); @@ -1528,6 +1532,7 @@ void Configuration::impl::read_settings () highlight_by_mode_ = settings_->value("HighlightByMode", false).toBool (); highlight_only_fields_ = settings_->value("OnlyFieldsSought", false).toBool (); include_WAE_entities_ = settings_->value("IncludeWAEEntities", false).toBool (); + highlight_73_ = settings_->value("Highlight73", false).toBool (); LotW_days_since_upload_ = settings_->value ("LotWDaysSinceLastUpload", 365).toInt (); lotw_users_.set_age_constraint (LotW_days_since_upload_); @@ -1666,6 +1671,7 @@ void Configuration::impl::write_settings () settings_->setValue ("HighlightByMode", highlight_by_mode_); settings_->setValue ("OnlyFieldsSought", highlight_only_fields_); settings_->setValue ("IncludeWAEEntities", include_WAE_entities_); + settings_->setValue ("Highlight73", highlight_73_); settings_->setValue ("LotWDaysSinceLastUpload", LotW_days_since_upload_); settings_->setValue ("toRTTY", log_as_RTTY_); settings_->setValue ("dBtoComments", report_in_comments_); @@ -2207,6 +2213,7 @@ void Configuration::impl::accept () highlight_by_mode_ = ui_->highlight_by_mode_check_box->isChecked (); highlight_only_fields_ = ui_->only_fields_check_box->isChecked (); include_WAE_entities_ = ui_->include_WAE_check_box->isChecked (); + highlight_73_ = ui_->highlight_73_check_box->isChecked (); LotW_days_since_upload_ = ui_->LotW_days_since_upload_spin_box->value (); lotw_users_.set_age_constraint (LotW_days_since_upload_); diff --git a/Configuration.hpp b/Configuration.hpp index cb45858a3..c4cf068ec 100644 --- a/Configuration.hpp +++ b/Configuration.hpp @@ -181,6 +181,7 @@ public: bool highlight_by_mode () const; bool highlight_only_fields () const; bool include_WAE_entities () const; + bool highlight_73 () const; void setSpecial_Hound(); void setSpecial_Fox(); void setSpecial_None(); diff --git a/Configuration.ui b/Configuration.ui index e08657002..c64160476 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -7,7 +7,7 @@ 0 0 554 - 560 + 599 @@ -17,7 +17,7 @@ - 0 + 6 @@ -2330,6 +2330,23 @@ Right click for insert and delete options. + + + + Include extra WAE entities + + + + + + + Check to for grid highlighting to only apply to unworked grid fields + + + Only grid Fields sought + + + @@ -2377,20 +2394,10 @@ Right click for insert and delete options. - - + + - Include extra WAE entities - - - - - - - Check to for grid highlighting to only apply to unworked grid fields - - - Only grid Fields sought + Highlight also messages with 73 or RR73 @@ -3262,12 +3269,12 @@ Right click for insert and delete options. - - + + + + - - diff --git a/widgets/displaytext.cpp b/widgets/displaytext.cpp index d784ead1b..d588573a9 100644 --- a/widgets/displaytext.cpp +++ b/widgets/displaytext.cpp @@ -404,6 +404,7 @@ void DisplayText::displayDecodedText(DecodedText const& decodedText, QString con QColor bg; QColor fg; bool CQcall = false; + auto is_73 = decodedText.messageWords().filter (QRegularExpression {"^(73|RR73)$"}).size(); if (decodedText.string ().contains (" CQ ") || decodedText.string ().contains (" CQDX ") || decodedText.string ().contains (" QRZ ")) @@ -446,14 +447,14 @@ void DisplayText::displayDecodedText(DecodedText const& decodedText, QString con message = message.left (ap_pos).trimmed (); } m_CQPriority=""; - if (CQcall) + if (CQcall || (is_73 && (m_config->highlight_73 ()))) { if (displayDXCCEntity) { // if enabled add the DXCC entity and B4 status to the end of the // preformated text line t1 auto currentMode = mode; - message = appendWorkedB4 (message, decodedText.CQersCall(), dxGrid, &bg, &fg + message = appendWorkedB4 (message, dxCall, dxGrid, &bg, &fg , logBook, currentBand, currentMode, extra); } else From fc40770960229af267dcc4028ad377cb4f00e836 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 11 Jan 2022 11:54:36 -0500 Subject: [PATCH 38/74] Revert "Improve ft8 decoder sensitivity for Normal and Deep settings" This reverts commit 3e49dfacc5c495492bb327e3cc8bdc42b98aa3f6. --- lib/ft8_decode.f90 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/ft8_decode.f90 b/lib/ft8_decode.f90 index 4c2ba593f..d0d2fd9ad 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -167,9 +167,8 @@ contains if(ndepth.eq.1) npass=1 do ipass=1,npass newdat=.true. - syncmin=1.2 - if(ndepth.eq.1) syncmin=1.6 - if(ndepth.eq.2) syncmin=1.4 + syncmin=1.3 + if(ndepth.le.2) syncmin=1.6 if(ipass.eq.1) then lsubtract=.true. ndeep=ndepth From c26aa9160bafd25c7d65888af22c64348b5555d7 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 11 Jan 2022 11:55:26 -0500 Subject: [PATCH 39/74] Go back to original settings for sync threshold and decode acceptance criteria. --- lib/ft8/ft8b.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ft8/ft8b.f90 b/lib/ft8/ft8b.f90 index 87c98931e..d96cbd9c7 100644 --- a/lib/ft8/ft8b.f90 +++ b/lib/ft8/ft8b.f90 @@ -451,11 +451,11 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,nzhsym,lapon, & if(.not.nagain) then xsnr=xsnr2 endif - if(nsync.le.6 .and. xsnr.lt.-25.0) then !bail out, likely false decode + if(nsync.le.10 .and. xsnr.lt.-24.0) then !bail out, likely false decode nbadcrc=1 return endif - if(xsnr .lt. -25.0) xsnr=-25.0 + if(xsnr .lt. -24.0) xsnr=-24.0 return enddo return From 151f0f0ab34dbb7c0e00666cbf83224c049a14e3 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Tue, 18 Jan 2022 10:18:10 +0100 Subject: [PATCH 40/74] Set Tune watchdog to 120 seconds --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 81b962c8c..d152e354c 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -7049,7 +7049,7 @@ void MainWindow::on_rptSpinBox_valueChanged(int n) void MainWindow::on_tuneButton_clicked (bool checked) { - tuneATU_Timer.start (60000); // tune watchdog (60s) + tuneATU_Timer.start (120000); // tune watchdog (120s) static bool lastChecked = false; if (lastChecked == checked) return; lastChecked = checked; From 7081f9cf9b0ccc10f06d450fba25f63cf66944e9 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 18 Jan 2022 11:09:53 -0500 Subject: [PATCH 41/74] In User Guide, clarify that using F4 to re-transmit Tx4 requires "Alternate F1-F6 bindings". --- doc/user_guide/en/make-qso.adoc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/user_guide/en/make-qso.adoc b/doc/user_guide/en/make-qso.adoc index c48d5f741..4862147c0 100644 --- a/doc/user_guide/en/make-qso.adoc +++ b/doc/user_guide/en/make-qso.adoc @@ -153,8 +153,9 @@ guidelines for contest logging with FT4, FT8, and MSK144: - Log a QSO when you send RR73 or 73 if you are reasonably confident it will be copied. But be sure to watch for any indication that it was not copied, and then take appropriate action. For example, if - you receive the Tx3 message (R plus contest exchange) again, hit F4 - to re-send your RR73. + you receive the Tx3 message (R plus contest exchange) again, and if + you have activated the alternate F1-F6 bindings, hit F4 to re-send + your RR73. [[COMP-CALL]] === Nonstandard Callsigns From 4b6886cdd09dca01a3a043756b8d32e3d269b3e6 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Tue, 18 Jan 2022 17:10:41 +0100 Subject: [PATCH 42/74] Add options to the writing of ALL.TXT --- widgets/mainwindow.cpp | 18 ++++++++++++++++++ widgets/mainwindow.ui | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index d152e354c..a92e1c359 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -604,6 +604,12 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, ui->actionSave_decoded->setActionGroup(saveGroup); ui->actionSave_all->setActionGroup(saveGroup); + QActionGroup* alltxtGroup = new QActionGroup(this); + ui->actionDon_t_split_ALL_TXT->setActionGroup(alltxtGroup); + ui->actionSplit_ALL_TXT_yearly->setActionGroup(alltxtGroup); + ui->actionSplit_ALL_TXT_monthly->setActionGroup(alltxtGroup); + ui->actionDisable_writing_of_ALL_TXT->setActionGroup(alltxtGroup); + QActionGroup* DepthGroup = new QActionGroup(this); ui->actionQuickDecode->setActionGroup(DepthGroup); ui->actionMediumDecode->setActionGroup(DepthGroup); @@ -1188,6 +1194,10 @@ void MainWindow::writeSettings() } m_settings->setValue ("PhaseEqualizationCoefficients", QVariant {coeffs}); } + m_settings->setValue ("actionDontSplitALLTXT", ui->actionDon_t_split_ALL_TXT->isChecked() ); + m_settings->setValue ("splitAllTxtYearly", ui->actionSplit_ALL_TXT_yearly->isChecked() ); + m_settings->setValue ("splitAllTxtMonthly", ui->actionSplit_ALL_TXT_monthly->isChecked() ); + m_settings->setValue ("disableWritingOfAllTxt", ui->actionDisable_writing_of_ALL_TXT->isChecked() ); m_settings->endGroup(); } @@ -1230,6 +1240,10 @@ void MainWindow::readSettings() ui->actionAstronomical_data->setChecked (displayAstro); m_settings->beginGroup("Common"); + ui->actionDon_t_split_ALL_TXT->setChecked(m_settings->value("actionDontSplitALLTXT", true).toBool()); + ui->actionSplit_ALL_TXT_yearly->setChecked(m_settings->value("splitAllTxtYearly", false).toBool()); + ui->actionSplit_ALL_TXT_monthly->setChecked(m_settings->value("splitAllTxtMonthly", false).toBool()); + ui->actionDisable_writing_of_ALL_TXT->setChecked(m_settings->value("disableWritingOfAllTxt", false).toBool()); m_mode=m_settings->value("Mode","JT9").toString(); ui->actionNone->setChecked(m_settings->value("SaveNone",true).toBool()); ui->actionSave_decoded->setChecked(m_settings->value("SaveDecoded",false).toBool()); @@ -9237,6 +9251,7 @@ void MainWindow::foxTest() void MainWindow::write_all(QString txRx, QString message) { + if (!(ui->actionDisable_writing_of_ALL_TXT->isChecked())) { QString line; QString t; QString msg; @@ -9277,6 +9292,8 @@ void MainWindow::write_all(QString txRx, QString message) } QString file_name="ALL.TXT"; + if (ui->actionSplit_ALL_TXT_yearly->isChecked()) file_name=(time.toString("yyyy") + "-" + "ALL.TXT"); + if (ui->actionSplit_ALL_TXT_monthly->isChecked()) file_name=(time.toString("yyyy-MM") + "-" + "ALL.TXT"); if (m_mode=="WSPR") file_name="ALL_WSPR.TXT"; QFile f{m_config.writeable_data_dir().absoluteFilePath(file_name)}; if (f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) { @@ -9295,6 +9312,7 @@ void MainWindow::write_all(QString txRx, QString message) QTimer::singleShot (0, [=] { // don't block guiUpdate MessageBox::warning_message(this, tr ("Log File Error"), message2); }); } + } } void MainWindow::chkFT4() diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index a6c208480..ce38d9c6c 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -3036,6 +3036,11 @@ QLabel[oob="true"] { + + + + + @@ -3584,6 +3589,41 @@ QLabel[oob="true"] { Quick-Start Guide to WSJT-X 2.5.0 and MAP65 3.0 + + + true + + + true + + + Don't split ALL.TXT + + + + + true + + + Split ALL.TXT yearly + + + + + true + + + Split ALL.TXT monthly + + + + + true + + + Disable writing of ALL.TXT + + From a3fa2cef886c9f9750b33771e53314d2ee20cc3b Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 18 Jan 2022 11:16:03 -0500 Subject: [PATCH 43/74] Correction to User Guide addition: use bold-face where needed. --- doc/user_guide/en/make-qso.adoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/user_guide/en/make-qso.adoc b/doc/user_guide/en/make-qso.adoc index 4862147c0..43f2b48f5 100644 --- a/doc/user_guide/en/make-qso.adoc +++ b/doc/user_guide/en/make-qso.adoc @@ -144,7 +144,7 @@ station's log and not the supposed QSO partner's. To avoid Not-in-Log (NIL) penalties for yourself and others, we recommend the following guidelines for contest logging with FT4, FT8, and MSK144: - - Activate and learn to use the alternate F1-F6 bindings selectable + - Activate and learn to use the *Alternate F1-F6 bindings* selectable on the *Settings | General* tab. - Always log a QSO when you have received RRR, RR73, or 73 from a @@ -154,8 +154,8 @@ guidelines for contest logging with FT4, FT8, and MSK144: it will be copied. But be sure to watch for any indication that it was not copied, and then take appropriate action. For example, if you receive the Tx3 message (R plus contest exchange) again, and if - you have activated the alternate F1-F6 bindings, hit F4 to re-send - your RR73. + you have activated the *Alternate F1-F6 bindings*, hit *F4* to + re-send your RR73. [[COMP-CALL]] === Nonstandard Callsigns From c84aac0c6216c5fcb8799b1be767857ab5fa674b Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Tue, 18 Jan 2022 17:37:49 +0100 Subject: [PATCH 44/74] Correct a minor inconsistency --- Configuration.ui | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Configuration.ui b/Configuration.ui index c64160476..c538b0be6 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -17,7 +17,7 @@ - 6 + 0 @@ -3268,13 +3268,13 @@ Right click for insert and delete options. - - - - - + + + + + From 5c1b7a8d8f7006851792010eaed8d54bceb545fc Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Fri, 21 Jan 2022 16:45:48 +0100 Subject: [PATCH 45/74] Adjustments for correct highlighting of messages with 73 --- cty.dat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cty.dat b/cty.dat index 843e99b03..bdba2c705 100644 --- a/cty.dat +++ b/cty.dat @@ -2445,7 +2445,7 @@ Corsica: 15: 28: EU: 42.00: -9.00: -1.0: TK: Central African Republic: 36: 47: AF: 6.75: -20.33: -1.0: TL: TL; Republic of the Congo: 36: 52: AF: -1.02: -15.37: -1.0: TN: - TN; + TN0,TN1,TN2,TN3,TN4,TN5,TN6,TN7,TN8,TN9; Gabon: 36: 52: AF: -0.37: -11.73: -1.0: TR: TR; Chad: 36: 47: AF: 15.80: -18.17: -1.0: TT: @@ -3376,7 +3376,7 @@ Indonesia: 28: 51: OC: -7.30: -109.88: -7.0: YB: 8D8[54],8E8[54],8F8[54],8G8[54],8H8[54],8I8[54],YB8[54],YC8[54],YD8[54],YE8[54],YF8[54],YG8[54], YH8[54]; Iraq: 21: 39: AS: 33.92: -42.78: -3.0: YI: - HN,YI,=K4CY/M,=YI1IRQ/ND; + HN0,HN1,HN2,HN3,HN4,HN5,HN6,HN7,HN8,HN9,YI,=K4CY/M,=YI1IRQ/ND; Vanuatu: 32: 56: OC: -17.67: -168.38: -11.0: YJ: YJ; Syria: 20: 39: AS: 35.38: -38.20: -2.0: YK: From 5c09e55351c9efdb198f77afbe3f38a24237294e Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Fri, 21 Jan 2022 16:49:03 +0100 Subject: [PATCH 46/74] Correct highlighting of messages with myCall and 73 --- widgets/displaytext.cpp | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/widgets/displaytext.cpp b/widgets/displaytext.cpp index d588573a9..c3e31f83c 100644 --- a/widgets/displaytext.cpp +++ b/widgets/displaytext.cpp @@ -414,19 +414,6 @@ void DisplayText::displayDecodedText(DecodedText const& decodedText, QString con else { if (bCQonly) return; - if (myCall.size ()) - { - QString regexp {"[ <]" + myCall + "[ >]"}; - if (Radio::is_compound_callsign (myCall)) - { - regexp = "(?:" + regexp + "|[ <]" + Radio::base_callsign (myCall) + "[ >])"; - } - if ((decodedText.clean_string () + " ").contains (QRegularExpression {regexp})) - { - highlight_types types {Highlight::MyCall}; - set_colours (m_config, &bg, &fg, types); - } - } } auto message = decodedText.string(); QString dxCall; @@ -473,6 +460,20 @@ void DisplayText::displayDecodedText(DecodedText const& decodedText, QString con message = leftJustifyAppendage (message, extra); } + if (myCall.size ()) + { + QString regexp {"[ <]" + myCall + "[ >]"}; + if (Radio::is_compound_callsign (myCall)) + { + regexp = "(?:" + regexp + "|[ <]" + Radio::base_callsign (myCall) + "[ >])"; + } + if ((decodedText.clean_string () + " ").contains (QRegularExpression {regexp})) + { + highlight_types types {Highlight::MyCall}; + set_colours (m_config, &bg, &fg, types); + } + } + appendText (message.trimmed (), bg, fg, decodedText.call (), dxCall); } From 194ad5c7b4b6e0d38a375273e562dc49aaba6a8a Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Sat, 22 Jan 2022 09:43:15 +0100 Subject: [PATCH 47/74] Fix the dropped audio problems on Windows --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index a92e1c359..39e7674f2 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1320,7 +1320,7 @@ void MainWindow::readSettings() // use these initialisation settings to tune the audio o/p buffer // size and audio thread priority m_settings->beginGroup ("Tune"); - m_audioThreadPriority = static_cast (m_settings->value ("Audio/ThreadPriority", QThread::HighPriority).toInt () % 8); + m_audioThreadPriority = static_cast (m_settings->value ("Audio/ThreadPriority", QThread::HighPriority).toInt ()); m_settings->endGroup (); checkMSK144ContestType(); From fde103da2de2497edf34c81d1a2b66444094586e Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Sun, 23 Jan 2022 09:14:39 +0100 Subject: [PATCH 48/74] Revert "Fix the dropped audio problems on Windows" This reverts commit 194ad5c7b4b6e0d38a375273e562dc49aaba6a8a. --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 39e7674f2..a92e1c359 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1320,7 +1320,7 @@ void MainWindow::readSettings() // use these initialisation settings to tune the audio o/p buffer // size and audio thread priority m_settings->beginGroup ("Tune"); - m_audioThreadPriority = static_cast (m_settings->value ("Audio/ThreadPriority", QThread::HighPriority).toInt ()); + m_audioThreadPriority = static_cast (m_settings->value ("Audio/ThreadPriority", QThread::HighPriority).toInt () % 8); m_settings->endGroup (); checkMSK144ContestType(); From 8545cdb96d24c51f142ce4421fba6d26348d1de2 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Sun, 23 Jan 2022 09:19:28 +0100 Subject: [PATCH 49/74] Change QThread from HighPriority to TimeCriticalPriority --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index a92e1c359..755458bcc 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1320,7 +1320,7 @@ void MainWindow::readSettings() // use these initialisation settings to tune the audio o/p buffer // size and audio thread priority m_settings->beginGroup ("Tune"); - m_audioThreadPriority = static_cast (m_settings->value ("Audio/ThreadPriority", QThread::HighPriority).toInt () % 8); + m_audioThreadPriority = static_cast (m_settings->value ("Audio/ThreadPriority", QThread::TimeCriticalPriority).toInt () % 8); m_settings->endGroup (); checkMSK144ContestType(); From 35df81a8588a376acb6c8768f024cd57b98ae0a0 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 24 Jan 2022 17:48:58 +0100 Subject: [PATCH 50/74] Revert "Prevent self spotting when running multiple instances" This reverts commit 96974e0537667d88feb87c66c9455ca64a78987c. --- widgets/mainwindow.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 755458bcc..55482f613 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3732,8 +3732,7 @@ void MainWindow::auto_sequence (DecodedText const& message, unsigned start_toler void MainWindow::pskPost (DecodedText const& decodedtext) { - if (m_diskData || !m_config.spot_to_psk_reporter() || decodedtext.isLowConfidence () - || (decodedtext.string().contains(m_baseCall) && dec_data.params.mygrid)) return; // prevent self spotting when running multiple instances + if (m_diskData || !m_config.spot_to_psk_reporter() || decodedtext.isLowConfidence ()) return; QString msgmode=m_mode; QString deCall; From 0309b4f82648b98fec9fee378370c911c92dec89 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 24 Jan 2022 17:50:43 +0100 Subject: [PATCH 51/74] Prevent self-spotting when running multiple instances --- widgets/mainwindow.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 55482f613..9dc01add2 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3732,7 +3732,8 @@ void MainWindow::auto_sequence (DecodedText const& message, unsigned start_toler void MainWindow::pskPost (DecodedText const& decodedtext) { - if (m_diskData || !m_config.spot_to_psk_reporter() || decodedtext.isLowConfidence ()) return; + if (m_diskData || !m_config.spot_to_psk_reporter() || decodedtext.isLowConfidence () + || (decodedtext.string().contains(m_baseCall) && decodedtext.string().contains(m_config.my_grid().left(4)))) return; // prevent self-spotting when running multiple instances QString msgmode=m_mode; QString deCall; From 1ff74b2cd5f4fe80761c9012492a4761f9006055 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 24 Jan 2022 20:17:48 +0100 Subject: [PATCH 52/74] Allow auto reply for non-CQ messages when Hold Tx Freq is enabled --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 9dc01add2..74fc157a2 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -7844,7 +7844,7 @@ void MainWindow::replyToCQ (QTime time, qint32 snr, float delta_time, quint32 de showNormal (); raise (); } - if (text.contains (QRegularExpression {R"(^(CQ |CQDX |QRZ ))"})) { + if ((text.contains (QRegularExpression {R"(^(CQ |CQDX |QRZ ))"})) || (ui->cbHoldTxFreq->isChecked ())) { // a message we are willing to accept and auto reply to m_bDoubleClicked = true; } From 9c5813586882d151b4d0718059820163fcf683ef Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 26 Jan 2022 09:57:38 -0500 Subject: [PATCH 53/74] Add Russian translation for user interface. Thanks to Victor Kosobokov, R3BB. --- translations/wsjtx_ru.ts | 6695 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 6695 insertions(+) create mode 100644 translations/wsjtx_ru.ts diff --git a/translations/wsjtx_ru.ts b/translations/wsjtx_ru.ts new file mode 100644 index 000000000..df9cbd246 --- /dev/null +++ b/translations/wsjtx_ru.ts @@ -0,0 +1,6695 @@ + + + + + AbstractLogWindow + + + &Delete ... + Удалить... + + + + AbstractLogWindow::impl + + + Confirm Delete + Подтвердить удаление + + + + Are you sure you want to delete the %n selected QSO(s) from the log? + + Вы уверены , что хотите удалить %n выбранные QSO из лога ? + Вы уверены , что хотите удалить %n выбранные QSO из лога ? + Вы уверены , что хотите удалить %n выбранные QSO из лога ? + + + + + Astro + + + + Doppler tracking + Отслеживание Доплера + + + + <html><head/><body><p>One station does all Doppler shift correction, their QSO partner receives and transmits on the sked frequency.</p><p>If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.</p></body></html> + <html><head/><body><p>Одна станция выполняет всю коррекцию доплеровского сдвига, ее партнер по QSO принимает и передает на запрашиваемой частоте.</p><p>Если трансивер не принимает команды CAT QSY во время передачи одна коррекция применяется ко всему периоду передачи.</p></body></html> + + + + Full Doppler to DX Grid + Полный Доплер для DX локатора + + + + <html><head/><body><p>Transmit takes place on sked frequency and receive frequency is corrected for own echoes. </p><p>This mode can be used for calling CQ, or when using Echo mode.</p></body></html> + +<html><head/><body><p>Передача происходит на частоте скеда, а частота приема корректируется с учетом собственных эхо-сигналов. </p><p>Этот режим можно использовать для CQ или при использовании режима Echo.</p></body></html> + + + + Own Echo + Свое эхо + + + + <html><head/><body><p>Both stations correct for Doppler shift such that they would be heard on the moon at the sked frequency.</p><p>If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.</p><p>Use this option also for Echo mode.</p></body></html> + <html><head/><body><p>Обе станции корректируют доплеровский сдвиг таким образом, чтобы их можно было услышать на Луне на заданной частоте.</p><p>Если трансивер не принимает команды CAT QSY во время при передаче одна коррекция применяется ко всему периоду передачи.</p><p>Используйте эту опцию также для режима эха.</p></body></html> + + + + Constant frequency on Moon + Постоянная частота для Луны + + + + <html><head/><body><p>DX station announces their TX Freq, which is entered as the Sked Freq. Correction applied to RX and TX so you appear on the DX's station's own echo Freq.</p><p>If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.</p></body></html> + <html><head/><body><p>DX-станция объявляет свою частоту передачи, которая вводится как частота скеда. Корректировка применяется к RX и TX, поэтому вы появляется на собственной частоте эха станции DX.</p><p>Если трансивер не принимает команды CAT QSY во время передачи, применяется одна коррекция для всего периода передачи.</p> </тело></html> + + + + On DX Echo + Эхо DX + + + + <html><head/><body><p>Tune radio manually and select this mode to put your echo on the same frequency.</p><p>If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.</p></body></html> + <html><head/><body><p>Настройте радио вручную и выберите этот режим, чтобы ваше эхо было на той же частоте.</p><p>Если nhfycbdth не принимает команды CAT QSY при передаче одной поправки применяется на весь период передачи.</p></body></html> + + + + Call DX + Вызов DX + + + + <html><head/><body><p>No Doppler shift correction is applied. This may be used when the QSO partner does full Doppler correction to your grid square.</p></body></html> + <html><head/><body><p>Коррекция доплеровского сдвига не применяется. Это может быть использовано, когда партнер по QSO выполняет полную доплеровскую коррекцию вашего квадрата.</p></body></html> + + + + None + Нет + + + + Sked frequency + Частота скеда + + + + + 0 + + + + + Rx: + + + + + Tx: + + + + + <html><head/><body><p>Press and hold the CTRL key to adjust the sked frequency manually with the rig's VFO dial or enter frequency directly into the band entry field on the main window.</p></body></html> + <html><head/><body><p>Нажмите и удерживайте клавишу CTRL, чтобы отрегулировать частоту скеда вручную с помощью ручки VFO трансивера или введите частоту непосредственно в поле ввода диапазона в главном окне.</p></ тело></html> + + + + Astro Data + Астро данные + + + + Astronomical Data + Астрономические данные + + + + Doppler Tracking Error + Ошибка доплеровского слежения + + + + Split operating is required for Doppler tracking + Для доплеровского отслеживания требуется режим Split трансивера. + + + + Go to "Menu->File->Settings->Radio" to enable split operation + +Перейдите в «Меню->Файл->Настройки->Радио», чтобы включить режим Split. + + + + Bands + + + Band name + Диапазон + + + + Lower frequency limit + Нижняя граница частоты диапазона + + + + Upper frequency limit + Верхняя граница частоты диапазона + + + + Band + Диапазон + + + + Lower Limit + Нижний лимит + + + + Upper Limit + Верхний лимит + + + + CAboutDlg + + + About WSJT-X + О WSJT-X + + + + OK + + + + + CPlotter + + + &Set Rx && Tx Offset + Установить смещение Rx && Tx + + + + CabrilloLog + + + Freq(MHz) + + + + + Mode + + + + + Date & Time(UTC) + + + + + Call + + + + + Sent + + + + + Rcvd + + + + + Band + + + + + CabrilloLogWindow + + + Contest Log + + + + + <html><head/><body><p>Right-click here for available actions.</p></body></html> + <html><head/><body><p>Нажмите здесь правой кнопкой мыши, чтобы просмотреть доступные действия.</p></body></html> + + + + Right-click here for available actions. + Нажмите здесь правой кнопкой мыши, чтобы просмотреть доступные действия. + + + + CallsignDialog + + + Callsign + + + + + ColorHighlighting + + + + + + + + + + + + + + + + + + K1ABC + + + + + CQ in message + CQ в сообщении + + + + My Call in message + Мой позывной в сообщении + + + + Transmitted message + Передаваемое сообщение + + + + New DXCC + Новая DXCC + + + + New Grid + Новый локатор + + + + New DXCC on Band + Новая DXCC на диапазоне + + + + New Call + Новый позывной + + + + New Grid on Band + Новый локатор на диапазоне + + + + New Call on Band + Новый позывной на диапазоне + + + + Uploads to LotW + Загрузить в LotW + + + + New Continent + Новый континент + + + + New Continent on Band + Новый континет на диапазоне + + + + New CQ Zone + Новая CQ зона + + + + New CQ Zone on Band + Новая CQ зона на диапазоне + + + + New ITU Zone + Новая ITU зона + + + + New ITU Zone on Band + Новая ITU зона на диапазоне + + + + Configuration::impl + + + + + &Delete + Удалить + + + + + &Insert ... + Вставить ... + + + + Failed to create save directory + Ошибка создания папки для сохранения + + + + path: "%1% + путь: "%1% + + + + Failed to create samples directory + Не удалось создать папку примеров + + + + path: "%1" + путь: "%1" + + + + &Load ... + Загрузить ... + + + + &Save as ... + Сохранить как ... + + + + &Merge ... + Обьединить ... + + + + &Reset + Сброс + + + + Serial Port: + COM порт: + + + + Serial port used for CAT control + Com порт для управления CAT + + + + Network Server: + Сетевой сервер: + + + + Optional hostname and port of network service. +Leave blank for a sensible default on this machine. +Formats: + hostname:port + IPv4-address:port + [IPv6-address]:port + Опционально имя хоста и номер порта сервера. +Можно оставить поля пустыми чтобы использовать значения по умолчанию на этом компьютере. +Поддерживаемый формат: + имя_хоста:порт + IPv4-адрес:порт + [IPv6-адрес]:порт + + + + USB Device: + USB устройство: + + + + Optional device identification. +Leave blank for a sensible default for the rig. +Format: + [VID[:PID[:VENDOR[:PRODUCT]]]] + Опциональная идентификация устройства. +Оставьте пустым для использования значения по умолчанию для трансивера. +Формат: + [VID[:PID[:VENDOR[:PRODUCT]]]] + + + + + Invalid audio input device + Некорректный выбор звуковой карты для входа + + + + Invalid audio output device + Некорректный выбор звуковой карты для выхода + + + + Invalid PTT method + Некорректный метод PTT + + + + Invalid PTT port + Некорректный PTT порт + + + + + Invalid Contest Exchange + Некорректный контрольный номер + + + + You must input a valid ARRL Field Day exchange + Вы должны проводить обмен в соответствии с ARRL Field Day + + + + You must input a valid ARRL RTTY Roundup exchange + + + + + Pending DNS lookup, please try again later + Ожидается поиск DNS. Повторите попытку позже. + + + + Reset Decode Highlighting + Сбросить подсветку декодирования + + + + Reset all decode highlighting and priorities to default values + Сбросить всю подсветку и приоритеты декодирования на значения по умолчанию + + + + WSJT-X Decoded Text Font Chooser + Выбор шрифта декодированного текста WSJT-X + + + + UDP server DNS lookup failed + Ошибка DNS-запроса UDP-сервера + + + + MAC-ambiguous multicast groups addresses not supported + Адреса групп многоадресной рассылки с неоднозначным MAC-адресом не поддерживаются + + + + Load Working Frequencies + Загрузить рабочие частоты + + + + + + Frequency files (*.qrg);;All files (*.*) + Файл частот (*.qrg);;All files (*.*) + + + + Replace Working Frequencies + Заменить рабочие частоты + + + + Are you sure you want to discard your current working frequencies and replace them with the loaded ones? + Вы уверены, что хотите сбросить текущие рабочие частоты и заменить их загруженными? + + + + Merge Working Frequencies + Обьединить рабочие частоты + + + + + + Not a valid frequencies file + Некорректный файл частот + + + + Incorrect file magic + Неправильный формат файла + + + + Version is too new + Версия в отработке + + + + Contents corrupt + Контент обрезан + + + + Save Working Frequencies + Сохранить рабочие частоты + + + + Only Save Selected Working Frequencies + Сохранить только выбранные рабочие частоты + + + + Are you sure you want to save only the working frequencies that are currently selected? Click No to save all. + Вы уверены, что хотите сохранить только рабочие частоты, которые выбраны в данный момент? Нажмите Нет, чтобы сохранить все. + + + + Reset Working Frequencies + Сброс рабочих частот + + + + Are you sure you want to discard your current working frequencies and replace them with default ones? + Вы уверены, что хотите сбросить текущие рабочие частоты и заменить их значениями по умолчанию? + + + + Save Directory + Сохранить папку + + + + AzEl Directory + Папка AzEl + + + + Rig control error + Ошибка управления трансивером + + + + Failed to open connection to rig + Ошибка подключения к трансиверу + + + + Rig failure + Трансивер не отвечает + + + + Not found + audio device missing + отсутствует аудиоустройство + Не найден + + + + DXLabSuiteCommanderTransceiver + + + Failed to connect to DX Lab Suite Commander + + Не удалось подключиться к DX Lab Suite Commander + + + + DX Lab Suite Commander didn't respond correctly reading frequency: + DX Lab Suite Commander неправильно't реагирует на считанную частоту: + + + + DX Lab Suite Commander sent an unrecognised TX state: + DX Lab Suite Commander отправил нераспознанное состояние TX: + + + + DX Lab Suite Commander didn't respond correctly polling TX status: + DX Lab Suite Commander не ответил't правильно, опрашивая статус TX: + + + + DX Lab Suite Commander rig did not respond to PTT: + Настройка DX Lab Suite Commander не отвечает на PTT: + + + + DX Lab Suite Commander didn't respond correctly polling frequency: + DX Lab Suite Commander не отвечал't правильно на частоту опроса: + + + + DX Lab Suite Commander didn't respond correctly polling TX frequency: + + + + + DX Lab Suite Commander sent an unrecognised split state: + DX Lab Suite Commander отправил нераспознанное состояние режима Split: + + + + DX Lab Suite Commander didn't respond correctly polling split status: + DX Lab Suite Commander не отвечал правильно, опрашивая статус split: + + + + DX Lab Suite Commander sent an unrecognised mode: " + DX Lab Suite Commander отправил нераспознанный режим: " + + + + DX Lab Suite Commander didn't respond correctly polling mode: + DX Lab Suite Commander не ответил правильно в режиме опроса: + + + + DX Lab Suite Commander send command failed + + Команда из DX Lab Suite Commander не выполнена + + + + DX Lab Suite Commander send command failed "%1": %2 + + DX Lab Suite Commander не смог отправить команду "%1": %2 + + + + DX Lab Suite Commander send command "%1" read reply failed: %2 + + На команду из DX Lab Suite Commander "%1" не удалось получить ответ:%2 + + + + DX Lab Suite Commander retries exhausted sending command "%1" + DX Lab Suite Commander повторяет выданную команду "%1" + + + + DX Lab Suite Commander sent an unrecognized frequency + DX Lab Suite Commander отправил некорректную частоту + + + + DecodeHighlightingListView + + + &Foreground color ... + Цвет переднего плана... + + + + Choose %1 Foreground Color + Выберите %1 цвет переднего плана + + + + &Unset foreground color + Отменить основной цвет + + + + &Background color ... + Фоновый цвет ... + + + + Choose %1 Background Color + Выберите %1 фоновый цвет + + + + U&nset background color + Отмена фонового цвета + + + + &Reset this item to defaults + Сбросить значения по умолчанию + + + + DecodeHighlightingModel + + + CQ in message + CQ в сообщении + + + + My Call in message + Мой позывной в сообщении + + + + Transmitted message + Передаваемое сообщение + + + + New DXCC + Новая DXCC + + + + New DXCC on Band + Новая DXCC на диапазоне. + + + + New Grid + Новый локатор + + + + New Grid on Band + Новый локатор на диапаазоне + + + + New Call + Новый позывной + + + + New Call on Band + Новый позывной на диапазоне + + + + New Continent + Новый континент + + + + New Continent on Band + Новый континент на диапазоне + + + + New CQ Zone + Новая CQ зона + + + + New CQ Zone on Band + Новая CQ зона на диапазоне + + + + New ITU Zone + Новая ITU зона + + + + New ITU Zone on Band + Новая ITU зона на диапазоне + + + + LoTW User + Пользователь LotW + + + + f/g unset + + + + + b/g unset + + + + + Highlight Type + Тип выделения + + + + Designer + + + &Delete + Удалить + + + + &Insert ... + Вставить ... + + + + Insert &after ... + Вставить после... + + + + Import Palette + Импорт палитры + + + + + Palettes (*.pal) + Палитра (*.pal) + + + + Export Palette + Экспорт палитры + + + + Dialog + + + Gray time: + + + + + Directory + + + File + + + + + Progress + + + + + + URL Error + Ошибка URL + + + + + Invalid URL: +"%1" + Ошибочный URL: +"%1" + + + + + + + + + + JSON Error + Ошибка JSON + + + + Contents file syntax error %1 at character offset %2 + Синтаксическая ошибка %1 файла контента при смещении символа %2 + + + + Contents file top level must be a JSON array + Верхний уровень файла контента должен быть массивом JSON + + + + File System Error + Ошибка файловой системы + + + + Failed to open "%1" +Error: %2 - %3 + Не удалось открыть "%1" +Ошибка: %2 - %3 + + + + Contents entries must be a JSON array + Записи контента должны быть массивом JSON + + + + Contents entries must have a valid type + Записи контента должны иметь допустимый тип + + + + Contents entries must have a valid name + Содержание записей должно иметь правильное имя + + + + Contents entries must be JSON objects + Записи контента должны быть объектами JSON + + + + Contents directories must be relative and within "%1" + Папки контента должны быть относительными и находиться в пределах "%1" + + + + Network Error + Ошибка сети + + + + Authentication required + Необходима аутентификация + + + + DisplayText + + + &Erase + Очистить + + + + EchoGraph + + + + Echo Graph + Эхо-график + + + + <html><head/><body><p>Compression factor for frequency scale</p></body></html> + <html><head/><body><p>Коэффициент сжатия для частотной шкалы</p></body></html> + + + + Bins/Pixel + + + + + Gain + Яркость + + + + <html><head/><body><p>Echo spectrum gain</p></body></html> + <html><head/><body><p>Яркость спектра эхо-сигнала</p></body></html> + + + + Zero + Ноль + + + + <html><head/><body><p>Echo spectrum zero</p></body></html> + <html><head/><body><p>Ноль эхоспектра</p></body></html> + + + + <html><head/><body><p>Smoothing of echo spectrum</p></body></html> + <html><head/><body><p>Сглаживание спектра эха</p></body></html> + + + + Smooth + Сглаживание + + + + <html><head/><body><p>Number of echo transmissions averaged</p></body></html> + +<html><head/><body><p>Усредненное количество передач эха</p></body></html> + + + + N: 0 + + + + + <html><head/><body><p>Click to cycle through a sequence of colors and line widths.</p></body></html> + +<html><head/><body><p>Нажмите, чтобы просмотреть последовательность цветов и толщины линий.</p></body></html> + + + + Colors + Цвета + + + + EmulateSplitTransceiver + + + Emulated split mode requires rig to be in simplex mode + Эмуляция режима split требует, чтобы трансивер был в симплексном режиме. + + + + EqualizationToolsDialog::impl + + + Equalization Tools + Инструменты эквалайзера + + + + Phase + Фаза + + + + + Freq (Hz) + Частота (Гц) + + + + Phase (Π) + Фаза (Π) + + + + Delay (ms) + Задержка (мс) + + + + Measured + Измерено + + + + Proposed + Предложенный + + + + Current + Текущий + + + + Group Delay + Групповая задержка + + + + Amplitude + Амплитуда + + + + Relative Power (dB) + Относительная мощность (дБ) + + + + Reference + Ссылка + + + + Phase ... + Фаза ... + + + + Refresh + Обнловить + + + + Discard Measured + Отменить измеренное + + + + ExistingNameDialog + + + Configuration to Clone From + Конфигурация для клонирования + + + + &Source Configuration Name: + Имя исходной конфигурации: + + + + ExportCabrillo + + + Dialog + + + + + Location: + + + + + SNJ + + + + + Contest: + + + + + ARRL-RTTY + + + + + Callsign: + + + + + Category-Operator: + + + + + SINGLE-OP + + + + + Category-Transmitter: + + + + + ONE + + + + + Category-Power: + + + + + LOW + + + + + Category-Assisted: + + + + + NON-ASSISTED + + + + + Category-Band: + + + + + ALL + + + + + Claimed-Score: + + + + + Operators: + + + + + Club: + + + + + Name: + + + + + + Address: + + + + + Save Log File + + + + + Cabrillo Log (*.cbr) + + + + + Cannot open "%1" for writing: %2 + + + + + Export Cabrillo File Error + + + + + FastGraph + + + + Fast Graph + Быстрый график + + + + Waterfall gain + Яркость водопада + + + + Waterfall zero + Контрастность водопада + + + + Spectrum zero + Ноль спектра + + + + <html><head/><body><p>Set reasonable levels for gain and zero sliders.</p></body></html> + <html><head/><body><p>Установите разумные уровни для ползунков яркости и контрастности.</p></body></html> + + + + Auto Level + Автоматический уровень + + + + FoxLog::impl + + + Date & Time(UTC) + + + + + Call + + + + + Grid + + + + + Sent + + + + + Rcvd + + + + + Band + + + + + FoxLogWindow + + + Fox Log + Fox лог + + + + <html><head/><body><p>Right-click here for available actions.</p></body></html> + <html><head/><body><p>Нажмите здесь правой кнопкой мыши, чтобы просмотреть доступные действия.</p></body></html> + + + + Callers: + Вызовы: + + + + + + N + + + + + In progress: + Ход выполнения + + + + Rate: + Темп + + + + &Export ADIF ... + Экспорт ADIF ... + + + + Export ADIF Log File + Экспорт лога в ADIF файл + + + + ADIF Log (*.adi) + ADIF лог (*.adi) + + + + Export ADIF File Error + Ошибка экспорта файла ADIF + + + + Cannot open "%1" for writing: %2 + Невозможно открыть "%1" для записи: %2 + + + + &Reset ... + Сброс ... + + + + Confirm Reset + Подтвердите сброс + + + + Are you sure you want to erase file FoxQSO.txt and start a new Fox log? + Вы уверены, что хотите удалиить файл FoxQSO.txt и начать новый лог Fox? + + + + FrequencyDialog + + + Add Frequency + Добавить частоту + + + + IARU &Region: + IARU регион + + + + &Mode: + Вид + + + + &Frequency (MHz): + Частота (МГц) + + + + FrequencyList_v2 + + + + IARU Region + IARU регион + + + + + Mode + Вид + + + + + Frequency + Частота + + + + + Frequency (MHz) + Частота (МГц) + + + + HRDTransceiver + + + + Failed to connect to Ham Radio Deluxe + + Не удалось подключиться к Ham Radio Deluxe + + + + Failed to open file "%1": %2. + Не удалось открыть файл "%1": %2. + + + + + Ham Radio Deluxe: no rig found + Ham Radio Deluxe: трансивер не обнаружен + + + + Ham Radio Deluxe: rig doesn't support mode + Ham Radio Deluxe: трансивер не поддерживает't режим + + + + Ham Radio Deluxe: sent an unrecognised mode + Ham Radio Deluxe: отправил неизвестный режим + + + + Ham Radio Deluxe: item not found in %1 dropdown list + Ham Radio Deluxe: элемент не найден в выпадающем списке %1 + + + + Ham Radio Deluxe: button not available + Ham Radio Deluxe: кнопка недоступна + + + + Ham Radio Deluxe didn't respond as expected + Ham Radio Deluxe некорректно ответил + + + + Ham Radio Deluxe: rig has disappeared or changed + Ham Radio Deluxe: трансивер выключен или изменился + + + + Ham Radio Deluxe send command "%1" failed %2 + + Ham Radio Deluxe отправить команду "%1" не удалось %2 + + + + + + Ham Radio Deluxe: failed to write command "%1" + Ham Radio Deluxe: не удалось записать команду "%1" + + + + Ham Radio Deluxe sent an invalid reply to our command "%1" + Ham Radio Deluxe отправил неверный ответ на команду "%1" + + + + Ham Radio Deluxe failed to reply to command "%1" %2 + + Ham Radio Deluxe не ответил на команду "%1" %2 + + + + Ham Radio Deluxe retries exhausted sending command "%1" + Ham Radio Deluxe повторяет выданную команду "%1" + + + + Ham Radio Deluxe didn't respond to command "%1" as expected + Ham Radio Deluxe не отвечает на команду "%1" как и ожидалось + + + + HamlibTransceiver + + + + Hamlib initialisation error + Ошибка инициализации Hamlib + + + + Hamlib settings file error: %1 at character offset %2 + Ошибка файла настроек Hamlib : %1 со смещением символа %2 + + + + Hamlib settings file error: top level must be a JSON object + +Ошибка файла настроек Hamlib: верхний уровень должен быть объектом JSON + + + + Hamlib settings file error: config must be a JSON object + Ошибка файла настроек Hamlib: config должен быть объектом JSON + + + + Unsupported CAT type + Не поддердерживаемый тип CAT + + + + Hamlib error: %1 while %2 + Ошибка Hamlib %1 while %2 + + + + opening connection to rig + текущее соединение с трансивером + + + + getting current frequency + получение текущей частоты + + + + getting current mode + получение текущего режима + + + + + exchanging VFOs + обмен VFOs + + + + + getting other VFO frequency + получение частоты другого VFO + + + + getting other VFO mode + Получение режима другого VFO + + + + + setting current VFO + установка текущего VFO + + + + getting frequency + получение частоты + + + + getting mode + получение режима + + + + + + getting current VFO + выбор текущего VFO + + + + + + + getting current VFO frequency + получение частоты текущего VFO + + + + + + + + + setting frequency + установка частоты + + + + + + + getting current VFO mode + получение режима текущего VFO + + + + + + + + setting current VFO mode + установка тежима текущего VFO + + + + + setting/unsetting split mode + установить/снять режим split + + + + + setting split mode + установить режим split + + + + setting split TX frequency and mode + установка split для частоты и режима TX + + + + setting split TX frequency + установка split для частоты TX + + + + getting split TX VFO mode + получение режима split TX VFO + + + + setting split TX VFO mode + установка режима split TX VFO + + + + getting PTT state + получение статуса PTT + + + + setting PTT on + активирование PTT + + + + setting PTT off + деактивация PTT + + + + setting a configuration item + настройка элементов конфигурации + + + + getting a configuration item + считывание элементов конфигурации + + + + IARURegions + + + All + Все + + + + Region 1 + Регион 1 + + + + Region 2 + Регион 2 + + + + Region 3 + Регион 3 + + + + + IARU Region + IARU регион + + + + LogQSO + + + Click OK to confirm the following QSO: + Нажмите OK, чтобы подтвердить следующее QSO: + + + + Call + Позывной + + + + Start + Начало + + + + + dd/MM/yyyy HH:mm:ss + + + + + End + Окончание + + + + Mode + Вид + + + + Band + Диапазон + + + + Rpt Sent + + + + + Rpt Rcvd + + + + + Grid + Локатор + + + + Name + Имя + + + + Tx power + Мощность передатчика + + + + + + Retain + Сохранить + + + + Comments + Комментарии + + + + Operator + Оператор + + + + Exch sent + Обмен передан. + + + + Rcvd + Прин. + + + + Prop Mode + Опорный режим + + + + Aircraft scatter + Рассеивание самолетом + + + + Aurora-E + Аврора Е + + + + Aurora + Аврора + + + + Back scatter + Обратное рассеивание + + + + Echolink + Эхолинк + + + + Earth-moon-earth + Земля-Луна-Земля + + + + Sporadic E + Спорадик Е + + + + F2 Reflection + F2 Отражение + + + + Field aligned irregularities + выравнивание по полю + + + + Internet-assisted + с помощью Интернета + + + + Ionoscatter + ионорасферное рассеяние + + + + IRLP + + + + + Meteor scatter + Разброс метеоров + + + + Non-satellite repeater or transponder + Неспутниковый ретранслятор или транспондер + + + + Rain scatter + Рассеяние дождя + + + + Satellite + Спутник + + + + Trans-equatorial + Транс-экваториальный + + + + Troposheric ducting + Тропосферный воздуховод + + + + + Invalid QSO Data + Неверные данные QSO + + + + Check exchange sent and received + +Проверка отправленного и полученного обмена + + + + Check all fields + Проверить все поля + + + + Log file error + + + + + Cannot open "%1" for append + Не удается открыть "%1" для добавления + + + + Error: %1 + Ошибка: %1 + + + + LotWUsers::impl + + + Network Error - SSL/TLS support not installed, cannot fetch: +'%1' + Ошибка сети — поддержка SSL/TLS не установлена, не удается получить: +'%1' + + + + Network Error - Too many redirects: +'%1' + Ошибка сети — слишком много переадресаций: +'%1' + + + + Network Error: +%1 + Сетевая ошибка: +%1 + + + + File System Error - Cannot commit changes to: +"%1" + Ошибка файловой системы — не удается зафиксировать изменения в: +"%1" + + + + File System Error - Cannot open file: +"%1" +Error(%2): %3 + Ошибка файловой системы - Не удается открыть файл: +"%1" +Ошибка(%2): %3 + + + + File System Error - Cannot write to file: +"%1" +Error(%2): %3 + Ошибка файловой системы - Не удается записать в файл: +"%1" +Ошибка(%2): %3 + + + + MainWindow + + + WSJT-X by K1JT + + + + + + + + + + + Band Activity + Декодирование в полосе обзора + + + + + UTC dB DT Freq Dr + + + + + + + + + + Rx Frequency + Декодировавние на частоте RX + + + + CQ only + Только CQ + + + + Enter this QSO in log + QSO в лог + + + + Log &QSO + QSO в лог + + + + Stop monitoring + Останов декодирования + + + + &Stop + Стоп + + + + Toggle monitoring On/Off + Вкючение/Выключение декодирования + + + + &Monitor + Монитор + + + + <html><head/><body><p>Erase right window. Double-click to erase both windows.</p></body></html> + <html><head/><body><p>Очистка правого окна.Двойной клик очистка правого и левого окна.</p></body></html> + + + + Erase right window. Double-click to erase both windows. + Очистка правого окна.Двойной клик очистка правого и левого окна + + + + &Erase + Очистка + + + + <html><head/><body><p>Clear the accumulating message average.</p></body></html> + Очистка накопленного среднего числа сообщений + <html><head/><body><p>Очистка накопленного среднего числа сообщений.</p></body></html> + + + + Clear the accumulating message average. + Очистка накопленного среднего числа сообщений + + + + Clear Avg + Очистить AVG + + + + <html><head/><body><p>Decode most recent Rx period at QSO Frequency</p></body></html> + Повторно декодирует последний RX период или последний воспроизводимый звуковой файл (wav). + <html><head/><body><p>Декодировать последний период на частоте QSO.</p></body></html> + + + + Decode most recent Rx period at QSO Frequency + Декодировать последний период на частоте QSO. + + + + &Decode + Декод. + + + + <html><head/><body><p>Toggle Auto-Tx On/Off</p></body></html> + Включить/Отключить разрешение на автопередачу + + + + Toggle Auto-Tx On/Off + Включить/Отключить разрешение на автопередачу + + + + E&nable Tx + Разреш. TX + + + + Stop transmitting immediately + Немедленный останов TX + + + + &Halt Tx + Стоп TX + + + + <html><head/><body><p>Toggle a pure Tx tone On/Off</p></body></html> + Передача тона для Настройки + <html><head/><body><p>Вкл/Выкл передачи тона для Настройки</p></body></html> + + + + Toggle a pure Tx tone On/Off + Вкл/Выкл передачи тона для Настройки + + + + &Tune + &Настройка + + + + Menus + Меню + + + + Decode other Hounds calling above 1000 Hz audio offset + Декодировать другие гончие, вызывающие по звуку выше 1000 Гц + + + + Enable auto response to the first decode from a new DXCC or new call on the current band. + Разрешить автоматический ответ на первое декодирование от нового DXCC или нового вызова на текущем диапазоне. + + + + F High + + + + + F Low + + + + + 1/2 + + + + + 2/2 + + + + + 1/3 + + + + + 2/3 + + + + + 3/3 + + + + + 1/4 + + + + + 2/4 + + + + + 3/4 + + + + + 4/4 + + + + + 1/5 + + + + + 2/5 + + + + + 3/5 + + + + + 4/5 + + + + + 5/5 + + + + + 1/6 + + + + + 2/6 + + + + + 3/6 + + + + + 4/6 + + + + + 5/6 + + + + + 6/6 + + + + + Percentage of minute sequences devoted to transmitting. + Процент минутных интервалов, посвященных передаче. + + + + Prefer Type 1 messages + Выбор сообщения типа 1 + + + + <html><head/><body><p>Transmit during the next sequence.</p></body></html> + <html><head/><body><p>Передать во время следующего интервала .</p></body></html> + + + + Q65 + + + + + SWL Mode + + + + + Hide lower panel controls to maximize deocde windows + Скрыть элементы управления нижней панели, чтобы максимизировать окно декодирования. + + + + USB dial frequency + Отображение частоты трансивера в режиме USB + + + + 14.078 000 + + + + + <html><head/><body><p>30dB recommended when only noise present<br/>Green when good<br/>Red when clipping may occur<br/>Yellow when too low</p></body></html> + +<html><head/><body><p> рекомендуется 30 дБ, если присутствует только шум<br/>Зеленый, если все хорошо<br/>Красный, если может возникнуть перегрузка <br/>Желтый, если слишком низкий уровень</p></body ></html> + + + + Rx Signal + + + + + 30dB recommended when only noise present +Green when good +Red when clipping may occur +Yellow when too low + 30 дБ рекомендуется, когда присутствует только шум +Зеленый, когда хорошо +Красный, когда может произойти перегрузка +Желтый, когда слишком низкий + + + + DX Call + Позывной DX + + + + DX Grid + QTH Локатор + + + + Callsign of station to be worked + Позывной корреспондента + + + + Search for callsign in database + Поиск позывного в базе данных + + + + &Lookup + Поиск + + + + Locator of station to be worked + QTH локатор корреспондента + + + + Az: 251 16553 km + + + + + Add callsign and locator to database + Добавить позывной и QTH квадрат в базе данных. + + + + Add + Добавить + + + + Pwr + Мощн. + + + + <html><head/><body><p>If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode.</p></body></html> + <html><head/><body><p>Если кружок отображается оранжевым или красным цветом - не работает CAT управление.Попробуйте синхронизировать управление трансивером нажав кнопкой мыши на кружке, проверьте корректность подключения трансивера к компьютеру,установки в трансивере, выполните заново настройку CAT в WSJT-X.</p></body></html> + + + + If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode. + Если кружок отображается оранжевым или красным цветом - не работает CAT управление. Попробуйте синхронизировать управление трансивером нажав кнопкой мыши на кружке, проверьте корректность подключения трансивера к компьютеру,установки в трансивере, выполните заново настройку CAT в JTDX. + + + + ? + + + + + Adjust Tx audio level + Регулировка уровня звука на передачу + + + + <html><head/><body><p>Select operating band or enter frequency in MHz or enter kHz increment followed by k.</p></body></html> + <html><head/><body><p>Выберите диапазон или введите частоту в МГц или введите приращение в кГц, после чего нажмите k.</p></body></html> + + + + Frequency entry + + + + + Select operating band or enter frequency in MHz or enter kHz increment followed by k. + Выбор рабочего диапазона или частоты в МГц + + + + <html><head/><body><p align="center"> 2015 Jun 17 </p><p align="center"> 01:23:45 </p></body></html> + + + + + <html><head/><body><p>Check to keep Tx frequency fixed when double-clicking on decoded text.</p></body></html> + <html><head/><body><p>Установите этот флажок, чтобы при двойном щелчке по декодированному тексту частота Tx оставалась фиксированной.</p></body></html> + + + + Check to keep Tx frequency fixed when double-clicking on decoded text. + Установите флажок, чтобы частота Tx оставалась фиксированной при двойном щелчке по декодированному тексту. + + + + Hold Tx Freq + Удерживать частоту передачи + + + + Audio Rx frequency + Звуковая частота приема + + + + + + + + Hz + Гц + + + + + Rx + + + + + + Set Tx frequency to Rx Frequency + установить частоту передачи равной частоте приема + + + + ▲ + + + + + Frequency tolerance (Hz) + Допуск по частоте (Гц) + + + + + F Tol + + + + + + Set Rx frequency to Tx Frequency + установить частоту приема равной частоте передачи + + + + ▼ + + + + + <html><head/><body><p>Synchronizing threshold. Lower numbers accept weaker sync signals.</p></body></html> + <html><head/><body><p>Порог синхронизации. Меньшие числа принимают более слабые сигналы синхронизации.</p></body></html> + + + + Synchronizing threshold. Lower numbers accept weaker sync signals. + Порог синхронизации. Меньшие числа принимают более слабые сигналы синхронизации. + + + + Sync + + + + + <html><head/><body><p>Check to use short-format messages.</p></body></html> + <html><head/><body><p>Отметьте, чтобы использовать короткие сообщения.</p></body></html + + + + Check to use short-format messages. + Отметьте, чтобы использовать короткие сообщения. + + + + Sh + + + + + <html><head/><body><p>Check to enable JT9 fast modes</p></body></html> + <html><head/><body><p>Отметьте, чтобы включить быстрые режимы JT9</p></body></html> + + + + Check to enable JT9 fast modes + Отметьте, чтобы включить быстрые режимы JT9 + + + + + Fast + Быстрый + + + + <html><head/><body><p>Check to enable automatic sequencing of Tx messages based on received messages.</p></body></html> + <html><head/><body><p>Отметьте, чтобы включить автоматическую последовательность Tx-сообщений на основе полученных сообщений.</p></body></html> + + + + Check to enable automatic sequencing of Tx messages based on received messages. + Отметьте, чтобы включить автоматическую последовательность Tx-сообщений на основе полученных сообщений. + + + + Auto Seq + АвтоВыбор + + + + <html><head/><body><p>Check to call the first decoded responder to my CQ.</p></body></html> + <html><head/><body><p>Отметьте для вызова первого декодированного корреспондента на мой CQ.</p></body></html> + + + + Check to call the first decoded responder to my CQ. + Отметьте для вызова первого декодированного корреспондента на мой CQ. + + + + Call 1st + + + + + Check to generate "@1250 (SEND MSGS)" in Tx6. + Отметьте, чтобы сгенерировать "@1250 (SEND MSGS)" в Tx6 + + + + Tx6 + + + + + <html><head/><body><p>Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences.</p></body></html> + <html><head/><body><p>Check to Tx через четные минуты или последовательности, начиная с 0; снимите флажок для нечетных последовательностей.</p></body></html> + + + + Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences. + +Проверка на Tx через четные минуты или последовательности, начиная с 0; снимите флажок для нечетных последовательностей. + + + + Tx even/1st + Tx четный/1-й + + + + <html><head/><body><p>Frequency to call CQ on in kHz above the current MHz</p></body></html> + <html><head/><body><p>Частота вызова CQ в кГц выше текущей частоты МГц</p></body></html> + + + + Frequency to call CQ on in kHz above the current MHz + +Частота для CQ в кГц выше текущей частоты МГц + + + + Tx CQ + + + + + <html><head/><body><p>Check this to call CQ on the &quot;Tx CQ&quot; frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on.</p><p>Not available to nonstandard callsign holders.</p></body></html> + <html><head/><body><p>Отметьте, чтобы вызывать CQ на &quot;Tx CQ&quot; частота. Rx будет на текущей частоте, а сообщение CQ будет включать текущую частоту Rx, чтобы вызывающие абоненты знали, на какой частоте отвечать.</p><p>Недоступно для владельцев нестандартных позывных.</p></body></ HTML + + + + Check this to call CQ on the "Tx CQ" frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on. +Not available to nonstandard callsign holders. + Установите этот флажок, чтобы вызвать CQ на частоте «Tx CQ». Rx будет на текущей частоте, а сообщение CQ будет включать текущую частоту Rx, чтобы вызывающие абоненты знали, на какой частоте отвечать. +Недоступно для владельцев нестандартных позывных. + + + + Rx All Freqs + Rx всех частот + + + + <html><head/><body><p>Submode determines tone spacing; A is narrowest.</p></body></html> + +<html><head/><body><p>Подрежим определяет расстояние между тонами; A — самое узкое.</p></body></html> + + + + Submode determines tone spacing; A is narrowest. + Подрежим определяет расстояние между тонами; А самый узкий. + + + + Submode + + + + + + Fox + + + + + <html><head/><body><p>Check to monitor Sh messages.</p></body></html> + <html><head/><body><p>Отметьте, чтобы отслеживать сообщения Sh.</p></body></html> + + + + Check to monitor Sh messages. + Отметьте, чтобы отслеживать сообщения Sh. + + + + SWL + + + + + Best S+P + + + + + <html><head/><body><p>Check this to start recording calibration data.<br/>While measuring calibration correction is disabled.<br/>When not checked you can view the calibration results.</p></body></html> + <html><head/><body><p>Установите этот флажок, чтобы начать запись данных калибровки.<br/>При измерении коррекция калибровки отключена.<br/>Если флажок не установлен, вы можете просматривать результаты калибровки.</p> + + + + Check this to start recording calibration data. +While measuring calibration correction is disabled. +When not checked you can view the calibration results. + Установите этот флажок, чтобы начать запись данных калибровки. +При измерении коррекция калибровки отключена. +Если флажок не установлен, вы можете просмотреть результаты калибровки. + + + + Measure + Измерение + + + + <html><head/><body><p>Signal report: Signal-to-noise ratio in 2500 Hz reference bandwidth (dB).</p></body></html> + <html><head/><body><p>Отчет о сигнале: отношение сигнал/шум в эталонной полосе пропускания 2 500 Гц (дБ).</p></body></html> + + + + Signal report: Signal-to-noise ratio in 2500 Hz reference bandwidth (dB). + Отчет о сигнале: отношение сигнал-шум в эталонной полосе пропускания 2500 Гц (дБ). + + + + Report + Рапорт + + + + <html><head/><body><p>Tx/Rx or Frequency calibration sequence length</p></body></html> + <html><head/><body><p>Длина последовательности калибровки Tx/Rx или частоты</p></body></html> + + + + Tx/Rx or Frequency calibration sequence length + Tx/Rx или длина последовательности калибровки частоты + + + + + s + с + + + + + T/R + + + + + Audio Tx frequency + Частота передачи по звуку. + + + + + Tx + + + + + Tx# + + + + + 1 + + + + + + + Send this message in next Tx interval + Передать это сообщение в следующем интервале передачи + + + + Ctrl+2 + + + + + <html><head/><body><p>Send this message in next Tx interval</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders)</p></body></html> + <html><head/><body><p>Отправить это сообщение в следующем интервале Tx</p><p>Дважды щелкните, чтобы переключить использование сообщения Tx1 для начала QSO со станцией (не разрешено для типа 1 держатели составных вызовов)</p></body></html> + + + + Send this message in next Tx interval +Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders) + Отправить это сообщение в следующем интервале Tx +Дважды щелкните, чтобы переключить использование сообщения Tx1 для начала QSO со станцией (не разрешено для составных вызовов типа 1) + + + + Ctrl+1 + + + + + + + + Switch to this Tx message NOW + Переключиться на это Tx-сообщение СЕЙЧАС + + + + Tx &2 + + + + + Alt+2 + + + + + <html><head/><body><p>Switch to this Tx message NOW</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders)</p></body></html> + <html><head/><body><p>Переключиться на это сообщение Tx СЕЙЧАС</p><p>Дважды щелкните, чтобы переключить использование сообщения Tx1 для начала QSO со станцией (не разрешено для соединения типа 1 держатели звонков)</p></body></html> + + + + Switch to this Tx message NOW +Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders) + Переключиться на это Tx-сообщение СЕЙЧАС +Дважды щелкните, чтобы переключить использование сообщения Tx1 для начала QSO со станцией (не разрешено для держателей составных вызовов типа 1) + + + + Tx &1 + + + + + Alt+1 + + + + + Ctrl+6 + + + + + <html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to reset to the standard 73 message</p></body></html> + <html><head/><body><p>Отправить это сообщение в следующем интервале Tx</p><p>Дважды щелкните, чтобы восстановить стандартное сообщение 73</p></body></html> + + + + Send this message in next Tx interval +Double-click to reset to the standard 73 message + Отправить это сообщение в следующем интервале Tx +Дважды щелкните, чтобы вернуться к стандартному сообщению 73. + + + + Ctrl+5 + + + + + Ctrl+3 + + + + + Tx &3 + + + + + Alt+3 + + + + + <html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type 2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html> + <html><head/><body><p>Отправить это сообщение в следующем интервале Tx</p><p>Дважды щелкните, чтобы переключиться между сообщениями RRR и RR73 в Tx4 (не разрешено для держателей составных вызовов типа 2)</p><p>Сообщения RR73 следует использовать только в том случае, если вы достаточно уверены, что повторение сообщений не потребуется</p></body></html> + + + + Send this message in next Tx interval +Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type 2 compound call holders) +RR73 messages should only be used when you are reasonably confident that no message repetitions will be required + Отправить это сообщение в следующем интервале Tx +Двойной щелчок для переключения между сообщениями RRR и RR73 в Tx4 (не разрешено для держателей составных вызовов типа 2) +Сообщения RR73 следует использовать только в том случае, если вы достаточно уверены, что повторение сообщений не потребуется. + + + + Ctrl+4 + + + + + <html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html> + <html><head/><body><p>Переключиться на это сообщение Tx СЕЙЧАС</p><p>Дважды щелкните, чтобы переключиться между сообщениями RRR и RR73 в Tx4 (не разрешено для держателей составных вызовов type2)</p ><p>Сообщения RR73 следует использовать только в том случае, если вы достаточно уверены, что повторение сообщений не потребуется</p></body></html> + + + + Switch to this Tx message NOW +Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type2 compound call holders) +RR73 messages should only be used when you are reasonably confident that no message repetitions will be required + Переключиться на это Tx-сообщение СЕЙЧАС +Двойной щелчок для переключения между сообщениями RRR и RR73 в Tx4 (не разрешено для держателей составных вызовов типа 2) +Сообщения RR73 следует использовать только в том случае, если вы достаточно уверены, что повторение сообщений не потребуется. + + + + Tx &4 + + + + + Alt+4 + + + + + <html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to reset to the standard 73 message</p></body></html> + <html><head/><body><p>Переключиться на это Tx-сообщение СЕЙЧАС</p><p>Дважды щелкните, чтобы восстановить стандартное сообщение 73</p></body></html> + + + + Switch to this Tx message NOW +Double-click to reset to the standard 73 message + Переключиться на это Tx-сообщение СЕЙЧАС +Дважды щелкните, чтобы вернуться к стандартному сообщению 73. + + + + Tx &5 + + + + + Alt+5 + + + + + Now + + + + + Generate standard messages for minimal QSO + Генерировать стандартные сообщения для минимального QSO + + + + Generate Std Msgs + Создан. стандарт. сообщ. + + + + Tx &6 + + + + + Alt+6 + + + + + Enter a free text message (maximum 13 characters) +or select a predefined macro from the dropdown list. +Press ENTER to add the current text to the predefined +list. The list can be maintained in Settings (F2). + Введите произвольное текстовое сообщение (максимум 13 символов) +или выберите предопределенный макрос из выпадающего списка. +Нажмите ENTER, чтобы добавить текущий текст к предопределенным +список. Список можно сохранить в настройках (F2). + + + + Queue up the next Tx message + +Поставить в очередь следующее сообщение Tx + + + + Next + Следующий + + + + 2 + + + + + Quick-Start Guide to FST4 and FST4W + Краткое руководство по FST4 и FST4W + + + + FST4 + + + + + FST4W + + + + + + CQ + + + + + Grid + Локатор + + + + Max dB + Max дБ + + + + CQ AF + + + + + CQ AN + + + + + CQ AS + + + + + CQ EU + + + + + CQ NA + + + + + CQ OC + + + + + CQ SA + + + + + CQ 0 + + + + + CQ 1 + + + + + CQ 2 + + + + + CQ 3 + + + + + CQ 4 + + + + + CQ 5 + + + + + CQ 6 + + + + + CQ 7 + + + + + CQ 8 + + + + + CQ 9 + + + + + Reset + Сброс + + + + N List + + + + + N Slots + + + + + + + + + + + Random + Случайный + + + + Call + + + + + S/N (dB) + S/N (дБ) + + + + Distance + Расстояние + + + + More CQs + + + + + + % + + + + + Tx Pct + + + + + Band Hopping + Диапазон переходов + + + + Choose bands and times of day for band-hopping. + Выберите диапазоны и время суток для смены диапазонов. + + + + Schedule ... + Расписание ... + + + + Upload decoded messages to WSPRnet.org. + Загрузка декодированные сообщения на WSPRnet.org. + + + + Upload spots + Послать спот + + + + <html><head/><body><p>6 digit locators cause 2 different messages to be sent, the second contains the full locator but only a hashed callsign, other stations must have decoded the first once before they can decode your call in the second. Check this option to only send 4 digit locators if it will avoid the two message protocol.</p></body></html> + <html><head/><body><p>6-значные локаторы вызывают отправку 2 разных сообщений, второе содержит полный локатор, но только хешированный позывной, другие станции должны декодировать первое один раз, прежде чем они смогут декодировать ваш позывной во-вторых. Установите этот флажок, чтобы отправлять только 4-значные локаторы, если это позволит избежать протокола с двумя сообщениями.</p></body></html> + + + + 6 digit locators cause 2 different messages to be sent, the second contains the full locator but only a hashed callsign, other stations must have decoded the first once before they can decode your call in the second. Check this option to only send 4 digit locators if it will avoid the two message protocol. + 6-значные локаторы вызывают отправку 2 разных сообщений, второе содержит полный локатор, но только хешированный позывной, другие станции должны декодировать первое один раз, прежде чем они смогут декодировать ваш позывной во втором. Установите этот флажок, чтобы отправлять только 4-значные локаторы, если это позволит избежать протокола с двумя сообщениями. + + + + No own call decodes + Нет своих декод. вызовов + + + + Tx Next + Tx след. + + + + Set Tx power in dBm (dB above 1 mW) as part of your WSPR message. + Укажите мощность передатчика в дБм (относительно 1 мВт) +для передачи в Вашем WSPR сообщении. + + + + NB + + + + + Maximum drift rate in units of symbol rate per transmission. + Максимальная скорость дрейфа в единицах скорости передачи символов на передачу. + + + + Max Drift + Макс дрейф + + + + File + Файл + + + + View + Показывать + + + + Decode + Декод. + + + + Save + Сохранить + + + + Help + Помощь + + + + Mode + Модуляция + + + + Configurations + Конфигурация + + + + Tools + Инструменты + + + + Exit + Выход + + + + About WSJT-X + О WSJT-X + + + + Waterfall + Водопад + + + + Open + Открыть + + + + Ctrl+O + + + + + Open next in directory + Открыть следующий в папке + + + + Decode remaining files in directory + Декодировать оставшиеся файлы в папке + + + + Shift+F6 + + + + + Delete all *.wav && *.c2 files in SaveDir + + + + + None + Нет + + + + Save all + Сохранить все + + + + Online User Guide + Онлайн-руководство пользователя + + + + Keyboard shortcuts + Горячие клавиши + + + + Special mouse commands + Команды управления мышью + + + + JT9 + + + + + Save decoded + Сохранить декодированные + + + + Normal + Нормальный + + + + Deep + Глубокий + + + + Erase ALL.TXT + Стереть ALL.TXT + + + + Erase wsjtx_log.adi + Стереть wsjtx_log.adi + + + + F7 + + + + + Runaway Tx watchdog + + + + + JT65 + + + + + Astronomical data + Астрономические данные + + + + List of Type 1 prefixes and suffixes + Список префиксов и суффиксов типа 1 + + + + Settings... + Настройки... + + + + Local User Guide + Локальное руководство пользователя + + + + Open log directory + Открыть папку логов + + + + JT4 + + + + + Message averaging + Усреднение сообщений + + + + Enable averaging + Включить усреднение + + + + Enable deep search + + + + + WSPR + + + + + Echo Graph + Эхо-график + + + + F8 + + + + + Echo + Эхо + + + + EME Echo mode + EME эхо режим + + + + ISCAT + + + + + Fast Graph + Быстрый график + + + + F9 + + + + + &Download Samples ... + Скачать примеры... + + + + <html><head/><body><p>Download sample audio files demonstrating the various modes.</p></body></html> + <html><head/><body><p>Загрузите примеры аудиофайлов, демонстрирующие различные режимы.</p></body></html> + + + + MSK144 + + + + + QRA64 + + + + + Release Notes + Примечания к выпуску + + + + Enable AP for DX Call + Включить AP для DX Call + + + + FreqCal + + + + + Measure reference spectrum + Измерение эталонного спектра + + + + Measure phase response + Измерение фазовой характеристики + + + + Erase reference spectrum + Стереть эталонный спектр + + + + Execute frequency calibration cycle + Выполнить цикл калибровки частоты + + + + Equalization tools ... + Инструменты эквалайзера ... + + + + FT8 + + + + + + Enable AP + Включить AP + + + + Solve for calibration parameters + Решите для параметров калибровки + + + + Copyright notice + Уведомление об авторских правах + + + + Shift+F1 + + + + + Fox log + Лог лисы + + + + FT8 DXpedition Mode User Guide + Руководство пользователя режима DX-экспедиции FT8 + + + + Reset Cabrillo log ... + Очистка Cabrillo лога ... + + + + Color highlighting scheme + Схема выделения цветом + + + + Export Cabrillo log ... + Экспорт Cabrillo лог... + + + + Contest log + Контест лог + + + + Erase WSPR hashtable + Стереть хеш-таблицу WSPR + + + + FT4 + + + + + Quick-Start Guide to Q65 + Краткое руководство по Q65 + + + + Auto Clear Avg after decode + Автоматическая очистка среднего значения после декодирования + + + + Quick-Start Guide to WSJT-X 2.5.0 and MAP65 3.0 + Краткое руководство по WSJT-X 2.5.0 и MAP65 3.0 + + + + Rig Control Error + Ошибка управления трансивером + + + + + + Receiving + Прием + + + + Do you want to reconfigure the radio interface? + Хотите перенастроить радиоинтерфейс? + + + + Error Scanning ADIF Log + Ошибка сканирования ADIF лога + + + + Scanned ADIF log, %1 worked before records created + Просканирован лог ADIF, %1 работал до создания записей + + + + Error Loading LotW Users Data + Ошибка при загрузке данных пользователей LotW + + + + Error Writing WAV File + Ошибка записи файла WAV + + + + Enumerating audio devices + Перечисление аудиоустройств + + + + Configurations... + Конфигурация ... + + + + + + + + + + + + + + + + + + + + + + Message + Сообщение + + + + Error Killing jt9.exe Process + Ошибка завершения jtdxjt9.exe процесса + + + + KillByName return code: %1 + KillByName код возврата :%1 + + + + Error removing "%1" + Ошибка удаления "%1" + + + + Click OK to retry + Нажмите OK, чтобы повторить попытку. + + + + + Improper mode + Неправильный режим + + + + + File Open Error + Ошибка открытия файла + + + + + + + + Cannot open "%1" for append: %2 + Не удается открыть "%1" для добавления: %2 + + + + Error saving c2 file + Ошибка сохранения c2 файла + + + + Error in Sound Input + Ошибка в SoundInput + + + + Error in Sound Output + Ошибка в SoundOutput + + + + + + + Single-Period Decodes + Однопериодные декодирования + + + + + + + Average Decodes + Среднее декодирование + + + + Change Operator + Изменить оператора + + + + New operator: + Новый оператор + + + + Status File Error + Ошибка файла состояния + + + + + Cannot open "%1" for writing: %2 + Невозможно открыть "%1" для записи: %2 + + + + Subprocess Error + Ошибка подпроцесса + + + + Subprocess failed with exit code %1 + Сбой подпроцесса с кодом выхода %1 + + + + + Running: %1 +%2 + Запуск: %1 +%2 + + + + Subprocess error + Ошибка подпроцесса + + + + Reference spectrum saved + Сохраненный эталонный спектр + + + + Invalid data in fmt.all at line %1 + +Неверные данные в fmt.all в строке %1 + + + + Good Calibration Solution + Хорошее калибровочное решение + + + + <pre>%1%L2 ±%L3 ppm +%4%L5 ±%L6 Hz + +%7%L8 +%9%L10 Hz</pre> + + + + + Delete Calibration Measurements + +Удалить калибровочные измерения + + + + The "fmt.all" file will be renamed as "fmt.bak" + Файл «fmt.all» будет переименован в «fmt.bak». + + + + If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work: + +"The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FST4, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, Q65, MSK144 are Copyright (C) 2001-2021 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." + Если вы добросовестно используете какую-либо часть WSJT-X в соответствии с условиями Стандартной общественной лицензии GNU, вы должны разместить на видном месте следующее уведомление об авторских правах в своей производной работе: + +«Алгоритмы, исходный код, внешний вид WSJT-X и связанных с ним программ, а также спецификации протоколов для режимов FSK441, FST4, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, Q65, MSK144 защищены авторским правом ( C) 2001–2021 годы одним или несколькими из следующих авторов: Джозеф Тейлор, K1JT; Билл Сомервилль, G4WJS; Стивен Франке, K9AN; Нико Палермо, IV3NWV; Грег Бим, KI7MT; Майкл Блэк, W9MDB; Эдсон Перейра, PY2SDR; Филипп. Karn, KA9Q и другие члены группы разработчиков WSJT». + + + + No data read from disk. Wrong file format? + Данные не считываются с диска. Неверный формат файла? + + + + Confirm Delete + Подтвердите удаление + + + + Are you sure you want to delete all *.wav and *.c2 files in "%1"? + Вы уверены, что хотите удалить все файлы *.wav и *.c2 в "%1"? + + + + Keyboard Shortcuts + Горячие клавиши + + + + <table cellspacing=1> + <tr><td><b>Esc </b></td><td>Stop Tx, abort QSO, clear next-call queue</td></tr> + <tr><td><b>F1 </b></td><td>Online User's Guide (Alt: transmit Tx6)</td></tr> + <tr><td><b>Shift+F1 </b></td><td>Copyright Notice</td></tr> + <tr><td><b>Ctrl+F1 </b></td><td>About WSJT-X</td></tr> + <tr><td><b>F2 </b></td><td>Open settings window (Alt: transmit Tx2)</td></tr> + <tr><td><b>F3 </b></td><td>Display keyboard shortcuts (Alt: transmit Tx3)</td></tr> + <tr><td><b>F4 </b></td><td>Clear DX Call, DX Grid, Tx messages 1-4 (Alt: transmit Tx4)</td></tr> + <tr><td><b>Alt+F4 </b></td><td>Exit program</td></tr> + <tr><td><b>F5 </b></td><td>Display special mouse commands (Alt: transmit Tx5)</td></tr> + <tr><td><b>F6 </b></td><td>Open next file in directory (Alt: toggle "Call 1st")</td></tr> + <tr><td><b>Shift+F6 </b></td><td>Decode all remaining files in directory</td></tr> + <tr><td><b>F7 </b></td><td>Display Message Averaging window</td></tr> + <tr><td><b>F11 </b></td><td>Move Rx frequency down 1 Hz</td></tr> + <tr><td><b>Ctrl+F11 </b></td><td>Move identical Rx and Tx frequencies down 1 Hz</td></tr> + <tr><td><b>Shift+F11 </b></td><td>Move Tx frequency down 60 Hz (FT8) or 90 Hz (FT4)</td></tr> + <tr><td><b>Ctrl+Shift+F11 </b></td><td>Move dial frequency down 2000 Hz</td></tr> + <tr><td><b>F12 </b></td><td>Move Rx frequency up 1 Hz</td></tr> + <tr><td><b>Ctrl+F12 </b></td><td>Move identical Rx and Tx frequencies up 1 Hz</td></tr> + <tr><td><b>Shift+F12 </b></td><td>Move Tx frequency up 60 Hz (FT8) or 90 Hz (FT4)</td></tr> + <tr><td><b>Ctrl+Shift+F12 </b></td><td>Move dial frequency up 2000 Hz</td></tr> + <tr><td><b>Alt+1-6 </b></td><td>Set now transmission to this number on Tab 1</td></tr> + <tr><td><b>Ctl+1-6 </b></td><td>Set next transmission to this number on Tab 1</td></tr> + <tr><td><b>Alt+B </b></td><td>Toggle "Best S+P" status</td></tr> + <tr><td><b>Alt+C </b></td><td>Toggle "Call 1st" checkbox</td></tr> + <tr><td><b>Alt+D </b></td><td>Decode again at QSO frequency</td></tr> + <tr><td><b>Shift+D </b></td><td>Full decode (both windows)</td></tr> + <tr><td><b>Ctrl+E </b></td><td>Turn on TX even/1st</td></tr> + <tr><td><b>Shift+E </b></td><td>Turn off TX even/1st</td></tr> + <tr><td><b>Alt+E </b></td><td>Erase</td></tr> + <tr><td><b>Ctrl+F </b></td><td>Edit the free text message box</td></tr> + <tr><td><b>Alt+G </b></td><td>Generate standard messages</td></tr> + <tr><td><b>Alt+H </b></td><td>Halt Tx</td></tr> + <tr><td><b>Ctrl+L </b></td><td>Lookup callsign in database, generate standard messages</td></tr> + <tr><td><b>Alt+M </b></td><td>Monitor</td></tr> + <tr><td><b>Alt+N </b></td><td>Enable Tx</td></tr> + <tr><td><b>Ctrl+O </b></td><td>Open a .wav file</td></tr> + <tr><td><b>Alt+O </b></td><td>Change operator</td></tr> + <tr><td><b>Alt+Q </b></td><td>Log QSO</td></tr> + <tr><td><b>Ctrl+R </b></td><td>Set Tx4 message to RRR (not in FT4)</td></tr> + <tr><td><b>Alt+R </b></td><td>Set Tx4 message to RR73</td></tr> + <tr><td><b>Alt+S </b></td><td>Stop monitoring</td></tr> + <tr><td><b>Alt+T </b></td><td>Toggle Tune status</td></tr> + <tr><td><b>Alt+Z </b></td><td>Clear hung decoder status</td></tr> +</table> + Keyboard shortcuts help window contents + <table cellspacing=1> + <tr><td><b>Esc </b></td><td>Остановить передачу, прервать QSO, очистить очередь следующего вызова.</td></tr> + <tr><td><b>F1 </b></td><td>Онлайн-руководство пользователя. </td></tr> + <tr><td><b>Shift+F1 </b></td><td>Уведомление об авторских правах.</td></tr> + <tr><td><b>Ctrl+F1 </b></td><td>О WSJT-X.</td></tr> + <tr><td><b>F2 </b></td><td>Открыть окно настроек.</td></tr> + <tr><td><b>F3 </b></td><td>Показать список "горячих" клавиш.</td></tr> + <tr><td><b>F4 </b></td><td>Очистить DX позывной/Локатор и TX сообщения.</td></tr> + <tr><td><b>Alt+F4 </b></td><td>Выход из программы.</td></tr> + <tr><td><b>F5 </b></td><td>Показать специальные команды мыши. </td></tr> + <tr><td><b>F6 </b></td><td>Открыть следующий файл в папке.</td></tr> + <tr><td><b>Shift+F6 </b></td><td>Декодировать оставшиеся файлы в папке</td></tr> + <tr><td><b>F7 </b></td><td>Показать окно усреднения сообщений</td></tr> + <tr><td><b>F11 </b></td><td>Уменьшить Rx частоту на 1Гц</td></tr> + <tr><td><b>Ctrl+F11 </b></td><td>Уменьшить частоты Rx и Tx на 1 Гц</td></tr> + <tr><td><b>Shift+F11 </b></td><td>Уменьшить частоту Tx на 60 Гц (FT8) или 90 Гц (FT4)</td></tr> + <tr><td><b>Ctrl+Shift+F11 </b></td><td>Сдвинуть частоту настройки вниз на 2000 Гц</td></tr> + <tr><td><b>F12 </b></td><td>Увеличить частоту Rx на 1 Гц</td></tr> + <tr><td><b>Ctrl+F12 </b></td><td>Увеличить частоты Rx и Tx на 1 Гц</td></tr> + <tr><td><b>Shift+F12 </b></td><td>Увеличить частоту Tx на 60 Гц (FT8) или 90 Гц (FT4)</td></tr> + <tr><td><b>Ctrl+Shift+F12 </b></td><td>Увеличить частоту настройки на 2000 Гц</td></tr> + <tr><td><b>Alt+1-6 </b></td><td>Установить сейчас передачу на номер 1 на вкладке" Tab 1</td></tr> + <tr><td><b>Ctl+1-6 </b></td><td>Установить следующую передачу на номер 1 на вкладке Tab 1</td></tr> + <tr><td><b>Alt+B </b></td><td>Переключить статус «Best S+P»</td></tr> + <tr><td><b>Alt+C </b></td><td>Установить флажок"Call 1st" </td></tr> + <tr><td><b>Alt+D </b></td><td>Повторное декодирование на частоте QSO</td></tr> + <tr><td><b>Shift+D </b></td><td>Полное декодирование (оба окна)</td></tr> + <tr><td><b>Ctrl+E </b></td><td>Включить передачу (Tx) четного интервала</td></tr> + <tr><td><b>Shift+E </b></td><td>Выключить передачу (Tx) четного интервала</td></tr> + <tr><td><b>Alt+E </b></td><td>Стереть.</td></tr> + <tr><td><b>Ctrl+F </b></td><td>Редактировать текст свободного сообщения .</td></tr> + <tr><td><b>Alt+G </b></td><td>Формирование стандартных сообщений.</td></tr> + <tr><td><b>Alt+H </b></td><td>Превать передачу / Halt Tx.</td></tr> + <tr><td><b>Ctrl+L </b></td><td>Поиск позывного в базе данных и формирование стандартных сообщений.</td></tr> + <tr><td><b>Alt+M </b></td><td>Управление кнопкой Монитор / Monitor.</td></tr> + <tr><td><b>Alt+N </b></td><td>Разрешить передачу / Enable Tx.</td></tr> + <tr><td><b>Ctrl+O </b></td><td>Открыть файл a .wav .</td></tr> + <tr><td><b>Alt+O </b></td><td>Сменить оператора.</td></tr> + <tr><td><b>Alt+Q </b></td><td>QSO в Log / Log QSO.</td></tr> + <tr><td><b>Ctrl+R </b></td><td>Установите для сообщения Tx4 значение RRR (нет в FT4).)</td></tr> + <tr><td><b>Alt+R </b></td><td>Установите сообщение Tx4 на RR73.</td></tr> + <tr><td><b>Alt+S </b></td><td>Остановить прием / Stop monitoring.</td></tr> + <tr><td><b>Alt+T </b></td><td>Переключить статус настройки.</td></tr> + <tr><td><b>Alt+Z </b></td><td>Очистить статус зависшего декодера.</td></tr> +</table> + + + + Special Mouse Commands + Специальные команды мыши + + + + <table cellpadding=5> + <tr> + <th align="right">Click on</th> + <th align="left">Action</th> + </tr> + <tr> + <td align="right">Waterfall:</td> + <td><b>Click</b> to set Rx frequency.<br/> + <b>Shift-click</b> to set Tx frequency.<br/> + <b>Ctrl-click</b> or <b>Right-click</b> to set Rx and Tx frequencies.<br/> + <b>Double-click</b> to also decode at Rx frequency.<br/> + </td> + </tr> + <tr> + <td align="right">Decoded text:</td> + <td><b>Double-click</b> to copy second callsign to Dx Call,<br/> + locator to Dx Grid, change Rx and Tx frequency to<br/> + decoded signal's frequency, and generate standard<br/> + messages.<br/> + If <b>Hold Tx Freq</b> is checked or first callsign in message<br/> + is your own call, Tx frequency is not changed unless <br/> + <b>Ctrl</b> is held down.<br/> + </td> + </tr> + <tr> + <td align="right">Erase button:</td> + <td><b>Click</b> to erase QSO window.<br/> + <b>Double-click</b> to erase QSO and Band Activity windows. + </td> + </tr> +</table> + Mouse commands help window contents + <table cellpadding=5> + <tr> + <th align="right">Клик на</th> + <th align="left">Действие</th> + </tr> + <tr> + <td align="right">Водопад:</td> + <td><b>Клик</b> выставить Rx частоту.<br/> + <b>Shift-клик</b> выставить Tx частоту.<br/> + <b>Ctrl-клик</b> or <b>Right-клик</b> Выставить Rx и Tx частоту.<br/> + <b>Двойной-клик</b> также декодирует на частоте Rx.<br/> + </td> + </tr> + <tr> + <td align="right">Декодированный текст:</td> + <td><b>Двойной-клик</b> копирует второй позывной в окно Позывной DX l,<br/> + локатор в QTH локатор меняет Rx и Tx частоты к<br/> + частоте декодированного сигнала ,формирует стандартные сообщения.<br/> +......Если установлен флажок <b>Hold Tx Freq</b> или первый позывной в сообщении<br/> + является вашим собственным вызовом, частота Tx не изменяется.<br/> +......<b>Ctrl</b> удерживается.<br/> + </td> + </tr> + <tr> + <td align="right">Кнопка очистить:</td> + <td><b>Клик</b>, чтобы стереть окно QSO.<br/> +<b>Двойной клик</b>, чтобы стереть окна QSO и полоса обзора. + </td> + </tr> +</table> + + + + No more files to open. + Нет больше файлов для открытия. + + + + Spotting to PSK Reporter unavailable + Споттинг для PSK Reporter недоступен + + + + Please choose another Tx frequency. WSJT-X will not knowingly transmit another mode in the WSPR sub-band on 30m. + Пожалуйста, выберите другую частоту Tx. WSJT-X не будет сознательно передавать в другом режиме в поддиапазоне WSPR на 30 м. + + + + WSPR Guard Band + WSPR участок, в нем заблокирована передача другими видами модуляции + + + + Please choose another dial frequency. WSJT-X will not operate in Fox mode in the standard FT8 sub-bands. + + + + + Fox Mode warning + Предупреждение о режиме лисы + + + + Last Tx: %1 + ПослдTx: + + + + Should you switch to EU VHF Contest mode? + +To do so, check 'Special operating activity' and +'EU VHF Contest' on the Settings | Advanced tab. + Стоит ли переключаться в режим EU VHF Contest? + +Для этого установите флажок «Особая операционная деятельность» и +«EU VHF Contest» в настройках | Продвинутая вкладка. + + + + Should you switch to ARRL Field Day mode? + Стоит ли переключаться в режим ARRL Field Day? + + + + Should you switch to RTTY contest mode? + Стоит ли переключаться в режим соревнований RTTY? + + + + + + + Add to CALL3.TXT + Добавить в CALL3.TXT + + + + Please enter a valid grid locator + Пожалуйста, введите корректный локатор + + + + Cannot open "%1" for read/write: %2 + Невозможно открыть "%1" для чтения/записи: %2 + + + + %1 +is already in CALL3.TXT, do you wish to replace it? + %1 +уже находится в CALL3.TXT, заменить его? + + + + Warning: DX Call field is empty. + Предупреждение: Поле DX Call пусто. + + + + Log file error + Ошибка файла лога + + + + Cannot open "%1" + Не удается открыть "%1" + + + + Error sending log to N1MM + Ошибка отправки лога в N1MM + + + + Write returned "%1" + Запись возвращает "%1" + + + + Stations calling DXpedition %1 + Станции, вызывающие DXpedition %1 + + + + Hound + Гончая + + + + Tx Messages + Tx-сообщения + + + + + + Confirm Erase + Подтвердите очистку + + + + Are you sure you want to erase file ALL.TXT? + Вы уверены, что хотите стереть файл ALL.TXT? + + + + + Confirm Reset + Подтвердите сброс + + + + Are you sure you want to erase your contest log? + Вы уверены, что хотите стереть лог соревнований? + + + + Doing this will remove all QSO records for the current contest. They will be kept in the ADIF log file but will not be available for export in your Cabrillo log. + Это приведет к удалению всех записей QSO для текущего контеста. Они будут храниться в файле журнала ADIF, но не будут доступны для экспорта в лог Cabrillo. + + + + Cabrillo Log saved + Лог Cabrillo сохранен + + + + Are you sure you want to erase file wsjtx_log.adi? + Вы уверены, что хотите стереть файл wsjtx_log.adi? + + + + Are you sure you want to erase the WSPR hashtable? + Вы уверены, что хотите стереть хеш-таблицу WSPR? + + + + Tune digital gain + Уровень звука режима настройки + + + + Transmit digital gain + Уровень звука передачи сообщения + + + + Prefixes + Префиксы + + + + Network Error + Ошибка сети + + + + Error: %1 +UDP server %2:%3 + Ошибка: %1 +UDP-сервер %2:%3 + + + + File Error + Ошибка файла + + + + Phase Training Disabled + Фаза обучения отключена + + + + Phase Training Enabled + Фаза обучения включена + + + + WD:%1m + WD:%1m + + + + + Log File Error + Ошибка файла лога + + + + Are you sure you want to clear the QSO queues? + Вы уверены, что хотите очистить очередь QSO? + + + + MessageAveraging + + + + Message Averaging + Усреднение сообщений + + + + UTC Sync DT Freq + + + + + Modes + + + + Mode + Вид + + + + MultiSettings + + + Default + + + + + MultiSettings::impl + + + &Switch To + Переключить на + + + + &Clone + Клон + + + + Clone &Into ... + Клонировать в ... + + + + R&eset + Сброс + + + + &Rename ... + Переименовать ... + + + + &Delete + Удалить + + + + Clone Into Configuration + Клонировать в конфигурацию + + + + Confirm overwrite of all values for configuration "%1" with values from "%2"? + Подтвердить перезапись всех значений конфигурации "%1" значениями из "%2"? + + + + Reset Configuration + Сброс конфигурации + + + + Confirm reset to default values for configuration "%1"? + Подтвердить сброс значений по умолчанию для конфигурации "%1"? + + + + Delete Configuration + Удалить конфигурацию + + + + Confirm deletion of configuration "%1"? + Подтвердить удаление конфигурации "%1"? + + + + NameDialog + + + New Configuration Name + Новое имя конфигурации + + + + Old name: + Старое имя + + + + &New name: + Новое имя: + + + + NetworkAccessManager + + + Network SSL/TLS Errors + Сетевые ошибки SSL/TLS + + + + OmniRigTransceiver + + + OmniRig: unrecognized mode + OmniRig: нераспознанный режим + + + + Failed to start OmniRig COM server + Не удалось запустить COM-сервер OmniRig. + + + + + OmniRig: don't know how to set rig frequency + OmniRig: не знаю, как настроить частоту трансивера + + + + OmniRig COM/OLE error: %1 at %2: %3 (%4) + Ошибка OmniRig COM/OLE: %1 в %2: %3 (%4) + + + + PollingTransceiver + + + Unexpected rig error + Непредвиденная ошибка трансивера + + + + QObject + + + Failed to open LotW users CSV file: '%1' + Не удалось открыть CSV-файл пользователей LotW: «%1» + + + + OOB + + + + + Too many colours in palette. + Слишком много цветов в палитре. + + + + Error reading waterfall palette file "%1:%2" too many colors. + Ошибка чтения файла палитры водопада "%1:%2" слишком много цветов. + + + + Error reading waterfall palette file "%1:%2" invalid triplet. + Ошибка чтения файла палитры водопада "%1:%2" неверный триплет. + + + + Error reading waterfall palette file "%1:%2" invalid color. + Ошибка чтения файла палитры водопада "%1:%2" неверный цвет. + + + + Error opening waterfall palette file "%1": %2. + Ошибка при открытии файла палитры водопада "%1": %2. + + + + Error writing waterfall palette file "%1": %2. + Ошибка записи файла палитры водопада "%1": %2. + + + + RemoteFile + + + + + + + + File System Error + Ошибка файловой системы + + + + Cannot rename file: +"%1" +to: "%2" +Error(%3): %4 + Невозможно переименовать файл: +"%1" +кому: "%2" +Ошибка(%3): %4 + + + + Cannot delete file: +"%1" + Невозможно удалить файл: +"%1" + + + + + + Network Error + Сетевая ошибка + + + + Too many redirects: %1 + Слишком много перенаправлений: %1 + + + + Redirect not followed: %1 + Перенаправление не выполнено: %1 + + + + Cannot commit changes to: +"%1" + +Невозможно зафиксировать изменения в: +"%1" + + + + Cannot open file: +"%1" +Error(%2): %3 + Не могу открыть файл: +"%1" +Ошибка(%2): %3 + + + + Cannot make path: +"%1" + Не могу создать путь: +"%1" + + + + Cannot write to file: +"%1" +Error(%2): %3 + Не могу записать в файл: +"%1" +Ошибка(%2): %3 + + + + SampleDownloader::impl + + + + Download Samples + Скачать примеры + + + + &Abort + Прервать + + + + &Refresh + Обновить + + + + &Details + Подробности + + + + Base URL for samples: + Базовый URL для примеров: + + + + Only use HTTP: + Исполльзуйте только HTTP: + + + + Check this if you get SSL/TLS errors + Проверьте это, если вы получаете ошибки SSL/TLS + + + + Input Error + Ошибка ввода + + + + Invalid URL format + Неверный формат URL + + + + SoundInput + + + An error opening the audio input device has occurred. + Произошла ошибка при открытии звуковой карты. + + + + An error occurred during read from the audio input device. + Произошла ошибка во время чтения со звуковой карты. + + + + Non-recoverable error, audio input device not usable at this time. + +Неисправимая ошибка, звуковая карта в настоящее время не используется + + + + Requested input audio format is not valid. + Запрошенный входной аудиоформат недействителен. + + + + Requested input audio format is not supported on device. + +Запрошенный входной аудиоформат не поддерживается на устройстве. + + + + Failed to initialize audio sink device + Не удалось инициализировать звуковую карту + + + + Idle + Простой + + + + Receiving + Прием + + + + Suspended + Приостановленный + + + + Interrupted + Прерывание + + + + Error + Ошибка + + + + Stopped + Остановлено + + + + SoundOutput + + + An error opening the audio output device has occurred. + Произошла ошибка при открытии звуковой карты + + + + An error occurred during write to the audio output device. + Произошла ошибка во время записи на звуковую карту + + + + Audio data not being fed to the audio output device fast enough. + Аудиоданные недостаточно быстро передаются на звуковую карту. + + + + Non-recoverable error, audio output device not usable at this time. + Неисправимая ошибка, звуковая карта в настоящее время не используется. + + + + Requested output audio format is not valid. + Запрошенный выходной аудиоформат недействителен. + + + + Requested output audio format is not supported on device. + Запрошенный выходной аудиоформат не поддерживается на устройстве. + + + + No audio output device configured. + Звуковая карта не настроенаю + + + + Idle + Простой + + + + Sending + Отправка + + + + Suspended + Приостановлено + + + + Interrupted + Пррерывание + + + + Error + Ошибка + + + + Stopped + Остановлено + + + + StationDialog + + + Add Station + Добавить станцию + + + + &Band: + Диапазон + + + + &Offset (MHz): + Смещение (МГц) + + + + &Antenna: + Антенна + + + + StationList::impl + + + Band name + Диапазон + + + + Frequency offset + Смещение частоты + + + + Antenna description + Описание антенны + + + + Band + Диапазон + + + + Offset + Смещение + + + + Antenna Description + Описание антенны + + + + TransceiverBase + + + Unexpected rig error + Непредвиденная ошибка трансивера + + + + WideGraph + + + Dialog + Диалог + + + + Controls + Управл. + + + + Spectrum gain + Уровень спектра + + + + Palette + Палитра + + + + <html><head/><body><p>Enter definition for a new color palette.</p></body></html> + <html><head/><body><p>Введите определение новой цветовой палитры.</p></body></html> + + + + Adjust... + Настройка... + + + + Waterfall gain + Яркость водопада + + + + <html><head/><body><p>Set fractional size of spectrum in this window.</p></body></html> + <html><head/><body><p>Размер окна спектра.</p></body></html> + + + + % + + + + + Spec + + + + + <html><head/><body><p>Flatten spectral baseline over the full displayed interval.</p></body></html> + <html><head/><body><p>Сглаживание уровня спектра водопада по всему отображаемому диапазону частот.</p></body></html> + + + + Flatten + Сглаживание + + + + <html><head/><body><p>Compute and save a reference spectrum. (Not yet fully implemented.)</p></body></html> + <html><head/><body><p>Рассчитайте и сохраните эталонный спектр. (Еще не полностью реализовано.)</p></body></html> + + + + Ref Spec + + + + + Smoothing of Linear Average spectrum + Сглаживание линейного среднего спектра + + + + Smooth + Гладкий + + + + Compression factor for frequency scale + Коэффициент сжатия для частотной шкалы + + + + Bins/Pixel + + + + + Select waterfall palette + Выберите палитру водопада + + + + <html><head/><body><p>Select data for spectral display</p></body></html> + <html><head/><body><p>Выбор данных для спектрального отображения</p></body></html> + + + + Current + Текущий + + + + Cumulative + Накопительный + + + + Linear Avg + Линейное среднее + + + + Reference + Эталон + + + + Q65_Sync + + + + + <html><head/><body><p>Frequency at left edge of waterfall</p></body></html> + <html><head/><body><p>Частота на левом краю водопада</p></body></html> + + + + Hz + Гц + + + + Start + Старт + + + + <html><head/><body><p>Decode JT9 only above this frequency</p></body></html> + <html><head/><body><p>Декодировать JT9 только выше этой частоты</p></body></html> + + + + Hz + Гц + + + + Split + + + + + Number of FFTs averaged (controls waterfall scrolling rate) + Количество усредненных FFT (контролирует скорость прокрутки водопада) + + + + N Avg + + + + + Waterfall zero + Контрастность водопада + + + + Spectrum zero + Ноль спектра + + + + User Defined + Определяемые пользователем + + + + Wide Graph + + + + + + Read Palette + Чтение палитры + + + + WorkedBefore + + + Invalid ADIF field %0: %1 + Недопустимое поле ADIF %0: %1 + + + + Malformed ADIF field %0: %1 + +Неверное поле ADIF %0: %1 + + + + Invalid ADIF header + Недопустимый заголовок ADIF + + + + Error opening ADIF log file for read: %0 + Ошибка открытия лога ADIF для чтения: %0 + + + + configuration_dialog + + + Settings + Настройки + + + + Genera&l + Общие + + + + General station details and settings. + Подробная информация и настройка станции. + + + + Station Details + Описание станции + + + + My C&all: + Мой п&озывной: + + + + Station callsign. + Позывной станции + + + + M&y Grid: + Мо&й QTH локатор: + + + + <html><head/><body><p>Maidenhead locator, preferably 6 characters.</p></body></html> + +<html><head/><body><p>Ваш локатор, желательно 6 символов.</p></body></html> + + + + Check to allow grid changes from external programs + Установите этот флажок, чтобы разрешить изменения локатора из внешних программ. + + + + AutoGrid + АвтоЛокатор + + + + IARU Region: + IARU регион: + + + + <html><head/><body><p>Select your IARU region.</p></body></html> + <html><head/><body><p>Выберите свой регион IARU.</p></body></html> + + + + Message generation for type 2 compound callsign holders: + Создание сообщений при испрользовании дробного позывного 2-ого типа : + + + + <html><head/><body><p>Type 2 compound callsigns are those with prefixes or suffixes not included in the allowed shortlist (See Help-&gt;Add-on prefixes and suffixes).</p><p>This option determines which generated messages should contain your full type 2 compound call sign rather than your base callsign. It only applies if you have a type 2 compound callsign.</p><p>This option controls the way the messages that are used to answer CQ calls are generated. Generated messages 6 (CQ) and 5 (73) will always contain your full callsign. The JT65 and JT9 protocols allow for some standard messages with your full call at the expense of another piece of information such as the DX call or your locator.</p><p>Choosing message 1 omits the DX callsign which may be an issue when replying to CQ calls. Choosing message 3 also omits the DX callsign and many versions of this and other software will not extract the report. Choosing neither means that your full callsign only goes in your message 5 (73) so your QSO partner may log the wrong callsign.</p><p>None of these options are perfect, message 3 is usually best but be aware your QSO partner may not log the report you send them.</p></body></html> + <html><head/><body><p>Составные(дробные) позывные второго типа - это те, у которых есть префиксы или суффиксы, не включенные в разрешенный список (см. Помощь->Список дополнительных префиксов и суффиксов)</p><p>Эта опция определяет, какие созданные сообщения должны содержать Ваш полный составной позывной второго типа вместо Вашего основного(домашнего) позывного. Эта настройка применяется только если Вы используете составной позывной второго типа.</p><p>Этот опция определяет способ создания сообщений, которые используются для ответа на вызовы CQ. Сгенерированные сообщения Tx6 (CQ) и Tx5 ​​(73) всегда будут содержать Ваш полный составной позывной. Протоколы JT65 и JT9 позволяют использовать некоторые стандартные сообщения с Вашим полным составным позывным в ущерб другой информации, такой как позывной корреспондента или Ваш QTH квадрат.</p><p>При выбор сообщения Tx1 исключается позывной корреспондента, что может быть проблемой при ответе на сообщения CQ. Выбор сообщения Tx3 также исключает позывной корреспондента, и разные версии этого и другого программного обеспечения не будут извлекать из принятого сообщения рапорт. Выбрав Tx5, Ваш полный позывной будет передан только в сообщении 73, поэтому Ваш корреспондент может внести QSO в свой лог с Вашим неполным(домашним) позывным.</p><p>Среди этих вариантов нет идеального, лучше использовать сообщение Tx3, но помните что в этом случае Ваш корреспондент может забыть внести в лог принятый от Вас рапорт.</p></body></html> + + + + Full call in Tx1 + Полный позывной в Tx1 + + + + Full call in Tx3 + Полный позывной в Tx3 + + + + Full call in Tx5 only + Полный позывной только в Tx5 + + + + Display + Отображать + + + + Show outgoing transmitted messages in the Rx frequency window. + Показать исходящие переданные сообщения в окне частоты приема. + + + + &Tx messages to Rx frequency window + Показывать переданные сообщения в окне Rx + + + + Show if decoded stations are new DXCC entities or worked before. + Показать, являются ли декодированные станции новыми объектами DXCC или работали ранее. + + + + Show &DXCC, grid, and worked-before status + Показать &DXCC, локатор и B4 (работал ранее) + + + + <html><head/><body><p>Check to have decodes for a new period start at the top of the Band Activity window and not scroll off the top when the window is full.</p><p>This is to aid selecting decodes to double-click while decoding is still in progress. Use the Band Activity vertical scroll bar to reveal decodes past the bottom of the window.</p></body></html> + <html><head/><body><p>Установите флажок, чтобы декодирование нового периода начиналось в верхней части окна «Декодирование в полосе обзора» и не прокручивалось вверх, когда окно заполнено.</p><p>Это предназначен для облегчения выбора декодирования двойным щелчком, когда декодирование все еще выполняется. Используйте вертикальную полосу прокрутки , чтобы показать декодирование за нижней частью окна.</p></body></html> + + + + Start new period decodes at top + Начать декодирование нового периода сверху + + + + Show principal prefix instead of country name + Показывать основной префикс вместо названия страны + + + + Set the font characteristics for the application. + Выберите шрифт для надписей программы. + + + + Font... + Шрифт приложения + + + + Set the font characteristics for the Band Activity and Rx Frequency areas. + Выберите шрифт для показа сообщений +в полосе обзора и окне приемной частоты. + + + + Decoded Text Font... + Шрифт декодированная... + + + + Include a separator line between periods in the band activity window. + Разделительная линия между периодами декодирования + + + + &Blank line between decoding periods + Разделительная строка между периодами декодирования + + + + Show distance to DX station in miles rather than kilometers. + Показывать расстояние до корреспондента в милях вместо километров. + + + + Display dista&nce in miles + Показывать расстояние в милях + + + + Behavior + Режим + + + + Decode after EME delay + Декодировать после задержки EME + + + + Tx watchdog: + Таймер отключения передачи +при отсутствии активности пользователя + + + + <html><head/><body><p>Number of minutes before unattended transmissions are aborted</p></body></html> + <html><head/><body><p>Количество минут до прерывания автоматической передачи</p></body></html> + + + + Disabled + + + + + minutes + минут + + + + Single decode + Одиночное декодирование + + + + <html><head/><body><p>Some rigs are not able to process CAT commands while transmitting. This means that if you are operating in split mode you may have to uncheck this option.</p></body></html> + <html><head/><body><p>Некоторые трансиверы не могут обрабатывать CAT-команды во время передачи. Это означает, что если вы работаете в режиме разделения, вам, возможно, придется снять этот флажок.</p></body></html> + + + + Allow Tx frequency changes while transmitting + Разрешить изменение частоты Tx во время передачи + + + + Don't start decoding until the monitor button is clicked. + Декодирование не начнется пока не будет +включена кнопка Монитор. + + + + Mon&itor off at startup + Отключ&ить прием сигналов при запуске + + + + <html><head/><body><p>Check this if you wish to automatically return to the last monitored frequency when monitor is enabled, leave it unchecked if you wish to have the current rig frequency maintained.</p></body></html> + <html><head/><body><p>Отметьте этот флажок, если вы хотите автоматически возвращаться к последней отслеживаемой частоте при включении монитора, оставьте этот флажок снятым, если вы хотите сохранить текущую частоту установки.</p>< /тело></html> + + + + Monitor returns to last used frequency + Монитор возвращается к последней использовавшейся частоте + + + + Alternate F1-F6 bindings + Альтернативные привязки F1-F6 + + + + Turns off automatic transmissions after sending a 73 or any other free +text message. + Отключает передачу после отправки 73 или любого другого бесплатного +текстовое сообщение. + + + + Di&sable Tx after sending 73 + Отключает передачу после отправки 73 + + + + Send a CW ID after every 73 or free text message. + JT65: Передать свой позывной в CW после сообщения 73 +или свободного текстового сообщения. + + + + CW ID a&fter 73 + CW ID после 73 + + + + Periodic CW ID Inter&val: + Периодический CW ID интер&вал: + + + + Send a CW ID periodically every few minutes. +This might be required under your countries licence regulations. +It will not interfere with other users as it is always sent in the +quiet period when decoding is done. + Передавайте CW ID периодически каждые несколько минут. +Это может потребоваться в соответствии с лицензионным законодательством вашей страны. +Он не будет мешать другим пользователям, так как он всегда отправляется в +тихий период, когда декодирование сделано. + + + + Automatic transmission mode. + Автоматический режим передачи. + + + + Doubl&e-click on call sets Tx enable + Двойной клик на позывном разрешает вызов и активирует TX + + + + Calling CQ forces Call 1st + Вызов CQ заставляет Call 1st + + + + &Radio + &Радио + + + + Radio interface configuration settings. + Настройки конфигурации радиоинтерфейса. + + + + Settings that control your CAT interface. + Настройки управления Вашим CAT интерфейсом. + + + + CAT Control + Управление CAT + + + + + Port: + Порт: + + + + Serial port used for CAT control. + COM порт для управления CAT. + + + + + Serial Port Parameters + Параметры COM порта + + + + Baud Rate: + Скорость: + + + + Serial port data rate which must match the setting of your radio. + Скорость COM порта . Должна соответствовать установленной скорости в трансивере. + + + + 1200 + + + + + 2400 + + + + + 4800 + + + + + 9600 + + + + + 19200 + + + + + 38400 + + + + + 57600 + + + + + 115200 + + + + + <html><head/><body><p>Number of data bits used to communicate with your radio's CAT interface (usually eight).</p></body></html> + <html><head/><body><p>Количество битов данных, используемых для связи с CAT-интерфейсом трансивера (обычно восемь).</p></body></html> + + + + Data Bits + Бит данных + + + + D&efault + По умолчанию + + + + Se&ven + Семь + + + + E&ight + Восемь + + + + <html><head/><body><p>Number of stop bits used when communicating with your radio's CAT interface</p><p>(consult you radio's manual for details).</p></body></html> + <html><head/><body><p>Количество стоповых битов, используемых при обмене данными с CAT-интерфейсом трансивера</p><p>(подробности см. в руководстве по радиостанции).</p></body>< /html> + + + + Stop Bits + Стоп бит + + + + + Default + По умолчанию + + + + On&e + Один + + + + T&wo + Два + + + + <html><head/><body><p>Flow control protocol used between this computer and your radio's CAT interface (usually &quot;None&quot; but some require &quot;Hardware&quot;).</p></body></html> + <html><head/><body><p>Протокол управления потоком данных, используемый между этим компьютером и CAT-интерфейсом радиостанции (обычно "Нет", но для некоторых требуется "Аппаратная поддержка").</p></body></ HTML> + + + + + Handshake + Управление потоком + + + + &None + Отключено + + + + Software flow control (very rare on CAT interfaces). + Программное управление потоком передачи +данных через последовательный порт. +Применяется крайне редко на CAT интерфейсе. + + + + XON/XOFF + Программное + + + + Flow control using the RTS and CTS RS-232 control lines +not often used but some radios have it as an option and +a few, particularly some Kenwood rigs, require it). + Аппаратное управление потоком передачи данных +с использованием линий RTS и CTS RS-232, +применяется редко, но некоторые трансиверы имеют +его в качестве опции и немногие, в том числе +некоторые Kenwood, требуют этого управления. + + + + &Hardware + Аппаратное + + + + Special control of CAT port control lines. + Управление линиями DTR/RTS CAT порта, уровень + + + + + Force Control Lines + Управление линиями DTR/RTS CAT порта. + + + + + High + Высокий + + + + + Low + Низкий + + + + DTR: + + + + + RTS: + + + + + How this program activates the PTT on your radio? + Управление PTT + + + + PTT Method + Управление PTT + + + + <html><head/><body><p>No PTT activation, instead the radio's automatic VOX is used to key the transmitter.</p><p>Use this if you have no radio interface hardware.</p></body></html> + <html><head/><body><p>Для управления передатчиком используется автоматический VOX трансивера.</p><p>Используйте это, если у вас нет аппаратного радиоинтерфейса.</p> </тело></html> + + + + VO&X + + + + + <html><head/><body><p>Use the RS-232 DTR control line to toggle your radio's PTT, requires hardware to interface the line.</p><p>Some commercial interface units also use this method.</p><p>The DTR control line of the CAT serial port may be used for this or a DTR control line on a different serial port may be used.</p></body></html> + <html><head/><body><p>Используйте линию управления RS-232 DTR для переключения PTT вашего радио, требуется аппаратное обеспечение интерфейса линии.</p><p>Некоторые коммерческие интерфейсные устройства также используют этот метод. </p><p>Для этого можно использовать линию управления DTR последовательного порта CAT или линию управления DTR на другом последовательном порту.</p></body></html> + + + + &DTR + + + + + Some radios support PTT via CAT commands, +use this option if your radio supports it and you have no +other hardware interface for PTT. + Некоторые трансиверы поддерживают управление PTT +через команды CAT, используйте эту опцию, если Ваше +радио поддерживает ее и у Вас нет другого аппаратного +интерфейса для управления PTT. + + + + C&AT + + + + + <html><head/><body><p>Use the RS-232 RTS control line to toggle your radio's PTT, requires hardware to interface the line.</p><p>Some commercial interface units also use this method.</p><p>The RTS control line of the CAT serial port may be used for this or a RTS control line on a different serial port may be used. Note that this option is not available on the CAT serial port when hardware flow control is used.</p></body></html> + <html><head/><body><p>Используйте управляющую линию RTS COM порта для переключения PTT вашего трансивера. Для реализации данного метода требуется аппаратная поддержка (COM порт компьютера). +Некоторые коммерческие интерфейсы также используют этот метод. +Для этого может использоваться линия управления RTS последовательного порта CAT, или может использоваться линия управления RTS другого COM порта. Обратите внимание, что эта опция недоступна на последовательном порту CAT при использовании аппаратного управления потоком. </p></body></html> + + + + R&TS + + + + + <html><head/><body><p>Select the RS-232 serial port utilised for PTT control, this option is available when DTR or RTS is selected above as a transmit method.</p><p>This port can be the same one as the one used for CAT control.</p><p>For some interface types the special value CAT may be chosen, this is used for non-serial CAT interfaces that can control serial port control lines remotely (OmniRig for example).</p></body></html> + <html><head/><body><p>Выберите последовательный порт RS-232, используемый для управления PTT. Этот параметр доступен, когда в качестве метода передачи выбран DTR или RTS.</p><p>Этот порт может быть тем же, что и для управления CAT.</p><p>Для некоторых типов интерфейсов может быть выбрано специальное значение CAT, которое используется для непоследовательных интерфейсов CAT, которые могут удаленно управлять линиями управления последовательного порта ( OmniRig, например).</p></body></html + + + + Modulation mode selected on radio. + Режим модуляции, выбранный на трансивере. + + + + Mode + Режим + + + + <html><head/><body><p>USB is usually the correct modulation mode,</p><p>unless the radio has a special data or packet mode setting</p><p>for AFSK operation.</p></body></html> + <html><head/><body><p>Обычно режим USB является основным режимом модуляции,</p><p>если трансивер не имеет специального режима DATA или Packet</p><p>для работы AFSK.</p></body></html> + + + + US&B + + + + + Don't allow the program to set the radio mode +(not recommended but use if the wrong mode +or bandwidth is selected). + + + + + + None + Отключено + + + + If this is available then it is usually the correct mode for this program. + Если это доступно, то обычно это правильный режим для этой программы. + + + + Data/P&kt + + + + + Some radios can select the audio input using a CAT command, +this setting allows you to select which audio input will be used +(if it is available then generally the Rear/Data option is best). + Для некоторых трансиверов есть возможность выбора аудиовхода с помощью CAT команды, +если выбор доступен, то обычно лучше использовать параметр «Rear/Data». + + + + Transmit Audio Source + Подключение звуковой карты к трансиверу + + + + Rear&/Data + + + + + &Front/Mic + + + + + Rig: + Трансивер: + + + + Poll Interval: + Интервал опроса: + + + + <html><head/><body><p>Interval to poll rig for status. Longer intervals will mean that changes to the rig will take longer to be detected.</p></body></html> + <html><head/><body><p>Интервал для опроса состояния трансивера. Более длительные интервалы означают, что изменения в трансивере будут обнаружены дольше.</p></body></html> + + + + s + c + + + + <html><head/><body><p>Attempt to connect to the radio with these settings.</p><p>The button will turn green if the connection is successful or red if there is a problem.</p></body></html> + <html><head/><body><p>Попробуйте подключиться к трансиверу с этими настройками.</p><p>Кнопка станет зеленой, если подключение выполнено успешно, или красной, если возникла проблема.</ р></тело></html> + + + + Test CAT + Тест CAT + + + + Attempt to activate the transmitter. +Click again to deactivate. Normally no power should be +output since there is no audio being generated at this time. +Check that any Tx indication on your radio and/or your +radio interface behave as expected. + Попытайтесь активировать передатчик. +Нажмите еще раз, чтобы деактивировать. В норме мощность не должна быть +выход, так как в это время звук не генерируется. +Убедитесь, что любая индикация Tx на вашей радиостанции и/или на вашем +радиоинтерфейс ведет себя так, как ожидалось. + + + + Test PTT + Тест PTT + + + + Split Operation + Разнос частот VFO + + + + Fake It + + + + + Rig + Трансивер + + + + A&udio + Звук + + + + Audio interface settings + Настройки звуковой карты + + + + Souncard + Звуковая карта + + + + Soundcard + Звуковая карта + + + + Select the audio CODEC to use for transmitting. +If this is your default device for system sounds then +ensure that all system sounds are disabled otherwise +you will broadcast any systems sounds generated during +transmitting periods. + Выбор аудиокодека для передачи. +Если это звуковое устройство установлено +в операционной системе устройством по умолчанию, +то убедитесь, что все системные звуки отключены, +в противном случае Вы будете передавать в эфир +любые системные звуки, генерируемые во время + + + + <html><head/><body><p>Enter the service port number of the UDP server that WSJT-X should send updates to. If this is zero no updates will be sent.</p></body></html> + <html><head/><body><p>Введите номер порта службы UDP-сервера, на который WSJT-X должен отправлять обновления. Если это значение равно нулю, обновления отправляться не будут.</p></body></html> + + + + Outgoing interfaces: + Исходящие интерфейсы: + + + + <html><head/><body><p>When sending updates to a multicast group address it is necessary to specify which network interface(s) to send them to. If the loop-back interface is multicast capable then at least that one will be selected.</p><p>For most users the loop-back interface is all that is needed, that will allow multiple other applications on the same machine to interoperate with WSJT-X. If applications running on other hosts are to receive status updates then a suitable network interface should be used.</p><p>On some Linux systems it may be necessary to enable multicast on the loop-back network interface.</p></body></html> + <html><head/><body><p>При отправке обновлений на групповой адрес многоадресной рассылки необходимо указать, на какие сетевые интерфейсы их отправлять. Если интерфейс обратной связи поддерживает многоадресную рассылку, то будет выбран как минимум этот интерфейс.</p><p>Для большинства пользователей интерфейс обратной связи — это все, что нужно, что позволит нескольким другим приложениям на одном компьютере взаимодействовать с WSJT-X. Если приложения, работающие на других хостах, должны получать обновления статуса, следует использовать подходящий сетевой интерфейс.</p><p>В некоторых системах Linux может потребоваться включить многоадресную рассылку на сетевом интерфейсе обратной связи.</p> </тело></html> + + + + <html><head/><body><p>Sets the number or router hops that multicast datagrams are allowed to make. Almost everyone should set this to 1 to keep outgoing multicast traffic withn the local subnet.</p></body></html> + <html><head/><body><p>Sets the number or router hops that multicast datagrams are allowed to make. Almost everyone should set this to 1 to keep outgoing multicast traffic withn the local subnet.</p></body></html> + + + + Multicast TTL: + Многоадресный TTL: + + + + Days since last upload + Дней с момента последней загрузки + + + + Select the audio CODEC to use for receiving. + Выбор аудио кодека для приема. + + + + &Input: + Вход + + + + Select the channel to use for receiving. + Выбор канала для приема. + + + + + Mono + Моно + + + + + Left + Левый + + + + + Right + Правый + + + + + Both + Оба + + + + Select the audio channel used for transmission. +Unless you have multiple radios connected on different +channels; then you will usually want to select mono or +both here. + Выбор канала, используемого для передачи. +Обычно используется моно либо оба канала, +если у Вас несколько передатчиков то можно +использовать левый и правый каналы. + + + + Enable VHF and submode features + Включить функции VHF и подрежима + + + + Data bits + Бит данных + + + + Stop bits + Стоп бит + + + + Ou&tput: + Выход: + + + + + Save Directory + Сохранить папку + + + + Loc&ation: + Расположение: + + + + Path to which .WAV files are saved. + Путь для сохранения .WAV файлов. + + + + + TextLabel + + + + + Click to select a different save directory for .WAV files. + Нажмите, чтобы выбрать другue. папку для сохранения файлов .WAV. +Nazhmite, ch + + + + S&elect + Выбор + + + + + AzEl Directory + AzEl папка + + + + Location: + Расположение: + + + + Select + Выбор + + + + Power Memory By Band + Запомнить мощность по диапазонам + + + + Remember power settings by band + Запомнить уровень сигнала на передачу по диапазонам и видам излучения + + + + Enable power memory during transmit + Запомнить уровень звука при передаче сообщений + + + + Transmit + Передача сообщений + + + + Enable power memory during tuning + Запомнить уровень звука при настройке + + + + Tune + Настройка передатчика + + + + Tx &Macros + Tx макросы + + + + Canned free text messages setup + Настройка готовых свободных текстовых сообщений + + + + &Add + Добавить + + + + &Delete + Удалить + + + + Drag and drop items to rearrange order +Right click for item specific actions +Click, SHIFT+Click and, CRTL+Click to select items + Перетащите элементы, чтобы изменить порядок +Щелкните правой кнопкой мыши для определенных действий с элементом +Нажмите, SHIFT+щелчок и, CRTL+щелчок, чтобы выбрать элементы + + + + Reportin&g + Лог + + + + Reporting and logging settings + Настройка записи QSO в лог + + + + Logging + Внtсенние в лог + + + + The program will pop up a partially completed Log QSO dialog when you send a 73 or free text message. + Программа выведет частично заполненное диалоговое окно Log QSO, когда вы отправляете 73 или произвольное текстовое сообщение. + + + + Promp&t me to log QSO + Приглашение внести QSO в лог + + + + Op Call: + + + + + Some logging programs will not accept the type of reports +saved by this program. +Check this option to save the sent and received reports in the +comments field. + Некоторые логи не принимают рапорт в децибелах. +Эта опция позволяет сохранить отправленный +и полученный рапорт в поле комментариев. + + + + d&B reports to comments + Добавить рапорта дБ в комментарии + + + + Check this option to force the clearing of the DX Call +and DX Grid fields when a 73 or free text message is sent. + Установите этот флажок, чтобы принудительно очистить DX-вызов. +и поля DX Grid при отправке 73 или произвольного текстового сообщения. + + + + Clear &DX call and grid after logging + Очистить вызов DX и локатор после ввода в лог + + + + <html><head/><body><p>Some logging programs will not accept WSJT-X mode names.</p></body></html> + <html><head/><body><p>Некоторые программы логов не принимают виды режимов WSJT-X.</p></body></html> + + + + Con&vert mode to RTTY + Преобразовать моду в RTTY + + + + <html><head/><body><p>The callsign of the operator, if different from the station callsign.</p></body></html> + <html><head/><body><p>Позывной оператора, если он отличается от позывного станции.</p></body></html> + + + + <html><head/><body><p>Check to have QSOs logged automatically, when complete.</p></body></html> + <html><head/><body><p>Установите флажок, чтобы QSO регистрировались автоматически по завершении.</p></body></html> + + + + Log automatically (contesting only) + Автотматиическая запись в лог + + + + Network Services + Сетевой сервис + + + + <html><head/><body><p>The program can send your station details and all decoded signals with grid squares as spots to the http://pskreporter.info web site.</p><p>This is used for reverse beacon analysis which is very useful for assessing propagation and system performance.</p></body></html> + <html><head/><body><p>Программа может отправлять информацию о вашей станции и все декодированные сигналы с локаторами как спот на веб-сайт http://psreporter.info.</p><p>Это используется для анализа обратного маяка, который очень полезен для оценки распространения и производительности системы.</p></body></html> + + + + Enable &PSK Reporter Spotting + Отправлять споты +на сервер &PSK Reporter + + + + <html><head/><body><p>Check this option if a reliable connection is needed</p><p>Most users do not need this, the default uses UDP which is more efficient. Only check this if you have evidence that UDP traffic from you to PSK Reporter is being lost.</p></body></html> + <html><head/><body><p>Отметьте этот параметр, если требуется надежное соединение</p><p>Большинству пользователей это не нужно, по умолчанию используется более эффективный протокол UDP. Проверяйте это только в том случае, если у вас есть доказательства того, что трафик UDP от вас к PSK Reporter теряется.</p></body></html> + + + + Use TCP/IP connection + Использовать соединение TCP/IP + + + + UDP Server + UDP-сервер + + + + UDP Server: + UDP-сервер: + + + + <html><head/><body><p>Optional hostname of network service to receive decodes.</p><p>Formats:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">hostname</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv4 address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv6 address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv4 multicast group address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv6 multicast group address</li></ul><p>Clearing this field will disable the broadcasting of UDP status updates.</p></body></html> + <html><head/><body><p>Необязательное имя хоста сетевой службы для получения декодирования.</p><p>Форматы:</p><ul style="margin-top: 0px; margin-bottom: 0px; поле-слева: 0px; поле-справа: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin- справа:0px; -qt-block-indent:0; text-indent:0px;">имя хоста</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin -right:0px; -qt-block-indent:0; text-indent:0px;">IPv4-адрес</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px ; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv6-адрес</li><li style=" margin-top:0px; margin-bottom:0px; margin-left :0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">адрес многоадресной группы IPv4</li><li style=" margin-top:0px; margin-bottom:0px ; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Адрес многоадресной группы IPv6</li></ul><p>Очистка этого поля отключит широковещательная рассылка обновлений статуса UDP.</p ></body></html> + + + + UDP Server port number: + Номер порта UDP сервера: + + + + <html><head/><body><p>With this enabled WSJT-X will accept certain requests back from a UDP server that receives decode messages.</p></body></html> + <html><head/><body><p>Если эта функция включена, WSJT-X будет принимать определенные запросы от сервера UDP, который получает декодированные сообщения.</p></body></html> + + + + Accept UDP requests + Разрешить принимать UDP-запросы + + + + <html><head/><body><p>Indicate acceptance of an incoming UDP request. The effect of this option varies depending on the operating system and window manager, its intent is to notify the acceptance of an incoming UDP request even if this application is minimized or hidden.</p></body></html> + <html><head/><body><p>Указывает на принятие входящего запроса UDP. Действие этой опции зависит от операционной системы и оконного менеджера. Ее цель — уведомить о принятии входящего UDP-запроса, даже если это приложение свернуто или скрыто.</p></body></html> + + + + Notify on accepted UDP request + Уведомить о получении UDP запроса + + + + <html><head/><body><p>Restore the window from minimized if an UDP request is accepted.</p></body></html> + <html><head/><body><p>Восстановление окна из свернутого состояния, если принят запрос UDP.</p></body></html> + + + + Accepted UDP request restores window + Восстановить окно при получении UDP запроса + + + + Secondary UDP Server (deprecated) + Вторичный UDP-сервер (устарело) + + + + <html><head/><body><p>When checked, WSJT-X will broadcast a logged contact in ADIF format to the configured hostname and port. </p></body></html> + +<html><head/><body><p>Если этот флажок установлен, WSJT-X будет транслировать зарегистрированный контакт в формате ADIF на настроенное имя хоста и порт. </p></body></html> + + + + Enable logged contact ADIF broadcast + Разрешить передачу данных QSO в ADIF формате + + + + Server name or IP address: + Имя сервера или IP-адрес: + + + + <html><head/><body><p>Optional host name of N1MM Logger+ program to receive ADIF UDP broadcasts. This is usually 'localhost' or ip address 127.0.0.1</p><p>Formats:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">hostname</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv4 address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv6 address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv4 multicast group address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv6 multicast group address</li></ul><p>Clearing this field will disable broadcasting of ADIF information via UDP.</p></body></html> + <html><head/><body><p>Необязательное имя хоста программы N1MM Logger+ для приема широковещательных сообщений ADIF UDP. Обычно это «localhost» или IP-адрес 127.0.0.1</p><p>Форматы:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin- справа: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent :0; text-indent:0px;">hostname</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block- отступ:0; text-indent:0px;">IPv4-адрес</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt- block-indent:0; text-indent:0px;">IPv6-адрес</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; - qt-block-indent:0; text-indent:0px;">адрес многоадресной группы IPv4</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right :0px; -qt-block-indent:0; text-indent:0px;">Адрес многоадресной группы IPv6</li></ul><p>Очистка этого поля отключит широковещательную передачу информации ADIF через UDP.</p ></body></html> + + + + Server port number: + Номер порта сервера: + + + + <html><head/><body><p>Enter the port number that WSJT-X should use for UDP broadcasts of ADIF log information. For N1MM Logger+, this value should be 2333. If this is zero, no updates will be broadcast.</p></body></html> + <html><head/><body><p>Введите номер порта, который WSJT-X должен использовать для UDP-трансляций информации журнала ADIF. Для N1MM Logger+ это значение должно быть равно 2333. Если оно равно нулю, обновления не будут транслироваться.</p></body></html> + + + + Frequencies + Частоты + + + + Default frequencies and band specific station details setup + Частоты по умолчанию и настройка параметров станции для конкретных диапазонов + + + + <html><head/><body><p>See &quot;Frequency Calibration&quot; in the WSJT-X User Guide for details of how to determine these parameters for your radio.</p></body></html> + <html><head/><body><p>См. &quot;Калибровка частоты&quot;для получения подробной информации смотрите в Руководстве пользователя WSJT-X , как определить эти параметры для вашего nhfycbdthf.</p></body></html> + + + + Frequency Calibration + Калибровка по частоте + + + + Slope: + Наклон: + + + + ppm + + + + + Intercept: + Cмещение: + + + + Hz + Гц + + + + Working Frequencies + Рабочие частоты + + + + <html><head/><body><p>Right click to maintain the working frequencies list.</p></body></html> + <html><head/><body><p>Щелкните правой кнопкой мыши, чтобы сохранить список рабочих частот.</p></body></html> + + + + Station Information + Информация о станции + + + + Items may be edited. +Right click for insert and delete options. + Информация для отображения +на сайте pskreporter.info +Элементы могут быть отредактированы. +Используйте правую кнопку мыши +для добавления/удаления строк. + + + + Colors + Цвета + + + + Decode Highlightling + Выделение цветом декодированных сообщений + + + + <html><head/><body><p>Click to scan the wsjtx_log.adi ADIF file again for worked before information</p></body></html> + <html><head/><body><p>Нажмите, чтобы снова просмотреть ADIF-файл wsjtx_log.adi на предмет обработанной ранее информации</p></body></html> + + + + Rescan ADIF Log + Пересканировать ADIF лог + + + + <html><head/><body><p>Push to reset all highlight items above to default values and priorities.</p></body></html> + <html><head/><body><p>Нажмите, чтобы сбросить все выделенные выше элементы до значений и приоритетов по умолчанию.</p></body></html> + + + + Reset Highlighting + Сбросить выделение + + + + <html><head/><body><p>Enable or disable using the check boxes and right-click an item to change or unset the foreground color, background color, or reset the item to default values. Drag and drop the items to change their priority, higher in the list is higher in priority.</p><p>Note that each foreground or background color may be either set or unset, unset means that it is not allocated for that item's type and lower priority items may apply.</p></body></html> + <html><head/><body><p>Включите или отключите с помощью флажков и щелкните элемент правой кнопкой мыши, чтобы изменить или отключить цвет переднего плана, цвет фона или восстановить значения элемента по умолчанию. Перетащите элементы, чтобы изменить их приоритет. Чем выше в списке, тем выше приоритет.</p><p>Обратите внимание, что каждый цвет переднего плана или фона может быть либо установлен, либо не установлен. Не установлен означает, что он не назначен для этого элемента. могут применяться элементы типа и более низкого приоритета.</p></body></html> + + + + <html><head/><body><p>Check to indicate new DXCC entities, grid squares, and callsigns per mode.</p></body></html> + <html><head/><body><p>Отметьте, чтобы указать новые объекты DXCC, локаторы и позывные для каждого режима.</p></body></html> + + + + Highlight by Mode + Выделение по режимам + + + + Include extra WAE entities + Включить дополнительные объекты WAE + + + + Check to for grid highlighting to only apply to unworked grid fields + Отметьте, чтобы подсветка локатора применялась только к необработанным полям локатора. + + + + Only grid Fields sought + Искомые поля только в локаторе + + + + <html><head/><body><p>Controls for Logbook of the World user lookup.</p></body></html> + <html><head/><body><p>Элементы управления поиском пользователей в LotW.</p></body></html> + + + + Logbook of the World User Validation + Мировой лог LotW + + + + Users CSV file URL: + + + + + <html><head/><body><p>URL of the ARRL LotW user's last upload dates and times data file which is used to highlight decodes from stations that are known to upload their log file to LotW.</p></body></html> + <html><head/><body><p>URL файла данных о датах и ​​времени последней загрузки пользователя ARRL LotW, который используется для выделения декодирования со станций, которые, как известно, загружают свой файл журнала в LotW.</p>< /тело></html> + + + + URL + + + + + https://lotw.arrl.org/lotw-user-activity.csv + + + + + <html><head/><body><p>Push this button to fetch the latest LotW user's upload date and time data file.</p></body></html> + <html><head/><body><p>Нажмите эту кнопку, чтобы получить последний файл данных о дате и времени загрузки пользователя LotW.</p></body></html> + + + + Fetch Now + Скачать сейчас + + + + Age of last upload less than: + Файл CSV загружен не ранее: + + + + <html><head/><body><p>Adjust this spin box to set the age threshold of LotW user's last upload date that is accepted as a current LotW user.</p></body></html> + <html><head/><body><p>Настройте этот счетчик, чтобы установить дату последней загрузки пользователя LotW, которая принимается в качестве текущего пользователя LotW.</p></body></html> + + + + days + день (дня) (дней) + + + + Advanced + Расш. + + + + <html><head/><body><p>User-selectable parameters for JT65 VHF/UHF/Microwave decoding.</p></body></html> + <html><head/><body><p>Выбираемые пользователем параметры для декодирования JT65 VHF/UHF/Microwave.</p></body></html> + + + + JT65 VHF/UHF/Microwave decoding parameters + Параметры декодирования JT65 VHF/UHF/СВЧ + + + + Random erasure patterns: + Выбранные стили декодера: + + + + <html><head/><body><p>Maximum number of erasure patterns for stochastic soft-decision Reed Solomon decoder is 10^(n/2).</p></body></html> + <html><head/><body><p>Максимальное количество шаблонов стирания для стохастического декодера Рида-Соломона с мягким решением – 10^(n/2).</p></body></html> + + + + Aggressive decoding level: + Уровень агрессивного декодирования: + + + + <html><head/><body><p>Higher levels will increase the probability of decoding, but will also increase probability of a false decode.</p></body></html> + <html><head/><body><p>Более высокие уровни увеличивают вероятность декодирования, но также увеличивают вероятность ложного декодирования.</p></body></html> + + + + Two-pass decoding + Двухпроходное декодирование + + + + Special operating activity: Generation of FT4, FT8, and MSK144 messages + Специальная оперативная деятельность: Генерация сообщений FT4, FT8 и MSK144. + + + + <html><head/><body><p>FT8 DXpedition mode: Hound operator calling the DX.</p></body></html> + <html><head/><body><p>Режим DX-экспедиции FT8: оператор Hound, вызывающий DX.</p></body></html> + + + + + Hound + + + + + <html><head/><body><p>North American VHF/UHF/Microwave contests and others in which a 4-character grid locator is the required exchange.</p></body></html> + <html><head/><body><p>Североамериканские соревнования VHF/UHF/Microwave и другие, в которых требуется обмен 4-символьным локатором.</p></body></html> + + + + + NA VHF Contest + + + + + <html><head/><body><p>FT8 DXpedition mode: Fox (DXpedition) operator.</p></body></html> + <html><head/><body><p>Режим DX-экспедиции FT8: оператор Fox (DX-экспедиция).</p></body></html> + + + + + Fox + + + + + <html><head/><body><p>European VHF+ contests requiring a signal report, serial number, and 6-character locator.</p></body></html> + <html><head/><body><p>Европейские соревнования VHF+, в качестве контрольного номера требующие уровень сигнала, серийного номера и 6-значного локатора.</p></body></html> + + + + + EU VHF Contest + + + + + + <html><head/><body><p>ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html> + <html><head/><body><p>ARRL RTTY Roundup и подобные конкурсы. Обмен — это штат США, провинция Канады или &quot;DX&quot;.</p></body></html> + + + + R T T Y Roundup + + + + + RTTY Roundup messages + + + + + RTTY Roundup exchange + Обмен RTTY Roundup + + + + RTTY RU Exch: + + + + + NJ + + + + + + <html><head/><body><p>ARRL Field Day exchange: number of transmitters, Class, and ARRL/RAC section or &quot;DX&quot;.</p></body></html> + <html><head/><body><p>Обмен ARRL Field Day: количество передатчиков, секция ARRL/RAC или &quot;DX&quot;.</p></body></html> + + + + A R R L Field Day + + + + + ARRL Field Day + + + + + Field Day exchange + + + + + FD Exch: + + + + + 6A SNJ + + + + + <html><head/><body><p>World-Wide Digi-mode contest</p><p><br/></p></body></html> + + + + + WW Digital Contest + + + + + WW Digi Contest + + + + + Miscellaneous + Разное + + + + Degrade S/N of .wav file: + Ухудшить S/N .wav файла + + + + + For offline sensitivity tests + Для автономных тестов чувствительности + + + + dB + дБ + + + + Receiver bandwidth: + Полоса пропускания приемника + + + + Hz + Гц + + + + Tx delay: + Задержка передачи: + + + + Minimum delay between assertion of PTT and start of Tx audio. + Минимальная задержка между включением PTT +и подачей звукового сигнала. Используется для +защиты контактов выходного реле передатчика +от 'горячего' включения. + + + + s + c + + + + + Tone spacing + Расстояние между тонами + + + + <html><head/><body><p>Generate Tx audio with twice the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-2 before generating RF.</p></body></html> + <html><head/><body><p>Создайте звук Tx с удвоенным расстоянием между тонами. Предназначен для специальных передатчиков НЧ/СЧ, которые перед генерацией РЧ используют деление на 2.</p></body></html> + + + + x 2 + + + + + <html><head/><body><p>Generate Tx audio with four times the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-4 before generating RF.</p></body></html> + <html><head/><body><p>Создайте Tx с четырехкратным интервалом между тонами. Предназначен для специальных передатчиков НЧ/СЧ, которые перед генерацией РЧ используют деление на 4.</p></body></html> + + + + x 4 + + + + + + Waterfall spectra + Спектр водопада + + + + Low sidelobes + Малый уровень + + + + Most sensitive + Самый чувствительный + + + + <html><head/><body><p>Discard (Cancel) or apply (OK) configuration changes including</p><p>resetting the radio interface and applying any soundcard changes</p></body></html> + <html><head/><body><p>Отменить (Cancel) или применить (OK) изменения конфигурации, включая</p><p>сброс радиоинтерфейса и применение любых изменений звуковой карты</p></body>< /html> + + + + main + + + Failed to create a temporary directory + Не удалось создать временную папку + + + + + Path: "%1" + Путь: "%1" + + + + Failed to create a usable temporary directory + +Не удалось создать пригодный для использования временную папку + + + + Another application may be locking the directory + Другое приложение может блокировать папку + + + + Failed to create data directory + Не удалось создать папкуг данных + + + + path: "%1" + путь: "%1" + + + + Shared memory error + Ошибка общей памяти + + + + Unable to create shared memory segment + Не удалось создать сегмент общей памяти + + + + Sub-process error + Ошибка подпроцесса + + + + Failed to close orphaned jt9 process + Не удалось закрыть потерянный процесс jt9 + + + + wf_palette_design_dialog + + + Palette Designer + Дизайнер палитры + + + + <html><head/><body><p>Double click a color to edit it.</p><p>Right click to insert or delete colors.</p><p>Colors at the top represent weak signals</p><p>and colors at the bottom represent strong</p><p>signals. You can have up to 256 colors.</p></body></html> + <html><head/><body><p>Дважды щелкните цвет, чтобы отредактировать его.</p><p>Щелкните правой кнопкой мыши , чтобы вставлять или удалять цвета.</p><p>Цвета в верхней части представляют слабые сигналы. и цвета внизу сильные.</p><p>Вы можете использовать до 256 цветов.</p></body></html> + + + From 76a1dd3c44b4db71163629c7f9a8aaef72a18c52 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 26 Jan 2022 10:05:49 -0500 Subject: [PATCH 54/74] Add Russian (ru) to the list of available user-interface languages. --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b51c4037..c855a97cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1260,6 +1260,7 @@ set (LANGUAGES ja # Japanese #no # Norwegian #pt # Portuguese + ru # Russian #sv # Swedish zh # Chinese zh_HK # Chinese per Hong Kong From fd6ebff4d94c0a1a33993c5e28d0c35b7c37784c Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 26 Jan 2022 10:21:19 -0500 Subject: [PATCH 55/74] Better User Guide instructions for starting WSJT-X with interface in a different language. --- doc/user_guide/en/intro_subsections.adoc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/user_guide/en/intro_subsections.adoc b/doc/user_guide/en/intro_subsections.adoc index 9b8cbe2bd..0ae17dafd 100644 --- a/doc/user_guide/en/intro_subsections.adoc +++ b/doc/user_guide/en/intro_subsections.adoc @@ -26,7 +26,10 @@ The _WSJT-X_ user interface (UI) is now available in many languages. When a translated UI is available for the computer's default System Language, it will appear automatically on program startup. The UI language may be overridden if desired by starting _WSJT-X_ with a -command line option. +command line option. For example, to start _WSJT-X_ with its user +interface in Spanish, enter this command at the prompt: + + +`wsjtx --language es` === How You Can Contribute From 5118e64fde9cffff7442c69c33a9b27c10752a07 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Wed, 26 Jan 2022 18:29:08 +0100 Subject: [PATCH 56/74] Repair a defect where Auto Seq failed for messages with apriori code. --- widgets/mainwindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 74fc157a2..4ffc5c072 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -8004,6 +8004,7 @@ void MainWindow::p1ReadFromStdout() //p1readFromStdout } else { int n=t.length(); + t=t.left(85); // truncate any apriori code t=t.mid(0,n-2) + " "; t.remove(QRegExp("\\s+$")); QStringList rxFields = t.split(QRegExp("\\s+")); From d3020efdefc82c3f7786811c878299b6d150f4ad Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 27 Jan 2022 10:19:14 -0500 Subject: [PATCH 57/74] Remove prototype declaration for a function no longer used. --- widgets/mainwindow.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 4ffc5c072..4a7c89bf9 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -147,8 +147,6 @@ extern "C" { void morse_(char* msg, int* icw, int* ncw, fortran_charlen_t); - int ptt_(int nport, int ntx, int* iptt, int* nopen); - void wspr_downsample_(short int d2[], int* k); int savec2_(char const * fname, int* TR_seconds, double* dial_freq, fortran_charlen_t); From 1ca81f46102247a7455253f486a9f62f87140c32 Mon Sep 17 00:00:00 2001 From: Steven Franke Date: Thu, 27 Jan 2022 09:23:00 -0600 Subject: [PATCH 58/74] Revert "Repair a defect where Auto Seq failed for messages with apriori code." This reverts commit 5118e64fde9cffff7442c69c33a9b27c10752a07. --- widgets/mainwindow.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 4ffc5c072..74fc157a2 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -8004,7 +8004,6 @@ void MainWindow::p1ReadFromStdout() //p1readFromStdout } else { int n=t.length(); - t=t.left(85); // truncate any apriori code t=t.mid(0,n-2) + " "; t.remove(QRegExp("\\s+$")); QStringList rxFields = t.split(QRegExp("\\s+")); From 78cd7824ae6ca89467e926a42843527c1fc5ee45 Mon Sep 17 00:00:00 2001 From: Steven Franke Date: Thu, 27 Jan 2022 09:23:32 -0600 Subject: [PATCH 59/74] Fix the failure to auto-sequence when a decode contains a low-confidence a-priori designator, such as "? a3". --- Decoder/decodedtext.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Decoder/decodedtext.cpp b/Decoder/decodedtext.cpp index e65d34bd8..3c684f824 100644 --- a/Decoder/decodedtext.cpp +++ b/Decoder/decodedtext.cpp @@ -60,6 +60,8 @@ DecodedText::DecodedText (QString const& the_string) // qDebug () << "DecodedText: the_string:" << the_string << "Nbsp pos:" << the_string.indexOf (QChar::Nbsp); if (message_.length() >= 1) { +// remove appended confidence (?) and ap designators before truncating the message + message_ = clean_string_.mid (column_qsoText + padding_).trimmed (); message0_ = message_.left(37); message_ = message_.left(37).remove (QRegularExpression {"[<>]"}); int i1 = message_.indexOf ('\r'); From 56414dda3081cb9fd1906c1431e7426afdc3beb8 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 27 Jan 2022 10:55:19 -0500 Subject: [PATCH 60/74] Remove jtmsg.f90 from CMakeLists.txt, it's no longer used. --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c855a97cf..cadcf9c80 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -461,7 +461,6 @@ set (wsjt_FSRCS lib/inter_wspr.f90 lib/jplsubs.f lib/jt9fano.f90 - lib/jtmsg.f90 lib/libration.f90 lib/lorentzian.f90 lib/fst4/lorentzian_fading.f90 From d023c80109aeac543b186dfa7641df9e2331c44a Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 27 Jan 2022 10:58:04 -0500 Subject: [PATCH 61/74] Fix all calls from GUI to Fortran with hidden string-length arguments. --- widgets/mainwindow.cpp | 65 ++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 4a7c89bf9..32f23b41a 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -90,6 +90,8 @@ #include "ui_mainwindow.h" #include "moc_mainwindow.cpp" +#define FCL fortran_charlen_t + extern "C" { //----------------------------------------------------- C and Fortran routines void symspec_(struct dec_data *, int* k, double* trperiod, int* nsps, int* ingain, @@ -168,8 +170,6 @@ extern "C" { void freqcal_(short d2[], int* k, int* nkhz,int* noffset, int* ntol, char line[], fortran_charlen_t); - void fix_contest_msg_(char* MyGrid, char* msg, fortran_charlen_t, fortran_charlen_t); - void calibrate_(char const * data_dir, int* iz, double* a, double* b, double* rms, double* sigmaa, double* sigmab, int* irc, fortran_charlen_t); @@ -177,13 +177,9 @@ extern "C" { void plotsave_(float swide[], int* m_w , int* m_h1, int* irow); - void chkcall_(char* w, char* basc_call, bool cok, int len1, int len2); - - void get_ft4msg_(int* idecode, char* line, int len); - void chk_samples_(int* m_ihsym,int* k, int* m_hsymStop); - void save_dxbase_(char* dxbase, int len); + void save_dxbase_(char* dxbase, FCL len); } int volatile itone[MAX_NUM_SYMBOLS]; //Audio tones for all Tx symbols @@ -958,7 +954,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, ui->txFirstCheckBox->setChecked(m_txFirst); morse_(const_cast (m_config.my_callsign ().toLatin1().constData()), - const_cast (icw), &m_ncw, m_config.my_callsign ().length()); + const_cast (icw), &m_ncw, (FCL)m_config.my_callsign().length()); on_actionWide_Waterfall_triggered(); ui->cbShMsgs->setChecked(m_bShMsgs); ui->cbSWL->setChecked(m_bSWL); @@ -1452,7 +1448,7 @@ void MainWindow::dataSink(qint64 frames) m_bUseRef=m_wideGraph->useRef(); if(!m_diskData) { refspectrum_(&dec_data.d2[k-m_nsps/2],&m_bClearRefSpec,&m_bRefSpec, - &m_bUseRef, fname.constData (), fname.size ()); + &m_bUseRef, fname.constData (), (FCL)fname.size ()); } m_bClearRefSpec=false; @@ -1492,7 +1488,7 @@ void MainWindow::dataSink(qint64 frames) int RxFreq=ui->RxFreqSpinBox->value (); int nkhz=(m_freqNominal+RxFreq)/1000; int ftol = ui->sbFtol->value (); - freqcal_(&dec_data.d2[0],&k,&nkhz,&RxFreq,&ftol,&line[0],80); + freqcal_(&dec_data.d2[0], &k, &nkhz, &RxFreq, &ftol, &line[0], (FCL)80); QString t=QString::fromLatin1(line); DecodedText decodedtext {t}; ui->decodedTextBrowser->displayDecodedText (decodedtext, m_config.my_callsign (), m_mode, m_config.DXCC (), @@ -1611,7 +1607,7 @@ void MainWindow::dataSink(qint64 frames) int nsec=120; int nbfo=1500; double f0m1500=m_freqNominal/1000000.0 + nbfo - 1500; - int err = savec2_(c2name.constData (),&nsec,&f0m1500, c2name.size ()); + int err = savec2_(c2name.constData (),&nsec,&f0m1500, (FCL)c2name.size()); if (err!=0) MessageBox::warning_message (this, tr ("Error saving c2 file"), c2name); } } @@ -1732,9 +1728,10 @@ void MainWindow::fastSink(qint64 frames) float rmsNoGain = 0; int ftol = ui->sbFtol->value (); hspec_(dec_data.d2,&k,&nutc0,&nTRpDepth,&RxFreq,&ftol,&bmsk144, - &m_bTrain,m_phaseEqCoefficients.constData(),&m_inGain,&dec_data.params.mycall[0], - &dec_data.params.hiscall[0],&bshmsg,&bswl, - data_dir.constData (),fast_green,fast_s,&fast_jh,&pxmax,&rmsNoGain,&line[0],12,12,data_dir.size (),80); + &m_bTrain,m_phaseEqCoefficients.constData(),&m_inGain,&dec_data.params.mycall[0], + &dec_data.params.hiscall[0],&bshmsg,&bswl, + data_dir.constData (),fast_green,fast_s,&fast_jh,&pxmax,&rmsNoGain,&line[0],(FCL)12, + (FCL)12,(FCL)data_dir.size (),(FCL)80); float px = fast_green[fast_jh]; QString t; t = t.asprintf(" Rx noise: %5.1f ",px); @@ -1836,7 +1833,7 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog m_baseCall = Radio::base_callsign (m_config.my_callsign ()); ui->tx1->setEnabled (elide_tx1_not_allowed () || ui->tx1->isEnabled ()); morse_(const_cast (m_config.my_callsign ().toLatin1().constData()), - const_cast (icw), &m_ncw, m_config.my_callsign ().length()); + const_cast (icw), &m_ncw, (FCL)m_config.my_callsign().length()); } if (m_config.my_callsign () != callsign || m_config.my_grid () != my_grid) { statusUpdate (); @@ -2549,7 +2546,7 @@ void MainWindow::on_actionSolve_FreqCal_triggered() auto data_dir {QDir::toNativeSeparators(m_config.writeable_data_dir().absolutePath()).toLocal8Bit ()}; int iz,irc; double a,b,rms,sigmaa,sigmab; - calibrate_(data_dir.constData (),&iz,&a,&b,&rms,&sigmaa,&sigmab,&irc,data_dir.size ()); + calibrate_(data_dir.constData(), &iz, &a, &b, &rms, &sigmaa, &sigmab, &irc, (FCL)data_dir.size()); QString t2; if(irc==-1) t2="Cannot open " + data_dir + "/fmt.all"; if(irc==-2) t2="Cannot open " + data_dir + "/fcal2.out"; @@ -2594,7 +2591,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, FST4, FT8, " "JT4, JT6M, JT9, JT65, JTMS, QRA64, Q65, MSK144 are Copyright (C) " - "2001-2021 by one or more of the following authors: Joseph Taylor, " + "2001-2022 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.\""); @@ -3223,9 +3220,9 @@ void MainWindow::decode() //decode() narg[13]=-1; narg[14]=m_config.aggressive(); memcpy(d2b,dec_data.d2,2*360000); - watcher3.setFuture (QtConcurrent::run (std::bind (fast_decode_,&d2b[0], - &narg[0],&m_TRperiod,&m_msg[0][0], - dec_data.params.mycall,dec_data.params.hiscall,8000,12,12))); + watcher3.setFuture (QtConcurrent::run (std::bind (fast_decode_, &d2b[0], + &narg[0],&m_TRperiod, &m_msg[0][0], dec_data.params.mycall, + dec_data.params.hiscall, (FCL)8000, (FCL)12, (FCL)12))); } else { mem_jt9->lock (); memcpy(to, from, qMin(mem_jt9->size(), size)); @@ -4041,18 +4038,18 @@ void MainWindow::guiUpdate() if(m_QSOProgress==REPORT || m_QSOProgress==ROGER_REPORT) m_bSentReport=true; if(m_bSentReport and (m_QSOProgressROGER_REPORT)) m_bSentReport=false; if(m_mode=="JT4") gen4_(message, &ichk , msgsent, const_cast (itone), - &m_currentMessageType, 22, 22); + &m_currentMessageType, (FCL)22, (FCL)22); if(m_mode=="JT9") gen9_(message, &ichk, msgsent, const_cast (itone), - &m_currentMessageType, 22, 22); + &m_currentMessageType, (FCL)22, (FCL)22); if(m_mode=="JT65") gen65_(message, &ichk, msgsent, const_cast (itone), - &m_currentMessageType, 22, 22); + &m_currentMessageType, (FCL)22, (FCL)22); if(m_mode=="WSPR") genwspr_(message, msgsent, const_cast (itone), - 22, 22); + (FCL)22, (FCL)22); if(m_mode=="MSK144" or m_mode=="FT8" or m_mode=="FT4" or m_mode=="FST4" or m_mode=="FST4W" || "Q65" == m_mode) { if(m_mode=="MSK144") { genmsk_128_90_(message, &ichk, msgsent, const_cast (itone), - &m_currentMessageType, 37, 37); + &m_currentMessageType, (FCL)37, (FCL)37); if(m_restart) { int nsym=144; if(itone[40]==-40) nsym=40; @@ -4068,7 +4065,7 @@ void MainWindow::guiUpdate() int n3=0; char ft8msgbits[77]; genft8_(message, &i3, &n3, msgsent, const_cast (ft8msgbits), - const_cast (itone), 37, 37); + const_cast (itone), (FCL)37, (FCL)37); int nsym=79; int nsps=4*1920; float fsample=48000.0; @@ -4095,7 +4092,7 @@ void MainWindow::guiUpdate() int ichk=0; char ft4msgbits[77]; genft4_(message, &ichk, msgsent, const_cast (ft4msgbits), - const_cast(itone), 37, 37); + const_cast(itone), (FCL)37, (FCL)37); int nsym=103; int nsps=4*576; float fsample=48000.0; @@ -4117,7 +4114,7 @@ void MainWindow::guiUpdate() ba2msg(ba,message); } genfst4_(message,&ichk,msgsent,const_cast (fst4msgbits), - const_cast(itone), &iwspr, 37, 37); + const_cast(itone), &iwspr, (FCL)37, (FCL)37); int hmod=1; if(m_config.x2ToneSpacing()) hmod=2; if(m_config.x4ToneSpacing()) hmod=4; @@ -4144,7 +4141,7 @@ void MainWindow::guiUpdate() if(m_mode=="Q65") { int i3=-1; int n3=-1; - genq65_(message,&ichk,msgsent,const_cast(itone),&i3,&n3,37,37); + genq65_(message, &ichk,msgsent, const_cast(itone), &i3, &n3, (FCL)37, (FCL)37); int nsps=1800; if(m_TRperiod==30) nsps=3600; if(m_TRperiod==60) nsps=7200; @@ -5396,7 +5393,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional) auto is_type_one = !is77BitMode () && is_compound && shortList (my_callsign); auto const& my_grid = m_config.my_grid ().left (4); auto const& hisBase = Radio::base_callsign (hisCall); - save_dxbase_(const_cast ((hisBase + " ").left (6).toLatin1().constData()),6); + save_dxbase_(const_cast ((hisBase + " ").left(6).toLatin1().constData()), (FCL)6); auto eme_short_codes = m_config.enable_VHF_features () && ui->cbShMsgs->isChecked () && m_mode == "JT65"; @@ -5783,7 +5780,7 @@ void MainWindow::msgtype(QString t, QLineEdit* tx) //msgtype() QByteArray s=t.toUpper().toLocal8Bit(); ba2msg(s,message); int ichk=1,itype=0; - gen65_(message,&ichk,msgsent,const_cast(itone0),&itype,22,22); + gen65_(message, &ichk,msgsent, const_cast(itone0), &itype, (FCL)22, (FCL)22); msgsent[22]=0; bool text=false; bool shortMsg=false; @@ -5881,7 +5878,7 @@ void MainWindow::on_dxCallEntry_textChanged (QString const& call) void MainWindow::on_dxCallEntry_editingFinished() { auto const& dxBase = Radio::base_callsign (m_hisCall); - save_dxbase_(const_cast ((dxBase + " ").left (6).toLatin1().constData()),6); + save_dxbase_(const_cast ((dxBase + " ").left (6).toLatin1().constData()), (FCL)6); } @@ -5902,7 +5899,7 @@ void MainWindow::on_dxGridEntry_textChanged (QString const& grid) int nAz,nEl,nDmiles,nDkm,nHotAz,nHotABetter; azdist_(const_cast ((m_config.my_grid () + " ").left (6).toLatin1().constData()), const_cast ((m_hisGrid + " ").left (6).toLatin1().constData()),&utch, - &nAz,&nEl,&nDmiles,&nDkm,&nHotAz,&nHotABetter,6,6); + &nAz,&nEl,&nDmiles,&nDkm,&nHotAz,&nHotABetter,(FCL)6,(FCL)6); QString t; int nd=nDkm; if(m_config.miles()) nd=nDmiles; @@ -8039,7 +8036,7 @@ void MainWindow::p1ReadFromStdout() //p1readFromStdout int nAz,nEl,nDmiles,nDkm,nHotAz,nHotABetter; azdist_(const_cast ((m_config.my_grid () + " ").left (6).toLatin1 ().constData ()), const_cast ((grid + " ").left (6).toLatin1 ().constData ()),&utch, - &nAz,&nEl,&nDmiles,&nDkm,&nHotAz,&nHotABetter,6,6); + &nAz,&nEl,&nDmiles,&nDkm,&nHotAz,&nHotABetter,(FCL)6,(FCL)6); QString t1; if(m_config.miles()) { t1 = t1.asprintf("%7d",nDmiles); From 5b97226b33951804d4a51f01eaf0bda7bc84a882 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 27 Jan 2022 15:00:00 -0500 Subject: [PATCH 62/74] Reinstate the cmake option for WSJT_QDEBUG_IN_RELEASE. I like having it. --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cadcf9c80..dc86126c6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,7 +126,8 @@ option (WSJT_GENERATE_DOCS "Generate documentation files." ON) option (WSJT_RIG_NONE_CAN_SPLIT "Allow split operation with \"None\" as rig.") option (WSJT_TRACE_UDP "Debugging option that turns on UDP message protocol diagnostics.") option (WSJT_BUILD_UTILS "Build simulators and code demonstrators." ON) - +CMAKE_DEPENDENT_OPTION (WSJT_QDEBUG_IN_RELEASE "Leave Qt debugging statements in Release configuration." OFF + "NOT is_debug_build" OFF) CMAKE_DEPENDENT_OPTION (WSJT_ENABLE_EXPERIMENTAL_FEATURES "Enable features not fully ready for public releases." ON is_debug_build OFF) CMAKE_DEPENDENT_OPTION (WSJT_CREATE_WINMAIN From 22b580af56dce474b3217a3e45165ecdb791c533 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Sun, 30 Jan 2022 17:40:26 +0100 Subject: [PATCH 63/74] Use the sixth mode button for JT65 instead of FST4. --- widgets/mainwindow.cpp | 6 ++---- widgets/mainwindow.h | 2 +- widgets/mainwindow.ui | 6 +++--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 41edc1795..8d1cc4c85 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -9515,14 +9515,12 @@ void MainWindow::on_q65Button_clicked() ui->houndButton->setStyleSheet(""); m_config.setSpecial_None(); on_actionQ65_triggered(); -// ui->sbTR->setValue (m_settings->value ("TRPeriod", 30).toInt()); // set default TRPeriod to 30s } -void MainWindow::on_fst4Button_clicked() +void MainWindow::on_jt65Button_clicked() { ui->houndButton->setChecked(false); ui->houndButton->setStyleSheet(""); m_config.setSpecial_None(); - on_actionFST4_triggered(); -// ui->sbTR->setValue (m_settings->value ("TRPeriod", 60).toInt()); // set default TRPeriod to 60s + on_actionJT65_triggered(); } diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 553577fe2..2fda134bb 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -146,7 +146,7 @@ private slots: void on_ft4Button_clicked(); void on_msk144Button_clicked(); void on_q65Button_clicked(); - void on_fst4Button_clicked(); + void on_jt65Button_clicked(); void on_tx1_editingFinished(); void on_tx2_editingFinished(); void on_tx3_editingFinished(); diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index ce38d9c6c..b738dd2bf 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -2946,7 +2946,7 @@ QLabel[oob="true"] { - + 32 @@ -2954,10 +2954,10 @@ QLabel[oob="true"] { - Switch to FST4 mode + Switch to JT65 mode - FST4 + JT65 From cab1bb8aed77efb6d637cb54b0c60c5c92317693 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 31 Jan 2022 19:18:46 -0500 Subject: [PATCH 64/74] Use BIND(C) for gen65.f90, and pass strings in/out as character*1 arrays. Please test on macOS! --- lib/gen65.f90 | 16 +++++++++++++--- widgets/mainwindow.cpp | 9 ++++----- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/lib/gen65.f90 b/lib/gen65.f90 index af036c2a9..2fd6495a7 100644 --- a/lib/gen65.f90 +++ b/lib/gen65.f90 @@ -1,9 +1,10 @@ -subroutine gen65(msg0,ichk,msgsent,itone,itype) +subroutine gen65(msg00,ichk,msgsent0,itone,itype) BIND(c) ! Encodes a JT65 message to yieild itone(1:126) ! Temporarily, does not implement EME shorthands use packjt + character*1 msg00(23),msgsent0(23) character*22 msg0 character*22 message !Message to be generated character*22 msgsent !Message as it will be received @@ -21,6 +22,10 @@ subroutine gen65(msg0,ichk,msgsent,itone,itype) 1,1,1,1,1,1/ save + do i=1,22 + msg0(i:i)=msg00(i) + enddo + if(msg0(1:1).eq.'@') then read(msg0(2:5),*,end=1,err=1) nfreq go to 2 @@ -48,7 +53,7 @@ subroutine gen65(msg0,ichk,msgsent,itone,itype) call unpackmsg(dgen,msgsent) !Unpack to get message sent msgsent(20:22)=cok call fmtmsg(msgsent,iz) - if(ichk.ne.0) go to 999 !Return if checking only + if(ichk.ne.0) go to 900 !Return if checking only call rs_encode(dgen,sent) !Apply Reed-Solomon code call interleave63(sent,1) !Apply interleaving @@ -79,5 +84,10 @@ subroutine gen65(msg0,ichk,msgsent,itone,itype) endif endif -999 return +900 do i=1,22 + msgsent0(i)=msgsent(i:i) + enddo + msgsent0(23)=char(0) + + return end subroutine gen65 diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 8d1cc4c85..04ed1539e 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -135,8 +135,7 @@ extern "C" { void genmsk_128_90_(char* msg, int* ichk, char* msgsent, int itone[], int* itype, fortran_charlen_t, fortran_charlen_t); - void gen65_(char* msg, int* ichk, char* msgsent, int itone[], - int* itext, fortran_charlen_t, fortran_charlen_t); + void gen65(char* msg, int* ichk, char msgsent[], int itone[], int* itext); void genq65_(char* msg, int* ichk, char* msgsent, int itone[], int* i3, int* n3, fortran_charlen_t, fortran_charlen_t); @@ -4041,8 +4040,8 @@ void MainWindow::guiUpdate() &m_currentMessageType, (FCL)22, (FCL)22); if(m_mode=="JT9") gen9_(message, &ichk, msgsent, const_cast (itone), &m_currentMessageType, (FCL)22, (FCL)22); - if(m_mode=="JT65") gen65_(message, &ichk, msgsent, const_cast (itone), - &m_currentMessageType, (FCL)22, (FCL)22); + if(m_mode=="JT65") gen65(message, &ichk, msgsent, const_cast (itone), + &m_currentMessageType); if(m_mode=="WSPR") genwspr_(message, msgsent, const_cast (itone), (FCL)22, (FCL)22); if(m_mode=="MSK144" or m_mode=="FT8" or m_mode=="FT4" @@ -5780,7 +5779,7 @@ void MainWindow::msgtype(QString t, QLineEdit* tx) //msgtype() QByteArray s=t.toUpper().toLocal8Bit(); ba2msg(s,message); int ichk=1,itype=0; - gen65_(message, &ichk,msgsent, const_cast(itone0), &itype, (FCL)22, (FCL)22); + gen65(message, &ichk,msgsent, const_cast(itone0), &itype); msgsent[22]=0; bool text=false; bool shortMsg=false; From 2e3cec2201c33e16c2057958d0eb65ac0f2144a9 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Fri, 11 Feb 2022 10:52:20 +0100 Subject: [PATCH 65/74] Fix "unable to find library -lwsjt_fort_omp" on OpenMP-unsupported-platform (by JG1UAA) --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dc86126c6..d061b2146 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1444,7 +1444,7 @@ set_target_properties (wsjtx PROPERTIES ) target_include_directories (wsjtx PRIVATE ${FFTW3_INCLUDE_DIRS}) -if (APPLE) +if ((NOT ${OPENMP_FOUND}) OR APPLE) target_link_libraries (wsjtx wsjt_fort) else () target_link_libraries (wsjtx wsjt_fort_omp) From 2545103ba5907426ca9b2923049a9cfa02e7f638 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Fri, 11 Feb 2022 11:00:21 +0100 Subject: [PATCH 66/74] Fix implicit-const-int-float-conversion error (by JG1UAA) --- Radio.cpp | 6 +++--- widgets/FrequencyDeltaLineEdit.cpp | 4 ++-- widgets/FrequencyLineEdit.cpp | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Radio.cpp b/Radio.cpp index ed4bf388d..5ee290406 100644 --- a/Radio.cpp +++ b/Radio.cpp @@ -54,7 +54,7 @@ namespace Radio value *= std::pow (10., scale); if (ok) { - if (value < 0. || value > std::numeric_limits::max ()) + if (value < 0. || value > static_cast(std::numeric_limits::max ())) { value = 0.; *ok = false; @@ -91,8 +91,8 @@ namespace Radio value *= std::pow (10., scale); if (ok) { - if (value < -std::numeric_limits::max () - || value > std::numeric_limits::max ()) + if (value < static_cast(std::numeric_limits::min ()) + || value > static_cast(std::numeric_limits::max ())) { value = 0.; *ok = false; diff --git a/widgets/FrequencyDeltaLineEdit.cpp b/widgets/FrequencyDeltaLineEdit.cpp index b7ed144b6..59ae9bc9c 100644 --- a/widgets/FrequencyDeltaLineEdit.cpp +++ b/widgets/FrequencyDeltaLineEdit.cpp @@ -39,8 +39,8 @@ namespace FrequencyDeltaLineEdit::FrequencyDeltaLineEdit (QWidget * parent) : QLineEdit (parent) { - setValidator (new MHzValidator {-std::numeric_limits::max () / 10.e6, - std::numeric_limits::max () / 10.e6, this}); + setValidator (new MHzValidator {static_cast(std::numeric_limits::min ()) / 10.e6, + static_cast(std::numeric_limits::max ()) / 10.e6, this}); } auto FrequencyDeltaLineEdit::frequency_delta () const -> FrequencyDelta diff --git a/widgets/FrequencyLineEdit.cpp b/widgets/FrequencyLineEdit.cpp index 1ca2ba20b..8e74c7db4 100644 --- a/widgets/FrequencyLineEdit.cpp +++ b/widgets/FrequencyLineEdit.cpp @@ -39,7 +39,7 @@ namespace FrequencyLineEdit::FrequencyLineEdit (QWidget * parent) : QLineEdit (parent) { - setValidator (new MHzValidator {0., std::numeric_limits::max () / 10.e6, this}); + setValidator (new MHzValidator {0., static_cast(std::numeric_limits::max ()) / 10.e6, this}); } auto FrequencyLineEdit::frequency () const -> Frequency From 5dc70b18db152f6ed227d2af2eb1d3b2ae11bd5c Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 15 Feb 2022 16:28:19 -0500 Subject: [PATCH 67/74] Reject a7 decodes of the form "CQ " with no grid. --- lib/ft8/ft8_a7.f90 | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/ft8/ft8_a7.f90 b/lib/ft8/ft8_a7.f90 index d02c77fbf..51e73d7b9 100644 --- a/lib/ft8/ft8_a7.f90 +++ b/lib/ft8/ft8_a7.f90 @@ -369,6 +369,7 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & !3041 format(i3,2f7.1,f7.2,f7.1,1x,a) if(dmin.gt.100.0 .or. dmin2/dmin.lt.1.3) nharderrors=-1 msg37=msgbest + if(msg37(1:3).eq.'CQ ' .and. std_2 .and. grid4.eq.' ') nharderrors=-1 return end subroutine ft8_a7d From 5e1795ff5c9136b425188c1ad4b09838afc969e4 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 17 Feb 2022 10:17:47 -0500 Subject: [PATCH 68/74] Fix the issue with using 'QQ0XYZ' in ft8_a7.f90. --- lib/chkcall.f90 | 4 +++- lib/ft8/ft8_a7.f90 | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/chkcall.f90 b/lib/chkcall.f90 index 23900748e..944cfeeb8 100644 --- a/lib/chkcall.f90 +++ b/lib/chkcall.f90 @@ -34,7 +34,9 @@ subroutine chkcall(w,bc,cok) ! One of first two characters (c1 or c2) must be a letter if((.not.isletter(bc(1:1))) .and. (.not.isletter(bc(2:2)))) go to 100 - if(bc(1:1).eq.'Q') go to 100 !Calls don't start with Q +! Real calls don't start with Q, but we'll allow the placeholder +! callsign QU1RK to be considered a standard call: + if(bc(1:1).eq.'Q' .and. bc(1:5).ne.'QU1RK') go to 100 ! Must have a digit in 2nd or 3rd position i1=0 diff --git a/lib/ft8/ft8_a7.f90 b/lib/ft8/ft8_a7.f90 index 51e73d7b9..dbad46cd0 100644 --- a/lib/ft8/ft8_a7.f90 +++ b/lib/ft8/ft8_a7.f90 @@ -275,7 +275,7 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & do imsg=1,MAXMSG msg=trim(call_1)//' '//trim(call_2) i=imsg - if(call_1(1:3).eq.'CQ ' .and. i.ne.5) msg='QQ0XYZ '//trim(call_2) + if(call_1(1:3).eq.'CQ ' .and. i.ne.5) msg='QU1RK '//trim(call_2) if(.not.std_1) then if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2) if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>' @@ -370,6 +370,7 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & if(dmin.gt.100.0 .or. dmin2/dmin.lt.1.3) nharderrors=-1 msg37=msgbest if(msg37(1:3).eq.'CQ ' .and. std_2 .and. grid4.eq.' ') nharderrors=-1 + if(index(msg37(1:6).eq.'QU1RK ') nharderrors=-1 return end subroutine ft8_a7d From 8e6f027c5e1d5ea7104354c55dae1124b96cd986 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 17 Feb 2022 10:22:18 -0500 Subject: [PATCH 69/74] Oops! I committed the wrong version. --- lib/ft8/ft8_a7.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ft8/ft8_a7.f90 b/lib/ft8/ft8_a7.f90 index dbad46cd0..ea96c2b43 100644 --- a/lib/ft8/ft8_a7.f90 +++ b/lib/ft8/ft8_a7.f90 @@ -370,7 +370,7 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & if(dmin.gt.100.0 .or. dmin2/dmin.lt.1.3) nharderrors=-1 msg37=msgbest if(msg37(1:3).eq.'CQ ' .and. std_2 .and. grid4.eq.' ') nharderrors=-1 - if(index(msg37(1:6).eq.'QU1RK ') nharderrors=-1 + if(msg37(1:6).eq.'QU1RK ') nharderrors=-1 return end subroutine ft8_a7d From 5471cb35343a83838c214d75454a29ca4f16c6ec Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 18 Feb 2022 14:57:56 -0500 Subject: [PATCH 70/74] Don't attempt a7 decodes for messages with /, <, or directed CQ. --- lib/ft8/ft8_a7.f90 | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/ft8/ft8_a7.f90 b/lib/ft8/ft8_a7.f90 index ea96c2b43..a89a89ec9 100644 --- a/lib/ft8/ft8_a7.f90 +++ b/lib/ft8/ft8_a7.f90 @@ -32,7 +32,11 @@ subroutine ft8_a7_save(nutc,dt,f,msg) ichar(g4(2:2)).ge.ichar('A') .and. ichar(g4(2:2)).le.ichar('R') .and. & ichar(g4(3:3)).ge.ichar('0') .and. ichar(g4(3:3)).le.ichar('9') .and. & ichar(g4(4:4)).ge.ichar('0') .and. ichar(g4(4:4)).le.ichar('9')) - + + if(index(msg,'/').ge.1 .or. index(msg,'<').ge.1) go to 999 + call split77(msg,nwords,nw,w) !Parse msg into words + if(nwords.lt.1) go to 999 + if(w(1)(1:3).eq.'CQ_') go to 999 j=mod(nutc/5,2) !j is 0 or 1 for odd/even sequence jseq=j @@ -43,8 +47,6 @@ subroutine ft8_a7_save(nutc,dt,f,msg) dt0(i,j,1)=dt !Save dt in table f0(i,j,1)=f !Save f in table - call split77(msg,nwords,nw,w) !Parse msg into words - if(nwords.lt.1) go to 999 msg0(i,j,1)=trim(w(1))//' '//trim(w(2)) !Save "call_1 call_2" if(w(1)(1:3).eq.'CQ ' .and. nw(2).le.2) then msg0(i,j,1)='CQ '//trim(w(2))//' '//trim(w(3)) !Save "CQ DX Call_2" From 33d3955086abf7feb87e7b20135f8f90935f2b3a Mon Sep 17 00:00:00 2001 From: Steven Franke Date: Sat, 26 Feb 2022 11:06:37 -0600 Subject: [PATCH 71/74] Make SNR calculation for a7 decodes consistent with that of regular decodes. --- lib/ft8/ft8_a7.f90 | 18 ++++++++---------- lib/ft8_decode.f90 | 3 ++- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/lib/ft8/ft8_a7.f90 b/lib/ft8/ft8_a7.f90 index a89a89ec9..7306c8021 100644 --- a/lib/ft8/ft8_a7.f90 +++ b/lib/ft8/ft8_a7.f90 @@ -72,7 +72,7 @@ subroutine ft8_a7_save(nutc,dt,f,msg) 999 return end subroutine ft8_a7_save -subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & +subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,xbase,nharderrors,dmin, & msg37,xsnr) ! Examine the raw data in dd0() for possible "a7" decodes. @@ -314,10 +314,10 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & call genft8(msg,i3,n3,msgsent,msgbits,itone) !Source-encode this message call encode174_91(msgbits,cw) !Get codeword for this message rcw=2*cw-1 - pa=sum(llra*rcw) - pb=sum(llrb*rcw) - pc=sum(llrc*rcw) - pd=sum(llrd*rcw) + pow=0.0 + do i=1,79 + pow=pow+s8(itone(i),i)**2 + enddo hdec=0 where(llra.ge.0.0) hdec=1 @@ -344,18 +344,15 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & if(dm.lt.dmin) then dmin=dm msgbest=msgsent + pbest=pow if(dm.eq.da) then nharderrors=count((2*cw-1)*llra.lt.0.0) - pbest=pa else if(dm.eq.dbb) then nharderrors=count((2*cw-1)*llrb.lt.0.0) - pbest=pb else if(dm.eq.dc) then nharderrors=count((2*cw-1)*llrc.lt.0.0) - pbest=pc else if(dm.eq.dd) then nharderrors=count((2*cw-1)*llrd.lt.0.0) - pbest=pd endif endif @@ -366,7 +363,8 @@ subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, & iloc=minloc(dmm) dmin2=dmm(iloc(1)) xsnr=-24. - if(pbest.gt.0.0) xsnr=db(pbest/50.0) - 24.0 + arg=pbest/xbase/3.0e6-1.0 + if(arg.gt.0.0) xsnr=db(arg)-27.0 ! write(41,3041) nharderrors,dmin,dmin2,dmin2/dmin,xsnr,trim(msgbest) !3041 format(i3,2f7.1,f7.2,f7.1,1x,a) if(dmin.gt.100.0 .or. dmin2/dmin.lt.1.3) nharderrors=-1 diff --git a/lib/ft8_decode.f90 b/lib/ft8_decode.f90 index d0d2fd9ad..5f12c63df 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -253,9 +253,10 @@ contains index(grid4,'-').gt.0) grid4=' ' xdt=dt0(i,jseq,0) f1=f0(i,jseq,0) + xbase=10.0**(0.1*(sbase(nint(f1/3.125))-40.0)) msg37=' ' call timer('ft8_a7d ',0) - call ft8_a7d(dd,newdat,call_1,call_2,grid4,xdt,f1,nharderrors, & + call ft8_a7d(dd,newdat,call_1,call_2,grid4,xdt,f1,xbase,nharderrors, & dmin,msg37,xsnr) call timer('ft8_a7d ',1) From 561240763c287ba3238554d8bee564abba12bb3c Mon Sep 17 00:00:00 2001 From: Steven Franke Date: Wed, 2 Mar 2022 11:15:59 -0600 Subject: [PATCH 72/74] Fix a bounds error. --- lib/ft8_decode.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ft8_decode.f90 b/lib/ft8_decode.f90 index 5f12c63df..b33629738 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -253,7 +253,7 @@ contains index(grid4,'-').gt.0) grid4=' ' xdt=dt0(i,jseq,0) f1=f0(i,jseq,0) - xbase=10.0**(0.1*(sbase(nint(f1/3.125))-40.0)) + xbase=10.0**(0.1*(sbase(max(1,nint(f1/3.125)))-40.0)) msg37=' ' call timer('ft8_a7d ',0) call ft8_a7d(dd,newdat,call_1,call_2,grid4,xdt,f1,xbase,nharderrors, & From 0b951a05e78947faa58ffa438d22b4feeb3a1672 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 7 Mar 2022 10:50:21 +0100 Subject: [PATCH 73/74] Add an option to disable the Tune watchdog. --- Configuration.cpp | 6 ++++++ Configuration.hpp | 1 + Configuration.ui | 15 +++++++++++---- widgets/mainwindow.cpp | 2 +- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Configuration.cpp b/Configuration.cpp index 661a42d6e..b8fc2e0de 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -646,6 +646,7 @@ private: bool TX_messages_; bool enable_VHF_features_; bool decode_at_52s_; + bool Tune_watchdog_disabled_; bool single_decode_; bool twoPass_; bool bSpecialOp_; @@ -755,6 +756,7 @@ int Configuration::watchdog () const {return m_->watchdog_;} bool Configuration::TX_messages () const {return m_->TX_messages_;} bool Configuration::enable_VHF_features () const {return m_->enable_VHF_features_;} bool Configuration::decode_at_52s () const {return m_->decode_at_52s_;} +bool Configuration::Tune_watchdog_disabled () const {return m_->Tune_watchdog_disabled_;} bool Configuration::single_decode () const {return m_->single_decode_;} bool Configuration::twoPass() const {return m_->twoPass_;} bool Configuration::x2ToneSpacing() const {return m_->x2ToneSpacing_;} @@ -1355,6 +1357,7 @@ void Configuration::impl::initialize_models () ui_->TX_messages_check_box->setChecked (TX_messages_); ui_->enable_VHF_features_check_box->setChecked(enable_VHF_features_); ui_->decode_at_52s_check_box->setChecked(decode_at_52s_); + ui_->disable_Tune_watchdog_check_box->setChecked(Tune_watchdog_disabled_); ui_->single_decode_check_box->setChecked(single_decode_); ui_->cbTwoPass->setChecked(twoPass_); ui_->gbSpecialOpActivity->setChecked(bSpecialOp_); @@ -1572,6 +1575,7 @@ void Configuration::impl::read_settings () TX_messages_ = settings_->value ("Tx2QSO", true).toBool (); enable_VHF_features_ = settings_->value("VHFUHF",false).toBool (); decode_at_52s_ = settings_->value("Decode52",false).toBool (); + Tune_watchdog_disabled_ = settings_->value("TuneWatchdogDisabled",false).toBool (); single_decode_ = settings_->value("SingleDecode",false).toBool (); twoPass_ = settings_->value("TwoPass",true).toBool (); bSpecialOp_ = settings_->value("SpecialOpActivity",false).toBool (); @@ -1708,6 +1712,7 @@ void Configuration::impl::write_settings () settings_->setValue ("SplitMode", QVariant::fromValue (rig_params_.split_mode)); settings_->setValue ("VHFUHF", enable_VHF_features_); settings_->setValue ("Decode52", decode_at_52s_); + settings_->setValue ("TuneWatchdogDisabled", Tune_watchdog_disabled_); settings_->setValue ("SingleDecode", single_decode_); settings_->setValue ("TwoPass", twoPass_); settings_->setValue ("SelectedActivity", SelectedActivity_); @@ -2138,6 +2143,7 @@ void Configuration::impl::accept () azel_directory_.setPath (ui_->azel_path_display_label->text ()); enable_VHF_features_ = ui_->enable_VHF_features_check_box->isChecked (); decode_at_52s_ = ui_->decode_at_52s_check_box->isChecked (); + Tune_watchdog_disabled_ = ui_->disable_Tune_watchdog_check_box->isChecked (); single_decode_ = ui_->single_decode_check_box->isChecked (); twoPass_ = ui_->cbTwoPass->isChecked (); bSpecialOp_ = ui_->gbSpecialOpActivity->isChecked (); diff --git a/Configuration.hpp b/Configuration.hpp index c4cf068ec..2773201a0 100644 --- a/Configuration.hpp +++ b/Configuration.hpp @@ -134,6 +134,7 @@ public: bool split_mode () const; bool enable_VHF_features () const; bool decode_at_52s () const; + bool Tune_watchdog_disabled () const; bool single_decode () const; bool twoPass() const; bool bFox() const; diff --git a/Configuration.ui b/Configuration.ui index c538b0be6..78c11fdc2 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -517,6 +517,13 @@ quiet period when decoding is done. + + + + Disable Tune watchdog + + + @@ -3268,13 +3275,13 @@ Right click for insert and delete options. + + + + - - - - diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 04ed1539e..4b1c97361 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -7057,7 +7057,7 @@ void MainWindow::on_rptSpinBox_valueChanged(int n) void MainWindow::on_tuneButton_clicked (bool checked) { - tuneATU_Timer.start (120000); // tune watchdog (120s) + if (!m_config.Tune_watchdog_disabled ()) tuneATU_Timer.start (90000); // tune watchdog (90s) static bool lastChecked = false; if (lastChecked == checked) return; lastChecked = checked; From 36e54bf3a09df06eba996f3fb7df67a8c28083e6 Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Wed, 6 Apr 2022 10:06:43 +0200 Subject: [PATCH 74/74] Revert "Add an option to disable the Tune watchdog." This reverts commit 0b951a05e78947faa58ffa438d22b4feeb3a1672. --- Configuration.cpp | 6 ------ Configuration.hpp | 1 - Configuration.ui | 15 ++++----------- widgets/mainwindow.cpp | 2 +- 4 files changed, 5 insertions(+), 19 deletions(-) diff --git a/Configuration.cpp b/Configuration.cpp index b8fc2e0de..661a42d6e 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -646,7 +646,6 @@ private: bool TX_messages_; bool enable_VHF_features_; bool decode_at_52s_; - bool Tune_watchdog_disabled_; bool single_decode_; bool twoPass_; bool bSpecialOp_; @@ -756,7 +755,6 @@ int Configuration::watchdog () const {return m_->watchdog_;} bool Configuration::TX_messages () const {return m_->TX_messages_;} bool Configuration::enable_VHF_features () const {return m_->enable_VHF_features_;} bool Configuration::decode_at_52s () const {return m_->decode_at_52s_;} -bool Configuration::Tune_watchdog_disabled () const {return m_->Tune_watchdog_disabled_;} bool Configuration::single_decode () const {return m_->single_decode_;} bool Configuration::twoPass() const {return m_->twoPass_;} bool Configuration::x2ToneSpacing() const {return m_->x2ToneSpacing_;} @@ -1357,7 +1355,6 @@ void Configuration::impl::initialize_models () ui_->TX_messages_check_box->setChecked (TX_messages_); ui_->enable_VHF_features_check_box->setChecked(enable_VHF_features_); ui_->decode_at_52s_check_box->setChecked(decode_at_52s_); - ui_->disable_Tune_watchdog_check_box->setChecked(Tune_watchdog_disabled_); ui_->single_decode_check_box->setChecked(single_decode_); ui_->cbTwoPass->setChecked(twoPass_); ui_->gbSpecialOpActivity->setChecked(bSpecialOp_); @@ -1575,7 +1572,6 @@ void Configuration::impl::read_settings () TX_messages_ = settings_->value ("Tx2QSO", true).toBool (); enable_VHF_features_ = settings_->value("VHFUHF",false).toBool (); decode_at_52s_ = settings_->value("Decode52",false).toBool (); - Tune_watchdog_disabled_ = settings_->value("TuneWatchdogDisabled",false).toBool (); single_decode_ = settings_->value("SingleDecode",false).toBool (); twoPass_ = settings_->value("TwoPass",true).toBool (); bSpecialOp_ = settings_->value("SpecialOpActivity",false).toBool (); @@ -1712,7 +1708,6 @@ void Configuration::impl::write_settings () settings_->setValue ("SplitMode", QVariant::fromValue (rig_params_.split_mode)); settings_->setValue ("VHFUHF", enable_VHF_features_); settings_->setValue ("Decode52", decode_at_52s_); - settings_->setValue ("TuneWatchdogDisabled", Tune_watchdog_disabled_); settings_->setValue ("SingleDecode", single_decode_); settings_->setValue ("TwoPass", twoPass_); settings_->setValue ("SelectedActivity", SelectedActivity_); @@ -2143,7 +2138,6 @@ void Configuration::impl::accept () azel_directory_.setPath (ui_->azel_path_display_label->text ()); enable_VHF_features_ = ui_->enable_VHF_features_check_box->isChecked (); decode_at_52s_ = ui_->decode_at_52s_check_box->isChecked (); - Tune_watchdog_disabled_ = ui_->disable_Tune_watchdog_check_box->isChecked (); single_decode_ = ui_->single_decode_check_box->isChecked (); twoPass_ = ui_->cbTwoPass->isChecked (); bSpecialOp_ = ui_->gbSpecialOpActivity->isChecked (); diff --git a/Configuration.hpp b/Configuration.hpp index 2773201a0..c4cf068ec 100644 --- a/Configuration.hpp +++ b/Configuration.hpp @@ -134,7 +134,6 @@ public: bool split_mode () const; bool enable_VHF_features () const; bool decode_at_52s () const; - bool Tune_watchdog_disabled () const; bool single_decode () const; bool twoPass() const; bool bFox() const; diff --git a/Configuration.ui b/Configuration.ui index 78c11fdc2..c538b0be6 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -517,13 +517,6 @@ quiet period when decoding is done. - - - - Disable Tune watchdog - - - @@ -3275,13 +3268,13 @@ Right click for insert and delete options. - - - - + + + + diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 4b1c97361..04ed1539e 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -7057,7 +7057,7 @@ void MainWindow::on_rptSpinBox_valueChanged(int n) void MainWindow::on_tuneButton_clicked (bool checked) { - if (!m_config.Tune_watchdog_disabled ()) tuneATU_Timer.start (90000); // tune watchdog (90s) + tuneATU_Timer.start (120000); // tune watchdog (120s) static bool lastChecked = false; if (lastChecked == checked) return; lastChecked = checked;